VXLAN: Modernize packet parsing style.

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.
This commit is contained in:
Denis Ovsienko 2020-10-11 14:01:40 +01:00
parent 63ffe2f1e3
commit f70bb5a021

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