summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Chu <stephen.chu@broadcom.corp-partner.google.com>2020-06-19 17:39:24 +0800
committerAhmed ElArabawy <arabawy@google.com>2020-06-24 11:35:43 -0700
commit44ad2216c05c682aa24426cdd741d671b0d8e854 (patch)
tree09ba3489286eee20a34f45e8a0a3b8ad0cbc2de9
parentf98944209d0ce43bed315c1c8b2f42233c32f018 (diff)
downloadbcm43752-44ad2216c05c682aa24426cdd741d671b0d8e854.tar.gz
bcmdhd: Push ETHER_HDR_LEN headroom for tcpdump any device capturing
Observed 14 bytes offset in tcpdump any device capturing. The capturing is Linux cooked mode (LINUX_SLL linke type) using SOCK_DGRAM which has no link-layer header. Push ether header length in monitor skb to keep complete radiotap content. Bug: 158203741 Test: tcpdump -i radiotap0 and tcpdump -i any can get correct capture. Signed-off-by: Stephen Chu <stephen.chu@broadcom.corp-partner.google.com> Change-Id: I6af37ef0898bfd4645f67ca967ed381fe403757b Signed-off-by: Ahmed ElArabawy <arabawy@google.com>
-rw-r--r--dhd_linux.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/dhd_linux.c b/dhd_linux.c
index 0d23da2..713d0a1 100644
--- a/dhd_linux.c
+++ b/dhd_linux.c
@@ -6139,6 +6139,23 @@ dhd_rx_mon_pkt(dhd_pub_t *dhdp, host_rxbuf_cmpl_t* msg, void *pkt, int ifidx)
}
}
+ if (skb_headroom(dhd->monitor_skb) < ETHER_HDR_LEN) {
+ struct sk_buff *skb2;
+
+ DHD_INFO(("%s: insufficient headroom\n",
+ dhd_ifname(&dhd->pub, ifidx)));
+
+ skb2 = skb_realloc_headroom(dhd->monitor_skb, ETHER_HDR_LEN);
+
+ dev_kfree_skb(dhd->monitor_skb);
+ if ((dhd->monitor_skb = skb2) == NULL) {
+ DHD_ERROR(("%s: skb_realloc_headroom failed\n",
+ dhd_ifname(&dhd->pub, ifidx)));
+ return;
+ }
+ }
+ PKTPUSH(dhd->pub.osh, dhd->monitor_skb, ETHER_HDR_LEN);
+
/* XXX WL here makes sure data is 4-byte aligned? */
if (in_interrupt()) {
bcm_object_trace_opr(skb, BCM_OBJDBG_REMOVE,