Add trunc and truncf.
[dragonfly.git] / contrib / tcpdump-3.9 / print-stp.c
1 /*
2  * Copyright (c) 2000 Lennert Buytenhek
3  *
4  * This software may be distributed either under the terms of the
5  * BSD-style license that accompanies tcpdump or the GNU General
6  * Public License
7  *
8  * Format and print IEEE 802.1d spanning tree protocol packets.
9  * Contributed by Lennert Buytenhek <buytenh@gnu.org>
10  */
11
12 #ifndef lint
13 static const char rcsid[] _U_ =
14     "@(#) $Header: /tcpdump/master/tcpdump/print-stp.c,v 1.13.2.1 2005/04/26 07:27:17 guy Exp $";
15 #endif
16
17 #ifdef HAVE_CONFIG_H
18 #include "config.h"
19 #endif
20
21 #include <tcpdump-stdinc.h>
22
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26
27 #include "interface.h"
28 #include "addrtoname.h"
29 #include "extract.h"
30
31 static void
32 stp_print_bridge_id(const u_char *p)
33 {
34         printf("%.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
35                p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
36 }
37
38 static void
39 stp_print_config_bpdu(const u_char *p)
40 {
41         printf("config ");
42         if (p[4] & 1)
43                 printf("TOP_CHANGE ");
44         if (p[4] & 0x80)
45                 printf("TOP_CHANGE_ACK ");
46
47         stp_print_bridge_id(p+17);
48         printf(".%.2x%.2x ", p[25], p[26]);
49
50         printf("root ");
51         stp_print_bridge_id(p+5);
52
53         printf(" pathcost %i ", (p[13] << 24) | (p[14] << 16) | (p[15] << 8) | p[16]);
54
55         printf("age %i ", p[27]);
56         printf("max %i ", p[29]);
57         printf("hello %i ", p[31]);
58         printf("fdelay %i ", p[33]);
59 }
60
61 static void
62 stp_print_tcn_bpdu(void)
63 {
64         printf("tcn");
65 }
66
67 /*
68  * Print 802.1d packets.
69  */
70 void
71 stp_print(const u_char *p, u_int length)
72 {
73         if (length < 4)
74                 goto trunc;
75
76         printf("802.1d ");
77         if (p[0] || p[1] || p[2]) {
78                 printf("unknown version");
79                 return;
80         }
81
82         switch (p[3])
83         {
84         case 0x00:
85                 if (length < 10)
86                         goto trunc;
87                 stp_print_config_bpdu(p);
88                 break;
89
90         case 0x80:
91                 stp_print_tcn_bpdu();
92                 break;
93
94         default:
95                 printf("unknown type %i", p[3]);
96                 break;
97         }
98
99         return;
100 trunc:
101         printf("[|stp %d]", length);
102 }