mac80211: VHT CapIE in ProbeReq
PATCH 1/1 mac80211: VHT CapIE in ProbeReq
VHT Cap IE insertion in probe request
Signed-off-by Mahesh Palivela <[email protected]>
Cc Johannes Berg <[email protected]>
--- net/mac80211/ieee80211_i.h | 2 ++ net/mac80211/main.c | 8 +++++++- net/mac80211/util.c | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletions(-)
net/mac80211/ieee80211_i.h +2 -0
@@ -1481,6 +1481,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);/* channel management */ enum ieee80211_chan_mode {
net/mac80211/main.c +7 -1
@@ -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 */
@@ -733,6 +733,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;
@@ -750,6 +751,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) +
@@ -825,6 +827,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 ;
net/mac80211/util.c +25 -0
@@ -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,