summaryrefslogtreecommitdiff
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-11-16 11:50:28 -0800
committerJohn W. Linville <linville@tuxdriver.com>2010-11-17 16:19:33 -0500
commit50a9432daeece6fc1309bef1dc0a7b8fde8204cb (patch)
tree11b8bdf724dd9951391ea7f963e6539ca86ea4b6 /net/mac80211/rx.c
parent4bce22b9b84032c77c7e038b07b24fcc706dfc10 (diff)
downloadlinux-3.10-50a9432daeece6fc1309bef1dc0a7b8fde8204cb.tar.gz
linux-3.10-50a9432daeece6fc1309bef1dc0a7b8fde8204cb.tar.bz2
linux-3.10-50a9432daeece6fc1309bef1dc0a7b8fde8204cb.zip
mac80211: fix powersaving clients races
The code to handle powersaving stations has a race: when the powersave flag is lifted from a station, we could transmit a packet that is being processed for TX at the same time right away, even if there are other frames queued for it. This would cause frame reordering. To fix this, lift the flag only under the appropriate lock that blocks TX. Additionally, the code to allow drivers to block a station while frames for it are on the HW queue is never re-enabled the station, so traffic would get stuck indefinitely. Fix this by clearing the flag for this appropriately. Finally, as an optimisation, don't do anything if the driver unblocks an already unblocked station. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 902b03ee8f6..d2fcd22ab06 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1102,8 +1102,6 @@ static void ap_sta_ps_end(struct sta_info *sta)
atomic_dec(&sdata->bss->num_sta_ps);
- clear_sta_flags(sta, WLAN_STA_PS_STA);
-
#ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
printk(KERN_DEBUG "%s: STA %pM aid %d exits power save mode\n",
sdata->name, sta->sta.addr, sta->sta.aid);