From: hannes Date: Fri, 13 Dec 2002 14:29:24 +0000 (+0000) Subject: cleaned up confusion between LDP Message TLVs and subTLVs which live inside those X-Git-Tag: tcpdump-3.8-bp~268 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/40cb269d4268d2a2e2721ff8d0cf17181d091df0 cleaned up confusion between LDP Message TLVs and subTLVs which live inside those --- diff --git a/print-ldp.c b/print-ldp.c index 25ea9581..2e545299 100644 --- a/print-ldp.c +++ b/print-ldp.c @@ -15,7 +15,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.1 2002-12-13 00:40:35 hannes Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.2 2002-12-13 14:29:24 hannes Exp $"; #endif #ifdef HAVE_CONFIG_H @@ -31,7 +31,6 @@ static const char rcsid[] = #include "interface.h" #include "extract.h" #include "addrtoname.h" -#include "ethertype.h" /* * ldp common header @@ -57,6 +56,71 @@ struct ldp_common_header { #define LDP_VERSION 1 +/* + * ldp message header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |U| Message Type | Message Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Message ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * + + + * | Mandatory Parameters | + * + + + * | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * + + + * | Optional Parameters | + * + + + * | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +struct ldp_msg_header { + u_int8_t type[2]; + u_int8_t length[2]; + u_int8_t id[4]; +}; + +#define LDP_MASK_MSG_TYPE(x) ((x)&0x7fff) +#define LDP_MASK_U_BIT(x) ((x)&0x8000) + +#define LDP_MSG_NOTIF 0x0001 +#define LDP_MSG_HELLO 0x0100 +#define LDP_MSG_INIT 0x0200 +#define LDP_MSG_KEEPALIVE 0x0201 +#define LDP_MSG_ADDRESS 0x0300 +#define LDP_MSG_ADDRESS_WITHDRAW 0x0301 +#define LDP_MSG_LABEL_MAPPING 0x0400 +#define LDP_MSG_LABEL_REQUEST 0x0401 +#define LDP_MSG_LABEL_WITHDRAW 0x0402 +#define LDP_MSG_LABEL_RELEASE 0x0403 +#define LDP_MSG_LABEL_ABORT_REQUEST 0x0404 + +#define LDP_VENDOR_PRIVATE_MIN 0x3e00 +#define LDP_VENDOR_PRIVATE_MAX 0x3eff +#define LDP_EXPERIMENTAL_MIN 0x3f00 +#define LDP_EXPERIMENTAL_MAX 0x3fff + +static const struct tok ldp_msg_values[] = { + { LDP_MSG_NOTIF, "Notification" }, + { LDP_MSG_HELLO, "Hello" }, + { LDP_MSG_INIT, "Initialization" }, + { LDP_MSG_KEEPALIVE, "Keepalive" }, + { LDP_MSG_ADDRESS, "Address" }, + { LDP_MSG_ADDRESS_WITHDRAW, "Address Widthdraw" }, + { LDP_MSG_LABEL_MAPPING, "Label Mapping" }, + { LDP_MSG_LABEL_REQUEST, "Label Request" }, + { LDP_MSG_LABEL_WITHDRAW, "Label Withdraw" }, + { LDP_MSG_LABEL_RELEASE, "Label Release" }, + { LDP_MSG_LABEL_ABORT_REQUEST, "Label Abort Request" }, + { 0, NULL} +}; + /* * ldp tlv header * @@ -80,27 +144,48 @@ struct ldp_tlv_header { }; #define LDP_MASK_TLV_TYPE(x) ((x)&0x3fff) -#define LDP_MASK_TLV_U_BIT(x) ((x)&0x8000) -#define LDP_MASK_TLV_F_BIT(x) ((x)&0x4000) - -#define LDP_TLV_FEC 0x0100 -#define LDP_TLV_ADDRESS_LIST 0x0101 -#define LDP_TLV_HOP_COUNT 0x0103 -#define LDP_TLV_PATH_VECTOR 0x0104 -#define LDP_TLV_GENERIC_LABEL 0x0200 -#define LDP_TLV_ATM_LABEL 0x0201 -#define LDP_TLV_FR_LABEL 0x0202 -#define LDP_TLV_STATUS 0x0300 +#define LDP_MASK_F_BIT(x) ((x)&0x4000) + +#define LDP_TLV_FEC 0x0100 +#define LDP_TLV_ADDRESS_LIST 0x0101 +#define LDP_TLV_HOP_COUNT 0x0103 +#define LDP_TLV_PATH_VECTOR 0x0104 +#define LDP_TLV_GENERIC_LABEL 0x0200 +#define LDP_TLV_ATM_LABEL 0x0201 +#define LDP_TLV_FR_LABEL 0x0202 +#define LDP_TLV_STATUS 0x0300 +#define LDP_TLV_EXTD_STATUS 0x0301 +#define LDP_TLV_RETURNED_PDU 0x0302 +#define LDP_TLV_RETURNED_MSG 0x0303 +#define LDP_TLV_COMMON_HELLO 0x0400 +#define LDP_TLV_IPV4_TRASNPORT_ADDR 0x0401 +#define LDP_TLV_CONFIG_SEQ_NUMBER 0x0402 +#define LDP_TLV_IPV6_TRANSPORT_ADDR 0x0403 +#define LDP_TLV_COMMON_SESSION 0x0500 +#define LDP_TLV_ATM_SESSION_PARM 0x0501 +#define LDP_TLV_FR_SESSION_PARM 0x0502 +#define LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600 static const struct tok ldp_tlv_values[] = { - { LDP_TLV_FEC, "FEC" }, - { LDP_TLV_ADDRESS_LIST, "Address List" }, - { LDP_TLV_HOP_COUNT, "Hop Count" }, - { LDP_TLV_HOP_COUNT, "Path Vector" }, - { LDP_TLV_GENERIC_LABEL, "Generic Label" }, - { LDP_TLV_ATM_LABEL, "ATM Label" }, - { LDP_TLV_FR_LABEL, "Frame-Relay Label" }, - { LDP_TLV_STATUS, "Status" }, + { LDP_TLV_FEC, "FEC" }, + { LDP_TLV_ADDRESS_LIST, "Address List" }, + { LDP_TLV_HOP_COUNT, "Hop Count" }, + { LDP_TLV_PATH_VECTOR, "Path Vector" }, + { LDP_TLV_GENERIC_LABEL, "Generic Label" }, + { LDP_TLV_ATM_LABEL, "ATM Label" }, + { LDP_TLV_FR_LABEL, "Frame-Relay Label" }, + { LDP_TLV_STATUS, "Status" }, + { LDP_TLV_EXTD_STATUS, "Extended Status" }, + { LDP_TLV_RETURNED_PDU, "Returned PDU" }, + { LDP_TLV_RETURNED_MSG, "Returned Message" }, + { LDP_TLV_COMMON_HELLO, "Common Hello Parameters" }, + { LDP_TLV_IPV4_TRASNPORT_ADDR, "IPv4 Transport Address" }, + { LDP_TLV_CONFIG_SEQ_NUMBER, "Configuration Sequence Number" }, + { LDP_TLV_IPV6_TRANSPORT_ADDR, "IPv6 Transport Address" }, + { LDP_TLV_COMMON_SESSION, "Common Session Parameters" }, + { LDP_TLV_ATM_SESSION_PARM, "ATM Session Parameters" }, + { LDP_TLV_FR_SESSION_PARM, "Frame-Relay Session Parameters" }, + { LDP_TLV_LABEL_REQUEST_MSG_ID, "Label Request Message ID" }, { 0, NULL} }; @@ -111,9 +196,10 @@ void ldp_print(register const u_char *pptr, register u_int len) { const struct ldp_common_header *ldp_com_header; - const struct ldp_tlv_header *ldp_tlv_header; - const u_char *tptr,*tlv_tptr; - u_short tlen,tlv_len,tlv_type,tlv_tlen; + const struct ldp_msg_header *ldp_msg_header; + const u_char *tptr,*msg_tptr; + u_short tlen; + u_short msg_len,msg_type,msg_tlen; int hexdump; tptr=pptr; @@ -147,58 +233,63 @@ ldp_print(register const u_char *pptr, register u_int len) { tlen-=sizeof(const struct ldp_common_header); while(tlen>0) { - /* did we capture enough for fully decoding the tlv header ? */ - if (!TTEST2(*tptr, sizeof(struct ldp_tlv_header))) + /* did we capture enough for fully decoding the msg header ? */ + if (!TTEST2(*tptr, sizeof(struct ldp_msg_header))) goto trunc; - ldp_tlv_header = (const struct ldp_tlv_header *)tptr; - tlv_len=EXTRACT_16BITS(ldp_tlv_header->length); - tlv_type=LDP_MASK_TLV_TYPE(EXTRACT_16BITS(ldp_tlv_header->type)); + ldp_msg_header = (const struct ldp_msg_header *)tptr; + msg_len=EXTRACT_16BITS(ldp_msg_header->length); + msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type)); - printf("\n\t %s TLV (0x%04x), length: %u, Flags: [%s and %s forward if unknown]", - tok2str(ldp_tlv_values, + /* FIXME vendor private / experimental check */ + printf("\n\t %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]", + tok2str(ldp_msg_values, "Unknown", - tlv_type), - tlv_type, - tlv_len, - LDP_MASK_TLV_U_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "continue processing" : "ignore all, notify", - LDP_MASK_TLV_F_BIT(EXTRACT_16BITS(&ldp_tlv_header->type)) ? "do" : "don't"); + msg_type), + msg_type, + msg_len, + EXTRACT_32BITS(&ldp_msg_header->id), + LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore all and notify"); - tlv_tptr=tptr+sizeof(struct ldp_tlv_header); - tlv_tlen=tlv_len-sizeof(struct ldp_tlv_header); + msg_tptr=tptr+sizeof(struct ldp_msg_header); + msg_tlen=msg_len-sizeof(struct ldp_msg_header); - /* did we capture enough for fully decoding the object ? */ - if (!TTEST2(*tptr, tlv_len)) + /* did we capture enough for fully decoding the message ? */ + if (!TTEST2(*tptr, msg_len)) goto trunc; hexdump=FALSE; - switch(tlv_type) { + switch(msg_type) { /* - * FIXME those are the defined objects that lack a decoder + * FIXME those are the defined messages that lack a decoder * you are welcome to contribute code ;-) */ - case LDP_TLV_FEC: - case LDP_TLV_ADDRESS_LIST: - case LDP_TLV_HOP_COUNT: - case LDP_TLV_PATH_VECTOR: - case LDP_TLV_GENERIC_LABEL: - case LDP_TLV_ATM_LABEL: - case LDP_TLV_FR_LABEL: - case LDP_TLV_STATUS: + case LDP_MSG_NOTIF: + case LDP_MSG_HELLO: + case LDP_MSG_INIT: + case LDP_MSG_KEEPALIVE: + case LDP_MSG_ADDRESS: + case LDP_MSG_ADDRESS_WITHDRAW: + case LDP_MSG_LABEL_MAPPING: + case LDP_MSG_LABEL_REQUEST: + case LDP_MSG_LABEL_WITHDRAW: + case LDP_MSG_LABEL_RELEASE: + case LDP_MSG_LABEL_ABORT_REQUEST: + default: if (vflag <= 1) - print_unknown_data(tlv_tptr,"\n\t ",tlv_tlen); + print_unknown_data(msg_tptr,"\n\t ",msg_tlen); break; } /* do we want to see an additionally hexdump ? */ if (vflag > 1 || hexdump==TRUE) - print_unknown_data(tptr+sizeof(sizeof(struct ldp_tlv_header)),"\n\t ", - tlv_len-sizeof(struct ldp_tlv_header)); + print_unknown_data(tptr+sizeof(sizeof(struct ldp_msg_header)),"\n\t ", + msg_len-sizeof(struct ldp_msg_header)); - tptr+=tlv_len; - tlen-=tlv_len; + tptr+=msg_len; + tlen-=msg_len; } return; trunc: