aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEyal Shapira <eyal@wizery.com>2014-01-08 08:49:08 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-02-04 15:48:20 -0500
commitc1cf6d4e6f17406c4fd7b0f4fae779fa61666cc3 (patch)
treead4a6e001e3115b8b46bb19e99263d5afe546833
parentc4d2ffac330fd013944654f11cdfc06ff5ca9bf4 (diff)
mac80211: advertise BF STS according to AP support
Restrict our published beamformee STS capability according to the AP value. Some AP show bad behaviour in interoperability testing when our capabilities are better. Signed-off-by: Eyal Shapira <eyalx.shapira@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/mac80211/mlme.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index fc1d82465b3c..cadf05905e5a 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -508,6 +508,7 @@ static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
508 u8 *pos; 508 u8 *pos;
509 u32 cap; 509 u32 cap;
510 struct ieee80211_sta_vht_cap vht_cap; 510 struct ieee80211_sta_vht_cap vht_cap;
511 u32 mask, ap_bf_sts, our_bf_sts;
511 512
512 BUILD_BUG_ON(sizeof(vht_cap) != sizeof(sband->vht_cap)); 513 BUILD_BUG_ON(sizeof(vht_cap) != sizeof(sband->vht_cap));
513 514
@@ -535,6 +536,16 @@ static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
535 cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE))) 536 cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)))
536 cap &= ~IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE; 537 cap &= ~IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
537 538
539 mask = IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
540
541 ap_bf_sts = le32_to_cpu(ap_vht_cap->vht_cap_info) & mask;
542 our_bf_sts = cap & mask;
543
544 if (ap_bf_sts < our_bf_sts) {
545 cap &= ~mask;
546 cap |= ap_bf_sts;
547 }
548
538 /* reserve and fill IE */ 549 /* reserve and fill IE */
539 pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2); 550 pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2);
540 ieee80211_ie_build_vht_cap(pos, &vht_cap, cap); 551 ieee80211_ie_build_vht_cap(pos, &vht_cap, cap);