Re: [tcpdump-workers] vlan tagged packets and libpcap breakage
flat view
From: Eric W. Biederman <hidden>
Date: 2012-12-06 22:19:10
Ani Sinha [off-list ref] writes:
On Sat, Nov 17, 2012 at 3:33 PM, Eric W. Biederman [off-list ref] wrote:quoted
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?
Two things. - TP_STATUS_VLAN_VALID lives in the tp_status field not the tp_vlan_tci field. - To work on older kernels with binaries compiled with newer headers you first want to test for tp_vlan_tci == 0 and then look at the status field for TP_STATUS_VALID. Which means the tests need to look something like: - if (aux->tp_vlan_tci == 0) +#if defined(TP_STATUS_VLAN_VALID) + if ((aux->tp_vlan_tci == 0) && !(aux->tp_status & 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 #ifdef HAVE_TPACKET2 - if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci && + if (handle->md.tp_version == TPACKET_V2 && +#if defined(TP_STATUS_VLAN_VALID) + (h.h2->tp_vlan_tci || (h.h2->tp_status & TP_STATUS_VALID)) && +#else + h.h2->tp_vlan_tci && +#endif Eric