diff options
-rw-r--r-- | net/mac80211/rx.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 70e9d2ca8bbe..b3cff69bfd66 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1607,23 +1607,16 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
1607 | 1607 | ||
1608 | /* | 1608 | /* |
1609 | * Change STA power saving mode only at the end of a frame | 1609 | * Change STA power saving mode only at the end of a frame |
1610 | * exchange sequence. | 1610 | * exchange sequence, and only for a data or management |
1611 | * frame as specified in IEEE 802.11-2016 11.2.3.2 | ||
1611 | */ | 1612 | */ |
1612 | if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && | 1613 | if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && |
1613 | !ieee80211_has_morefrags(hdr->frame_control) && | 1614 | !ieee80211_has_morefrags(hdr->frame_control) && |
1614 | !ieee80211_is_back_req(hdr->frame_control) && | 1615 | (ieee80211_is_mgmt(hdr->frame_control) || |
1616 | ieee80211_is_data(hdr->frame_control)) && | ||
1615 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && | 1617 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && |
1616 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || | 1618 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || |
1617 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && | 1619 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { |
1618 | /* | ||
1619 | * PM bit is only checked in frames where it isn't reserved, | ||
1620 | * in AP mode it's reserved in non-bufferable management frames | ||
1621 | * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) | ||
1622 | * BAR frames should be ignored as specified in | ||
1623 | * IEEE 802.11-2012 10.2.1.2. | ||
1624 | */ | ||
1625 | (!ieee80211_is_mgmt(hdr->frame_control) || | ||
1626 | ieee80211_is_bufferable_mmpdu(hdr->frame_control))) { | ||
1627 | if (test_sta_flag(sta, WLAN_STA_PS_STA)) { | 1620 | if (test_sta_flag(sta, WLAN_STA_PS_STA)) { |
1628 | if (!ieee80211_has_pm(hdr->frame_control)) | 1621 | if (!ieee80211_has_pm(hdr->frame_control)) |
1629 | sta_ps_end(sta); | 1622 | sta_ps_end(sta); |