From df4f959988b6b3fe9c9e4c8476af247b98633941 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Mon, 1 Jul 2019 15:34:08 +0200 Subject: [PATCH] nl80211: Don't force VHT channel definition with HE 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 --- src/drivers/driver_nl80211.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 32b1152e3..d71511cb5 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -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);