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"
   - 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.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
   - 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.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.
 
    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
     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
           : # 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
        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_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])
   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_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])
 
   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/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 \
        linux/compat/stt.c \
        linux/compat/udp.c \
        linux/compat/udp_tunnel.c \
index 8e80180..85cf95f 100644 (file)
 #include "compat.h"
 #include "gso.h"
 
 #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)
 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
 
 })
 #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
 #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 */
 
 
 #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 */
 #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/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>
 #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);
 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,
 }
 
 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;
 
        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;
 
        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);
        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;
 
        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;
 
                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));
                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;
 
        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;
 
                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;
                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);
 error:
        if (sock) {
                kernel_sock_shutdown(sock, SHUT_RDWR);
-               sk_release_kernel(sock->sk);
+               sock_release(sock);
        }
        *sockp = NULL;
        return err;
        }
        *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);
 {
        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);
 
 }
 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);
 }
 
        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)
 {
 /* Convert 64 bit tunnel ID to 24 bit VNI. */
 static void tunnel_id_to_vni(__be64 tun_id, __u8 *vni)
 {