aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>2013-07-08 10:55:52 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-07-16 02:58:05 -0400
commita5e70697d0c4836e69c60de92db27eac9ae71e05 (patch)
treea4af8f2f829b505a2e78aafb2aa9663e25709b7b /net/mac80211
parent438b61b77082e70d2a408cc77b8c5faac312e940 (diff)
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>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/rx.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index c9f2ca43856a..deeeca1299bd 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -159,6 +159,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
159 __le32 *it_present; 159 __le32 *it_present;
160 u32 it_present_val; 160 u32 it_present_val;
161 u16 rx_flags = 0; 161 u16 rx_flags = 0;
162 u16 channel_flags = 0;
162 int mpdulen, chain; 163 int mpdulen, chain;
163 unsigned long chains = status->chains; 164 unsigned long chains = status->chains;
164 165
@@ -243,20 +244,22 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
243 /* IEEE80211_RADIOTAP_CHANNEL */ 244 /* IEEE80211_RADIOTAP_CHANNEL */
244 put_unaligned_le16(status->freq, pos); 245 put_unaligned_le16(status->freq, pos);
245 pos += 2; 246 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
246 if (status->band == IEEE80211_BAND_5GHZ) 252 if (status->band == IEEE80211_BAND_5GHZ)
247 put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ, 253 channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ;
248 pos);
249 else if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT)) 254 else if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT))
250 put_unaligned_le16(IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ, 255 channel_flags |= IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
251 pos);
252 else if (rate && rate->flags & IEEE80211_RATE_ERP_G) 256 else if (rate && rate->flags & IEEE80211_RATE_ERP_G)
253 put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ, 257 channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
254 pos);
255 else if (rate) 258 else if (rate)
256 put_unaligned_le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ, 259 channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
257 pos);
258 else 260 else
259 put_unaligned_le16(IEEE80211_CHAN_2GHZ, pos); 261 channel_flags |= IEEE80211_CHAN_2GHZ;
262 put_unaligned_le16(channel_flags, pos);
260 pos += 2; 263 pos += 2;
261 264
262 /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */ 265 /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */