Skip to content

Commit 88bc40e

Browse files
elpjmberg-intel
authored andcommitted
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 <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
1 parent 14cdf11 commit 88bc40e

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

net/mac80211/mlme.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,6 +1364,17 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
13641364
}
13651365
mutex_unlock(&local->sta_mtx);
13661366

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+
13671378
/* flush out any pending frame (e.g. DELBA) before deauth/disassoc */
13681379
if (tx)
13691380
drv_flush(local, false);
@@ -1396,12 +1407,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
13961407
del_timer_sync(&local->dynamic_ps_timer);
13971408
cancel_work_sync(&local->dynamic_ps_enable_work);
13981409

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-
14051410
/* Disable ARP filtering */
14061411
if (sdata->vif.bss_conf.arp_filter_enabled) {
14071412
sdata->vif.bss_conf.arp_filter_enabled = false;

0 commit comments

Comments
 (0)