X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0db4dcafe5ae38201d3869c96a96cb714d82ff35..b51a0dafc7861eb31d21524ec067d7c529a664b8:/print-vxlan-gpe.c diff --git a/print-vxlan-gpe.c b/print-vxlan-gpe.c index 6d170de1..13cba422 100644 --- a/print-vxlan-gpe.c +++ b/print-vxlan-gpe.c @@ -23,21 +23,22 @@ /* \summary: Generic Protocol Extension for VXLAN (VXLAN GPE) printer */ -/* specification: draft-ietf-nvo3-vxlan-gpe-01 */ +/* specification: draft-ietf-nvo3-vxlan-gpe-10 */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" -static const char tstr[] = " [|VXLAN-GPE]"; static const struct tok vxlan_gpe_flags [] = { { 0x08, "I" }, { 0x04, "P" }, + { 0x02, "B" }, { 0x01, "O" }, { 0, NULL } }; @@ -64,50 +65,60 @@ vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len) uint8_t next_protocol; uint32_t vni; - if (len < VXLAN_GPE_HDR_LEN) - goto trunc; + ndo->ndo_protocol = "vxlan_gpe"; + ND_PRINT("VXLAN-GPE, "); + if (len < VXLAN_GPE_HDR_LEN) { + ND_PRINT(" (len %u < %u)", len, VXLAN_GPE_HDR_LEN); + goto invalid; + } - ND_TCHECK2(*bp, VXLAN_GPE_HDR_LEN); + flags = GET_U_1(bp); + bp += 1; + len -= 1; + ND_PRINT("flags [%s], ", + bittok2str_nosep(vxlan_gpe_flags, "none", flags)); - flags = *bp; - bp += 3; + /* Reserved */ + bp += 2; + len -= 2; - next_protocol = *bp; + next_protocol = GET_U_1(bp); bp += 1; + len -= 1; - vni = EXTRACT_24BITS(bp); - bp += 4; + vni = GET_BE_U_3(bp); + bp += 3; + len -= 3; - ND_PRINT((ndo, "VXLAN-GPE, ")); - ND_PRINT((ndo, "flags [%s], ", - bittok2str_nosep(vxlan_gpe_flags, "none", flags))); - ND_PRINT((ndo, "vni %u", vni)); - ND_PRINT((ndo, ndo->ndo_vflag ? "\n " : ": ")); + /* Reserved */ + ND_TCHECK_1(bp); + bp += 1; + len -= 1; + + ND_PRINT("vni %u", vni); + ND_PRINT(ndo->ndo_vflag ? "\n " : ": "); switch (next_protocol) { case 0x1: - ip_print(ndo, bp, len - 8); + ip_print(ndo, bp, len); break; case 0x2: - ip6_print(ndo, bp, len - 8); + ip6_print(ndo, bp, len); break; case 0x3: - ether_print(ndo, bp, len - 8, ndo->ndo_snapend - bp, NULL, NULL); + ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); break; case 0x4: - nsh_print(ndo, bp, len - 8); - break; - case 0x5: - mpls_print(ndo, bp, len - 8); + nsh_print(ndo, bp, len); break; default: - ND_PRINT((ndo, "ERROR: unknown-next-protocol")); - return; + ND_PRINT("ERROR: unknown-next-protocol"); + goto invalid; } return; -trunc: - ND_PRINT((ndo, "%s", tstr)); +invalid: + nd_print_invalid(ndo); }