wifi: mac80211: add the virtual monitor after reconfig complete
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 9 Jul 2025 20:34:56 +0000 (23:34 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 10 Jul 2025 11:27:14 +0000 (13:27 +0200)
In reconfig we add the virtual monitor in 2 cases:
1. If we are resuming (it was deleted on suspend)
2. If it was added after an error but before the reconfig
   (due to the last non-monitor interface removal).

In the second case, the removal of the non-monitor interface will succeed
but the addition of the virtual monitor will fail, so we add it in the
reconfig.

The problem is that we mislead the driver to think that this is an existing
interface that is getting re-added - while it is actually a completely new
interface from the drivers' point of view.

Some drivers act differently when a interface is re-added. For example, it
might not initialize things because they were already initialized.
Such drivers will - in this case - be left with a partialy initialized vif.

To fix it, add the virtual monitor after reconfig_complete, so the
driver will know that this is a completely new interface.

Fixes: 3c3e21e7443b ("mac80211: destroy virtual monitor interface across suspend")
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250709233451.648d39b041e8.I2e37b68375278987e303d6c00cc5f3d8334d2f96@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/util.c

index a125995ed2525e9964cc3c35007f6f40e792e581..e66da651678a1a31670a9fadc521661022896963 100644 (file)
@@ -2144,11 +2144,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0);
 
  wake_up:
-
-       if (local->virt_monitors > 0 &&
-           local->virt_monitors == local->open_count)
-               ieee80211_add_virtual_monitor(local);
-
        /*
         * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
         * sessions can be established after a resume.
@@ -2202,6 +2197,10 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                }
        }
 
+       if (local->virt_monitors > 0 &&
+           local->virt_monitors == local->open_count)
+               ieee80211_add_virtual_monitor(local);
+
        if (!suspended)
                return 0;