From: Pravin B Shelar Date: Fri, 18 Sep 2015 22:23:32 +0000 (-0700) Subject: datapath: Add support for 4.2 kernel. X-Git-Tag: v2.5.0~542 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=fdce83a304da56255474c7be68232fd4d4edcf41 datapath: Add support for 4.2 kernel. --- diff --git a/.travis.yml b/.travis.yml index c721f53a3..aca313134 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,8 @@ env: - TESTSUITE=1 KERNEL=3.18.1 - TESTSUITE=1 OPTS="--enable-shared" - BUILD_ENV="-m32" OPTS="--disable-ssl" + - KERNEL=4.2 - KERNEL=4.1.6 - - KERNEL=4.0.9 - KERNEL=3.17.7 DPDK=1 - KERNEL=3.17.7 DPDK=1 OPTS="--enable-shared" - KERNEL=3.18.21 diff --git a/FAQ.md b/FAQ.md index 7ade627df..512bd2cdf 100644 --- a/FAQ.md +++ b/FAQ.md @@ -156,7 +156,7 @@ A: The following table lists the Linux kernel versions against which the | 2.1.x | 2.6.32 to 3.11 | 2.3.x | 2.6.32 to 3.14 | 2.4.x | 2.6.32 to 4.0 -| 2.5.x | 2.6.32 to 4.1 +| 2.5.x | 2.6.32 to 4.2 Open vSwitch userspace should also work with the Linux kernel module built into Linux 3.3 and later. diff --git a/acinclude.m4 b/acinclude.m4 index df3e75e7a..42d1f4511 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -134,10 +134,10 @@ AC_DEFUN([OVS_CHECK_LINUX], [ AC_MSG_RESULT([$kversion]) if test "$version" -ge 4; then - if test "$version" = 4 && test "$patchlevel" -le 1; then + if test "$version" = 4 && test "$patchlevel" -le 2; then : # Linux 4.x else - AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.1.x is not supported (please refer to the FAQ for advice)]) + AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.2.x is not supported (please refer to the FAQ for advice)]) fi elif test "$version" = 3; then : # Linux 3.x @@ -333,6 +333,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ [OVS_DEFINE([HAVE_INET_GET_LOCAL_PORT_RANGE_USING_NET])]) OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [ip_is_fragment]) + OVS_GREP_IFELSE([$KSRC/include/linux/net.h], [sock_create_kern.*net], + [OVS_DEFINE([HAVE_SOCK_CREATE_KERN_NET])]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_disable_lro]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_get_stats]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_get_by_index_rcu]) @@ -417,6 +419,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_FIND_FIELD_IFELSE([$KSRC/include/net/genetlink.h], [genl_multicast_group], [id]) + OVS_GREP_IFELSE([$KSRC/include/net/geneve.h], [geneve_hdr]) OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register]) OVS_GREP_IFELSE([$KSRC/include/net/ipv6.h], [IP6_FH_F_SKIP_RH]) diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk index be3a8d894..96c3d55d7 100644 --- a/datapath/linux/Modules.mk +++ b/datapath/linux/Modules.mk @@ -12,6 +12,7 @@ openvswitch_sources += \ linux/compat/net_namespace.c \ linux/compat/reciprocal_div.c \ linux/compat/skbuff-openvswitch.c \ + linux/compat/socket.c \ linux/compat/stt.c \ linux/compat/udp.c \ linux/compat/udp_tunnel.c \ diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c index 8e80180cf..85cf95f4c 100644 --- a/datapath/linux/compat/geneve.c +++ b/datapath/linux/compat/geneve.c @@ -56,11 +56,6 @@ #include "compat.h" #include "gso.h" -static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb) -{ - return (struct genevehdr *)(udp_hdr(skb) + 1); -} - static void geneve_build_header(struct genevehdr *geneveh, __be16 tun_flags, u8 vni[3], u8 options_len, u8 *options) diff --git a/datapath/linux/compat/include/linux/net.h b/datapath/linux/compat/include/linux/net.h index 9c947454e..2a6903d0a 100644 --- a/datapath/linux/compat/include/linux/net.h +++ b/datapath/linux/compat/include/linux/net.h @@ -52,4 +52,11 @@ bool rpl___net_get_random_once(void *buf, int nbytes, bool *done, }) #endif +#ifndef HAVE_SOCK_CREATE_KERN_NET +int ovs_sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res); +void ovs_sock_release(struct socket *sock); +#define sock_create_kern ovs_sock_create_kern +#define sock_release ovs_sock_release +#endif + #endif diff --git a/datapath/linux/compat/include/net/geneve.h b/datapath/linux/compat/include/net/geneve.h index 58f5def99..4f250c2f6 100644 --- a/datapath/linux/compat/include/net/geneve.h +++ b/datapath/linux/compat/include/net/geneve.h @@ -101,4 +101,11 @@ int rpl_geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, #endif /* kernel < 4.0 */ +#ifndef HAVE_GENEVE_HDR +static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb) +{ + return (struct genevehdr *)(udp_hdr(skb) + 1); +} +#endif + #endif /*ifdef__NET_GENEVE_WRAPPER_H */ diff --git a/datapath/linux/compat/socket.c b/datapath/linux/compat/socket.c new file mode 100644 index 000000000..7f61e4456 --- /dev/null +++ b/datapath/linux/compat/socket.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifndef HAVE_SOCK_CREATE_KERN_NET +#undef sock_create_kern + +int ovs_sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res) +{ + int err; + + err = sock_create_kern(family, type, protocol, res); + if (err < 0) + return err; + + sk_change_net((*res)->sk, net); + return err; +} +#undef sk_release_kernel +void ovs_sock_release(struct socket *sock) +{ + sk_release_kernel(sock->sk); +} +#endif diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c index e27cedfa6..0659c0b63 100644 --- a/datapath/linux/compat/stt.c +++ b/datapath/linux/compat/stt.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1251,7 +1252,7 @@ drop: static void tcp_sock_release(struct socket *sock) { kernel_sock_shutdown(sock, SHUT_RDWR); - sk_release_kernel(sock->sk); + sock_release(sock); } static int tcp_sock_create4(struct net *net, __be16 port, @@ -1261,12 +1262,10 @@ static int tcp_sock_create4(struct net *net, __be16 port, struct socket *sock = NULL; int err; - err = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); + err = sock_create_kern(net, AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); if (err < 0) goto error; - sk_change_net(sock->sk, net); - memset(&tcp_addr, 0, sizeof(tcp_addr)); tcp_addr.sin_family = AF_INET; tcp_addr.sin_addr.s_addr = htonl(INADDR_ANY); diff --git a/datapath/linux/compat/udp_tunnel.c b/datapath/linux/compat/udp_tunnel.c index 680fd83f9..a3223fdf5 100644 --- a/datapath/linux/compat/udp_tunnel.c +++ b/datapath/linux/compat/udp_tunnel.c @@ -23,12 +23,10 @@ int rpl_udp_sock_create(struct net *net, struct udp_port_cfg *cfg, if (cfg->family == AF_INET6) { struct sockaddr_in6 udp6_addr; - err = sock_create_kern(AF_INET6, SOCK_DGRAM, 0, &sock); + err = sock_create_kern(net, AF_INET6, SOCK_DGRAM, 0, &sock); if (err < 0) goto error; - sk_change_net(sock->sk, net); - udp6_addr.sin6_family = AF_INET6; memcpy(&udp6_addr.sin6_addr, &cfg->local_ip6, sizeof(udp6_addr.sin6_addr)); @@ -54,12 +52,10 @@ int rpl_udp_sock_create(struct net *net, struct udp_port_cfg *cfg, if (cfg->family == AF_INET) { struct sockaddr_in udp_addr; - err = sock_create_kern(AF_INET, SOCK_DGRAM, 0, &sock); + err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock); if (err < 0) goto error; - sk_change_net(sock->sk, net); - udp_addr.sin_family = AF_INET; udp_addr.sin_addr = cfg->local_ip; udp_addr.sin_port = cfg->local_udp_port; @@ -90,7 +86,7 @@ int rpl_udp_sock_create(struct net *net, struct udp_port_cfg *cfg, error: if (sock) { kernel_sock_shutdown(sock, SHUT_RDWR); - sk_release_kernel(sock->sk); + sock_release(sock); } *sockp = NULL; return err; @@ -168,7 +164,7 @@ void rpl_udp_tunnel_sock_release(struct socket *sock) { rcu_assign_sk_user_data(sock->sk, NULL); kernel_sock_shutdown(sock, SHUT_RDWR); - sk_release_kernel(sock->sk); + sock_release(sock); } EXPORT_SYMBOL_GPL(rpl_udp_tunnel_sock_release); diff --git a/datapath/vport-geneve.c b/datapath/vport-geneve.c index 2d7a6b38c..4ab224dac 100644 --- a/datapath/vport-geneve.c +++ b/datapath/vport-geneve.c @@ -46,11 +46,6 @@ static inline struct geneve_port *geneve_vport(const struct vport *vport) return vport_priv(vport); } -static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb) -{ - return (struct genevehdr *)(udp_hdr(skb) + 1); -} - /* Convert 64 bit tunnel ID to 24 bit VNI. */ static void tunnel_id_to_vni(__be64 tun_id, __u8 *vni) {