Search Linux Wireless

RE: [PATCH] mac80211: always update the PM state of a peer on MGMT / DATA frames

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> The 2016 version of the spec is more generic about when the AP should
> update the power management state of the peer:
> the AP shall update the state based on any management or data frames. This
> means that even non-bufferable management frames should be looked at to
> update to maintain the power management state of the peer.
> 
> This can avoid problematic cases for example if a station disappears while
> being asleep and then re-appears. The AP would remember it as in power
> save, but the Authentication frame couldn't be used to set the peer as
> awake again.
> Note that this issues wasn't really critical since at some point (after the
> association) we would have removed the station and created another one
> with all the states cleared.
> 
> type=feature
> ticket=none
> 
> Change-Id: Iae1fbbd502d64f0c31db3e0f2d81224b29acb5af

Looks like I forgot to remove a few things here :)
And to put this as an RFC..

> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@xxxxxxxxx>
> ---
>  net/mac80211/rx.c | 17 +++++------------
>  1 file changed, 5 insertions(+), 12 deletions(-)
> 
> diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index
> fdf616811865..89db6b11af8a 100644
> --- a/net/mac80211/rx.c
> +++ b/net/mac80211/rx.c
> @@ -1749,23 +1749,16 @@ ieee80211_rx_h_sta_process(struct
> ieee80211_rx_data *rx)
> 
>  	/*
>  	 * Change STA power saving mode only at the end of a frame
> -	 * exchange sequence.
> +	 * exchange sequence, and only for a data or management
> +	 * frame as specified in ieee80211-2016 11.2.3.2
>  	 */
>  	if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) &&
>  	    !ieee80211_has_morefrags(hdr->frame_control) &&
> -	    !ieee80211_is_back_req(hdr->frame_control) &&
> +	    (ieee80211_is_mgmt(hdr->frame_control) ||
> +	     ieee80211_is_data(hdr->frame_control)) &&
>  	    !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
>  	    (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
> -	     rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
> -	    /*
> -	     * PM bit is only checked in frames where it isn't reserved,
> -	     * in AP mode it's reserved in non-bufferable management frames
> -	     * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field)
> -	     * BAR frames should be ignored as specified in
> -	     * IEEE 802.11-2012 10.2.1.2.
> -	     */
> -	    (!ieee80211_is_mgmt(hdr->frame_control) ||
> -	     ieee80211_is_bufferable_mmpdu(hdr->frame_control))) {
> +	     rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
>  		if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
>  			if (!ieee80211_has_pm(hdr->frame_control))
>  				sta_ps_end(sta);
> --
> 2.9.3




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux