]> 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 a3c214d3ef5b34e0bb225cff82ede5407fe20055..13cba422937778626aaf9c212c908b4748a80679 100644 (file)
 
 /* \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 <config.h>
 #endif
 
-#include <netdissect-stdinc.h>
+#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, len - 8, 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);
 }