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:
parent
a9409093d2
commit
d0d1a12f9c
|
@ -331,9 +331,11 @@ struct ieee80211_rssi_event {
|
||||||
/**
|
/**
|
||||||
* enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
|
* enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
|
||||||
* @AUTH_EVENT: the MLME operation is authentication
|
* @AUTH_EVENT: the MLME operation is authentication
|
||||||
|
* @ASSOC_EVENT: the MLME operation is association
|
||||||
*/
|
*/
|
||||||
enum ieee80211_mlme_event_data {
|
enum ieee80211_mlme_event_data {
|
||||||
AUTH_EVENT,
|
AUTH_EVENT,
|
||||||
|
ASSOC_EVENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3041,6 +3041,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *pos;
|
u8 *pos;
|
||||||
bool reassoc;
|
bool reassoc;
|
||||||
struct cfg80211_bss *bss;
|
struct cfg80211_bss *bss;
|
||||||
|
struct ieee80211_event event = {
|
||||||
|
.type = MLME_EVENT,
|
||||||
|
.u.mlme.data = ASSOC_EVENT,
|
||||||
|
};
|
||||||
|
|
||||||
sdata_assert_lock(sdata);
|
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",
|
sdata_info(sdata, "%pM denied association (code=%d)\n",
|
||||||
mgmt->sa, status_code);
|
mgmt->sa, status_code);
|
||||||
ieee80211_destroy_assoc_data(sdata, false);
|
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 {
|
} else {
|
||||||
if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) {
|
if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) {
|
||||||
/* oops -- internal error -- send timeout for now */
|
/* 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);
|
cfg80211_assoc_timeout(sdata->dev, bss);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
event.u.mlme.status = MLME_SUCCESS;
|
||||||
|
drv_event_callback(sdata->local, sdata, &event);
|
||||||
sdata_info(sdata, "associated\n");
|
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) ||
|
if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) ||
|
||||||
ieee80211_do_assoc(sdata)) {
|
ieee80211_do_assoc(sdata)) {
|
||||||
struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
|
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);
|
ieee80211_destroy_assoc_data(sdata, false);
|
||||||
cfg80211_assoc_timeout(sdata->dev, bss);
|
cfg80211_assoc_timeout(sdata->dev, bss);
|
||||||
|
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)
|
||||||
run_again(sdata, ifmgd->assoc_data->timeout);
|
run_again(sdata, ifmgd->assoc_data->timeout);
|
||||||
|
|
Loading…
Reference in New Issue