mac80211: add MCS information to radiotap
This adds the MCS information we currently get from the drivers into radiotap. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
ebefce3d13
commit
6d744bacee
@@ -178,6 +178,11 @@ struct ieee80211_radiotap_header {
|
|||||||
*
|
*
|
||||||
* Number of unicast retries a transmitted frame used.
|
* Number of unicast retries a transmitted frame used.
|
||||||
*
|
*
|
||||||
|
* IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless
|
||||||
|
*
|
||||||
|
* Contains a bitmap of known fields/flags, the flags, and
|
||||||
|
* the MCS index.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
enum ieee80211_radiotap_type {
|
enum ieee80211_radiotap_type {
|
||||||
IEEE80211_RADIOTAP_TSFT = 0,
|
IEEE80211_RADIOTAP_TSFT = 0,
|
||||||
@@ -199,6 +204,8 @@ enum ieee80211_radiotap_type {
|
|||||||
IEEE80211_RADIOTAP_RTS_RETRIES = 16,
|
IEEE80211_RADIOTAP_RTS_RETRIES = 16,
|
||||||
IEEE80211_RADIOTAP_DATA_RETRIES = 17,
|
IEEE80211_RADIOTAP_DATA_RETRIES = 17,
|
||||||
|
|
||||||
|
IEEE80211_RADIOTAP_MCS = 19,
|
||||||
|
|
||||||
/* valid in every it_present bitmap, even vendor namespaces */
|
/* valid in every it_present bitmap, even vendor namespaces */
|
||||||
IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
|
IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
|
||||||
IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
|
IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
|
||||||
@@ -245,6 +252,24 @@ enum ieee80211_radiotap_type {
|
|||||||
#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */
|
#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */
|
||||||
#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */
|
#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */
|
||||||
|
|
||||||
|
|
||||||
|
/* For IEEE80211_RADIOTAP_MCS */
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10
|
||||||
|
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_BW_20 0
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_BW_40 1
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_BW_20L 2
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_BW_20U 3
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_SGI 0x04
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08
|
||||||
|
#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
|
||||||
|
|
||||||
|
|
||||||
/* Ugly macro to convert literal channel numbers into their mhz equivalents
|
/* Ugly macro to convert literal channel numbers into their mhz equivalents
|
||||||
* There are certianly some conditions that will break this (like feeding it '30')
|
* There are certianly some conditions that will break this (like feeding it '30')
|
||||||
* but they shouldn't arise since nothing talks on channel 30. */
|
* but they shouldn't arise since nothing talks on channel 30. */
|
||||||
|
@@ -85,6 +85,9 @@ ieee80211_rx_radiotap_len(struct ieee80211_local *local,
|
|||||||
if (len & 1) /* padding for RX_FLAGS if necessary */
|
if (len & 1) /* padding for RX_FLAGS if necessary */
|
||||||
len++;
|
len++;
|
||||||
|
|
||||||
|
if (status->flag & RX_FLAG_HT) /* HT info */
|
||||||
|
len += 3;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,6 +196,20 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
|||||||
rx_flags |= IEEE80211_RADIOTAP_F_RX_BADPLCP;
|
rx_flags |= IEEE80211_RADIOTAP_F_RX_BADPLCP;
|
||||||
put_unaligned_le16(rx_flags, pos);
|
put_unaligned_le16(rx_flags, pos);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
|
|
||||||
|
if (status->flag & RX_FLAG_HT) {
|
||||||
|
rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS);
|
||||||
|
*pos++ = IEEE80211_RADIOTAP_MCS_HAVE_MCS |
|
||||||
|
IEEE80211_RADIOTAP_MCS_HAVE_GI |
|
||||||
|
IEEE80211_RADIOTAP_MCS_HAVE_BW;
|
||||||
|
*pos = 0;
|
||||||
|
if (status->flag & RX_FLAG_SHORT_GI)
|
||||||
|
*pos |= IEEE80211_RADIOTAP_MCS_SGI;
|
||||||
|
if (status->flag & RX_FLAG_40MHZ)
|
||||||
|
*pos |= IEEE80211_RADIOTAP_MCS_BW_40;
|
||||||
|
pos++;
|
||||||
|
*pos++ = status->rate_idx;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user