aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Eckelmann <seckelmann@datto.com>2019-07-01 13:34:08 (GMT)
committerJouni Malinen <j@w1.fi>2019-08-11 15:04:26 (GMT)
commitdf4f959988b6b3fe9c9e4c8476af247b98633941 (patch)
treef0ba1f31bf2d5b9b667cdb7af871e6dcd6e08b6c
parentdd0153fced53b1dabe63278c746db9deb1a51512 (diff)
downloadhostap-df4f959988b6b3fe9c9e4c8476af247b98633941.zip
hostap-df4f959988b6b3fe9c9e4c8476af247b98633941.tar.gz
hostap-df4f959988b6b3fe9c9e4c8476af247b98633941.tar.bz2
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 <seckelmann@datto.com>
-rw-r--r--src/drivers/driver_nl80211.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 32b1152..d71511c 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);