aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorShaul Triebitz <shaul.triebitz@intel.com>2018-09-05 08:06:06 +0300
committerJohannes Berg <johannes.berg@intel.com>2018-09-05 10:08:25 +0200
commitc3d1f8752802b2e1fb12c73bee50035bc125bc54 (patch)
tree8b7874b6f209d0d3f447fbecb1133c989dbe2cf8 /net/mac80211/rx.c
parentmac80211: Fix PTK rekey freezes and clear text leak (diff)
downloadlinux-dev-c3d1f8752802b2e1fb12c73bee50035bc125bc54.tar.xz
linux-dev-c3d1f8752802b2e1fb12c73bee50035bc125bc54.zip
mac80211: support reporting 0-length PSDU in radiotap
For certain sounding frames, it may be useful to report them to userspace even though they don't have a PSDU in order to determine the PHY parameters (e.g. VHT rate/stream config.) Add support for this to mac80211. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to '')
-rw-r--r--net/mac80211/rx.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 4376a4ce8c25..c6bfd4019d44 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -115,7 +115,8 @@ static inline bool should_drop_frame(struct sk_buff *skb, int present_fcs_len,
if (status->flag & (RX_FLAG_FAILED_FCS_CRC |
RX_FLAG_FAILED_PLCP_CRC |
- RX_FLAG_ONLY_MONITOR))
+ RX_FLAG_ONLY_MONITOR |
+ RX_FLAG_NO_PSDU))
return true;
if (unlikely(skb->len < 16 + present_fcs_len + rtap_space))
@@ -189,6 +190,9 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) != 12);
}
+ if (status->flag & RX_FLAG_NO_PSDU)
+ len += 1;
+
if (status->flag & RX_FLAG_RADIOTAP_LSIG) {
len = ALIGN(len, 2);
len += 4;
@@ -642,6 +646,12 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
pos += sizeof(he_mu);
}
+ if (status->flag & RX_FLAG_NO_PSDU) {
+ rthdr->it_present |=
+ cpu_to_le32(1 << IEEE80211_RADIOTAP_ZERO_LEN_PSDU);
+ *pos++ = status->zero_length_psdu_type;
+ }
+
if (status->flag & RX_FLAG_RADIOTAP_LSIG) {
/* ensure 2 byte alignment */
while ((pos - (u8 *)rthdr) & 1)