On 8/27/2018 7:19 PM, Darrell Ball wrote:
On older kernels, for example 3.19, the function rt6_get_cookie() is
not available and used with ipv6 config enabled; it was introduced in
4.2. Put back the replacement function if it does not exist.
Interesting that builds on 3.16.57 but not 3.19. You can never tell
what's getting backported and
to which kernel. Keeps us busy!
Thanks Darrell, looks like a good catch. I'll let Yifeng provide the review.
- Greg
CC: Yifeng Sun <[email protected]>
Fixes: bf61b8b1c1db ("datapath: Add support for kernel 4.16.x & 4.17.x.")
Signed-off-by: Darrell Ball <[email protected]>
---
acinclude.m4 | 5 ++++
datapath/linux/Modules.mk | 1 +
datapath/linux/compat/include/net/ip6_fib.h | 43 +++++++++++++++++++++++++++++
3 files changed, 49 insertions(+)
create mode 100644 datapath/linux/compat/include/net/ip6_fib.h
diff --git a/acinclude.m4 b/acinclude.m4
index ab141bd..0690bae 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -459,6 +459,9 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
OVS_GREP_IFELSE([$KSRC/arch/x86/include/asm/checksum_32.h], [src_err,],
[OVS_DEFINE([HAVE_CSUM_COPY_DBG])])
+ OVS_GREP_IFELSE([$KSRC/include/net/ip6_fib.h], [rt6_get_cookie],
+ [OVS_DEFINE([HAVE_RT6_GET_COOKIE])])
+
OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_dst_lookup.*net],
[OVS_DEFINE([HAVE_IPV6_DST_LOOKUP_NET])])
OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_stub])
@@ -803,6 +806,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
[OVS_DEFINE(HAVE_NF_CONNTRACK_HELPER_PUT)])
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],[[[[:space:]]]SKB_GSO_UDP[[[:space:]]]],
[OVS_DEFINE([HAVE_SKB_GSO_UDP])])
+ OVS_GREP_IFELSE([$KSRC/include/net/dst.h],[DST_NOCACHE],
+ [OVS_DEFINE([HAVE_DST_NOCACHE])])
OVS_FIND_FIELD_IFELSE([$KSRC/include/net/rtnetlink.h], [rtnl_link_ops],
[extack],
[OVS_DEFINE([HAVE_EXT_ACK_IN_RTNL_LINKOPS])])
diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk
index b06ca15..e31d784 100644
--- a/datapath/linux/Modules.mk
+++ b/datapath/linux/Modules.mk
@@ -82,6 +82,7 @@ openvswitch_headers += \
linux/compat/include/net/inetpeer.h \
linux/compat/include/net/ip.h \
linux/compat/include/net/ip_tunnels.h \
+ linux/compat/include/net/ip6_fib.h \
linux/compat/include/net/ip6_route.h \
linux/compat/include/net/ip6_tunnel.h \
linux/compat/include/net/ipv6.h \
diff --git a/datapath/linux/compat/include/net/ip6_fib.h
b/datapath/linux/compat/include/net/ip6_fib.h
new file mode 100644
index 0000000..0cc4358
--- /dev/null
+++ b/datapath/linux/compat/include/net/ip6_fib.h
@@ -0,0 +1,43 @@
+/*
+ * Linux INET6 implementation
+ *
+ * Authors:
+ * Pedro Roque <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _IP6_FIB_WRAPPER_H
+#define _IP6_FIB_WRAPPER_H
+
+#include_next <net/ip6_fib.h>
+
+#ifndef HAVE_RT6_GET_COOKIE
+
+#ifndef RTF_PCPU
+#define RTF_PCPU 0x40000000
+#endif
+
+#ifndef RTF_LOCAL
+#define RTF_LOCAL 0x80000000
+#endif
+
+#define rt6_get_cookie rpl_rt6_get_cookie
+static inline u32 rt6_get_cookie(const struct rt6_info *rt)
+{
+ if (rt->rt6i_flags & RTF_PCPU ||
+#ifdef HAVE_DST_NOCACHE
+ (unlikely(rt->dst.flags & DST_NOCACHE) && rt->dst.from))
+#else
+ (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->dst.from))
+#endif
+ rt = (struct rt6_info *)(rt->dst.from);
+
+ return rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
+}
+#endif
+
+#endif
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev