summaryrefslogtreecommitdiff
path: root/print-forces.c
diff options
context:
space:
mode:
authorJamal Hadi Salim <jhs@mojatatu.com>2013-07-15 18:28:36 -0400
committerMichael Richardson <mcr@sandelman.ca>2013-07-16 09:38:25 -0400
commitec92c2539fb4c2d2a4b0e17253b4edea54fd4f7f (patch)
tree1cad80c6e771ecccf3e5878e97046ccbb1137e4c /print-forces.c
parent93e641bdc0eef4ecebdaf7d553c7766110b907b9 (diff)
downloadtcpdump-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.c64
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;