On Sat, Nov 17, 2012 at 3:33 PM, Eric W. Biederman <ebied...@xmission.com> wrote: > the vlan header in packets as we receive them. > > The code is correct except for the case of packets in vlan 0. Currently > the packet reconstruction is ambiguous. The most recent kernels have > a TP_STATUS_VLAN_VALID flag that can be checked to see if the packet was > in vlan 0 or if there was no vlan at all. libpcap probably should be > taught how to handle TP_STATUS_VLAN_VALID so that it can get the vlan 0 > handling correct. >
May be this? Index: libpcap-1.1.1/pcap-linux.c =================================================================== --- libpcap-1.1.1.orig/pcap-linux.c +++ libpcap-1.1.1/pcap-linux.c @@ -132,6 +132,7 @@ static const char rcsid[] _U_ = #include <sys/utsname.h> #include <sys/mman.h> #include <linux/if.h> +#include <linux/if_packet.h> #include <netinet/in.h> #include <linux/if_ether.h> #include <net/if_arp.h> @@ -1486,7 +1487,13 @@ pcap_read_packet(pcap_t *handle, pcap_ha continue; aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg); - if (aux->tp_vlan_tci == 0) +#if defined(TP_STATUS_VLAN_VALID) + if (!(aux->tp_vlan_tci & TP_STATUS_VLAN_VALID)) +#else + if (aux->tp_vlan_tci == 0) /* this is ambigious but without the + TP_STATUS_VLAN_VALID flag, there is + nothing that we can do */ +#endif continue; len = packet_len > iov.iov_len ? iov.iov_len : packet_len; @@ -3565,7 +3555,11 @@ pcap_read_linux_mmap(pcap_t *handle, int } #ifdef HAVE_TPACKET2 - if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci && +#if defined(TP_STATUS_VLAN_VALID) + if (handle->md.tp_version == TPACKET_V2 && (h.h2->tp_vlan_tci & TP_STATUS_VLAN_VALID) && +#else + if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci && +#endif handle->md.vlan_offset != -1 && tp_snaplen >= (unsigned int) handle->md.vlan_offset) { struct vlan_tag *tag; _______________________________________________ tcpdump-workers mailing list tcpdump-workers@lists.tcpdump.org https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers