diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 1 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 18 |
2 files changed, 17 insertions, 2 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 4c3d1f591bec..ea10a51babda 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -389,6 +389,7 @@ struct ieee80211_if_managed { | |||
389 | 389 | ||
390 | unsigned long timers_running; /* used for quiesce/restart */ | 390 | unsigned long timers_running; /* used for quiesce/restart */ |
391 | bool powersave; /* powersave requested for this iface */ | 391 | bool powersave; /* powersave requested for this iface */ |
392 | bool broken_ap; /* AP is broken -- turn off powersave */ | ||
392 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ | 393 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ |
393 | ap_smps, /* smps mode AP thinks we're in */ | 394 | ap_smps, /* smps mode AP thinks we're in */ |
394 | driver_smps_mode; /* smps mode request */ | 395 | driver_smps_mode; /* smps mode request */ |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index ba2da11a997b..17258feaab9b 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -637,6 +637,9 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) | |||
637 | if (!mgd->powersave) | 637 | if (!mgd->powersave) |
638 | return false; | 638 | return false; |
639 | 639 | ||
640 | if (mgd->broken_ap) | ||
641 | return false; | ||
642 | |||
640 | if (!mgd->associated) | 643 | if (!mgd->associated) |
641 | return false; | 644 | return false; |
642 | 645 | ||
@@ -1489,10 +1492,21 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk, | |||
1489 | capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); | 1492 | capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); |
1490 | 1493 | ||
1491 | if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14))) | 1494 | if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14))) |
1492 | printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not " | 1495 | printk(KERN_DEBUG |
1493 | "set\n", sdata->name, aid); | 1496 | "%s: invalid AID value 0x%x; bits 15:14 not set\n", |
1497 | sdata->name, aid); | ||
1494 | aid &= ~(BIT(15) | BIT(14)); | 1498 | aid &= ~(BIT(15) | BIT(14)); |
1495 | 1499 | ||
1500 | ifmgd->broken_ap = false; | ||
1501 | |||
1502 | if (aid == 0 || aid > IEEE80211_MAX_AID) { | ||
1503 | printk(KERN_DEBUG | ||
1504 | "%s: invalid AID value %d (out of range), turn off PS\n", | ||
1505 | sdata->name, aid); | ||
1506 | aid = 0; | ||
1507 | ifmgd->broken_ap = true; | ||
1508 | } | ||
1509 | |||
1496 | pos = mgmt->u.assoc_resp.variable; | 1510 | pos = mgmt->u.assoc_resp.variable; |
1497 | ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems); | 1511 | ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems); |
1498 | 1512 | ||