? ktrace.out Index: interface.h =================================================================== RCS file: /cvs/src/usr.sbin/tcpdump/interface.h,v retrieving revision 1.85 diff -u -p -r1.85 interface.h --- interface.h 21 Jun 2020 05:00:17 -0000 1.85 +++ interface.h 17 Aug 2020 06:16:33 -0000 @@ -66,6 +66,7 @@ extern char *device; /* as specified by #define PT_VXLAN 12 /* Virtual eXtensible Local Area Network */ #define PT_ERSPAN 13 /* GRE ERSPAN Type I or II */ #define PT_WIREGUARD 14 /* WireGuard tunnel */ +#define PT_GENEVE 15 /* Geneve */ #ifndef min #define min(a,b) ((a)>(b)?(b):(a)) @@ -217,6 +218,7 @@ extern void ppp_ether_if_print(u_char *, const u_char *); extern void gre_print(const u_char *, u_int); extern void vxlan_print(const u_char *, u_int); +extern void geneve_print(const u_char *, u_int); extern void nsh_print(const u_char *, u_int); extern void nhrp_print(const u_char *, u_int); extern void icmp_print(const u_char *, u_int, const u_char *); Index: print-gre.c =================================================================== RCS file: /cvs/src/usr.sbin/tcpdump/print-gre.c,v retrieving revision 1.31 diff -u -p -r1.31 print-gre.c --- print-gre.c 15 Apr 2020 20:19:25 -0000 1.31 +++ print-gre.c 17 Aug 2020 06:16:33 -0000 @@ -785,3 +785,91 @@ vxlan_print(const u_char *p, u_int lengt trunc: printf(" [|vxlan]"); } + +/* + * Geneve: Generic Network Virtualization Encapsulation + * draft-ietf-nvo3-geneve-16 + */ + +struct geneve_header { + uint16_t flags; +#define GENEVE_VER_SHIFT 14 +#define GENEVE_VER_MASK (0x3U << GENEVE_VER_SHIFT) +#define GENEVE_VER_0 (0x0U << GENEVE_VER_SHIFT) +#define GENEVE_OPT_LEN_SHIFT 8 +#define GENEVE_OPT_LEN_MASK (0x3fU << GENEVE_OPT_LEN_SHIFT) +#define GENEVE_OPT_LEN_UNITS 4 +#define GENEVE_O 0x0080 /* Control packet */ +#define GENEVE_C 0x0040 /* Critical options present */ + uint16_t protocol; + uint32_t vni; +#define GENEVE_VNI_SHIFT 8 +#define GENEVE_VNI_MASK (0xffffffU << GENEVE_VNI_SHIFT) +#define GENEVE_VNI_RESERVED (~GENEVE_VNI_MASK) +}; + +void +geneve_print(const u_char *p, u_int length) +{ + const struct geneve_header *gh; + uint16_t flags, ver, proto; + uint32_t vni; + int l = snapend - p; + + printf("geneve"); + + if (l < sizeof(*gh)) + goto trunc; + if (length < sizeof(*gh)) { + printf(" ip truncated"); + return; + } + + gh = (const struct geneve_header *)p; + + p += sizeof(*gh); + length -= sizeof(*gh); + + flags = ntohs(gh->flags); + ver = flags & GENEVE_VER_MASK; + if (ver != GENEVE_VER_0) { + printf(" unknown version %u", ver >> GENEVE_VER_SHIFT); + return; + } + + vni = (htonl(gh->vni) & GENEVE_VNI_MASK) >> GENEVE_VNI_SHIFT; + printf(" vni %u", vni); + + if (flags & GENEVE_O) + printf(" Control"); + + if (flags & GENEVE_C) + printf(" Critical"); + + printf(": "); + + proto = ntohs(gh->protocol); + switch (proto) { + case ETHERTYPE_IP: + ip_print(p, length); + break; + case ETHERTYPE_IPV6: + ip6_print(p, length); + break; + case ETHERTYPE_MPLS: + case ETHERTYPE_MPLS_MCAST: + mpls_print(p, length); + break; + case ETHERTYPE_TRANSETHER: + ether_tryprint(p, length, 0); + break; + + default: + printf("geneve-protocol-0x%x", proto); + break; + } + + return; +trunc: + printf(" [|geneve]"); +} Index: print-udp.c =================================================================== RCS file: /cvs/src/usr.sbin/tcpdump/print-udp.c,v retrieving revision 1.55 diff -u -p -r1.55 print-udp.c --- print-udp.c 21 Jun 2020 05:00:18 -0000 1.55 +++ print-udp.c 17 Aug 2020 06:16:33 -0000 @@ -308,6 +308,7 @@ rtcp_print(const u_char *hdr, const u_ch #define GRE_PORT 4754 #define VXLAN_PORT 4789 #define VXLAN_GPE_PORT 4790 +#define GENEVE_PORT 6081 #define MULTICASTDNS_PORT 5353 #define MPLS_PORT 6635 @@ -466,6 +467,9 @@ udp_print(const u_char *bp, u_int length case PT_VXLAN: vxlan_print(cp, length); break; + case PT_GENEVE: + geneve_print(cp, length); + break; case PT_MPLS: mpls_print(cp, length); break; @@ -560,6 +564,8 @@ udp_print(const u_char *bp, u_int length gre_print(cp, length); else if (ISPORT(VXLAN_PORT) || ISPORT(VXLAN_GPE_PORT)) vxlan_print(cp, length); + else if (ISPORT(GENEVE_PORT)) + geneve_print(cp, length); else if (ISPORT(MPLS_PORT)) mpls_print(cp, length); else if (ISPORT(RIPNG_PORT)) Index: tcpdump.8 =================================================================== RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.8,v retrieving revision 1.110 diff -u -p -r1.110 tcpdump.8 --- tcpdump.8 21 Jun 2020 05:00:18 -0000 1.110 +++ tcpdump.8 17 Aug 2020 06:16:33 -0000 @@ -238,6 +238,8 @@ Currently known types are: Cisco NetFlow protocol .It Cm erspan Cisco Encapsulated Remote Switch Port Analyzer (ERSPAN) over GRE +.It Cm geneve +Generic Network Virtualization Encapsulation .It Cm gre Generic Routing Encapsulation over UDP .It Cm mpls Index: tcpdump.c =================================================================== RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.c,v retrieving revision 1.93 diff -u -p -r1.93 tcpdump.c --- tcpdump.c 21 Jun 2020 05:00:18 -0000 1.93 +++ tcpdump.c 17 Aug 2020 06:16:33 -0000 @@ -365,6 +365,8 @@ main(int argc, char **argv) packettype = PT_GRE; else if (strcasecmp(optarg, "vxlan") == 0) packettype = PT_VXLAN; + else if (strcasecmp(optarg, "geneve") == 0) + packettype = PT_GENEVE; else if (strcasecmp(optarg, "erspan") == 0) packettype = PT_ERSPAN; else if (strcasecmp(optarg, "mpls") == 0)