diff options
Diffstat (limited to 'usr.sbin/tcpdump')
-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); |