]> The Tcpdump Group git mirrors - tcpdump/commitdiff
VXLAN: Modernize packet parsing style.
authorDenis Ovsienko <[email protected]>
Sun, 11 Oct 2020 13:01:40 +0000 (14:01 +0100)
committerDenis Ovsienko <[email protected]>
Sun, 11 Oct 2020 13:11:09 +0000 (14:11 +0100)
Enable ND_LONGJMP_FROM_TCHECK, print the protocol name early, report an
undersized packet as invalid instead of truncated, fetch/test and advance
the pointer one field at a time and print values as soon as they become
available.

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);
 }