diff options
Diffstat (limited to 'datapath/linux/compat/include/net')
45 files changed, 0 insertions, 4680 deletions
diff --git a/datapath/linux/compat/include/net/checksum.h b/datapath/linux/compat/include/net/checksum.h deleted file mode 100644 index d1f1125d1..000000000 --- a/datapath/linux/compat/include/net/checksum.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __NET_CHECKSUM_WRAPPER_H -#define __NET_CHECKSUM_WRAPPER_H 1 - -#include_next <net/checksum.h> - -#ifndef HAVE_CSUM_UNFOLD -static inline __wsum csum_unfold(__sum16 n) -{ - return (__force __wsum)n; -} -#endif /* !HAVE_CSUM_UNFOLD */ - -/* Workaround for debugging included in certain versions of XenServer. It only - * applies to 32-bit x86. - */ -#if defined(HAVE_CSUM_COPY_DBG) && defined(CONFIG_X86_32) -#define csum_and_copy_to_user(src, dst, len, sum, err_ptr) \ - csum_and_copy_to_user(src, dst, len, sum, NULL, err_ptr) -#endif - -#ifndef HAVE_CSUM_REPLACE4 -static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to) -{ - __be32 diff[] = { ~from, to }; - - *sum = csum_fold(csum_partial((char *)diff, sizeof(diff), ~csum_unfold(*sum))); -} - -static inline void csum_replace2(__sum16 *sum, __be16 from, __be16 to) -{ - csum_replace4(sum, (__force __be32)from, (__force __be32)to); -} -#endif - -#ifndef CSUM_MANGLED_0 -#define CSUM_MANGLED_0 ((__force __sum16)0xffff) -#endif - -#endif /* checksum.h */ diff --git a/datapath/linux/compat/include/net/dst.h b/datapath/linux/compat/include/net/dst.h deleted file mode 100644 index af78a6ca6..000000000 --- a/datapath/linux/compat/include/net/dst.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __NET_DST_WRAPPER_H -#define __NET_DST_WRAPPER_H 1 - -#include <linux/version.h> -#include_next <net/dst.h> - -#ifndef HAVE_SKB_DST_ACCESSOR_FUNCS - -static inline void skb_dst_drop(struct sk_buff *skb) -{ - if (skb->dst) - dst_release(skb_dst(skb)); - skb->dst = NULL; -} - -#endif - -#ifndef DST_OBSOLETE_NONE -#define DST_OBSOLETE_NONE 0 -#endif - -#ifndef DST_NOCOUNT -#define DST_NOCOUNT 0 -#endif - -#if !defined(HAVE___SKB_DST_COPY) -static inline void __skb_dst_copy(struct sk_buff *nskb, unsigned long refdst) -{ - nskb->_skb_refdst = refdst; - if (!(nskb->_skb_refdst & SKB_DST_NOREF)) - dst_clone(skb_dst(nskb)); -} -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0) -static const u32 rpl_dst_default_metrics[RTAX_MAX + 1] = { - /* This initializer is needed to force linker to place this variable - * into const section. Otherwise it might end into bss section. - * We really want to avoid false sharing on this variable, and catch - * any writes on it. - */ - [RTAX_MAX] = 0xdeadbeef, -}; -#define dst_default_metrics rpl_dst_default_metrics - -static inline void rpl_dst_init(struct dst_entry *dst, struct dst_ops *ops, - struct net_device *dev, int initial_ref, - int initial_obsolete, unsigned short flags) -{ - /* XXX: It's easier to handle compatibility by zeroing, as we can - * refer to fewer fields. Do that here. - */ - memset(dst, 0, sizeof *dst); - - dst->dev = dev; - if (dev) - dev_hold(dev); - dst->ops = ops; - dst_init_metrics(dst, dst_default_metrics, true); - dst->path = dst; - dst->input = dst_discard; -#ifndef HAVE_DST_DISCARD_SK - dst->output = dst_discard; -#else - dst->output = dst_discard_sk; -#endif - dst->obsolete = initial_obsolete; - atomic_set(&dst->__refcnt, initial_ref); - dst->lastuse = jiffies; - dst->flags = flags; - if (!(flags & DST_NOCOUNT)) - dst_entries_add(ops, 1); -} -#define dst_init rpl_dst_init -#endif - -#endif diff --git a/datapath/linux/compat/include/net/dst_cache.h b/datapath/linux/compat/include/net/dst_cache.h deleted file mode 100644 index 6084d4eea..000000000 --- a/datapath/linux/compat/include/net/dst_cache.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef _NET_DST_CACHE_WRAPPER_H -#define _NET_DST_CACHE_WRAPPER_H - -#ifdef USE_BUILTIN_DST_CACHE -#include_next <net/dst_cache.h> -#else - -#include <linux/jiffies.h> -#include <net/dst.h> -#if IS_ENABLED(CONFIG_IPV6) -#include <net/ip6_fib.h> -#endif - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/dst_cache.h> - -#else -struct dst_cache { - struct dst_cache_pcpu __percpu *cache; - unsigned long reset_ts; -}; - -/** - * dst_cache_get - perform cache lookup - * @dst_cache: the cache - * - * The caller should use dst_cache_get_ip4() if it need to retrieve the - * source address to be used when xmitting to the cached dst. - * local BH must be disabled. - */ -#define rpl_dst_cache_get dst_cache_get -struct dst_entry *rpl_dst_cache_get(struct dst_cache *dst_cache); - -/** - * dst_cache_get_ip4 - perform cache lookup and fetch ipv4 source address - * @dst_cache: the cache - * @saddr: return value for the retrieved source address - * - * local BH must be disabled. - */ -#define rpl_dst_cache_get_ip4 dst_cache_get_ip4 -struct rtable *rpl_dst_cache_get_ip4(struct dst_cache *dst_cache, __be32 *saddr); - -/** - * dst_cache_set_ip4 - store the ipv4 dst into the cache - * @dst_cache: the cache - * @dst: the entry to be cached - * @saddr: the source address to be stored inside the cache - * - * local BH must be disabled. - */ -#define rpl_dst_cache_set_ip4 dst_cache_set_ip4 -void rpl_dst_cache_set_ip4(struct dst_cache *dst_cache, struct dst_entry *dst, - __be32 saddr); - -#if IS_ENABLED(CONFIG_IPV6) - -/** - * dst_cache_set_ip6 - store the ipv6 dst into the cache - * @dst_cache: the cache - * @dst: the entry to be cached - * @saddr: the source address to be stored inside the cache - * - * local BH must be disabled. - */ -#define rpl_dst_cache_set_ip6 dst_cache_set_ip6 -void rpl_dst_cache_set_ip6(struct dst_cache *dst_cache, struct dst_entry *dst, - const struct in6_addr *addr); - -/** - * dst_cache_get_ip6 - perform cache lookup and fetch ipv6 source address - * @dst_cache: the cache - * @saddr: return value for the retrieved source address - * - * local BH must be disabled. - */ -#define rpl_dst_cache_get_ip6 dst_cache_get_ip6 -struct dst_entry *rpl_dst_cache_get_ip6(struct dst_cache *dst_cache, - struct in6_addr *saddr); -#endif - -/** - * dst_cache_reset - invalidate the cache contents - * @dst_cache: the cache - * - * This do not free the cached dst to avoid races and contentions. - * the dst will be freed on later cache lookup. - */ -static inline void dst_cache_reset(struct dst_cache *dst_cache) -{ - dst_cache->reset_ts = jiffies; -} - -/** - * dst_cache_init - initialize the cache, allocating the required storage - * @dst_cache: the cache - * @gfp: allocation flags - */ -#define rpl_dst_cache_init dst_cache_init -int rpl_dst_cache_init(struct dst_cache *dst_cache, gfp_t gfp); - -/** - * dst_cache_destroy - empty the cache and free the allocated storage - * @dst_cache: the cache - * - * No synchronization is enforced: it must be called only when the cache - * is unsed. - */ -#define rpl_dst_cache_destroy dst_cache_destroy -void rpl_dst_cache_destroy(struct dst_cache *dst_cache); - -#endif /* USE_UPSTREAM_TUNNEL */ -#endif /* USE_BUILTIN_DST_CACHE */ -#endif diff --git a/datapath/linux/compat/include/net/dst_metadata.h b/datapath/linux/compat/include/net/dst_metadata.h deleted file mode 100644 index 4ffafccce..000000000 --- a/datapath/linux/compat/include/net/dst_metadata.h +++ /dev/null @@ -1,269 +0,0 @@ -#ifndef __NET_DST_METADATA_WRAPPER_H -#define __NET_DST_METADATA_WRAPPER_H 1 - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/dst_metadata.h> -#else -#include <linux/skbuff.h> - -#include <net/dsfield.h> -#include <net/dst.h> -#include <net/ipv6.h> -#include <net/ip_tunnels.h> - -enum metadata_type { - METADATA_IP_TUNNEL, - METADATA_HW_PORT_MUX, -}; - -struct hw_port_info { - struct net_device *lower_dev; - u32 port_id; -}; - -struct metadata_dst { - struct dst_entry dst; - enum metadata_type type; - union { - struct ip_tunnel_info tun_info; - struct hw_port_info port_info; - } u; -}; - -#ifndef DST_METADATA -#define DST_METADATA 0x0080 -#endif - -extern struct dst_ops md_dst_ops; - -static void rpl__metadata_dst_init(struct metadata_dst *md_dst, - enum metadata_type type, u8 optslen) - -{ - struct dst_entry *dst; - - dst = &md_dst->dst; - dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE, - DST_METADATA | DST_NOCOUNT); - -#if 0 - /* unused in OVS */ - dst->input = dst_md_discard; - dst->output = dst_md_discard_out; -#endif - memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst)); - md_dst->type = type; -} - -static struct -metadata_dst *__rpl_metadata_dst_alloc(u8 optslen, - enum metadata_type type, - gfp_t flags) -{ - struct metadata_dst *md_dst; - - md_dst = kmalloc(sizeof(*md_dst) + optslen, flags); - if (!md_dst) - return NULL; - - rpl__metadata_dst_init(md_dst, type, optslen); - - return md_dst; -} -static inline struct metadata_dst *rpl_tun_rx_dst(int md_size) -{ - struct metadata_dst *tun_dst; - - tun_dst = __rpl_metadata_dst_alloc(md_size, METADATA_IP_TUNNEL, - GFP_ATOMIC); - if (!tun_dst) - return NULL; - - tun_dst->u.tun_info.options_len = 0; - tun_dst->u.tun_info.mode = 0; - return tun_dst; -} -static inline struct metadata_dst *rpl__ip_tun_set_dst(__be32 saddr, - __be32 daddr, - __u8 tos, __u8 ttl, - __be16 tp_dst, - __be16 flags, - __be64 tunnel_id, - int md_size) -{ - struct metadata_dst *tun_dst; - - tun_dst = rpl_tun_rx_dst(md_size); - if (!tun_dst) - return NULL; - - ip_tunnel_key_init(&tun_dst->u.tun_info.key, - saddr, daddr, tos, ttl, - 0, 0, tp_dst, tunnel_id, flags); - return tun_dst; -} - -static inline struct metadata_dst *rpl_ip_tun_rx_dst(struct sk_buff *skb, - __be16 flags, - __be64 tunnel_id, - int md_size) -{ - const struct iphdr *iph = ip_hdr(skb); - - return rpl__ip_tun_set_dst(iph->saddr, iph->daddr, iph->tos, iph->ttl, - 0, flags, tunnel_id, md_size); -} - -static inline -struct metadata_dst *rpl__ipv6_tun_set_dst(const struct in6_addr *saddr, - const struct in6_addr *daddr, - __u8 tos, __u8 ttl, - __be16 tp_dst, - __be32 label, - __be16 flags, - __be64 tunnel_id, - int md_size) -{ - struct metadata_dst *tun_dst; - struct ip_tunnel_info *info; - - tun_dst = rpl_tun_rx_dst(md_size); - if (!tun_dst) - return NULL; - - info = &tun_dst->u.tun_info; - info->mode = IP_TUNNEL_INFO_IPV6; - info->key.tun_flags = flags; - info->key.tun_id = tunnel_id; - info->key.tp_src = 0; - info->key.tp_dst = tp_dst; - - info->key.u.ipv6.src = *saddr; - info->key.u.ipv6.dst = *daddr; - - info->key.tos = tos; - info->key.ttl = ttl; - info->key.label = label; - - return tun_dst; -} - -static inline struct metadata_dst *rpl_ipv6_tun_rx_dst(struct sk_buff *skb, - __be16 flags, - __be64 tunnel_id, - int md_size) -{ - const struct ipv6hdr *ip6h = ipv6_hdr(skb); - - return rpl__ipv6_tun_set_dst(&ip6h->saddr, &ip6h->daddr, - ipv6_get_dsfield(ip6h), ip6h->hop_limit, - 0, ip6_flowlabel(ip6h), flags, tunnel_id, - md_size); -} - -static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen) -{ - struct dst_entry *dst; - - dst = &md_dst->dst; - -#if 0 - dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE, - DST_METADATA | DST_NOCACHE | DST_NOCOUNT); - - dst->input = dst_md_discard; - dst->output = dst_md_discard_out; -#endif - - memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst)); -} - -static inline struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags) -{ - struct metadata_dst *md_dst; - - md_dst = kmalloc(sizeof(*md_dst) + optslen, flags); - if (!md_dst) - return NULL; - - __metadata_dst_init(md_dst, optslen); - return md_dst; -} - -#define skb_tunnel_info ovs_skb_tunnel_info - -static inline void ovs_tun_rx_dst(struct metadata_dst *md_dst, int optslen) -{ - /* No need to allocate for OVS backport case. */ -#if 0 - struct metadata_dst *tun_dst; - struct ip_tunnel_info *info; - - tun_dst = metadata_dst_alloc(md_size, GFP_ATOMIC); - if (!tun_dst) - return NULL; -#endif - __metadata_dst_init(md_dst, optslen); -} - -static inline void ovs_ip_tun_rx_dst(struct metadata_dst *md_dst, - struct sk_buff *skb, __be16 flags, - __be64 tunnel_id, int md_size) -{ - const struct iphdr *iph = ip_hdr(skb); - - ovs_tun_rx_dst(md_dst, md_size); - ip_tunnel_key_init(&md_dst->u.tun_info.key, - iph->saddr, iph->daddr, iph->tos, iph->ttl, 0, - 0, 0, tunnel_id, flags); -} - -static inline void ovs_ipv6_tun_rx_dst(struct metadata_dst *md_dst, - struct sk_buff *skb, - __be16 flags, - __be64 tunnel_id, - int md_size) -{ - struct ip_tunnel_info *info = &md_dst->u.tun_info; - const struct ipv6hdr *ip6h = ipv6_hdr(skb); - - ovs_tun_rx_dst(md_dst, md_size); - info->mode = IP_TUNNEL_INFO_IPV6; - info->key.tun_flags = flags; - info->key.tun_id = tunnel_id; - info->key.tp_src = 0; - info->key.tp_dst = 0; - - info->key.u.ipv6.src = ip6h->saddr; - info->key.u.ipv6.dst = ip6h->daddr; - - info->key.tos = ipv6_get_dsfield(ip6h); - info->key.ttl = ip6h->hop_limit; - info->key.label = ip6_flowlabel(ip6h); -} - -#endif /* USE_UPSTREAM_TUNNEL */ - -void ovs_ip_tunnel_rcv(struct net_device *dev, struct sk_buff *skb, - struct metadata_dst *tun_dst); - -static inline struct metadata_dst * -rpl_metadata_dst_alloc(u8 optslen, enum metadata_type type, gfp_t flags) -{ -#if defined(HAVE_METADATA_DST_ALLOC_WITH_METADATA_TYPE) && defined(USE_UPSTREAM_TUNNEL) - return metadata_dst_alloc(optslen, type, flags); -#else - return metadata_dst_alloc(optslen, flags); -#endif -} -#define metadata_dst_alloc rpl_metadata_dst_alloc - -static inline bool rpl_skb_valid_dst(const struct sk_buff *skb) -{ - struct dst_entry *dst = skb_dst(skb); - - return dst && !(dst->flags & DST_METADATA); -} -#define skb_valid_dst rpl_skb_valid_dst - -#endif /* __NET_DST_METADATA_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/erspan.h b/datapath/linux/compat/include/net/erspan.h deleted file mode 100644 index 4a6a8f240..000000000 --- a/datapath/linux/compat/include/net/erspan.h +++ /dev/null @@ -1,342 +0,0 @@ -#ifndef USE_UPSTREAM_TUNNEL -#ifndef __LINUX_ERSPAN_H -#define __LINUX_ERSPAN_H - -/* - * GRE header for ERSPAN encapsulation (8 octets [34:41]) -- 8 bytes - * 0 1 2 3 - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |0|0|0|1|0|00000|000000000|00000| Protocol Type for ERSPAN | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Sequence Number (increments per packet per session) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Note that in the above GRE header [RFC1701] out of the C, R, K, S, - * s, Recur, Flags, Version fields only S (bit 03) is set to 1. The - * other fields are set to zero, so only a sequence number follows. - * - * ERSPAN Version 1 (Type II) header (8 octets [42:49]) - * 0 1 2 3 - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Ver | VLAN | COS | En|T| Session ID | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Reserved | Index | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * - * ERSPAN Version 2 (Type III) header (12 octets [42:49]) - * 0 1 2 3 - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Ver | VLAN | COS |BSO|T| Session ID | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Timestamp | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | SGT |P| FT | Hw ID |D|Gra|O| - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Platform Specific SubHeader (8 octets, optional) - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Platf ID | Platform Specific Info | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Platform Specific Info | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * GRE proto ERSPAN type II = 0x88BE, type III = 0x22EB - */ - -/* #include <uapi/linux/erspan.h> */ -/* Just insert uapi/linux/erspan.h here since - * we don't pull in uapi to compat - */ -/* ERSPAN version 2 metadata header */ -struct erspan_md2 { - __be32 timestamp; - __be16 sgt; /* security group tag */ -#if defined(__LITTLE_ENDIAN_BITFIELD) - __u8 hwid_upper:2, - ft:5, - p:1; - __u8 o:1, - gra:2, - dir:1, - hwid:4; -#elif defined(__BIG_ENDIAN_BITFIELD) - __u8 p:1, - ft:5, - hwid_upper:2; - __u8 hwid:4, - dir:1, - gra:2, - o:1; -#else -#error "Please fix <asm/byteorder.h>" -#endif -}; - -struct erspan_metadata { - int version; - union { - __be32 index; /* Version 1 (type II)*/ - struct erspan_md2 md2; /* Version 2 (type III) */ - } u; -}; - -#define ERSPAN_VERSION 0x1 /* ERSPAN type II */ -#define VER_MASK 0xf000 -#define VLAN_MASK 0x0fff -#define COS_MASK 0xe000 -#define EN_MASK 0x1800 -#define T_MASK 0x0400 -#define ID_MASK 0x03ff -#define INDEX_MASK 0xfffff - -#define ERSPAN_VERSION2 0x2 /* ERSPAN type III*/ -#define BSO_MASK EN_MASK -#define SGT_MASK 0xffff0000 -#define P_MASK 0x8000 -#define FT_MASK 0x7c00 -#define HWID_MASK 0x03f0 -#define DIR_MASK 0x0008 -#define GRA_MASK 0x0006 -#define O_MASK 0x0001 - -#define HWID_OFFSET 4 -#define DIR_OFFSET 3 - -enum erspan_encap_type { - ERSPAN_ENCAP_NOVLAN = 0x0, /* originally without VLAN tag */ - ERSPAN_ENCAP_ISL = 0x1, /* originally ISL encapsulated */ - ERSPAN_ENCAP_8021Q = 0x2, /* originally 802.1Q encapsulated */ - ERSPAN_ENCAP_INFRAME = 0x3, /* VLAN tag perserved in frame */ -}; - -#define ERSPAN_V1_MDSIZE 4 -#define ERSPAN_V2_MDSIZE 8 - -struct erspan_base_hdr { -#if defined(__LITTLE_ENDIAN_BITFIELD) - __u8 vlan_upper:4, - ver:4; - __u8 vlan:8; - __u8 session_id_upper:2, - t:1, - en:2, - cos:3; - __u8 session_id:8; -#elif defined(__BIG_ENDIAN_BITFIELD) - __u8 ver: 4, - vlan_upper:4; - __u8 vlan:8; - __u8 cos:3, - en:2, - t:1, - session_id_upper:2; - __u8 session_id:8; -#else -#error "Please fix <asm/byteorder.h>" -#endif -}; - -static inline void set_session_id(struct erspan_base_hdr *ershdr, u16 id) -{ - ershdr->session_id = id & 0xff; - ershdr->session_id_upper = (id >> 8) & 0x3; -} - -static inline u16 get_session_id(const struct erspan_base_hdr *ershdr) -{ - return (ershdr->session_id_upper << 8) + ershdr->session_id; -} - -static inline void set_vlan(struct erspan_base_hdr *ershdr, u16 vlan) -{ - ershdr->vlan = vlan & 0xff; - ershdr->vlan_upper = (vlan >> 8) & 0xf; -} - -static inline u16 get_vlan(const struct erspan_base_hdr *ershdr) -{ - return (ershdr->vlan_upper << 8) + ershdr->vlan; -} - -static inline void set_hwid(struct erspan_md2 *md2, u8 hwid) -{ - md2->hwid = hwid & 0xf; - md2->hwid_upper = (hwid >> 4) & 0x3; -} - -static inline u8 get_hwid(const struct erspan_md2 *md2) -{ - return (md2->hwid_upper << 4) + md2->hwid; -} - -static inline int erspan_hdr_len(int version) -{ - return sizeof(struct erspan_base_hdr) + - (version == 1 ? ERSPAN_V1_MDSIZE : ERSPAN_V2_MDSIZE); -} - -static inline u8 tos_to_cos(u8 tos) -{ - u8 dscp, cos; - - dscp = tos >> 2; - cos = dscp >> 3; - return cos; -} - -static inline void erspan_build_header(struct sk_buff *skb, - u32 id, u32 index, - bool truncate, bool is_ipv4) -{ - struct ethhdr *eth = (struct ethhdr *)skb->data; - enum erspan_encap_type enc_type; - struct erspan_base_hdr *ershdr; - struct qtag_prefix { - __be16 eth_type; - __be16 tci; - } *qp; - u16 vlan_tci = 0; - u8 tos; - __be32 *idx; - - tos = is_ipv4 ? ip_hdr(skb)->tos : - (ipv6_hdr(skb)->priority << 4) + - (ipv6_hdr(skb)->flow_lbl[0] >> 4); - - enc_type = ERSPAN_ENCAP_NOVLAN; - - /* If mirrored packet has vlan tag, extract tci and - * perserve vlan header in the mirrored frame. - */ - if (eth->h_proto == htons(ETH_P_8021Q)) { - qp = (struct qtag_prefix *)(skb->data + 2 * ETH_ALEN); - vlan_tci = ntohs(qp->tci); - enc_type = ERSPAN_ENCAP_INFRAME; - } - - skb_push(skb, sizeof(*ershdr) + ERSPAN_V1_MDSIZE); - ershdr = (struct erspan_base_hdr *)skb->data; - memset(ershdr, 0, sizeof(*ershdr) + ERSPAN_V1_MDSIZE); - - /* Build base header */ - ershdr->ver = ERSPAN_VERSION; - ershdr->cos = tos_to_cos(tos); - ershdr->en = enc_type; - ershdr->t = truncate; - set_vlan(ershdr, vlan_tci); - set_session_id(ershdr, id); - - /* Build metadata */ - idx = (__be32 *)(ershdr + 1); - *idx = htonl(index & INDEX_MASK); -} - -/* ERSPAN GRA: timestamp granularity - * 00b --> granularity = 100 microseconds - * 01b --> granularity = 100 nanoseconds - * 10b --> granularity = IEEE 1588 - * Here we only support 100 microseconds. - */ -static inline __be32 erspan_get_timestamp(void) -{ - u64 h_usecs; - ktime_t kt; - - kt = ktime_get_real(); - h_usecs = ktime_divns(kt, 100 * NSEC_PER_USEC); - - /* ERSPAN base header only has 32-bit, - * so it wraps around 4 days. - */ - return htonl((u32)h_usecs); -} - -/* ERSPAN BSO (Bad/Short/Oversized), see RFC1757 - * 00b --> Good frame with no error, or unknown integrity - * 01b --> Payload is a Short Frame - * 10b --> Payload is an Oversized Frame - * 11b --> Payload is a Bad Frame with CRC or Alignment Error - */ -enum erspan_bso { - BSO_NOERROR = 0x0, - BSO_SHORT = 0x1, - BSO_OVERSIZED = 0x2, - BSO_BAD = 0x3, -}; - -static inline u8 erspan_detect_bso(struct sk_buff *skb) -{ - /* BSO_BAD is not handled because the frame CRC - * or alignment error information is in FCS. - */ - if (skb->len < ETH_ZLEN) - return BSO_SHORT; - - if (skb->len > ETH_FRAME_LEN) - return BSO_OVERSIZED; - - return BSO_NOERROR; -} - -static inline void erspan_build_header_v2(struct sk_buff *skb, - u32 id, u8 direction, u16 hwid, - bool truncate, bool is_ipv4) -{ - struct ethhdr *eth = (struct ethhdr *)skb->data; - struct erspan_base_hdr *ershdr; - struct erspan_md2 *md2; - struct qtag_prefix { - __be16 eth_type; - __be16 tci; - } *qp; - u16 vlan_tci = 0; - u8 gra = 0; /* 100 usec */ - u8 bso = truncate; /* Bad/Short/Oversized */ - u8 sgt = 0; - u8 tos; - - tos = is_ipv4 ? ip_hdr(skb)->tos : - (ipv6_hdr(skb)->priority << 4) + - (ipv6_hdr(skb)->flow_lbl[0] >> 4); - - /* Unlike v1, v2 does not have En field, - * so only extract vlan tci field. - */ - if (eth->h_proto == htons(ETH_P_8021Q)) { - qp = (struct qtag_prefix *)(skb->data + 2 * ETH_ALEN); - vlan_tci = ntohs(qp->tci); - } - - bso = erspan_detect_bso(skb); - skb_push(skb, sizeof(*ershdr) + ERSPAN_V2_MDSIZE); - ershdr = (struct erspan_base_hdr *)skb->data; - memset(ershdr, 0, sizeof(*ershdr) + ERSPAN_V2_MDSIZE); - - /* Build base header */ - ershdr->ver = ERSPAN_VERSION2; - ershdr->cos = tos_to_cos(tos); - ershdr->en = bso; - ershdr->t = truncate; - set_vlan(ershdr, vlan_tci); - set_session_id(ershdr, id); - - /* Build metadata */ - md2 = (struct erspan_md2 *)(ershdr + 1); - md2->timestamp = erspan_get_timestamp(); - md2->sgt = htons(sgt); - md2->p = 1; - md2->ft = 0; - md2->dir = direction; - md2->gra = gra; - md2->o = 0; - set_hwid(md2, hwid); -} - -#endif -#else -#include_next <net/erspan.h> -#endif diff --git a/datapath/linux/compat/include/net/genetlink.h b/datapath/linux/compat/include/net/genetlink.h deleted file mode 100644 index 602ce38d3..000000000 --- a/datapath/linux/compat/include/net/genetlink.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef __NET_GENERIC_NETLINK_WRAPPER_H -#define __NET_GENERIC_NETLINK_WRAPPER_H 1 - -#include <linux/version.h> -#include <linux/netlink.h> -#include <net/net_namespace.h> -#include_next <net/genetlink.h> - -#ifndef HAVE_GENL_NOTIFY_TAKES_FAMILY -struct rpl_genl_family { - struct genl_family compat_family; - unsigned int id; - unsigned int hdrsize; - char name[GENL_NAMSIZ]; - unsigned int version; - unsigned int maxattr; - bool netnsok; - bool parallel_ops; - int (*pre_doit)(const struct genl_ops *ops, - struct sk_buff *skb, - struct genl_info *info); - void (*post_doit)(const struct genl_ops *ops, - struct sk_buff *skb, - struct genl_info *info); - struct nlattr ** attrbuf; /* private */ - const struct genl_ops * ops; /* private */ - const struct genl_multicast_group *mcgrps; /* private */ - unsigned int n_ops; /* private */ - unsigned int n_mcgrps; /* private */ - unsigned int mcgrp_offset; /* private */ - struct list_head family_list; /* private */ - struct module *module; -}; - -#define genl_family rpl_genl_family -static inline void *rpl_genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, - struct genl_family *family, int flags, u8 cmd) -{ - return genlmsg_put(skb, portid, seq, &family->compat_family, flags, cmd); -} - -#define genlmsg_put rpl_genlmsg_put - -static inline int rpl_genl_unregister_family(struct genl_family *family) -{ - return genl_unregister_family(&family->compat_family); -} -#define genl_unregister_family rpl_genl_unregister_family - -#define genl_set_err rpl_genl_set_err -static inline int genl_set_err(struct genl_family *family, struct net *net, - u32 portid, u32 group, int code) -{ -#ifdef HAVE_VOID_NETLINK_SET_ERR - netlink_set_err(net->genl_sock, portid, group, code); - return 0; -#else - return netlink_set_err(net->genl_sock, portid, group, code); -#endif -} - -#define genlmsg_multicast_netns rpl_genlmsg_multicast_netns -static inline int genlmsg_multicast_netns(struct genl_family *family, - struct net *net, struct sk_buff *skb, - u32 portid, unsigned int group, gfp_t flags) -{ - return nlmsg_multicast(net->genl_sock, skb, portid, group, flags); -} - - -#define __genl_register_family rpl___genl_register_family -int rpl___genl_register_family(struct genl_family *family); - -#define genl_register_family rpl_genl_register_family -static inline int rpl_genl_register_family(struct genl_family *family) -{ - family->module = THIS_MODULE; - return rpl___genl_register_family(family); -} -#endif - -#ifdef HAVE_GENL_NOTIFY_TAKES_NET -#define genl_notify rpl_genl_notify -void rpl_genl_notify(struct genl_family *family, struct sk_buff *skb, - struct genl_info *info , u32 group, gfp_t flags); -#endif - -#ifndef HAVE_GENL_HAS_LISTENERS -static inline int genl_has_listeners(struct genl_family *family, - struct net *net, unsigned int group) -{ -#ifdef HAVE_MCGRP_OFFSET - if (WARN_ON_ONCE(group >= family->n_mcgrps)) - return -EINVAL; - group = family->mcgrp_offset + group; -#endif - return netlink_has_listeners(net->genl_sock, group); -} -#else - -#ifndef HAVE_GENL_HAS_LISTENERS_TAKES_NET -static inline int rpl_genl_has_listeners(struct genl_family *family, - struct net *net, unsigned int group) -{ -#ifdef HAVE_GENL_NOTIFY_TAKES_FAMILY - return genl_has_listeners(family, net->genl_sock, group); -#else - return genl_has_listeners(&family->compat_family, net->genl_sock, group); -#endif -} - -#define genl_has_listeners rpl_genl_has_listeners -#endif - -#endif /* HAVE_GENL_HAS_LISTENERS */ - -#ifndef HAVE_NETLINK_EXT_ACK -struct netlink_ext_ack; - -static inline int rpl_genlmsg_parse(const struct nlmsghdr *nlh, - const struct genl_family *family, - struct nlattr *tb[], int maxtype, - const struct nla_policy *policy, - struct netlink_ext_ack *extack) -{ -#ifdef HAVE_GENLMSG_PARSE - return genlmsg_parse(nlh, family, tb, maxtype, policy); -#else - return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, - policy); -#endif -} -#define genlmsg_parse rpl_genlmsg_parse -#endif - -#endif /* genetlink.h */ diff --git a/datapath/linux/compat/include/net/geneve.h b/datapath/linux/compat/include/net/geneve.h deleted file mode 100644 index d9c9f0bf7..000000000 --- a/datapath/linux/compat/include/net/geneve.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef __NET_GENEVE_WRAPPER_H -#define __NET_GENEVE_WRAPPER_H 1 - -#ifdef CONFIG_INET -#include <net/udp_tunnel.h> -#endif - - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/geneve.h> - -static inline int rpl_geneve_init_module(void) -{ - return 0; -} -static inline void rpl_geneve_cleanup_module(void) -{} - -#define geneve_xmit dev_queue_xmit - -#ifdef CONFIG_INET -#ifndef HAVE_NAME_ASSIGN_TYPE -static inline struct net_device *rpl_geneve_dev_create_fb( - struct net *net, const char *name, u8 name_assign_type, u16 dst_port) { - return geneve_dev_create_fb(net, name, dst_port); -} -#define geneve_dev_create_fb rpl_geneve_dev_create_fb -#endif -#endif - -#else -/* Geneve Header: - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |Ver| Opt Len |O|C| Rsvd. | Protocol Type | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Virtual Network Identifier (VNI) | Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Variable Length Options | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Option Header: - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Option Class | Type |R|R|R| Length | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Variable Option Data | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - -struct geneve_opt { - __be16 opt_class; - u8 type; -#ifdef __LITTLE_ENDIAN_BITFIELD - u8 length:5; - u8 r3:1; - u8 r2:1; - u8 r1:1; -#else - u8 r1:1; - u8 r2:1; - u8 r3:1; - u8 length:5; -#endif - u8 opt_data[]; -}; - -#define GENEVE_CRIT_OPT_TYPE (1 << 7) - -struct genevehdr { -#ifdef __LITTLE_ENDIAN_BITFIELD - u8 opt_len:6; - u8 ver:2; - u8 rsvd1:6; - u8 critical:1; - u8 oam:1; -#else - u8 ver:2; - u8 opt_len:6; - u8 oam:1; - u8 critical:1; - u8 rsvd1:6; -#endif - __be16 proto_type; - u8 vni[3]; - u8 rsvd2; - struct geneve_opt options[]; -}; - -#ifdef CONFIG_INET -#define geneve_dev_create_fb rpl_geneve_dev_create_fb -struct net_device *rpl_geneve_dev_create_fb(struct net *net, const char *name, - u8 name_assign_type, u16 dst_port); -#endif /*ifdef CONFIG_INET */ - -int rpl_geneve_init_module(void); -void rpl_geneve_cleanup_module(void); - -#define geneve_xmit rpl_geneve_xmit -netdev_tx_t rpl_geneve_xmit(struct sk_buff *skb); - -#endif -#define geneve_init_module rpl_geneve_init_module -#define geneve_cleanup_module rpl_geneve_cleanup_module - -#define geneve_fill_metadata_dst ovs_geneve_fill_metadata_dst -int ovs_geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); - -#endif /*ifdef__NET_GENEVE_H */ diff --git a/datapath/linux/compat/include/net/gre.h b/datapath/linux/compat/include/net/gre.h deleted file mode 100644 index 57293b6c2..000000000 --- a/datapath/linux/compat/include/net/gre.h +++ /dev/null @@ -1,191 +0,0 @@ -#ifndef __LINUX_GRE_WRAPPER_H -#define __LINUX_GRE_WRAPPER_H - -#include <linux/version.h> -#include <linux/skbuff.h> -#include <net/ip_tunnels.h> - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/gre.h> - -static inline int rpl_ipgre_init(void) -{ - return 0; -} -static inline void rpl_ipgre_fini(void) -{} - -static inline int rpl_ip6gre_init(void) -{ - return 0; -} - -static inline void rpl_ip6gre_fini(void) -{} - -static inline int rpl_ip6_tunnel_init(void) -{ - return 0; -} - -static inline void rpl_ip6_tunnel_cleanup(void) -{ -} - -static inline int rpl_gre_init(void) -{ - return 0; -} - -static inline void rpl_gre_exit(void) -{ -} - -#define gre_fb_xmit dev_queue_xmit - -#ifdef CONFIG_INET -#ifndef HAVE_NAME_ASSIGN_TYPE -static inline struct net_device *rpl_gretap_fb_dev_create( - struct net *net, const char *name, u8 name_assign_type) { - return gretap_fb_dev_create(net, name); -} -#define gretap_fb_dev_create rpl_gretap_fb_dev_create -#endif -#endif - -#else -#include_next <net/gre.h> - -#ifndef HAVE_GRE_CALC_HLEN -static inline int gre_calc_hlen(__be16 o_flags) -{ - int addend = 4; - - if (o_flags & TUNNEL_CSUM) - addend += 4; - if (o_flags & TUNNEL_KEY) - addend += 4; - if (o_flags & TUNNEL_SEQ) - addend += 4; - return addend; -} - -#define ip_gre_calc_hlen gre_calc_hlen -#else -#ifdef HAVE_IP_GRE_CALC_HLEN -#define gre_calc_hlen ip_gre_calc_hlen -#endif -#endif - -#define tnl_flags_to_gre_flags rpl_tnl_flags_to_gre_flags -static inline __be16 rpl_tnl_flags_to_gre_flags(__be16 tflags) -{ - __be16 flags = 0; - - if (tflags & TUNNEL_CSUM) - flags |= GRE_CSUM; - if (tflags & TUNNEL_ROUTING) - flags |= GRE_ROUTING; - if (tflags & TUNNEL_KEY) - flags |= GRE_KEY; - if (tflags & TUNNEL_SEQ) - flags |= GRE_SEQ; - if (tflags & TUNNEL_STRICT) - flags |= GRE_STRICT; - if (tflags & TUNNEL_REC) - flags |= GRE_REC; - if (tflags & TUNNEL_VERSION) - flags |= GRE_VERSION; - - return flags; -} - -#define gre_flags_to_tnl_flags rpl_gre_flags_to_tnl_flags -static inline __be16 rpl_gre_flags_to_tnl_flags(__be16 flags) -{ - __be16 tflags = 0; - - if (flags & GRE_CSUM) - tflags |= TUNNEL_CSUM; - if (flags & GRE_ROUTING) - tflags |= TUNNEL_ROUTING; - if (flags & GRE_KEY) - tflags |= TUNNEL_KEY; - if (flags & GRE_SEQ) - tflags |= TUNNEL_SEQ; - if (flags & GRE_STRICT) - tflags |= TUNNEL_STRICT; - if (flags & GRE_REC) - tflags |= TUNNEL_REC; - if (flags & GRE_VERSION) - tflags |= TUNNEL_VERSION; - - return tflags; -} -#define gre_tnl_flags_to_gre_flags rpl_gre_tnl_flags_to_gre_flags -static inline __be16 rpl_gre_tnl_flags_to_gre_flags(__be16 tflags) -{ - __be16 flags = 0; - - if (tflags & TUNNEL_CSUM) - flags |= GRE_CSUM; - if (tflags & TUNNEL_ROUTING) - flags |= GRE_ROUTING; - if (tflags & TUNNEL_KEY) - flags |= GRE_KEY; - if (tflags & TUNNEL_SEQ) - flags |= GRE_SEQ; - if (tflags & TUNNEL_STRICT) - flags |= GRE_STRICT; - if (tflags & TUNNEL_REC) - flags |= GRE_REC; - if (tflags & TUNNEL_VERSION) - flags |= GRE_VERSION; - - return flags; -} - -#define gre_build_header rpl_gre_build_header -void rpl_gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, - int hdr_len); - -int rpl_ipgre_init(void); -void rpl_ipgre_fini(void); -int rpl_ip6gre_init(void); -void rpl_ip6gre_fini(void); -int rpl_ip6_tunnel_init(void); -void rpl_ip6_tunnel_cleanup(void); -int rpl_gre_init(void); -void rpl_gre_exit(void); - -#define gretap_fb_dev_create rpl_gretap_fb_dev_create -struct net_device *rpl_gretap_fb_dev_create(struct net *net, const char *name, - u8 name_assign_type); - -#define gre_parse_header rpl_gre_parse_header -int rpl_gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, - bool *csum_err, __be16 proto, int nhs); - -#define gre_fb_xmit rpl_gre_fb_xmit -netdev_tx_t rpl_gre_fb_xmit(struct sk_buff *skb); - -#define gre_add_protocol rpl_gre_add_protocol -int rpl_gre_add_protocol(const struct gre_protocol *proto, u8 version); -#define gre_del_protocol rpl_gre_del_protocol -int rpl_gre_del_protocol(const struct gre_protocol *proto, u8 version); -#endif /* USE_UPSTREAM_TUNNEL */ - -#define ipgre_init rpl_ipgre_init -#define ipgre_fini rpl_ipgre_fini -#define ip6gre_init rpl_ip6gre_init -#define ip6gre_fini rpl_ip6gre_fini -#define ip6_tunnel_init rpl_ip6_tunnel_init -#define ip6_tunnel_cleanup rpl_ip6_tunnel_cleanup -#define gre_init rpl_gre_init -#define gre_exit rpl_gre_exit - -#define gre_fill_metadata_dst ovs_gre_fill_metadata_dst -int ovs_gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); - - -#endif diff --git a/datapath/linux/compat/include/net/inet_ecn.h b/datapath/linux/compat/include/net/inet_ecn.h deleted file mode 100644 index f0591b322..000000000 --- a/datapath/linux/compat/include/net/inet_ecn.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef _INET_ECN_WRAPPER_H_ -#define _INET_ECN_WRAPPER_H_ - -#include_next <net/inet_ecn.h> - -#define INET_ECN_decapsulate rpl_INET_ECN_decapsulate -static inline int INET_ECN_decapsulate(struct sk_buff *skb, - __u8 outer, __u8 inner) -{ - if (INET_ECN_is_not_ect(inner)) { - switch (outer & INET_ECN_MASK) { - case INET_ECN_NOT_ECT: - return 0; - case INET_ECN_ECT_0: - case INET_ECN_ECT_1: - return 1; - case INET_ECN_CE: - return 2; - } - } - - if (INET_ECN_is_ce(outer)) - INET_ECN_set_ce(skb); - - return 0; -} - -#define IP_ECN_decapsulate rpl_IP_ECN_decapsulate -static inline int IP_ECN_decapsulate(const struct iphdr *oiph, - struct sk_buff *skb) -{ - __u8 inner; - - if (skb->protocol == htons(ETH_P_IP)) - inner = ip_hdr(skb)->tos; - else if (skb->protocol == htons(ETH_P_IPV6)) - inner = ipv6_get_dsfield(ipv6_hdr(skb)); - else - return 0; - - return INET_ECN_decapsulate(skb, oiph->tos, inner); -} - -#define IP6_ECN_decapsulate rpl_IP6_ECN_decapsulate -static inline int IP6_ECN_decapsulate(const struct ipv6hdr *oipv6h, - struct sk_buff *skb) -{ - __u8 inner; - - if (skb->protocol == htons(ETH_P_IP)) - inner = ip_hdr(skb)->tos; - else if (skb->protocol == htons(ETH_P_IPV6)) - inner = ipv6_get_dsfield(ipv6_hdr(skb)); - else - return 0; - - return INET_ECN_decapsulate(skb, ipv6_get_dsfield(oipv6h), inner); -} -#endif diff --git a/datapath/linux/compat/include/net/inet_frag.h b/datapath/linux/compat/include/net/inet_frag.h deleted file mode 100644 index 00784da2b..000000000 --- a/datapath/linux/compat/include/net/inet_frag.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __NET_INET_FRAG_WRAPPER_H -#define __NET_INET_FRAG_WRAPPER_H 1 - -#include <linux/version.h> -#include_next <net/inet_frag.h> - -#ifdef HAVE_INET_FRAGS_LAST_IN -#define q_flags(q) (q->last_in) -#define qp_flags(qp) (qp->q.last_in) -#else -#define q_flags(q) (q->flags) -#define qp_flags(qp) (qp->q.flags) -#endif - -#ifndef HAVE_CORRECT_MRU_HANDLING -#ifndef HAVE_INET_FRAG_EVICTING -static inline bool inet_frag_evicting(struct inet_frag_queue *q) -{ -#ifdef HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR - return !hlist_unhashed(&q->list_evictor); -#else - return (q_flags(q) & INET_FRAG_FIRST_IN) && q->fragments != NULL; -#endif /* HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR */ -} -#endif /* HAVE_INET_FRAG_EVICTING */ -#endif /* HAVE_CORRECT_MRU_HANDLING */ - -/* Upstream commit 3fd588eb90bf ("inet: frag: remove lru list") dropped this - * function, but we call it from our compat code. Provide a noop version. */ -#ifndef HAVE_INET_FRAG_LRU_MOVE -#define inet_frag_lru_move(q) -#endif - -#ifdef HAVE_INET_FRAG_FQDIR -#define netns_frags fqdir -#endif - -#ifndef HAVE_SUB_FRAG_MEM_LIMIT_ARG_STRUCT_NETNS_FRAGS -#ifdef HAVE_FRAG_PERCPU_COUNTER_BATCH -static inline void rpl_sub_frag_mem_limit(struct netns_frags *nf, int i) -{ - __percpu_counter_add(&nf->mem, -i, frag_percpu_counter_batch); -} -#define sub_frag_mem_limit rpl_sub_frag_mem_limit - -static inline void rpl_add_frag_mem_limit(struct netns_frags *nf, int i) -{ - __percpu_counter_add(&nf->mem, i, frag_percpu_counter_batch); -} -#define add_frag_mem_limit rpl_add_frag_mem_limit -#else /* !frag_percpu_counter_batch */ -static inline void rpl_sub_frag_mem_limit(struct netns_frags *nf, int i) -{ -#ifdef HAVE_INET_FRAG_FQDIR - atomic_long_sub(i, &nf->mem); -#else - atomic_sub(i, &nf->mem); -#endif -} -#define sub_frag_mem_limit rpl_sub_frag_mem_limit - -static inline void rpl_add_frag_mem_limit(struct netns_frags *nf, int i) -{ -#ifdef HAVE_INET_FRAG_FQDIR - atomic_long_add(i, &nf->mem); -#else - atomic_add(i, &nf->mem); -#endif -} -#define add_frag_mem_limit rpl_add_frag_mem_limit -#endif /* frag_percpu_counter_batch */ -#endif - -#ifdef HAVE_VOID_INET_FRAGS_INIT -static inline int rpl_inet_frags_init(struct inet_frags *frags) -{ - inet_frags_init(frags); - return 0; -} -#define inet_frags_init rpl_inet_frags_init -#endif - -#endif /* inet_frag.h */ diff --git a/datapath/linux/compat/include/net/inetpeer.h b/datapath/linux/compat/include/net/inetpeer.h deleted file mode 100644 index c5f5eb12b..000000000 --- a/datapath/linux/compat/include/net/inetpeer.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _NET_INETPEER_WRAPPER_H -#define _NET_INETPEER_WRAPPER_H - -#include_next <net/inetpeer.h> - -#ifndef HAVE_INETPEER_VIF_SUPPORT -static inline struct inet_peer *rpl_inet_getpeer_v4(struct inet_peer_base *base, - __be32 v4daddr, int vif, - int create) -{ - return inet_getpeer_v4(base, v4daddr, create); -} -#define inet_getpeer_v4 rpl_inet_getpeer_v4 -#endif /* HAVE_INETPEER_VIF_SUPPORT */ - -#endif /* _NET_INETPEER_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/ip.h b/datapath/linux/compat/include/net/ip.h deleted file mode 100644 index ad5ac33ee..000000000 --- a/datapath/linux/compat/include/net/ip.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef __NET_IP_WRAPPER_H -#define __NET_IP_WRAPPER_H 1 - -#include_next <net/ip.h> - -#include <net/route.h> -#include <linux/version.h> - -#ifndef HAVE_INET_GET_LOCAL_PORT_RANGE_USING_NET -static inline void rpl_inet_get_local_port_range(struct net *net, int *low, - int *high) -{ - inet_get_local_port_range(low, high); -} -#define inet_get_local_port_range rpl_inet_get_local_port_range - -#endif - -#ifndef IPSKB_FRAG_PMTU -#define IPSKB_FRAG_PMTU BIT(6) -#endif - -/* IPv4 datagram length is stored into 16bit field (tot_len) */ -#ifndef IP_MAX_MTU -#define IP_MAX_MTU 0xFFFFU -#endif - -#ifndef HAVE_IP_SKB_DST_MTU -static inline bool rpl_ip_sk_use_pmtu(const struct sock *sk) -{ - return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE; -} -#define ip_sk_use_pmtu rpl_ip_sk_use_pmtu - -static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst, - bool forwarding) -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) - struct net *net = dev_net(dst->dev); - - if (net->ipv4.sysctl_ip_fwd_use_pmtu || - dst_metric_locked(dst, RTAX_MTU) || - !forwarding) - return dst_mtu(dst); -#endif - - return min(dst->dev->mtu, IP_MAX_MTU); -} - -static inline unsigned int rpl_ip_skb_dst_mtu(const struct sk_buff *skb) -{ - if (!skb->sk || ip_sk_use_pmtu(skb->sk)) { - bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED; - return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding); - } else { - return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU); - } -} -#define ip_skb_dst_mtu rpl_ip_skb_dst_mtu -#endif /* HAVE_IP_SKB_DST_MTU */ - -#ifdef HAVE_IP_FRAGMENT_TAKES_SOCK -#ifdef HAVE_IP_LOCAL_OUT_TAKES_NET -#define OVS_VPORT_OUTPUT_PARAMS struct net *net, struct sock *sock, struct sk_buff *skb -#else -#define OVS_VPORT_OUTPUT_PARAMS struct sock *sock, struct sk_buff *skb -#endif -#else -#define OVS_VPORT_OUTPUT_PARAMS struct sk_buff *skb -#endif - -/* Prior to upstream commit d6b915e29f4a ("ip_fragment: don't forward - * defragmented DF packet"), IPCB(skb)->frag_max_size was not always populated - * correctly, which would lead to reassembled packets not being refragmented. - * So, we backport all of ip_defrag() in these cases. - */ -#ifndef HAVE_CORRECT_MRU_HANDLING - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0) -static inline bool ip_defrag_user_in_between(u32 user, - enum ip_defrag_users lower_bond, - enum ip_defrag_users upper_bond) -{ - return user >= lower_bond && user <= upper_bond; -} -#endif /* < v4.2 */ - -int rpl_ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, - int (*output)(OVS_VPORT_OUTPUT_PARAMS)); -#define ip_do_fragment rpl_ip_do_fragment - -/* If backporting IP defrag, then init/exit functions need to be called from - * compat_{in,ex}it() to prepare the backported fragmentation cache. In this - * case we declare the functions which are defined in - * datapath/linux/compat/ip_fragment.c. */ -int rpl_ip_defrag(struct net *net, struct sk_buff *skb, u32 user); -#define ip_defrag rpl_ip_defrag -int __init rpl_ipfrag_init(void); -void rpl_ipfrag_fini(void); -void ovs_netns_frags_init(struct net *net); -void ovs_netns_frags_exit(struct net *net); - -#else /* HAVE_CORRECT_MRU_HANDLING */ - -#ifndef HAVE_IP_DO_FRAGMENT_TAKES_NET -static inline int rpl_ip_do_fragment(struct net *net, struct sock *sk, - struct sk_buff *skb, - int (*output)(OVS_VPORT_OUTPUT_PARAMS)) -{ - return ip_do_fragment(sk, skb, output); -} -#define ip_do_fragment rpl_ip_do_fragment -#endif /* IP_DO_FRAGMENT_TAKES_NET */ - -/* We have no good way to detect the presence of upstream commit 8282f27449bf - * ("inet: frag: Always orphan skbs inside ip_defrag()"), but it should be - * always included in kernels 4.5+. */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0) -static inline int rpl_ip_defrag(struct net *net, struct sk_buff *skb, u32 user) -{ - skb_orphan(skb); -#ifndef HAVE_IP_DEFRAG_TAKES_NET - return ip_defrag(skb, user); -#else - return ip_defrag(net, skb, user); -#endif -} -#define ip_defrag rpl_ip_defrag -#endif - -/* If we can use upstream defrag then we can rely on the upstream - * defrag module to init/exit correctly. In this case the calls in - * compat_{in,ex}it() can be no-ops. */ -static inline int rpl_ipfrag_init(void) { return 0; } -static inline void rpl_ipfrag_fini(void) { } -static inline void ovs_netns_frags_init(struct net *net) { } -static inline void ovs_netns_frags_exit(struct net *net) { } -#endif /* HAVE_CORRECT_MRU_HANDLING */ - -#define ipfrag_init rpl_ipfrag_init -#define ipfrag_fini rpl_ipfrag_fini - -#endif diff --git a/datapath/linux/compat/include/net/ip6_fib.h b/datapath/linux/compat/include/net/ip6_fib.h deleted file mode 100644 index 0cc435813..000000000 --- a/datapath/linux/compat/include/net/ip6_fib.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Linux INET6 implementation - * - * Authors: - * Pedro Roque <roque@di.fc.ul.pt> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ - -#ifndef _IP6_FIB_WRAPPER_H -#define _IP6_FIB_WRAPPER_H - -#include_next <net/ip6_fib.h> - -#ifndef HAVE_RT6_GET_COOKIE - -#ifndef RTF_PCPU -#define RTF_PCPU 0x40000000 -#endif - -#ifndef RTF_LOCAL -#define RTF_LOCAL 0x80000000 -#endif - -#define rt6_get_cookie rpl_rt6_get_cookie -static inline u32 rt6_get_cookie(const struct rt6_info *rt) -{ - if (rt->rt6i_flags & RTF_PCPU || -#ifdef HAVE_DST_NOCACHE - (unlikely(rt->dst.flags & DST_NOCACHE) && rt->dst.from)) -#else - (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->dst.from)) -#endif - rt = (struct rt6_info *)(rt->dst.from); - - return rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; -} -#endif - -#endif diff --git a/datapath/linux/compat/include/net/ip6_route.h b/datapath/linux/compat/include/net/ip6_route.h deleted file mode 100644 index 7c78fd5c6..000000000 --- a/datapath/linux/compat/include/net/ip6_route.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __NET_IP6_ROUTE_WRAPPER -#define __NET_IP6_ROUTE_WRAPPER - -#include <net/route.h> -#include <net/ip.h> /* For OVS_VPORT_OUTPUT_PARAMS */ -#include <net/ipv6.h> - -#include_next<net/ip6_route.h> - -#ifndef HAVE_NF_IPV6_OPS_FRAGMENT -int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb, - int (*output)(OVS_VPORT_OUTPUT_PARAMS)); -#define ip6_fragment rpl_ip6_fragment -#endif /* HAVE_NF_IPV6_OPS_FRAGMENT */ - -#endif /* _NET_IP6_ROUTE_WRAPPER */ diff --git a/datapath/linux/compat/include/net/ip6_tunnel.h b/datapath/linux/compat/include/net/ip6_tunnel.h deleted file mode 100644 index e0a33a646..000000000 --- a/datapath/linux/compat/include/net/ip6_tunnel.h +++ /dev/null @@ -1,208 +0,0 @@ -#ifndef NET_IP6_TUNNEL_WRAPPER_H -#define NET_IP6_TUNNEL_WRAPPER_H 1 - -#ifdef HAVE_IP6_TNL_PARM_ERSPAN_VER -#include_next <net/ip6_tunnel.h> -#else - -#include <linux/ipv6.h> -#include <linux/netdevice.h> -#include <linux/if_tunnel.h> -#include <linux/ip6_tunnel.h> -#include <net/ip_tunnels.h> -#include <net/dst_cache.h> -#include <net/dst_metadata.h> -#include "gso.h" - -#define IP6TUNNEL_ERR_TIMEO (30*HZ) - -/* capable of sending packets */ -#define IP6_TNL_F_CAP_XMIT 0x10000 -/* capable of receiving packets */ -#define IP6_TNL_F_CAP_RCV 0x20000 -/* determine capability on a per-packet basis */ -#define IP6_TNL_F_CAP_PER_PACKET 0x40000 - -#ifndef IP6_TNL_F_ALLOW_LOCAL_REMOTE -#define IP6_TNL_F_ALLOW_LOCAL_REMOTE 0 -#endif - -struct rpl__ip6_tnl_parm { - char name[IFNAMSIZ]; /* name of tunnel device */ - int link; /* ifindex of underlying L2 interface */ - __u8 proto; /* tunnel protocol */ - __u8 encap_limit; /* encapsulation limit for tunnel */ - __u8 hop_limit; /* hop limit for tunnel */ - bool collect_md; - __be32 flowinfo; /* traffic class and flowlabel for tunnel */ - __u32 flags; /* tunnel flags */ - struct in6_addr laddr; /* local tunnel end-point address */ - struct in6_addr raddr; /* remote tunnel end-point address */ - - __be16 i_flags; - __be16 o_flags; - __be32 i_key; - __be32 o_key; - - __u32 fwmark; - __u32 index; /* ERSPAN type II index */ - __u8 erspan_ver; /* ERSPAN version */ - __u8 dir; /* direction */ - __u16 hwid; /* hwid */ -}; - -#define __ip6_tnl_parm rpl__ip6_tnl_parm - -/* IPv6 tunnel */ -struct rpl_ip6_tnl { - struct rpl_ip6_tnl __rcu *next; /* next tunnel in list */ - struct net_device *dev; /* virtual device associated with tunnel */ - struct net *net; /* netns for packet i/o */ - struct __ip6_tnl_parm parms; /* tunnel configuration parameters */ - struct flowi fl; /* flowi template for xmit */ - struct dst_cache dst_cache; /* cached dst */ - struct gro_cells gro_cells; - - int err_count; - unsigned long err_time; - - /* These fields used only by GRE */ - __u32 i_seqno; /* The last seen seqno */ - __u32 o_seqno; /* The last output seqno */ - int hlen; /* tun_hlen + encap_hlen */ - int tun_hlen; /* Precalculated header length */ - int encap_hlen; /* Encap header length (FOU,GUE) */ - struct ip_tunnel_encap encap; - int mlink; -}; - -#define ip6_tnl rpl_ip6_tnl - -struct rpl_ip6_tnl_encap_ops { - size_t (*encap_hlen)(struct ip_tunnel_encap *e); - int (*build_header)(struct sk_buff *skb, struct ip_tunnel_encap *e, - u8 *protocol, struct flowi6 *fl6); -}; - -#define ip6_tnl_encap_ops rpl_ip6_tnl_encap_ops - -#ifdef CONFIG_INET - -#ifndef MAX_IPTUN_ENCAP_OPS -#define MAX_IPTUN_ENCAP_OPS 8 -#endif - -extern const struct ip6_tnl_encap_ops __rcu * - rpl_ip6tun_encaps[MAX_IPTUN_ENCAP_OPS]; - -int rpl_ip6_tnl_encap_add_ops(const struct ip6_tnl_encap_ops *ops, - unsigned int num); -#define ip6_tnl_encap_add_ops rpl_ip6_tnl_encap_add_ops -int rpl_ip6_tnl_encap_del_ops(const struct ip6_tnl_encap_ops *ops, - unsigned int num); -#define ip6_tnl_encap_del_ops rpl_ip6_tnl_encap_del_ops -int rpl_ip6_tnl_encap_setup(struct ip6_tnl *t, - struct ip_tunnel_encap *ipencap); -#define ip6_tnl_encap_setup rpl_ip6_tnl_encap_setup - -#ifndef HAVE_TUNNEL_ENCAP_TYPES -enum tunnel_encap_types { - TUNNEL_ENCAP_NONE, - TUNNEL_ENCAP_FOU, - TUNNEL_ENCAP_GUE, -}; - -#endif -static inline int ip6_encap_hlen(struct ip_tunnel_encap *e) -{ - const struct ip6_tnl_encap_ops *ops; - int hlen = -EINVAL; - - if (e->type == TUNNEL_ENCAP_NONE) - return 0; - - if (e->type >= MAX_IPTUN_ENCAP_OPS) - return -EINVAL; - - rcu_read_lock(); - ops = rcu_dereference(rpl_ip6tun_encaps[e->type]); - if (likely(ops && ops->encap_hlen)) - hlen = ops->encap_hlen(e); - rcu_read_unlock(); - - return hlen; -} - -static inline int ip6_tnl_encap(struct sk_buff *skb, struct ip6_tnl *t, - u8 *protocol, struct flowi6 *fl6) -{ - const struct ip6_tnl_encap_ops *ops; - int ret = -EINVAL; - - if (t->encap.type == TUNNEL_ENCAP_NONE) - return 0; - - if (t->encap.type >= MAX_IPTUN_ENCAP_OPS) - return -EINVAL; - - rcu_read_lock(); - ops = rcu_dereference(rpl_ip6tun_encaps[t->encap.type]); - if (likely(ops && ops->build_header)) - ret = ops->build_header(skb, &t->encap, protocol, fl6); - rcu_read_unlock(); - - return ret; -} - -/* Tunnel encapsulation limit destination sub-option */ - -struct ipv6_tlv_tnl_enc_lim { - __u8 type; /* type-code for option */ - __u8 length; /* option length */ - __u8 encap_limit; /* tunnel encapsulation limit */ -} __packed; - -int rpl_ip6_tnl_rcv_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, - const struct in6_addr *raddr); -#define ip6_tnl_rcv_ctl rpl_ip6_tnl_rcv_ctl -int rpl_ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, - const struct tnl_ptk_info *tpi, - struct metadata_dst *tun_dst, - bool log_ecn_error); -#define ip6_tnl_rcv rpl_ip6_tnl_rcv -int rpl_ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, - const struct in6_addr *raddr); -#define ip6_tnl_xmit_ctl rpl_ip6_tnl_xmit_ctl -int rpl_ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield, - struct flowi6 *fl6, int encap_limit, __u32 *pmtu, - __u8 proto); -#define ip6_tnl_xmit rpl_ip6_tnl_xmit -__u16 rpl_ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw); -#define ip6_tnl_parse_tlv_enc_lim rpl_ip6_tnl_parse_tlv_enc_lim -__u32 rpl_ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr, - const struct in6_addr *raddr); -#define ip6_tnl_get_cap rpl_ip6_tnl_get_cap -struct net *rpl_ip6_tnl_get_link_net(const struct net_device *dev); -#define ip6_tnl_get_link_net rpl_ip6_tnl_get_link_net -int rpl_ip6_tnl_get_iflink(const struct net_device *dev); -#define ip6_tnl_get_iflink rpl_ip6_tnl_get_iflink -int rpl_ip6_tnl_change_mtu(struct net_device *dev, int new_mtu); -#define ip6_tnl_change_mtu rpl_ip6_tnl_change_mtu - -static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb, - struct net_device *dev) -{ - int pkt_len, err; - - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - pkt_len = skb->len - skb_inner_network_offset(skb); - err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb); - if (unlikely(net_xmit_eval(err))) - pkt_len = -1; - iptunnel_xmit_stats(dev, pkt_len); -} -#endif - -#endif /* HAVE_IP6_TNL_PARM_ERSPAN_VER */ - -#endif diff --git a/datapath/linux/compat/include/net/ip_tunnels.h b/datapath/linux/compat/include/net/ip_tunnels.h deleted file mode 100644 index 617a753c7..000000000 --- a/datapath/linux/compat/include/net/ip_tunnels.h +++ /dev/null @@ -1,513 +0,0 @@ -#ifndef __NET_IP_TUNNELS_WRAPPER_H -#define __NET_IP_TUNNELS_WRAPPER_H 1 - -#include <linux/version.h> - -#ifdef USE_UPSTREAM_TUNNEL -/* Block all ip_tunnel functions. - * Only function that do not depend on ip_tunnel structure can - * be used. Those needs to be explicitly defined in this header file. */ -#include_next <net/ip_tunnels.h> - -#ifndef TUNNEL_ERSPAN_OPT -#define TUNNEL_ERSPAN_OPT __cpu_to_be16(0x4000) -#endif -#define ovs_ip_tunnel_encap ip_tunnel_encap - -#ifndef HAVE_IP_TUNNEL_INFO_OPTS_SET_FLAGS -static inline void rpl_ip_tunnel_info_opts_set(struct ip_tunnel_info *info, - const void *from, int len, - __be16 flags) -{ - memcpy(ip_tunnel_info_opts(info), from, len); - info->options_len = len; - info->key.tun_flags |= flags; -} - -#define ip_tunnel_info_opts_set rpl_ip_tunnel_info_opts_set -#endif - -#else /* USE_UPSTREAM_TUNNEL */ - -#include <linux/if_tunnel.h> -#include <linux/types.h> -#include <net/dsfield.h> -#include <net/dst_cache.h> -#include <net/flow.h> -#include <net/inet_ecn.h> -#include <net/ip.h> -#include <net/rtnetlink.h> -#include <net/gro_cells.h> - -#ifndef MAX_IPTUN_ENCAP_OPS -#define MAX_IPTUN_ENCAP_OPS 8 -#endif - -#ifndef HAVE_TUNNEL_ENCAP_TYPES -enum tunnel_encap_types { - TUNNEL_ENCAP_NONE, - TUNNEL_ENCAP_FOU, - TUNNEL_ENCAP_GUE, -}; - -#define HAVE_TUNNEL_ENCAP_TYPES 1 -#endif - -#define __iptunnel_pull_header rpl___iptunnel_pull_header -int rpl___iptunnel_pull_header(struct sk_buff *skb, int hdr_len, - __be16 inner_proto, bool raw_proto, bool xnet); - -#define iptunnel_pull_header rpl_iptunnel_pull_header -static inline int rpl_iptunnel_pull_header(struct sk_buff *skb, int hdr_len, - __be16 inner_proto, bool xnet) -{ - return rpl___iptunnel_pull_header(skb, hdr_len, inner_proto, false, xnet); -} - -int ovs_iptunnel_handle_offloads(struct sk_buff *skb, - int gso_type_mask, - void (*fix_segment)(struct sk_buff *)); - -/* This is required to compile upstream gre.h. gre_handle_offloads() - * is defined in gre.h and needs iptunnel_handle_offloads(). This provides - * default signature for this function. - * rpl prefix is to make OVS build happy. - */ -#define iptunnel_handle_offloads rpl_iptunnel_handle_offloads -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -struct sk_buff *rpl_iptunnel_handle_offloads(struct sk_buff *skb, - bool csum_help, - int gso_type_mask); -#else -int rpl_iptunnel_handle_offloads(struct sk_buff *skb, - bool csum_help, - int gso_type_mask); -#endif - -#define iptunnel_xmit rpl_iptunnel_xmit -void rpl_iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 proto, __u8 tos, __u8 ttl, - __be16 df, bool xnet); -#define ip_tunnel_xmit rpl_ip_tunnel_xmit -void rpl_ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, - const struct iphdr *tnl_params, const u8 protocol); - - -#ifndef TUNNEL_CSUM -#define TUNNEL_CSUM __cpu_to_be16(0x01) -#define TUNNEL_ROUTING __cpu_to_be16(0x02) -#define TUNNEL_KEY __cpu_to_be16(0x04) -#define TUNNEL_SEQ __cpu_to_be16(0x08) -#define TUNNEL_STRICT __cpu_to_be16(0x10) -#define TUNNEL_REC __cpu_to_be16(0x20) -#define TUNNEL_VERSION __cpu_to_be16(0x40) -#define TUNNEL_NO_KEY __cpu_to_be16(0x80) -#define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) -#define TUNNEL_OAM __cpu_to_be16(0x0200) -#define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) -#define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) -#define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) -#define TUNNEL_NOCACHE __cpu_to_be16(0x2000) -#define TUNNEL_ERSPAN_OPT __cpu_to_be16(0x4000) - -#undef TUNNEL_OPTIONS_PRESENT -#define TUNNEL_OPTIONS_PRESENT \ - (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT | TUNNEL_ERSPAN_OPT) - -struct tnl_ptk_info { - __be16 flags; - __be16 proto; - __be32 key; - __be32 seq; - int hdr_len; -}; - -#define PACKET_RCVD 0 -#define PACKET_REJECT 1 -#define PACKET_NEXT 2 -#endif - -#define IP_TNL_HASH_BITS 7 -#define IP_TNL_HASH_SIZE (1 << IP_TNL_HASH_BITS) - -/* Keep error state on tunnel for 30 sec */ -#define IPTUNNEL_ERR_TIMEO (30*HZ) - -/* Used to memset ip_tunnel padding. */ -#define IP_TUNNEL_KEY_SIZE offsetofend(struct ip_tunnel_key, tp_dst) - -/* Used to memset ipv4 address padding. */ -#define IP_TUNNEL_KEY_IPV4_PAD offsetofend(struct ip_tunnel_key, u.ipv4.dst) -#define IP_TUNNEL_KEY_IPV4_PAD_LEN \ - (sizeof_field(struct ip_tunnel_key, u) - \ - sizeof_field(struct ip_tunnel_key, u.ipv4)) - -struct ip_tunnel_key { - __be64 tun_id; - union { - struct { - __be32 src; - __be32 dst; - } ipv4; - struct { - struct in6_addr src; - struct in6_addr dst; - } ipv6; - } u; - __be16 tun_flags; - u8 tos; /* TOS for IPv4, TC for IPv6 */ - u8 ttl; /* TTL for IPv4, HL for IPv6 */ - __be32 label; /* Flow Label for IPv6 */ - __be16 tp_src; - __be16 tp_dst; -}; - -/* Flags for ip_tunnel_info mode. */ -#define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */ -#define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */ - -struct ip_tunnel_info { - struct ip_tunnel_key key; - struct dst_cache dst_cache; - u8 options_len; - u8 mode; -}; - -/* 6rd prefix/relay information */ -#ifdef CONFIG_IPV6_SIT_6RD -struct ip_tunnel_6rd_parm { - struct in6_addr prefix; - __be32 relay_prefix; - u16 prefixlen; - u16 relay_prefixlen; -}; -#endif - -struct ip_tunnel_encap { - u16 type; - u16 flags; - __be16 sport; - __be16 dport; -}; - -struct ip_tunnel_prl_entry { - struct ip_tunnel_prl_entry __rcu *next; - __be32 addr; - u16 flags; - struct rcu_head rcu_head; -}; - -static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info *tun_info) -{ - return tun_info->mode & IP_TUNNEL_INFO_IPV6 ? AF_INET6 : AF_INET; -} - -static inline void *ip_tunnel_info_opts(struct ip_tunnel_info *info) -{ - return info + 1; -} - -static inline void ip_tunnel_info_opts_get(void *to, - const struct ip_tunnel_info *info) -{ - memcpy(to, info + 1, info->options_len); -} - -static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info, - const void *from, int len, - __be16 flags) -{ - memcpy(ip_tunnel_info_opts(info), from, len); - info->options_len = len; - info->key.tun_flags |= flags; -} - -static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, - __be32 saddr, __be32 daddr, - u8 tos, u8 ttl, __be32 label, - __be16 tp_src, __be16 tp_dst, - __be64 tun_id, __be16 tun_flags) -{ - key->tun_id = tun_id; - key->u.ipv4.src = saddr; - key->u.ipv4.dst = daddr; - memset((unsigned char *)key + IP_TUNNEL_KEY_IPV4_PAD, - 0, IP_TUNNEL_KEY_IPV4_PAD_LEN); - key->tos = tos; - key->ttl = ttl; - key->label = label; - key->tun_flags = tun_flags; - - /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of - * the upper tunnel are used. - * E.g: GRE over IPSEC, the tp_src and tp_port are zero. - */ - key->tp_src = tp_src; - key->tp_dst = tp_dst; - - /* Clear struct padding. */ - if (sizeof(*key) != IP_TUNNEL_KEY_SIZE) - memset((unsigned char *)key + IP_TUNNEL_KEY_SIZE, - 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE); -} - -#define ip_tunnel_collect_metadata() true - -#undef TUNNEL_NOCACHE -#define TUNNEL_NOCACHE 0 - -static inline bool -ip_tunnel_dst_cache_usable(const struct sk_buff *skb, - const struct ip_tunnel_info *info) -{ - if (skb->mark) - return false; - if (!info) - return true; - if (info->key.tun_flags & TUNNEL_NOCACHE) - return false; - - return true; -} - -#define ip_tunnel_dst rpl_ip_tunnel_dst -struct rpl_ip_tunnel_dst { - struct dst_entry __rcu *dst; - __be32 saddr; -}; - -#define ip_tunnel rpl_ip_tunnel -struct rpl_ip_tunnel { - struct ip_tunnel __rcu *next; - struct hlist_node hash_node; - struct net_device *dev; - struct net *net; /* netns for packet i/o */ - - unsigned long err_time; /* Time when the last ICMP error - * arrived */ - int err_count; /* Number of arrived ICMP errors */ - - /* These four fields used only by GRE */ - u32 i_seqno; /* The last seen seqno */ - u32 o_seqno; /* The last output seqno */ - int tun_hlen; /* Precalculated header length */ - - /* These four fields used only by ERSPAN */ - u32 index; /* ERSPAN type II index */ - u8 erspan_ver; /* ERSPAN version */ - u8 dir; /* ERSPAN direction */ - u16 hwid; /* ERSPAN hardware ID */ - - struct dst_cache dst_cache; - - struct ip_tunnel_parm parms; - - int mlink; - int encap_hlen; /* Encap header length (FOU,GUE) */ - int hlen; /* tun_hlen + encap_hlen */ - struct ip_tunnel_encap encap; - - /* for SIT */ -#ifdef CONFIG_IPV6_SIT_6RD - struct ip_tunnel_6rd_parm ip6rd; -#endif - struct ip_tunnel_prl_entry __rcu *prl; /* potential router list */ - unsigned int prl_count; /* # of entries in PRL */ - unsigned int ip_tnl_net_id; - struct gro_cells gro_cells; - __u32 fwmark; - bool collect_md; - bool ignore_df; -}; - -#define ip_tunnel_net rpl_ip_tunnel_net -struct rpl_ip_tunnel_net { - struct net_device *fb_tunnel_dev; - struct hlist_head tunnels[IP_TNL_HASH_SIZE]; - struct ip_tunnel __rcu *collect_md_tun; -}; - - -struct ip_tunnel_encap_ops { - size_t (*encap_hlen)(struct ip_tunnel_encap *e); - int (*build_header)(struct sk_buff *skb, struct ip_tunnel_encap *e, - const u8 *protocol, struct flowi4 *fl4); -}; - -extern const struct ip_tunnel_encap_ops __rcu * - rpl_iptun_encaps[MAX_IPTUN_ENCAP_OPS]; - -#define ip_encap_hlen rpl_ip_encap_hlen -static inline int rpl_ip_encap_hlen(struct ip_tunnel_encap *e) -{ - const struct ip_tunnel_encap_ops *ops; - int hlen = -EINVAL; - - if (e->type == TUNNEL_ENCAP_NONE) - return 0; - - if (e->type >= MAX_IPTUN_ENCAP_OPS) - return -EINVAL; - - rcu_read_lock(); - ops = rcu_dereference(rpl_iptun_encaps[e->type]); - if (likely(ops && ops->encap_hlen)) - hlen = ops->encap_hlen(e); - rcu_read_unlock(); - - return hlen; -} - -static inline int ovs_ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t, - const u8 *protocol, struct flowi4 *fl4) -{ - const struct ip_tunnel_encap_ops *ops; - int ret = -EINVAL; - - if (t->encap.type == TUNNEL_ENCAP_NONE) - return 0; - - if (t->encap.type >= MAX_IPTUN_ENCAP_OPS) - return -EINVAL; - - rcu_read_lock(); - ops = rcu_dereference(rpl_iptun_encaps[t->encap.type]); - if (likely(ops && ops->build_header)) - ret = ops->build_header(skb, &t->encap, protocol, fl4); - rcu_read_unlock(); - - return ret; -} - -#define ip_tunnel_get_stats64 rpl_ip_tunnel_get_stats64 -#if !defined(HAVE_VOID_NDO_GET_STATS64) && !defined(HAVE_RHEL7_MAX_MTU) -struct rtnl_link_stats64 *rpl_ip_tunnel_get_stats64(struct net_device *dev, - struct rtnl_link_stats64 *tot); -#else -void rpl_ip_tunnel_get_stats64(struct net_device *dev, - struct rtnl_link_stats64 *tot); -#endif -#define ip_tunnel_get_dsfield rpl_ip_tunnel_get_dsfield -static inline u8 rpl_ip_tunnel_get_dsfield(const struct iphdr *iph, - const struct sk_buff *skb) -{ - if (skb->protocol == htons(ETH_P_IP)) - return iph->tos; - else if (skb->protocol == htons(ETH_P_IPV6)) - return ipv6_get_dsfield((const struct ipv6hdr *)iph); - else - return 0; -} - -#define ip_tunnel_ecn_encap rpl_ip_tunnel_ecn_encap -static inline u8 rpl_ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph, - const struct sk_buff *skb) -{ - u8 inner = ip_tunnel_get_dsfield(iph, skb); - - return INET_ECN_encapsulate(tos, inner); -} - -static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len) -{ - if (pkt_len > 0) { - struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats); - - u64_stats_update_begin(&tstats->syncp); - tstats->tx_bytes += pkt_len; - tstats->tx_packets++; - u64_stats_update_end(&tstats->syncp); - put_cpu_ptr(tstats); - } else { - struct net_device_stats *err_stats = &dev->stats; - - if (pkt_len < 0) { - err_stats->tx_errors++; - err_stats->tx_aborted_errors++; - } else { - err_stats->tx_dropped++; - } - } -} - -static inline __be64 key32_to_tunnel_id(__be32 key) -{ -#ifdef __BIG_ENDIAN - return (__force __be64)key; -#else - return (__force __be64)((__force u64)key << 32); -#endif -} - -/* Returns the least-significant 32 bits of a __be64. */ -static inline __be32 tunnel_id_to_key32(__be64 tun_id) -{ -#ifdef __BIG_ENDIAN - return (__force __be32)tun_id; -#else - return (__force __be32)((__force u64)tun_id >> 32); -#endif -} - -#define ip_tunnel_init rpl_ip_tunnel_init -int rpl_ip_tunnel_init(struct net_device *dev); - -#define ip_tunnel_uninit rpl_ip_tunnel_uninit -void rpl_ip_tunnel_uninit(struct net_device *dev); - -#define ip_tunnel_change_mtu rpl_ip_tunnel_change_mtu -int rpl_ip_tunnel_change_mtu(struct net_device *dev, int new_mtu); - -#define ip_tunnel_newlink rpl_ip_tunnel_newlink -int rpl_ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], - struct ip_tunnel_parm *p); - -#define ip_tunnel_dellink rpl_ip_tunnel_dellink -void rpl_ip_tunnel_dellink(struct net_device *dev, struct list_head *head); - -#define ip_tunnel_init_net rpl_ip_tunnel_init_net -int rpl_ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, - struct rtnl_link_ops *ops, char *devname); - -#define ip_tunnel_delete_net rpl_ip_tunnel_delete_net -void rpl_ip_tunnel_delete_net(struct ip_tunnel_net *itn, struct rtnl_link_ops *ops); - -#define ip_tunnel_setup rpl_ip_tunnel_setup -void rpl_ip_tunnel_setup(struct net_device *dev, int net_id); - -#define ip_tunnel_get_iflink rpl_ip_tunnel_get_iflink -int rpl_ip_tunnel_get_iflink(const struct net_device *dev); - -#define ip_tunnel_get_link_net rpl_ip_tunnel_get_link_net -struct net *rpl_ip_tunnel_get_link_net(const struct net_device *dev); - -#define __ip_tunnel_change_mtu rpl___ip_tunnel_change_mtu -int rpl___ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict); - -#define ip_tunnel_lookup rpl_ip_tunnel_lookup -struct ip_tunnel *rpl_ip_tunnel_lookup(struct ip_tunnel_net *itn, - int link, __be16 flags, - __be32 remote, __be32 local, - __be32 key); - -static inline int iptunnel_pull_offloads(struct sk_buff *skb) -{ - if (skb_is_gso(skb)) { - int err; - - err = skb_unclone(skb, GFP_ATOMIC); - if (unlikely(err)) - return err; - skb_shinfo(skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >> - NETIF_F_GSO_SHIFT); - } - - skb->encapsulation = 0; - return 0; -} -#endif /* USE_UPSTREAM_TUNNEL */ - -#define skb_is_encapsulated ovs_skb_is_encapsulated -bool ovs_skb_is_encapsulated(struct sk_buff *skb); - -#endif /* __NET_IP_TUNNELS_H */ diff --git a/datapath/linux/compat/include/net/ipv6.h b/datapath/linux/compat/include/net/ipv6.h deleted file mode 100644 index 6379457e8..000000000 --- a/datapath/linux/compat/include/net/ipv6.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef __NET_IPV6_WRAPPER_H -#define __NET_IPV6_WRAPPER_H 1 - -#include <linux/version.h> - -#include_next <net/ipv6.h> - -#ifndef NEXTHDR_SCTP -#define NEXTHDR_SCTP 132 /* Stream Control Transport Protocol */ -#endif - -#ifndef HAVE_IP6_FH_F_SKIP_RH - -enum { - IP6_FH_F_FRAG = (1 << 0), - IP6_FH_F_AUTH = (1 << 1), - IP6_FH_F_SKIP_RH = (1 << 2), -}; - -/* This function is upstream, but not the version which skips routing - * headers with 0 segments_left. We fixed it when we introduced - * IP6_FH_F_SKIP_RH. - */ -#define ipv6_find_hdr rpl_ipv6_find_hdr -extern int rpl_ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, - int target, unsigned short *fragoff, int *fragflg); -#endif - -#ifndef HAVE___IPV6_ADDR_JHASH -static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 unused) -{ - return ipv6_addr_jhash(a); -} -#endif - -#define ip6_flowlabel rpl_ip6_flowlabel -static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr) -{ - return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK; -} - -#ifndef HAVE_IP6_MAKE_FLOWLABEL_FL6 -#define ip6_make_flowlabel rpl_ip6_make_flowlabel -static inline __be32 rpl_ip6_make_flowlabel(struct net *net, - struct sk_buff *skb, - __be32 flowlabel, bool autolabel, - struct flowi6 *fl6) -{ -#ifndef HAVE_NETNS_SYSCTL_IPV6_AUTO_FLOWLABELS - if (!flowlabel && autolabel) { -#else - if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { -#endif - u32 hash; - - hash = skb_get_hash(skb); - - /* Since this is being sent on the wire obfuscate hash a bit - * to minimize possbility that any useful information to an - * attacker is leaked. Only lower 20 bits are relevant. - */ - hash ^= hash >> 12; - - flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; - } - - return flowlabel; -} -#endif - -#ifndef IPV6_TCLASS_SHIFT -#define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK) -#define IPV6_TCLASS_SHIFT 20 -#endif - -#define ip6_tclass rpl_ip6_tclass -static inline u8 ip6_tclass(__be32 flowinfo) -{ - return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT; -} - -#define ip6_make_flowinfo rpl_ip6_make_flowinfo -static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel) -{ - return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel; -} - -#endif diff --git a/datapath/linux/compat/include/net/ipv6_frag.h b/datapath/linux/compat/include/net/ipv6_frag.h deleted file mode 100644 index 5d1cc901b..000000000 --- a/datapath/linux/compat/include/net/ipv6_frag.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __NET_IPV6_FRAG_WRAPPER_H -#define __NET_IPV6_FRAG_WRAPPER_H - -#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) && defined(HAVE_IPV6_FRAG_H) -#include_next <net/ipv6_frag.h> -#endif - -#endif /* __NET_IPV6_FRAG_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/lisp.h b/datapath/linux/compat/include/net/lisp.h deleted file mode 100644 index 6b43c77e2..000000000 --- a/datapath/linux/compat/include/net/lisp.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __NET_LISP_WRAPPER_H -#define __NET_LISP_WRAPPER_H 1 - -#ifdef CONFIG_INET -#include <net/udp_tunnel.h> -#endif - - -#ifdef CONFIG_INET -#define lisp_dev_create_fb rpl_lisp_dev_create_fb -struct net_device *rpl_lisp_dev_create_fb(struct net *net, const char *name, - u8 name_assign_type, u16 dst_port); -#endif /*ifdef CONFIG_INET */ - -#define lisp_init_module rpl_lisp_init_module -int rpl_lisp_init_module(void); - -#define lisp_cleanup_module rpl_lisp_cleanup_module -void rpl_lisp_cleanup_module(void); - -#define lisp_xmit rpl_lisp_xmit -netdev_tx_t rpl_lisp_xmit(struct sk_buff *skb); - -#define lisp_fill_metadata_dst ovs_lisp_fill_metadata_dst -int ovs_lisp_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); - -#endif /*ifdef__NET_LISP_H */ diff --git a/datapath/linux/compat/include/net/mpls.h b/datapath/linux/compat/include/net/mpls.h deleted file mode 100644 index 9359a2369..000000000 --- a/datapath/linux/compat/include/net/mpls.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2014 Nicira, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#ifndef _NET_MPLS_WRAPPER_H -#define _NET_MPLS_WRAPPER_H 1 - -#include <linux/if_ether.h> -#include <linux/netdevice.h> - -#define MPLS_HLEN 4 - -struct mpls_shim_hdr { - __be32 label_stack_entry; -}; - -static inline bool eth_p_mpls(__be16 eth_type) -{ - return eth_type == htons(ETH_P_MPLS_UC) || - eth_type == htons(ETH_P_MPLS_MC); -} - -/* Starting from kernel 4.9, commit 48d2ab609b6b ("net: mpls: Fixups for GSO") - * and commit 85de4a2101ac ("openvswitch: use mpls_hdr") introduced - * behavioural changes to mpls_gso kernel module. It now assumes that - * skb_network_header() points to the mpls header and - * skb_inner_network_header() points to the L3 header. However, the old - * mpls_gso kernel module assumes that the skb_network_header() points - * to the L3 header. We shall backport the following function to ensure - * MPLS GSO works properly for kernels older than the one which contains - * these commits. - */ -#ifdef MPLS_HEADER_IS_L3 -static inline struct mpls_shim_hdr *mpls_hdr(const struct sk_buff *skb) -{ - return (struct mpls_shim_hdr *)skb_network_header(skb); -} -#else -#define mpls_hdr rpl_mpls_hdr -/* - * For non-MPLS skbs this will correspond to the network header. - * For MPLS skbs it will be before the network_header as the MPLS - * label stack lies between the end of the mac header and the network - * header. That is, for MPLS skbs the end of the mac header - * is the top of the MPLS label stack. - */ -static inline struct mpls_shim_hdr *rpl_mpls_hdr(const struct sk_buff *skb) -{ - return (struct mpls_shim_hdr *) (skb_mac_header(skb) + skb->mac_len); -} -#endif - -#endif /* _NET_MPLS_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h deleted file mode 100644 index 427072249..000000000 --- a/datapath/linux/compat/include/net/net_namespace.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __NET_NET_NAMESPACE_WRAPPER_H -#define __NET_NET_NAMESPACE_WRAPPER_H 1 - -#include_next <net/net_namespace.h> - -#ifndef HAVE_POSSIBLE_NET_T -typedef struct { -#ifdef CONFIG_NET_NS - struct net *net; -#endif -} possible_net_t; - -static inline void rpl_write_pnet(possible_net_t *pnet, struct net *net) -{ -#ifdef CONFIG_NET_NS - pnet->net = net; -#endif -} - -static inline struct net *rpl_read_pnet(const possible_net_t *pnet) -{ -#ifdef CONFIG_NET_NS - return pnet->net; -#else - return &init_net; -#endif -} -#else /* Linux >= 4.1 */ -#define rpl_read_pnet read_pnet -#define rpl_write_pnet write_pnet -#endif /* Linux >= 4.1 */ - -#endif /* net/net_namespace.h wrapper */ diff --git a/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h b/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h deleted file mode 100644 index c4c0f79ab..000000000 --- a/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _NF_DEFRAG_IPV6_WRAPPER_H -#define _NF_DEFRAG_IPV6_WRAPPER_H - -#include <linux/kconfig.h> -#include_next <net/netfilter/ipv6/nf_defrag_ipv6.h> - -/* Upstream commit 029f7f3b8701 ("netfilter: ipv6: nf_defrag: avoid/free clone - * operations") changed the semantics of nf_ct_frag6_gather(), so we need - * to backport for all prior kernels, i.e. kernel < 4.5.0. - * - * Upstream commit 48cac18ecf1d ("ipv6: orphan skbs in reassembly unit") fixes - * a bug that requires all kernels prior to this fix, i.e. kernel < 4.11.0 - * to be backported. - */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0) -#define OVS_NF_DEFRAG6_BACKPORT 1 -int rpl_nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user); -#define nf_ct_frag6_gather rpl_nf_ct_frag6_gather - -/* If backporting IPv6 defrag, then init/exit functions need to be called from - * compat_{in,ex}it() to prepare the backported fragmentation cache. In this - * case we declare the functions which are defined in - * datapath/linux/compat/nf_conntrack_reasm.c. - * - * Otherwise, if we can use upstream defrag then we can rely on the upstream - * nf_defrag_ipv6 module to init/exit correctly. In this case the calls in - * compat_{in,ex}it() can be no-ops. - */ -int __init rpl_nf_ct_frag6_init(void); -void rpl_nf_ct_frag6_cleanup(void); -void ovs_netns_frags6_init(struct net *net); -void ovs_netns_frags6_exit(struct net *net); -#else /* !OVS_NF_DEFRAG6_BACKPORT */ -static inline int __init rpl_nf_ct_frag6_init(void) { return 0; } -static inline void rpl_nf_ct_frag6_cleanup(void) { } -static inline void ovs_netns_frags6_init(struct net *net) { } -static inline void ovs_netns_frags6_exit(struct net *net) { } -#endif /* OVS_NF_DEFRAG6_BACKPORT */ -#define nf_ct_frag6_init rpl_nf_ct_frag6_init -#define nf_ct_frag6_cleanup rpl_nf_ct_frag6_cleanup - -#endif /* __NF_DEFRAG_IPV6_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack.h deleted file mode 100644 index 50db914a3..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _NF_CONNTRACK_WRAPPER_H -#define _NF_CONNTRACK_WRAPPER_H - -#include_next <net/netfilter/nf_conntrack.h> - -#ifndef HAVE_NF_CT_GET_TUPLEPR_TAKES_STRUCT_NET -static inline bool rpl_nf_ct_get_tuplepr(const struct sk_buff *skb, - unsigned int nhoff, - u_int16_t l3num, struct net *net, - struct nf_conntrack_tuple *tuple) -{ - return nf_ct_get_tuplepr(skb, nhoff, l3num, tuple); -} -#define nf_ct_get_tuplepr rpl_nf_ct_get_tuplepr -#endif - -#ifndef HAVE_NF_CT_SET -static inline void -nf_ct_set(struct sk_buff *skb, struct nf_conn *ct, enum ip_conntrack_info info) -{ - skb->nfct = &ct->ct_general; - skb->nfctinfo = info; -} -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) -int rpl_nf_ct_netns_get(struct net *net, u8 nfproto); -void rpl_nf_ct_netns_put(struct net *net, u8 nfproto); -#define nf_ct_netns_get rpl_nf_ct_netns_get -#define nf_ct_netns_put rpl_nf_ct_netns_put -#endif - -#endif /* _NF_CONNTRACK_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h deleted file mode 100644 index bc18c56b8..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef _NF_CONNTRACK_CORE_WRAPPER_H -#define _NF_CONNTRACK_CORE_WRAPPER_H - -#include_next <net/netfilter/nf_conntrack_core.h> - -#ifndef HAVE_NF_CT_TMPL_ALLOC_TAKES_STRUCT_ZONE - -#include <net/netfilter/nf_conntrack_zones.h> - -/* Released via destroy_conntrack() */ -static inline struct nf_conn * -rpl_nf_ct_tmpl_alloc(struct net *net, const struct nf_conntrack_zone *zone, - gfp_t flags) -{ - struct nf_conn *tmpl; - - tmpl = kzalloc(sizeof(*tmpl), flags); - if (tmpl == NULL) - return NULL; - - tmpl->status = IPS_TEMPLATE; - write_pnet(&tmpl->ct_net, net); - - if (nf_ct_zone_add(tmpl, flags, zone) < 0) - goto out_free; - - atomic_set(&tmpl->ct_general.use, 0); - - return tmpl; -out_free: - kfree(tmpl); - return NULL; -} -#define nf_ct_tmpl_alloc rpl_nf_ct_tmpl_alloc - -static inline void rpl_nf_ct_tmpl_free(struct nf_conn *tmpl) -{ - nf_ct_ext_destroy(tmpl); - nf_ct_ext_free(tmpl); - kfree(tmpl); -} -#define nf_ct_tmpl_free rpl_nf_ct_tmpl_free - -static inline struct nf_conntrack_tuple_hash * -rpl_nf_conntrack_find_get(struct net *net, - const struct nf_conntrack_zone *zone, - const struct nf_conntrack_tuple *tuple) -{ - return nf_conntrack_find_get(net, zone->id, tuple); -} -#define nf_conntrack_find_get rpl_nf_conntrack_find_get -#endif /* HAVE_NF_CT_TMPL_ALLOC_TAKES_STRUCT_ZONE */ - -#ifndef HAVE_NF_CT_GET_TUPLEPR_TAKES_STRUCT_NET -static inline bool rpl_nf_ct_get_tuple(const struct sk_buff *skb, - unsigned int nhoff, - unsigned int dataoff, u_int16_t l3num, - u_int8_t protonum, - struct net *net, - struct nf_conntrack_tuple *tuple, - const struct nf_conntrack_l3proto *l3proto, - const struct nf_conntrack_l4proto *l4proto) -{ - return nf_ct_get_tuple(skb, nhoff, dataoff, l3num, protonum, tuple, - l3proto, l4proto); -} -#define nf_ct_get_tuple rpl_nf_ct_get_tuple -#endif /* HAVE_NF_CT_GET_TUPLEPR_TAKES_STRUCT_NET */ - -#ifdef HAVE_NF_CONN_TIMER - -#ifndef HAVE_NF_CT_DELETE -#include <net/netfilter/nf_conntrack_timestamp.h> -#endif - -static inline bool rpl_nf_ct_delete(struct nf_conn *ct, u32 portid, int report) -{ - if (del_timer(&ct->timeout)) -#ifdef HAVE_NF_CT_DELETE - return nf_ct_delete(ct, portid, report); -#else - { - struct nf_conn_tstamp *tstamp; - - tstamp = nf_conn_tstamp_find(ct); - if (tstamp && tstamp->stop == 0) - tstamp->stop = ktime_to_ns(ktime_get_real()); - - if (!test_bit(IPS_DYING_BIT, &ct->status) && - unlikely(nf_conntrack_event(IPCT_DESTROY, ct) < 0)) { - /* destroy event was not delivered */ - nf_ct_delete_from_lists(ct); - nf_ct_dying_timeout(ct); - return false; - } - set_bit(IPS_DYING_BIT, &ct->status); - nf_ct_delete_from_lists(ct); - nf_ct_put(ct); - return true; - } -#endif - return false; -} -#define nf_ct_delete rpl_nf_ct_delete -#endif /* HAVE_NF_CONN_TIMER */ - -#ifndef HAVE_NF_CONNTRACK_IN_TAKES_NF_HOOK_STATE -static inline unsigned int -rpl_nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state) -{ - int err; - - /* Repeat if requested, see nf_iterate(). */ - do { - err = nf_conntrack_in(state->net, state->pf, state->hook, skb); - } while (err == NF_REPEAT); - - return err; -} -#define nf_conntrack_in rpl_nf_conntrack_in -#endif /* HAVE_NF_CONNTRACK_IN_TAKES_NF_HOOK_STATE */ - -#ifdef HAVE_NF_CT_INVERT_TUPLEPR -static inline bool rpl_nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse, - const struct nf_conntrack_tuple *orig) -{ - return nf_ct_invert_tuplepr(inverse, orig); -} -#else -static inline bool rpl_nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse, - const struct nf_conntrack_tuple *orig) -{ - return nf_ct_invert_tuple(inverse, orig); -} -#endif /* HAVE_NF_CT_INVERT_TUPLEPR */ - -#endif /* _NF_CONNTRACK_CORE_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_count.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_count.h deleted file mode 100644 index 2143136aa..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_count.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _NF_CONNTRACK_COUNT_WRAPPER_H -#define _NF_CONNTRACK_COUNT_WRAPPER_H - -#include <linux/list.h> -#include <net/netfilter/nf_conntrack_tuple.h> -#include <net/netfilter/nf_conntrack_zones.h> - -#ifdef HAVE_UPSTREAM_NF_CONNCOUNT -#include_next <net/netfilter/nf_conntrack_count.h> - -static inline int rpl_nf_conncount_modinit(void) -{ - return 0; -} - -static inline void rpl_nf_conncount_modexit(void) -{ -} - -#else -#define CONFIG_NETFILTER_CONNCOUNT 1 -struct nf_conncount_data; - -struct nf_conncount_list { - spinlock_t list_lock; - struct list_head head; /* connections with the same filtering key */ - unsigned int count; /* length of list */ -}; - -struct nf_conncount_data -*rpl_nf_conncount_init(struct net *net, unsigned int family, - unsigned int keylen); - -void rpl_nf_conncount_destroy(struct net *net, unsigned int family, - struct nf_conncount_data *data); - -unsigned int rpl_nf_conncount_count(struct net *net, - struct nf_conncount_data *data, - const u32 *key, - const struct nf_conntrack_tuple *tuple, - const struct nf_conntrack_zone *zone); - -#define nf_conncount_init rpl_nf_conncount_init -#define nf_conncount_destroy rpl_nf_conncount_destroy -#define nf_conncount_count rpl_nf_conncount_count - -int rpl_nf_conncount_modinit(void); -void rpl_nf_conncount_modexit(void); -#endif /* HAVE_UPSTREAM_NF_CONNCOUNT */ - -#define nf_conncount_mod_init rpl_nf_conncount_modinit -#define nf_conncount_modexit rpl_nf_conncount_modexit - -#endif /* _NF_CONNTRACK_COUNT_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_expect.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_expect.h deleted file mode 100644 index a13f0ce60..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_expect.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _NF_CONNTRACK_EXPECT_WRAPPER_H -#define _NF_CONNTRACK_EXPECT_WRAPPER_H - -#include_next <net/netfilter/nf_conntrack_expect.h> - -#ifndef HAVE_NF_CT_ZONE_INIT - -#include <net/netfilter/nf_conntrack.h> -#include <net/netfilter/nf_conntrack_zones.h> - -static inline struct nf_conntrack_expect * -rpl___nf_ct_expect_find(struct net *net, - const struct nf_conntrack_zone *zone, - const struct nf_conntrack_tuple *tuple) -{ - return __nf_ct_expect_find(net, zone->id, tuple); -} -#define __nf_ct_expect_find rpl___nf_ct_expect_find - -#endif /* HAVE_NF_CT_ZONE_INIT */ -#endif /* _NF_CONNTRACK_EXPECT_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_helper.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_helper.h deleted file mode 100644 index 78f97375b..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_helper.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _NF_CONNTRACK_HELPER_WRAPPER_H -#define _NF_CONNTRACK_HELPER_WRAPPER_H - -#include_next <net/netfilter/nf_conntrack_helper.h> - -#ifndef HAVE_NF_CONNTRACK_HELPER_PUT -static inline void nf_conntrack_helper_put(struct nf_conntrack_helper *helper) { - module_put(helper->me); -} -#endif - -#ifndef HAVE_NF_CT_HELPER_EXT_ADD_TAKES_HELPER -static inline struct nf_conn_help * -rpl_nf_ct_helper_ext_add(struct nf_conn *ct, - struct nf_conntrack_helper *helper, gfp_t gfp) -{ - return nf_ct_helper_ext_add(ct, gfp); -} -#define nf_ct_helper_ext_add rpl_nf_ct_helper_ext_add -#endif /* HAVE_NF_CT_HELPER_EXT_ADD_TAKES_HELPER */ - -#ifndef HAVE_NF_NAT_HELPER_TRY_MODULE_GET -static inline int rpl_nf_nat_helper_try_module_get(const char *name, u16 l3num, - u8 protonum) -{ - request_module("ip_nat_%s", name); - return 0; -} -#define nf_nat_helper_try_module_get rpl_nf_nat_helper_try_module_get -#endif /* HAVE_NF_NAT_HELPER_TRY_MODULE_GET */ - -#ifndef HAVE_NF_NAT_HELPER_PUT -void rpl_nf_nat_helper_put(struct nf_conntrack_helper *helper) -{ -} -#define nf_nat_helper_put rpl_nf_nat_helper_put -#endif /* HAVE_NF_NAT_HELPER_PUT */ - -#endif /* _NF_CONNTRACK_HELPER_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_labels.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_labels.h deleted file mode 100644 index 14cb35716..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_labels.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef _NF_CONNTRACK_LABELS_WRAPPER_H -#define _NF_CONNTRACK_LABELS_WRAPPER_H - -#include <linux/kconfig.h> -#include <linux/version.h> -#include_next <net/netfilter/nf_conntrack_labels.h> - -#ifndef NF_CT_LABELS_MAX_SIZE -#define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE) -#endif - -#ifndef HAVE_NF_CONNLABELS_GET_TAKES_BIT -#if IS_ENABLED(CONFIG_NF_CONNTRACK_LABELS) - -/* XXX: This doesn't lock others out from doing the same configuration - * simultaneously. */ -static inline int rpl_nf_connlabels_get(struct net *net, unsigned int bits) -{ -#ifndef HAVE_NF_CONNLABELS_GET - size_t words; - - words = BIT_WORD(bits) + 1; - if (words > NF_CT_LABELS_MAX_SIZE / sizeof(long)) - return -ERANGE; - - net->ct.labels_used++; - if (words > net->ct.label_words) - net->ct.label_words = words; - - return 0; -#else - return nf_connlabels_get(net, bits + 1); -#endif /* HAVE_NF_CONNLABELS_GET */ -} -#define nf_connlabels_get rpl_nf_connlabels_get - -static inline void rpl_nf_connlabels_put(struct net *net) -{ -#ifndef HAVE_NF_CONNLABELS_GET - net->ct.labels_used--; - if (net->ct.labels_used == 0) - net->ct.label_words = 0; -#else - nf_connlabels_put(net); -#endif /* HAVE_NF_CONNLABELS_GET */ -} -#define nf_connlabels_put rpl_nf_connlabels_put - -#else /* CONFIG_NF_CONNTRACK_LABELS */ -#define nf_connlabels_get rpl_nf_connlabels_get -static inline int nf_connlabels_get(struct net *net, unsigned int bits) -{ - return -ERANGE; -} - -#define nf_connlabels_put rpl_nf_connlabels_put -static inline void nf_connlabels_put(struct net *net) { } -#endif /* CONFIG_NF_CONNTRACK_LABELS */ -#endif /* HAVE_NF_CONNLABELS_GET_TAKES_BIT */ - -/* Upstream commit 5a8145f7b222 ("netfilter: labels: don't emit ct event if - * labels were not changed"), released in Linux 4.7, introduced a functional - * change to trigger conntrack event for a label change only when the labels - * actually changed. There is no way we can detect this from the headers, so - * provide replacements that work the same for OVS (where labels size is 128 - * bits == 16 bytes == 4 4-byte words). */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -static int replace_u32(u32 *address, u32 mask, u32 new) -{ - u32 old, tmp; - - do { - old = *address; - tmp = (old & mask) ^ new; - if (old == tmp) - return 0; - } while (cmpxchg(address, old, tmp) != old); - - return 1; -} - -static int rpl_nf_connlabels_replace(struct nf_conn *ct, - const u32 *data, - const u32 *mask, unsigned int words32) -{ - struct nf_conn_labels *labels; - unsigned int i; - int changed = 0; - u32 *dst; - - labels = nf_ct_labels_find(ct); - if (!labels) - return -ENOSPC; - - dst = (u32 *) labels->bits; - for (i = 0; i < words32; i++) - changed |= replace_u32(&dst[i], mask ? ~mask[i] : 0, data[i]); - - if (changed) - nf_conntrack_event_cache(IPCT_LABEL, ct); - - return 0; -} -#define nf_connlabels_replace rpl_nf_connlabels_replace -#endif - -#endif /* _NF_CONNTRACK_LABELS_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_seqadj.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_seqadj.h deleted file mode 100644 index b11d1a578..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_seqadj.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _NF_CONNTRACK_SEQADJ_WRAPPER_H -#define _NF_CONNTRACK_SEQADJ_WRAPPER_H - -#ifdef HAVE_NF_CT_SEQ_ADJUST -#include_next <net/netfilter/nf_conntrack_seqadj.h> -#else - -#include <net/netfilter/nf_nat_helper.h> - -/* TCP sequence number adjustment. Returns 1 on success, 0 on failure */ -static inline int -nf_ct_seq_adjust(struct sk_buff *skb, - struct nf_conn *ct, enum ip_conntrack_info ctinfo, - unsigned int protoff) -{ - typeof(nf_nat_seq_adjust_hook) seq_adjust; - - seq_adjust = rcu_dereference(nf_nat_seq_adjust_hook); - if (!seq_adjust || - !seq_adjust(skb, ct, ctinfo, ip_hdrlen(skb))) { - NF_CT_STAT_INC_ATOMIC(nf_ct_net(ct), drop); - return 0; - } - - return 1; -} - -#endif /* HAVE_NF_CT_SEQ_ADJUST */ - -#endif /* _NF_CONNTRACK_SEQADJ_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_timeout.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_timeout.h deleted file mode 100644 index 134e72b83..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_timeout.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _NF_CONNTRACK_TIMEOUT_WRAPPER_H -#define _NF_CONNTRACK_TIMEOUT_WRAPPER_H - -#include_next <net/netfilter/nf_conntrack_timeout.h> - -#ifndef HAVE_NF_CT_SET_TIMEOUT - -#ifndef HAVE_NF_CT_TIMEOUT -#define nf_ct_timeout ctnl_timeout -#endif - -#ifdef CONFIG_NF_CONNTRACK_TIMEOUT -int rpl_nf_ct_set_timeout(struct net *net, struct nf_conn *ct, u8 l3num, u8 l4num, - const char *timeout_name); -void rpl_nf_ct_destroy_timeout(struct nf_conn *ct); -#else -static inline int rpl_nf_ct_set_timeout(struct net *net, struct nf_conn *ct, - u8 l3num, u8 l4num, - const char *timeout_name) -{ - return -EOPNOTSUPP; -} - -static inline void rpl_nf_ct_destroy_timeout(struct nf_conn *ct) -{ - return; -} -#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ - -#define nf_ct_set_timeout rpl_nf_ct_set_timeout -#define nf_ct_destroy_timeout rpl_nf_ct_destroy_timeout - -#endif /* HAVE_NF_CT_SET_TIMEOUT */ -#endif /* _NF_CONNTRACK_TIMEOUT_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_zones.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_zones.h deleted file mode 100644 index d46c098c7..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_conntrack_zones.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _NF_CONNTRACK_ZONES_WRAPPER_H -#define _NF_CONNTRACK_ZONES_WRAPPER_H - -#include <linux/version.h> - -#include_next <net/netfilter/nf_conntrack_zones.h> - -#ifndef HAVE_NF_CT_ZONE_INIT - -#include <linux/kconfig.h> -#include <linux/types.h> -#include <linux/netfilter/nf_conntrack_tuple_common.h> - -#define NF_CT_DEFAULT_ZONE_ID 0 - -#define NF_CT_ZONE_DIR_ORIG (1 << IP_CT_DIR_ORIGINAL) -#define NF_CT_ZONE_DIR_REPL (1 << IP_CT_DIR_REPLY) - -#define NF_CT_DEFAULT_ZONE_DIR (NF_CT_ZONE_DIR_ORIG | NF_CT_ZONE_DIR_REPL) - -#define NF_CT_FLAG_MARK 1 - -struct rpl_nf_conntrack_zone { - u16 id; - u8 flags; - u8 dir; -}; -#define nf_conntrack_zone rpl_nf_conntrack_zone - -extern const struct nf_conntrack_zone nf_ct_zone_dflt; - -#if IS_ENABLED(CONFIG_NF_CONNTRACK) -#include <net/netfilter/nf_conntrack_extend.h> - -static inline const struct nf_conntrack_zone * -rpl_nf_ct_zone(const struct nf_conn *ct) -{ - const struct nf_conntrack_zone *nf_ct_zone = NULL; - -#ifdef CONFIG_NF_CONNTRACK_ZONES - nf_ct_zone = nf_ct_ext_find(ct, NF_CT_EXT_ZONE); -#endif - return nf_ct_zone ? nf_ct_zone : &nf_ct_zone_dflt; -} -#define nf_ct_zone rpl_nf_ct_zone - -static inline const struct nf_conntrack_zone * -nf_ct_zone_init(struct nf_conntrack_zone *zone, u16 id, u8 dir, u8 flags) -{ - zone->id = id; - zone->flags = flags; - zone->dir = dir; - - return zone; -} - -static inline int nf_ct_zone_add(struct nf_conn *ct, gfp_t flags, - const struct nf_conntrack_zone *info) -{ -#ifdef CONFIG_NF_CONNTRACK_ZONES - struct nf_conntrack_zone *nf_ct_zone; - - nf_ct_zone = nf_ct_ext_add(ct, NF_CT_EXT_ZONE, flags); - if (!nf_ct_zone) - return -ENOMEM; - - nf_ct_zone_init(nf_ct_zone, info->id, info->dir, - info->flags); -#endif - return 0; -} - -static inline bool nf_ct_zone_matches_dir(const struct nf_conntrack_zone *zone, - enum ip_conntrack_dir dir) -{ - return zone->dir & (1 << dir); -} - -static inline u16 nf_ct_zone_id(const struct nf_conntrack_zone *zone, - enum ip_conntrack_dir dir) -{ - return nf_ct_zone_matches_dir(zone, dir) ? - zone->id : NF_CT_DEFAULT_ZONE_ID; -} - -static inline bool nf_ct_zone_equal(const struct nf_conn *a, - const struct nf_conntrack_zone *b, - enum ip_conntrack_dir dir) -{ - return nf_ct_zone_id(nf_ct_zone(a), dir) == - nf_ct_zone_id(b, dir); -} - -static inline bool nf_ct_zone_equal_any(const struct nf_conn *a, - const struct nf_conntrack_zone *b) -{ - return nf_ct_zone(a)->id == b->id; -} -#endif /* IS_ENABLED(CONFIG_NF_CONNTRACK) */ -#endif /* HAVE_NF_CT_ZONE_INIT */ -#endif /* _NF_CONNTRACK_ZONES_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netfilter/nf_nat.h b/datapath/linux/compat/include/net/netfilter/nf_nat.h deleted file mode 100644 index 773e569cb..000000000 --- a/datapath/linux/compat/include/net/netfilter/nf_nat.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _NF_NAT_WRAPPER_H -#define _NF_NAT_WRAPPER_H - -#include_next <net/netfilter/nf_nat.h> - -#ifndef HAVE_NF_CT_NAT_EXT_ADD - -static inline struct nf_conn_nat * -nf_ct_nat_ext_add(struct nf_conn *ct) -{ - struct nf_conn_nat *nat = nfct_nat(ct); - if (nat) - return nat; - - if (!nf_ct_is_confirmed(ct)) - nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); - - return nat; -} -#endif /* HAVE_NF_CT_NAT_EXT_ADD */ - -#ifndef HAVE_NF_NAT_ALLOC_NULL_BINDING -static inline unsigned int -nf_nat_alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) -{ - /* Force range to this IP; let proto decide mapping for - * per-proto parts (hence not IP_NAT_RANGE_PROTO_SPECIFIED). - * Use reply in case it's already been mangled (eg local packet). - */ - union nf_inet_addr ip = - (HOOK2MANIP(hooknum) == NF_NAT_MANIP_SRC ? - ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3 : - ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3); - struct nf_nat_range range = { - .flags = NF_NAT_RANGE_MAP_IPS, - .min_addr = ip, - .max_addr = ip, - }; - return nf_nat_setup_info(ct, &range, HOOK2MANIP(hooknum)); -} - -#endif /* HAVE_NF_NAT_ALLOC_NULL_BINDING */ - -#endif /* _NF_NAT_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/netlink.h b/datapath/linux/compat/include/net/netlink.h deleted file mode 100644 index 84e073974..000000000 --- a/datapath/linux/compat/include/net/netlink.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef __NET_NETLINK_WRAPPER_H -#define __NET_NETLINK_WRAPPER_H 1 - -#include <linux/version.h> -#include_next <net/netlink.h> -#include_next <linux/in6.h> - -#ifndef HAVE_NLA_GET_BE16 -/** - * nla_get_be16 - return payload of __be16 attribute - * @nla: __be16 netlink attribute - */ -static inline __be16 nla_get_be16(const struct nlattr *nla) -{ - return *(__be16 *) nla_data(nla); -} -#endif /* !HAVE_NLA_GET_BE16 */ - -#ifndef HAVE_NLA_PUT_BE16 -static inline int nla_put_be16(struct sk_buff *skb, int attrtype, __be16 value) -{ - return nla_put(skb, attrtype, sizeof(__be16), &value); -} -#endif - -#ifndef HAVE_NLA_PUT_BE32 -static inline int nla_put_be32(struct sk_buff *skb, int attrtype, __be32 value) -{ - return nla_put(skb, attrtype, sizeof(__be32), &value); -} -#endif - -#ifndef HAVE_NLA_PUT_BE64 -static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value) -{ - return nla_put(skb, attrtype, sizeof(__be64), &value); -} -#endif - -#ifndef nla_for_each_nested -#define nla_for_each_nested(pos, nla, rem) \ - nla_for_each_attr(pos, nla_data(nla), nla_len(nla), rem) -#endif - -#ifndef HAVE_NLA_FIND_NESTED -static inline struct nlattr *nla_find_nested(struct nlattr *nla, int attrtype) -{ - return nla_find(nla_data(nla), nla_len(nla), attrtype); -} -#endif - -#ifndef HAVE_NLA_IS_LAST -static inline bool nla_is_last(const struct nlattr *nla, int rem) -{ - return nla->nla_len == rem; -} -#endif - -#ifndef HAVE_NLA_PUT_IN_ADDR -static inline int nla_put_in_addr(struct sk_buff *skb, int attrtype, - __be32 addr) -{ - return nla_put_be32(skb, attrtype, addr); -} - -static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype, - const struct in6_addr *addr) -{ - return nla_put(skb, attrtype, sizeof(*addr), addr); -} - -static inline __be32 nla_get_in_addr(const struct nlattr *nla) -{ - return *(__be32 *) nla_data(nla); -} - -static inline struct in6_addr nla_get_in6_addr(const struct nlattr *nla) -{ - struct in6_addr tmp; - - nla_memcpy(&tmp, nla, sizeof(tmp)); - return tmp; -} -#endif - -#ifndef HAVE_NLA_PUT_64BIT -static inline bool nla_need_padding_for_64bit(struct sk_buff *skb) -{ -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS - /* The nlattr header is 4 bytes in size, that's why we test - * if the skb->data _is_ aligned. A NOP attribute, plus - * nlattr header for next attribute, will make nla_data() - * 8-byte aligned. - */ - if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8)) - return true; -#endif - return false; -} - -static inline int nla_align_64bit(struct sk_buff *skb, int padattr) -{ - if (nla_need_padding_for_64bit(skb) && - !nla_reserve(skb, padattr, 0)) - return -EMSGSIZE; - - return 0; -} - -static inline int nla_total_size_64bit(int payload) -{ - return NLA_ALIGN(nla_attr_size(payload)) -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS - + NLA_ALIGN(nla_attr_size(0)) -#endif - ; -} - -#define nla_put_64bit rpl_nla_put_64bit -int rpl_nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen, - const void *data, int padattr); - -#define __nla_put_64bit rpl___nla_put_64bit -void rpl___nla_put_64bit(struct sk_buff *skb, int attrtype, int attrlen, - const void *data, int padattr); - -#define __nla_reserve_64bit rpl___nla_reserve_64bit -struct nlattr *rpl___nla_reserve_64bit(struct sk_buff *skb, int attrtype, - int attrlen, int padattr); - -static inline int nla_put_u64_64bit(struct sk_buff *skb, int attrtype, - u64 value, int padattr) -{ - return nla_put_64bit(skb, attrtype, sizeof(u64), &value, padattr); -} - -#define nla_put_be64 rpl_nla_put_be64 -static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value, - int padattr) -{ - return nla_put_64bit(skb, attrtype, sizeof(__be64), &value, padattr); -} - -#endif - -#ifndef HAVE_NLA_PARSE_DEPRECATED_STRICT -#define nla_parse_nested_deprecated nla_parse_nested -#define nla_parse_deprecated_strict nla_parse -#define genlmsg_parse_deprecated genlmsg_parse - -#ifndef HAVE_NETLINK_EXT_ACK -struct netlink_ext_ack; - -static inline int rpl_nla_parse_nested(struct nlattr *tb[], int maxtype, - const struct nlattr *nla, - const struct nla_policy *policy, - struct netlink_ext_ack *extack) -{ - return nla_parse_nested(tb, maxtype, nla, policy); -} -#undef nla_parse_nested_deprecated -#define nla_parse_nested_deprecated rpl_nla_parse_nested - -static inline int rpl_nla_parse(struct nlattr **tb, int maxtype, - const struct nlattr *head, int len, - const struct nla_policy *policy, - struct netlink_ext_ack *extack) -{ - return nla_parse(tb, maxtype, head, len, policy); -} -#undef nla_parse_deprecated_strict -#define nla_parse_deprecated_strict rpl_nla_parse -#endif -#endif /* HAVE_NLA_PARSE_DEPRECATED_STRICT */ - -#ifndef HAVE_NLA_NEST_START_NOFLAG -static inline struct nlattr *rpl_nla_nest_start_noflag(struct sk_buff *skb, - int attrtype) -{ - return nla_nest_start(skb, attrtype); -} -#define nla_nest_start_noflag rpl_nla_nest_start_noflag -#endif - -#endif /* net/netlink.h */ diff --git a/datapath/linux/compat/include/net/nsh.h b/datapath/linux/compat/include/net/nsh.h deleted file mode 100644 index 76894910c..000000000 --- a/datapath/linux/compat/include/net/nsh.h +++ /dev/null @@ -1,313 +0,0 @@ -#ifndef __NET_NSH_H -#define __NET_NSH_H 1 - -#include <linux/skbuff.h> - -/* - * Network Service Header: - * 0 1 2 3 - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |Ver|O|U| TTL | Length |U|U|U|U|MD Type| Next Protocol | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Service Path Identifier (SPI) | Service Index | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | | - * ~ Mandatory/Optional Context Headers ~ - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Version: The version field is used to ensure backward compatibility - * going forward with future NSH specification updates. It MUST be set - * to 0x0 by the sender, in this first revision of NSH. Given the - * widespread implementation of existing hardware that uses the first - * nibble after an MPLS label stack for ECMP decision processing, this - * document reserves version 01b and this value MUST NOT be used in - * future versions of the protocol. Please see [RFC7325] for further - * discussion of MPLS-related forwarding requirements. - * - * O bit: Setting this bit indicates an Operations, Administration, and - * Maintenance (OAM) packet. The actual format and processing of SFC - * OAM packets is outside the scope of this specification (see for - * example [I-D.ietf-sfc-oam-framework] for one approach). - * - * The O bit MUST be set for OAM packets and MUST NOT be set for non-OAM - * packets. The O bit MUST NOT be modified along the SFP. - * - * SF/SFF/SFC Proxy/Classifier implementations that do not support SFC - * OAM procedures SHOULD discard packets with O bit set, but MAY support - * a configurable parameter to enable forwarding received SFC OAM - * packets unmodified to the next element in the chain. Forwarding OAM - * packets unmodified by SFC elements that do not support SFC OAM - * procedures may be acceptable for a subset of OAM functions, but can - * result in unexpected outcomes for others, thus it is recommended to - * analyze the impact of forwarding an OAM packet for all OAM functions - * prior to enabling this behavior. The configurable parameter MUST be - * disabled by default. - * - * TTL: Indicates the maximum SFF hops for an SFP. This field is used - * for service plane loop detection. The initial TTL value SHOULD be - * configurable via the control plane; the configured initial value can - * be specific to one or more SFPs. If no initial value is explicitly - * provided, the default initial TTL value of 63 MUST be used. Each SFF - * involved in forwarding an NSH packet MUST decrement the TTL value by - * 1 prior to NSH forwarding lookup. Decrementing by 1 from an incoming - * value of 0 shall result in a TTL value of 63. The packet MUST NOT be - * forwarded if TTL is, after decrement, 0. - * - * All other flag fields, marked U, are unassigned and available for - * future use, see Section 11.2.1. Unassigned bits MUST be set to zero - * upon origination, and MUST be ignored and preserved unmodified by - * other NSH supporting elements. Elements which do not understand the - * meaning of any of these bits MUST NOT modify their actions based on - * those unknown bits. - * - * Length: The total length, in 4-byte words, of NSH including the Base - * Header, the Service Path Header, the Fixed Length Context Header or - * Variable Length Context Header(s). The length MUST be 0x6 for MD - * Type equal to 0x1, and MUST be 0x2 or greater for MD Type equal to - * 0x2. The length of the NSH header MUST be an integer multiple of 4 - * bytes, thus variable length metadata is always padded out to a - * multiple of 4 bytes. - * - * MD Type: Indicates the format of NSH beyond the mandatory Base Header - * and the Service Path Header. MD Type defines the format of the - * metadata being carried. - * - * 0x0 - This is a reserved value. Implementations SHOULD silently - * discard packets with MD Type 0x0. - * - * 0x1 - This indicates that the format of the header includes a fixed - * length Context Header (see Figure 4 below). - * - * 0x2 - This does not mandate any headers beyond the Base Header and - * Service Path Header, but may contain optional variable length Context - * Header(s). The semantics of the variable length Context Header(s) - * are not defined in this document. The format of the optional - * variable length Context Headers is provided in Section 2.5.1. - * - * 0xF - This value is reserved for experimentation and testing, as per - * [RFC3692]. Implementations not explicitly configured to be part of - * an experiment SHOULD silently discard packets with MD Type 0xF. - * - * Next Protocol: indicates the protocol type of the encapsulated data. - * NSH does not alter the inner payload, and the semantics on the inner - * protocol remain unchanged due to NSH service function chaining. - * Please see the IANA Considerations section below, Section 11.2.5. - * - * This document defines the following Next Protocol values: - * - * 0x1: IPv4 - * 0x2: IPv6 - * 0x3: Ethernet - * 0x4: NSH - * 0x5: MPLS - * 0xFE: Experiment 1 - * 0xFF: Experiment 2 - * - * Packets with Next Protocol values not supported SHOULD be silently - * dropped by default, although an implementation MAY provide a - * configuration parameter to forward them. Additionally, an - * implementation not explicitly configured for a specific experiment - * [RFC3692] SHOULD silently drop packets with Next Protocol values 0xFE - * and 0xFF. - * - * Service Path Identifier (SPI): Identifies a service path. - * Participating nodes MUST use this identifier for Service Function - * Path selection. The initial classifier MUST set the appropriate SPI - * for a given classification result. - * - * Service Index (SI): Provides location within the SFP. The initial - * classifier for a given SFP SHOULD set the SI to 255, however the - * control plane MAY configure the initial value of SI as appropriate - * (i.e., taking into account the length of the service function path). - * The Service Index MUST be decremented by a value of 1 by Service - * Functions or by SFC Proxy nodes after performing required services - * and the new decremented SI value MUST be used in the egress packet's - * NSH. The initial Classifier MUST send the packet to the first SFF in - * the identified SFP for forwarding along an SFP. If re-classification - * occurs, and that re-classification results in a new SPI, the - * (re)classifier is, in effect, the initial classifier for the - * resultant SPI. - * - * The SI is used in conjunction the with Service Path Identifier for - * Service Function Path Selection and for determining the next SFF/SF - * in the path. The SI is also valuable when troubleshooting or - * reporting service paths. Additionally, while the TTL field is the - * main mechanism for service plane loop detection, the SI can also be - * used for detecting service plane loops. - * - * When the Base Header specifies MD Type = 0x1, a Fixed Length Context - * Header (16-bytes) MUST be present immediately following the Service - * Path Header. The value of a Fixed Length Context - * Header that carries no metadata MUST be set to zero. - * - * When the base header specifies MD Type = 0x2, zero or more Variable - * Length Context Headers MAY be added, immediately following the - * Service Path Header (see Figure 5). Therefore, Length = 0x2, - * indicates that only the Base Header followed by the Service Path - * Header are present. The optional Variable Length Context Headers - * MUST be of an integer number of 4-bytes. The base header Length - * field MUST be used to determine the offset to locate the original - * packet or frame for SFC nodes that require access to that - * information. - * - * The format of the optional variable length Context Headers - * - * 0 1 2 3 - * 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 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Metadata Class | Type |U| Length | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Variable Metadata | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Metadata Class (MD Class): Defines the scope of the 'Type' field to - * provide a hierarchical namespace. The IANA Considerations - * Section 11.2.4 defines how the MD Class values can be allocated to - * standards bodies, vendors, and others. - * - * Type: Indicates the explicit type of metadata being carried. The - * definition of the Type is the responsibility of the MD Class owner. - * - * Unassigned bit: One unassigned bit is available for future use. This - * bit MUST NOT be set, and MUST be ignored on receipt. - * - * Length: Indicates the length of the variable metadata, in bytes. In - * case the metadata length is not an integer number of 4-byte words, - * the sender MUST add pad bytes immediately following the last metadata - * byte to extend the metadata to an integer number of 4-byte words. - * The receiver MUST round up the length field to the nearest 4-byte - * word boundary, to locate and process the next field in the packet. - * The receiver MUST access only those bytes in the metadata indicated - * by the length field (i.e., actual number of bytes) and MUST ignore - * the remaining bytes up to the nearest 4-byte word boundary. The - * Length may be 0 or greater. - * - * A value of 0 denotes a Context Header without a Variable Metadata - * field. - * - * [0] https://datatracker.ietf.org/doc/draft-ietf-sfc-nsh/ - */ - -/** - * struct nsh_md1_ctx - Keeps track of NSH context data - * @nshc<1-4>: NSH Contexts. - */ -struct nsh_md1_ctx { - __be32 context[4]; -}; - -struct nsh_md2_tlv { - __be16 md_class; - u8 type; - u8 length; - u8 md_value[]; -}; - -struct nshhdr { - __be16 ver_flags_ttl_len; - u8 mdtype; - u8 np; - __be32 path_hdr; - union { - struct nsh_md1_ctx md1; - struct nsh_md2_tlv md2; - }; -}; - -/* Masking NSH header fields. */ -#define NSH_VER_MASK 0xc000 -#define NSH_VER_SHIFT 14 -#define NSH_FLAGS_MASK 0x3000 -#define NSH_FLAGS_SHIFT 12 -#define NSH_TTL_MASK 0x0fc0 -#define NSH_TTL_SHIFT 6 -#define NSH_LEN_MASK 0x003f -#define NSH_LEN_SHIFT 0 - -#define NSH_MDTYPE_MASK 0x0f -#define NSH_MDTYPE_SHIFT 0 - -#define NSH_SPI_MASK 0xffffff00 -#define NSH_SPI_SHIFT 8 -#define NSH_SI_MASK 0x000000ff -#define NSH_SI_SHIFT 0 - -/* MD Type Registry. */ -#define NSH_M_TYPE1 0x01 -#define NSH_M_TYPE2 0x02 -#define NSH_M_EXP1 0xFE -#define NSH_M_EXP2 0xFF - -/* NSH Base Header Length */ -#define NSH_BASE_HDR_LEN 8 - -/* NSH MD Type 1 header Length. */ -#define NSH_M_TYPE1_LEN 24 - -/* NSH header maximum Length. */ -#define NSH_HDR_MAX_LEN 252 - -/* NSH context headers maximum Length. */ -#define NSH_CTX_HDRS_MAX_LEN 244 - -static inline struct nshhdr *nsh_hdr(struct sk_buff *skb) -{ - return (struct nshhdr *)skb_network_header(skb); -} - -static inline u16 nsh_hdr_len(const struct nshhdr *nsh) -{ - return ((ntohs(nsh->ver_flags_ttl_len) & NSH_LEN_MASK) - >> NSH_LEN_SHIFT) << 2; -} - -static inline u8 nsh_get_ver(const struct nshhdr *nsh) -{ - return (ntohs(nsh->ver_flags_ttl_len) & NSH_VER_MASK) - >> NSH_VER_SHIFT; -} - -static inline u8 nsh_get_flags(const struct nshhdr *nsh) -{ - return (ntohs(nsh->ver_flags_ttl_len) & NSH_FLAGS_MASK) - >> NSH_FLAGS_SHIFT; -} - -static inline u8 nsh_get_ttl(const struct nshhdr *nsh) -{ - return (ntohs(nsh->ver_flags_ttl_len) & NSH_TTL_MASK) - >> NSH_TTL_SHIFT; -} - -static inline void __nsh_set_xflag(struct nshhdr *nsh, u16 xflag, u16 xmask) -{ - nsh->ver_flags_ttl_len - = (nsh->ver_flags_ttl_len & ~htons(xmask)) | htons(xflag); -} - -static inline void nsh_set_flags_and_ttl(struct nshhdr *nsh, u8 flags, u8 ttl) -{ - __nsh_set_xflag(nsh, ((flags << NSH_FLAGS_SHIFT) & NSH_FLAGS_MASK) | - ((ttl << NSH_TTL_SHIFT) & NSH_TTL_MASK), - NSH_FLAGS_MASK | NSH_TTL_MASK); -} - -static inline void nsh_set_flags_ttl_len(struct nshhdr *nsh, u8 flags, - u8 ttl, u8 len) -{ - len = len >> 2; - __nsh_set_xflag(nsh, ((flags << NSH_FLAGS_SHIFT) & NSH_FLAGS_MASK) | - ((ttl << NSH_TTL_SHIFT) & NSH_TTL_MASK) | - ((len << NSH_LEN_SHIFT) & NSH_LEN_MASK), - NSH_FLAGS_MASK | NSH_TTL_MASK | NSH_LEN_MASK); -} - -int ovs_nsh_init(void); -void ovs_nsh_cleanup(void); - -int ovs_nsh_push(struct sk_buff *skb, const struct nshhdr *pushed_nh); -int ovs_nsh_pop(struct sk_buff *skb); - -#endif /* __NET_NSH_H */ diff --git a/datapath/linux/compat/include/net/protocol.h b/datapath/linux/compat/include/net/protocol.h deleted file mode 100644 index 0247a26c7..000000000 --- a/datapath/linux/compat/include/net/protocol.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _NET_PROTOCOL_WRAPPER_H -#define _NET_PROTOCOL_WRAPPER_H - -#include_next <net/protocol.h> - -#ifdef HAVE_UDP_OFFLOAD - -#ifndef HAVE_UDP_ADD_OFFLOAD_TAKES_NET -#define udp_add_offload(net, prot) udp_add_offload(prot) -#endif - -#else - -#define udp_add_offload(net, prot) 0 -#define udp_del_offload(prot) do {} while(0) - -#endif /* HAVE_UDP_OFFLOAD */ - -#endif /* _NET_PROTOCOL_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/route.h b/datapath/linux/compat/include/net/route.h deleted file mode 100644 index 9e4a1f18a..000000000 --- a/datapath/linux/compat/include/net/route.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __NET_ROUTE_H_WRAPPER -#define __NET_ROUTE_H_WRAPPER - -#include_next <net/route.h> - -#endif diff --git a/datapath/linux/compat/include/net/rtnetlink.h b/datapath/linux/compat/include/net/rtnetlink.h deleted file mode 100644 index e026cab95..000000000 --- a/datapath/linux/compat/include/net/rtnetlink.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef __NET_RTNETLINK_WRAPPER_H -#define __NET_RTNETLINK_WRAPPER_H -#include_next <net/rtnetlink.h> - -#define rtnl_delete_link rpl_rtnl_delete_link -int rpl_rtnl_delete_link(struct net_device *dev); - -#ifndef HAVE_NAME_ASSIGN_TYPE -#ifdef HAVE_RTNL_CREATE_LINK_SRC_NET -static inline struct net_device *rpl_rtnl_create_link(struct net *net, const char *ifname, - unsigned char name_assign_type, - const struct rtnl_link_ops *ops, - struct nlattr *tb[]) -{ - return rtnl_create_link(net, net, (char *)ifname, ops, tb); -} - -#else -static inline struct net_device *rpl_rtnl_create_link(struct net *net, const char *ifname, - unsigned char name_assign_type, - const struct rtnl_link_ops *ops, - struct nlattr *tb[]) -{ - return rtnl_create_link(net, (char *)ifname, ops, tb); -} -#endif -#else -/* This function is only defined to avoid warning related to ifname. Some backported - * function did not changed the name to const type. */ -static inline struct net_device *rpl_rtnl_create_link(struct net *net, const char *ifname, - unsigned char name_assign_type, - const struct rtnl_link_ops *ops, - struct nlattr *tb[]) -{ -#ifdef HAVE_RTNL_CREATE_LINK_TAKES_EXTACK - return rtnl_create_link(net, (char *) ifname, name_assign_type, ops, tb, NULL); -#else - return rtnl_create_link(net, (char *) ifname, name_assign_type, ops, tb); -#endif -} -#endif - -#define rtnl_create_link rpl_rtnl_create_link -#endif diff --git a/datapath/linux/compat/include/net/sctp/checksum.h b/datapath/linux/compat/include/net/sctp/checksum.h deleted file mode 100644 index 7832abce0..000000000 --- a/datapath/linux/compat/include/net/sctp/checksum.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __SCTP_CHECKSUM_WRAPPER_H -#define __SCTP_CHECKSUM_WRAPPER_H 1 - -#include_next <net/sctp/checksum.h> - -#ifndef HAVE_SCTP_COMPUTE_CKSUM -static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, - unsigned int offset) -{ - const struct sk_buff *iter; - - __u32 crc32 = sctp_start_cksum(skb->data + offset, - skb_headlen(skb) - offset); - skb_walk_frags(skb, iter) - crc32 = sctp_update_cksum((__u8 *) iter->data, - skb_headlen(iter), crc32); - - /* Open-code sctp_end_cksum() to avoid a sparse warning due to a bug in - * sparse annotations in Linux fixed in 3.10 in commit eee1d5a14 (sctp: - * Correct type and usage of sctp_end_cksum()). */ - return cpu_to_le32(~crc32); -} -#endif - -#endif diff --git a/datapath/linux/compat/include/net/sock.h b/datapath/linux/compat/include/net/sock.h deleted file mode 100644 index 2900704ec..000000000 --- a/datapath/linux/compat/include/net/sock.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __NET_SOCK_WRAPPER_H -#define __NET_SOCK_WRAPPER_H 1 - -#include_next <net/sock.h> - -#ifndef __sk_user_data -#define __sk_user_data(sk) ((*((void __rcu **)&(sk)->sk_user_data))) - -#define rcu_dereference_sk_user_data(sk) rcu_dereference(__sk_user_data((sk))) -#define rcu_assign_sk_user_data(sk, ptr) rcu_assign_pointer(__sk_user_data((sk)), ptr) -#endif - -#endif diff --git a/datapath/linux/compat/include/net/stt.h b/datapath/linux/compat/include/net/stt.h deleted file mode 100644 index d2e63d163..000000000 --- a/datapath/linux/compat/include/net/stt.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef __NET_STT_H -#define __NET_STT_H 1 - -#include <linux/kconfig.h> -#include <linux/errno.h> -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) && IS_ENABLED(CONFIG_NETFILTER) -#include <net/ip_tunnels.h> -#define OVS_STT - -struct stthdr { - __u8 version; - __u8 flags; - __u8 l4_offset; - __u8 reserved; - __be16 mss; - __be16 vlan_tci; - __be64 key; -}; - -/* Padding after the end of the tunnel headers to provide alignment - * for inner packet IP header after 14 byte Ethernet header. - */ -#define STT_ETH_PAD 2 - -#define STT_BASE_HLEN (sizeof(struct stthdr) + STT_ETH_PAD) -#define STT_HEADER_LEN (sizeof(struct tcphdr) + STT_BASE_HLEN) - -static inline struct stthdr *stt_hdr(const struct sk_buff *skb) -{ - return (struct stthdr *)(skb_transport_header(skb) + - sizeof(struct tcphdr)); -} - -struct net_device *ovs_stt_dev_create_fb(struct net *net, const char *name, - u8 name_assign_type, u16 dst_port); - -netdev_tx_t ovs_stt_xmit(struct sk_buff *skb); - -int ovs_stt_init_module(void); - -void ovs_stt_cleanup_module(void); -#else -static inline int ovs_stt_init_module(void) -{ - return 0; -} - -static inline void ovs_stt_cleanup_module(void) -{} - -static inline struct net_device *ovs_stt_dev_create_fb(struct net *net, const char *name, - u8 name_assign_type, u16 dst_port) -{ - return ERR_PTR(-EOPNOTSUPP); -} -static inline netdev_tx_t ovs_stt_xmit(struct sk_buff *skb) -{ - BUG(); - return NETDEV_TX_OK; -} -#endif - -#define stt_dev_create_fb ovs_stt_dev_create_fb -#define stt_init_module ovs_stt_init_module -#define stt_cleanup_module ovs_stt_cleanup_module - -#define stt_fill_metadata_dst ovs_stt_fill_metadata_dst -int ovs_stt_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); - -#endif /*ifdef__NET_STT_H */ diff --git a/datapath/linux/compat/include/net/tun_proto.h b/datapath/linux/compat/include/net/tun_proto.h deleted file mode 100644 index 2ea3deba4..000000000 --- a/datapath/linux/compat/include/net/tun_proto.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __NET_TUN_PROTO_H -#define __NET_TUN_PROTO_H - -#include <linux/kernel.h> - -/* One byte protocol values as defined by VXLAN-GPE and NSH. These will - * hopefully get a shared IANA registry. - */ -#define TUN_P_IPV4 0x01 -#define TUN_P_IPV6 0x02 -#define TUN_P_ETHERNET 0x03 -#define TUN_P_NSH 0x04 -#define TUN_P_MPLS_UC 0x05 - -static inline __be16 tun_p_to_eth_p(u8 proto) -{ - switch (proto) { - case TUN_P_IPV4: - return htons(ETH_P_IP); - case TUN_P_IPV6: - return htons(ETH_P_IPV6); - case TUN_P_ETHERNET: - return htons(ETH_P_TEB); - case TUN_P_NSH: - return htons(ETH_P_NSH); - case TUN_P_MPLS_UC: - return htons(ETH_P_MPLS_UC); - } - return 0; -} - -static inline u8 tun_p_from_eth_p(__be16 proto) -{ - switch (proto) { - case htons(ETH_P_IP): - return TUN_P_IPV4; - case htons(ETH_P_IPV6): - return TUN_P_IPV6; - case htons(ETH_P_TEB): - return TUN_P_ETHERNET; - case htons(ETH_P_NSH): - return TUN_P_NSH; - case htons(ETH_P_MPLS_UC): - return TUN_P_MPLS_UC; - } - return 0; -} - -#endif diff --git a/datapath/linux/compat/include/net/udp.h b/datapath/linux/compat/include/net/udp.h deleted file mode 100644 index 447999218..000000000 --- a/datapath/linux/compat/include/net/udp.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __NET_UDP_WRAPPER_H -#define __NET_UDP_WRAPPER_H 1 - -#include <net/ip.h> - -#ifdef inet_get_local_port_range -/* Earlier RHEL7 kernels backport udp_flow_src_port() using an older version of - * inet_get_local_port_range(). */ -#undef inet_get_local_port_range -#include_next <net/udp.h> -#define inet_get_local_port_range rpl_inet_get_local_port_range -#else -#include_next <net/udp.h> -#endif - -#ifndef HAVE_UDP_FLOW_SRC_PORT -static inline __be16 rpl_udp_flow_src_port(struct net *net, struct sk_buff *skb, - int min, int max, bool use_eth) -{ - u32 hash; - - if (min >= max) { - /* Use default range */ - inet_get_local_port_range(net, &min, &max); - } - - hash = skb_get_hash(skb); - if (unlikely(!hash) && use_eth) { - /* Can't find a normal hash, caller has indicated an Ethernet - * packet so use that to compute a hash. - */ - hash = jhash(skb->data, 2 * ETH_ALEN, - (__force u32) skb->protocol); - } - - /* Since this is being sent on the wire obfuscate hash a bit - * to minimize possbility that any useful information to an - * attacker is leaked. Only upper 16 bits are relevant in the - * computation for 16 bit port value. - */ - hash ^= hash << 16; - - return htons((((u64) hash * (max - min)) >> 32) + min); -} - -#define udp_flow_src_port rpl_udp_flow_src_port -#endif - -#ifndef HAVE_UDP_V4_CHECK -static inline __sum16 udp_v4_check(int len, __be32 saddr, - __be32 daddr, __wsum base) -{ - return csum_tcpudp_magic(saddr, daddr, len, IPPROTO_UDP, base); -} -#endif - -#ifndef USE_UPSTREAM_TUNNEL -#define udp_set_csum rpl_udp_set_csum -void rpl_udp_set_csum(bool nocheck, struct sk_buff *skb, - __be32 saddr, __be32 daddr, int len); -#endif -#endif diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h deleted file mode 100644 index 6e4063359..000000000 --- a/datapath/linux/compat/include/net/udp_tunnel.h +++ /dev/null @@ -1,208 +0,0 @@ -#ifndef __NET_UDP_TUNNEL_WRAPPER_H -#define __NET_UDP_TUNNEL_WRAPPER_H - -#include <linux/version.h> -#include <linux/kconfig.h> - -#include <net/addrconf.h> -#include <net/dst_metadata.h> -#include <linux/netdev_features.h> - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/udp_tunnel.h> - -#else - -#include <net/addrconf.h> -#include <net/ip_tunnels.h> -#include <net/udp.h> - -struct udp_port_cfg { - u8 family; - - /* Used only for kernel-created sockets */ - union { - struct in_addr local_ip; -#if IS_ENABLED(CONFIG_IPV6) - struct in6_addr local_ip6; -#endif - }; - - union { - struct in_addr peer_ip; -#if IS_ENABLED(CONFIG_IPV6) - struct in6_addr peer_ip6; -#endif - }; - - __be16 local_udp_port; - __be16 peer_udp_port; - unsigned int use_udp_checksums:1, - use_udp6_tx_checksums:1, - use_udp6_rx_checksums:1, - ipv6_v6only:1; -}; - -#ifdef HAVE_NDO_UDP_TUNNEL_ADD -enum udp_parsable_tunnel_type { - UDP_TUNNEL_TYPE_VXLAN, /* RFC 7348 */ - UDP_TUNNEL_TYPE_GENEVE, /* draft-ietf-nvo3-geneve */ - UDP_TUNNEL_TYPE_VXLAN_GPE, /* draft-ietf-nvo3-vxlan-gpe */ -}; - -struct udp_tunnel_info { - unsigned short type; - sa_family_t sa_family; - __be16 port; -}; -#endif - -#define udp_sock_create4 rpl_udp_sock_create4 -int rpl_udp_sock_create4(struct net *net, struct udp_port_cfg *cfg, - struct socket **sockp); - -#define udp_sock_create6 rpl_udp_sock_create6 -#if IS_ENABLED(CONFIG_IPV6) -int rpl_udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, - struct socket **sockp); -#else -static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, - struct socket **sockp) -{ - return -EPFNOSUPPORT; -} -#endif - -#define udp_sock_create rpl_udp_sock_create -static inline int udp_sock_create(struct net *net, - struct udp_port_cfg *cfg, - struct socket **sockp) -{ - if (cfg->family == AF_INET) - return udp_sock_create4(net, cfg, sockp); - - if (cfg->family == AF_INET6) - return udp_sock_create6(net, cfg, sockp); - - return -EPFNOSUPPORT; -} - -typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb); -typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk); -typedef struct sk_buff **(*udp_tunnel_gro_receive_t)(struct sock *sk, - struct sk_buff **head, - struct sk_buff *skb); -typedef int (*udp_tunnel_gro_complete_t)(struct sock *sk, struct sk_buff *skb, - int nhoff); - -struct udp_tunnel_sock_cfg { - void *sk_user_data; /* user data used by encap_rcv call back */ - /* Used for setting up udp_sock fields, see udp.h for details */ - __u8 encap_type; - udp_tunnel_encap_rcv_t encap_rcv; - udp_tunnel_encap_destroy_t encap_destroy; -#ifdef HAVE_UDP_TUNNEL_SOCK_CFG_GRO_RECEIVE - udp_tunnel_gro_receive_t gro_receive; - udp_tunnel_gro_complete_t gro_complete; -#endif -}; - -/* Setup the given (UDP) sock to receive UDP encapsulated packets */ -#define setup_udp_tunnel_sock rpl_setup_udp_tunnel_sock -void rpl_setup_udp_tunnel_sock(struct net *net, struct socket *sock, - struct udp_tunnel_sock_cfg *sock_cfg); - -/* Transmit the skb using UDP encapsulation. */ -#define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb -void rpl_udp_tunnel_xmit_skb(struct rtable *rt, - struct sock *sk, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 tos, __u8 ttl, - __be16 df, __be16 src_port, __be16 dst_port, - bool xnet, bool nocheck); - - -#define udp_tunnel_sock_release rpl_udp_tunnel_sock_release -void rpl_udp_tunnel_sock_release(struct socket *sock); - -#define udp_tunnel_encap_enable rpl_udp_tunnel_encap_enable -static inline void udp_tunnel_encap_enable(struct socket *sock) -{ -#if IS_ENABLED(CONFIG_IPV6) - if (sock->sk->sk_family == PF_INET6) -#ifdef HAVE_IPV6_STUB - ipv6_stub->udpv6_encap_enable(); -#else - udpv6_encap_enable(); -#endif - else -#endif - udp_encap_enable(); -} - -#if IS_ENABLED(CONFIG_IPV6) -#define udp_tunnel6_xmit_skb rpl_udp_tunnel6_xmit_skb -int rpl_udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, - struct sk_buff *skb, - struct net_device *dev, struct in6_addr *saddr, - struct in6_addr *daddr, - __u8 prio, __u8 ttl, __be32 label, __be16 src_port, - __be16 dst_port, bool nocheck); -#endif - -static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff) -{ - struct udphdr *uh; - - uh = (struct udphdr *)(skb->data + nhoff - sizeof(struct udphdr)); - skb_shinfo(skb)->gso_type |= uh->check ? - SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; -} - -void ovs_udp_gso(struct sk_buff *skb); -void ovs_udp_csum_gso(struct sk_buff *skb); - -static inline int rpl_udp_tunnel_handle_offloads(struct sk_buff *skb, - bool udp_csum) -{ - void (*fix_segment)(struct sk_buff *); - int type = 0; - - type |= udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; -#ifndef USE_UPSTREAM_TUNNEL_GSO - if (!udp_csum) - fix_segment = ovs_udp_gso; - else - fix_segment = ovs_udp_csum_gso; - /* This functuin is not used by vxlan lan tunnel. On older - * udp offload only supports vxlan, therefore fallback to software - * segmentation. - */ - type = 0; -#else - fix_segment = NULL; -#endif - - return ovs_iptunnel_handle_offloads(skb, type, fix_segment); -} - -#define udp_tunnel_handle_offloads rpl_udp_tunnel_handle_offloads -static inline void ovs_udp_tun_rx_dst(struct metadata_dst *md_dst, - struct sk_buff *skb, - unsigned short family, - __be16 flags, __be64 tunnel_id, int md_size) -{ - struct ip_tunnel_info *info = &md_dst->u.tun_info; - - if (family == AF_INET) - ovs_ip_tun_rx_dst(md_dst, skb, flags, tunnel_id, md_size); - else - ovs_ipv6_tun_rx_dst(md_dst, skb, flags, tunnel_id, md_size); - - info->key.tp_src = udp_hdr(skb)->source; - info->key.tp_dst = udp_hdr(skb)->dest; - if (udp_hdr(skb)->check) - info->key.tun_flags |= TUNNEL_CSUM; -} -#endif /* USE_UPSTREAM_TUNNEL */ - -#endif diff --git a/datapath/linux/compat/include/net/vrf.h b/datapath/linux/compat/include/net/vrf.h deleted file mode 100644 index f5b6e8900..000000000 --- a/datapath/linux/compat/include/net/vrf.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * include/net/net_vrf.h - adds vrf dev structure definitions - * Copyright (c) 2015 Cumulus Networks - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef __LINUX_NET_VRF_WRAPPER_H -#define __LINUX_NET_VRF_WRAPPER_H - -#include <linux/version.h> - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0) -#include_next <net/vrf.h> -#else - -static inline int vrf_master_ifindex_rcu(const struct net_device *dev) -{ - return 0; -} -#endif - -#endif /* __LINUX_NET_VRF_WRAPPER_H */ diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h deleted file mode 100644 index 18f5474d9..000000000 --- a/datapath/linux/compat/include/net/vxlan.h +++ /dev/null @@ -1,444 +0,0 @@ -#ifndef __NET_VXLAN_WRAPPER_H -#define __NET_VXLAN_WRAPPER_H 1 - -#ifdef CONFIG_INET -#include <net/udp_tunnel.h> -#endif - -#ifdef USE_UPSTREAM_TUNNEL -#include_next <net/vxlan.h> - -static inline int rpl_vxlan_init_module(void) -{ - return 0; -} -static inline void rpl_vxlan_cleanup_module(void) -{} - -#define vxlan_xmit dev_queue_xmit - -#ifdef CONFIG_INET -#ifndef HAVE_NAME_ASSIGN_TYPE -static inline struct net_device *rpl_vxlan_dev_create( - struct net *net, const char *name, u8 name_assign_type, - struct vxlan_config *conf) { - return vxlan_dev_create(net, name, conf); -} -#define vxlan_dev_create rpl_vxlan_dev_create -#endif -#endif - -#else /* USE_UPSTREAM_TUNNEL */ - -#include <linux/ip.h> -#include <linux/ipv6.h> -#include <linux/if_vlan.h> -#include <linux/skbuff.h> -#include <linux/netdevice.h> -#include <linux/udp.h> -#include <net/dst_cache.h> -#include <net/dst_metadata.h> - -#include "compat.h" -#include "gso.h" - -/* VXLAN protocol (RFC 7348) header: - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |R|R|R|R|I|R|R|R| Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | VXLAN Network Identifier (VNI) | Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * I = VXLAN Network Identifier (VNI) present. - */ -struct vxlanhdr { - __be32 vx_flags; - __be32 vx_vni; -}; - -/* VXLAN header flags. */ -#define VXLAN_HF_VNI cpu_to_be32(BIT(27)) - -#define VXLAN_N_VID (1u << 24) -#define VXLAN_VID_MASK (VXLAN_N_VID - 1) -#define VXLAN_VNI_MASK cpu_to_be32(VXLAN_VID_MASK << 8) -#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) - -#define VNI_HASH_BITS 10 -#define VNI_HASH_SIZE (1<<VNI_HASH_BITS) -#define FDB_HASH_BITS 8 -#define FDB_HASH_SIZE (1<<FDB_HASH_BITS) - -/* Remote checksum offload for VXLAN (VXLAN_F_REMCSUM_[RT]X): - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |R|R|R|R|I|R|R|R|R|R|C| Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | VXLAN Network Identifier (VNI) |O| Csum start | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * C = Remote checksum offload bit. When set indicates that the - * remote checksum offload data is present. - * - * O = Offset bit. Indicates the checksum offset relative to - * checksum start. - * - * Csum start = Checksum start divided by two. - * - * http://tools.ietf.org/html/draft-herbert-vxlan-rco - */ - -/* VXLAN-RCO header flags. */ -#define VXLAN_HF_RCO cpu_to_be32(BIT(21)) - -/* Remote checksum offload header option */ -#define VXLAN_RCO_MASK cpu_to_be32(0x7f) /* Last byte of vni field */ -#define VXLAN_RCO_UDP cpu_to_be32(0x80) /* Indicate UDP RCO (TCP when not set *) */ -#define VXLAN_RCO_SHIFT 1 /* Left shift of start */ -#define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1) -#define VXLAN_MAX_REMCSUM_START (0x7f << VXLAN_RCO_SHIFT) - -/* - * VXLAN Group Based Policy Extension (VXLAN_F_GBP): - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | VXLAN Network Identifier (VNI) | Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * G = Group Policy ID present. - * - * D = Don't Learn bit. When set, this bit indicates that the egress - * VTEP MUST NOT learn the source address of the encapsulated frame. - * - * A = Indicates that the group policy has already been applied to - * this packet. Policies MUST NOT be applied by devices when the - * A bit is set. - * - * https://tools.ietf.org/html/draft-smith-vxlan-group-policy - */ -struct vxlanhdr_gbp { - u8 vx_flags; -#ifdef __LITTLE_ENDIAN_BITFIELD - u8 reserved_flags1:3, - policy_applied:1, - reserved_flags2:2, - dont_learn:1, - reserved_flags3:1; -#elif defined(__BIG_ENDIAN_BITFIELD) - u8 reserved_flags1:1, - dont_learn:1, - reserved_flags2:2, - policy_applied:1, - reserved_flags3:3; -#else -#error "Please fix <asm/byteorder.h>" -#endif - __be16 policy_id; - __be32 vx_vni; -}; - -/* VXLAN-GBP header flags. */ -#define VXLAN_HF_GBP cpu_to_be32(BIT(31)) - -#define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | cpu_to_be32(0xFFFFFF)) - -/* skb->mark mapping - * - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ -#define VXLAN_GBP_DONT_LEARN (BIT(6) << 16) -#define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) -#define VXLAN_GBP_ID_MASK (0xFFFF) - -/* - * VXLAN Generic Protocol Extension (VXLAN_F_GPE): - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * |R|R|Ver|I|P|R|O| Reserved |Next Protocol | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | VXLAN Network Identifier (VNI) | Reserved | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * Ver = Version. Indicates VXLAN GPE protocol version. - * - * P = Next Protocol Bit. The P bit is set to indicate that the - * Next Protocol field is present. - * - * O = OAM Flag Bit. The O bit is set to indicate that the packet - * is an OAM packet. - * - * Next Protocol = This 8 bit field indicates the protocol header - * immediately following the VXLAN GPE header. - * - * https://tools.ietf.org/html/draft-ietf-nvo3-vxlan-gpe-01 - */ - -struct vxlanhdr_gpe { -#if defined(__LITTLE_ENDIAN_BITFIELD) - u8 oam_flag:1, - reserved_flags1:1, - np_applied:1, - instance_applied:1, - version:2, -reserved_flags2:2; -#elif defined(__BIG_ENDIAN_BITFIELD) - u8 reserved_flags2:2, - version:2, - instance_applied:1, - np_applied:1, - reserved_flags1:1, - oam_flag:1; -#endif - u8 reserved_flags3; - u8 reserved_flags4; - u8 next_protocol; - __be32 vx_vni; -}; - -/* VXLAN-GPE header flags. */ -#define VXLAN_HF_VER cpu_to_be32(BIT(29) | BIT(28)) -#define VXLAN_HF_NP cpu_to_be32(BIT(26)) -#define VXLAN_HF_OAM cpu_to_be32(BIT(24)) - -#define VXLAN_GPE_USED_BITS (VXLAN_HF_VER | VXLAN_HF_NP | VXLAN_HF_OAM | \ - cpu_to_be32(0xff)) - -struct vxlan_metadata { - u32 gbp; -}; - -/* per UDP socket information */ -struct vxlan_sock { - struct hlist_node hlist; - struct socket *sock; - struct hlist_head vni_list[VNI_HASH_SIZE]; - atomic_t refcnt; - u32 flags; -#ifdef HAVE_UDP_OFFLOAD - struct udp_offload udp_offloads; -#endif -}; - -union vxlan_addr { - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - struct sockaddr sa; -}; - -struct vxlan_rdst { - union vxlan_addr remote_ip; - __be16 remote_port; - __be32 remote_vni; - u32 remote_ifindex; - struct list_head list; - struct rcu_head rcu; - struct dst_cache dst_cache; -}; - -struct vxlan_config { - union vxlan_addr remote_ip; - union vxlan_addr saddr; - __be32 vni; - int remote_ifindex; - int mtu; - __be16 dst_port; - u16 port_min; - u16 port_max; - u8 tos; - u8 ttl; - __be32 label; - u32 flags; - unsigned long age_interval; - unsigned int addrmax; - bool no_share; -}; - -/* Pseudo network device */ -struct vxlan_dev { - struct hlist_node hlist; /* vni hash table */ - struct list_head next; /* vxlan's per namespace list */ - struct vxlan_sock __rcu *vn4_sock; /* listening socket for IPv4 */ -#if IS_ENABLED(CONFIG_IPV6) - struct vxlan_sock __rcu *vn6_sock; /* listening socket for IPv6 */ -#endif - struct net_device *dev; - struct net *net; /* netns for packet i/o */ - struct vxlan_rdst default_dst; /* default destination */ - u32 flags; /* VXLAN_F_* in vxlan.h */ - - struct timer_list age_timer; - spinlock_t hash_lock; - unsigned int addrcnt; - - struct vxlan_config cfg; - - struct hlist_head fdb_head[FDB_HASH_SIZE]; -}; - -#define VXLAN_F_LEARN 0x01 -#define VXLAN_F_PROXY 0x02 -#define VXLAN_F_RSC 0x04 -#define VXLAN_F_L2MISS 0x08 -#define VXLAN_F_L3MISS 0x10 -#define VXLAN_F_IPV6 0x20 -#define VXLAN_F_UDP_ZERO_CSUM_TX 0x40 -#define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 -#define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 -#define VXLAN_F_REMCSUM_TX 0x200 -#define VXLAN_F_REMCSUM_RX 0x400 -#define VXLAN_F_GBP 0x800 -#define VXLAN_F_REMCSUM_NOPARTIAL 0x1000 -#define VXLAN_F_COLLECT_METADATA 0x2000 -#define VXLAN_F_GPE 0x4000 - -/* Flags that are used in the receive path. These flags must match in - * order for a socket to be shareable - */ -#define VXLAN_F_RCV_FLAGS (VXLAN_F_GBP | \ - VXLAN_F_GPE | \ - VXLAN_F_UDP_ZERO_CSUM6_RX | \ - VXLAN_F_REMCSUM_RX | \ - VXLAN_F_REMCSUM_NOPARTIAL | \ - VXLAN_F_COLLECT_METADATA) - -/* Flags that can be set together with VXLAN_F_GPE. */ -#define VXLAN_F_ALLOWED_GPE (VXLAN_F_GPE | \ - VXLAN_F_IPV6 | \ - VXLAN_F_UDP_ZERO_CSUM_TX | \ - VXLAN_F_UDP_ZERO_CSUM6_TX | \ - VXLAN_F_UDP_ZERO_CSUM6_RX | \ - VXLAN_F_COLLECT_METADATA) - -#define vxlan_dev_create rpl_vxlan_dev_create -struct net_device *rpl_vxlan_dev_create(struct net *net, const char *name, - u8 name_assign_type, struct vxlan_config *conf); - -static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, - netdev_features_t features) -{ - u8 l4_hdr = 0; - - if (!skb->encapsulation) - return features; - - switch (vlan_get_protocol(skb)) { - case htons(ETH_P_IP): - l4_hdr = ip_hdr(skb)->protocol; - break; - case htons(ETH_P_IPV6): - l4_hdr = ipv6_hdr(skb)->nexthdr; - break; - default: - return features;; - } - - if ((l4_hdr == IPPROTO_UDP) && ( -#ifdef HAVE_INNER_PROTOCOL_TYPE - skb->inner_protocol_type != ENCAP_TYPE_ETHER || -#endif -#ifdef HAVE_INNER_PROTOCOL - skb->inner_protocol != htons(ETH_P_TEB) || -#endif - (skb_inner_mac_header(skb) - skb_transport_header(skb) != - sizeof(struct udphdr) + sizeof(struct vxlanhdr)) || - (skb->ip_summed != CHECKSUM_NONE && - !can_checksum_protocol(features, inner_eth_hdr(skb)->h_proto)))) - return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); - - return features; -} - -/* IP header + UDP + VXLAN + Ethernet header */ -#define VXLAN_HEADROOM (20 + 8 + 8 + 14) -/* IPv6 header + UDP + VXLAN + Ethernet header */ -#define VXLAN6_HEADROOM (40 + 8 + 8 + 14) - -static inline struct vxlanhdr *vxlan_hdr(struct sk_buff *skb) -{ - return (struct vxlanhdr *)(udp_hdr(skb) + 1); -} - -static inline __be32 vxlan_vni(__be32 vni_field) -{ -#if defined(__BIG_ENDIAN) - return (__force __be32)((__force u32)vni_field >> 8); -#else - return (__force __be32)((__force u32)(vni_field & VXLAN_VNI_MASK) << 8); -#endif -} - -static inline __be32 vxlan_vni_field(__be32 vni) -{ -#if defined(__BIG_ENDIAN) - return (__force __be32)((__force u32)vni << 8); -#else - return (__force __be32)((__force u32)vni >> 8); -#endif -} - -static inline __be32 vxlan_tun_id_to_vni(__be64 tun_id) -{ -#if defined(__BIG_ENDIAN) - return (__force __be32)tun_id; -#else - return (__force __be32)((__force u64)tun_id >> 32); -#endif -} - -static inline __be64 vxlan_vni_to_tun_id(__be32 vni) -{ -#if defined(__BIG_ENDIAN) - return (__force __be64)vni; -#else - return (__force __be64)((u64)(__force u32)vni << 32); -#endif -} - -static inline size_t vxlan_rco_start(__be32 vni_field) -{ - return be32_to_cpu(vni_field & VXLAN_RCO_MASK) << VXLAN_RCO_SHIFT; -} - -static inline size_t vxlan_rco_offset(__be32 vni_field) -{ - return (vni_field & VXLAN_RCO_UDP) ? - offsetof(struct udphdr, check) : - offsetof(struct tcphdr, check); -} - -static inline __be32 vxlan_compute_rco(unsigned int start, unsigned int offset) -{ - __be32 vni_field = cpu_to_be32(start >> VXLAN_RCO_SHIFT); - - if (offset == offsetof(struct udphdr, check)) - vni_field |= VXLAN_RCO_UDP; - return vni_field; -} - -static inline void vxlan_get_rx_port(struct net_device *netdev) -{ - ASSERT_RTNL(); - call_netdevice_notifiers(NETDEV_OFFLOAD_PUSH_VXLAN, netdev); -} - -static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs) -{ - return vs->sock->sk->sk_family; -} - -int rpl_vxlan_init_module(void); -void rpl_vxlan_cleanup_module(void); - -#define vxlan_fill_metadata_dst ovs_vxlan_fill_metadata_dst -int ovs_vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb); - -#define vxlan_xmit rpl_vxlan_xmit -netdev_tx_t rpl_vxlan_xmit(struct sk_buff *skb); - -#endif /* USE_UPSTREAM_TUNNEL */ - -#define vxlan_init_module rpl_vxlan_init_module -#define vxlan_cleanup_module rpl_vxlan_cleanup_module - -#endif |