[PATCH v0] mbssid: add bss index and max bss

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Baligh Gasmi <gasmibal@xxxxxxxxx>

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>
---
 src/ap/ap_config.h  |  2 ++
 src/ap/ieee802_11.c | 14 +++++++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

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



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux