wifi: mac80211: mlme: unify assoc data event sending
There are a few cases where we send an event to cfg80211 manually, but ieee80211_destroy_assoc_data() also handles the case of abandoning; some cases don't need an event and success is handled yet differently. Unify this by providing a single status argument to the ieee80211_destroy_assoc_data() function and then handling all the different cases of events (or no events) there. This will help simplify the code when MLO support is added. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -2999,14 +2999,21 @@ static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
|
|||||||
sdata->u.mgd.auth_data = NULL;
|
sdata->u.mgd.auth_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum assoc_status {
|
||||||
|
ASSOC_SUCCESS,
|
||||||
|
ASSOC_REJECTED,
|
||||||
|
ASSOC_TIMEOUT,
|
||||||
|
ASSOC_ABANDON,
|
||||||
|
};
|
||||||
|
|
||||||
static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
||||||
bool assoc, bool abandon)
|
enum assoc_status status)
|
||||||
{
|
{
|
||||||
struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
|
struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
|
||||||
|
|
||||||
sdata_assert_lock(sdata);
|
sdata_assert_lock(sdata);
|
||||||
|
|
||||||
if (!assoc) {
|
if (status != ASSOC_SUCCESS) {
|
||||||
/*
|
/*
|
||||||
* we are not associated yet, the only timer that could be
|
* we are not associated yet, the only timer that could be
|
||||||
* running is the timeout for the association response which
|
* running is the timeout for the association response which
|
||||||
@@ -3027,9 +3034,10 @@ static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
|||||||
ieee80211_link_release_channel(&sdata->deflink);
|
ieee80211_link_release_channel(&sdata->deflink);
|
||||||
mutex_unlock(&sdata->local->mtx);
|
mutex_unlock(&sdata->local->mtx);
|
||||||
|
|
||||||
if (abandon) {
|
if (status != ASSOC_REJECTED) {
|
||||||
struct cfg80211_assoc_failure data = {
|
struct cfg80211_assoc_failure data = {
|
||||||
.bss[0] = assoc_data->bss,
|
.bss[0] = assoc_data->bss,
|
||||||
|
.timeout = status == ASSOC_TIMEOUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
cfg80211_assoc_failure(sdata->dev, &data);
|
cfg80211_assoc_failure(sdata->dev, &data);
|
||||||
@@ -3310,7 +3318,7 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
|
|||||||
bssid, reason_code,
|
bssid, reason_code,
|
||||||
ieee80211_get_reason_code_string(reason_code));
|
ieee80211_get_reason_code_string(reason_code));
|
||||||
|
|
||||||
ieee80211_destroy_assoc_data(sdata, false, true);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
|
||||||
|
|
||||||
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
||||||
return;
|
return;
|
||||||
@@ -3954,19 +3962,14 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|||||||
if (status_code != WLAN_STATUS_SUCCESS) {
|
if (status_code != WLAN_STATUS_SUCCESS) {
|
||||||
sdata_info(sdata, "%pM denied association (code=%d)\n",
|
sdata_info(sdata, "%pM denied association (code=%d)\n",
|
||||||
mgmt->sa, status_code);
|
mgmt->sa, status_code);
|
||||||
ieee80211_destroy_assoc_data(sdata, false, false);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_REJECTED);
|
||||||
event.u.mlme.status = MLME_DENIED;
|
event.u.mlme.status = MLME_DENIED;
|
||||||
event.u.mlme.reason = status_code;
|
event.u.mlme.reason = status_code;
|
||||||
drv_event_callback(sdata->local, sdata, &event);
|
drv_event_callback(sdata->local, sdata, &event);
|
||||||
} else {
|
} else {
|
||||||
if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, elems)) {
|
if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, elems)) {
|
||||||
/* oops -- internal error -- send timeout for now */
|
/* oops -- internal error -- send timeout for now */
|
||||||
struct cfg80211_assoc_failure data = {
|
ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
|
||||||
.timeout = true,
|
|
||||||
.bss[0] = cbss,
|
|
||||||
};
|
|
||||||
ieee80211_destroy_assoc_data(sdata, false, false);
|
|
||||||
cfg80211_assoc_failure(sdata->dev, &data);
|
|
||||||
goto notify_driver;
|
goto notify_driver;
|
||||||
}
|
}
|
||||||
event.u.mlme.status = MLME_SUCCESS;
|
event.u.mlme.status = MLME_SUCCESS;
|
||||||
@@ -3978,7 +3981,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|||||||
* recalc after assoc_data is NULL but before associated
|
* recalc after assoc_data is NULL but before associated
|
||||||
* is set can cause the interface to go idle
|
* is set can cause the interface to go idle
|
||||||
*/
|
*/
|
||||||
ieee80211_destroy_assoc_data(sdata, true, false);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_SUCCESS);
|
||||||
|
|
||||||
/* get uapsd queues configuration */
|
/* get uapsd queues configuration */
|
||||||
uapsd_queues = 0;
|
uapsd_queues = 0;
|
||||||
@@ -4836,19 +4839,13 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
|||||||
if ((ifmgd->assoc_data->need_beacon &&
|
if ((ifmgd->assoc_data->need_beacon &&
|
||||||
!sdata->deflink.u.mgd.have_beacon) ||
|
!sdata->deflink.u.mgd.have_beacon) ||
|
||||||
ieee80211_do_assoc(sdata)) {
|
ieee80211_do_assoc(sdata)) {
|
||||||
struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
|
|
||||||
struct ieee80211_event event = {
|
struct ieee80211_event event = {
|
||||||
.type = MLME_EVENT,
|
.type = MLME_EVENT,
|
||||||
.u.mlme.data = ASSOC_EVENT,
|
.u.mlme.data = ASSOC_EVENT,
|
||||||
.u.mlme.status = MLME_TIMEOUT,
|
.u.mlme.status = MLME_TIMEOUT,
|
||||||
};
|
};
|
||||||
struct cfg80211_assoc_failure data = {
|
|
||||||
.bss[0] = bss,
|
|
||||||
.timeout = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
ieee80211_destroy_assoc_data(sdata, false, false);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
|
||||||
cfg80211_assoc_failure(sdata->dev, &data);
|
|
||||||
drv_event_callback(sdata->local, sdata, &event);
|
drv_event_callback(sdata->local, sdata, &event);
|
||||||
}
|
}
|
||||||
} else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
|
} else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
|
||||||
@@ -5013,7 +5010,7 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
|
|||||||
WLAN_REASON_DEAUTH_LEAVING,
|
WLAN_REASON_DEAUTH_LEAVING,
|
||||||
false, frame_buf);
|
false, frame_buf);
|
||||||
if (ifmgd->assoc_data)
|
if (ifmgd->assoc_data)
|
||||||
ieee80211_destroy_assoc_data(sdata, false, true);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
|
||||||
if (ifmgd->auth_data)
|
if (ifmgd->auth_data)
|
||||||
ieee80211_destroy_auth_data(sdata, false);
|
ieee80211_destroy_auth_data(sdata, false);
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
||||||
@@ -6408,7 +6405,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
|||||||
IEEE80211_STYPE_DEAUTH,
|
IEEE80211_STYPE_DEAUTH,
|
||||||
req->reason_code, tx,
|
req->reason_code, tx,
|
||||||
frame_buf);
|
frame_buf);
|
||||||
ieee80211_destroy_assoc_data(sdata, false, true);
|
ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
|
||||||
ieee80211_report_disconnect(sdata, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf,
|
||||||
sizeof(frame_buf), true,
|
sizeof(frame_buf), true,
|
||||||
req->reason_code, false);
|
req->reason_code, false);
|
||||||
@@ -6479,16 +6476,8 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
|
|||||||
cancel_delayed_work_sync(&ifmgd->tdls_peer_del_work);
|
cancel_delayed_work_sync(&ifmgd->tdls_peer_del_work);
|
||||||
|
|
||||||
sdata_lock(sdata);
|
sdata_lock(sdata);
|
||||||
if (ifmgd->assoc_data) {
|
if (ifmgd->assoc_data)
|
||||||
struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
|
ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
|
||||||
struct cfg80211_assoc_failure data = {
|
|
||||||
.bss[0] = bss,
|
|
||||||
.timeout = true,
|
|
||||||
};
|
|
||||||
|
|
||||||
ieee80211_destroy_assoc_data(sdata, false, false);
|
|
||||||
cfg80211_assoc_failure(sdata->dev, &data);
|
|
||||||
}
|
|
||||||
if (ifmgd->auth_data)
|
if (ifmgd->auth_data)
|
||||||
ieee80211_destroy_auth_data(sdata, false);
|
ieee80211_destroy_auth_data(sdata, false);
|
||||||
spin_lock_bh(&ifmgd->teardown_lock);
|
spin_lock_bh(&ifmgd->teardown_lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user