aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-09-29 10:04:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-09-30 15:57:18 -0400
commitdeeaee197b0fa694ba6c8f02cdb57b3be7115b4f (patch)
tree9cdd2ce5786ceb60c68327da441913b56de9726c /net/mac80211/rx.c
parentce662b44ce22e3e8886104d5feb2a451d7ba560f (diff)
mac80211: reply only once to each PS-poll
If a PS-poll frame is retried (but was received) there is no way to detect that since it has no sequence number. As a consequence, the standard asks us to not react to PS-poll frames until the response to one made it out (was ACKed or lost). Implement this by using the WLAN_STA_SP flags to also indicate a PS-Poll "service period" and the IEEE80211_TX_STATUS_EOSP flag for the response packet to indicate the end of the "SP" as usual. We could use separate flags, but that will most likely completely confuse drivers, and while the standard doesn't exclude simultaneously polling using uAPSD and PS-Poll, doing that seems quite problematic. 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.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 9a703f00b5fb..32c8ee43f720 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1194,10 +1194,12 @@ ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
1194 return RX_CONTINUE; 1194 return RX_CONTINUE;
1195 1195
1196 if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) { 1196 if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) {
1197 if (!test_sta_flags(rx->sta, WLAN_STA_PS_DRIVER)) 1197 if (!test_sta_flags(rx->sta, WLAN_STA_SP)) {
1198 ieee80211_sta_ps_deliver_poll_response(rx->sta); 1198 if (!test_sta_flags(rx->sta, WLAN_STA_PS_DRIVER))
1199 else 1199 ieee80211_sta_ps_deliver_poll_response(rx->sta);
1200 set_sta_flags(rx->sta, WLAN_STA_PSPOLL); 1200 else
1201 set_sta_flags(rx->sta, WLAN_STA_PSPOLL);
1202 }
1201 1203
1202 /* Free PS Poll skb here instead of returning RX_DROP that would 1204 /* Free PS Poll skb here instead of returning RX_DROP that would
1203 * count as an dropped frame. */ 1205 * count as an dropped frame. */