]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
wifi: mac80211: correcty limit wider BW TDLS STAs
authorJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2024 12:35:57 +0000 (14:35 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 26 Jun 2024 08:22:06 +0000 (10:22 +0200)
When updating a channel context, the code can apply wider
bandwidth TDLS STA channel definitions to each and every
channel context used by the device, an approach that will
surely lead to problems if there is ever more than one.

Restrict the wider BW TDLS STA consideration to only TDLS
STAs that are actually related to links using the channel
context being updated.

Fixes: 0fabfaafec3a ("mac80211: upgrade BW of TDLS peers when possible")
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20240612143707.1ad989acecde.I5c75c94d95c3f4ea84f8ff4253189f4b13bad5c3@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/chan.c

index 942c882f1a1d53094243c4c51154f561f87cee08..06a65dc6f6c6e5c6fbda9aa73005ffd4f0f91ca5 100644 (file)
@@ -793,13 +793,24 @@ void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
 
        /* TDLS peers can sometimes affect the chandef width */
        list_for_each_entry(sta, &local->sta_list, list) {
+               struct ieee80211_sub_if_data *sdata = sta->sdata;
                struct ieee80211_chan_req tdls_chanreq = {};
+               int tdls_link_id;
+
                if (!sta->uploaded ||
                    !test_sta_flag(sta, WLAN_STA_TDLS_WIDER_BW) ||
                    !test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
                    !sta->tdls_chandef.chan)
                        continue;
 
+               tdls_link_id = ieee80211_tdls_sta_link_id(sta);
+               link = sdata_dereference(sdata->link[tdls_link_id], sdata);
+               if (!link)
+                       continue;
+
+               if (rcu_access_pointer(link->conf->chanctx_conf) != conf)
+                       continue;
+
                tdls_chanreq.oper = sta->tdls_chandef;
 
                /* note this always fills and returns &tmp if compat */