Currently autodisconnect_wk assumes that only interface types of
P2P_CLIENT and STATION use conn_owner_nlportid.  Change this so all
interface types are supported.

Signed-off-by: Denis Kenzior <denk...@gmail.com>
---
 net/wireless/sme.c | 43 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 701cfd7acc1b..5df6b33db786 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -1239,17 +1239,38 @@ void cfg80211_autodisconnect_wk(struct work_struct 
*work)
        wdev_lock(wdev);
 
        if (wdev->conn_owner_nlportid) {
-               /*
-                * Use disconnect_bssid if still connecting and ops->disconnect
-                * not implemented.  Otherwise we can use cfg80211_disconnect.
-                */
-               if (rdev->ops->disconnect || wdev->current_bss)
-                       cfg80211_disconnect(rdev, wdev->netdev,
-                                           WLAN_REASON_DEAUTH_LEAVING, true);
-               else
-                       cfg80211_mlme_deauth(rdev, wdev->netdev,
-                                            wdev->disconnect_bssid, NULL, 0,
-                                            WLAN_REASON_DEAUTH_LEAVING, false);
+               switch (wdev->iftype) {
+               case NL80211_IFTYPE_ADHOC:
+                       cfg80211_leave_ibss(rdev, wdev->netdev, false);
+                       break;
+               case NL80211_IFTYPE_AP:
+               case NL80211_IFTYPE_P2P_GO:
+                       cfg80211_stop_ap(rdev, wdev->netdev, false);
+                       break;
+               case NL80211_IFTYPE_MESH_POINT:
+                       cfg80211_leave_mesh(rdev, wdev->netdev);
+                       break;
+               case NL80211_IFTYPE_STATION:
+               case NL80211_IFTYPE_P2P_CLIENT:
+                       /*
+                        * Use disconnect_bssid if still connecting and
+                        * ops->disconnect not implemented.  Otherwise we can
+                        * use cfg80211_disconnect.
+                        */
+                       if (rdev->ops->disconnect || wdev->current_bss)
+                               cfg80211_disconnect(rdev, wdev->netdev,
+                                                   WLAN_REASON_DEAUTH_LEAVING,
+                                                   true);
+                       else
+                               cfg80211_mlme_deauth(rdev, wdev->netdev,
+                                                    wdev->disconnect_bssid,
+                                                    NULL, 0,
+                                                    WLAN_REASON_DEAUTH_LEAVING,
+                                                    false);
+                       break;
+               default:
+                       break;
+               }
        }
 
        wdev_unlock(wdev);
-- 
2.13.5

Reply via email to