Remove mutual exclusion between udp-gro registration and geneve receive port
registration.

Signed-off-by: Pravin B Shelar <pshe...@ovn.org>
---
 acinclude.m4                                 |  4 +++
 datapath/linux/Modules.mk                    |  1 +
 datapath/linux/compat/geneve.c               | 44 +++++++++++-----------------
 datapath/linux/compat/include/net/protocol.h | 19 ++++++++++++
 4 files changed, 41 insertions(+), 27 deletions(-)
 create mode 100644 datapath/linux/compat/include/net/protocol.h

diff --git a/acinclude.m4 b/acinclude.m4
index bbbad23..25295c5 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -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
diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk
index 1f701a3..26f6d22 100644
--- a/datapath/linux/Modules.mk
+++ b/datapath/linux/Modules.mk
@@ -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 \
diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
index 74e0cbc..cbaa47c 100644
--- a/datapath/linux/compat/geneve.c
+++ b/datapath/linux/compat/geneve.c
@@ -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) || \
diff --git a/datapath/linux/compat/include/net/protocol.h 
b/datapath/linux/compat/include/net/protocol.h
new file mode 100644
index 0000000..0247a26
--- /dev/null
+++ b/datapath/linux/compat/include/net/protocol.h
@@ -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 */
-- 
1.8.3.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to