rc = ops->print((const u_char *)pdtlv,
tll + pad + TLV_HDRL, op_msk,
indent + 2);
+ len -= (TLV_HDRL + pad + tll);
} else {
printf("Invalid path data content type 0x%x len %d\n",
type, EXTRACT_16BITS(&pdtlv->length));
}
}
}
- return 0;
+ return len;
trunc:
fputs("[|forces]", stdout);
const struct pathdata_h *pdh = (struct pathdata_h *)pptr;
char *ib = indent_pr(indent, 0);
u_int minsize = 0;
+ int more_pd = 0;
+ u_int32_t idcnt = 0;
TCHECK(*pdh);
if (len < sizeof(struct pathdata_h))
}
pptr += sizeof(struct pathdata_h);
len -= sizeof(struct pathdata_h);
- minsize = EXTRACT_16BITS(&pdh->pIDcnt) * 4;
+ idcnt = EXTRACT_16BITS(&pdh->pIDcnt);
+ minsize = idcnt * 4;
if (len < minsize) {
printf("\t\t\ttruncated IDs expected %uB got %uB\n", minsize,
len);
printf("]\n");
return -1;
}
- return pdatacnt_print(pptr, len, EXTRACT_16BITS(&pdh->pIDcnt), op_msk, indent);
+ more_pd = pdatacnt_print(pptr, len, idcnt, op_msk, indent);
+ if (more_pd > 0) {
+ int consumed = len - more_pd;
+ pptr += consumed;
+ len = more_pd;
+ /* XXX: Argh, recurse some more */
+ return recpdoptlv_print(pptr, len, op_msk, indent+1);
+ } else
+ return 0;
trunc:
fputs("[|forces]", stdout);