summaryrefslogtreecommitdiffstats
path: root/net/mac80211/offchannel.c
diff options
context:
space:
mode:
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>2022-06-14 17:20:04 +0300
committerJohannes Berg <johannes.berg@intel.com>2022-07-15 11:43:12 +0200
commit54283409cd162fc60480df514924ed4cb313735e (patch)
tree3d2e8a848ae69ea2723d3743773f74e64978b216 /net/mac80211/offchannel.c
parent892b3bceb0b5340fe8b3480e0ff507a9dfd75b27 (diff)
downloadlinux-54283409cd162fc60480df514924ed4cb313735e.tar.bz2
wifi: mac80211: Consider MLO links in offchannel logic
Check all the MLO links to decide whether offchannel TX is needed. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/offchannel.c')
-rw-r--r--net/mac80211/offchannel.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index 2ed4e2325914..aff5d3c39902 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -842,10 +842,24 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
/* Check if the operating channel is the requested channel */
if (!need_offchan) {
- struct ieee80211_chanctx_conf *chanctx_conf;
+ struct ieee80211_chanctx_conf *chanctx_conf = NULL;
+ int i;
rcu_read_lock();
- chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
+ /* Check all the links first */
+ for (i = 0; i < ARRAY_SIZE(sdata->vif.link_conf); i++) {
+ if (!sdata->vif.link_conf[i])
+ continue;
+
+ chanctx_conf = rcu_dereference(sdata->vif.link_conf[i]->chanctx_conf);
+ if (!chanctx_conf)
+ continue;
+
+ if (ether_addr_equal(sdata->vif.link_conf[i]->addr, mgmt->sa))
+ break;
+
+ chanctx_conf = NULL;
+ }
if (chanctx_conf) {
need_offchan = params->chan &&