aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-03-16 17:23:36 -0400
committerJohannes Berg <johannes.berg@intel.com>2015-03-30 04:17:11 -0400
commitd0d1a12f9cc665f3fcac5288ab84429a91abd4e9 (patch)
tree41f02d2b43570ffda1f3db3302dfe45f748d9e07
parenta9409093d23c822d13a73f8d2df7e6fa987ae485 (diff)
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>
-rw-r--r--include/net/mac80211.h2
-rw-r--r--net/mac80211/mlme.c15
2 files changed, 17 insertions, 0 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 6cddf7725bf2..dcddc4ac4184 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -331,9 +331,11 @@ struct ieee80211_rssi_event {
331/** 331/**
332 * enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT 332 * enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
333 * @AUTH_EVENT: the MLME operation is authentication 333 * @AUTH_EVENT: the MLME operation is authentication
334 * @ASSOC_EVENT: the MLME operation is association
334 */ 335 */
335enum ieee80211_mlme_event_data { 336enum ieee80211_mlme_event_data {
336 AUTH_EVENT, 337 AUTH_EVENT,
338 ASSOC_EVENT,
337}; 339};
338 340
339/** 341/**
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 7865998d69dd..b6817c4c4449 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -3041,6 +3041,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
3041 u8 *pos; 3041 u8 *pos;
3042 bool reassoc; 3042 bool reassoc;
3043 struct cfg80211_bss *bss; 3043 struct cfg80211_bss *bss;
3044 struct ieee80211_event event = {
3045 .type = MLME_EVENT,
3046 .u.mlme.data = ASSOC_EVENT,
3047 };
3044 3048
3045 sdata_assert_lock(sdata); 3049 sdata_assert_lock(sdata);
3046 3050
@@ -3092,6 +3096,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
3092 sdata_info(sdata, "%pM denied association (code=%d)\n", 3096 sdata_info(sdata, "%pM denied association (code=%d)\n",
3093 mgmt->sa, status_code); 3097 mgmt->sa, status_code);
3094 ieee80211_destroy_assoc_data(sdata, false); 3098 ieee80211_destroy_assoc_data(sdata, false);
3099 event.u.mlme.status = MLME_DENIED;
3100 event.u.mlme.reason = status_code;
3101 drv_event_callback(sdata->local, sdata, &event);
3095 } else { 3102 } else {
3096 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { 3103 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) {
3097 /* oops -- internal error -- send timeout for now */ 3104 /* oops -- internal error -- send timeout for now */
@@ -3099,6 +3106,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
3099 cfg80211_assoc_timeout(sdata->dev, bss); 3106 cfg80211_assoc_timeout(sdata->dev, bss);
3100 return; 3107 return;
3101 } 3108 }
3109 event.u.mlme.status = MLME_SUCCESS;
3110 drv_event_callback(sdata->local, sdata, &event);
3102 sdata_info(sdata, "associated\n"); 3111 sdata_info(sdata, "associated\n");
3103 3112
3104 /* 3113 /*
@@ -3835,9 +3844,15 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
3835 if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) || 3844 if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) ||
3836 ieee80211_do_assoc(sdata)) { 3845 ieee80211_do_assoc(sdata)) {
3837 struct cfg80211_bss *bss = ifmgd->assoc_data->bss; 3846 struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
3847 struct ieee80211_event event = {
3848 .type = MLME_EVENT,
3849 .u.mlme.data = ASSOC_EVENT,
3850 .u.mlme.status = MLME_TIMEOUT,
3851 };
3838 3852
3839 ieee80211_destroy_assoc_data(sdata, false); 3853 ieee80211_destroy_assoc_data(sdata, false);
3840 cfg80211_assoc_timeout(sdata->dev, bss); 3854 cfg80211_assoc_timeout(sdata->dev, bss);
3855 drv_event_callback(sdata->local, sdata, &event);
3841 } 3856 }
3842 } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started) 3857 } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
3843 run_again(sdata, ifmgd->assoc_data->timeout); 3858 run_again(sdata, ifmgd->assoc_data->timeout);