mt76: add Rx stats support for radiotap
authorRyder Lee <ryder.lee@mediatek.com>
Fri, 24 Apr 2020 19:32:24 +0000 (03:32 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 12 May 2020 17:52:35 +0000 (19:52 +0200)
HE deivces need to add Rx radiotap header.

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/agg-rx.c
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h

index acdbe6f..df25c00 100644 (file)
@@ -119,7 +119,7 @@ static void
 mt76_rx_aggr_check_ctl(struct sk_buff *skb, struct sk_buff_head *frames)
 {
        struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-       struct ieee80211_bar *bar = (struct ieee80211_bar *)skb->data;
+       struct ieee80211_bar *bar = mt76_skb_get_hdr(skb);
        struct mt76_wcid *wcid = status->wcid;
        struct mt76_rx_tid *tid;
        u16 seqno;
@@ -147,7 +147,7 @@ mt76_rx_aggr_check_ctl(struct sk_buff *skb, struct sk_buff_head *frames)
 void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)
 {
        struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
        struct mt76_wcid *wcid = status->wcid;
        struct ieee80211_sta *sta;
        struct mt76_rx_tid *tid;
index f13114b..f65e1b3 100644 (file)
@@ -726,7 +726,7 @@ mt76_check_ccmp_pn(struct sk_buff *skb)
                 * Validate the first fragment both here and in mac80211
                 * All further fragments will be validated by mac80211 only.
                 */
-               hdr = (struct ieee80211_hdr *)skb->data;
+               hdr = mt76_skb_get_hdr(skb);
                if (ieee80211_is_frag(hdr) &&
                    !ieee80211_is_first_frag(hdr->frame_control))
                        return 0;
@@ -799,7 +799,7 @@ mt76_airtime_flush_ampdu(struct mt76_dev *dev)
 static void
 mt76_airtime_check(struct mt76_dev *dev, struct sk_buff *skb)
 {
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
        struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
        struct mt76_wcid *wcid = status->wcid;
 
@@ -836,7 +836,7 @@ static void
 mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
 {
        struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
        struct ieee80211_sta *sta;
        struct ieee80211_hw *hw;
        struct mt76_wcid *wcid = status->wcid;
index 083d874..38c91db 100644 (file)
@@ -746,6 +746,25 @@ static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb)
        return ((void *)IEEE80211_SKB_CB(skb)->status.status_driver_data);
 }
 
+static inline void *mt76_skb_get_hdr(struct sk_buff *skb)
+{
+       struct mt76_rx_status mstat;
+       u8 *data = skb->data;
+
+       /* Alignment concerns */
+       BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4);
+       BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4);
+
+       mstat = *((struct mt76_rx_status *)skb->cb);
+
+       if (mstat.flag & RX_FLAG_RADIOTAP_HE)
+               data += sizeof(struct ieee80211_radiotap_he);
+       if (mstat.flag & RX_FLAG_RADIOTAP_HE_MU)
+               data += sizeof(struct ieee80211_radiotap_he_mu);
+
+       return data;
+}
+
 static inline void mt76_insert_hdr_pad(struct sk_buff *skb)
 {
        int len = ieee80211_get_hdrlen_from_skb(skb);