summaryrefslogtreecommitdiff
path: root/print-vxlan-gpe.c
diff options
context:
space:
mode:
authorDenis Ovsienko <denis@ovsienko.info>2020-10-17 14:13:58 +0100
committerDenis Ovsienko <denis@ovsienko.info>2020-10-17 17:52:29 +0100
commite37e1b0c82e08f2382286e5acd200645e4627165 (patch)
tree6db23ea1983de8e6680adac80e2932693d847489 /print-vxlan-gpe.c
parent13add7753420d0e16552d951dd405eff98dc01b9 (diff)
downloadtcpdump-e37e1b0c82e08f2382286e5acd200645e4627165.tar.gz
VXLAN-GPE: Modernize packet parsing style.
Enable ND_LONGJMP_FROM_TCHECK. Add and use a standard invalid packet label. Advance one field at a time and decrement the length.
Diffstat (limited to 'print-vxlan-gpe.c')
-rw-r--r--print-vxlan-gpe.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/print-vxlan-gpe.c b/print-vxlan-gpe.c
index 309f65c7..13cba422 100644
--- a/print-vxlan-gpe.c
+++ b/print-vxlan-gpe.c
@@ -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);
}