netfilter: nf_conntrack: generalize nf_ct_l4proto_net
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / net / ipv6 / netfilter / nf_conntrack_proto_icmpv6.c
index 63ed0121836cffeaac2e6f98e43e4f3aa670fbdb..2d54b2061d68ef3e947168b82a5b041f84ffea50 100644 (file)
@@ -333,22 +333,36 @@ static struct ctl_table icmpv6_sysctl_table[] = {
 };
 #endif /* CONFIG_SYSCTL */
 
-static int icmpv6_init_net(struct net *net)
+static int icmpv6_kmemdup_sysctl_table(struct nf_proto_net *pn,
+                                      struct nf_icmp_net *in)
 {
-       struct nf_icmp_net *in = icmpv6_pernet(net);
-       struct nf_proto_net *pn = (struct nf_proto_net *)in;
-       in->timeout = nf_ct_icmpv6_timeout;
 #ifdef CONFIG_SYSCTL
        pn->ctl_table = kmemdup(icmpv6_sysctl_table,
                                sizeof(icmpv6_sysctl_table),
                                GFP_KERNEL);
        if (!pn->ctl_table)
                return -ENOMEM;
+
        pn->ctl_table[0].data = &in->timeout;
 #endif
        return 0;
 }
 
+static int icmpv6_init_net(struct net *net, u_int16_t proto)
+{
+       struct nf_icmp_net *in = icmpv6_pernet(net);
+       struct nf_proto_net *pn = &in->pn;
+
+       in->timeout = nf_ct_icmpv6_timeout;
+
+       return icmpv6_kmemdup_sysctl_table(pn, in);
+}
+
+static struct nf_proto_net *icmpv6_get_net_proto(struct net *net)
+{
+       return &net->ct.nf_ct_proto.icmpv6.pn;
+}
+
 struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly =
 {
        .l3proto                = PF_INET6,
@@ -377,4 +391,5 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly =
        },
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
        .init_net               = icmpv6_init_net,
+       .get_net_proto          = icmpv6_get_net_proto,
 };