struct wpa_ptk ptk;
const u8 *sa, *aa;
bool mlo;
+ size_t kdk_len;
mlo = !is_zero_ether_addr(sta->mld_mac_addr) &&
!is_zero_ether_addr(bss->mld_mac_addr);
sa = mlo ? sta->mld_mac_addr : sta->addr;
aa = mlo ? bss->mld_mac_addr : bss->bssid;
+ if (ieee802_11_rsnx_capab_len(bss->rsnxe, bss->rsnxe_len,
+ WLAN_RSNX_CAPAB_SECURE_LTF) &&
+ ieee802_11_rsnx_capab_len(sta->rsnxe, sta->rsnxe_len,
+ WLAN_RSNX_CAPAB_SECURE_LTF))
+ kdk_len = WPA_KDK_MAX_LEN;
+ else
+ kdk_len = 0;
+
if (wpa_key_mgmt_ft(sta->key_mgmt)) {
u8 ptk_name[WPA_PMK_NAME_LEN];
int use_sha384 = wpa_key_mgmt_sha384(sta->key_mgmt);
"Pairwise key expansion",
aa, sa, sta->anonce,
sta->snonce, &ptk, sta->key_mgmt,
- sta->pairwise_cipher, NULL, 0, 0) < 0 ||
+ sta->pairwise_cipher, NULL, 0, kdk_len) < 0 ||
check_mic(sta, ptk.kck, ptk.kck_len, ver, data, len) < 0) {
return -1;
}
return;
}
+ if (elems.rsnxe) {
+ os_memcpy(bss->rsnxe, elems.rsnxe, elems.rsnxe_len);
+ bss->rsnxe_len = elems.rsnxe_len;
+ } else {
+ bss->rsnxe_len = 0;
+ }
+
if (!bss->proberesp_seen)
bss_update(wt, bss, &elems, 1);
return;
}
+ if (elems.rsnxe) {
+ os_memcpy(sta->rsnxe, elems.rsnxe, elems.rsnxe_len);
+ sta->rsnxe_len = elems.rsnxe_len;
+ }
+
sta->assocreq_capab_info = le_to_host16(mgmt->u.assoc_req.capab_info);
sta->assocreq_listen_int =
le_to_host16(mgmt->u.assoc_req.listen_interval);
return;
}
+ if (elems.rsnxe) {
+ os_memcpy(sta->rsnxe, elems.rsnxe, elems.rsnxe_len);
+ sta->rsnxe_len = elems.rsnxe_len;
+ }
+
sta->assocreq_capab_info =
le_to_host16(mgmt->u.reassoc_req.capab_info);
sta->assocreq_listen_int =
bool ft_over_ds;
u16 aid;
u8 rsnie[257]; /* WPA/RSN IE */
+ u8 rsnxe[254]; /* RSNXE data */
+ size_t rsnxe_len;
u8 osenie[257]; /* OSEN IE */
int proto;
int pairwise_cipher;
int parse_error_reported;
u8 wpaie[257];
u8 rsnie[257];
+ u8 rsnxe[254]; /* RSNXE data */
+ size_t rsnxe_len;
u8 osenie[257];
int proto;
int pairwise_cipher;