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. Signed-off-by: Aloka Dixit <quic_alokad@xxxxxxxxxxx> Co-developed-by: John Crispin <john@xxxxxxxxxxx> Signed-off-by: John Crispin <john@xxxxxxxxxxx> --- src/ap/beacon.c | 30 +++++++++++++++++++++--------- src/ap/ieee802_11_shared.c | 11 +++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index a297fad961c0..68b6b28588ce 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); @@ -642,7 +642,12 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, pos = hostapd_eid_ht_operation(hapd, pos); 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); @@ -1572,7 +1577,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)); @@ -1714,16 +1719,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 eaeaec5d73dc..8eb2c21d23af 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -364,6 +364,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.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap