diff options
author | Stephen Chu <stephen.chu@broadcom.corp-partner.google.com> | 2020-06-19 17:39:24 +0800 |
---|---|---|
committer | Ahmed ElArabawy <arabawy@google.com> | 2020-06-24 11:35:43 -0700 |
commit | 44ad2216c05c682aa24426cdd741d671b0d8e854 (patch) | |
tree | 09ba3489286eee20a34f45e8a0a3b8ad0cbc2de9 | |
parent | f98944209d0ce43bed315c1c8b2f42233c32f018 (diff) | |
download | bcm43752-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.c | 17 |
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, |