mac80211: notify the driver about association status
This can allow the driver to take action based on the success / failure of the association. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
a9409093d2
Коммит
d0d1a12f9c
|
@ -331,9 +331,11 @@ struct ieee80211_rssi_event {
|
|||
/**
|
||||
* enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
|
||||
* @AUTH_EVENT: the MLME operation is authentication
|
||||
* @ASSOC_EVENT: the MLME operation is association
|
||||
*/
|
||||
enum ieee80211_mlme_event_data {
|
||||
AUTH_EVENT,
|
||||
ASSOC_EVENT,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -3041,6 +3041,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|||
u8 *pos;
|
||||
bool reassoc;
|
||||
struct cfg80211_bss *bss;
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
.u.mlme.data = ASSOC_EVENT,
|
||||
};
|
||||
|
||||
sdata_assert_lock(sdata);
|
||||
|
||||
|
@ -3092,6 +3096,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|||
sdata_info(sdata, "%pM denied association (code=%d)\n",
|
||||
mgmt->sa, status_code);
|
||||
ieee80211_destroy_assoc_data(sdata, 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 */
|
||||
|
@ -3099,6 +3106,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
|||
cfg80211_assoc_timeout(sdata->dev, bss);
|
||||
return;
|
||||
}
|
||||
event.u.mlme.status = MLME_SUCCESS;
|
||||
drv_event_callback(sdata->local, sdata, &event);
|
||||
sdata_info(sdata, "associated\n");
|
||||
|
||||
/*
|
||||
|
@ -3835,9 +3844,15 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
|||
if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) ||
|
||||
ieee80211_do_assoc(sdata)) {
|
||||
struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
.u.mlme.data = ASSOC_EVENT,
|
||||
.u.mlme.status = MLME_TIMEOUT,
|
||||
};
|
||||
|
||||
ieee80211_destroy_assoc_data(sdata, false);
|
||||
cfg80211_assoc_timeout(sdata->dev, bss);
|
||||
drv_event_callback(sdata->local, sdata, &event);
|
||||
}
|
||||
} else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
|
||||
run_again(sdata, ifmgd->assoc_data->timeout);
|
||||
|
|
Загрузка…
Ссылка в новой задаче