]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-vxlan-gpe.c
On Solaris, for 64-bit builds, use the 64-bit pcap-config.
[tcpdump] / print-vxlan-gpe.c
index 309f65c76d9563213827b9606d16f887a3af20a5..13cba422937778626aaf9c212c908b4748a80679 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 
@@ -65,47 +66,59 @@ vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len)
     uint32_t vni;
 
     ndo->ndo_protocol = "vxlan_gpe";
-    if (len < VXLAN_GPE_HDR_LEN)
-        goto trunc;
-
-    ND_TCHECK_LEN(bp, VXLAN_GPE_HDR_LEN);
+    ND_PRINT("VXLAN-GPE, ");
+    if (len < VXLAN_GPE_HDR_LEN) {
+        ND_PRINT(" (len %u < %u)", len, VXLAN_GPE_HDR_LEN);
+        goto invalid;
+    }
 
     flags = GET_U_1(bp);
-    bp += 3;
+    bp += 1;
+    len -= 1;
+    ND_PRINT("flags [%s], ",
+              bittok2str_nosep(vxlan_gpe_flags, "none", flags));
+
+    /* Reserved */
+    bp += 2;
+    len -= 2;
 
     next_protocol = GET_U_1(bp);
     bp += 1;
+    len -= 1;
 
     vni = GET_BE_U_3(bp);
-    bp += 4;
+    bp += 3;
+    len -= 3;
+
+    /* Reserved */
+    ND_TCHECK_1(bp);
+    bp += 1;
+    len -= 1;
 
-    ND_PRINT("VXLAN-GPE, ");
-    ND_PRINT("flags [%s], ",
-              bittok2str_nosep(vxlan_gpe_flags, "none", flags));
     ND_PRINT("vni %u", vni);
     ND_PRINT(ndo->ndo_vflag ? "\n    " : ": ");
 
     switch (next_protocol) {
     case 0x1:
-        ip_print(ndo, bp, len - VXLAN_GPE_HDR_LEN);
+        ip_print(ndo, bp, len);
         break;
     case 0x2:
-        ip6_print(ndo, bp, len - VXLAN_GPE_HDR_LEN);
+        ip6_print(ndo, bp, len);
         break;
     case 0x3:
-        ether_print(ndo, bp, len - VXLAN_GPE_HDR_LEN, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
+        ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
         break;
     case 0x4:
-        nsh_print(ndo, bp, len - VXLAN_GPE_HDR_LEN);
+        nsh_print(ndo, bp, len);
         break;
     default:
         ND_PRINT("ERROR: unknown-next-protocol");
-        return;
+        goto invalid;
     }
 
        return;
 
-trunc:
-       nd_print_trunc(ndo);
+invalid:
+    nd_print_invalid(ndo);
 }