Skip to content

Commit a5e7069

Browse files
Simon Wunderlichjmberg-intel
Simon Wunderlich
authored andcommitted
mac80211: add radiotap flag and handling for 5/10 MHz
Wireshark already defines radiotap channel flags for 5 and 10 MHz, so just use them in Linux radiotap too. Furthermore, add rx status flags to allow drivers to report when they received data on 5 or 10 MHz channels. Signed-off-by: Simon Wunderlich <[email protected]> Signed-off-by: Mathias Kretschmer <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
1 parent 438b61b commit a5e7069

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

include/net/ieee80211_radiotap.h

+4
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ enum ieee80211_radiotap_type {
230230
#define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */
231231
#define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */
232232
#define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */
233+
#define IEEE80211_CHAN_GSM 0x1000 /* GSM (900 MHz) */
234+
#define IEEE80211_CHAN_STURBO 0x2000 /* Static Turbo */
235+
#define IEEE80211_CHAN_HALF 0x4000 /* Half channel (10 MHz wide) */
236+
#define IEEE80211_CHAN_QUARTER 0x8000 /* Quarter channel (5 MHz wide) */
233237

234238
/* For IEEE80211_RADIOTAP_FLAGS */
235239
#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received

include/net/mac80211.h

+4
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,8 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
811811
* @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC
812812
* is stored in the @ampdu_delimiter_crc field)
813813
* @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3
814+
* @RX_FLAG_10MHZ: 10 MHz (half channel) was used
815+
* @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used
814816
*/
815817
enum mac80211_rx_flags {
816818
RX_FLAG_MMIC_ERROR = BIT(0),
@@ -839,6 +841,8 @@ enum mac80211_rx_flags {
839841
RX_FLAG_80P80MHZ = BIT(24),
840842
RX_FLAG_160MHZ = BIT(25),
841843
RX_FLAG_STBC_MASK = BIT(26) | BIT(27),
844+
RX_FLAG_10MHZ = BIT(28),
845+
RX_FLAG_5MHZ = BIT(29),
842846
};
843847

844848
#define RX_FLAG_STBC_SHIFT 26

net/mac80211/rx.c

+12-9
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
159159
__le32 *it_present;
160160
u32 it_present_val;
161161
u16 rx_flags = 0;
162+
u16 channel_flags = 0;
162163
int mpdulen, chain;
163164
unsigned long chains = status->chains;
164165

@@ -243,20 +244,22 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
243244
/* IEEE80211_RADIOTAP_CHANNEL */
244245
put_unaligned_le16(status->freq, pos);
245246
pos += 2;
247+
if (status->flag & RX_FLAG_10MHZ)
248+
channel_flags |= IEEE80211_CHAN_HALF;
249+
else if (status->flag & RX_FLAG_5MHZ)
250+
channel_flags |= IEEE80211_CHAN_QUARTER;
251+
246252
if (status->band == IEEE80211_BAND_5GHZ)
247-
put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ,
248-
pos);
253+
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ;
249254
else if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT))
250-
put_unaligned_le16(IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ,
251-
pos);
255+
channel_flags |= IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
252256
else if (rate && rate->flags & IEEE80211_RATE_ERP_G)
253-
put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ,
254-
pos);
257+
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
255258
else if (rate)
256-
put_unaligned_le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ,
257-
pos);
259+
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
258260
else
259-
put_unaligned_le16(IEEE80211_CHAN_2GHZ, pos);
261+
channel_flags |= IEEE80211_CHAN_2GHZ;
262+
put_unaligned_le16(channel_flags, pos);
260263
pos += 2;
261264

262265
/* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */

0 commit comments

Comments
 (0)