diff options
-rw-r--r-- | dissector.h | 12 | ||||
-rw-r--r-- | ring.h | 24 |
2 files changed, 36 insertions, 0 deletions
diff --git a/dissector.h b/dissector.h index 5580110..226d2bc 100644 --- a/dissector.h +++ b/dissector.h @@ -17,6 +17,7 @@ #include "ring.h" #include "tprintf.h" #include "linktype.h" +#include "proto_vlan.h" #define PRINT_NORM 0 #define PRINT_LESS 1 @@ -91,6 +92,17 @@ static inline void __show_frame_hdr(uint8_t *packet, size_t len, int linktype, tpacket_uhdr(hdr, tp_nsec, v3), count, v3 ? "" : __show_ts_source(hdr.h2->tp_status)); + + if (tpacket_has_vlan_info(&hdr)) { + uint16_t tci = tpacket_uhdr_vlan_tci(&hdr, v3); + + tprintf(" [ tpacketv3 VLAN "); + tprintf("Prio (%u), ", vlan_tci2prio(tci)); + tprintf("CFI (%u), ", vlan_tci2cfi(tci)); + tprintf("ID (%u), ", vlan_tci2vid(tci)); + tprintf("Proto (0x%.4x)", tpacket_uhdr_vlan_proto(&hdr, v3)); + tprintf(" ]\n"); + } break; } } @@ -47,6 +47,30 @@ union tpacket_uhdr { (((hdr).h2)->member) #endif /* HAVE_TPACKET3 */ +static inline uint16_t tpacket_uhdr_vlan_tci(union tpacket_uhdr *hdr, bool v3) +{ +#ifdef HAVE_TPACKET3 + if (v3) + return hdr->h3->hv1.tp_vlan_tci; +#endif + return 0; +} + +static inline uint16_t tpacket_uhdr_vlan_proto(union tpacket_uhdr *hdr, bool v3) +{ +#ifdef HAVE_TPACKET3 + if (v3) + return hdr->h3->hv1.tp_vlan_tpid; +#endif + return 0; +} + +static inline bool tpacket_has_vlan_info(union tpacket_uhdr *hdr) +{ + return tpacket_uhdr(*hdr, tp_status, true) & + (TP_STATUS_VLAN_VALID | TP_STATUS_VLAN_TPID_VALID); +} + struct frame_map { struct tpacket2_hdr tp_h __aligned_tpacket; struct sockaddr_ll s_ll __align_tpacket(sizeof(struct tpacket2_hdr)); |