tcpdump mailing list archives
[PATCH 04/04]: pcap-linux: reconstruct VLAN headers from tpacket2_hdr
From: Patrick McHardy <kaber () trash net>
Date: Fri, 18 Jul 2008 20:08:27 +0200
pcap-linux: reconstruct VLAN headers from tpacket2_hdr
From: Patrick McHardy <kaber () trash net>
Similar to PACKET_AUXDATA for non-mmaped sockets, the VLAN TCI is
present in a new member of struct tpacket2_hdr. Use it to reconstruct
the VLAN header when necessary.
---
pcap-linux.c | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/pcap-linux.c b/pcap-linux.c
index 50d4389..1ffa2e4 100644
--- a/pcap-linux.c
+++ b/pcap-linux.c
@@ -1965,6 +1965,17 @@ prepare_tpacket_socket(pcap_t *handle)
return 0;
}
handle->md.tp_version = TPACKET_V2;
+
+ /* Reserve space for VLAN tag reconstruction */
+ val = VLAN_TAG_LEN;
+ if (setsockopt(handle->fd, SOL_PACKET, PACKET_RESERVE, &val,
+ sizeof(val)) < 0) {
+ snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+ "can't set up reserve on socket %d: %d-%s",
+ handle->fd, errno, pcap_strerror(errno));
+ return 0;
+ }
+
#endif /* HAVE_TPACKET2 */
return 1;
}
@@ -2281,6 +2292,23 @@ pcap_read_linux_mmap(pcap_t *handle, int max_packets, pcap_handler callback,
pcaphdr.len += SLL_HDR_LEN;
}
+#ifdef HAVE_TPACKET2
+ if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci &&
+ tp_snaplen >= 2 * ETH_ALEN) {
+ struct vlan_tag *tag;
+
+ bp -= VLAN_TAG_LEN;
+ memmove(bp, bp + VLAN_TAG_LEN, 2 * ETH_ALEN);
+
+ tag = (struct vlan_tag *)(bp + 2 * ETH_ALEN);
+ tag->vlan_tpid = htons(ETH_P_8021Q);
+ tag->vlan_tci = htons(h.h2->tp_vlan_tci);
+
+ pcaphdr.caplen += VLAN_TAG_LEN;
+ pcaphdr.len += VLAN_TAG_LEN;
+ }
+#endif
+
/* pass the packet to the user */
pkts++;
callback(user, &pcaphdr, bp);
- This is the tcpdump-workers list. Visit https://cod.sandelman.ca/ to unsubscribe.
Current thread:
- [PATCH 00/04]: libpcap: VLAN acceleration support Patrick McHardy (Jul 18)
- [PATCH 01/04]: pcap-linux: convert to recvmsg() Patrick McHardy (Jul 18)
- Re: [PATCH 01/04]: pcap-linux: convert to recvmsg() Guy Harris (Aug 06)
- [PATCH 04/04]: pcap-linux: reconstruct VLAN headers from tpacket2_hdr Patrick McHardy (Jul 18)
- Re: [PATCH 04/04]: pcap-linux: reconstruct VLAN headers from tpacket2_hdr Guy Harris (Aug 06)
- [PATCH 02/04]: pcap-linux: reconstruct VLAN header from PACKET_AUXDATA Patrick McHardy (Jul 18)
- Re: [PATCH 02/04]: pcap-linux: reconstruct VLAN header from PACKET_AUXDATA Guy Harris (Aug 06)
- [PATCH 03/04]: pcap-linux: support new tpacket frame header format Patrick McHardy (Jul 18)
- Re: [PATCH 03/04]: pcap-linux: support new tpacket frame header format Guy Harris (Aug 06)
- Re: [PATCH 00/04]: libpcap: VLAN acceleration support Guy Harris (Aug 06)
- [PATCH 01/04]: pcap-linux: convert to recvmsg() Patrick McHardy (Jul 18)
