|
@@ -2518,7 +2518,7 @@ static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
|
|
- bool assoc)
|
|
|
+ bool assoc, bool abandon)
|
|
|
{
|
|
|
struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
|
|
|
|
|
@@ -2541,6 +2541,9 @@ static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
|
|
mutex_lock(&sdata->local->mtx);
|
|
|
ieee80211_vif_release_channel(sdata);
|
|
|
mutex_unlock(&sdata->local->mtx);
|
|
|
+
|
|
|
+ if (abandon)
|
|
|
+ cfg80211_abandon_assoc(sdata->dev, assoc_data->bss);
|
|
|
}
|
|
|
|
|
|
kfree(assoc_data);
|
|
@@ -2773,7 +2776,7 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
|
|
|
bssid, reason_code,
|
|
|
ieee80211_get_reason_code_string(reason_code));
|
|
|
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, true);
|
|
|
|
|
|
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
|
|
return;
|
|
@@ -3182,14 +3185,14 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|
|
if (status_code != WLAN_STATUS_SUCCESS) {
|
|
|
sdata_info(sdata, "%pM denied association (code=%d)\n",
|
|
|
mgmt->sa, status_code);
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, false);
|
|
|
event.u.mlme.status = MLME_DENIED;
|
|
|
event.u.mlme.reason = status_code;
|
|
|
drv_event_callback(sdata->local, sdata, &event);
|
|
|
} else {
|
|
|
if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) {
|
|
|
/* oops -- internal error -- send timeout for now */
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, false);
|
|
|
cfg80211_assoc_timeout(sdata->dev, bss);
|
|
|
return;
|
|
|
}
|
|
@@ -3202,7 +3205,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|
|
* recalc after assoc_data is NULL but before associated
|
|
|
* is set can cause the interface to go idle
|
|
|
*/
|
|
|
- ieee80211_destroy_assoc_data(sdata, true);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, true, false);
|
|
|
|
|
|
/* get uapsd queues configuration */
|
|
|
uapsd_queues = 0;
|
|
@@ -3901,7 +3904,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
|
|
.u.mlme.status = MLME_TIMEOUT,
|
|
|
};
|
|
|
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, false);
|
|
|
cfg80211_assoc_timeout(sdata->dev, bss);
|
|
|
drv_event_callback(sdata->local, sdata, &event);
|
|
|
}
|
|
@@ -4040,7 +4043,7 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
|
|
|
WLAN_REASON_DEAUTH_LEAVING,
|
|
|
false, frame_buf);
|
|
|
if (ifmgd->assoc_data)
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, true);
|
|
|
if (ifmgd->auth_data)
|
|
|
ieee80211_destroy_auth_data(sdata, false);
|
|
|
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
|
@@ -4949,7 +4952,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
|
|
IEEE80211_STYPE_DEAUTH,
|
|
|
req->reason_code, tx,
|
|
|
frame_buf);
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, true);
|
|
|
ieee80211_report_disconnect(sdata, frame_buf,
|
|
|
sizeof(frame_buf), true,
|
|
|
req->reason_code);
|
|
@@ -5024,7 +5027,7 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
|
|
|
sdata_lock(sdata);
|
|
|
if (ifmgd->assoc_data) {
|
|
|
struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
|
|
|
- ieee80211_destroy_assoc_data(sdata, false);
|
|
|
+ ieee80211_destroy_assoc_data(sdata, false, false);
|
|
|
cfg80211_assoc_timeout(sdata->dev, bss);
|
|
|
}
|
|
|
if (ifmgd->auth_data)
|