diff options
-rw-r--r-- | net/mac80211/mlme.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 423816f18b55..5ade21eb3602 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -4393,37 +4393,41 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
4393 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 4393 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
4394 | u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; | 4394 | u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; |
4395 | bool tx = !req->local_state_change; | 4395 | bool tx = !req->local_state_change; |
4396 | bool report_frame = false; | ||
4397 | 4396 | ||
4398 | sdata_info(sdata, | 4397 | if (ifmgd->auth_data && |
4399 | "deauthenticating from %pM by local choice (Reason: %u=%s)\n", | 4398 | ether_addr_equal(ifmgd->auth_data->bss->bssid, req->bssid)) { |
4400 | req->bssid, req->reason_code, ieee80211_get_reason_code_string(req->reason_code)); | 4399 | sdata_info(sdata, |
4400 | "aborting authentication with %pM by local choice (Reason: %u=%s)\n", | ||
4401 | req->bssid, req->reason_code, | ||
4402 | ieee80211_get_reason_code_string(req->reason_code)); | ||
4401 | 4403 | ||
4402 | if (ifmgd->auth_data) { | ||
4403 | drv_mgd_prepare_tx(sdata->local, sdata); | 4404 | drv_mgd_prepare_tx(sdata->local, sdata); |
4404 | ieee80211_send_deauth_disassoc(sdata, req->bssid, | 4405 | ieee80211_send_deauth_disassoc(sdata, req->bssid, |
4405 | IEEE80211_STYPE_DEAUTH, | 4406 | IEEE80211_STYPE_DEAUTH, |
4406 | req->reason_code, tx, | 4407 | req->reason_code, tx, |
4407 | frame_buf); | 4408 | frame_buf); |
4408 | ieee80211_destroy_auth_data(sdata, false); | 4409 | ieee80211_destroy_auth_data(sdata, false); |
4410 | cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, | ||
4411 | IEEE80211_DEAUTH_FRAME_LEN); | ||
4409 | 4412 | ||
4410 | report_frame = true; | 4413 | return 0; |
4411 | goto out; | ||
4412 | } | 4414 | } |
4413 | 4415 | ||
4414 | if (ifmgd->associated && | 4416 | if (ifmgd->associated && |
4415 | ether_addr_equal(ifmgd->associated->bssid, req->bssid)) { | 4417 | ether_addr_equal(ifmgd->associated->bssid, req->bssid)) { |
4418 | sdata_info(sdata, | ||
4419 | "deauthenticating from %pM by local choice (Reason: %u=%s)\n", | ||
4420 | req->bssid, req->reason_code, | ||
4421 | ieee80211_get_reason_code_string(req->reason_code)); | ||
4422 | |||
4416 | ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, | 4423 | ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, |
4417 | req->reason_code, tx, frame_buf); | 4424 | req->reason_code, tx, frame_buf); |
4418 | report_frame = true; | ||
4419 | } | ||
4420 | |||
4421 | out: | ||
4422 | if (report_frame) | ||
4423 | cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, | 4425 | cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, |
4424 | IEEE80211_DEAUTH_FRAME_LEN); | 4426 | IEEE80211_DEAUTH_FRAME_LEN); |
4427 | return 0; | ||
4428 | } | ||
4425 | 4429 | ||
4426 | return 0; | 4430 | return -ENOTCONN; |
4427 | } | 4431 | } |
4428 | 4432 | ||
4429 | int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | 4433 | int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, |