#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},
#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[] = {
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;
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)
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;
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);
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;