Skip to content

Commit

Permalink
mac80211: go out of PS before sending disassoc
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
elp authored and ariknem committed Jul 15, 2012
1 parent a385fc3 commit 28c37c9
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions net/mac80211/mlme.c
Expand Up @@ -1364,6 +1364,17 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
} }
mutex_unlock(&local->sta_mtx); mutex_unlock(&local->sta_mtx);


/*
* if we want to get out of ps before disassoc (why?) we have
* to do it before sending disassoc, as otherwise the null-packet
* won't be valid.
*/
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
}
local->ps_sdata = NULL;

/* flush out any pending frame (e.g. DELBA) before deauth/disassoc */ /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */
if (tx) if (tx)
drv_flush(local, false); drv_flush(local, false);
Expand Down Expand Up @@ -1399,12 +1410,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
del_timer_sync(&local->dynamic_ps_timer); del_timer_sync(&local->dynamic_ps_timer);
cancel_work_sync(&local->dynamic_ps_enable_work); cancel_work_sync(&local->dynamic_ps_enable_work);


if (local->hw.conf.flags & IEEE80211_CONF_PS) {
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
}
local->ps_sdata = NULL;

/* Disable ARP filtering */ /* Disable ARP filtering */
if (sdata->vif.bss_conf.arp_filter_enabled) { if (sdata->vif.bss_conf.arp_filter_enabled) {
sdata->vif.bss_conf.arp_filter_enabled = false; sdata->vif.bss_conf.arp_filter_enabled = false;
Expand Down

0 comments on commit 28c37c9

Please sign in to comment.