mac80211: Fix calculation of minimal channel width
authorIlan Peer <ilan.peer@intel.com>
Sun, 6 Dec 2020 12:54:48 +0000 (14:54 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 11 Dec 2020 12:20:05 +0000 (13:20 +0100)
When calculating the minimal channel width for channel context,
the current operation Rx channel width of a station was used and not
the overall channel width capability of the station, i.e., both for
Tx and Rx.

Fix ieee80211_get_sta_bw() to use the maximal channel width the
station is capable. While at it make the function static.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20201206145305.4387040b99a0.I74bcf19238f75a5960c4098b10e355123d933281@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/chan.c
net/mac80211/ieee80211_i.h

index b6c80a45b9f5b3044e3680dac46b074f1ce60c79..c42574f2d48c8938d3ae495ccfe633c782d7014f 100644 (file)
@@ -191,11 +191,13 @@ ieee80211_find_reservation_chanctx(struct ieee80211_local *local,
        return NULL;
 }
 
-enum nl80211_chan_width ieee80211_get_sta_bw(struct ieee80211_sta *sta)
+static enum nl80211_chan_width ieee80211_get_sta_bw(struct sta_info *sta)
 {
-       switch (sta->bandwidth) {
+       enum ieee80211_sta_rx_bandwidth width = ieee80211_sta_cap_rx_bw(sta);
+
+       switch (width) {
        case IEEE80211_STA_RX_BW_20:
-               if (sta->ht_cap.ht_supported)
+               if (sta->sta.ht_cap.ht_supported)
                        return NL80211_CHAN_WIDTH_20;
                else
                        return NL80211_CHAN_WIDTH_20_NOHT;
@@ -232,7 +234,7 @@ ieee80211_get_max_required_bw(struct ieee80211_sub_if_data *sdata)
                    !(sta->sdata->bss && sta->sdata->bss == sdata->bss))
                        continue;
 
-               max_bw = max(max_bw, ieee80211_get_sta_bw(&sta->sta));
+               max_bw = max(max_bw, ieee80211_get_sta_bw(sta));
        }
        rcu_read_unlock();
 
index cb721c7c1cdbf82bb4d1f11231f2dc6c14b750bd..8bf9c0e974d6284390840970f0bdcecbd9476423 100644 (file)
@@ -2277,7 +2277,6 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
                                 enum ieee80211_chanctx_mode chanmode,
                                 u8 radar_detect);
 int ieee80211_max_num_channels(struct ieee80211_local *local);
-enum nl80211_chan_width ieee80211_get_sta_bw(struct ieee80211_sta *sta);
 void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
                                       struct ieee80211_chanctx *ctx);