1*007054f0SBryan Venteicher /*- 2*007054f0SBryan Venteicher * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org> 3*007054f0SBryan Venteicher * All rights reserved. 4*007054f0SBryan Venteicher * 5*007054f0SBryan Venteicher * Redistribution and use in source and binary forms, with or without 6*007054f0SBryan Venteicher * modification, are permitted provided that the following conditions 7*007054f0SBryan Venteicher * are met: 8*007054f0SBryan Venteicher * 1. Redistributions of source code must retain the above copyright 9*007054f0SBryan Venteicher * notice unmodified, this list of conditions, and the following 10*007054f0SBryan Venteicher * disclaimer. 11*007054f0SBryan Venteicher * 2. Redistributions in binary form must reproduce the above copyright 12*007054f0SBryan Venteicher * notice, this list of conditions and the following disclaimer in the 13*007054f0SBryan Venteicher * documentation and/or other materials provided with the distribution. 14*007054f0SBryan Venteicher * 15*007054f0SBryan Venteicher * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*007054f0SBryan Venteicher * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*007054f0SBryan Venteicher * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*007054f0SBryan Venteicher * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*007054f0SBryan Venteicher * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*007054f0SBryan Venteicher * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*007054f0SBryan Venteicher * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*007054f0SBryan Venteicher * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*007054f0SBryan Venteicher * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*007054f0SBryan Venteicher * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*007054f0SBryan Venteicher * 26*007054f0SBryan Venteicher * $FreeBSD$ 27*007054f0SBryan Venteicher */ 28*007054f0SBryan Venteicher 29*007054f0SBryan Venteicher #ifndef _NET_IF_VXLAN_H_ 30*007054f0SBryan Venteicher #define _NET_IF_VXLAN_H_ 31*007054f0SBryan Venteicher 32*007054f0SBryan Venteicher #include <sys/types.h> 33*007054f0SBryan Venteicher #include <sys/socket.h> 34*007054f0SBryan Venteicher #include <net/ethernet.h> 35*007054f0SBryan Venteicher #include <net/if.h> 36*007054f0SBryan Venteicher #include <netinet/in.h> 37*007054f0SBryan Venteicher 38*007054f0SBryan Venteicher struct vxlan_header { 39*007054f0SBryan Venteicher uint32_t vxlh_flags; 40*007054f0SBryan Venteicher uint32_t vxlh_vni; 41*007054f0SBryan Venteicher }; 42*007054f0SBryan Venteicher 43*007054f0SBryan Venteicher #define VXLAN_HDR_FLAGS_VALID_VNI 0x08000000 44*007054f0SBryan Venteicher #define VXLAN_HDR_VNI_SHIFT 8 45*007054f0SBryan Venteicher 46*007054f0SBryan Venteicher #define VXLAN_VNI_MAX (1 << 24) 47*007054f0SBryan Venteicher #define VXLAN_VNI_MASK (VXLAN_VNI_MAX - 1) 48*007054f0SBryan Venteicher 49*007054f0SBryan Venteicher /* 50*007054f0SBryan Venteicher * The port assigned by IANA is 4789, but some early implementations 51*007054f0SBryan Venteicher * (like Linux) use 8472 instead. If not specified, we default to 52*007054f0SBryan Venteicher * the IANA port. 53*007054f0SBryan Venteicher */ 54*007054f0SBryan Venteicher #define VXLAN_PORT 4789 55*007054f0SBryan Venteicher #define VXLAN_LEGACY_PORT 8472 56*007054f0SBryan Venteicher 57*007054f0SBryan Venteicher struct ifvxlanparam { 58*007054f0SBryan Venteicher uint64_t vxlp_with; 59*007054f0SBryan Venteicher 60*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_VNI 0x0001 61*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_LOCAL_ADDR4 0x0002 62*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_LOCAL_ADDR6 0x0004 63*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_REMOTE_ADDR4 0x0008 64*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_REMOTE_ADDR6 0x0010 65*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_LOCAL_PORT 0x0020 66*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_REMOTE_PORT 0x0040 67*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_PORT_RANGE 0x0080 68*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_FTABLE_TIMEOUT 0x0100 69*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_FTABLE_MAX 0x0200 70*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_MULTICAST_IF 0x0400 71*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_TTL 0x0800 72*007054f0SBryan Venteicher #define VXLAN_PARAM_WITH_LEARN 0x1000 73*007054f0SBryan Venteicher 74*007054f0SBryan Venteicher uint32_t vxlp_vni; 75*007054f0SBryan Venteicher struct in_addr vxlp_local_in4; 76*007054f0SBryan Venteicher struct in6_addr vxlp_local_in6; 77*007054f0SBryan Venteicher struct in_addr vxlp_remote_in4; 78*007054f0SBryan Venteicher struct in6_addr vxlp_remote_in6; 79*007054f0SBryan Venteicher uint16_t vxlp_local_port; 80*007054f0SBryan Venteicher uint16_t vxlp_remote_port; 81*007054f0SBryan Venteicher uint16_t vxlp_min_port; 82*007054f0SBryan Venteicher uint16_t vxlp_max_port; 83*007054f0SBryan Venteicher char vxlp_mc_ifname[IFNAMSIZ]; 84*007054f0SBryan Venteicher uint32_t vxlp_ftable_timeout; 85*007054f0SBryan Venteicher uint32_t vxlp_ftable_max; 86*007054f0SBryan Venteicher uint8_t vxlp_ttl; 87*007054f0SBryan Venteicher uint8_t vxlp_learn; 88*007054f0SBryan Venteicher }; 89*007054f0SBryan Venteicher 90*007054f0SBryan Venteicher union vxlan_sockaddr { 91*007054f0SBryan Venteicher struct sockaddr sa; 92*007054f0SBryan Venteicher struct sockaddr_in in4; 93*007054f0SBryan Venteicher struct sockaddr_in6 in6; 94*007054f0SBryan Venteicher }; 95*007054f0SBryan Venteicher 96*007054f0SBryan Venteicher #define VXLAN_SOCKADDR_IS_IPV4(_vxsin) ((_vxsin)->sa.sa_family == AF_INET) 97*007054f0SBryan Venteicher #define VXLAN_SOCKADDR_IS_IPV6(_vxsin) ((_vxsin)->sa.sa_family == AF_INET6) 98*007054f0SBryan Venteicher #define VXLAN_SOCKADDR_IS_IPV46(_vxsin) \ 99*007054f0SBryan Venteicher (VXLAN_SOCKADDR_IS_IPV4(_vxsin) || VXLAN_SOCKADDR_IS_IPV6(_vxsin)) 100*007054f0SBryan Venteicher 101*007054f0SBryan Venteicher #define VXLAN_CMD_GET_CONFIG 0 102*007054f0SBryan Venteicher #define VXLAN_CMD_SET_VNI 1 103*007054f0SBryan Venteicher #define VXLAN_CMD_SET_LOCAL_ADDR 2 104*007054f0SBryan Venteicher #define VXLAN_CMD_SET_REMOTE_ADDR 4 105*007054f0SBryan Venteicher #define VXLAN_CMD_SET_LOCAL_PORT 5 106*007054f0SBryan Venteicher #define VXLAN_CMD_SET_REMOTE_PORT 6 107*007054f0SBryan Venteicher #define VXLAN_CMD_SET_PORT_RANGE 7 108*007054f0SBryan Venteicher #define VXLAN_CMD_SET_FTABLE_TIMEOUT 8 109*007054f0SBryan Venteicher #define VXLAN_CMD_SET_FTABLE_MAX 9 110*007054f0SBryan Venteicher #define VXLAN_CMD_SET_MULTICAST_IF 10 111*007054f0SBryan Venteicher #define VXLAN_CMD_SET_TTL 11 112*007054f0SBryan Venteicher #define VXLAN_CMD_SET_LEARN 12 113*007054f0SBryan Venteicher #define VXLAN_CMD_FTABLE_ENTRY_ADD 13 114*007054f0SBryan Venteicher #define VXLAN_CMD_FTABLE_ENTRY_REM 14 115*007054f0SBryan Venteicher #define VXLAN_CMD_FLUSH 15 116*007054f0SBryan Venteicher 117*007054f0SBryan Venteicher struct ifvxlancfg { 118*007054f0SBryan Venteicher uint32_t vxlc_vni; 119*007054f0SBryan Venteicher union vxlan_sockaddr vxlc_local_sa; 120*007054f0SBryan Venteicher union vxlan_sockaddr vxlc_remote_sa; 121*007054f0SBryan Venteicher uint32_t vxlc_mc_ifindex; 122*007054f0SBryan Venteicher uint32_t vxlc_ftable_cnt; 123*007054f0SBryan Venteicher uint32_t vxlc_ftable_max; 124*007054f0SBryan Venteicher uint32_t vxlc_ftable_timeout; 125*007054f0SBryan Venteicher uint16_t vxlc_port_min; 126*007054f0SBryan Venteicher uint16_t vxlc_port_max; 127*007054f0SBryan Venteicher uint8_t vxlc_learn; 128*007054f0SBryan Venteicher uint8_t vxlc_ttl; 129*007054f0SBryan Venteicher }; 130*007054f0SBryan Venteicher 131*007054f0SBryan Venteicher struct ifvxlancmd { 132*007054f0SBryan Venteicher uint32_t vxlcmd_flags; 133*007054f0SBryan Venteicher #define VXLAN_CMD_FLAG_FLUSH_ALL 0x0001 134*007054f0SBryan Venteicher #define VXLAN_CMD_FLAG_LEARN 0x0002 135*007054f0SBryan Venteicher 136*007054f0SBryan Venteicher uint32_t vxlcmd_vni; 137*007054f0SBryan Venteicher uint32_t vxlcmd_ftable_timeout; 138*007054f0SBryan Venteicher uint32_t vxlcmd_ftable_max; 139*007054f0SBryan Venteicher uint16_t vxlcmd_port; 140*007054f0SBryan Venteicher uint16_t vxlcmd_port_min; 141*007054f0SBryan Venteicher uint16_t vxlcmd_port_max; 142*007054f0SBryan Venteicher uint8_t vxlcmd_mac[ETHER_ADDR_LEN]; 143*007054f0SBryan Venteicher uint8_t vxlcmd_ttl; 144*007054f0SBryan Venteicher union vxlan_sockaddr vxlcmd_sa; 145*007054f0SBryan Venteicher char vxlcmd_ifname[IFNAMSIZ]; 146*007054f0SBryan Venteicher }; 147*007054f0SBryan Venteicher 148*007054f0SBryan Venteicher #endif /* _NET_IF_VXLAN_H_ */ 149