2011-11-03 07:36:05

by Janusz Dziedzic

[permalink] [raw]
Subject: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

Hello,

I have a question connected with UAPSD implementation.
Seems, mac80211 always clear EOSP bit in ieee80211_set_qos_hdr() fuction.
Is that a problem in mac80211 or this should be handled in different place/way?

BR
Janusz


2011-11-03 08:15:44

by Johannes Berg

[permalink] [raw]
Subject: Re: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

On Thu, 2011-11-03 at 09:08 +0100, Johannes Berg wrote:

> > Yes, I see this is set correctly before we call ieee80211_set_qos_hdr().
> > Next ieee80211_set_qos_hdr() fuction seems not care about EOSP bit and
> > we have this bit cleared before ieee80211_tx() call.
>
> Oh, WTH. Somebody had posted a patch that fixed that, I thought that
> went in but in my testing this didn't show up since my device always
> sets/clears it according to what I told it.

Try this please.

johannes

--- wireless-testing.orig/net/mac80211/wme.c 2011-11-02 11:05:29.000000000 +0100
+++ wireless-testing/net/mac80211/wme.c 2011-11-03 09:14:30.000000000 +0100
@@ -143,10 +143,13 @@ void ieee80211_set_qos_hdr(struct ieee80
/* Fill in the QoS header if there is one. */
if (ieee80211_is_data_qos(hdr->frame_control)) {
u8 *p = ieee80211_get_qos_ctl(hdr);
- u8 ack_policy = 0, tid;
+ u8 ack_policy, tid;

tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;

+ /* preserve EOSP bit */
+ ack_policy = *p & IEEE80211_QOS_CTL_EOSP;
+
if (unlikely(sdata->local->wifi_wme_noack_test))
ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
/* qos header is 2 bytes */



2011-11-03 08:05:35

by Janusz Dziedzic

[permalink] [raw]
Subject: Re: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

2011/11/3 Johannes Berg <[email protected]>:
> On Thu, 2011-11-03 at 08:36 +0100, Janusz Dziedzic wrote:
>> Hello,
>>
>> I have a question connected with UAPSD implementation.
>> Seems, mac80211 always clear EOSP bit in ieee80211_set_qos_hdr() fuction.
>> Is that a problem in mac80211 or this should be handled in different place/way?
>
> It should be set:
>
> ? ? ? ?if (qos) {
> ? ? ? ? ? ? ? ?nullfunc->qos_ctrl = cpu_to_le16(tid);
>
> ? ? ? ? ? ? ? ?if (reason == IEEE80211_FRAME_RELEASE_UAPSD)
> ? ? ? ? ? ? ? ? ? ? ? ?nullfunc->qos_ctrl |=
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cpu_to_le16(IEEE80211_QOS_CTL_EOSP);
> ? ? ? ?}
>

Yes, I see this is set correctly before we call ieee80211_set_qos_hdr().
Next ieee80211_set_qos_hdr() fuction seems not care about EOSP bit and
we have this bit cleared before ieee80211_tx() call.


BR
Janusz

2011-11-03 08:08:06

by Johannes Berg

[permalink] [raw]
Subject: Re: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

On Thu, 2011-11-03 at 09:05 +0100, Janusz Dziedzic wrote:
> 2011/11/3 Johannes Berg <[email protected]>:
> > On Thu, 2011-11-03 at 08:36 +0100, Janusz Dziedzic wrote:
> >> Hello,
> >>
> >> I have a question connected with UAPSD implementation.
> >> Seems, mac80211 always clear EOSP bit in ieee80211_set_qos_hdr() fuction.
> >> Is that a problem in mac80211 or this should be handled in different place/way?
> >
> > It should be set:
> >
> > if (qos) {
> > nullfunc->qos_ctrl = cpu_to_le16(tid);
> >
> > if (reason == IEEE80211_FRAME_RELEASE_UAPSD)
> > nullfunc->qos_ctrl |=
> > cpu_to_le16(IEEE80211_QOS_CTL_EOSP);
> > }
> >
>
> Yes, I see this is set correctly before we call ieee80211_set_qos_hdr().
> Next ieee80211_set_qos_hdr() fuction seems not care about EOSP bit and
> we have this bit cleared before ieee80211_tx() call.

Oh, WTH. Somebody had posted a patch that fixed that, I thought that
went in but in my testing this didn't show up since my device always
sets/clears it according to what I told it.

johannes


2011-11-03 08:49:40

by Janusz Dziedzic

[permalink] [raw]
Subject: Re: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

2011/11/3 Johannes Berg <[email protected]>:
> On Thu, 2011-11-03 at 09:08 +0100, Johannes Berg wrote:
>
>> > Yes, I see this is set correctly before we call ieee80211_set_qos_hdr().
>> > Next ieee80211_set_qos_hdr() fuction seems not care about EOSP bit and
>> > we have this bit cleared before ieee80211_tx() call.
>>
>> Oh, WTH. Somebody had posted a patch that fixed that, I thought that
>> went in but in my testing this didn't show up since my device always
>> sets/clears it according to what I told it.
>
> Try this please.
>
> johannes
>
> --- wireless-testing.orig/net/mac80211/wme.c ? ?2011-11-02 11:05:29.000000000 +0100
> +++ wireless-testing/net/mac80211/wme.c 2011-11-03 09:14:30.000000000 +0100
> @@ -143,10 +143,13 @@ void ieee80211_set_qos_hdr(struct ieee80
> ? ? ? ?/* Fill in the QoS header if there is one. */
> ? ? ? ?if (ieee80211_is_data_qos(hdr->frame_control)) {
> ? ? ? ? ? ? ? ?u8 *p = ieee80211_get_qos_ctl(hdr);
> - ? ? ? ? ? ? ? u8 ack_policy = 0, tid;
> + ? ? ? ? ? ? ? u8 ack_policy, tid;
>
> ? ? ? ? ? ? ? ?tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
>
> + ? ? ? ? ? ? ? /* preserve EOSP bit */
> + ? ? ? ? ? ? ? ack_policy = *p & IEEE80211_QOS_CTL_EOSP;
> +
> ? ? ? ? ? ? ? ?if (unlikely(sdata->local->wifi_wme_noack_test))
> ? ? ? ? ? ? ? ? ? ? ? ?ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
> ? ? ? ? ? ? ? ?/* qos header is 2 bytes */
>
>
>

Verified. Now works correctly.
Thanks.

BR
Janusz

2011-11-03 07:47:24

by Johannes Berg

[permalink] [raw]
Subject: Re: mac80211: UAPSD - EOSP bit seems to be not set when send qos null frame

On Thu, 2011-11-03 at 08:36 +0100, Janusz Dziedzic wrote:
> Hello,
>
> I have a question connected with UAPSD implementation.
> Seems, mac80211 always clear EOSP bit in ieee80211_set_qos_hdr() fuction.
> Is that a problem in mac80211 or this should be handled in different place/way?

It should be set:

if (qos) {
nullfunc->qos_ctrl = cpu_to_le16(tid);

if (reason == IEEE80211_FRAME_RELEASE_UAPSD)
nullfunc->qos_ctrl |=
cpu_to_le16(IEEE80211_QOS_CTL_EOSP);
}

johannes