2011-11-04 14:49:36

by Janusz Dziedzic

[permalink] [raw]
Subject: mac80211: UAPSD - seems MORE_DATA bit is not set in all cases

Hello,

Seems we don't set MORE_DATA bit correctly in
ieee80211_sta_ps_deliver_response() fuction.
In case we have more than one frame in struct sk_buff_head frames we
don't set MORE_DATA bit.

Proposed fix:
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index ce962d2..8eaa746 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -1354,12 +1354,12 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
* Use MoreData flag to indicate whether there are
* more buffered frames for this STA
*/
- if (!more_data)
- hdr->frame_control &=
- cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
- else
+ if (more_data || !skb_queue_empty(&frames))
hdr->frame_control |=
cpu_to_le16(IEEE80211_FCTL_MOREDATA);
+ else
+ hdr->frame_control &=
+ cpu_to_le16(~IEEE80211_FCTL_MOREDATA);

if (ieee80211_is_data_qos(hdr->frame_control) ||
ieee80211_is_qos_nullfunc(hdr->frame_control))


BR
Janusz


2011-11-04 14:57:33

by Johannes Berg

[permalink] [raw]
Subject: Re: mac80211: UAPSD - seems MORE_DATA bit is not set in all cases

On Fri, 2011-11-04 at 15:49 +0100, Janusz Dziedzic wrote:
> Hello,
>
> Seems we don't set MORE_DATA bit correctly in
> ieee80211_sta_ps_deliver_response() fuction.
> In case we have more than one frame in struct sk_buff_head frames we
> don't set MORE_DATA bit.
>
> Proposed fix:
> diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
> index ce962d2..8eaa746 100644
> --- a/net/mac80211/sta_info.c
> +++ b/net/mac80211/sta_info.c
> @@ -1354,12 +1354,12 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
> * Use MoreData flag to indicate whether there are
> * more buffered frames for this STA
> */
> - if (!more_data)
> - hdr->frame_control &=
> - cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
> - else
> + if (more_data || !skb_queue_empty(&frames))
> hdr->frame_control |=
> cpu_to_le16(IEEE80211_FCTL_MOREDATA);
> + else
> + hdr->frame_control &=
> + cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
>
> if (ieee80211_is_data_qos(hdr->frame_control) ||
> ieee80211_is_qos_nullfunc(hdr->frame_control))
>

Yeah that seems reasonable. Please submit a proper patch :-)

johannes