diff options
Diffstat (limited to 'net/wireless/core.c')
-rw-r--r-- | net/wireless/core.c | 77 |
1 files changed, 44 insertions, 33 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index 6ddf74f0ae1e..84c9ad7e1dca 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -842,6 +842,46 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, | |||
842 | rdev->num_running_monitor_ifaces += num; | 842 | rdev->num_running_monitor_ifaces += num; |
843 | } | 843 | } |
844 | 844 | ||
845 | void cfg80211_leave(struct cfg80211_registered_device *rdev, | ||
846 | struct wireless_dev *wdev) | ||
847 | { | ||
848 | struct net_device *dev = wdev->netdev; | ||
849 | |||
850 | switch (wdev->iftype) { | ||
851 | case NL80211_IFTYPE_ADHOC: | ||
852 | cfg80211_leave_ibss(rdev, dev, true); | ||
853 | break; | ||
854 | case NL80211_IFTYPE_P2P_CLIENT: | ||
855 | case NL80211_IFTYPE_STATION: | ||
856 | mutex_lock(&rdev->sched_scan_mtx); | ||
857 | __cfg80211_stop_sched_scan(rdev, false); | ||
858 | mutex_unlock(&rdev->sched_scan_mtx); | ||
859 | |||
860 | wdev_lock(wdev); | ||
861 | #ifdef CONFIG_CFG80211_WEXT | ||
862 | kfree(wdev->wext.ie); | ||
863 | wdev->wext.ie = NULL; | ||
864 | wdev->wext.ie_len = 0; | ||
865 | wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; | ||
866 | #endif | ||
867 | __cfg80211_disconnect(rdev, dev, | ||
868 | WLAN_REASON_DEAUTH_LEAVING, true); | ||
869 | cfg80211_mlme_down(rdev, dev); | ||
870 | wdev_unlock(wdev); | ||
871 | break; | ||
872 | case NL80211_IFTYPE_MESH_POINT: | ||
873 | cfg80211_leave_mesh(rdev, dev); | ||
874 | break; | ||
875 | case NL80211_IFTYPE_AP: | ||
876 | cfg80211_stop_ap(rdev, dev); | ||
877 | break; | ||
878 | default: | ||
879 | break; | ||
880 | } | ||
881 | |||
882 | wdev->beacon_interval = 0; | ||
883 | } | ||
884 | |||
845 | static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | 885 | static int cfg80211_netdev_notifier_call(struct notifier_block *nb, |
846 | unsigned long state, | 886 | unsigned long state, |
847 | void *ndev) | 887 | void *ndev) |
@@ -910,38 +950,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | |||
910 | dev->priv_flags |= IFF_DONT_BRIDGE; | 950 | dev->priv_flags |= IFF_DONT_BRIDGE; |
911 | break; | 951 | break; |
912 | case NETDEV_GOING_DOWN: | 952 | case NETDEV_GOING_DOWN: |
913 | switch (wdev->iftype) { | 953 | cfg80211_leave(rdev, wdev); |
914 | case NL80211_IFTYPE_ADHOC: | ||
915 | cfg80211_leave_ibss(rdev, dev, true); | ||
916 | break; | ||
917 | case NL80211_IFTYPE_P2P_CLIENT: | ||
918 | case NL80211_IFTYPE_STATION: | ||
919 | mutex_lock(&rdev->sched_scan_mtx); | ||
920 | __cfg80211_stop_sched_scan(rdev, false); | ||
921 | mutex_unlock(&rdev->sched_scan_mtx); | ||
922 | |||
923 | wdev_lock(wdev); | ||
924 | #ifdef CONFIG_CFG80211_WEXT | ||
925 | kfree(wdev->wext.ie); | ||
926 | wdev->wext.ie = NULL; | ||
927 | wdev->wext.ie_len = 0; | ||
928 | wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; | ||
929 | #endif | ||
930 | __cfg80211_disconnect(rdev, dev, | ||
931 | WLAN_REASON_DEAUTH_LEAVING, true); | ||
932 | cfg80211_mlme_down(rdev, dev); | ||
933 | wdev_unlock(wdev); | ||
934 | break; | ||
935 | case NL80211_IFTYPE_MESH_POINT: | ||
936 | cfg80211_leave_mesh(rdev, dev); | ||
937 | break; | ||
938 | case NL80211_IFTYPE_AP: | ||
939 | cfg80211_stop_ap(rdev, dev); | ||
940 | break; | ||
941 | default: | ||
942 | break; | ||
943 | } | ||
944 | wdev->beacon_interval = 0; | ||
945 | break; | 954 | break; |
946 | case NETDEV_DOWN: | 955 | case NETDEV_DOWN: |
947 | cfg80211_update_iface_num(rdev, wdev->iftype, -1); | 956 | cfg80211_update_iface_num(rdev, wdev->iftype, -1); |
@@ -1117,8 +1126,10 @@ static int __init cfg80211_init(void) | |||
1117 | goto out_fail_reg; | 1126 | goto out_fail_reg; |
1118 | 1127 | ||
1119 | cfg80211_wq = create_singlethread_workqueue("cfg80211"); | 1128 | cfg80211_wq = create_singlethread_workqueue("cfg80211"); |
1120 | if (!cfg80211_wq) | 1129 | if (!cfg80211_wq) { |
1130 | err = -ENOMEM; | ||
1121 | goto out_fail_wq; | 1131 | goto out_fail_wq; |
1132 | } | ||
1122 | 1133 | ||
1123 | return 0; | 1134 | return 0; |
1124 | 1135 | ||