--- include/net/ieee80211_radiotap.h | 24 ++++++++++++++++++++++++ net/mac80211/rx.c | 17 +++++++++++++++++ 2 files changed, 41 insertions(+) --- wireless-testing.orig/net/mac80211/rx.c 2010-09-15 16:54:55.000000000 +0200 +++ wireless-testing/net/mac80211/rx.c 2010-09-16 01:31:12.000000000 +0200 @@ -85,6 +85,9 @@ ieee80211_rx_radiotap_len(struct ieee802 if (len & 1) /* padding for RX_FLAGS if necessary */ len++; + if (status->flag & RX_FLAG_HT) /* HT info */ + len += 3; + return len; } @@ -193,6 +196,20 @@ ieee80211_add_rx_radiotap_header(struct rx_flags |= IEEE80211_RADIOTAP_F_RX_BADPLCP; put_unaligned_le16(rx_flags, pos); pos += 2; + + if (status->flag & RX_FLAG_HT) { + rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_HT); + *pos++ = IEEE80211_RADIOTAP_HT_HAVE_MCS | + IEEE80211_RADIOTAP_HT_HAVE_GI | + IEEE80211_RADIOTAP_HT_HAVE_BW; + *pos = 0; + if (status->flag & RX_FLAG_SHORT_GI) + *pos |= IEEE80211_RADIOTAP_HT_SGI; + if (status->flag & RX_FLAG_40MHZ) + *pos |= IEEE80211_RADIOTAP_HT_BW_40; + pos++; + *pos++ = status->rate_idx; + } } /* --- wireless-testing.orig/include/net/ieee80211_radiotap.h 2010-09-14 07:22:01.000000000 +0200 +++ wireless-testing/include/net/ieee80211_radiotap.h 2010-09-16 01:30:42.000000000 +0200 @@ -199,6 +199,8 @@ enum ieee80211_radiotap_type { IEEE80211_RADIOTAP_RTS_RETRIES = 16, IEEE80211_RADIOTAP_DATA_RETRIES = 17, + IEEE80211_RADIOTAP_HT = 19, + /* valid in every it_present bitmap, even vendor namespaces */ IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, @@ -245,6 +247,28 @@ enum ieee80211_radiotap_type { #define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ #define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ + +/* For IEEE80211_RADIOTAP_HT */ +#define IEEE80211_RADIOTAP_HT_HAVE_BW 0x01 +#define IEEE80211_RADIOTAP_HT_HAVE_MCS 0x02 +#define IEEE80211_RADIOTAP_HT_HAVE_GI 0x04 +#define IEEE80211_RADIOTAP_HT_HAVE_FMT 0x08 +#define IEEE80211_RADIOTAP_HT_HAVE_FEC 0x10 +#define IEEE80211_RADIOTAP_HT_HAVE_AMPDU_STAT 0x20 +#define IEEE80211_RADIOTAP_HT_HAVE_AMPDU_POS 0x40 + +#define IEEE80211_RADIOTAP_HT_BW_MASK 0x03 +#define IEEE80211_RADIOTAP_HT_BW_20 0 +#define IEEE80211_RADIOTAP_HT_BW_40 1 +#define IEEE80211_RADIOTAP_HT_BW_20L 2 +#define IEEE80211_RADIOTAP_HT_BW_20U 3 +#define IEEE80211_RADIOTAP_HT_SGI 0x04 +#define IEEE80211_RADIOTAP_HT_FMT_GF 0x08 +#define IEEE80211_RADIOTAP_HT_FEC_LDPC 0x10 +#define IEEE80211_RADIOTAP_HT_AMPDU_PART 0x20 +#define IEEE80211_RADIOTAP_HT_AMPDU_END 0x40 + + /* Ugly macro to convert literal channel numbers into their mhz equivalents * There are certianly some conditions that will break this (like feeding it '30') * but they shouldn't arise since nothing talks on channel 30. */