tcpdump mailing list archives
Various diffs for more complete LDP decoding
From: sthaug () nethelp no
Date: Thu, 27 May 2004 20:04:38 +0200
Below are patches to perform significantly more complete LDP decoding. Synposis: - Minor diff to print-tcp.c (actually call the LDP decoder) - Minor diff to print-bgp.c (unstaticize routines used by print-ldp.c) - Major diff to print-ldp.c Hannes: I'd be happy to decode even more if you can get me some LDP traces which utilize more of the LDP functionality. Steinar Haug, Nethelp consulting, sthaug () nethelp no
--- print-bgp.c.orig Mon May 17 14:10:05 2004
+++ print-bgp.c Thu May 27 17:49:19 2004
@@ -460,7 +460,7 @@
{ 0, NULL},
};
-static int
+int
decode_prefix4(const u_char *pptr, char *buf, u_int buflen)
{
struct in_addr addr;
@@ -688,7 +688,7 @@
}
#ifdef INET6
-static int
+int
decode_prefix6(const u_char *pd, char *buf, u_int buflen)
{
struct in6_addr addr;
--- print-tcp.c.orig Mon Apr 26 08:17:31 2004
+++ print-tcp.c Thu May 27 19:56:11 2004
@@ -650,8 +650,9 @@
} else if (sport == MSDP_PORT || dport == MSDP_PORT) {
msdp_print(bp, length);
}
- else if (sport == LDP_PORT || dport == LDP_PORT)
- printf(": LDP, length: %u", length);
+ else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) {
+ ldp_print(bp, length);
+ }
}
return;
bad:
--- print-ldp.c.orig Sun Nov 16 10:36:27 2003
+++ print-ldp.c Thu May 27 19:32:41 2004
@@ -11,6 +11,7 @@
* FOR A PARTICULAR PURPOSE.
*
* Original code by Hannes Gredler (hannes () juniper net)
+ * and Steinar Haug (sthaug () nethelp no)
*/
#ifndef lint
@@ -142,6 +143,7 @@
#define LDP_TLV_COMMON_SESSION 0x0500
#define LDP_TLV_ATM_SESSION_PARM 0x0501
#define LDP_TLV_FR_SESSION_PARM 0x0502
+#define LDP_TLV_FT_SESSION 0x0503
#define LDP_TLV_LABEL_REQUEST_MSG_ID 0x0600
static const struct tok ldp_tlv_values[] = {
@@ -163,10 +165,56 @@
{ 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_FT_SESSION, "Fault-Tolerant Session Parameters" },
{ LDP_TLV_LABEL_REQUEST_MSG_ID, "Label Request Message ID" },
{ 0, NULL}
};
+#define LDP_FEC_WILDCARD 0x01
+#define LDP_FEC_PREFIX 0x02
+#define LDP_FEC_HOSTADDRESS 0x03
+/* From draft-martini-l2circuit-trans-mpls-13.txt */
+#define LDP_FEC_MARTINI_VC 0x80
+
+static const struct tok ldp_fec_values[] = {
+ { LDP_FEC_WILDCARD, "Wildcard" },
+ { LDP_FEC_PREFIX, "Prefix" },
+ { LDP_FEC_HOSTADDRESS, "Host address" },
+ { LDP_FEC_MARTINI_VC, "Martini VC" },
+ { 0, NULL}
+};
+
+/* From draft-martini-l2circuit-trans-mpls-13.txt */
+#define LDP_MARTINI_VCTYPE_FR_DLCI 0x0001
+#define LDP_MARTINI_VCTYPE_ATM_AAL5 0x0002
+#define LDP_MARTINI_VCTYPE_ATM_CELL 0x0003
+#define LDP_MARTINI_VCTYPE_ETH_VLAN 0x0004
+#define LDP_MARTINI_VCTYPE_ETHERNET 0x0005
+#define LDP_MARTINI_VCTYPE_HDLC 0x0006
+#define LDP_MARTINI_VCTYPE_PPP 0x0007
+#define LDP_MARTINI_VCTYPE_CEM 0x0008
+#define LDP_MARTINI_VCTYPE_ATM_VCC 0x0009
+#define LDP_MARTINI_VCTYPE_ATM_VPC 0x000A
+
+/* Overlaps print-bgp.c bgp_l2vpn_encaps_values */
+static const struct tok ldp_vctype_values[] = {
+ { LDP_MARTINI_VCTYPE_FR_DLCI, "Frame Relay DLCI" },
+ { LDP_MARTINI_VCTYPE_ATM_AAL5, "ATM AAL5 VCC transport" },
+ { LDP_MARTINI_VCTYPE_ATM_CELL, "ATM transparent cell transport" },
+ { LDP_MARTINI_VCTYPE_ETH_VLAN, "Ethernet VLAN" },
+ { LDP_MARTINI_VCTYPE_ETHERNET, "Ethernet" },
+ { LDP_MARTINI_VCTYPE_HDLC, "HDLC" },
+ { LDP_MARTINI_VCTYPE_PPP, "PPP" },
+ { LDP_MARTINI_VCTYPE_CEM, "SONET/SDH Circuit Emulation Service" },
+ { LDP_MARTINI_VCTYPE_ATM_VCC, "ATM VCC cell transport" },
+ { LDP_MARTINI_VCTYPE_ATM_VPC, "ATM VPC cell transport" },
+ { 0, NULL}
+};
+
+/* RFC1700 address family numbers, same definition in print-bgp.c */
+#define AFNUM_INET 1
+#define AFNUM_INET6 2
+
#define FALSE 0
#define TRUE 1
@@ -198,7 +246,11 @@
};
const struct ldp_tlv_header *ldp_tlv_header;
- u_short tlv_type,tlv_len,tlv_tlen;
+ u_short tlv_type,tlv_len,tlv_tlen,af,ft_flags;
+ u_char fec_type,prelen;
+ u_int ui;
+ char buf[100];
+ int i;
ldp_tlv_header = (const struct ldp_tlv_header *)tptr;
tlv_len=EXTRACT_16BITS(ldp_tlv_header->length);
@@ -238,23 +290,121 @@
printf("\n\t Sequence Number: %u", EXTRACT_32BITS(tptr));
break;
+ case LDP_TLV_ADDRESS_LIST:
+ af = EXTRACT_16BITS(tptr);
+ tptr+=2;
+ printf("\n\t Adress Family: ");
+ if (af == AFNUM_INET) {
+ printf("IPv4, addresses:");
+ for (i=0; i<(tlv_tlen-2)/4; i++) {
+ printf(" %s",ipaddr_string(tptr));
+ tptr+=4;
+ }
+ }
+#ifdef INET6
+ else if (af == AFNUM_INET6) {
+ printf("IPv6, addresses:");
+ for (i=0; i<(tlv_tlen-2)/16; i++) {
+ printf(" %s",ip6addr_string(tptr));
+ tptr+=16;
+ }
+ }
+#endif
+ break;
+
+ case LDP_TLV_COMMON_SESSION:
+ printf("\n\t Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]",
+ EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2),
+ (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited",
+ (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled"
+ );
+ break;
+
+ case LDP_TLV_FEC:
+ fec_type = *tptr;
+ printf("\n\t %s FEC (0x%02x)",
+ tok2str(ldp_fec_values, "Unknown", fec_type),
+ fec_type);
+
+ tptr+=1;
+ switch(fec_type) {
+
+ case LDP_FEC_WILDCARD:
+ break;
+ case LDP_FEC_PREFIX:
+ af = EXTRACT_16BITS(tptr);
+ tptr+=2;
+ if (af == AFNUM_INET) {
+ i=decode_prefix4(tptr,buf,sizeof(buf));
+ printf(": IPv4 prefix %s",buf);
+ }
+#ifdef INET6
+ else if (af == AFNUM_INET6) {
+ i=decode_prefix6(tptr,buf,sizeof(buf));
+ printf(": IPv6 prefix %s",buf);
+ }
+#endif
+ break;
+ case LDP_FEC_HOSTADDRESS:
+ break;
+ case LDP_FEC_MARTINI_VC:
+ printf(": %s, %scontrol word, VC %u",
+ tok2str(ldp_vctype_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),
+ EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",
+ EXTRACT_32BITS(tptr+7));
+ break;
+ }
+
+ break;
+
+ case LDP_TLV_GENERIC_LABEL:
+ printf("\n\t Label: %u", EXTRACT_32BITS(tptr) & 0xfffff);
+ break;
+
+ case LDP_TLV_STATUS:
+ ui = EXTRACT_32BITS(tptr);
+ tptr+=4;
+ printf("\n\t Status: 0x%02x, Flags: [%s and %s forward]",
+ ui&0x3fffffff,
+ ui&0x80000000 ? "Fatal error" : "Advisory Notification",
+ ui&0x40000000 ? "do" : "don't");
+ ui = EXTRACT_32BITS(tptr);
+ tptr+=4;
+ if (ui)
+ printf(", causing Message ID: 0x%08x", ui);
+ break;
+
+ case LDP_TLV_FT_SESSION:
+ ft_flags = EXTRACT_16BITS(tptr);
+ printf("\n\t Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]",
+ ft_flags&0x8000 ? "" : "No ",
+ ft_flags&0x8 ? "" : "Don't ",
+ ft_flags&0x4 ? "" : "No ",
+ ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels",
+ ft_flags&0x1 ? "" : "Don't ");
+ tptr+=4;
+ ui = EXTRACT_32BITS(tptr);
+ if (ui)
+ printf(", Reconnect Timeout: %ums", ui);
+ tptr+=4;
+ ui = EXTRACT_32BITS(tptr);
+ if (ui)
+ printf(", Recovery Time: %ums", ui);
+ break;
+
+
/*
* FIXME those are the defined TLVs 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_TLV_EXTD_STATUS:
case LDP_TLV_RETURNED_PDU:
case LDP_TLV_RETURNED_MSG:
- case LDP_TLV_COMMON_SESSION:
case LDP_TLV_ATM_SESSION_PARM:
case LDP_TLV_FR_SESSION_PARM:
case LDP_TLV_LABEL_REQUEST_MSG_ID:
@@ -304,8 +454,8 @@
/* ok they seem to want to know everything - lets fully decode it */
tlen=EXTRACT_16BITS(ldp_com_header->pdu_length);
- tptr+=sizeof(const struct ldp_common_header);
- tlen-=sizeof(const struct ldp_common_header);
+ tptr += sizeof(const struct ldp_common_header);
+ tlen -= sizeof(const struct ldp_common_header)-4; /* Type & Length fields not included */
while(tlen>0) {
/* did we capture enough for fully decoding the msg header ? */
@@ -336,7 +486,12 @@
switch(msg_type) {
+ case LDP_MSG_NOTIF:
case LDP_MSG_HELLO:
+ case LDP_MSG_INIT:
+ case LDP_MSG_KEEPALIVE:
+ case LDP_MSG_ADDRESS:
+ case LDP_MSG_LABEL_MAPPING:
while(msg_tlen >= 4) {
processed = ldp_tlv_print(msg_tptr);
if (processed == 0)
@@ -351,12 +506,7 @@
* you are welcome to contribute code ;-)
*/
- case LDP_MSG_NOTIF:
- 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:
@@ -372,8 +522,8 @@
print_unknown_data(tptr+sizeof(sizeof(struct ldp_msg_header)),"\n\t ",
msg_len);
- tptr+=msg_len;
- tlen-=msg_len;
+ tptr += msg_len+4;
+ tlen -= msg_len+4;
}
return;
trunc:
- This is the tcpdump-workers list. Visit https://lists.sandelman.ca/ to unsubscribe.
Current thread:
- Various diffs for more complete LDP decoding sthaug (May 27)
- Re: Various diffs for more complete LDP decoding Guy Harris (May 27)
