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: ad9a1bfe78 ("nl80211: Share VHT channel configuration for HE")
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
This commit is contained in:
Sven Eckelmann 2019-07-01 15:34:08 +02:00 committed by Jouni Malinen
parent dd0153fced
commit df4f959988

View file

@ -4344,6 +4344,10 @@ fail:
static int nl80211_put_freq_params(struct nl_msg *msg, static int nl80211_put_freq_params(struct nl_msg *msg,
const struct hostapd_freq_params *freq) 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); wpa_printf(MSG_DEBUG, " * freq=%d", freq->freq);
if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq)) if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq))
return -ENOBUFS; 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, " * vht_enabled=%d", freq->vht_enabled);
wpa_printf(MSG_DEBUG, " * ht_enabled=%d", freq->ht_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; enum nl80211_chan_width cw;
wpa_printf(MSG_DEBUG, " * bandwidth=%d", freq->bandwidth); wpa_printf(MSG_DEBUG, " * bandwidth=%d", freq->bandwidth);