summaryrefslogtreecommitdiff
path: root/usr.sbin/tcpdump
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/tcpdump')
-rw-r--r--usr.sbin/tcpdump/Makefile4
-rw-r--r--usr.sbin/tcpdump/interface.h5
-rw-r--r--usr.sbin/tcpdump/print-ether.c9
-rw-r--r--usr.sbin/tcpdump/print-mpls.c113
-rw-r--r--usr.sbin/tcpdump/print-ppp.c11
5 files changed, 134 insertions, 8 deletions
diff --git a/usr.sbin/tcpdump/Makefile b/usr.sbin/tcpdump/Makefile
index 989805fa24b..4c137f35820 100644
--- a/usr.sbin/tcpdump/Makefile
+++ b/usr.sbin/tcpdump/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.47 2005/03/07 16:13:38 reyk Exp $
+# $OpenBSD: Makefile,v 1.48 2005/10/08 19:45:15 canacar Exp $
#
# Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
# The Regents of the University of California. All rights reserved.
@@ -46,7 +46,7 @@ SRCS= tcpdump.c addrtoname.c privsep.c privsep_fdpass.c privsep_pcap.c \
print-etherip.c print-lwres.c print-cdp.c print-pflog.c \
print-pfsync.c pf_print_state.c \
print-udpencap.c print-carp.c \
- print-802_11.c \
+ print-802_11.c print-mpls.c \
gmt2local.c savestr.c setsignal.c
# TCP OS Fingerprinting
diff --git a/usr.sbin/tcpdump/interface.h b/usr.sbin/tcpdump/interface.h
index ec94514e877..fc0272393d3 100644
--- a/usr.sbin/tcpdump/interface.h
+++ b/usr.sbin/tcpdump/interface.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: interface.h,v 1.49 2005/05/28 09:01:52 reyk Exp $ */
+/* $OpenBSD: interface.h,v 1.50 2005/10/08 19:45:15 canacar Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -20,7 +20,7 @@
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/interface.h,v 1.49 2005/05/28 09:01:52 reyk Exp $ (LBL)
+ * @(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/interface.h,v 1.50 2005/10/08 19:45:15 canacar Exp $ (LBL)
*/
#ifndef tcpdump_interface_h
@@ -271,6 +271,7 @@ extern void lwres_print(const u_char *, u_int);
extern void ether_print(const u_char *, u_int);
extern void etherip_print(const u_char *, u_int, const u_char *);
extern void ipcomp_print(const u_char *, u_int, const u_char *);
+extern void mpls_print(const u_char *, u_int);
#ifdef INET6
extern void ip6_print(const u_char *, int);
diff --git a/usr.sbin/tcpdump/print-ether.c b/usr.sbin/tcpdump/print-ether.c
index f8b6d219dd5..cd1a14632b9 100644
--- a/usr.sbin/tcpdump/print-ether.c
+++ b/usr.sbin/tcpdump/print-ether.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-ether.c,v 1.19 2004/01/22 16:18:52 jason Exp $ */
+/* $OpenBSD: print-ether.c,v 1.20 2005/10/08 19:45:15 canacar Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
@@ -22,7 +22,7 @@
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ether.c,v 1.19 2004/01/22 16:18:52 jason Exp $ (LBL)";
+ "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ether.c,v 1.20 2005/10/08 19:45:15 canacar Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -235,6 +235,11 @@ recurse:
ether_macctl(p, length);
return (1);
+ case ETHERTYPE_MPLS:
+ case ETHERTYPE_MPLS_MCAST:
+ mpls_print(p, length);
+ return (1);
+
case ETHERTYPE_LAT:
case ETHERTYPE_SCA:
case ETHERTYPE_MOPRC:
diff --git a/usr.sbin/tcpdump/print-mpls.c b/usr.sbin/tcpdump/print-mpls.c
new file mode 100644
index 00000000000..946ababa612
--- /dev/null
+++ b/usr.sbin/tcpdump/print-mpls.c
@@ -0,0 +1,113 @@
+/* $OpenBSD: print-mpls.c,v 1.1 2005/10/08 19:45:15 canacar Exp $ */
+
+/*
+ * Copyright (c) 2005 Jason L. Wright (jason@thought.net)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "extract.h" /* must come after interface.h */
+
+void
+mpls_print(const u_char *bp, u_int len)
+{
+ u_int32_t tag, label, exp, bottom, ttl;
+
+ again:
+ if (bp + sizeof(tag) > snapend)
+ goto trunc;
+
+ tag = EXTRACT_32BITS(bp);
+ bp += sizeof(tag);
+ len -= sizeof(tag);
+
+ label = (tag >> 12) & 0xfffff;
+ exp = (tag >> 9) & 0x7;
+ bottom = (tag >> 8) & 0x1;
+ ttl = (tag >> 0) & 0xff;
+
+ printf("MPLS(label 0x%x, exp %u, ttl %u) ", label, exp, ttl);
+
+ /* XXX decode "Router Alert Label" */
+
+ if (!bottom)
+ goto again;
+
+ /*
+ * guessing the underlying protocol is about all we can do if
+ * it's not explicitly defined.
+ */
+
+ switch (label) {
+ case 0x00000: /* IPv4 Explicit NULL */
+ ip_print(bp, len);
+ break;
+ case 0x00001: /* Router Alert */
+ /* shouldn't happen at stack bottom */
+ printf("Route-Alert");
+ break;
+ case 0x00002: /* IPv6 Explicit NULL */
+ ip6_print(bp, len);
+ break;
+ case 0x00003: /* Implicit NULL */
+ /* shouldn't happen in the tag stack */
+ printf("Implicit-NULL");
+ break;
+
+ case 0x00004: /* reserved labels */
+ case 0x00005:
+ case 0x00006:
+ case 0x00007:
+ case 0x00008:
+ case 0x00009:
+ case 0x0000a:
+ case 0x0000b:
+ case 0x0000c:
+ case 0x0000d:
+ case 0x0000e:
+ case 0x0000f:
+ break;
+
+ default: /* dunno, guess? */
+ if (len == 0)
+ break;
+ if (bp >= snapend)
+ goto trunc;
+
+ switch (bp[0] & 0xf0) {
+ case 0x40:
+ ip_print(bp, len);
+ break;
+ case 0x60:
+ ip6_print(bp, len);
+ break;
+ }
+ }
+
+ return;
+trunc:
+ printf("[|mpls]");
+}
diff --git a/usr.sbin/tcpdump/print-ppp.c b/usr.sbin/tcpdump/print-ppp.c
index ae006173925..adb416aa3de 100644
--- a/usr.sbin/tcpdump/print-ppp.c
+++ b/usr.sbin/tcpdump/print-ppp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-ppp.c,v 1.15 2004/05/21 05:48:50 brad Exp $ */
+/* $OpenBSD: print-ppp.c,v 1.16 2005/10/08 19:45:15 canacar Exp $ */
/*
* Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
@@ -23,7 +23,7 @@
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ppp.c,v 1.15 2004/05/21 05:48:50 brad Exp $ (LBL)";
+ "@(#) $Header: /cvs/OpenBSD/src/usr.sbin/tcpdump/print-ppp.c,v 1.16 2005/10/08 19:45:15 canacar Exp $ (LBL)";
#endif
#ifdef PPP
@@ -548,6 +548,13 @@ ppp_if_print(user, h, p)
ipx_print((const u_char *)(p + PPP_HDRLEN), length);
break;
+#ifndef PPP_MPLS
+#define PPP_MPLS 0x0281
+#endif
+ case PPP_MPLS:
+ mpls_print((const u_char *)(p + PPP_HDRLEN), length);
+ break;
+
default:
if(!eflag)
ppp_hdlc_print(p, length);