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
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