From: Avri Altman <[email protected]>
There are a few APs our there that advertise U-APSD
capabilities but don't implement it right which leads to
poor traffic. These APs don't support MIMO or don't even
support HT. Use this heuristic to detect them and disable
U-APSD accordingly.
Signed-off-by: Avri Altman <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
net/mac80211/scan.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 7bb6a93..3791c8a 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -39,6 +39,28 @@ void ieee80211_rx_bss_put(struct ieee80211_local *local,
container_of((void *)bss, struct cfg80211_bss, priv));
}
+/*
+ * An incompatible AP workaround:
+ * if the AP does not advertise MIMO capabilities disable U-APSD.
+ * iPhones, among others, advertise themselves as U-APSD capable when
+ * they aren't. Avoid connecting to those devices in U-APSD enabled.
+ */
+static bool broken_uapsd_workarounds(struct ieee802_11_elems *elems)
+{
+ int i;
+
+ /* iPhone 4/4s with this problem doesn't have ht_capa */
+ if (!elems->ht_cap_elem)
+ return true;
+
+ for (i = 1; i < 4; i++) {
+ if (elems->ht_cap_elem->mcs.rx_mask[i])
+ return false;
+ }
+
+ return true;
+}
+
static bool is_uapsd_supported(struct ieee802_11_elems *elems)
{
u8 qos_info;
@@ -53,6 +75,9 @@ static bool is_uapsd_supported(struct ieee802_11_elems *elems)
/* no valid wmm information or parameter element found */
return false;
+ if (broken_uapsd_workarounds(elems))
+ return false;
+
return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
}
--
2.1.4
DQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpGcm9tOiBKdWxpYW4gQ2FsYWJ5IFttYWls
dG86anVsaWFuLmNhbGFieUBnbWFpbC5jb21dIA0KU2VudDogVGh1cnNkYXksIEp1bmUgMTEsIDIw
MTUgNjo1NSBBTQ0KVG86IEdydW1iYWNoLCBFbW1hbnVlbA0KQ2M6IEpvaGFubmVzIEJlcmc7IGxp
bnV4LXdpcmVsZXNzOyBBbHRtYW4sIEF2cmkNClN1YmplY3Q6IFJlOiBbUEFUQ0hdIG1hYzgwMjEx
OiBEaXNhYmxlIFUtQVBTRCBpZiBjb25uZWN0ZWQgdG8gYSBTSVNPIG9yIG5vbi1IVCBBUA0KDQpI
aSBFbW1hbnVlbCAvIEF2cmksDQoNCk9uIFdlZCwgSnVuIDEwLCAyMDE1IGF0IDExOjQ5IFBNLCBF
bW1hbnVlbCBHcnVtYmFjaA0KPGVtbWFudWVsLmdydW1iYWNoQGludGVsLmNvbT4gd3JvdGU6DQo+
IEZyb206IEF2cmkgQWx0bWFuIDxhdnJpLmFsdG1hbkBpbnRlbC5jb20+DQo+DQo+IFRoZXJlIGFy
ZSBhIGZldyBBUHMgb3VyIHRoZXJlIHRoYXQgYWR2ZXJ0aXNlIFUtQVBTRA0KPiBjYXBhYmlsaXRp
ZXMgYnV0IGRvbid0IGltcGxlbWVudCBpdCByaWdodCB3aGljaCBsZWFkcyB0bw0KPiBwb29yIHRy
YWZmaWMuIFRoZXNlIEFQcyBkb24ndCBzdXBwb3J0IE1JTU8gb3IgZG9uJ3QgZXZlbg0KPiBzdXBw
b3J0IEhULiBVc2UgdGhpcyBoZXVyaXN0aWMgdG8gZGV0ZWN0IHRoZW0gYW5kIGRpc2FibGUNCj4g
VS1BUFNEIGFjY29yZGluZ2x5Lg0KPg0KPiBTaWduZWQtb2ZmLWJ5OiBBdnJpIEFsdG1hbiA8YXZy
aS5hbHRtYW5AaW50ZWwuY29tPg0KPiBTaWduZWQtb2ZmLWJ5OiBFbW1hbnVlbCBHcnVtYmFjaCA8
ZW1tYW51ZWwuZ3J1bWJhY2hAaW50ZWwuY29tPg0KPiAtLS0NCj4gIG5ldC9tYWM4MDIxMS9zY2Fu
LmMgfCAyNSArKysrKysrKysrKysrKysrKysrKysrKysrDQo+ICAxIGZpbGUgY2hhbmdlZCwgMjUg
aW5zZXJ0aW9ucygrKQ0KPg0KPiBkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25l
dC9tYWM4MDIxMS9zY2FuLmMNCj4gaW5kZXggN2JiNmE5My4uMzc5MWM4YSAxMDA2NDQNCj4gLS0t
IGEvbmV0L21hYzgwMjExL3NjYW4uYw0KPiArKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jDQo+IEBA
IC0zOSw2ICszOSwyOCBAQCB2b2lkIGllZWU4MDIxMV9yeF9ic3NfcHV0KHN0cnVjdCBpZWVlODAy
MTFfbG9jYWwgKmxvY2FsLA0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29m
KCh2b2lkICopYnNzLCBzdHJ1Y3QgY2ZnODAyMTFfYnNzLCBwcml2KSk7DQo+ICB9DQo+DQo+ICsv
Kg0KPiArICogQW4gaW5jb21wYXRpYmxlIEFQIHdvcmthcm91bmQ6DQo+ICsgKiBpZiB0aGUgQVAg
ZG9lcyBub3QgYWR2ZXJ0aXNlIE1JTU8gY2FwYWJpbGl0aWVzIGRpc2FibGUgVS1BUFNELg0KPiAr
ICogaVBob25lcywgYW1vbmcgb3RoZXJzLCBhZHZlcnRpc2UgdGhlbXNlbHZlcyBhcyBVLUFQU0Qg
Y2FwYWJsZSB3aGVuDQo+ICsgKiB0aGV5IGFyZW4ndC4gQXZvaWQgY29ubmVjdGluZyB0byB0aG9z
ZSBkZXZpY2VzIGluIFUtQVBTRCBlbmFibGVkLg0KPiArICovDQo+ICtzdGF0aWMgYm9vbCBicm9r
ZW5fdWFwc2Rfd29ya2Fyb3VuZHMoc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKQ0KDQpX
b3VsZCBhIGJldHRlciBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uIGJlIHNvbWV0aGluZyBsaWtlDQpp
c191YXBzZF9icm9rZW4oKT8gV2UncmUgbm90IGFjdHVhbGx5IHdvcmtpbmcgYXJvdW5kIGFueXRo
aW5nIGhlcmUsDQpqdXN0IGNoZWNraW5nIHdoZXRoZXIgaXQncyBicm9rZW4gb3Igbm90Lg0KDQpb
QWx0bWFuLCBBdnJpXSBZZWFoIC0gd2VsbCwgb3JpZ2luYWxseSB0aGlzIHdhcyBub3QgdGhlIG5h
bWUsIGJ1dCBhIHByZXZpb3VzIHJldmlld2VyIGFza2VkIG1lIHRvIGNoYW5nZWQgaXQgdG8gIndv
cmthcm91bmQgc29tZXRoaW5nLi4uIi4NCkFjdHVhbGx5IGl0IGlzIGEgd29ya2Fyb3VuZCBvZiwg
YW1vbmcgb3RoZXJzLCB0aGUgaVBob25lIDQvNHMgd2hlbiBTb2Z0QVAsIHRoZXkgZG9uJ3QgcmFp
c2UgdGhlDQpUSU0gaW4gaXRzIEJlYWNvbiBldmVuIGlmIGl0IGhhcyBkYXRhIGZvciB1cywgdGhl
cmVmb3JlIHRyYWZmaWMgaXMgc3R1Y2suDQpXZSB3b3VsZCBwcmVmZXIgdG8gaWRlbnRpZnkgdGhv
c2UgZGV2aWNlcyB2aWEgdGhlaXIgT1VJLCBidXQgY3VycmVudGx5IHRoaXMgaXMgbm90IHdlbGwg
ZGVmaW5lZC4NCg0KDQoNClRoYW5rcywNCg0KLS0gDQpKdWxpYW4gQ2FsYWJ5DQoNCkVtYWlsOiBq
dWxpYW4uY2FsYWJ5QGdtYWlsLmNvbQ0KUHJvZmlsZTogaHR0cDovL3d3dy5nb29nbGUuY29tL3By
b2ZpbGVzL2p1bGlhbi5jYWxhYnkvDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQSBtZW1iZXIgb2YgdGhlIEludGVs
IENvcnBvcmF0aW9uIGdyb3VwIG9mIGNvbXBhbmllcwoKVGhpcyBlLW1haWwgYW5kIGFueSBhdHRh
Y2htZW50cyBtYXkgY29udGFpbiBjb25maWRlbnRpYWwgbWF0ZXJpYWwgZm9yCnRoZSBzb2xlIHVz
ZSBvZiB0aGUgaW50ZW5kZWQgcmVjaXBpZW50KHMpLiBBbnkgcmV2aWV3IG9yIGRpc3RyaWJ1dGlv
bgpieSBvdGhlcnMgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gSWYgeW91IGFyZSBub3QgdGhlIGlu
dGVuZGVkCnJlY2lwaWVudCwgcGxlYXNlIGNvbnRhY3QgdGhlIHNlbmRlciBhbmQgZGVsZXRlIGFs
bCBjb3BpZXMuCg==
Hi Avri,
On Thu, Jun 11, 2015 at 3:29 PM, Altman, Avri <[email protected]> wrote:
>
>
> -----Original Message-----
> From: Julian Calaby [mailto:[email protected]]
> Sent: Thursday, June 11, 2015 6:55 AM
> To: Grumbach, Emmanuel
> Cc: Johannes Berg; linux-wireless; Altman, Avri
> Subject: Re: [PATCH] mac80211: Disable U-APSD if connected to a SISO or non-HT AP
>
> Hi Emmanuel / Avri,
>
> On Wed, Jun 10, 2015 at 11:49 PM, Emmanuel Grumbach
> <[email protected]> wrote:
>> From: Avri Altman <[email protected]>
>>
>> There are a few APs our there that advertise U-APSD
>> capabilities but don't implement it right which leads to
>> poor traffic. These APs don't support MIMO or don't even
>> support HT. Use this heuristic to detect them and disable
>> U-APSD accordingly.
>>
>> Signed-off-by: Avri Altman <[email protected]>
>> Signed-off-by: Emmanuel Grumbach <[email protected]>
>> ---
>> net/mac80211/scan.c | 25 +++++++++++++++++++++++++
>> 1 file changed, 25 insertions(+)
>>
>> diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
>> index 7bb6a93..3791c8a 100644
>> --- a/net/mac80211/scan.c
>> +++ b/net/mac80211/scan.c
>> @@ -39,6 +39,28 @@ void ieee80211_rx_bss_put(struct ieee80211_local *local,
>> container_of((void *)bss, struct cfg80211_bss, priv));
>> }
>>
>> +/*
>> + * An incompatible AP workaround:
>> + * if the AP does not advertise MIMO capabilities disable U-APSD.
>> + * iPhones, among others, advertise themselves as U-APSD capable when
>> + * they aren't. Avoid connecting to those devices in U-APSD enabled.
>> + */
>> +static bool broken_uapsd_workarounds(struct ieee802_11_elems *elems)
>
> Would a better name for this function be something like
> is_uapsd_broken()? We're not actually working around anything here,
> just checking whether it's broken or not.
>
> [Altman, Avri] Yeah - well, originally this was not the name, but a previous reviewer asked me to changed it to "workaround something...".
> Actually it is a workaround of, among others, the iPhone 4/4s when SoftAP, they don't raise the
> TIM in its Beacon even if it has data for us, therefore traffic is stuck.
> We would prefer to identify those devices via their OUI, but currently this is not well defined.
Fair enough then.
As I see it, this isn't a workaround, it's just another test to ensure
that uapsd can be supported.
Thanks,
--
Julian Calaby
Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/
Hi Emmanuel / Avri,
On Wed, Jun 10, 2015 at 11:49 PM, Emmanuel Grumbach
<[email protected]> wrote:
> From: Avri Altman <[email protected]>
>
> There are a few APs our there that advertise U-APSD
> capabilities but don't implement it right which leads to
> poor traffic. These APs don't support MIMO or don't even
> support HT. Use this heuristic to detect them and disable
> U-APSD accordingly.
>
> Signed-off-by: Avri Altman <[email protected]>
> Signed-off-by: Emmanuel Grumbach <[email protected]>
> ---
> net/mac80211/scan.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
> index 7bb6a93..3791c8a 100644
> --- a/net/mac80211/scan.c
> +++ b/net/mac80211/scan.c
> @@ -39,6 +39,28 @@ void ieee80211_rx_bss_put(struct ieee80211_local *local,
> container_of((void *)bss, struct cfg80211_bss, priv));
> }
>
> +/*
> + * An incompatible AP workaround:
> + * if the AP does not advertise MIMO capabilities disable U-APSD.
> + * iPhones, among others, advertise themselves as U-APSD capable when
> + * they aren't. Avoid connecting to those devices in U-APSD enabled.
> + */
> +static bool broken_uapsd_workarounds(struct ieee802_11_elems *elems)
Would a better name for this function be something like
is_uapsd_broken()? We're not actually working around anything here,
just checking whether it's broken or not.
Thanks,
--
Julian Calaby
Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/