wifi: mac80211: Check if we had first beacon with relevant links
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 4 Oct 2023 09:12:02 +0000 (12:12 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 23 Oct 2023 09:47:26 +0000 (11:47 +0200)
If there is a disassoc before the fisrt beacon we need to protect a
session for the deauth frame. Currently we are checking if we had a
beacon in the default link, which is wrong in a MLO connection and
link id != 0.
Fix this by checking all the active links, if none had a beacon then
protect a session.
If at least one link had a beacon there is no need for session
protection.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231004120820.d290f0ab77b0.Ic1505cf3d60f74580d31efa7e52046947c490b85@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c

index 3518c0808897edc022779e188b9679a22d2ce46d..e71c5129cc8b5de64f0afecd7b4b79cd9d377a43 100644 (file)
@@ -2936,9 +2936,20 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
                 * deauthentication frame by calling mgd_prepare_tx, if the
                 * driver requested so.
                 */
-               if (ieee80211_hw_check(&local->hw, DEAUTH_NEED_MGD_TX_PREP) &&
-                   !sdata->deflink.u.mgd.have_beacon) {
-                       drv_mgd_prepare_tx(sdata->local, sdata, &info);
+               if (ieee80211_hw_check(&local->hw, DEAUTH_NEED_MGD_TX_PREP)) {
+                       for (link_id = 0; link_id < ARRAY_SIZE(sdata->link);
+                            link_id++) {
+                               struct ieee80211_link_data *link;
+
+                               link = sdata_dereference(sdata->link[link_id],
+                                                        sdata);
+                               if (!link)
+                                       continue;
+                               if (link->u.mgd.have_beacon)
+                                       break;
+                       }
+                       if (link_id == IEEE80211_MLD_MAX_NUM_LINKS)
+                               drv_mgd_prepare_tx(sdata->local, sdata, &info);
                }
 
                ieee80211_send_deauth_disassoc(sdata, sdata->vif.cfg.ap_addr,