aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJouni Malinen <jouni.malinen@atheros.com>2010-06-14 14:55:56 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-15 16:00:48 -0400
commit05e48e8e437148298f4673e1efe81f9ead5f41d7 (patch)
tree17511ed4294b800c1dceaa2b30b016c0e4c782b2 /net/mac80211/mlme.c
parentff61638105db6f5832ef8700436ba6aa6d3a2fda (diff)
mac80211: Protect Deauthentication frame when using MFP
When management frame protection (IEEE 802.11w) is used, Deauthentication frame needs to be protected when the pairwise key is configured. mac80211 was removing the station entry (and its keys) before actually sending out the Deauthentication frame. Fix this by reordering the code to send the frame before the station entry gets removed. This matches an earlier change that handled the Disassociation frame processing, but missed Deauthentication frames. Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 1c0d8fce08dd..637b22411d41 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -2158,14 +2158,16 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
2158 struct ieee80211_local *local = sdata->local; 2158 struct ieee80211_local *local = sdata->local;
2159 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 2159 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2160 struct ieee80211_work *wk; 2160 struct ieee80211_work *wk;
2161 const u8 *bssid = req->bss->bssid; 2161 u8 bssid[ETH_ALEN];
2162 bool assoc_bss = false;
2162 2163
2163 mutex_lock(&ifmgd->mtx); 2164 mutex_lock(&ifmgd->mtx);
2164 2165
2166 memcpy(bssid, req->bss->bssid, ETH_ALEN);
2165 if (ifmgd->associated == req->bss) { 2167 if (ifmgd->associated == req->bss) {
2166 bssid = req->bss->bssid; 2168 ieee80211_set_disassoc(sdata, false);
2167 ieee80211_set_disassoc(sdata, true);
2168 mutex_unlock(&ifmgd->mtx); 2169 mutex_unlock(&ifmgd->mtx);
2170 assoc_bss = true;
2169 } else { 2171 } else {
2170 bool not_auth_yet = false; 2172 bool not_auth_yet = false;
2171 2173
@@ -2211,6 +2213,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
2211 ieee80211_send_deauth_disassoc(sdata, bssid, IEEE80211_STYPE_DEAUTH, 2213 ieee80211_send_deauth_disassoc(sdata, bssid, IEEE80211_STYPE_DEAUTH,
2212 req->reason_code, cookie, 2214 req->reason_code, cookie,
2213 !req->local_state_change); 2215 !req->local_state_change);
2216 if (assoc_bss)
2217 sta_info_destroy_addr(sdata, bssid);
2214 2218
2215 ieee80211_recalc_idle(sdata->local); 2219 ieee80211_recalc_idle(sdata->local);
2216 2220