@@ -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
@@ -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 \
@@ -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) || \
new file mode 100644
@@ -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 */
Remove mutual exclusion between udp-gro registration and geneve receive port registration. Signed-off-by: Pravin B Shelar <pshelar@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