]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: cfg80211: use cfg80211_leave() in iftype change
authorJohannes Berg <johannes.berg@intel.com>
Fri, 21 Nov 2025 16:40:20 +0000 (17:40 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 24 Nov 2025 12:05:23 +0000 (13:05 +0100)
When changing the interface type, all activity on the interface has
to be stopped first. This was done independent of existing code in
cfg80211_leave(), so didn't handle e.g. background radar detection.
Use cfg80211_leave() to handle it the same way.

Note that cfg80211_leave() behaves slightly differently for IBSS in
wireless extensions, it won't send an event in that case. We could
handle that, but since nl80211 was used to change the type, IBSS is
rare, and wext is already a corner case, it doesn't seem worth it.

Link: https://patch.msgid.link/20251121174021.922ef48ce007.I970c8514252ef8a864a7fbdab9591b71031dee03@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/util.c

index 97f40c6d1e9d18eb16aa61eebe6f9b9764b2dd63..27e8a2f52f042eb27ef7e09770d71577d28a379c 100644 (file)
@@ -1203,28 +1203,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
                dev->ieee80211_ptr->use_4addr = false;
                rdev_set_qos_map(rdev, dev, NULL);
 
-               switch (otype) {
-               case NL80211_IFTYPE_AP:
-               case NL80211_IFTYPE_P2P_GO:
-                       cfg80211_stop_ap(rdev, dev, -1, true);
-                       break;
-               case NL80211_IFTYPE_ADHOC:
-                       cfg80211_leave_ibss(rdev, dev, false);
-                       break;
-               case NL80211_IFTYPE_STATION:
-               case NL80211_IFTYPE_P2P_CLIENT:
-                       cfg80211_disconnect(rdev, dev,
-                                           WLAN_REASON_DEAUTH_LEAVING, true);
-                       break;
-               case NL80211_IFTYPE_MESH_POINT:
-                       /* mesh should be handled? */
-                       break;
-               case NL80211_IFTYPE_OCB:
-                       cfg80211_leave_ocb(rdev, dev);
-                       break;
-               default:
-                       break;
-               }
+               cfg80211_leave(rdev, dev->ieee80211_ptr);
 
                cfg80211_process_rdev_events(rdev);
                cfg80211_mlme_purge_registrations(dev->ieee80211_ptr);