Configuring hostapd's BSSes with a custom BSSID via the `bssid` parameter in the config file, can lead to a miss-configured Multiple BSSID Element consequently leading to that stations fail to calculate the correct BSSID for non-transmitting BSSs, as specified in IEEE Std 802.11-2020 section 9.4.2.45. To ensure consistency, the configuration need to include criticals parameters: `MaxBSSID Indicator` and `Multiple BSSID Index`. To customise the MBSSID IE following the custom bssids as well. This commit introduces: - A new global parameter, `mbssid_max`, to set the `MaxBSSID Indicator`. - A per-BSS parameter, `mbssid_index`, to explicitly set the `Multiple BSSID Index`. Signed-off-by: Baligh Gasmi <gasmibal@xxxxxxxxx> --- hostapd/config_file.c | 4 ++++ src/ap/ap_config.h | 2 ++ src/ap/ieee802_11.c | 14 +++++++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index e59e98d7c..0139d5bde 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3964,6 +3964,10 @@ static int hostapd_config_fill(struct hostapd_config *conf, return 1; } conf->mbssid = mbssid; + } else if (os_strcmp(buf, "mbssid_index") == 0) { + bss->mbssid_index = atoi(pos); + } else if (os_strcmp(buf, "mbssid_max") == 0) { + conf->mbssid_max = atoi(pos); #endif /* CONFIG_IEEE80211AX */ } else if (os_strcmp(buf, "max_listen_interval") == 0) { bss->max_listen_interval = atoi(pos); diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index b0ae71e1e..deb195162 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -995,6 +995,7 @@ struct hostapd_bss_config { bool mld_indicate_disabled; #endif /* CONFIG_TESTING_OPTIONS */ #endif /* CONFIG_IEEE80211BE */ + int mbssid_index; }; /** @@ -1252,6 +1253,7 @@ struct hostapd_config { bool channel_usage; bool peer_to_peer_twt; + int mbssid_max; }; diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index c0da03f4c..3a908b082 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -3414,7 +3414,9 @@ static u8 hostapd_max_bssid_indicator(struct hostapd_data *hapd) if (!hapd->iconf->mbssid || hapd->iface->num_bss <= 1) return 0; - num_bss_nontx = hapd->iface->num_bss - 1; + num_bss_nontx = (hapd->iface->conf->mbssid_max > 0) ? + hapd->iface->conf->mbssid_max - 1 : + hapd->iface->conf->num_bss - 1; while (num_bss_nontx > 0) { max_bssid_ind++; num_bss_nontx >>= 1; @@ -8322,6 +8324,7 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end, const u8 *known_bss, size_t known_bss_len) { struct hostapd_data *tx_bss = hostapd_mbssid_get_tx_bss(hapd); + struct hostapd_bss_config *tx_conf = tx_bss->conf; size_t i; u8 *eid_len_offset, *max_bssid_indicator_offset; @@ -8337,6 +8340,7 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end, u8 ie_count = 0, non_inherit_ie[3]; size_t auth_len = 0; u16 capab_info; + u8 mbssindex = i; if (!bss || !bss->conf || !bss->started || mbssid_known_bss(i, known_bss, known_bss_len)) @@ -8356,11 +8360,15 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end, *eid++ = conf->ssid.ssid_len; os_memcpy(eid, conf->ssid.ssid, conf->ssid.ssid_len); eid += conf->ssid.ssid_len; + + if(conf->mbssid_index && + ((conf->mbssid_index - tx_conf->mbssid_index) > 0)) + mbssindex = (conf->mbssid_index - tx_conf->mbssid_index); *eid++ = WLAN_EID_MULTIPLE_BSSID_INDEX; if (frame_type == WLAN_FC_STYPE_BEACON) { *eid++ = 3; - *eid++ = i; /* BSSID Index */ + *eid++ = mbssindex; /* BSSID Index */ if (hapd->iconf->mbssid == ENHANCED_MBSSID_ENABLED && (conf->dtim_period % elem_count)) conf->dtim_period = elem_count; @@ -8376,7 +8384,7 @@ static u8 * hostapd_eid_mbssid_elem(struct hostapd_data *hapd, u8 *eid, u8 *end, /* Probe Request frame does not include DTIM Period and * DTIM Count fields. */ *eid++ = 1; - *eid++ = i; /* BSSID Index */ + *eid++ = mbssindex; /* BSSID Index */ } auth = wpa_auth_get_wpa_ie(bss->wpa_auth, &auth_len); -- 2.43.0 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap