Commit fb4b441c authored by Mordechay Goodstein's avatar Mordechay Goodstein Committed by Johannes Berg

wifi: wireless: correct primary channel validation on 6 GHz

The check that beacon primary channel is in the range of 80 MHz
(abs < 80) is invalid for 320 MHz since duplicate beacon transmit
means that the AP transmits it on all the 20 MHz sub-channels:

  9.4.2.249 HE Operation element - ... AP transmits Beacon frames in
  non-HT duplicate PPDU with a TXVECTOR parameter CH_BANDWIDTH value
  that is up to the BSS bandwidth.

So in case of 320 MHz the DUP beacon can be in upper 160 for primary
channel in the lower 160 giving possibly an absolute range of over
80 MHz.

Also this check is redundant alltogether, if AP has a wrong primary
channel in the beacon it's a faulty AP, and we would fail in next
steps to connect.

While at it, fix the frequency comparison to no longer compare
between KHz and MHz, which was introduced by commit 7f599aec
("cfg80211: Use the HE operation IE to determine a 6GHz BSS channel").
Signed-off-by: default avatarMordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230301115906.314faf725255.I5e27251ac558297553b590d3917a7b6d1aae0e74@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 724a486c
...@@ -1886,22 +1886,21 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, ...@@ -1886,22 +1886,21 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
freq = ieee80211_channel_to_freq_khz(channel_number, channel->band); freq = ieee80211_channel_to_freq_khz(channel_number, channel->band);
/* /*
* In 6GHz, duplicated beacon indication is relevant for * Frame info (beacon/prob res) is the same as received channel,
* beacons only. * no need for further processing.
*/ */
if (channel->band == NL80211_BAND_6GHZ && if (freq == ieee80211_channel_to_khz(channel))
(freq == channel->center_freq ||
abs(freq - channel->center_freq) > 80))
return channel; return channel;
alt_channel = ieee80211_get_channel_khz(wiphy, freq); alt_channel = ieee80211_get_channel_khz(wiphy, freq);
if (!alt_channel) { if (!alt_channel) {
if (channel->band == NL80211_BAND_2GHZ) { if (channel->band == NL80211_BAND_2GHZ ||
channel->band == NL80211_BAND_6GHZ) {
/* /*
* Better not allow unexpected channels when that could * Better not allow unexpected channels when that could
* be going beyond the 1-11 range (e.g., discovering * be going beyond the 1-11 range (e.g., discovering
* BSS on channel 12 when radio is configured for * BSS on channel 12 when radio is configured for
* channel 11. * channel 11) or beyond the 6 GHz channel range.
*/ */
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment