compat: Detect and use nf_ct_frag6_gather().
authorJoe Stringer <joe@ovn.org>
Fri, 8 Jan 2016 01:47:23 +0000 (17:47 -0800)
committerJoe Stringer <joe@ovn.org>
Tue, 2 Feb 2016 22:26:46 +0000 (14:26 -0800)
This function is a likely candidate for backporting, and currently
relies on version checks to include the source or not. Grep for the
appropriate functions instead, and include the backport based on that.

Signed-off-by: Joe Stringer <joe@ovn.org>
Acked-by: Pravin B Shelar <pshelar@ovn.org>
acinclude.m4
datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h
datapath/linux/compat/nf_conntrack_reasm.c

index eedda76..7ed464c 100644 (file)
@@ -400,6 +400,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
                   [nf_ct_zone_init])
   OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_labels.h],
                   [nf_connlabels_get])
+  OVS_GREP_IFELSE([$KSRC/include/net/netfilter/ipv6/nf_defrag_ipv6.h],
+                  [nf_ct_frag6_consume_orig])
+  OVS_GREP_IFELSE([$KSRC/include/net/netfilter/ipv6/nf_defrag_ipv6.h],
+                  [nf_ct_frag6_output])
 
   OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32])
   OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32_max])
index 7d51491..97052cc 100644 (file)
@@ -7,8 +7,14 @@
 #include_next <net/netfilter/ipv6/nf_defrag_ipv6.h>
 #endif
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)
+/* Upstream commit 029f7f3b8701 ("netfilter: ipv6: nf_defrag: avoid/free clone
+ * operations") changed the semantics of nf_ct_frag6_gather(), so we backport
+ * it for all prior kernels.
+ */
+#if defined(HAVE_NF_CT_FRAG6_CONSUME_ORIG) || \
+    defined(HAVE_NF_CT_FRAG6_OUTPUT)
 #if defined(OVS_FRAGMENT_BACKPORT)
+#define OVS_NF_DEFRAG6_BACKPORT 1
 struct sk_buff *rpl_nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
 int __init rpl_nf_ct_frag6_init(void);
 void rpl_nf_ct_frag6_cleanup(void);
@@ -24,9 +30,13 @@ static inline void rpl_nf_ct_frag6_cleanup(void) { }
 static inline void rpl_nf_ct_frag6_consume_orig(struct sk_buff *skb) { }
 #endif /* OVS_FRAGMENT_BACKPORT */
 #define nf_ct_frag6_gather rpl_nf_ct_frag6_gather
+#else /* HAVE_NF_CT_FRAG6_CONSUME_ORIG */
+static inline int __init rpl_nf_ct_frag6_init(void) { return 0; }
+static inline void rpl_nf_ct_frag6_cleanup(void) { }
+static inline void rpl_nf_ct_frag6_consume_orig(struct sk_buff *skb) { }
+#endif /* HAVE_NF_CT_FRAG6_CONSUME_ORIG */
 #define nf_ct_frag6_init rpl_nf_ct_frag6_init
 #define nf_ct_frag6_cleanup rpl_nf_ct_frag6_cleanup
 #define nf_ct_frag6_consume_orig rpl_nf_ct_frag6_consume_orig
-#endif /* < 4.3 */
 
 #endif /* __NF_DEFRAG_IPV6_WRAPPER_H */
index 89a3978..fec9e57 100644 (file)
@@ -21,8 +21,6 @@
 
 #include <linux/version.h>
 
-#ifdef OVS_FRAGMENT_BACKPORT
-
 #include <linux/errno.h>
 #include <linux/types.h>
 #include <linux/string.h>
@@ -56,6 +54,8 @@
 #include <linux/module.h>
 #include <net/netfilter/ipv6/nf_defrag_ipv6.h>
 
+#ifdef OVS_NF_DEFRAG6_BACKPORT
+
 static const char nf_frags_cache_name[] = "nf-frags";
 
 struct nf_ct_frag6_skb_cb
@@ -651,4 +651,4 @@ void rpl_nf_ct_frag6_cleanup(void)
        inet_frags_fini(&nf_frags);
 }
 
-#endif /* OVS_FRAGMENT_BACKPORT */
+#endif /* OVS_NF_DEFRAG6_BACKPORT */