mac80211: MBSSID channel switch
authorJohn Crispin <john@phrozen.org>
Thu, 24 Feb 2022 11:54:59 +0000 (12:54 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 15 Mar 2022 10:41:22 +0000 (11:41 +0100)
Trigger ieee80211_csa_finish() on the non-transmitting interfaces
when channel switch concludes on the transmitting interface.

Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Co-developed-by: Aloka Dixit <alokad@codeaurora.org>
Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
Signed-off-by: John Crispin <john@phrozen.org>
Link: https://lore.kernel.org/r/6fde4d7f9fa387494f46a7aa4a584478dcda06f1.1645702516.git.lorenzo@kernel.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c

index da19f7156bb78d2b9b208ba54a4c210c3b17c24e..072eccbf1bae0d1884fe91a612e47699d87d987a 100644 (file)
@@ -3256,9 +3256,31 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
 void ieee80211_csa_finish(struct ieee80211_vif *vif)
 {
        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
+       struct ieee80211_local *local = sdata->local;
 
-       ieee80211_queue_work(&sdata->local->hw,
-                            &sdata->csa_finalize_work);
+       rcu_read_lock();
+
+       if (vif->mbssid_tx_vif == vif) {
+               /* Trigger ieee80211_csa_finish() on the non-transmitting
+                * interfaces when channel switch is received on
+                * transmitting interface
+                */
+               struct ieee80211_sub_if_data *iter;
+
+               list_for_each_entry_rcu(iter, &local->interfaces, list) {
+                       if (!ieee80211_sdata_running(iter))
+                               continue;
+
+                       if (iter == sdata || iter->vif.mbssid_tx_vif != vif)
+                               continue;
+
+                       ieee80211_queue_work(&iter->local->hw,
+                                            &iter->csa_finalize_work);
+               }
+       }
+       ieee80211_queue_work(&local->hw, &sdata->csa_finalize_work);
+
+       rcu_read_unlock();
 }
 EXPORT_SYMBOL(ieee80211_csa_finish);