From: Jamal Hadi Salim Date: Mon, 15 Jul 2013 22:28:36 +0000 (-0400) Subject: Add support for getting table ranges Fixup get by key formatting while at it X-Git-Tag: tcpdump-4.5.0~57 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/ec92c2539fb4c2d2a4b0e17253b4edea54fd4f7f Add support for getting table ranges Fixup get by key formatting while at it --- diff --git a/forces.h b/forces.h index d41475f9..d389d18c 100644 --- a/forces.h +++ b/forces.h @@ -295,6 +295,7 @@ struct pathdata_h { #define B_SPARD 0x2 #define B_RESTV 0x4 #define B_KEYIN 0x8 +#define B_TRNG 0x20 static const struct optlv_h OPTLV_msg[F_OP_MAX + 1] = { /* F_OP_RSV */ {ZERO_TTLV, 0, "Invalid OPTLV", invoptlv_print}, @@ -379,6 +380,9 @@ static inline int op_valid(u_int16_t op, u_int16_t mask) #define F_TLV_REST 0x0114 #define F_TLV_METD 0x0115 #define F_TLV_REDD 0x0116 +#define F_TLV_TRNG 0x0117 + + #define F_TLV_VNST 0x8000 static const struct tok ForCES_TLV[] = { @@ -592,6 +596,7 @@ int pdata_print(register const u_char * pptr, register u_int len, int prestlv_print(register const u_char * pptr, register u_int len, u_int16_t op_msk, int indent); #define F_SELKEY 1 +#define F_SELTABRANGE 2 struct res_val { u_int8_t result; diff --git a/print-forces.c b/print-forces.c index 673aab9a..ea4226a7 100644 --- a/print-forces.c +++ b/print-forces.c @@ -212,6 +212,8 @@ trunc: return -1; } +#define PTH_DESC_SIZE 12 + int pdatacnt_print(register const u_char * pptr, register u_int len, u_int16_t IDcnt, u_int16_t op_msk, int indent) @@ -226,10 +228,58 @@ pdatacnt_print(register const u_char * pptr, register u_int len, goto trunc; id = EXTRACT_32BITS(pptr); if (vflag >= 3) - printf("%s ID#%02u: %d\n", ib, i + 1, id); + printf("%sID#%02u: %d\n", ib, i + 1, id); len -= 4; pptr += 4; } + + if ((op_msk & B_TRNG) || (op_msk & B_KEYIN)) { + if (len < PTH_DESC_SIZE) { + printf("pathlength %d with key/range too short %d\n", + len, PTH_DESC_SIZE); + return -1; + } + + if (op_msk & B_TRNG) { + u_int32_t starti, endi; + pptr += sizeof(struct forces_tlv); + len -= sizeof(struct forces_tlv); + + starti = EXTRACT_32BITS(pptr); + pptr += 4; + len -= 4; + + endi = EXTRACT_32BITS(pptr); + pptr += 4; + len -= 4; + + if (vflag >= 3) + printf("%sTable range: [%d,%d]\n", ib, starti, endi); + } + + if (op_msk & B_KEYIN) { + struct forces_tlv *keytlv; + u_int16_t tll; + u_int32_t keyid = EXTRACT_32BITS(pptr); + /* skip keyid */ + pptr += 4; + len -= 4; + keytlv = (struct forces_tlv *)pptr; + /* skip header */ + pptr += sizeof(struct forces_tlv); + len -= sizeof(struct forces_tlv); + /* skip key content */ + tll = EXTRACT_16BITS(&keytlv->length) - TLV_HDRL; + pptr += tll; + len -= tll; + if (len < 0) { + printf("Key content too short\n"); + return -1; + } + } + + } + if (len) { const struct forces_tlv *pdtlv = (struct forces_tlv *)pptr; u_int16_t type; @@ -328,6 +378,12 @@ pdata_print(register const u_char * pptr, register u_int len, if (EXTRACT_16BITS(&pdh->pflags) & F_SELKEY) { op_msk |= B_KEYIN; } + + /* Table GET Range operation */ + if (EXTRACT_16BITS(&pdh->pflags) & F_SELTABRANGE) { + op_msk |= B_TRNG; + } + pptr += sizeof(struct pathdata_h); len -= sizeof(struct pathdata_h); idcnt = EXTRACT_16BITS(&pdh->pIDcnt); @@ -339,6 +395,12 @@ pdata_print(register const u_char * pptr, register u_int len, printf("]\n"); return -1; } + + if ((op_msk & B_TRNG) && (op_msk & B_KEYIN)) { + printf("\t\t\tIllegal to have both Table ranges and keys\n"); + return -1; + } + more_pd = pdatacnt_print(pptr, len, idcnt, op_msk, indent); if (more_pd > 0) { int consumed = len - more_pd;