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