aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-03-31 12:12:07 +0200
committerJohn W. Linville <linville@tuxdriver.com>2009-04-22 16:54:39 -0400
commit5ef2d41afb7fce2315d12a8aaebe0c9f1b50755b (patch)
tree00fb4ac6a019b42c5be143793a3b34253f43eea9
parentde95a54b1aebe5592cae971ca5e5d9ec6a381a17 (diff)
mac80211: include HT capabilities in probe request
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>
-rw-r--r--net/mac80211/main.c5
-rw-r--r--net/mac80211/util.c16
2 files changed, 21 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index b3bbe78821d..679b3a14f11 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -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. */
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 72b091317a7..1ff83532120 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -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.