mac80211: advertise BF STS according to AP support
authorEyal Shapira <eyal@wizery.com>
Wed, 8 Jan 2014 13:49:08 +0000 (15:49 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 4 Feb 2014 20:48:20 +0000 (21:48 +0100)
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>
net/mac80211/mlme.c

index fc1d82465b3ce1b1cdcc9edb4f5157618b70e8ce..cadf05905e5aec83bbc8fc20855320f39f457c9e 100644 (file)
@@ -508,6 +508,7 @@ static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
        u8 *pos;
        u32 cap;
        struct ieee80211_sta_vht_cap vht_cap;
+       u32 mask, ap_bf_sts, our_bf_sts;
 
        BUILD_BUG_ON(sizeof(vht_cap) != sizeof(sband->vht_cap));
 
@@ -535,6 +536,16 @@ static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
                        cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)))
                cap &= ~IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
 
+       mask = IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
+
+       ap_bf_sts = le32_to_cpu(ap_vht_cap->vht_cap_info) & mask;
+       our_bf_sts = cap & mask;
+
+       if (ap_bf_sts < our_bf_sts) {
+               cap &= ~mask;
+               cap |= ap_bf_sts;
+       }
+
        /* reserve and fill IE */
        pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2);
        ieee80211_ie_build_vht_cap(pos, &vht_cap, cap);