[ovs-dev] [PATCHv2 02/20] compat: Backport nf_ct_tmpl_alloc().

Joe Stringer joe at ovn.org
Thu Dec 3 07:53:38 UTC 2015


From: Joe Stringer <joestringer at nicira.com>

Loosely based upon Linux commit 0838aa7fcfcd "netfilter: fix netns
dependencies with conntrack templates" and commit 5e8018fc6142
"netfilter: nf_conntrack: add efficient mark to zone mapping".

Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
v2: Backport missing nf_ct_tmpl_free().
    Fix warning on Linux-4.2.
---
 acinclude.m4                                       |  4 ++
 datapath/linux/Modules.mk                          |  1 +
 .../include/net/netfilter/nf_conntrack_core.h      | 44 ++++++++++++++++++++++
 3 files changed, 49 insertions(+)
 create mode 100644 datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h

diff --git a/acinclude.m4 b/acinclude.m4
index 7c8afaca62a7..a3dd3eb99bbd 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -376,6 +376,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops],
                   [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])])
 
+  OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
+                  [tmpl_alloc.*conntrack_zone],
+                  [OVS_DEFINE([HAVE_NF_CT_TMPL_ALLOC_TAKES_STRUCT_ZONE])])
+
   OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32])
 
   OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [get_link_net])
diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk
index 63179655cee5..29a90ea1dd8b 100644
--- a/datapath/linux/Modules.mk
+++ b/datapath/linux/Modules.mk
@@ -91,6 +91,7 @@ openvswitch_headers += \
 	linux/compat/include/net/sock.h \
 	linux/compat/include/net/stt.h \
 	linux/compat/include/net/vxlan.h \
+	linux/compat/include/net/netfilter/nf_conntrack_core.h \
 	linux/compat/include/net/netfilter/nf_conntrack_expect.h \
 	linux/compat/include/net/netfilter/nf_conntrack_zones.h \
 	linux/compat/include/net/sctp/checksum.h
diff --git a/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h b/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h
new file mode 100644
index 000000000000..faa219a4ba65
--- /dev/null
+++ b/datapath/linux/compat/include/net/netfilter/nf_conntrack_core.h
@@ -0,0 +1,44 @@
+#ifndef _NF_CONNTRACK_CORE_WRAPPER_H
+#define _NF_CONNTRACK_CORE_WRAPPER_H
+
+#include_next <net/netfilter/nf_conntrack_core.h>
+
+#ifndef HAVE_NF_CT_TMPL_ALLOC_TAKES_STRUCT_ZONE
+
+#include <net/netfilter/nf_conntrack_zones.h>
+
+#define nf_ct_tmpl_alloc rpl_nf_ct_tmpl_alloc
+/* Released via destroy_conntrack() */
+static inline struct nf_conn *
+nf_ct_tmpl_alloc(struct net *net, const struct nf_conntrack_zone *zone,
+		 gfp_t flags)
+{
+	struct nf_conn *tmpl;
+
+	tmpl = kzalloc(sizeof(*tmpl), flags);
+	if (tmpl == NULL)
+		return NULL;
+
+	tmpl->status = IPS_TEMPLATE;
+	write_pnet(&tmpl->ct_net, net);
+
+	if (nf_ct_zone_add(tmpl, flags, zone) < 0)
+		goto out_free;
+
+	atomic_set(&tmpl->ct_general.use, 0);
+
+	return tmpl;
+out_free:
+	kfree(tmpl);
+	return NULL;
+}
+
+static void rpl_nf_ct_tmpl_free(struct nf_conn *tmpl)
+{
+	nf_ct_ext_destroy(tmpl);
+	nf_ct_ext_free(tmpl);
+	kfree(tmpl);
+}
+#define nf_ct_tmpl_free rpl_nf_ct_tmpl_free
+#endif /* HAVE_NF_CT_TMPL_ALLOC */
+#endif /* _NF_CONNTRACK_CORE_WRAPPER_H */
-- 
2.1.4




More information about the dev mailing list