From: Jurijs Soloveckis Date: Tue, 14 Nov 2023 12:47:05 +0000 (+0000) Subject: EHT: Fix conditions for including EHT Operation Information field X-Git-Tag: hostap_2_11~787 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07c03a65574844580529537ea52b5e115bcf81b4;p=thirdparty%2Fhostap.git EHT: Fix conditions for including EHT Operation Information field Include EHT Operation Information field only if the operating bandwidth is 320 MHz or there is at least one punctured 20 MHz subchannel. This behavior is defined in IEEE P802.11be/D4.0, 35.15.1 (Basic EHT BSS operation). Signed-off-by: Jurijs Soloveckis --- diff --git a/src/ap/ieee802_11_eht.c b/src/ap/ieee802_11_eht.c index 1d1751837..565268287 100644 --- a/src/ap/ieee802_11_eht.c +++ b/src/ap/ieee802_11_eht.c @@ -199,11 +199,23 @@ u8 * hostapd_eid_eht_operation(struct hostapd_data *hapd, u8 *eid) struct ieee80211_eht_operation *oper; u8 *pos = eid, seg0 = 0, seg1 = 0; enum oper_chan_width chwidth; - size_t elen = 1 + 4 + 3; + size_t elen = 1 + 4; + bool eht_oper_info_present; if (!hapd->iface->current_mode) return eid; + if (is_6ghz_op_class(conf->op_class)) + chwidth = op_class_to_ch_width(conf->op_class); + else + chwidth = conf->eht_oper_chwidth; + + eht_oper_info_present = chwidth == CONF_OPER_CHWIDTH_320MHZ || + hapd->iconf->punct_bitmap; + + if (eht_oper_info_present) + elen += 3; + if (hapd->iconf->punct_bitmap) elen += EHT_OPER_DISABLED_SUBCHAN_BITMAP_SIZE; @@ -212,7 +224,7 @@ u8 * hostapd_eid_eht_operation(struct hostapd_data *hapd, u8 *eid) *pos++ = WLAN_EID_EXT_EHT_OPERATION; oper = (struct ieee80211_eht_operation *) pos; - oper->oper_params = EHT_OPER_INFO_PRESENT; + oper->oper_params = 0; /* TODO: Fill in appropriate EHT-MCS max Nss information */ oper->basic_eht_mcs_nss_set[0] = 0x11; @@ -220,11 +232,10 @@ u8 * hostapd_eid_eht_operation(struct hostapd_data *hapd, u8 *eid) oper->basic_eht_mcs_nss_set[2] = 0x00; oper->basic_eht_mcs_nss_set[3] = 0x00; - if (is_6ghz_op_class(conf->op_class)) - chwidth = op_class_to_ch_width(conf->op_class); - else - chwidth = conf->eht_oper_chwidth; + if (!eht_oper_info_present) + return pos + elen; + oper->oper_params = EHT_OPER_INFO_PRESENT; seg0 = hostapd_get_oper_centr_freq_seg0_idx(conf); switch (chwidth) {