aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorEliad Peller <eliad@wizery.com>2012-07-12 10:35:33 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-07-17 06:17:42 -0400
commit88bc40e8c3d3bca7d26c756bb0b823d4abad3355 (patch)
treef792abdb4ba22c36640a85b2b89ec797c772700c /net
parent14cdf112019c1d4bc0f1bf9a9c832be641dbe25a (diff)
mac80211: go out of PS before sending disassoc
on disassoc, ieee80211_set_disassoc() goes out of PS before indicating BSS_CHANGED_ASSOC (not sure why this is needed, but some drivers might count on the current behavior). However, it does it after sending the disassoc frame, which results in null-data frame being sent (in order to go out of ps) after we were already sent the disassoc, which is invalid. Fix it by going out of ps before sending the disassoc. Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/mlme.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 4efcbf89a72d..7c0613ce38bc 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1364,6 +1364,17 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
1364 } 1364 }
1365 mutex_unlock(&local->sta_mtx); 1365 mutex_unlock(&local->sta_mtx);
1366 1366
1367 /*
1368 * if we want to get out of ps before disassoc (why?) we have
1369 * to do it before sending disassoc, as otherwise the null-packet
1370 * won't be valid.
1371 */
1372 if (local->hw.conf.flags & IEEE80211_CONF_PS) {
1373 local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1374 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1375 }
1376 local->ps_sdata = NULL;
1377
1367 /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */ 1378 /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */
1368 if (tx) 1379 if (tx)
1369 drv_flush(local, false); 1380 drv_flush(local, false);
@@ -1396,12 +1407,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
1396 del_timer_sync(&local->dynamic_ps_timer); 1407 del_timer_sync(&local->dynamic_ps_timer);
1397 cancel_work_sync(&local->dynamic_ps_enable_work); 1408 cancel_work_sync(&local->dynamic_ps_enable_work);
1398 1409
1399 if (local->hw.conf.flags & IEEE80211_CONF_PS) {
1400 local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1401 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1402 }
1403 local->ps_sdata = NULL;
1404
1405 /* Disable ARP filtering */ 1410 /* Disable ARP filtering */
1406 if (sdata->vif.bss_conf.arp_filter_enabled) { 1411 if (sdata->vif.bss_conf.arp_filter_enabled) {
1407 sdata->vif.bss_conf.arp_filter_enabled = false; 1412 sdata->vif.bss_conf.arp_filter_enabled = false;