]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: fix A-MSDU indication in monitor mode
authorKang Yang <quic_kangyang@quicinc.com>
Tue, 22 Oct 2024 11:08:31 +0000 (19:08 +0800)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Wed, 23 Oct 2024 17:16:01 +0000 (10:16 -0700)
In monitor mode, host will reap MSDUs and then the MSDUs with same PPDU
ID will be aggregated into an A-MSDU in ath12k_dp_mon_rx_merg_msdus().

However, ath12k_dp_mon_rx_merg_msdus() doesn't calculate the total
length of the A-MSDU. This causes Wireshark to display the A-MSDU
incorrectly.

Therefore, need to add calculation of the A-MSDU length.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Kang Yang <quic_kangyang@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20241022110831.974-9-quic_kangyang@quicinc.com
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
drivers/net/wireless/ath/ath12k/dp_mon.c

index d87029295eec2d56a5a21270d4ee3060aff6f0c8..494984133a9196411ac0eeac0311aebd5c085fad 100644 (file)
@@ -870,11 +870,11 @@ ath12k_dp_mon_rx_merg_msdus(struct ath12k *ar, u32 mac_id,
                            struct ieee80211_rx_status *rxs, bool *fcs_err)
 {
        struct ath12k_base *ab = ar->ab;
-       struct sk_buff *msdu, *mpdu_buf, *prev_buf;
+       struct sk_buff *msdu, *mpdu_buf, *prev_buf, *head_frag_list;
        struct hal_rx_desc *rx_desc, *tail_rx_desc;
        u8 *hdr_desc, *dest, decap_format;
        struct ieee80211_hdr_3addr *wh;
-       u32 err_bitmap;
+       u32 err_bitmap, frag_list_sum_len = 0;
 
        mpdu_buf = NULL;
 
@@ -897,10 +897,15 @@ ath12k_dp_mon_rx_merg_msdus(struct ath12k *ar, u32 mac_id,
 
                prev_buf = head_msdu;
                msdu = head_msdu->next;
+               head_frag_list = NULL;
 
                while (msdu) {
                        ath12k_dp_mon_rx_msdus_set_payload(ar, msdu, tail_msdu);
 
+                       if (!head_frag_list)
+                               head_frag_list = msdu;
+
+                       frag_list_sum_len += msdu->len;
                        prev_buf = msdu;
                        msdu = msdu->next;
                }
@@ -908,6 +913,12 @@ ath12k_dp_mon_rx_merg_msdus(struct ath12k *ar, u32 mac_id,
                prev_buf->next = NULL;
 
                skb_trim(prev_buf, prev_buf->len - HAL_RX_FCS_LEN);
+               if (head_frag_list) {
+                       skb_shinfo(head_msdu)->frag_list = head_frag_list;
+                       head_msdu->data_len = frag_list_sum_len;
+                       head_msdu->len += head_msdu->data_len;
+                       head_msdu->next = NULL;
+               }
        } else if (decap_format == DP_RX_DECAP_TYPE_NATIVE_WIFI) {
                u8 qos_pkt = 0;