[PATCH 06/13] mbssid: add MBSSID configuration element

Aloka Dixit quic_alokad at quicinc.com
Wed Mar 2 14:26:27 PST 2022


Add data as per IEEE Std 802.11ax-2021 9.4.2.260 Multiple BSSID
Configuration element when enhanced multiple BSSID
advertisements (EMA) are enabled.
This element informs the clients about the EMA profile periodicity of
the multiple BSSID set.

Co-developed-by: John Crispin <john at phrozen.org>
Signed-off-by: John Crispin <john at phrozen.org>
Signed-off-by: Aloka Dixit <quic_alokad at quicinc.com>
---
 src/ap/beacon.c              | 35 +++++++++++++++++++++++------------
 src/common/ieee802_11_defs.h |  1 +
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 3d45f4a69f2c..b2b2bfa8babe 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -428,8 +428,9 @@ static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid)
 }
 
 
-static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
-				      struct wpa_driver_ap_params *params)
+static u8 * hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
+				      struct wpa_driver_ap_params *params,
+				      u8 *eid)
 {
 	struct hostapd_iface *iface = hapd->iface;
 	struct hostapd_data *tx_bss;
@@ -437,17 +438,17 @@ static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
 	u8 num_mbssid = 0, *end;
 
 	if (!iface->conf->mbssid || iface->num_bss == 1)
-		return;
+		return eid;
 
 	if (!iface->mbssid_max_interfaces) {
 		wpa_printf(MSG_DEBUG,
 			   "MBSSID: Driver doesn't support multi-BSSID advertisements");
-		return;
+		return eid;
 	} else if (iface->num_bss > iface->mbssid_max_interfaces) {
 		wpa_printf(MSG_DEBUG,
 			   "MBSSID: Driver supports maximum %u interfaces for multi-BSSID advertisements",
 			   iface->mbssid_max_interfaces);
-		return;
+		return eid;
 	}
 
 	tx_bss = hostapd_mbssid_get_tx_bss(hapd);
@@ -460,26 +461,26 @@ static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
 		if (!iface->ema_max_periodicity) {
 			wpa_printf(MSG_DEBUG,
 				   "MBSSID: Driver doesn't support enhanced multiple BSSID advertisements");
-			return;
+			return eid;
 		}
 		if (num_mbssid > iface->ema_max_periodicity) {
 			wpa_printf(MSG_DEBUG,
 				   "MBSSID: Driver supports maximum %u EMA profile periodicity",
 				   iface->ema_max_periodicity);
-			return;
+			return eid;
 		}
 		params->ema = 1;
 	}
 
 	if (hapd != tx_bss || !num_mbssid)
-		return;
+		return eid;
 
 	params->mbssid_elem_count = num_mbssid;
 	params->mbssid_elem = os_zalloc(len);
 	if (!params->mbssid_elem) {
 		wpa_printf(MSG_ERROR,
 			   "Memory allocation failed for multiple BSSID elements");
-		return;
+		return eid;
 	}
 
 	params->mbssid_elem_offset = os_zalloc(params->mbssid_elem_count *
@@ -489,7 +490,7 @@ static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
 			   "MBSSID: Memory allocation failed for multiple BSSID element offsets");
 		os_free(params->mbssid_elem);
 		params->mbssid_elem = NULL;
-		return;
+		return eid;
 	}
 
 	end = hostapd_eid_mbssid(tx_bss, params->mbssid_elem,
@@ -498,7 +499,15 @@ static void hostapd_set_mbssid_beacon(struct hostapd_data *hapd,
 				 params->mbssid_elem_count,
 				 params->mbssid_elem_offset);
 	params->mbssid_elem_len = end - params->mbssid_elem;
-	return;
+
+	if (hapd->iconf->ema) {
+		*eid++ = WLAN_EID_EXTENSION;
+		*eid++ = 3;
+		*eid++ = WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION;
+		*eid++ = iface->num_bss;
+		*eid++ = params->mbssid_elem_count;
+	}
+	return eid;
 }
 
 
@@ -1558,6 +1567,8 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	}
 #endif /* CONFIG_IEEE80211AX */
 
+	if (hapd->iconf->ema)
+		tail_len += 5; /* Multiple BSSID Configuration element */
 	tail_len += hostapd_eid_rnr_len(hapd, WLAN_FC_STYPE_BEACON);
 	tail_len += hostapd_mbo_ie_len(hapd);
 	tail_len += hostapd_eid_owe_trans_len(hapd);
@@ -1643,7 +1654,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	tailpos = hostapd_eid_supported_op_classes(hapd, tailpos);
 	tailpos = hostapd_eid_ht_capabilities(hapd, tailpos);
 	tailpos = hostapd_eid_ht_operation(hapd, tailpos);
-	hostapd_set_mbssid_beacon(hapd, params);
+	tailpos = hostapd_set_mbssid_beacon(hapd, params, tailpos);
 
 	tailpos = hostapd_eid_ext_capab(hapd, tailpos);
 
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index cd4d60a77d26..f0003655a002 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -480,6 +480,7 @@
 #define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38
 #define WLAN_EID_EXT_SPATIAL_REUSE 39
 #define WLAN_EID_EXT_OCV_OCI 54
+#define WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION 55
 #define WLAN_EID_EXT_SHORT_SSID_LIST 58
 #define WLAN_EID_EXT_HE_6GHZ_BAND_CAP 59
 #define WLAN_EID_EXT_EDMG_CAPABILITIES 61
-- 
2.31.1




More information about the Hostap mailing list