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/rx.c | |
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/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 825f33cf7bbc..9b13b8b24245 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) |