]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-vxlan.c
Makefile.in: don't remove configure and config.h.in in make distclean.
[tcpdump] / print-vxlan.c
index be49d27023f4e611db58087e2a491bb6303def5d..60dcd44def5059379b5062f5442427f2be88176f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 
@@ -53,26 +54,30 @@ vxlan_print(netdissect_options *ndo, const u_char *bp, u_int len)
     uint32_t vni;
 
     ndo->ndo_protocol = "vxlan";
+    nd_print_protocol_caps(ndo);
     if (len < VXLAN_HDR_LEN)
-        goto trunc;
-
-    ND_TCHECK_LEN(bp, VXLAN_HDR_LEN);
+        goto invalid;
 
     flags = GET_U_1(bp);
-    bp += 4;
-
-    vni = GET_BE_U_3(bp);
-    bp += 4;
-
-    nd_print_protocol_caps(ndo);
+    bp += 1;
     ND_PRINT(", flags [%s] (0x%02x), ",
              bittok2str_nosep(vxlan_flags, "invalid", flags), flags);
+
+    /* 1st Reserved */
+    bp += 3;
+
+    vni = GET_BE_U_3(bp);
+    bp += 3;
     ND_PRINT("vni %u\n", vni);
 
+    /* 2nd Reserved */
+    ND_TCHECK_1(bp);
+    bp += 1;
+
     ether_print(ndo, bp, len - VXLAN_HDR_LEN, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
 
     return;
 
-trunc:
-    nd_print_trunc(ndo);
+invalid:
+    nd_print_invalid(ndo);
 }