mbssid: Add Non-Inheritance element

Add data per IEEE Std 802.11-2020, 9.4.2.240. Current implementation is
added for the security and extended supported rates only.

For the Extended rates element, add a new member 'xrates_supported'
which is set to 1 only if hostapd_eid_ext_supp_rates() returns success.
Without this change, there are cases where this function returns before
adding the element for the transmitting interface resulting in incorrect
addition of this element inside the MBSSID Non-Inheritance element.

Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
Co-developed-by: John Crispin <john@phrozen.org>
Signed-off-by: John Crispin <john@phrozen.org>
Co-developed-by: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com>
Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com>
This commit is contained in:
Aloka Dixit 2022-11-30 19:18:37 -08:00 committed by Jouni Malinen
parent 920b56322d
commit c5a09b051a
5 changed files with 60 additions and 2 deletions

View file

@ -918,6 +918,7 @@ struct hostapd_bss_config {
u8 rnr; u8 rnr;
char *config_id; char *config_id;
bool xrates_supported;
}; };
/** /**

View file

@ -91,6 +91,29 @@ int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
} }
struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd)
{
if (hapd->iconf->mbssid)
return hapd->iface->bss[0];
return hapd;
}
int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd)
{
if (hapd->iconf->mbssid) {
size_t i;
for (i = 1; i < hapd->iface->num_bss; i++)
if (hapd->iface->bss[i] == hapd)
return i;
}
return 0;
}
void hostapd_reconfig_encryption(struct hostapd_data *hapd) void hostapd_reconfig_encryption(struct hostapd_data *hapd)
{ {
if (hapd->wpa_auth) if (hapd->wpa_auth)

View file

@ -749,5 +749,7 @@ void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd,
#endif /* CONFIG_FST */ #endif /* CONFIG_FST */
int hostapd_set_acl(struct hostapd_data *hapd); int hostapd_set_acl(struct hostapd_data *hapd);
struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd);
int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd);
#endif /* HOSTAPD_H */ #endif /* HOSTAPD_H */

View file

@ -162,6 +162,7 @@ u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid)
int i, num, count; int i, num, count;
int h2e_required; int h2e_required;
hapd->conf->xrates_supported = false;
if (hapd->iface->current_rates == NULL) if (hapd->iface->current_rates == NULL)
return eid; return eid;
@ -211,6 +212,7 @@ u8 * hostapd_eid_ext_supp_rates(struct hostapd_data *hapd, u8 *eid)
*pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY; *pos++ = 0x80 | BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY;
} }
hapd->conf->xrates_supported = true;
return pos; return pos;
} }
@ -6726,12 +6728,14 @@ u8 * hostapd_eid_rnr(struct hostapd_data *hapd, u8 *eid, u32 type)
static size_t hostapd_eid_mbssid_elem_len(struct hostapd_data *hapd, static size_t hostapd_eid_mbssid_elem_len(struct hostapd_data *hapd,
u32 frame_type, size_t *bss_index) u32 frame_type, size_t *bss_index)
{ {
struct hostapd_data *tx_bss = hostapd_mbssid_get_tx_bss(hapd);
size_t len = 3, i; size_t len = 3, i;
for (i = *bss_index; i < hapd->iface->num_bss; i++) { for (i = *bss_index; i < hapd->iface->num_bss; i++) {
struct hostapd_data *bss = hapd->iface->bss[i]; struct hostapd_data *bss = hapd->iface->bss[i];
const u8 *auth, *rsn, *rsnx; const u8 *auth, *rsn = NULL, *rsnx = NULL;
size_t nontx_profile_len, auth_len; size_t nontx_profile_len, auth_len;
u8 ie_count = 0;
if (!bss || !bss->conf || !bss->started) if (!bss || !bss->conf || !bss->started)
continue; continue;
@ -6759,6 +6763,16 @@ static size_t hostapd_eid_mbssid_elem_len(struct hostapd_data *hapd,
if (rsnx) if (rsnx)
nontx_profile_len += 2 + rsnx[1]; nontx_profile_len += 2 + rsnx[1];
} }
if (!rsn && hostapd_wpa_ie(tx_bss, WLAN_EID_RSN))
ie_count++;
if (!rsnx && hostapd_wpa_ie(tx_bss, WLAN_EID_RSNX))
ie_count++;
if (bss->conf->xrates_supported)
nontx_profile_len += 8;
else if (hapd->conf->xrates_supported)
ie_count++;
if (ie_count)
nontx_profile_len += 4 + ie_count;
if (len + nontx_profile_len > 255) if (len + nontx_profile_len > 255)
break; break;
@ -6805,6 +6819,7 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end,
u32 frame_type, u8 max_bssid_indicator, u32 frame_type, u8 max_bssid_indicator,
size_t *bss_index, u8 elem_count) size_t *bss_index, u8 elem_count)
{ {
struct hostapd_data *tx_bss = hostapd_mbssid_get_tx_bss(hapd);
size_t i; size_t i;
u8 *eid_len_offset, *max_bssid_indicator_offset; u8 *eid_len_offset, *max_bssid_indicator_offset;
@ -6816,7 +6831,8 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end,
struct hostapd_data *bss = hapd->iface->bss[i]; struct hostapd_data *bss = hapd->iface->bss[i];
struct hostapd_bss_config *conf; struct hostapd_bss_config *conf;
u8 *eid_len_pos, *nontx_bss_start = eid; u8 *eid_len_pos, *nontx_bss_start = eid;
const u8 *auth, *rsn, *rsnx; const u8 *auth, *rsn = NULL, *rsnx = NULL;
u8 ie_count = 0, non_inherit_ie[3];
size_t auth_len = 0; size_t auth_len = 0;
u16 capab_info; u16 capab_info;
@ -6868,6 +6884,21 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end,
eid += 2 + rsnx[1]; eid += 2 + rsnx[1];
} }
} }
if (!rsn && hostapd_wpa_ie(tx_bss, WLAN_EID_RSN))
non_inherit_ie[ie_count++] = WLAN_EID_RSN;
if (!rsnx && hostapd_wpa_ie(tx_bss, WLAN_EID_RSNX))
non_inherit_ie[ie_count++] = WLAN_EID_RSNX;
if (hapd->conf->xrates_supported &&
!bss->conf->xrates_supported)
non_inherit_ie[ie_count++] = WLAN_EID_EXT_SUPP_RATES;
if (ie_count) {
*eid++ = WLAN_EID_EXTENSION;
*eid++ = 2 + ie_count;
*eid++ = WLAN_EID_EXT_NON_INHERITANCE;
*eid++ = ie_count;
os_memcpy(eid, non_inherit_ie, ie_count);
eid += ie_count;
}
*eid_len_pos = (eid - eid_len_pos) - 1; *eid_len_pos = (eid - eid_len_pos) - 1;

View file

@ -481,6 +481,7 @@
#define WLAN_EID_EXT_SPATIAL_REUSE 39 #define WLAN_EID_EXT_SPATIAL_REUSE 39
#define WLAN_EID_EXT_COLOR_CHANGE_ANNOUNCEMENT 42 #define WLAN_EID_EXT_COLOR_CHANGE_ANNOUNCEMENT 42
#define WLAN_EID_EXT_OCV_OCI 54 #define WLAN_EID_EXT_OCV_OCI 54
#define WLAN_EID_EXT_NON_INHERITANCE 56
#define WLAN_EID_EXT_SHORT_SSID_LIST 58 #define WLAN_EID_EXT_SHORT_SSID_LIST 58
#define WLAN_EID_EXT_HE_6GHZ_BAND_CAP 59 #define WLAN_EID_EXT_HE_6GHZ_BAND_CAP 59
#define WLAN_EID_EXT_EDMG_CAPABILITIES 61 #define WLAN_EID_EXT_EDMG_CAPABILITIES 61