summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorguy <guy>2004-05-27 21:20:49 +0000
committerguy <guy>2004-05-27 21:20:49 +0000
commitf5ad5cff18d246d1f77f21f532ae921d776c5248 (patch)
treec677c18f5cb321a5520fee68de132e1797b33aa3
parent0c6a6e2ada3aba2ee1ffdfc1c1aae3dea9db97fd (diff)
downloadtcpdump-f5ad5cff18d246d1f77f21f532ae921d776c5248.tar.gz
From Steiner Haug: handle LDP-over-TCP, and do more complete LDP
decoding.
-rw-r--r--FILES1
-rw-r--r--INSTALL3
-rw-r--r--decode_prefix.h41
-rw-r--r--print-bgp.c7
-rw-r--r--print-ldp.c183
-rw-r--r--print-tcp.c7
6 files changed, 219 insertions, 23 deletions
diff --git a/FILES b/FILES
index 8b731060..d95347fc 100644
--- a/FILES
+++ b/FILES
@@ -27,6 +27,7 @@ config.sub
configure
configure.in
decnet.h
+decode_prefix.h
enc.h
esp.h
ether.h
diff --git a/INSTALL b/INSTALL
index 341244ba..8183e1ba 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.60 2004-03-17 19:40:41 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/tcpdump/Attic/INSTALL,v 1.61 2004-05-27 21:20:49 guy Exp $ (LBL)
If you have not built libpcap, do so first. See the README
file in this directory for the ftp location.
@@ -69,6 +69,7 @@ config.sub - autoconf support
configure - configure script (run this first)
configure.in - configure script source
decnet.h - DECnet definitions
+decode_prefix.h - Declarations of "decode_prefix{4,6}()"
enc.h - OpenBSD IPsec encapsulation BPF layer definitions
esp.h - IPSEC Encapsulating Security Payload definitions
ether.h - Ethernet definitions
diff --git a/decode_prefix.h b/decode_prefix.h
new file mode 100644
index 00000000..b7384714
--- /dev/null
+++ b/decode_prefix.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 1999 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Extensively modified by Hannes Gredler (hannes@juniper.net) for more
+ * complete BGP support.
+ */
+
+#ifndef tcpdump_decode_prefix_h
+#define tcpdump_decode_prefix_h
+
+extern int decode_prefix4(const u_char *pptr, char *buf, u_int buflen);
+#ifdef INET6
+extern int decode_prefix6(const u_char *pd, char *buf, u_int buflen);
+#endif
+
+#endif
diff --git a/print-bgp.c b/print-bgp.c
index f1c82edb..4cfc39bf 100644
--- a/print-bgp.c
+++ b/print-bgp.c
@@ -36,7 +36,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.83 2004-05-17 12:10:05 hannes Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.84 2004-05-27 21:20:50 guy Exp $";
#endif
#include <tcpdump-stdinc.h>
@@ -45,6 +45,7 @@ static const char rcsid[] _U_ =
#include <string.h>
#include "interface.h"
+#include "decode_prefix.h"
#include "addrtoname.h"
#include "extract.h"
@@ -460,7 +461,7 @@ static struct tok bgp_l2vpn_encaps_values[] = {
{ 0, NULL},
};
-static int
+int
decode_prefix4(const u_char *pptr, char *buf, u_int buflen)
{
struct in_addr addr;
@@ -688,7 +689,7 @@ trunc:
}
#ifdef INET6
-static int
+int
decode_prefix6(const u_char *pd, char *buf, u_int buflen)
{
struct in6_addr addr;
diff --git a/print-ldp.c b/print-ldp.c
index 0fcd9f41..c73022b5 100644
--- a/print-ldp.c
+++ b/print-ldp.c
@@ -11,11 +11,12 @@
* FOR A PARTICULAR PURPOSE.
*
* Original code by Hannes Gredler (hannes@juniper.net)
+ * and Steinar Haug (sthaug@nethelp.no)
*/
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.6 2003-11-16 09:36:27 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ldp.c,v 1.7 2004-05-27 21:20:50 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -29,6 +30,7 @@ static const char rcsid[] _U_ =
#include <string.h>
#include "interface.h"
+#include "decode_prefix.h"
#include "extract.h"
#include "addrtoname.h"
@@ -142,6 +144,7 @@ static const struct tok ldp_msg_values[] = {
#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 +166,56 @@ static const struct tok ldp_tlv_values[] = {
{ 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 +247,11 @@ ldp_tlv_print(register const u_char *tptr) {
};
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;
+ 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 +291,121 @@ ldp_tlv_print(register const u_char *tptr) {
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 +455,8 @@ ldp_print(register const u_char *pptr, register u_int len) {
/* 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 +487,12 @@ ldp_print(register const u_char *pptr, register u_int len) {
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 +507,7 @@ ldp_print(register const u_char *pptr, register u_int len) {
* 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 +523,8 @@ ldp_print(register const u_char *pptr, register u_int len) {
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:
diff --git a/print-tcp.c b/print-tcp.c
index 90f51a4c..d3462063 100644
--- a/print-tcp.c
+++ b/print-tcp.c
@@ -21,7 +21,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.114 2004-04-26 06:17:31 itojun Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.115 2004-05-27 21:20:50 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -650,8 +650,9 @@ tcp_print(register const u_char *bp, register u_int length,
} 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: