xref: /netbsd-src/external/bsd/tcpdump/dist/print-vxlan-gpe.c (revision 26ba0b503b498a5194a71ac319838b7f5497f3fe)
1784088dfSchristos /* Copyright (c) 2015, bugyo
2784088dfSchristos  * All rights reserved.
3784088dfSchristos  *
4784088dfSchristos  * Redistribution and use in source and binary forms, with or without
5784088dfSchristos  * modification, are permitted provided that the following conditions are met:
6784088dfSchristos  * 1. Redistributions of source code must retain the above copyright notice,
7784088dfSchristos  *    this list of conditions and the following disclaimer.
8784088dfSchristos  * 2. Redistributions in binary form must reproduce the above copyright notice,
9784088dfSchristos  *    this list of conditions and the following disclaimer in the documentation
10784088dfSchristos  *    and/or other materials provided with the distribution.
11784088dfSchristos  *
12784088dfSchristos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
13784088dfSchristos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14784088dfSchristos  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15784088dfSchristos  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
16784088dfSchristos  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17784088dfSchristos  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18784088dfSchristos  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19784088dfSchristos  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20784088dfSchristos  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21784088dfSchristos  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22784088dfSchristos  */
23784088dfSchristos 
24fdccd7e4Schristos #include <sys/cdefs.h>
25fdccd7e4Schristos #ifndef lint
26*26ba0b50Schristos __RCSID("$NetBSD: print-vxlan-gpe.c,v 1.5 2024/09/02 16:15:33 christos Exp $");
27fdccd7e4Schristos #endif
28fdccd7e4Schristos 
29dc860a36Sspz /* \summary: Generic Protocol Extension for VXLAN (VXLAN GPE) printer */
30dc860a36Sspz 
31c74ad251Schristos /* specification: draft-ietf-nvo3-vxlan-gpe-10 */
32dc860a36Sspz 
33c74ad251Schristos #include <config.h>
34784088dfSchristos 
35c74ad251Schristos #include "netdissect-stdinc.h"
36784088dfSchristos 
37c74ad251Schristos #define ND_LONGJMP_FROM_TCHECK
38784088dfSchristos #include "netdissect.h"
39784088dfSchristos #include "extract.h"
40784088dfSchristos 
41784088dfSchristos static const struct tok vxlan_gpe_flags [] = {
42784088dfSchristos     { 0x08, "I" },
43784088dfSchristos     { 0x04, "P" },
44c74ad251Schristos     { 0x02, "B" },
45784088dfSchristos     { 0x01, "O" },
46784088dfSchristos     { 0, NULL }
47784088dfSchristos };
48784088dfSchristos 
49784088dfSchristos #define VXLAN_GPE_HDR_LEN 8
50784088dfSchristos 
51784088dfSchristos /*
52784088dfSchristos  * VXLAN GPE header, draft-ietf-nvo3-vxlan-gpe-01
53784088dfSchristos  *                   Generic Protocol Extension for VXLAN
54784088dfSchristos  *
55784088dfSchristos  *     0                   1                   2                   3
56784088dfSchristos  *     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
57784088dfSchristos  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58784088dfSchristos  *    |R|R|Ver|I|P|R|O|       Reserved                |Next Protocol  |
59784088dfSchristos  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60784088dfSchristos  *    |                VXLAN Network Identifier (VNI) |   Reserved    |
61784088dfSchristos  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62784088dfSchristos  */
63784088dfSchristos 
64784088dfSchristos void
65784088dfSchristos vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len)
66784088dfSchristos {
67784088dfSchristos     uint8_t flags;
68784088dfSchristos     uint8_t next_protocol;
69784088dfSchristos     uint32_t vni;
70784088dfSchristos 
71c74ad251Schristos     ndo->ndo_protocol = "vxlan_gpe";
72c74ad251Schristos     ND_PRINT("VXLAN-GPE, ");
73c74ad251Schristos     if (len < VXLAN_GPE_HDR_LEN) {
74c74ad251Schristos         ND_PRINT(" (len %u < %u)", len, VXLAN_GPE_HDR_LEN);
75c74ad251Schristos         goto invalid;
76c74ad251Schristos     }
77784088dfSchristos 
78c74ad251Schristos     flags = GET_U_1(bp);
79784088dfSchristos     bp += 1;
80c74ad251Schristos     len -= 1;
81c74ad251Schristos     ND_PRINT("flags [%s], ",
82c74ad251Schristos               bittok2str_nosep(vxlan_gpe_flags, "none", flags));
83784088dfSchristos 
84c74ad251Schristos     /* Reserved */
85c74ad251Schristos     bp += 2;
86c74ad251Schristos     len -= 2;
87784088dfSchristos 
88c74ad251Schristos     next_protocol = GET_U_1(bp);
89c74ad251Schristos     bp += 1;
90c74ad251Schristos     len -= 1;
91c74ad251Schristos 
92c74ad251Schristos     vni = GET_BE_U_3(bp);
93c74ad251Schristos     bp += 3;
94c74ad251Schristos     len -= 3;
95c74ad251Schristos 
96c74ad251Schristos     /* Reserved */
97c74ad251Schristos     ND_TCHECK_1(bp);
98c74ad251Schristos     bp += 1;
99c74ad251Schristos     len -= 1;
100c74ad251Schristos 
101c74ad251Schristos     ND_PRINT("vni %u", vni);
102c74ad251Schristos     ND_PRINT(ndo->ndo_vflag ? "\n    " : ": ");
103784088dfSchristos 
104784088dfSchristos     switch (next_protocol) {
105784088dfSchristos     case 0x1:
106c74ad251Schristos         ip_print(ndo, bp, len);
107784088dfSchristos         break;
108784088dfSchristos     case 0x2:
109c74ad251Schristos         ip6_print(ndo, bp, len);
110784088dfSchristos         break;
111784088dfSchristos     case 0x3:
112c74ad251Schristos         ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
113784088dfSchristos         break;
114784088dfSchristos     case 0x4:
115c74ad251Schristos         nsh_print(ndo, bp, len);
116784088dfSchristos         break;
117784088dfSchristos     default:
118c74ad251Schristos         ND_PRINT("ERROR: unknown-next-protocol");
119c74ad251Schristos         goto invalid;
120784088dfSchristos     }
121784088dfSchristos 
122784088dfSchristos 	return;
123784088dfSchristos 
124c74ad251Schristos invalid:
125c74ad251Schristos     nd_print_invalid(ndo);
126784088dfSchristos }
127784088dfSchristos 
128