/* \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 }
};
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);
}