mac80211: include VHT capability IE in probe requests
authorMahesh Palivela <maheshp@posedge.com>
Mon, 2 Jul 2012 11:25:12 +0000 (11:25 +0000)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 2 Jul 2012 13:13:09 +0000 (15:13 +0200)
Insert the VHT capability IE into probe requests.

Signed-off-by: Mahesh Palivela <maheshp@posedge.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/main.c
net/mac80211/util.c

index b88bdfd..e0423f8 100644 (file)
@@ -1480,6 +1480,8 @@ u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
                               struct ieee80211_channel *channel,
                               enum nl80211_channel_type channel_type,
                               u16 prot_mode);
+u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
+                              u32 cap);
 int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
                            struct sk_buff *skb, bool need_basic);
 int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
index aded001..ab32c59 100644 (file)
@@ -688,7 +688,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        int result, i;
        enum ieee80211_band band;
        int channels, max_bitrates;
-       bool supp_ht;
+       bool supp_ht, supp_vht;
        netdev_features_t feature_whitelist;
        static const u32 cipher_suites[] = {
                /* keep WEP first, it may be removed below */
@@ -732,6 +732,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        channels = 0;
        max_bitrates = 0;
        supp_ht = false;
+       supp_vht = false;
        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
                struct ieee80211_supported_band *sband;
 
@@ -749,6 +750,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
                if (max_bitrates < sband->n_bitrates)
                        max_bitrates = sband->n_bitrates;
                supp_ht = supp_ht || sband->ht_cap.ht_supported;
+               supp_vht = supp_vht || sband->vht_cap.vht_supported;
        }
 
        local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
@@ -824,6 +826,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        if (supp_ht)
                local->scan_ies_len += 2 + sizeof(struct ieee80211_ht_cap);
 
+       if (supp_vht)
+               local->scan_ies_len +=
+                       2 + sizeof(struct ieee80211_vht_capabilities);
+
        if (!local->ops->hw_scan) {
                /* For hw_scan, driver needs to set these up. */
                local->hw.wiphy->max_scan_ssids = 4;
index c424569..cb73a03 100644 (file)
@@ -1072,6 +1072,10 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
                pos += noffset - offset;
        }
 
+       if (sband->vht_cap.vht_supported)
+               pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
+                                                sband->vht_cap.cap);
+
        return pos - buffer;
 }
 
@@ -1699,6 +1703,27 @@ u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
        return pos;
 }
 
+u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
+                                                          u32 cap)
+{
+       __le32 tmp;
+
+       *pos++ = WLAN_EID_VHT_CAPABILITY;
+       *pos++ = sizeof(struct ieee80211_vht_capabilities);
+       memset(pos, 0, sizeof(struct ieee80211_vht_capabilities));
+
+       /* capability flags */
+       tmp = cpu_to_le32(cap);
+       memcpy(pos, &tmp, sizeof(u32));
+       pos += sizeof(u32);
+
+       /* VHT MCS set */
+       memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs));
+       pos += sizeof(vht_cap->vht_mcs);
+
+       return pos;
+}
+
 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
                               struct ieee80211_channel *channel,
                               enum nl80211_channel_type channel_type,