wifi: mac80211: Consider MLO links in offchannel logic
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Tue, 14 Jun 2022 14:20:04 +0000 (17:20 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Jul 2022 09:43:12 +0000 (11:43 +0200)
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>
net/mac80211/offchannel.c

index 2ed4e2325914a843760eabade726a82756dcd529..aff5d3c399027cdf2df06894f4b398f95963595e 100644 (file)
@@ -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 &&