diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-11-22 17:00:18 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-11-27 05:56:18 -0500 |
commit | 5164892184d1b9ce19e45e97e9ca405ea8b9ceb2 (patch) | |
tree | 011ba3d92ccf3b10f34ffff9c0ea09d339521a49 /net/mac80211 | |
parent | f2d9d270c15ae0139b54a7e7466d738327e97e03 (diff) |
mac80211: support (partial) VHT radiotap information
Add some information that we have about VHT to radiotap.
This at least lets one see the MCS and NSS information.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/main.c | 2 | ||||
-rw-r--r-- | net/mac80211/rx.c | 40 |
2 files changed, 42 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 6e933409979..c4ed83b74e5 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -638,6 +638,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
638 | local->hw.radiotap_mcs_details = IEEE80211_RADIOTAP_MCS_HAVE_MCS | | 638 | local->hw.radiotap_mcs_details = IEEE80211_RADIOTAP_MCS_HAVE_MCS | |
639 | IEEE80211_RADIOTAP_MCS_HAVE_GI | | 639 | IEEE80211_RADIOTAP_MCS_HAVE_GI | |
640 | IEEE80211_RADIOTAP_MCS_HAVE_BW; | 640 | IEEE80211_RADIOTAP_MCS_HAVE_BW; |
641 | local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | | ||
642 | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; | ||
641 | local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; | 643 | local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; |
642 | wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask; | 644 | wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask; |
643 | 645 | ||
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 825f33cf7bb..9b13b8b2424 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -111,6 +111,11 @@ ieee80211_rx_radiotap_space(struct ieee80211_local *local, | |||
111 | len += 8; | 111 | len += 8; |
112 | } | 112 | } |
113 | 113 | ||
114 | if (status->flag & RX_FLAG_VHT) { | ||
115 | len = ALIGN(len, 2); | ||
116 | len += 12; | ||
117 | } | ||
118 | |||
114 | if (status->vendor_radiotap_len) { | 119 | if (status->vendor_radiotap_len) { |
115 | if (WARN_ON_ONCE(status->vendor_radiotap_align == 0)) | 120 | if (WARN_ON_ONCE(status->vendor_radiotap_align == 0)) |
116 | status->vendor_radiotap_align = 1; | 121 | status->vendor_radiotap_align = 1; |
@@ -297,6 +302,41 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
297 | *pos++ = 0; | 302 | *pos++ = 0; |
298 | } | 303 | } |
299 | 304 | ||
305 | if (status->flag & RX_FLAG_VHT) { | ||
306 | u16 known = local->hw.radiotap_vht_details; | ||
307 | |||
308 | rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_VHT); | ||
309 | /* known field - how to handle 80+80? */ | ||
310 | if (status->flag & RX_FLAG_80P80MHZ) | ||
311 | known &= ~IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; | ||
312 | put_unaligned_le16(known, pos); | ||
313 | pos += 2; | ||
314 | /* flags */ | ||
315 | if (status->flag & RX_FLAG_SHORT_GI) | ||
316 | *pos |= IEEE80211_RADIOTAP_VHT_FLAG_SGI; | ||
317 | pos++; | ||
318 | /* bandwidth */ | ||
319 | if (status->flag & RX_FLAG_80MHZ) | ||
320 | *pos++ = 4; | ||
321 | else if (status->flag & RX_FLAG_80P80MHZ) | ||
322 | *pos++ = 0; /* marked not known above */ | ||
323 | else if (status->flag & RX_FLAG_160MHZ) | ||
324 | *pos++ = 11; | ||
325 | else if (status->flag & RX_FLAG_40MHZ) | ||
326 | *pos++ = 1; | ||
327 | else /* 20 MHz */ | ||
328 | *pos++ = 0; | ||
329 | /* MCS/NSS */ | ||
330 | *pos = (status->rate_idx << 4) | status->vht_nss; | ||
331 | pos += 4; | ||
332 | /* coding field */ | ||
333 | pos++; | ||
334 | /* group ID */ | ||
335 | pos++; | ||
336 | /* partial_aid */ | ||
337 | pos += 2; | ||
338 | } | ||
339 | |||
300 | if (status->vendor_radiotap_len) { | 340 | if (status->vendor_radiotap_len) { |
301 | /* ensure 2 byte alignment for the vendor field as required */ | 341 | /* ensure 2 byte alignment for the vendor field as required */ |
302 | if ((pos - (u8 *)rthdr) & 1) | 342 | if ((pos - (u8 *)rthdr) & 1) |