aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/sme.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/sme.c')
-rw-r--r--net/wireless/sme.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 8a7dcbf90602..0b776b769c0f 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -570,10 +570,30 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
570 wdev->ssid_len = 0; 570 wdev->ssid_len = 0;
571 571
572 if (wdev->conn) { 572 if (wdev->conn) {
573 const u8 *bssid;
574 int ret;
575
573 kfree(wdev->conn->ie); 576 kfree(wdev->conn->ie);
574 wdev->conn->ie = NULL; 577 wdev->conn->ie = NULL;
575 kfree(wdev->conn); 578 kfree(wdev->conn);
576 wdev->conn = NULL; 579 wdev->conn = NULL;
580
581 /*
582 * If this disconnect was due to a disassoc, we
583 * we might still have an auth BSS around. For
584 * the userspace SME that's currently expected,
585 * but for the kernel SME (nl80211 CONNECT or
586 * wireless extensions) we want to clear up all
587 * state.
588 */
589 for (i = 0; i < MAX_AUTH_BSSES; i++) {
590 if (!wdev->auth_bsses[i])
591 continue;
592 bssid = wdev->auth_bsses[i]->pub.bssid;
593 ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
594 WLAN_REASON_DEAUTH_LEAVING);
595 WARN(ret, "deauth failed: %d\n", ret);
596 }
577 } 597 }
578 598
579 nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap); 599 nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap);