X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/f893dc1e89bfde3d92f337e57dc186eb975eeab5..b27cfa512597cf1af8fc318c28d24a69a17b60de:/print-ldp.c diff --git a/print-ldp.c b/print-ldp.c index 3792a471..b16e989f 100644 --- a/print-ldp.c +++ b/print-ldp.c @@ -16,9 +16,7 @@ /* \summary: Label Distribution Protocol (LDP) printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -29,7 +27,6 @@ #include "l2vpn.h" #include "af.h" - /* * ldp common header * @@ -142,6 +139,7 @@ static const struct tok ldp_msg_values[] = { #define LDP_TLV_ATM_SESSION_PARM 0x0501 #define LDP_TLV_FR_SESSION_PARM 0x0502 #define LDP_TLV_FT_SESSION 0x0503 +#define LDP_TLV_TYPED_WC_FEC_CAP 0x050b /* rfc 5918 */ #define LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600 #define LDP_TLV_MTU 0x0601 /* rfc 3988 */ #define LDP_TLV_DUAL_STACK_CAP 0x0701 /* rfc 7552 */ @@ -166,6 +164,7 @@ static const struct tok ldp_tlv_values[] = { { LDP_TLV_ATM_SESSION_PARM, "ATM Session Parameters" }, { LDP_TLV_FR_SESSION_PARM, "Frame-Relay Session Parameters" }, { LDP_TLV_FT_SESSION, "Fault-Tolerant Session Parameters" }, + { LDP_TLV_TYPED_WC_FEC_CAP, "Typed Wildcard FEC Capability" }, { LDP_TLV_LABEL_REQUEST_MSG_ID, "Label Request Message ID" }, { LDP_TLV_MTU, "MTU" }, { LDP_TLV_DUAL_STACK_CAP, "Dual-Stack Capability" }, @@ -273,13 +272,6 @@ static u_int ldp_pdu_print(netdissect_options *, const u_char *); * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ -#define TLV_TCHECK(minlen) \ - 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, const u_char *tptr, @@ -322,7 +314,7 @@ ldp_tlv_print(netdissect_options *ndo, switch(tlv_type) { case LDP_TLV_COMMON_HELLO: - TLV_TCHECK(4); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); ND_PRINT("\n\t Hold Time: %us, Flags: [%s Hello%s]", GET_BE_U_2(tptr), (GET_BE_U_2(tptr + 2)&0x8000) ? "Targeted" : "Link", @@ -330,20 +322,21 @@ ldp_tlv_print(netdissect_options *ndo, break; case LDP_TLV_IPV4_TRANSPORT_ADDR: - TLV_TCHECK(4); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); ND_PRINT("\n\t IPv4 Transport Address: %s", GET_IPADDR_STRING(tptr)); break; case LDP_TLV_IPV6_TRANSPORT_ADDR: - TLV_TCHECK(16); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 16); ND_PRINT("\n\t IPv6 Transport Address: %s", GET_IP6ADDR_STRING(tptr)); break; case LDP_TLV_CONFIG_SEQ_NUMBER: - TLV_TCHECK(4); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); ND_PRINT("\n\t Sequence Number: %u", GET_BE_U_4(tptr)); break; case LDP_TLV_ADDRESS_LIST: - TLV_TCHECK(LDP_TLV_ADDRESS_LIST_AFNUM_LEN); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, + LDP_TLV_ADDRESS_LIST_AFNUM_LEN); af = GET_BE_U_2(tptr); tptr+=LDP_TLV_ADDRESS_LIST_AFNUM_LEN; tlv_tlen -= LDP_TLV_ADDRESS_LIST_AFNUM_LEN; @@ -370,8 +363,25 @@ ldp_tlv_print(netdissect_options *ndo, } break; + case LDP_TLV_HOP_COUNT: + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 1); + ND_PRINT("\n\t Hop Count: %u", GET_U_1(tptr)); + break; + + case LDP_TLV_PATH_VECTOR: + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); + ND_PRINT("\n\t Path Vector: %s", GET_IPADDR_STRING(tptr)); + tptr += 4; + tlv_tlen -= 4; + while (tlv_tlen >= 4) { + ND_PRINT(", %s", GET_IPADDR_STRING(tptr)); + tptr += 4; + tlv_tlen -= 4; + } + break; + case LDP_TLV_COMMON_SESSION: - TLV_TCHECK(14); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 14); ND_PRINT("\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]", GET_BE_U_2(tptr), GET_BE_U_2(tptr + 2), (GET_BE_U_2(tptr + 4)&0x8000) ? "On Demand" : "Unsolicited", @@ -386,7 +396,7 @@ ldp_tlv_print(netdissect_options *ndo, break; case LDP_TLV_FEC: - TLV_TCHECK(1); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 1); fec_type = GET_U_1(tptr); ND_PRINT("\n\t %s FEC (0x%02x)", tok2str(ldp_fec_values, "Unknown", fec_type), @@ -399,7 +409,7 @@ ldp_tlv_print(netdissect_options *ndo, case LDP_FEC_WILDCARD: break; case LDP_FEC_PREFIX: - TLV_TCHECK(2); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 2); af = GET_BE_U_2(tptr); tptr+=2; tlv_tlen-=2; @@ -433,7 +443,7 @@ ldp_tlv_print(netdissect_options *ndo, * We assume the type was supposed to be one of the MPLS * Pseudowire Types. */ - TLV_TCHECK(7); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 7); vc_info_len = GET_U_1(tptr + 2); /* @@ -451,7 +461,7 @@ ldp_tlv_print(netdissect_options *ndo, } /* Make sure we have the VC ID as well */ - TLV_TCHECK(11); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 11); ND_PRINT(": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u", tok2str(mpls_pw_types_values, "Unknown", GET_BE_U_2(tptr)&0x7fff), GET_BE_U_2(tptr)&0x8000 ? "" : "no ", @@ -468,7 +478,7 @@ ldp_tlv_print(netdissect_options *ndo, /* Skip past the fixed information and the VC ID */ tptr+=11; tlv_tlen-=11; - TLV_TCHECK(vc_info_len); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, vc_info_len); while (vc_info_len > 2) { vc_info_tlv_type = GET_U_1(tptr); @@ -517,12 +527,12 @@ ldp_tlv_print(netdissect_options *ndo, break; case LDP_TLV_GENERIC_LABEL: - TLV_TCHECK(4); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); ND_PRINT("\n\t Label: %u", GET_BE_U_4(tptr) & 0xfffff); break; case LDP_TLV_STATUS: - TLV_TCHECK(10); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 10); ui = GET_BE_U_4(tptr); tptr+=4; ND_PRINT("\n\t Status Code: %s, Flags: [%s and %s forward]", @@ -535,12 +545,11 @@ ldp_tlv_print(netdissect_options *ndo, ND_PRINT(", causing Message ID: 0x%08x", ui); ui = GET_BE_U_2(tptr); if (ui) - ND_PRINT(", Message ID: %s", tok2str(ldp_msg_values, "Unknown", ui)); - + ND_PRINT(", Message Type: %s", tok2str(ldp_msg_values, "Unknown", ui)); break; case LDP_TLV_FT_SESSION: - TLV_TCHECK(12); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 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 ", @@ -559,13 +568,18 @@ ldp_tlv_print(netdissect_options *ndo, ND_PRINT(", Recovery Time: %ums", ui); break; + case LDP_TLV_TYPED_WC_FEC_CAP: + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 1); + ND_PRINT("\n\t %s", GET_U_1(tptr)&0x80 ? "Support" : "No Support"); + break; + case LDP_TLV_MTU: - TLV_TCHECK(2); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 2); ND_PRINT("\n\t MTU: %u", GET_BE_U_2(tptr)); break; case LDP_TLV_DUAL_STACK_CAP: - TLV_TCHECK(4); + ND_ICHECKMSG_U("tlv length", tlv_tlen, <, 4); transport_pref = GET_U_1(tptr); ND_PRINT("\n\t Transport Connection Preference: %s", tok2str(ldp_dual_stack_transport_pref_values, @@ -573,14 +587,11 @@ ldp_tlv_print(netdissect_options *ndo, transport_pref)); break; - /* * FIXME those are the defined TLVs that lack a decoder * you are welcome to contribute code ;-) */ - case LDP_TLV_HOP_COUNT: - case LDP_TLV_PATH_VECTOR: case LDP_TLV_ATM_LABEL: case LDP_TLV_FR_LABEL: case LDP_TLV_EXTD_STATUS: @@ -601,6 +612,7 @@ trunc: nd_trunc_longjmp(ndo); invalid: + nd_print_invalid(ndo); return(tlv_len+4); /* Type & Length fields not included */ } @@ -675,7 +687,7 @@ ldp_pdu_print(netdissect_options *ndo, tptr = pptr + sizeof(struct ldp_common_header); tlen = pdu_len - (sizeof(struct ldp_common_header)-4); /* Type & Length fields not included */ - while(tlen>0) { + while(tlen != 0) { /* did we capture enough for fully decoding the msg header ? */ ND_TCHECK_LEN(tptr, sizeof(struct ldp_msg_header));