]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Allow upgrade to 160 MHz if 80 MHz allowed and AUTO_BW flag is set
authorChenming Huang <chenhuan@oss.qualcomm.com>
Wed, 14 May 2025 02:02:09 +0000 (10:02 +0800)
committerJouni Malinen <j@w1.fi>
Thu, 5 Jun 2025 09:49:06 +0000 (12:49 +0300)
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 <chenhuan@oss.qualcomm.com>
src/drivers/driver.h
src/drivers/driver_nl80211_capa.c
wpa_supplicant/op_classes.c
wpa_supplicant/p2p_supplicant.c

index 02f8ce458af08eb64acedbb989bc0c8b9bfed392..54a3b694d837c46d99e9e291825354947efeb490 100644 (file)
@@ -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 {
index 670366848fbcf2183c1f181ff1caa2db10ed8388..88ee9e724a028d24f3295f3434360c87b1be9d90 100644 (file)
@@ -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);
        }
 }
 
index ff11d20b9903c5137356498e638fc40d891035c8..ec66e8ccd204769c5e67aee786030c5c014b9f03 100644 (file)
@@ -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)
index a101f70911f1aecd20e40f2efa0d6ab1956db9db..b4e56f90aaaaab100e64238aacefbeb57d778e72 100644 (file)
@@ -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) &