diff options
author | Jamal Hadi Salim <jhs@mojatatu.com> | 2013-07-15 18:28:36 -0400 |
---|---|---|
committer | Michael Richardson <mcr@sandelman.ca> | 2013-07-16 09:38:25 -0400 |
commit | ec92c2539fb4c2d2a4b0e17253b4edea54fd4f7f (patch) | |
tree | 1cad80c6e771ecccf3e5878e97046ccbb1137e4c /print-forces.c | |
parent | 93e641bdc0eef4ecebdaf7d553c7766110b907b9 (diff) | |
download | tcpdump-ec92c2539fb4c2d2a4b0e17253b4edea54fd4f7f.tar.gz |
Add support for getting table ranges Fixup get by key formatting while at it
Diffstat (limited to 'print-forces.c')
-rw-r--r-- | print-forces.c | 64 |
1 files changed, 63 insertions, 1 deletions
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; |