From 07c03a65574844580529537ea52b5e115bcf81b4 Mon Sep 17 00:00:00 2001 From: Jurijs Soloveckis Date: Tue, 14 Nov 2023 12:47:05 +0000 Subject: [PATCH] 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 --- src/ap/ieee802_11_eht.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) 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) {