[PATCH] mbssid: set extended capabilities

Aloka Dixit quic_alokad at quicinc.com
Wed May 11 13:49:27 PDT 2022


From: John Crispin <john at phrozen.org>

Set extended capabilities as described in IEEE Std 802.11ax-2021,
section 9.4.2.26.

Reset the capability bits to 0 explicitly if MBSSID and/or EMA is not
enabled because otherwise some client devices fail to associate.

Bit 80 (complete list of non-tx profiles) is set for all probe
responses, but for beacons it is set only if EMA is disabled or
if EMA profile periodicity is 1. This is bit is not set for the 
management frames other than beacons and probe responses as
those do not carry MBSSID IE.

Signed-off-by: John Crispin <john at phrozen.org>
Co-developed-by: Aloka Dixit <quic_alokad at quicinc.com>
Signed-off-by: Aloka Dixit <quic_alokad at quicinc.com>
---
 src/ap/beacon.c            | 29 ++++++++++++++++++++---------
 src/ap/ieee802_11_shared.c | 11 +++++++++++
 2 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index b2619bf40fe8..dce09d0c9c10 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -517,7 +517,7 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
 				   bool bcast_probe_resp)
 {
 	struct ieee80211_mgmt *resp;
-	u8 *pos, *epos, *csa_pos;
+	u8 *pos, *epos, *csa_pos, *ext_cap_pos;
 	size_t buflen;
 
 	hapd = hostapd_mbssid_get_tx_bss(hapd);
@@ -643,7 +643,11 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
 	pos = hostapd_eid_mbssid(hapd, pos, epos, WLAN_FC_STYPE_PROBE_RESP, 0,
 				 NULL);
 
+	ext_cap_pos = pos;
 	pos = hostapd_eid_ext_capab(hapd, pos);
+	if (hapd->iconf->mbssid >= MBSSID_ENABLED)
+		ext_cap_pos[12] |= 0x01; /* Probe responses always include all
+					  * non-tx profiles */
 
 	pos = hostapd_eid_time_adv(hapd, pos);
 	pos = hostapd_eid_time_zone(hapd, pos);
@@ -1571,7 +1575,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
 	size_t resp_len = 0;
 #ifdef NEED_AP_MLME
 	u16 capab_info;
-	u8 *pos, *tailpos, *tailend, *csa_pos;
+	u8 *pos, *tailpos, *tailend, *csa_pos, *ext_cap_pos;
 #endif /* NEED_AP_MLME */
 
 	os_memset(params, 0, sizeof(*params));
@@ -1713,16 +1717,23 @@ 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);
+	ext_cap_pos = tailpos;
 	tailpos = hostapd_eid_ext_capab(hapd, tailpos);
 
-	if (hapd->iconf->mbssid && hapd->iconf->num_bss > 1 &&
-	    ieee802_11_build_ap_params_mbssid(hapd, params)) {
-		os_free(head);
-		os_free(tail);
-		wpa_printf(MSG_ERROR, "Failed to set beacon data");
-		return -1;
+	if (hapd->iconf->mbssid && hapd->iconf->num_bss > 1) {
+		if (ieee802_11_build_ap_params_mbssid(hapd, params)) {
+			os_free(head);
+			os_free(tail);
+			wpa_printf(MSG_ERROR, "Failed to set beacon data");
+			return -1;
+		} else if (hapd->iconf->mbssid == MBSSID_ENABLED ||
+			   (hapd->iconf->mbssid == ENHANCED_MBSSID_ENABLED &&
+			   params->mbssid_elem_count == 1)) {
+			/* Set the extended capability bit for "complete list
+			 * of non-tx profiles" */
+			ext_cap_pos[12] |= 0x01;
+		}
 	}
-
 	/*
 	 * TODO: Time Advertisement element should only be included in some
 	 * DTIM Beacon frames.
diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c
index 615489511a2a..8307467a4527 100644
--- a/src/ap/ieee802_11_shared.c
+++ b/src/ap/ieee802_11_shared.c
@@ -363,6 +363,8 @@ static void hostapd_ext_capab_byte(struct hostapd_data *hapd, u8 *pos, int idx)
 			*pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
 		if (hapd->conf->bss_transition)
 			*pos |= 0x08; /* Bit 19 - BSS Transition */
+		if (hapd->iconf->mbssid)
+			*pos |= 0x40; /* Bit 22 - Multiple BSSID */
 		break;
 	case 3: /* Bits 24-31 */
 #ifdef CONFIG_WNM_AP
@@ -435,6 +437,8 @@ static void hostapd_ext_capab_byte(struct hostapd_data *hapd, u8 *pos, int idx)
 		    (hapd->iface->drv_flags &
 		     WPA_DRIVER_FLAGS_BEACON_PROTECTION))
 			*pos |= 0x10; /* Bit 84 - Beacon Protection Enabled */
+		if (hapd->iconf->mbssid == ENHANCED_MBSSID_ENABLED)
+			*pos |= 0x08; /* Bit 83 - Enhanced multiple BSSID */
 		break;
 	case 11: /* Bits 88-95 */
 #ifdef CONFIG_SAE_PK
@@ -470,6 +474,13 @@ u8 * hostapd_eid_ext_capab(struct hostapd_data *hapd, u8 *eid)
 			*pos &= ~hapd->conf->ext_capa_mask[i];
 			*pos |= hapd->conf->ext_capa[i];
 		}
+
+		/* Clear bits 83 and 22 if EMA and MBSSID are not enabled
+		 * otherwise association fails with some clients */
+		if (i == 10 && hapd->iconf->mbssid < ENHANCED_MBSSID_ENABLED)
+			*pos &= ~0x08;
+		if (i == 2 && !hapd->iconf->mbssid)
+			*pos &= ~0x40;
 	}
 
 	while (len > 0 && eid[1 + len] == 0) {
-- 
2.31.1




More information about the Hostap mailing list