mac80211: include HT capabilities in probe request
authorJohannes Berg <johannes@sipsolutions.net>
Tue, 31 Mar 2009 10:12:07 +0000 (12:12 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Apr 2009 20:54:39 +0000 (16:54 -0400)
Include the HT capabilities in the probe request frame.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/main.c
net/mac80211/util.c

index b3bbe78..679b3a1 100644 (file)
@@ -822,6 +822,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        struct net_device *mdev;
        struct ieee80211_master_priv *mpriv;
        int channels, i, j, max_bitrates;
+       bool supp_ht;
 
        /*
         * generic code guarantees at least one band,
@@ -830,6 +831,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
         */
        channels = 0;
        max_bitrates = 0;
+       supp_ht = false;
        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
                struct ieee80211_supported_band *sband;
 
@@ -846,6 +848,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;
        }
 
        local->int_scan_req.n_channels = channels;
@@ -872,6 +875,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
         * information -- SSID is the driver's responsibility.
         */
        local->scan_ies_len = 4 + max_bitrates; /* (ext) supp rates */
+       if (supp_ht)
+               local->scan_ies_len += 2 + sizeof(struct ieee80211_ht_cap);
 
        if (!local->ops->hw_scan) {
                /* For hw_scan, driver needs to set these up. */
index 72b0913..1ff8353 100644 (file)
@@ -861,6 +861,22 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
                *pos++ = rate->bitrate / 5;
        }
 
+       if (sband->ht_cap.ht_supported) {
+               __le16 tmp = cpu_to_le16(sband->ht_cap.cap);
+
+               *pos++ = WLAN_EID_HT_CAPABILITY;
+               *pos++ = sizeof(struct ieee80211_ht_cap);
+               memset(pos, 0, sizeof(struct ieee80211_ht_cap));
+               memcpy(pos, &tmp, sizeof(u16));
+               pos += sizeof(u16);
+               /* TODO: needs a define here for << 2 */
+               *pos++ = sband->ht_cap.ampdu_factor |
+                        (sband->ht_cap.ampdu_density << 2);
+               memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
+               pos += sizeof(sband->ht_cap.mcs);
+               pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
+       }
+
        /*
         * If adding more here, adjust code in main.c
         * that calculates local->scan_ies_len.