Skip to content

Commit

Permalink
datapath: Add support for 4.2 kernel.
Browse files Browse the repository at this point in the history
  • Loading branch information
Pravin B Shelar committed Sep 24, 2015
1 parent 3f97b66 commit fdce83a
Show file tree
Hide file tree
Showing 11 changed files with 61 additions and 26 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
7 changes: 5 additions & 2 deletions acinclude.m4
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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])
Expand Down Expand Up @@ -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])
Expand Down
1 change: 1 addition & 0 deletions datapath/linux/Modules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
5 changes: 0 additions & 5 deletions datapath/linux/compat/geneve.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions datapath/linux/compat/include/linux/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions datapath/linux/compat/include/net/geneve.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
32 changes: 32 additions & 0 deletions datapath/linux/compat/socket.c
Original file line number Diff line number Diff line change
@@ -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
7 changes: 3 additions & 4 deletions datapath/linux/compat/stt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -1251,7 +1252,7 @@ static void stt_rcv(struct stt_sock *stt_sock, struct sk_buff *skb)
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,
Expand All @@ -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);
Expand Down
12 changes: 4 additions & 8 deletions datapath/linux/compat/udp_tunnel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
5 changes: 0 additions & 5 deletions datapath/vport-geneve.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit fdce83a

Please sign in to comment.