diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 3b7a750ebc70..79a89fe9d616 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1311,18 +1311,15 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
1311 | !ieee80211_has_morefrags(hdr->frame_control) && | 1311 | !ieee80211_has_morefrags(hdr->frame_control) && |
1312 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && | 1312 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && |
1313 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || | 1313 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || |
1314 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { | 1314 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && |
1315 | /* PM bit is only checked in frames where it isn't reserved, | ||
1316 | * in AP mode it's reserved in non-bufferable management frames | ||
1317 | * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) | ||
1318 | */ | ||
1319 | (!ieee80211_is_mgmt(hdr->frame_control) || | ||
1320 | ieee80211_is_bufferable_mmpdu(hdr->frame_control))) { | ||
1315 | if (test_sta_flag(sta, WLAN_STA_PS_STA)) { | 1321 | if (test_sta_flag(sta, WLAN_STA_PS_STA)) { |
1316 | /* | 1322 | if (!ieee80211_has_pm(hdr->frame_control)) |
1317 | * Ignore doze->wake transitions that are | ||
1318 | * indicated by non-data frames, the standard | ||
1319 | * is unclear here, but for example going to | ||
1320 | * PS mode and then scanning would cause a | ||
1321 | * doze->wake transition for the probe request, | ||
1322 | * and that is clearly undesirable. | ||
1323 | */ | ||
1324 | if (ieee80211_is_data(hdr->frame_control) && | ||
1325 | !ieee80211_has_pm(hdr->frame_control)) | ||
1326 | sta_ps_end(sta); | 1323 | sta_ps_end(sta); |
1327 | } else { | 1324 | } else { |
1328 | if (ieee80211_has_pm(hdr->frame_control)) | 1325 | if (ieee80211_has_pm(hdr->frame_control)) |