From a94ba5322803afdfdab2d07f36c15a0a42b74fa1 Mon Sep 17 00:00:00 2001 From: Chenming Huang Date: Wed, 12 Jul 2023 08:32:32 +0530 Subject: [PATCH] EHT: Support puncturing for 320 MHz channel bandwidth Determine the channel width by operating class for the 6 GHz band when validating puncturing bitmap. This is needed to allow puncturing to be used with 320 MHz channels. Signed-off-by: Jouni Malinen --- src/ap/hw_features.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index 7d899f50d..5bef2087d 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -908,7 +908,8 @@ static bool hostapd_is_usable_punct_bitmap(struct hostapd_iface *iface) { #ifdef CONFIG_IEEE80211BE struct hostapd_config *conf = iface->conf; - u8 bw, start_chan; + u16 bw; + u8 start_chan; if (!conf->punct_bitmap) return true; @@ -925,21 +926,30 @@ static bool hostapd_is_usable_punct_bitmap(struct hostapd_iface *iface) return false; } - switch (conf->eht_oper_chwidth) { - case 0: - wpa_printf(MSG_ERROR, - "RU puncturing is supported only in 80 MHz and 160 MHz"); - return false; - case 1: - bw = 80; - start_chan = conf->eht_oper_centr_freq_seg0_idx - 6; - break; - case 2: - bw = 160; - start_chan = conf->eht_oper_centr_freq_seg0_idx - 14; - break; - default: - return false; + /* + * In the 6 GHz band, eht_oper_chwidth is ignored. Use operating class + * to determine channel width. + */ + if (conf->op_class == 137) { + bw = 320; + start_chan = conf->eht_oper_centr_freq_seg0_idx - 30; + } else { + switch (conf->eht_oper_chwidth) { + case 0: + wpa_printf(MSG_ERROR, + "RU puncturing is supported only in 80 MHz and 160 MHz"); + return false; + case 1: + bw = 80; + start_chan = conf->eht_oper_centr_freq_seg0_idx - 6; + break; + case 2: + bw = 160; + start_chan = conf->eht_oper_centr_freq_seg0_idx - 14; + break; + default: + return false; + } } if (!is_punct_bitmap_valid(bw, (conf->channel - start_chan) / 4, -- 2.47.3