From: Chenming Huang Date: Wed, 14 May 2025 02:02:09 +0000 (+0800) Subject: P2P: Allow upgrade to 160 MHz if 80 MHz allowed and AUTO_BW flag is set X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02ccc95abb0090510548b0f900459916e3493e7c;p=thirdparty%2Fhostap.git P2P: Allow upgrade to 160 MHz if 80 MHz allowed and AUTO_BW flag is set Upgrade to 160 MHz when AUTO_BW flag is set in contiguous frequency range. This is needed to allow regdb rules for 160 MHz channels to be used correctly when some of the differences between the 80 MHz parts of the full channel has resulted in AUTO_BW flag being used. Signed-off-by: Chenming Huang --- diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 02f8ce458..54a3b694d 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -51,6 +51,7 @@ struct nan_publish_params; #define HOSTAPD_CHAN_INDOOR_ONLY 0x00010000 #define HOSTAPD_CHAN_GO_CONCURRENT 0x00020000 +#define HOSTAPD_CHAN_AUTO_BW 0x00040000 /* Allowed bandwidth mask */ enum hostapd_chan_width_attr { diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index 670366848..88ee9e724 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -2390,7 +2390,7 @@ static void nl80211_reg_rule_sec(struct nlattr *tb[], static void nl80211_set_vht_mode(struct hostapd_hw_modes *mode, int start, - int end, int max_bw) + int end, int max_bw, u32 flags) { int c; @@ -2405,6 +2405,9 @@ static void nl80211_set_vht_mode(struct hostapd_hw_modes *mode, int start, if (max_bw >= 160) chan->flag |= HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL; + + if (flags & NL80211_RRF_AUTO_BW) + chan->flag |= HOSTAPD_CHAN_AUTO_BW; } } @@ -2412,7 +2415,7 @@ static void nl80211_set_vht_mode(struct hostapd_hw_modes *mode, int start, static void nl80211_reg_rule_vht(struct nlattr *tb[], struct phy_info_arg *results) { - u32 start, end, max_bw; + u32 start, end, max_bw, flags = 0; u16 m; if (tb[NL80211_ATTR_FREQ_RANGE_START] == NULL || @@ -2424,6 +2427,9 @@ static void nl80211_reg_rule_vht(struct nlattr *tb[], end = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]) / 1000; max_bw = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) / 1000; + if (tb[NL80211_ATTR_REG_RULE_FLAGS]) + flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); + if (max_bw < 80) return; @@ -2435,7 +2441,8 @@ static void nl80211_reg_rule_vht(struct nlattr *tb[], if (!results->modes[m].vht_capab) continue; - nl80211_set_vht_mode(&results->modes[m], start, end, max_bw); + nl80211_set_vht_mode(&results->modes[m], start, end, + max_bw, flags); } } diff --git a/wpa_supplicant/op_classes.c b/wpa_supplicant/op_classes.c index ff11d20b9..ec66e8ccd 100644 --- a/wpa_supplicant/op_classes.c +++ b/wpa_supplicant/op_classes.c @@ -172,7 +172,8 @@ static enum chan_allowed verify_160mhz(struct hostapd_hw_modes *mode, return NOT_ALLOWED; if (!(flags & HOSTAPD_CHAN_VHT_80MHZ_SUBCHANNEL) || - !(flags & HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL)) + (!(flags & HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL) && + !(flags & HOSTAPD_CHAN_AUTO_BW))) return NOT_ALLOWED; if (flags & HOSTAPD_CHAN_NO_IR) diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index a101f7091..b4e56f90a 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -4490,7 +4490,8 @@ static enum chan_allowed wpas_p2p_verify_160mhz(struct wpa_supplicant *wpa_s, if (!is_6ghz_op_class(op_class)) { if (!(flags & HOSTAPD_CHAN_VHT_80MHZ_SUBCHANNEL) || - !(flags & HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL)) + (!(flags & HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL) && + !(flags & HOSTAPD_CHAN_AUTO_BW))) return NOT_ALLOWED; } else if (is_6ghz_op_class(op_class) && (!(wpas_get_6ghz_he_chwidth_capab(mode) &