]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Don't force VHT channel definition with HE
authorSven Eckelmann <seckelmann@datto.com>
Mon, 1 Jul 2019 13:34:08 +0000 (15:34 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 11 Aug 2019 15:04:26 +0000 (18:04 +0300)
HE (802.11ax) is also supported on 2.4 GHz. And the 2.4 GHz band isn't
supposed to use VHT operations. Some codepaths in wpa_supplicant will
therefore not initialize the freq->bandwidth or the freq->center_freq1/2
members. As a result, the nl80211_put_freq_params() will directly return
an error (-1) or the kernel will return an error due to the invalid
channel definition.

Instead, the channel definitions should be created based on the actual
HT/VHT/none information on 2.4 GHz.

Fixes: ad9a1bfe788e ("nl80211: Share VHT channel configuration for HE")
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
src/drivers/driver_nl80211.c

index 32b1152e3bbcc1d2c35c6631dc0a99b2885d2df9..d71511cb5ca9c529a5e2ce0efd59317bc7bbb7fb 100644 (file)
@@ -4344,6 +4344,10 @@ fail:
 static int nl80211_put_freq_params(struct nl_msg *msg,
                                   const struct hostapd_freq_params *freq)
 {
+       enum hostapd_hw_mode hw_mode;
+       int is_24ghz;
+       u8 channel;
+
        wpa_printf(MSG_DEBUG, "  * freq=%d", freq->freq);
        if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq))
                return -ENOBUFS;
@@ -4352,7 +4356,11 @@ static int nl80211_put_freq_params(struct nl_msg *msg,
        wpa_printf(MSG_DEBUG, "  * vht_enabled=%d", freq->vht_enabled);
        wpa_printf(MSG_DEBUG, "  * ht_enabled=%d", freq->ht_enabled);
 
-       if (freq->vht_enabled || freq->he_enabled) {
+       hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
+       is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G ||
+               hw_mode == HOSTAPD_MODE_IEEE80211B;
+
+       if (freq->vht_enabled || (freq->he_enabled && !is_24ghz)) {
                enum nl80211_chan_width cw;
 
                wpa_printf(MSG_DEBUG, "  * bandwidth=%d", freq->bandwidth);