void
gre_print(netdissect_options *ndo, const u_char *bp, u_int length)
{
- u_int len = length, vers;
+ u_int vers;
ndo->ndo_protocol = "gre";
- ND_LCHECK_U(len, 2);
+ nd_print_protocol_caps(ndo);
+ ND_ICHECK_U(length, <, 2);
vers = GET_BE_U_2(bp) & GRE_VERS_MASK;
- ND_PRINT("GREv%u",vers);
+ ND_PRINT("v%u",vers);
switch(vers) {
case 0:
- gre_print_0(ndo, bp, len);
+ gre_print_0(ndo, bp, length);
break;
case 1:
- gre_print_1(ndo, bp, len);
+ gre_print_1(ndo, bp, length);
break;
default:
ND_PRINT(" ERROR: unknown-version");
u_int len = length;
uint16_t flags, prot;
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
flags = GET_BE_U_2(bp);
if (ndo->ndo_vflag)
ND_PRINT(", Flags [%s]",
len -= 2;
bp += 2;
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
prot = GET_BE_U_2(bp);
len -= 2;
bp += 2;
if ((flags & GRE_CP) | (flags & GRE_RP)) {
uint16_t sum;
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
sum = GET_BE_U_2(bp);
if (ndo->ndo_vflag)
ND_PRINT(", sum 0x%x", sum);
bp += 2;
len -= 2;
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
ND_PRINT(", off 0x%x", GET_BE_U_2(bp));
bp += 2;
len -= 2;
}
if (flags & GRE_KP) {
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
ND_PRINT(", key=0x%x", GET_BE_U_4(bp));
bp += 4;
len -= 4;
}
if (flags & GRE_SP) {
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
ND_PRINT(", seq %u", GET_BE_U_4(bp));
bp += 4;
len -= 4;
uint8_t sreoff;
uint8_t srelen;
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
af = GET_BE_U_2(bp);
sreoff = GET_U_1(bp + 2);
srelen = GET_U_1(bp + 3);
if (!gre_sre_print(ndo, af, sreoff, srelen, bp, len))
goto invalid;
- ND_LCHECK_U(len, srelen);
+ ND_ICHECK_U(len, <, srelen);
bp += srelen;
len -= srelen;
}
u_int len = length;
uint16_t flags, prot;
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
flags = GET_BE_U_2(bp);
len -= 2;
bp += 2;
ND_PRINT(", Flags [%s]",
bittok2str(gre_flag_values,"none",flags));
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
prot = GET_BE_U_2(bp);
len -= 2;
bp += 2;
if (flags & GRE_KP) {
uint32_t k;
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
k = GET_BE_U_4(bp);
ND_PRINT(", call %u", k & 0xffff);
len -= 4;
}
if (flags & GRE_SP) {
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
ND_PRINT(", seq %u", GET_BE_U_4(bp));
bp += 4;
len -= 4;
}
if (flags & GRE_AP) {
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
ND_PRINT(", ack %u", GET_BE_U_4(bp));
bp += 4;
len -= 4;
}
while (srelen != 0) {
- ND_LCHECK_U(len, 4);
+ ND_ICHECK_U(len, <, 4);
ND_TCHECK_LEN(bp, sizeof(nd_ipv4));
addrtostr(bp, buf, sizeof(buf));
}
while (srelen != 0) {
- ND_LCHECK_U(len, 2);
+ ND_ICHECK_U(len, <, 2);
ND_PRINT(" %s%x",
((bp - up) == sreoff) ? "*" : "", GET_BE_U_2(bp));