]> www.infradead.org Git - users/willy/linux.git/commitdiff
ipv6: Use math to point per net sysctls into the appropriate struct net
authorCambda Zhu <cambda@linux.alibaba.com>
Tue, 3 Mar 2020 06:54:34 +0000 (14:54 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Mar 2020 22:50:08 +0000 (14:50 -0800)
The data pointers of ipv6 sysctl are set one by one which is hard to
maintain, especially with kconfig. This patch simplifies it by using
math to point the per net sysctls into the appropriate struct net,
just like what we did for ipv4.

Signed-off-by: Cambda Zhu <cambda@linux.alibaba.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/sysctl_net_ipv6.c

index ec8fcfc60a27ba2a238cf05ecae292e2db4daedc..63b657aa8d29ec433a68aaf79638336255ed0dcf 100644 (file)
@@ -203,29 +203,16 @@ static int __net_init ipv6_sysctl_net_init(struct net *net)
        struct ctl_table *ipv6_table;
        struct ctl_table *ipv6_route_table;
        struct ctl_table *ipv6_icmp_table;
-       int err;
+       int err, i;
 
        err = -ENOMEM;
        ipv6_table = kmemdup(ipv6_table_template, sizeof(ipv6_table_template),
                             GFP_KERNEL);
        if (!ipv6_table)
                goto out;
-       ipv6_table[0].data = &net->ipv6.sysctl.bindv6only;
-       ipv6_table[1].data = &net->ipv6.sysctl.anycast_src_echo_reply;
-       ipv6_table[2].data = &net->ipv6.sysctl.flowlabel_consistency;
-       ipv6_table[3].data = &net->ipv6.sysctl.auto_flowlabels;
-       ipv6_table[4].data = &net->ipv6.sysctl.fwmark_reflect;
-       ipv6_table[5].data = &net->ipv6.sysctl.idgen_retries;
-       ipv6_table[6].data = &net->ipv6.sysctl.idgen_delay;
-       ipv6_table[7].data = &net->ipv6.sysctl.flowlabel_state_ranges;
-       ipv6_table[8].data = &net->ipv6.sysctl.ip_nonlocal_bind;
-       ipv6_table[9].data = &net->ipv6.sysctl.flowlabel_reflect;
-       ipv6_table[10].data = &net->ipv6.sysctl.max_dst_opts_cnt;
-       ipv6_table[11].data = &net->ipv6.sysctl.max_hbh_opts_cnt;
-       ipv6_table[12].data = &net->ipv6.sysctl.max_dst_opts_len;
-       ipv6_table[13].data = &net->ipv6.sysctl.max_hbh_opts_len;
-       ipv6_table[14].data = &net->ipv6.sysctl.multipath_hash_policy,
-       ipv6_table[15].data = &net->ipv6.sysctl.seg6_flowlabel;
+       /* Update the variables to point into the current struct net */
+       for (i = 0; i < ARRAY_SIZE(ipv6_table_template) - 1; i++)
+               ipv6_table[i].data += (void *)net - (void *)&init_net;
 
        ipv6_route_table = ipv6_route_sysctl_init(net);
        if (!ipv6_route_table)