# netlink interface for nf_conntrack
--- /dev/null
+++ b/net/netfilter/nf_conntrack_rtcache.c
-@@ -0,0 +1,428 @@
+@@ -0,0 +1,440 @@
+/* route cache for netfilter.
+ *
+ * (C) 2014 Red Hat GmbH
+ .destroy = nf_conn_rtcache_destroy,
+};
+
++static int __net_init rtcache_net_init(struct net *net)
++{
++ return nf_register_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
++}
++
+static void __net_exit rtcache_net_exit(struct net *net)
+{
+ /* remove hooks so no new connections get rtcache extension */
+}
+
+static struct pernet_operations rtcache_ops_net_ops = {
++ .init = rtcache_net_init,
+ .exit = rtcache_net_exit,
+};
+
+ synchronize_net();
+
+ unregister_netdevice_notifier(&nf_rtcache_notifier);
++ unregister_pernet_subsys(&rtcache_ops_net_ops);
++ for_each_net(net)
++ nf_unregister_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
++
++ synchronize_net();
+
+ rtnl_lock();
+
+ }
+
+ rtnl_unlock();
++
+ synchronize_net();
+ nf_ct_extend_unregister(&rtcache_extend);
+}
# netlink interface for nf_conntrack
--- /dev/null
+++ b/net/netfilter/nf_conntrack_rtcache.c
-@@ -0,0 +1,428 @@
+@@ -0,0 +1,440 @@
+/* route cache for netfilter.
+ *
+ * (C) 2014 Red Hat GmbH
+ .destroy = nf_conn_rtcache_destroy,
+};
+
++static int __net_init rtcache_net_init(struct net *net)
++{
++ return nf_register_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
++}
++
+static void __net_exit rtcache_net_exit(struct net *net)
+{
+ /* remove hooks so no new connections get rtcache extension */
+}
+
+static struct pernet_operations rtcache_ops_net_ops = {
++ .init = rtcache_net_init,
+ .exit = rtcache_net_exit,
+};
+
+ synchronize_net();
+
+ unregister_netdevice_notifier(&nf_rtcache_notifier);
++ unregister_pernet_subsys(&rtcache_ops_net_ops);
++ for_each_net(net)
++ nf_unregister_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
++
++ synchronize_net();
+
+ rtnl_lock();
+
+ }
+
+ rtnl_unlock();
++
+ synchronize_net();
+ nf_ct_extend_unregister(&rtcache_extend);
+}