cfg80211: Fix 160 MHz channels with 80+80 and 160 MHz drivers
PATCH 1/1 cfg80211: Fix 160 MHz channels with 80+80 and 160 MHz drivers
The VHT supported channel width field is a two bit integer, not a bitfield. cfg80211_chandef_usable() was interpreting it incorrectly and ended up rejecting 160 MHz channel width if the driver indicated support for both 160 and 80+80 MHz channels.
Signed-off-by Jouni Malinen <[email protected]>
--- net/wireless/chan.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/wireless/chan.c +6 -3
@@ -603,7 +603,7 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, {struct ieee80211_sta_ht_cap *ht_cap;struct ieee80211_sta_vht_cap *vht_cap; -u32 width, control_freq; +u32 width, control_freq, cap;if (WARN_ON (!cfg80211_chandef_valid (chandef)))return false;
@@ -643,7 +643,8 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,return false;break ;case NL80211_CHAN_WIDTH_80P80 : -if (!(vht_cap->cap &IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ )) + cap = vht_cap->cap &IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK ; +if (cap !=IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ )return false;case NL80211_CHAN_WIDTH_80 :if (!vht_cap->vht_supported)
@@ -654,7 +655,9 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,case NL80211_CHAN_WIDTH_160 :if (!vht_cap->vht_supported)return false; -if (!(vht_cap->cap &IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ )) + cap = vht_cap->cap &IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK ; +if (cap !=IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && + cap !=IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ )return false; prohibited_flags |=IEEE80211_CHAN_NO_160MHZ ; width =160 ;
Signature · 5 lines
1.9.1 -- Jouni Malinen PGP id EFC895FA
Quoted 4 lines · Jouni Malinen
The VHT supported channel width field is a two bit integer, not a bitfield.
cfg80211_chandef_usable()was interpreting it incorrectly and ended up rejecting 160 MHz channel width if the driver indicated support for both 160 and 80+80 MHz channels.
Applied, thanks.
johannes