@@ -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])
@@ -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
new file mode 100644
@@ -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 */