wifi: mac80211: clear all bits that relate rtap fields on skb
authorMordechay Goodstein <mordechay.goodstein@intel.com>
Wed, 1 Mar 2023 10:09:15 +0000 (12:09 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 7 Mar 2023 09:29:46 +0000 (10:29 +0100)
Since we remove radiotap from skb data, clear all RX_FLAG_X related
info that indicate info on the skb data.

Also we need to do it only once so remove the clear from cooked_monitor.

Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230301115906.74d3efe19eae.Ie17a35864d2e120f9858516a2e3d3047d83cf805@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rx.c

index f7fdfe710951faa1c9402cfd8d71ced290864f3e..095bcd2552bb0d14e64691bb38d999a53d616133 100644 (file)
@@ -43,6 +43,7 @@ static struct sk_buff *ieee80211_clean_skb(struct sk_buff *skb,
                                           unsigned int present_fcs_len,
                                           unsigned int rtap_space)
 {
+       struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
        struct ieee80211_hdr *hdr;
        unsigned int hdrlen;
        __le16 fc;
@@ -51,6 +52,14 @@ static struct sk_buff *ieee80211_clean_skb(struct sk_buff *skb,
                __pskb_trim(skb, skb->len - present_fcs_len);
        pskb_pull(skb, rtap_space);
 
+       /* After pulling radiotap header, clear all flags that indicate
+        * info in skb->data.
+        */
+       status->flag &= ~(RX_FLAG_RADIOTAP_VENDOR_DATA |
+                         RX_FLAG_RADIOTAP_LSIG |
+                         RX_FLAG_RADIOTAP_HE_MU |
+                         RX_FLAG_RADIOTAP_HE);
+
        hdr = (void *)skb->data;
        fc = hdr->frame_control;
 
@@ -3916,8 +3925,6 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
        if (!local->cooked_mntrs)
                goto out_free_skb;
 
-       /* vendor data is long removed here */
-       status->flag &= ~RX_FLAG_RADIOTAP_VENDOR_DATA;
        /* room for the radiotap header based on driver features */
        needed_headroom = ieee80211_rx_radiotap_hdrlen(local, status, skb);