|
@@ -814,6 +814,46 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
|
|
|
rdev->num_running_monitor_ifaces += num;
|
|
|
}
|
|
|
|
|
|
+void cfg80211_leave(struct cfg80211_registered_device *rdev,
|
|
|
+ struct wireless_dev *wdev)
|
|
|
+{
|
|
|
+ struct net_device *dev = wdev->netdev;
|
|
|
+
|
|
|
+ switch (wdev->iftype) {
|
|
|
+ case NL80211_IFTYPE_ADHOC:
|
|
|
+ cfg80211_leave_ibss(rdev, dev, true);
|
|
|
+ break;
|
|
|
+ case NL80211_IFTYPE_P2P_CLIENT:
|
|
|
+ case NL80211_IFTYPE_STATION:
|
|
|
+ mutex_lock(&rdev->sched_scan_mtx);
|
|
|
+ __cfg80211_stop_sched_scan(rdev, false);
|
|
|
+ mutex_unlock(&rdev->sched_scan_mtx);
|
|
|
+
|
|
|
+ wdev_lock(wdev);
|
|
|
+#ifdef CONFIG_CFG80211_WEXT
|
|
|
+ kfree(wdev->wext.ie);
|
|
|
+ wdev->wext.ie = NULL;
|
|
|
+ wdev->wext.ie_len = 0;
|
|
|
+ wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
|
|
|
+#endif
|
|
|
+ __cfg80211_disconnect(rdev, dev,
|
|
|
+ WLAN_REASON_DEAUTH_LEAVING, true);
|
|
|
+ cfg80211_mlme_down(rdev, dev);
|
|
|
+ wdev_unlock(wdev);
|
|
|
+ break;
|
|
|
+ case NL80211_IFTYPE_MESH_POINT:
|
|
|
+ cfg80211_leave_mesh(rdev, dev);
|
|
|
+ break;
|
|
|
+ case NL80211_IFTYPE_AP:
|
|
|
+ cfg80211_stop_ap(rdev, dev);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ wdev->beacon_interval = 0;
|
|
|
+}
|
|
|
+
|
|
|
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|
|
unsigned long state,
|
|
|
void *ndev)
|
|
@@ -882,38 +922,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|
|
dev->priv_flags |= IFF_DONT_BRIDGE;
|
|
|
break;
|
|
|
case NETDEV_GOING_DOWN:
|
|
|
- switch (wdev->iftype) {
|
|
|
- case NL80211_IFTYPE_ADHOC:
|
|
|
- cfg80211_leave_ibss(rdev, dev, true);
|
|
|
- break;
|
|
|
- case NL80211_IFTYPE_P2P_CLIENT:
|
|
|
- case NL80211_IFTYPE_STATION:
|
|
|
- mutex_lock(&rdev->sched_scan_mtx);
|
|
|
- __cfg80211_stop_sched_scan(rdev, false);
|
|
|
- mutex_unlock(&rdev->sched_scan_mtx);
|
|
|
-
|
|
|
- wdev_lock(wdev);
|
|
|
-#ifdef CONFIG_CFG80211_WEXT
|
|
|
- kfree(wdev->wext.ie);
|
|
|
- wdev->wext.ie = NULL;
|
|
|
- wdev->wext.ie_len = 0;
|
|
|
- wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
|
|
|
-#endif
|
|
|
- __cfg80211_disconnect(rdev, dev,
|
|
|
- WLAN_REASON_DEAUTH_LEAVING, true);
|
|
|
- cfg80211_mlme_down(rdev, dev);
|
|
|
- wdev_unlock(wdev);
|
|
|
- break;
|
|
|
- case NL80211_IFTYPE_MESH_POINT:
|
|
|
- cfg80211_leave_mesh(rdev, dev);
|
|
|
- break;
|
|
|
- case NL80211_IFTYPE_AP:
|
|
|
- cfg80211_stop_ap(rdev, dev);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- wdev->beacon_interval = 0;
|
|
|
+ cfg80211_leave(rdev, wdev);
|
|
|
break;
|
|
|
case NETDEV_DOWN:
|
|
|
cfg80211_update_iface_num(rdev, wdev->iftype, -1);
|