From patchwork Fri Sep 18 22:23:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pravin B Shelar X-Patchwork-Id: 519600 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (li376-54.members.linode.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 0E7461401B5 for ; Sat, 19 Sep 2015 08:23:39 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 8D81B10D2A; Fri, 18 Sep 2015 15:23:37 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx3v1.cudamail.com (mx3.cudamail.com [64.34.241.5]) by archives.nicira.com (Postfix) with ESMTPS id 8874D22C469 for ; Fri, 18 Sep 2015 15:23:36 -0700 (PDT) Received: from bar3.cudamail.com (bar1 [192.168.15.1]) by mx3v1.cudamail.com (Postfix) with ESMTP id 0BBC8618EF9 for ; Fri, 18 Sep 2015 16:23:36 -0600 (MDT) X-ASG-Debug-ID: 1442615014-03dd7b348300ac0001-byXFYA Received: from mx3-pf2.cudamail.com ([192.168.14.1]) by bar3.cudamail.com with ESMTP id QnVG7nszUkPm6vYn (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 18 Sep 2015 16:23:34 -0600 (MDT) X-Barracuda-Envelope-From: pshelar@nicira.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.14.1 Received: from unknown (HELO mail-pa0-f52.google.com) (209.85.220.52) by mx3-pf2.cudamail.com with ESMTPS (RC4-SHA encrypted); 18 Sep 2015 22:23:33 -0000 Received-SPF: unknown (mx3-pf2.cudamail.com: Multiple SPF records returned) X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.52 Received: by pacfv12 with SMTP id fv12so62543531pac.2 for ; Fri, 18 Sep 2015 15:23:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=u7LzVV0+mGbco8m5RMG9nQb7d2gdV8cnxIY2ps3Q95U=; b=D9TWMp/qUJ2oOBwIqb0BUBMG/Fp/9NgTN2ajkJ3+dzNAgEocfN3dl6RV10l6wui3/y AcL3TOvpjXvc4MJTRFgLmUvdQptEnLWlPP4Hckfa5gyELnw8GhEI+3zOV6NysVNdC8Ii qq9lxAgMN0VQbmYg9P8ZytGPNyMh021Fae8C5b9oZlevdUzpo7sHThJ8uPmAyUJExZZv AkpYifzgSn8vGfKTxN9ghiG8yS3i1tMwnYjMD2YE0o3JpUJAIqx8MPiSLerSMrBLrLf7 Yg9HKV/JGaIK24DYZl2VpT02TSxEGeyQs5XqLKu10Qk2somk/OoiLnUb5VUMDD1kC4K4 oDxQ== X-Gm-Message-State: ALoCoQnOb2xpfyL4EomyscfMMqI6rcAyKVdAJ3EEz5M7xXYob88eLqpFuUC50zmh3W/XWXvVi4V2 X-Received: by 10.66.237.97 with SMTP id vb1mr9593008pac.139.1442615014004; Fri, 18 Sep 2015 15:23:34 -0700 (PDT) Received: from localhost ([208.91.1.34]) by smtp.gmail.com with ESMTPSA id e6sm10878340pas.35.2015.09.18.15.23.33 (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Fri, 18 Sep 2015 15:23:33 -0700 (PDT) X-CudaMail-Envelope-Sender: pshelar@nicira.com X-Barracuda-Apparent-Source-IP: 208.91.1.34 From: Pravin B Shelar To: dev@openvswitch.org X-CudaMail-Whitelist-To: dev@openvswitch.org X-CudaMail-MID: CM-V2-917056382 X-CudaMail-DTE: 091815 X-CudaMail-Originating-IP: 209.85.220.52 Date: Fri, 18 Sep 2015 15:23:32 -0700 X-ASG-Orig-Subj: [##CM-V2-917056382##][PATCH 2/3] datapath: Add support for 4.2 kernel. Message-Id: <1442615012-2369-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: UNKNOWN[192.168.14.1] X-Barracuda-Start-Time: 1442615014 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-ASG-Whitelist: Header =?UTF-8?B?eFwtY3VkYW1haWxcLXdoaXRlbGlzdFwtdG8=?= X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 Subject: [ovs-dev] [PATCH 2/3] datapath: Add support for 4.2 kernel. X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" Signed-off-by: Pravin B Shelar Acked-by: Jesse Gross --- .travis.yml | 2 +- FAQ.md | 2 +- acinclude.m4 | 7 ++++- datapath/linux/Modules.mk | 1 + datapath/linux/compat/geneve.c | 5 ---- datapath/linux/compat/include/linux/net.h | 7 ++++++ datapath/linux/compat/include/net/geneve.h | 7 ++++++ datapath/linux/compat/socket.c | 32 ++++++++++++++++++++++++++++ datapath/linux/compat/stt.c | 7 ++--- datapath/linux/compat/udp_tunnel.c | 12 +++------- datapath/vport-geneve.c | 5 ---- 11 files changed, 61 insertions(+), 26 deletions(-) create mode 100644 datapath/linux/compat/socket.c diff --git a/.travis.yml b/.travis.yml index c721f53..aca3131 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 7ade627..512bd2c 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 df3e75e..42d1f45 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 be3a8d8..96c3d55 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 8e80180..85cf95f 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 9c94745..2a6903d 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 58f5def..4f250c2 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 0000000..7f61e44 --- /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 e27cedf..0659c0b 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 680fd83..a3223fd 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 2d7a6b3..4ab224d 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) {