Skip to content

Commit

Permalink
datapath: compat: geneve: fix geneve_notify_add_rx_port()
Browse files Browse the repository at this point in the history
Remove mutual exclusion between udp-gro registration and geneve receive port
registration.

Signed-off-by: Pravin B Shelar <[email protected]>
Acked-by: Jesse Gross <[email protected]>
  • Loading branch information
pshelar committed Aug 11, 2016
1 parent 2f4962f commit c970aa4
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 27 deletions.
4 changes: 4 additions & 0 deletions acinclude.m4
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
OVS_GREP_IFELSE([$KSRC/include/linux/udp.h], [no_check6_tx])
OVS_GREP_IFELSE([$KSRC/include/linux/utsrelease.h], [el6],
[OVS_DEFINE([HAVE_RHEL6_PER_CPU])])
OVS_FIND_PARAM_IFELSE([$KSRC/include/net/protocol.h],
[udp_add_offload], [net],
[OVS_DEFINE([HAVE_UDP_ADD_OFFLOAD_TAKES_NET])])
if cmp -s datapath/linux/kcompat.h.new \
datapath/linux/kcompat.h >/dev/null 2>&1; then
Expand Down
1 change: 1 addition & 0 deletions datapath/linux/Modules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ openvswitch_headers += \
linux/compat/include/net/mpls.h \
linux/compat/include/net/net_namespace.h \
linux/compat/include/net/netlink.h \
linux/compat/include/net/protocol.h \
linux/compat/include/net/route.h \
linux/compat/include/net/rtnetlink.h \
linux/compat/include/net/udp.h \
Expand Down
44 changes: 17 additions & 27 deletions datapath/linux/compat/geneve.c
Original file line number Diff line number Diff line change
Expand Up @@ -411,64 +411,54 @@ static struct socket *geneve_create_sock(struct net *net, bool ipv6,

static void geneve_notify_add_rx_port(struct geneve_sock *gs)
{
#ifdef HAVE_NDO_ADD_GENEVE_PORT
struct net_device *dev;
struct sock *sk = gs->sock->sk;
struct net *net = sock_net(sk);
sa_family_t sa_family = geneve_get_sk_family(gs);
__be16 port = inet_sk(sk)->inet_sport;

rcu_read_lock();
for_each_netdev_rcu(net, dev) {
if (dev->netdev_ops->ndo_add_geneve_port)
dev->netdev_ops->ndo_add_geneve_port(dev, sa_family,
port);
}
rcu_read_unlock();
#else
#ifdef HAVE_UDP_OFFLOAD
struct sock *sk = gs->sock->sk;
sa_family_t sa_family = sk->sk_family;
int err;

if (sa_family == AF_INET) {
err = udp_add_offload(&gs->udp_offloads);
err = udp_add_offload(sock_net(sk), &gs->udp_offloads);
if (err)
pr_warn("geneve: udp_add_offload failed with status %d\n",
err);
}
#endif
#endif

rcu_read_lock();
for_each_netdev_rcu(net, dev) {
#ifdef HAVE_NDO_ADD_GENEVE_PORT
__be16 port = inet_sk(sk)->inet_sport;

if (dev->netdev_ops->ndo_add_geneve_port)
dev->netdev_ops->ndo_add_geneve_port(dev, sa_family,
port);
#endif
}
rcu_read_unlock();
}

static void geneve_notify_del_rx_port(struct geneve_sock *gs)
{
#ifdef HAVE_NDO_ADD_GENEVE_PORT
struct net_device *dev;
struct sock *sk = gs->sock->sk;
struct net *net = sock_net(sk);
sa_family_t sa_family = geneve_get_sk_family(gs);
__be16 port = inet_sk(sk)->inet_sport;

rcu_read_lock();
for_each_netdev_rcu(net, dev) {
#ifdef HAVE_NDO_ADD_GENEVE_PORT
__be16 port = inet_sk(sk)->inet_sport;

if (dev->netdev_ops->ndo_del_geneve_port)
dev->netdev_ops->ndo_del_geneve_port(dev, sa_family,
port);
port);
#endif
}

rcu_read_unlock();
#else
#ifdef HAVE_UDP_OFFLOAD
struct sock *sk = gs->sock->sk;
sa_family_t sa_family = sk->sk_family;

if (sa_family == AF_INET)
udp_del_offload(&gs->udp_offloads);
#endif

#endif
}

#if defined(HAVE_UDP_OFFLOAD) || \
Expand Down
19 changes: 19 additions & 0 deletions datapath/linux/compat/include/net/protocol.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef _NET_PROTOCOL_WRAPPER_H
#define _NET_PROTOCOL_WRAPPER_H

#include_next <net/protocol.h>

#ifdef HAVE_UDP_OFFLOAD

#ifndef HAVE_UDP_ADD_OFFLOAD_TAKES_NET
#define udp_add_offload(net, prot) udp_add_offload(prot)
#endif

#else

#define udp_add_offload(net, prot) 0
#define udp_del_offload(prot) do {} while(0)

#endif /* HAVE_UDP_OFFLOAD */

#endif /* _NET_PROTOCOL_WRAPPER_H */

0 comments on commit c970aa4

Please sign in to comment.