Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>

authored by

Simon Wunderlich and committed by
Johannes Berg
a5e70697 438b61b7

+20 -9
+4
include/net/ieee80211_radiotap.h
··· 230 230 #define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ 231 231 #define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ 232 232 #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) */ 233 237 234 238 /* For IEEE80211_RADIOTAP_FLAGS */ 235 239 #define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received
+4
include/net/mac80211.h
··· 811 811 * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC 812 812 * is stored in the @ampdu_delimiter_crc field) 813 813 * @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 814 816 */ 815 817 enum mac80211_rx_flags { 816 818 RX_FLAG_MMIC_ERROR = BIT(0), ··· 841 839 RX_FLAG_80P80MHZ = BIT(24), 842 840 RX_FLAG_160MHZ = BIT(25), 843 841 RX_FLAG_STBC_MASK = BIT(26) | BIT(27), 842 + RX_FLAG_10MHZ = BIT(28), 843 + RX_FLAG_5MHZ = BIT(29), 844 844 }; 845 845 846 846 #define RX_FLAG_STBC_SHIFT 26
+12 -9
net/mac80211/rx.c
··· 159 159 __le32 *it_present; 160 160 u32 it_present_val; 161 161 u16 rx_flags = 0; 162 + u16 channel_flags = 0; 162 163 int mpdulen, chain; 163 164 unsigned long chains = status->chains; 164 165 ··· 244 243 /* IEEE80211_RADIOTAP_CHANNEL */ 245 244 put_unaligned_le16(status->freq, pos); 246 245 pos += 2; 246 + if (status->flag & RX_FLAG_10MHZ) 247 + channel_flags |= IEEE80211_CHAN_HALF; 248 + else if (status->flag & RX_FLAG_5MHZ) 249 + channel_flags |= IEEE80211_CHAN_QUARTER; 250 + 247 251 if (status->band == IEEE80211_BAND_5GHZ) 248 - put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ, 249 - pos); 252 + channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ; 250 253 else if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT)) 251 - put_unaligned_le16(IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ, 252 - pos); 254 + channel_flags |= IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; 253 255 else if (rate && rate->flags & IEEE80211_RATE_ERP_G) 254 - put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ, 255 - pos); 256 + channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; 256 257 else if (rate) 257 - put_unaligned_le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ, 258 - pos); 258 + channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; 259 259 else 260 - put_unaligned_le16(IEEE80211_CHAN_2GHZ, pos); 260 + channel_flags |= IEEE80211_CHAN_2GHZ; 261 + put_unaligned_le16(channel_flags, pos); 261 262 pos += 2; 262 263 263 264 /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */