diff options
author | Can Erkin Acar <canacar@cvs.openbsd.org> | 2005-10-08 19:45:16 +0000 |
---|---|---|
committer | Can Erkin Acar <canacar@cvs.openbsd.org> | 2005-10-08 19:45:16 +0000 |
commit | 52c2748aae9d1b6325665abe334bd28e1d27351a (patch) | |
tree | d871d998bf736d6b8f3d6dd7b8c1e8fcb0f7b180 /usr.sbin | |
parent | a2441feeb9b96c1fab71f32be1241ad4aa922be2 (diff) |
Add a best effort mpls decoder. From Jason L. Wright.
Since the encapsulated protocol information is not always
available in the MPLS tag stack. The decoder attempts
to guess the protocol.
ok brad@
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/tcpdump/Makefile | 4 | ||||
-rw-r--r-- | usr.sbin/tcpdump/interface.h | 5 | ||||
-rw-r--r-- | usr.sbin/tcpdump/print-ether.c | 9 | ||||
-rw-r--r-- | usr.sbin/tcpdump/print-mpls.c | 113 | ||||
-rw-r--r-- | usr.sbin/tcpdump/print-ppp.c | 11 |
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); |