source: rtems-libbsd/freebsd/contrib/tcpdump/print-mpls.c @ 084d4db

4.11
Last change on this file since 084d4db was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100644
File size: 5.4 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
2
3/*
4 * Copyright (C) 2001 WIDE Project.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of the project nor the names of its contributors
15 *    may be used to endorse or promote products derived from this software
16 *    without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#ifndef lint
32static const char rcsid[] _U_ =
33    "@(#) $Header: /tcpdump/master/tcpdump/print-mpls.c,v 1.14 2005-07-05 09:38:19 hannes Exp $ (LBL)";
34#endif
35
36#ifdef HAVE_CONFIG_H
37#include "config.h"
38#endif
39
40#include <tcpdump-stdinc.h>
41
42#include <stdio.h>
43#include <stdlib.h>
44#include <string.h>
45
46#include "addrtoname.h"
47#include "interface.h"
48#include "extract.h"                    /* must come after interface.h */
49#include "mpls.h"
50
51static const char *mpls_labelname[] = {
52/*0*/   "IPv4 explicit NULL", "router alert", "IPv6 explicit NULL",
53        "implicit NULL", "rsvd",
54/*5*/   "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
55/*10*/  "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
56/*15*/  "rsvd",
57};
58
59enum mpls_packet_type {
60        PT_UNKNOWN,
61        PT_IPV4,
62        PT_IPV6,
63        PT_OSI
64};
65
66/*
67 * RFC3032: MPLS label stack encoding
68 */
69void
70mpls_print(const u_char *bp, u_int length)
71{
72        const u_char *p;
73        u_int32_t label_entry;
74        u_int16_t label_stack_depth = 0;
75        enum mpls_packet_type pt = PT_UNKNOWN;
76
77        p = bp;
78        printf("MPLS");
79        do {
80                TCHECK2(*p, sizeof(label_entry));
81                label_entry = EXTRACT_32BITS(p);
82                printf("%s(label %u",
83                       (label_stack_depth && vflag) ? "\n\t" : " ",
84                       MPLS_LABEL(label_entry));
85                label_stack_depth++;
86                if (vflag &&
87                    MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
88                        printf(" (%s)", mpls_labelname[MPLS_LABEL(label_entry)]);
89                printf(", exp %u", MPLS_EXP(label_entry));
90                if (MPLS_STACK(label_entry))
91                        printf(", [S]");
92                printf(", ttl %u)", MPLS_TTL(label_entry));
93
94                p += sizeof(label_entry);
95        } while (!MPLS_STACK(label_entry));
96
97        /*
98         * Try to figure out the packet type.
99         */
100        switch (MPLS_LABEL(label_entry)) {
101
102        case 0: /* IPv4 explicit NULL label */
103        case 3: /* IPv4 implicit NULL label */
104                pt = PT_IPV4;
105                break;
106
107        case 2: /* IPv6 explicit NULL label */
108                pt = PT_IPV6;
109                break;
110
111        default:
112                /*
113                 * Generally there's no indication of protocol in MPLS label
114                 * encoding.
115                 *
116                 * However, draft-hsmit-isis-aal5mux-00.txt describes a
117                 * technique for encapsulating IS-IS and IP traffic on the
118                 * same ATM virtual circuit; you look at the first payload
119                 * byte to determine the network layer protocol, based on
120                 * the fact that
121                 *
122                 *      1) the first byte of an IP header is 0x45-0x4f
123                 *         for IPv4 and 0x60-0x6f for IPv6;
124                 *
125                 *      2) the first byte of an OSI CLNP packet is 0x81,
126                 *         the first byte of an OSI ES-IS packet is 0x82,
127                 *         and the first byte of an OSI IS-IS packet is
128                 *         0x83;
129                 *
130                 * so the network layer protocol can be inferred from the
131                 * first byte of the packet, if the protocol is one of the
132                 * ones listed above.
133                 *
134                 * Cisco sends control-plane traffic MPLS-encapsulated in
135                 * this fashion.
136                 */
137                switch(*p) {
138
139                case 0x45:
140                case 0x46:
141                case 0x47:
142                case 0x48:
143                case 0x49:
144                case 0x4a:
145                case 0x4b:
146                case 0x4c:
147                case 0x4d:
148                case 0x4e:
149                case 0x4f:
150                        pt = PT_IPV4;
151                        break;
152                               
153                case 0x60:
154                case 0x61:
155                case 0x62:
156                case 0x63:
157                case 0x64:
158                case 0x65:
159                case 0x66:
160                case 0x67:
161                case 0x68:
162                case 0x69:
163                case 0x6a:
164                case 0x6b:
165                case 0x6c:
166                case 0x6d:
167                case 0x6e:
168                case 0x6f:
169                        pt = PT_IPV6;
170                        break;
171
172                case 0x81:
173                case 0x82:
174                case 0x83:
175                        pt = PT_OSI;
176                        break;
177
178                default:
179                        /* ok bail out - we did not figure out what it is*/
180                        break;
181                }
182        }
183
184        /*
185         * Print the payload.
186         */
187        if (pt == PT_UNKNOWN) {
188                if (!suppress_default_print)
189                        default_print(p, length - (p - bp));
190                return;
191        }
192        if (vflag)
193                printf("\n\t");
194        else
195                printf(" ");
196        switch (pt) {
197
198        case PT_IPV4:
199                ip_print(gndo, p, length - (p - bp));
200                break;
201
202        case PT_IPV6:
203#ifdef INET6
204                ip6_print(gndo, p, length - (p - bp));
205#else
206                printf("IPv6, length: %u", length);
207#endif
208                break;
209
210        case PT_OSI:
211                isoclns_print(p, length - (p - bp), length - (p - bp));
212                break;
213
214        default:
215                break;
216        }
217        return;
218
219trunc:
220        printf("[|MPLS]");
221}
222
223
224/*
225 * Local Variables:
226 * c-style: whitesmith
227 * c-basic-offset: 8
228 * End:
229 */
Note: See TracBrowser for help on using the repository browser.