summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-mpls.c
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2004-03-31 09:17:26 +0000
committerbms <bms@FreeBSD.org>2004-03-31 09:17:26 +0000
commit281e9d71408deb6e8c5046c746c2e97002b0e7fe (patch)
treeeb08e08f0f875c3b16f8e1aec86091f100906f1c /contrib/tcpdump/print-mpls.c
parentbe6faec6d07fc3a2a54836e76d0309c36192dfad (diff)
downloadFreeBSD-src-281e9d71408deb6e8c5046c746c2e97002b0e7fe.zip
FreeBSD-src-281e9d71408deb6e8c5046c746c2e97002b0e7fe.tar.gz
Import tcpdump 3.8.3, from http://www.tcpdump.org/releases/tcpdump-3.8.3.tar.gz
Diffstat (limited to 'contrib/tcpdump/print-mpls.c')
-rw-r--r--contrib/tcpdump/print-mpls.c106
1 files changed, 89 insertions, 17 deletions
diff --git a/contrib/tcpdump/print-mpls.c b/contrib/tcpdump/print-mpls.c
index ed7defb..6e936c8 100644
--- a/contrib/tcpdump/print-mpls.c
+++ b/contrib/tcpdump/print-mpls.c
@@ -27,24 +27,19 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.2.4.1 2002/05/07 18:36:28 fenner Exp $ (LBL)";
+static const char rcsid[] _U_ =
+ "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.8.2.2 2003/11/16 08:51:34 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
+#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include "addrtoname.h"
#include "interface.h"
@@ -87,15 +82,14 @@ mpls_print(const u_char *bp, u_int length)
TCHECK2(*p, sizeof(v));
v = EXTRACT_32BITS(p);
printf(" ("); /*)*/
- printf("label 0x%x", MPLS_LABEL(v));
+ printf("label %u", MPLS_LABEL(v));
if (vflag &&
MPLS_LABEL(v) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
- printf("(%s)", mpls_labelname[MPLS_LABEL(v)]);
- if (MPLS_EXP(v))
- printf(" exp 0x%x", MPLS_EXP(v));
+ printf(" (%s)", mpls_labelname[MPLS_LABEL(v)]);
+ printf(", exp %u", MPLS_EXP(v));
if (MPLS_STACK(v))
- printf("[S]");
- printf(" TTL %u", MPLS_TTL(v));
+ printf(", [S]");
+ printf(", ttl %u", MPLS_TTL(v));
/*(*/
printf(")");
@@ -104,6 +98,7 @@ mpls_print(const u_char *bp, u_int length)
switch (MPLS_LABEL(v)) {
case 0: /* IPv4 explicit NULL label */
+ case 3: /* IPv4 implicit NULL label */
ip_print(p, length - (p - bp));
break;
#ifdef INET6
@@ -113,12 +108,89 @@ mpls_print(const u_char *bp, u_int length)
#endif
default:
/*
- * Since there's no indication of protocol in MPLS label
- * encoding, we can print nothing further.
+ * Generally there's no indication of protocol in MPLS label
+ * encoding, however draft-hsmit-isis-aal5mux-00.txt describes
+ * a technique that looks at the first payload byte if the BOS (bottom of stack)
+ * bit is set and tries to determine the network layer protocol
+ * 0x45-0x4f is IPv4
+ * 0x60-0x6f is IPv6
+ * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS)
+ * this technique is sometimes known as NULL encapsulation
+ * and decoding is particularly useful for control-plane traffic [BGP]
+ * which cisco by default sends MPLS encapsulated
*/
- return;
+
+ if (MPLS_STACK(v)) { /* only do this if the stack bit is set */
+ switch(*p) {
+ case 0x45:
+ case 0x46:
+ case 0x47:
+ case 0x48:
+ case 0x49:
+ case 0x4a:
+ case 0x4b:
+ case 0x4c:
+ case 0x4d:
+ case 0x4e:
+ case 0x4f:
+ if (vflag>0) {
+ printf("\n\t");
+ ip_print(p, length - (p - bp));
+ }
+ else printf(", IP, length: %u",length);
+ break;
+#ifdef INET6
+ case 0x60:
+ case 0x61:
+ case 0x62:
+ case 0x63:
+ case 0x64:
+ case 0x65:
+ case 0x66:
+ case 0x67:
+ case 0x68:
+ case 0x69:
+ case 0x6a:
+ case 0x6b:
+ case 0x6c:
+ case 0x6d:
+ case 0x6e:
+ case 0x6f:
+ if (vflag>0) {
+ printf("\n\t");
+ ip6_print(p, length - (p - bp));
+ }
+ else printf(", IPv6, length: %u",length);
+ break;
+#endif
+ case 0x81:
+ case 0x82:
+ case 0x83:
+ if (vflag>0) {
+ printf("\n\t");
+ isoclns_print(p, length - (p - bp), length - (p - bp));
+ }
+ else printf(", OSI, length: %u",length);
+ break;
+ default:
+ /* ok bail out - we did not figure out what it is*/
+ break;
+ }
+ }
+ return;
}
trunc:
printf("[|MPLS]");
}
+
+/*
+ * draft-ietf-mpls-lsp-ping-02.txt
+ */
+void
+mpls_lsp_ping_print(const u_char *pptr, u_int length)
+{
+ printf("UDP, LSP-PING, length: %u", length);
+ if (vflag >1)
+ print_unknown_data(pptr,"\n\t ", length);
+}
OpenPOWER on IntegriCloud