const u8 *sa, *aa;
bool mlo;
size_t kdk_len;
+ const u8 *rsnxe;
+ size_t rsnxe_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,
+ if ((sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE ||
+ sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE_2) &&
+ bss->rsnxoe_len) {
+ rsnxe = bss->rsnxoe;
+ rsnxe_len = bss->rsnxoe_len;
+ } else {
+ rsnxe = bss->rsnxe;
+ rsnxe_len = bss->rsnxe_len;
+ }
+ if (ieee802_11_rsnx_capab_len(rsnxe, rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF) &&
ieee802_11_rsnx_capab_len(sta->rsnxe, sta->rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF))
bss->rsnxe_len = 0;
}
+ if (elems.rsnxe_override) {
+ os_memcpy(bss->rsnxoe, elems.rsnxe_override + 4,
+ elems.rsnxe_override_len - 4);
+ bss->rsnxoe_len = elems.rsnxe_override_len;
+ } else {
+ bss->rsnxoe_len = 0;
+ }
+
if (!bss->proberesp_seen)
bss_update(wt, bss, &elems, 1);
merged.rsnxe = m_elems.rsnxe;
merged.rsnxe_len = m_elems.rsnxe_len;
}
+ if (m_elems.rsnxe_override) {
+ merged.rsnxe_override = m_elems.rsnxe_override;
+ merged.rsnxe_override_len =
+ m_elems.rsnxe_override_len;
+ }
if (merged.rsnxe) {
os_memcpy(m_bss->rsnxe, merged.rsnxe,
m_bss->rsnxe_len = 0;
}
+ if (merged.rsnxe_override) {
+ os_memcpy(m_bss->rsnxoe,
+ merged.rsnxe_override + 4,
+ merged.rsnxe_override_len - 4);
+ m_bss->rsnxoe_len =
+ merged.rsnxe_override_len - 4;
+ } else {
+ m_bss->rsnxoe_len = 0;
+ }
+
if (!m_bss->proberesp_seen)
bss_update(wt, m_bss, &merged, 1);
}
struct ieee802_11_elems elems;
const u8 *ie;
size_t ie_len, kdk_len;
+ const u8 *rsnxe;
+ size_t rsnxe_len;
if (sta->auth_alg != WLAN_AUTH_FT ||
len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth))
goto out;
sta->pmk_r1_len = sta->pmk_r0_len;
- if (ieee802_11_rsnx_capab_len(bss->rsnxe, bss->rsnxe_len,
+ if ((sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE ||
+ sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE_2) &&
+ bss->rsnxoe_len) {
+ rsnxe = bss->rsnxoe;
+ rsnxe_len = bss->rsnxoe_len;
+ } else {
+ rsnxe = bss->rsnxe;
+ rsnxe_len = bss->rsnxe_len;
+ }
+ if (ieee802_11_rsnx_capab_len(rsnxe, rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF) &&
ieee802_11_rsnx_capab_len(sta->rsnxe, sta->rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF))
return;
}
+ if (elems.rsn_selection) {
+ sta->rsn_selection = elems.rsn_selection[0];
+ wpa_printf(MSG_DEBUG, "RSNO: RSN Selection %u",
+ sta->rsn_selection);
+ } else {
+ sta->rsn_selection = RSN_SELECTION_RSNE;
+ }
+
if (elems.rsnxe) {
os_memcpy(sta->rsnxe, elems.rsnxe, elems.rsnxe_len);
sta->rsnxe_len = elems.rsnxe_len;
struct wpa_ft_ies parse;
struct wpa_ptk ptk;
u8 ptk_name[WPA_PMK_NAME_LEN];
+ const u8 *rsnxe;
+ size_t rsnxe_len;
if (len < 24 + 2 + 2 * ETH_ALEN + 2) {
add_note(wt, MSG_INFO, "Too short FT Response frame from "
os_memcpy(new_sta->pmk_r1_name, sta->pmk_r1_name,
sizeof(sta->pmk_r1_name));
- if (ieee802_11_rsnx_capab_len(bss->rsnxe, bss->rsnxe_len,
+ if ((sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE ||
+ sta->rsn_selection == RSN_SELECTION_RSNE_OVERRIDE_2) &&
+ bss->rsnxoe_len) {
+ rsnxe = bss->rsnxoe;
+ rsnxe_len = bss->rsnxoe_len;
+ } else {
+ rsnxe = bss->rsnxe;
+ rsnxe_len = bss->rsnxe_len;
+ }
+ if (ieee802_11_rsnx_capab_len(rsnxe, rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF) &&
ieee802_11_rsnx_capab_len(sta->rsnxe, sta->rsnxe_len,
WLAN_RSNX_CAPAB_SECURE_LTF))