]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
mesh: Do not enable HE on 5 GHz without VHT
authorSven Eckelmann <seckelmann@datto.com>
Tue, 13 Aug 2019 13:50:52 +0000 (15:50 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 30 Aug 2019 13:02:23 +0000 (16:02 +0300)
The commit ad9a1bfe788e ("nl80211: Share VHT channel configuration for
HE") always enforced that VHT is enabled when HE was enabled. This broke
the mesh functionality on 2.4 GHz with HE because ibss_mesh_setup_freq()
isn't setting up the VHT parameters for 2.4 GHz.

This problem was resolved for 2.4 GHz by commit df4f959988b6 ("nl80211:
Don't force VHT channel definition with HE"), but it is still possible
to disable VHT during the mesh/IBSS freq setup on 5 GHz - which would
result in the same problem as seen on 2.4 GHz.

The code enabling HE for IBSS/mesh must now make sure that it doesn't
enable HE when VHT could be enforced by the nl80211 driver code but
disabled by the user.

Fixes: 3459c54ac78b ("mesh: Add support for HE mode")
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
wpa_supplicant/wpa_supplicant.c

index e7a24fc9ce39ab934ebb9b69b75a317f9f71a5b3..fe22be4aacd160718c4821a0846318530e4279cb 100644 (file)
@@ -2169,6 +2169,7 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
        struct hostapd_freq_params vht_freq;
        int chwidth, seg0, seg1;
        u32 vht_caps = 0;
+       int is_24ghz;
 
        freq->freq = ssid->frequency;
 
@@ -2220,8 +2221,8 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
        if (!mode)
                return;
 
-       /* HE can work without HT + VHT */
-       freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported;
+       is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G ||
+               hw_mode == HOSTAPD_MODE_IEEE80211B;
 
 #ifdef CONFIG_HT_OVERRIDES
        if (ssid->disable_ht) {
@@ -2234,6 +2235,10 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
        if (!freq->ht_enabled)
                return;
 
+       /* Allow HE on 2.4 GHz without VHT: see nl80211_put_freq_params() */
+       if (is_24ghz)
+               freq->he_enabled = mode->he_capab[ieee80211_mode].he_supported;
+
        /* Setup higher BW only for 5 GHz */
        if (mode->mode != HOSTAPD_MODE_IEEE80211A)
                return;
@@ -2354,6 +2359,9 @@ skip_ht40:
        if (!vht_freq.vht_enabled)
                return;
 
+       /* Enable HE for VHT */
+       vht_freq.he_enabled = mode->he_capab[ieee80211_mode].he_supported;
+
        /* setup center_freq1, bandwidth */
        for (j = 0; j < ARRAY_SIZE(vht80); j++) {
                if (freq->channel >= vht80[j] &&