]> The Tcpdump Group git mirrors - tcpdump/blob - print-vxlan-gpe.c
Add printing function for Generic Protocol Extension for VXLAN
[tcpdump] / print-vxlan-gpe.c
1 /* Copyright (c) 2015, bugyo
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * 1. Redistributions of source code must retain the above copyright notice,
7 * this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright notice,
9 * this list of conditions and the following disclaimer in the documentation
10 * and/or other materials provided with the distribution.
11 *
12 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
13 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
16 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <netdissect-stdinc.h>
29
30 #include "netdissect.h"
31 #include "extract.h"
32
33 static const char tstr[] = " [|VXLAN-GPE]";
34 static const struct tok vxlan_gpe_flags [] = {
35 { 0x08, "I" },
36 { 0x04, "P" },
37 { 0x01, "O" },
38 { 0, NULL }
39 };
40
41 #define VXLAN_GPE_HDR_LEN 8
42
43 /*
44 * VXLAN GPE header, draft-ietf-nvo3-vxlan-gpe-01
45 * Generic Protocol Extension for VXLAN
46 *
47 * 0 1 2 3
48 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * |R|R|Ver|I|P|R|O| Reserved |Next Protocol |
51 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 * | VXLAN Network Identifier (VNI) | Reserved |
53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 */
55
56 void
57 vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len)
58 {
59 uint8_t flags;
60 uint8_t next_protocol;
61 uint32_t vni;
62
63 if (len < VXLAN_GPE_HDR_LEN)
64 goto trunc;
65
66 ND_TCHECK2(*bp, VXLAN_GPE_HDR_LEN);
67
68 flags = *bp;
69 bp += 3;
70
71 next_protocol = *bp;
72 bp += 1;
73
74 vni = EXTRACT_24BITS(bp);
75 bp += 4;
76
77 ND_PRINT((ndo, "VXLAN-GPE, "));
78 ND_PRINT((ndo, "flags [%s], ",
79 bittok2str_nosep(vxlan_gpe_flags, "none", flags)));
80 ND_PRINT((ndo, "vni %u", vni));
81 ND_PRINT((ndo, ndo->ndo_vflag ? "\n " : ": "));
82
83 switch (next_protocol) {
84 case 0x1:
85 ip_print(ndo, bp, len - 8);
86 break;
87 case 0x2:
88 ip6_print(ndo, bp, len - 8);
89 break;
90 case 0x3:
91 ether_print(ndo, bp, len - 8, len - 8, NULL, NULL);
92 break;
93 case 0x4:
94 nsh_print(ndo, bp, len - 8);
95 break;
96 case 0x5:
97 mpls_print(ndo, bp, len - 8);
98 break;
99 default:
100 ND_PRINT((ndo, "ERROR: unknown-next-protocol"));
101 return;
102 }
103
104 return;
105
106 trunc:
107 ND_PRINT((ndo, "%s", tstr));
108 }
109