1df6ad731Slogwang /*- 2*d4a07e70Sfengbojiang * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*d4a07e70Sfengbojiang * 4df6ad731Slogwang * Copyright (c) 1998 The NetBSD Foundation, Inc. 5df6ad731Slogwang * Copyright (c) 2014 Andrey V. Elsukov <[email protected]> 6df6ad731Slogwang * All rights reserved 7df6ad731Slogwang * 8df6ad731Slogwang * This code is derived from software contributed to The NetBSD Foundation 9df6ad731Slogwang * by Heiko W.Rupp <[email protected]> 10df6ad731Slogwang * 11df6ad731Slogwang * Redistribution and use in source and binary forms, with or without 12df6ad731Slogwang * modification, are permitted provided that the following conditions 13df6ad731Slogwang * are met: 14df6ad731Slogwang * 1. Redistributions of source code must retain the above copyright 15df6ad731Slogwang * notice, this list of conditions and the following disclaimer. 16df6ad731Slogwang * 2. Redistributions in binary form must reproduce the above copyright 17df6ad731Slogwang * notice, this list of conditions and the following disclaimer in the 18df6ad731Slogwang * documentation and/or other materials provided with the distribution. 19df6ad731Slogwang * 20df6ad731Slogwang * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21df6ad731Slogwang * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22df6ad731Slogwang * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23df6ad731Slogwang * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24df6ad731Slogwang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25df6ad731Slogwang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26df6ad731Slogwang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27df6ad731Slogwang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28df6ad731Slogwang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29df6ad731Slogwang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30df6ad731Slogwang * POSSIBILITY OF SUCH DAMAGE. 31df6ad731Slogwang * 32df6ad731Slogwang * $NetBSD: if_gre.h,v 1.13 2003/11/10 08:51:52 wiz Exp $ 33df6ad731Slogwang * $FreeBSD$ 34df6ad731Slogwang */ 35df6ad731Slogwang 36df6ad731Slogwang #ifndef _NET_IF_GRE_H_ 37df6ad731Slogwang #define _NET_IF_GRE_H_ 38df6ad731Slogwang 39*d4a07e70Sfengbojiang #ifdef _KERNEL 40*d4a07e70Sfengbojiang /* GRE header according to RFC 2784 and RFC 2890 */ 41*d4a07e70Sfengbojiang struct grehdr { 42*d4a07e70Sfengbojiang uint16_t gre_flags; /* GRE flags */ 43*d4a07e70Sfengbojiang #define GRE_FLAGS_CP 0x8000 /* checksum present */ 44*d4a07e70Sfengbojiang #define GRE_FLAGS_KP 0x2000 /* key present */ 45*d4a07e70Sfengbojiang #define GRE_FLAGS_SP 0x1000 /* sequence present */ 46*d4a07e70Sfengbojiang #define GRE_FLAGS_MASK (GRE_FLAGS_CP|GRE_FLAGS_KP|GRE_FLAGS_SP) 47*d4a07e70Sfengbojiang uint16_t gre_proto; /* protocol type */ 48*d4a07e70Sfengbojiang uint32_t gre_opts[0]; /* optional fields */ 49*d4a07e70Sfengbojiang } __packed; 50*d4a07e70Sfengbojiang 51*d4a07e70Sfengbojiang #ifdef INET 52*d4a07e70Sfengbojiang struct greip { 53*d4a07e70Sfengbojiang struct ip gi_ip; 54*d4a07e70Sfengbojiang struct grehdr gi_gre; 55*d4a07e70Sfengbojiang } __packed; 56*d4a07e70Sfengbojiang 57*d4a07e70Sfengbojiang struct greudp { 58*d4a07e70Sfengbojiang struct ip gi_ip; 59*d4a07e70Sfengbojiang struct udphdr gi_udp; 60*d4a07e70Sfengbojiang struct grehdr gi_gre; 61*d4a07e70Sfengbojiang } __packed; 62*d4a07e70Sfengbojiang #endif /* INET */ 63*d4a07e70Sfengbojiang 64*d4a07e70Sfengbojiang #ifdef INET6 65*d4a07e70Sfengbojiang struct greip6 { 66*d4a07e70Sfengbojiang struct ip6_hdr gi6_ip6; 67*d4a07e70Sfengbojiang struct grehdr gi6_gre; 68*d4a07e70Sfengbojiang } __packed; 69*d4a07e70Sfengbojiang 70*d4a07e70Sfengbojiang struct greudp6 { 71*d4a07e70Sfengbojiang struct ip6_hdr gi6_ip6; 72*d4a07e70Sfengbojiang struct udphdr gi6_udp; 73*d4a07e70Sfengbojiang struct grehdr gi6_gre; 74*d4a07e70Sfengbojiang } __packed; 75*d4a07e70Sfengbojiang #endif /* INET6 */ 76*d4a07e70Sfengbojiang 77*d4a07e70Sfengbojiang CK_LIST_HEAD(gre_list, gre_softc); 78*d4a07e70Sfengbojiang CK_LIST_HEAD(gre_sockets, gre_socket); 79*d4a07e70Sfengbojiang struct gre_socket { 80*d4a07e70Sfengbojiang struct socket *so; 81*d4a07e70Sfengbojiang struct gre_list list; 82*d4a07e70Sfengbojiang CK_LIST_ENTRY(gre_socket) chain; 83*d4a07e70Sfengbojiang struct epoch_context epoch_ctx; 84*d4a07e70Sfengbojiang }; 85*d4a07e70Sfengbojiang 86*d4a07e70Sfengbojiang struct gre_softc { 87*d4a07e70Sfengbojiang struct ifnet *gre_ifp; 88*d4a07e70Sfengbojiang int gre_family; /* AF of delivery header */ 89*d4a07e70Sfengbojiang uint32_t gre_iseq; 90*d4a07e70Sfengbojiang uint32_t gre_oseq; 91*d4a07e70Sfengbojiang uint32_t gre_key; 92*d4a07e70Sfengbojiang uint32_t gre_options; 93*d4a07e70Sfengbojiang uint32_t gre_csumflags; 94*d4a07e70Sfengbojiang uint32_t gre_port; 95*d4a07e70Sfengbojiang u_int gre_fibnum; 96*d4a07e70Sfengbojiang u_int gre_hlen; /* header size */ 97*d4a07e70Sfengbojiang union { 98*d4a07e70Sfengbojiang void *hdr; 99*d4a07e70Sfengbojiang #ifdef INET 100*d4a07e70Sfengbojiang struct greip *iphdr; 101*d4a07e70Sfengbojiang struct greudp *udphdr; 102*d4a07e70Sfengbojiang #endif 103*d4a07e70Sfengbojiang #ifdef INET6 104*d4a07e70Sfengbojiang struct greip6 *ip6hdr; 105*d4a07e70Sfengbojiang struct greudp6 *udp6hdr; 106*d4a07e70Sfengbojiang #endif 107*d4a07e70Sfengbojiang } gre_uhdr; 108*d4a07e70Sfengbojiang struct gre_socket *gre_so; 109*d4a07e70Sfengbojiang 110*d4a07e70Sfengbojiang CK_LIST_ENTRY(gre_softc) chain; 111*d4a07e70Sfengbojiang CK_LIST_ENTRY(gre_softc) srchash; 112*d4a07e70Sfengbojiang }; 113*d4a07e70Sfengbojiang MALLOC_DECLARE(M_GRE); 114*d4a07e70Sfengbojiang 115*d4a07e70Sfengbojiang #ifndef GRE_HASH_SIZE 116*d4a07e70Sfengbojiang #define GRE_HASH_SIZE (1 << 4) 117*d4a07e70Sfengbojiang #endif 118*d4a07e70Sfengbojiang 119*d4a07e70Sfengbojiang #define GRE2IFP(sc) ((sc)->gre_ifp) 120*d4a07e70Sfengbojiang #define GRE_RLOCK_TRACKER struct epoch_tracker gre_et 121*d4a07e70Sfengbojiang #define GRE_RLOCK() epoch_enter_preempt(net_epoch_preempt, &gre_et) 122*d4a07e70Sfengbojiang #define GRE_RUNLOCK() epoch_exit_preempt(net_epoch_preempt, &gre_et) 123*d4a07e70Sfengbojiang #define GRE_WAIT() epoch_wait_preempt(net_epoch_preempt) 124*d4a07e70Sfengbojiang 125*d4a07e70Sfengbojiang #define gre_hdr gre_uhdr.hdr 126*d4a07e70Sfengbojiang #define gre_iphdr gre_uhdr.iphdr 127*d4a07e70Sfengbojiang #define gre_ip6hdr gre_uhdr.ip6hdr 128*d4a07e70Sfengbojiang #define gre_udphdr gre_uhdr.udphdr 129*d4a07e70Sfengbojiang #define gre_udp6hdr gre_uhdr.udp6hdr 130*d4a07e70Sfengbojiang 131*d4a07e70Sfengbojiang #define gre_oip gre_iphdr->gi_ip 132*d4a07e70Sfengbojiang #define gre_udp gre_udphdr->gi_udp 133*d4a07e70Sfengbojiang #define gre_oip6 gre_ip6hdr->gi6_ip6 134*d4a07e70Sfengbojiang #define gre_udp6 gre_udp6hdr->gi6_udp 135*d4a07e70Sfengbojiang 136*d4a07e70Sfengbojiang struct gre_list *gre_hashinit(void); 137*d4a07e70Sfengbojiang void gre_hashdestroy(struct gre_list *); 138*d4a07e70Sfengbojiang 139*d4a07e70Sfengbojiang int gre_input(struct mbuf *, int, int, void *); 140*d4a07e70Sfengbojiang void gre_update_hdr(struct gre_softc *, struct grehdr *); 141*d4a07e70Sfengbojiang void gre_update_udphdr(struct gre_softc *, struct udphdr *, uint16_t); 142*d4a07e70Sfengbojiang void gre_sofree(epoch_context_t); 143*d4a07e70Sfengbojiang 144*d4a07e70Sfengbojiang void in_gre_init(void); 145*d4a07e70Sfengbojiang void in_gre_uninit(void); 146*d4a07e70Sfengbojiang int in_gre_setopts(struct gre_softc *, u_long, uint32_t); 147*d4a07e70Sfengbojiang int in_gre_ioctl(struct gre_softc *, u_long, caddr_t); 148*d4a07e70Sfengbojiang int in_gre_output(struct mbuf *, int, int); 149*d4a07e70Sfengbojiang 150*d4a07e70Sfengbojiang void in6_gre_init(void); 151*d4a07e70Sfengbojiang void in6_gre_uninit(void); 152*d4a07e70Sfengbojiang int in6_gre_setopts(struct gre_softc *, u_long, uint32_t); 153*d4a07e70Sfengbojiang int in6_gre_ioctl(struct gre_softc *, u_long, caddr_t); 154*d4a07e70Sfengbojiang int in6_gre_output(struct mbuf *, int, int, uint32_t); 155*d4a07e70Sfengbojiang /* 156*d4a07e70Sfengbojiang * CISCO uses special type for GRE tunnel created as part of WCCP 157*d4a07e70Sfengbojiang * connection, while in fact those packets are just IPv4 encapsulated 158*d4a07e70Sfengbojiang * into GRE. 159*d4a07e70Sfengbojiang */ 160*d4a07e70Sfengbojiang #define ETHERTYPE_WCCP 0x883E 161*d4a07e70Sfengbojiang #endif /* _KERNEL */ 162*d4a07e70Sfengbojiang 163df6ad731Slogwang #define GRESADDRS _IOW('i', 101, struct ifreq) 164df6ad731Slogwang #define GRESADDRD _IOW('i', 102, struct ifreq) 165df6ad731Slogwang #define GREGADDRS _IOWR('i', 103, struct ifreq) 166df6ad731Slogwang #define GREGADDRD _IOWR('i', 104, struct ifreq) 167df6ad731Slogwang #define GRESPROTO _IOW('i' , 105, struct ifreq) 168df6ad731Slogwang #define GREGPROTO _IOWR('i', 106, struct ifreq) 169df6ad731Slogwang 170df6ad731Slogwang #define GREGKEY _IOWR('i', 107, struct ifreq) 171df6ad731Slogwang #define GRESKEY _IOW('i', 108, struct ifreq) 172df6ad731Slogwang #define GREGOPTS _IOWR('i', 109, struct ifreq) 173df6ad731Slogwang #define GRESOPTS _IOW('i', 110, struct ifreq) 174*d4a07e70Sfengbojiang #define GREGPORT _IOWR('i', 111, struct ifreq) 175*d4a07e70Sfengbojiang #define GRESPORT _IOW('i', 112, struct ifreq) 176*d4a07e70Sfengbojiang 177*d4a07e70Sfengbojiang /* GRE-in-UDP encapsulation destination port as defined in RFC8086 */ 178*d4a07e70Sfengbojiang #define GRE_UDPPORT 4754 179df6ad731Slogwang 180df6ad731Slogwang #define GRE_ENABLE_CSUM 0x0001 181df6ad731Slogwang #define GRE_ENABLE_SEQ 0x0002 182*d4a07e70Sfengbojiang #define GRE_UDPENCAP 0x0004 183*d4a07e70Sfengbojiang #define GRE_OPTMASK (GRE_ENABLE_CSUM|GRE_ENABLE_SEQ|GRE_UDPENCAP) 184df6ad731Slogwang 185df6ad731Slogwang #endif /* _NET_IF_GRE_H_ */ 186