datapath: Add support for 4.2 kernel.
authorPravin B Shelar <pshelar@nicira.com>
Fri, 18 Sep 2015 22:23:32 +0000 (15:23 -0700)
committerPravin B Shelar <pshelar@nicira.com>
Thu, 24 Sep 2015 02:41:19 +0000 (19:41 -0700)
.travis.yml
FAQ.md
acinclude.m4
datapath/linux/Modules.mk
datapath/linux/compat/geneve.c
datapath/linux/compat/include/linux/net.h
datapath/linux/compat/include/net/geneve.h
datapath/linux/compat/socket.c [new file with mode: 0644]
datapath/linux/compat/stt.c
datapath/linux/compat/udp_tunnel.c
datapath/vport-geneve.c

index c721f53..aca3131 100644 (file)
@@ -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 7ade627..512bd2c 100644 (file)
--- 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.
index df3e75e..42d1f45 100644 (file)
@@ -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])
index be3a8d8..96c3d55 100644 (file)
@@ -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 \
index 8e80180..85cf95f 100644 (file)
 #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)
index 9c94745..2a6903d 100644 (file)
@@ -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
index 58f5def..4f250c2 100644 (file)
@@ -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 (file)
index 0000000..7f61e44
--- /dev/null
@@ -0,0 +1,32 @@
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/socket.h>
+#include <linux/udp.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <net/ip_tunnels.h>
+#include <net/udp.h>
+#include <net/udp_tunnel.h>
+#include <net/net_namespace.h>
+
+
+#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
index e27cedf..0659c0b 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/list.h>
 #include <linux/log2.h>
 #include <linux/module.h>
+#include <linux/net.h>
 #include <linux/netfilter.h>
 #include <linux/percpu.h>
 #include <linux/skbuff.h>
@@ -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);
index 680fd83..a3223fd 100644 (file)
@@ -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);
 
index 2d7a6b3..4ab224d 100644 (file)
@@ -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)
 {