diff options
author | fenner <fenner@FreeBSD.org> | 2001-04-03 07:45:48 +0000 |
---|---|---|
committer | fenner <fenner@FreeBSD.org> | 2001-04-03 07:45:48 +0000 |
commit | ace14a2b50f2cc05c079d0b9137b49066dbb1206 (patch) | |
tree | 4953fdd47c44b8ec88d34a4db7b698841365e22f /contrib/tcpdump/print-stp.c | |
parent | 54c4a9c9f2aca2e032cbf41f5eb012e2e9628dd4 (diff) | |
download | FreeBSD-src-ace14a2b50f2cc05c079d0b9137b49066dbb1206.zip FreeBSD-src-ace14a2b50f2cc05c079d0b9137b49066dbb1206.tar.gz |
Virgin import of tcpdump.org tcpdump v3.6.2
Diffstat (limited to 'contrib/tcpdump/print-stp.c')
-rw-r--r-- | contrib/tcpdump/print-stp.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/contrib/tcpdump/print-stp.c b/contrib/tcpdump/print-stp.c new file mode 100644 index 0000000..9281663 --- /dev/null +++ b/contrib/tcpdump/print-stp.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2000 Lennert Buytenhek + * + * This software may be distributed either under the terms of the + * BSD-style license that accompanies tcpdump or the GNU General + * Public License + * + * Format and print IEEE 802.1d spanning tree protocol packets. + * Contributed by Lennert Buytenhek <buytenh@gnu.org> + */ + +#ifndef lint +static const char rcsid[] = + "@(#) $Header: /tcpdump/master/tcpdump/print-stp.c,v 1.6 2000/09/29 04:58:50 guy Exp $"; +#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 <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "interface.h" +#include "addrtoname.h" +#include "extract.h" + +static void +stp_print_bridge_id(const u_char *p) +{ + printf("%.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); +} + +static void +stp_print_config_bpdu(const u_char *p, u_int length) +{ + printf("config "); + if (p[7] & 1) + printf("TOP_CHANGE "); + if (p[7] & 0x80) + printf("TOP_CHANGE_ACK "); + + stp_print_bridge_id(p+20); + printf(".%.2x%.2x ", p[28], p[29]); + + printf("root "); + stp_print_bridge_id(p+8); + + printf(" pathcost %i ", (p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]); + + printf("age %i ", p[30]); + printf("max %i ", p[32]); + printf("hello %i ", p[34]); + printf("fdelay %i ", p[36]); +} + +static void +stp_print_tcn_bpdu(const u_char *p, u_int length) +{ + printf("tcn"); +} + +/* + * Print 802.1d packets. + */ +void +stp_print(const u_char *p, u_int length) +{ + if (length < 7) + goto trunc; + + printf("802.1d "); + if (p[2] != 0x03 || p[3] || p[4] || p[5]) { + printf("unknown version"); + return; + } + + switch (p[6]) + { + case 0: + if (length < 10) + goto trunc; + stp_print_config_bpdu(p, length); + break; + + case 1: + stp_print_tcn_bpdu(p, length); + break; + + default: + printf("unknown type %i\n", p[6]); + break; + } + + return; +trunc: + printf("[|stp %d]", length); +} |