*/
#define TLV_TCHECK(minlen) \
- ND_TCHECK_LEN(tptr, minlen); if (tlv_tlen < minlen) goto badtlv;
+ if (tlv_tlen < minlen) { \
+ ND_PRINT(" [tlv length %u < %u]", tlv_tlen, minlen); \
+ nd_print_invalid(ndo); \
+ goto invalid; \
+ }
static u_int
ldp_tlv_print(netdissect_options *ndo,
case LDP_TLV_IPV4_TRANSPORT_ADDR:
TLV_TCHECK(4);
- ND_PRINT("\n\t IPv4 Transport Address: %s", ipaddr_string(ndo, tptr));
+ ND_PRINT("\n\t IPv4 Transport Address: %s", GET_IPADDR_STRING(tptr));
break;
case LDP_TLV_IPV6_TRANSPORT_ADDR:
TLV_TCHECK(16);
- ND_PRINT("\n\t IPv6 Transport Address: %s", ip6addr_string(ndo, tptr));
+ ND_PRINT("\n\t IPv6 Transport Address: %s", GET_IP6ADDR_STRING(tptr));
break;
case LDP_TLV_CONFIG_SEQ_NUMBER:
TLV_TCHECK(4);
switch (af) {
case AFNUM_INET:
while(tlv_tlen >= sizeof(nd_ipv4)) {
- ND_TCHECK_LEN(tptr, sizeof(nd_ipv4));
- ND_PRINT(" %s", ipaddr_string(ndo, tptr));
+ ND_PRINT(" %s", GET_IPADDR_STRING(tptr));
tlv_tlen-=sizeof(nd_ipv4);
tptr+=sizeof(nd_ipv4);
}
break;
case AFNUM_INET6:
while(tlv_tlen >= sizeof(nd_ipv6)) {
- ND_TCHECK_LEN(tptr, sizeof(nd_ipv6));
- ND_PRINT(" %s", ip6addr_string(ndo, tptr));
+ ND_PRINT(" %s", GET_IP6ADDR_STRING(tptr));
tlv_tlen-=sizeof(nd_ipv6);
tptr+=sizeof(nd_ipv6);
}
case LDP_FEC_PREFIX:
TLV_TCHECK(2);
af = GET_BE_U_2(tptr);
- tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
- tlv_tlen-=LDP_TLV_ADDRESS_LIST_AFNUM_LEN;
+ tptr+=2;
+ tlv_tlen-=2;
if (af == AFNUM_INET) {
i=decode_prefix4(ndo, tptr, tlv_tlen, buf, sizeof(buf));
if (i == -2)
break;
case LDP_TLV_FT_SESSION:
- TLV_TCHECK(8);
+ TLV_TCHECK(12);
ft_flags = GET_BE_U_2(tptr);
ND_PRINT("\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]",
ft_flags&0x8000 ? "" : "No ",
ft_flags&0x4 ? "" : "No ",
ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels",
ft_flags&0x1 ? "" : "Don't ");
+ /* 16 bits (FT Flags) + 16 bits (Reserved) */
tptr+=4;
ui = GET_BE_U_4(tptr);
if (ui)
nd_print_trunc(ndo);
return 0;
-badtlv:
- ND_PRINT("\n\t\t TLV contents go past end of TLV");
+invalid:
return(tlv_len+4); /* Type & Length fields not included */
}
/* print the LSR-ID, label-space & length */
ND_PRINT("%sLDP, Label-Space-ID: %s:%u, pdu-length: %u",
(ndo->ndo_vflag < 1) ? "" : "\n\t",
- ipaddr_string(ndo, ldp_com_header->lsr_id),
+ GET_IPADDR_STRING(ldp_com_header->lsr_id),
GET_BE_U_2(ldp_com_header->label_space),
pdu_len);