Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:Update
openvswitch
datapath-Add-support-for-Linux-3.12.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File datapath-Add-support-for-Linux-3.12.patch of Package openvswitch
Bump kernel support for datapath module to include 3.12. Make use of native vxlan kernel module for Linux >= 3.12 or if the kernel in use supports the required vxlan functions. Make use of native iptunnels capability for Linux >= 3.12. Note: ipv6 enablement with vxlan is not supported by this change. Signed-off-by: James Page <james.page at ubuntu.com> --- FAQ | 2 +- NEWS | 2 +- acinclude.m4 | 5 +++-- datapath/linux/compat/include/net/ip_tunnels.h | 8 +++++++- datapath/linux/compat/include/net/vxlan.h | 10 +++++++++- datapath/linux/compat/ip_tunnels_core.c | 6 +++++- datapath/linux/compat/vxlan.c | 8 ++++++-- datapath/vport-gre.c | 2 +- datapath/vport-lisp.c | 2 +- datapath/vport-vxlan.c | 2 +- 10 files changed, 35 insertions(+), 12 deletions(-) Index: a/FAQ =================================================================== --- a/FAQ +++ b/FAQ @@ -148,7 +148,7 @@ A: The following table lists the Linux kernel versions against which the 1.10.x 2.6.18 to 3.8 1.11.x 2.6.18 to 3.8 2.0.x 2.6.32 to 3.10 - 2.1.x 2.6.32 to 3.11 + 2.1.x 2.6.32 to 3.12 Open vSwitch userspace should also work with the Linux kernel module built into Linux 3.3 and later. Index: a/NEWS =================================================================== --- a/NEWS +++ b/NEWS @@ -52,7 +52,7 @@ v2.1.0 - 19 Mar 2014 number. - ovs-vswitchd.conf.db.5 man page will contain graphviz/dot diagram only if graphviz package was installed at the build time. - - Support for Linux kernels up to 3.11 + - Support for Linux kernels up to 3.12 - ovs-dpctl: The "show" command also displays mega flow mask stats. - ovs-ofctl: Index: a/acinclude.m4 =================================================================== --- a/acinclude.m4 +++ b/acinclude.m4 @@ -134,10 +134,10 @@ AC_DEFUN([OVS_CHECK_LINUX], [ AC_MSG_RESULT([$kversion]) if test "$version" -ge 3; then - if test "$version" = 3 && test "$patchlevel" -le 11; then + if test "$version" = 3 && test "$patchlevel" -le 12; then : # Linux 3.x else - AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 3.11.x is not supported]) + AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 3.12.x is not supported]) fi else if test "$version" -le 1 || test "$patchlevel" -le 5 || test "$sublevel" -le 31; then @@ -276,6 +276,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [parallel_ops]) OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register]) + OVS_GREP_IFELSE([$KSRC/include/net/vxlan.h], [vxlan_sock_add]) OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16]) OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be16]) OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be32]) Index: a/datapath/linux/compat/include/net/ip_tunnels.h =================================================================== --- a/datapath/linux/compat/include/net/ip_tunnels.h +++ b/datapath/linux/compat/include/net/ip_tunnels.h @@ -11,6 +11,10 @@ #include <net/ip.h> #include <net/rtnetlink.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0) +#include_next <net/ip_tunnels.h> +#else + #define TUNNEL_CSUM __cpu_to_be16(0x01) #define TUNNEL_ROUTING __cpu_to_be16(0x02) #define TUNNEL_KEY __cpu_to_be16(0x04) @@ -34,7 +38,9 @@ struct tnl_ptk_info { int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb, __be32 src, __be32 dst, __u8 proto, - __u8 tos, __u8 ttl, __be16 df); + __u8 tos, __u8 ttl, __be16 df, bool xnet); int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto); + +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0) */ #endif /* __NET_IP_TUNNELS_H */ Index: a/datapath/linux/compat/include/net/vxlan.h =================================================================== --- a/datapath/linux/compat/include/net/vxlan.h +++ b/datapath/linux/compat/include/net/vxlan.h @@ -5,6 +5,13 @@ #include <linux/netdevice.h> #include <linux/udp.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0) || \ + defined(HAVE_VXLAN_SOCK_ADD) +#include_next <net/vxlan.h> +#endif + +#ifndef HAVE_VXLAN_SOCK_ADD + struct vxlan_sock; typedef void (vxlan_rcv_t)(struct vxlan_sock *vs, struct sk_buff *skb, __be32 key); @@ -20,7 +27,7 @@ struct vxlan_sock { struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, vxlan_rcv_t *rcv, void *data, - bool no_share); + bool no_share, bool ipv6); void vxlan_sock_release(struct vxlan_sock *vs); @@ -31,4 +38,5 @@ int vxlan_xmit_skb(struct vxlan_sock *vs __be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb); +#endif /* HAVE_VXLAN_SOCK_ADD */ #endif Index: a/datapath/linux/compat/ip_tunnels_core.c =================================================================== --- a/datapath/linux/compat/ip_tunnels_core.c +++ b/datapath/linux/compat/ip_tunnels_core.c @@ -34,10 +34,12 @@ #include "compat.h" #include "gso.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + int iptunnel_xmit(struct rtable *rt, struct sk_buff *skb, __be32 src, __be32 dst, __u8 proto, - __u8 tos, __u8 ttl, __be16 df) + __u8 tos, __u8 ttl, __be16 df, bool xnet) { int pkt_len = skb->len; struct iphdr *iph; @@ -108,3 +110,5 @@ int iptunnel_pull_header(struct sk_buff skb->pkt_type = PACKET_HOST; return 0; } + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) */ Index: a/datapath/linux/compat/vxlan.c =================================================================== --- a/datapath/linux/compat/vxlan.c +++ b/datapath/linux/compat/vxlan.c @@ -56,6 +56,8 @@ #include "gso.h" #include "vlan.h" +#ifndef HAVE_VXLAN_SOCK_ADD + #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */ @@ -223,7 +225,7 @@ int vxlan_xmit_skb(struct vxlan_sock *vs if (err) return err; - return iptunnel_xmit(rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df); + return iptunnel_xmit(rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, false); } static void rcu_free_vs(struct rcu_head *rcu) @@ -298,7 +300,7 @@ static struct vxlan_sock *vxlan_socket_c struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, vxlan_rcv_t *rcv, void *data, - bool no_share) + bool no_share, bool ipv6) { return vxlan_socket_create(net, port, rcv, data); } @@ -310,3 +312,5 @@ void vxlan_sock_release(struct vxlan_soc queue_work(system_wq, &vs->del_work); } + +#endif /* HAVE_VXLAN_SOCK_ADD */ Index: a/datapath/vport-gre.c =================================================================== --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -197,7 +197,7 @@ static int __send(struct vport *vport, s return iptunnel_xmit(rt, skb, saddr, OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_GRE, OVS_CB(skb)->tun_key->ipv4_tos, - OVS_CB(skb)->tun_key->ipv4_ttl, df); + OVS_CB(skb)->tun_key->ipv4_ttl, df, false); err_free_rt: ip_rt_put(rt); error: Index: a/datapath/vport-lisp.c =================================================================== --- a/datapath/vport-lisp.c +++ b/datapath/vport-lisp.c @@ -381,6 +381,7 @@ error: return ERR_PTR(err); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) static void lisp_fix_segment(struct sk_buff *skb) { struct udphdr *udph = udp_hdr(skb); @@ -388,13 +389,30 @@ static void lisp_fix_segment(struct sk_b udph->len = htons(skb->len - skb_transport_offset(skb)); } -static void handle_offloads(struct sk_buff *skb) +static int handle_offloads(struct sk_buff *skb) { if (skb_is_gso(skb)) OVS_GSO_CB(skb)->fix_segment = lisp_fix_segment; else if (skb->ip_summed != CHECKSUM_PARTIAL) skb->ip_summed = CHECKSUM_NONE; + return 0; } +#else +static int handle_offloads(struct sk_buff *skb) +{ + if (skb_is_gso(skb)) { + int err = skb_unclone(skb, GFP_ATOMIC); + if (unlikely(err)) + return err; + + skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; + } else if (skb->ip_summed != CHECKSUM_PARTIAL) + skb->ip_summed = CHECKSUM_NONE; + + skb->encapsulation = 1; + return 0; +} +#endif static int lisp_send(struct vport *vport, struct sk_buff *skb) { @@ -455,7 +473,10 @@ static int lisp_send(struct vport *vport lisp_build_header(vport, skb); /* Offloading */ - handle_offloads(skb); + err = handle_offloads(skb); + if (err) + goto err_free_rt; + skb->local_df = 1; df = OVS_CB(skb)->tun_key->tun_flags & @@ -463,7 +484,7 @@ static int lisp_send(struct vport *vport sent_len = iptunnel_xmit(rt, skb, saddr, OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_UDP, OVS_CB(skb)->tun_key->ipv4_tos, - OVS_CB(skb)->tun_key->ipv4_ttl, df); + OVS_CB(skb)->tun_key->ipv4_ttl, df, false); return sent_len > 0 ? sent_len + network_offset : sent_len; Index: a/datapath/vport-vxlan.c =================================================================== --- a/datapath/vport-vxlan.c +++ b/datapath/vport-vxlan.c @@ -124,7 +124,7 @@ static struct vport *vxlan_tnl_create(co vxlan_port = vxlan_vport(vport); strncpy(vxlan_port->name, parms->name, IFNAMSIZ); - vs = vxlan_sock_add(net, htons(dst_port), vxlan_rcv, vport, true); + vs = vxlan_sock_add(net, htons(dst_port), vxlan_rcv, vport, true, false); if (IS_ERR(vs)) { ovs_vport_free(vport); return (void *)vs; Index: a/datapath/linux/compat/gre.c =================================================================== --- a/datapath/linux/compat/gre.c +++ b/datapath/linux/compat/gre.c @@ -16,6 +16,9 @@ * 02110-1301, USA */ +#include <linux/version.h> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + #include <linux/kconfig.h> #if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX) @@ -340,3 +343,5 @@ void gre_build_header(struct sk_buff *sk } #endif /* CONFIG_NET_IPGRE_DEMUX */ + +#endif /* 3.12 */ Index: a/datapath/linux/compat/gso.c =================================================================== --- a/datapath/linux/compat/gso.c +++ b/datapath/linux/compat/gso.c @@ -16,6 +16,9 @@ * 02110-1301, USA */ +#include <linux/version.h> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + #include <linux/module.h> #include <linux/if.h> #include <linux/if_tunnel.h> @@ -229,3 +232,5 @@ int rpl_ip_local_out(struct sk_buff *skb } return ret; } + +#endif /* 3.12 */ Index: a/datapath/linux/compat/gso.h =================================================================== --- a/datapath/linux/compat/gso.h +++ b/datapath/linux/compat/gso.h @@ -1,6 +1,9 @@ #ifndef __LINUX_GSO_WRAPPER_H #define __LINUX_GSO_WRAPPER_H +#include <linux/version.h> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + #include <linux/skbuff.h> #include <net/protocol.h> @@ -70,3 +73,5 @@ static inline void skb_reset_inner_heade #define ip_local_out rpl_ip_local_out int ip_local_out(struct sk_buff *skb); #endif + +#endif /* 3.12 */ Index: a/datapath/linux/compat/include/net/gre.h =================================================================== --- a/datapath/linux/compat/include/net/gre.h +++ b/datapath/linux/compat/include/net/gre.h @@ -4,6 +4,7 @@ #include <linux/skbuff.h> #include <net/ip_tunnels.h> +#include <linux/version.h> #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) || \ defined(HAVE_GRE_CISCO_REGISTER) #include_next <net/gre.h> @@ -80,6 +81,7 @@ static inline __be16 tnl_flags_to_gre_fl #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */ #endif /* HAVE_GRE_CISCO_REGISTER */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) #define gre_build_header rpl_gre_build_header void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, int hdr_len); @@ -100,5 +102,6 @@ static inline int ip_gre_calc_hlen(__be1 addend += 4; return addend; } +#endif #endif
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor