mac80211: avoid using ext NSS high BW if not supported
If the AP advertises inconsistent data, namely it has CCFS1 or CCFS2, but doesn't advertise support for 160/80+80 bandwidth or "Extended NSS BW Support", then we cannot use any MCSes in the the higher bandwidth. Thus, avoid connecting with higher bandwidth since it's less efficient that way. Link: https://lore.kernel.org/r/20200528213443.0e55d40c3ccc.I6fd0b4708ebd087e5e46466c3e91f6efbcbef668@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@ -3120,7 +3120,7 @@ bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
|
||||
bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info,
|
||||
const struct ieee80211_vht_operation *oper,
|
||||
const struct ieee80211_ht_operation *htop,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
@ -3132,6 +3132,10 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
|
||||
u32 vht_cap;
|
||||
bool support_80_80 = false;
|
||||
bool support_160 = false;
|
||||
u8 ext_nss_bw_supp = u32_get_bits(vht_cap_info,
|
||||
IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
|
||||
u8 supp_chwidth = u32_get_bits(vht_cap_info,
|
||||
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK);
|
||||
|
||||
if (!oper || !htop)
|
||||
return false;
|
||||
@ -3151,11 +3155,48 @@ bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
|
||||
IEEE80211_HT_OP_MODE_CCFS2_MASK)
|
||||
>> IEEE80211_HT_OP_MODE_CCFS2_SHIFT;
|
||||
|
||||
/* when parsing (and we know how to) CCFS1 and CCFS2 are equivalent */
|
||||
ccf0 = ccfs0;
|
||||
ccf1 = ccfs1;
|
||||
if (!ccfs1 && ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
|
||||
|
||||
/* if not supported, parse as though we didn't understand it */
|
||||
if (!ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
|
||||
ext_nss_bw_supp = 0;
|
||||
|
||||
/*
|
||||
* Cf. IEEE 802.11 Table 9-250
|
||||
*
|
||||
* We really just consider that because it's inefficient to connect
|
||||
* at a higher bandwidth than we'll actually be able to use.
|
||||
*/
|
||||
switch ((supp_chwidth << 4) | ext_nss_bw_supp) {
|
||||
default:
|
||||
case 0x00:
|
||||
ccf1 = 0;
|
||||
support_160 = false;
|
||||
support_80_80 = false;
|
||||
break;
|
||||
case 0x01:
|
||||
support_80_80 = false;
|
||||
/* fall through */
|
||||
case 0x02:
|
||||
case 0x03:
|
||||
ccf1 = ccfs2;
|
||||
break;
|
||||
case 0x10:
|
||||
ccf1 = ccfs1;
|
||||
break;
|
||||
case 0x11:
|
||||
case 0x12:
|
||||
if (!ccfs1)
|
||||
ccf1 = ccfs2;
|
||||
else
|
||||
ccf1 = ccfs1;
|
||||
break;
|
||||
case 0x13:
|
||||
case 0x20:
|
||||
case 0x23:
|
||||
ccf1 = ccfs1;
|
||||
break;
|
||||
}
|
||||
|
||||
cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band);
|
||||
cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band);
|
||||
|
Reference in New Issue
Block a user