aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGao feng <gaofeng@cn.fujitsu.com>2012-06-21 00:36:49 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2012-06-27 13:14:55 -0400
commita9082b45ad3c7284db974a108e7c1f1af7387d7b (patch)
tree43a5e64c62d377121aaade2e3a311e0aa160ed7f
parent54b8873f7c907a1efbcf4f412dce0b9eed805d5b (diff)
netfilter: nf_ct_icmp: add icmp_kmemdup[_compat]_sysctl_table function
Split sysctl function into smaller chucks to cleanup code and prepare patches to reduce ifdef pollution. Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/ipv4/netfilter/nf_conntrack_proto_icmp.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
index 76f7a2f657fe..9c2095c5571f 100644
--- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
+++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c
@@ -337,34 +337,57 @@ static struct ctl_table icmp_compat_sysctl_table[] = {
337#endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */ 337#endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */
338#endif /* CONFIG_SYSCTL */ 338#endif /* CONFIG_SYSCTL */
339 339
340static int icmp_init_net(struct net *net, u_int16_t proto) 340static int icmp_kmemdup_sysctl_table(struct nf_proto_net *pn,
341 struct nf_icmp_net *in)
341{ 342{
342 struct nf_icmp_net *in = icmp_pernet(net);
343 struct nf_proto_net *pn = (struct nf_proto_net *)in;
344 in->timeout = nf_ct_icmp_timeout;
345
346#ifdef CONFIG_SYSCTL 343#ifdef CONFIG_SYSCTL
347 pn->ctl_table = kmemdup(icmp_sysctl_table, 344 pn->ctl_table = kmemdup(icmp_sysctl_table,
348 sizeof(icmp_sysctl_table), 345 sizeof(icmp_sysctl_table),
349 GFP_KERNEL); 346 GFP_KERNEL);
350 if (!pn->ctl_table) 347 if (!pn->ctl_table)
351 return -ENOMEM; 348 return -ENOMEM;
349
352 pn->ctl_table[0].data = &in->timeout; 350 pn->ctl_table[0].data = &in->timeout;
351#endif
352 return 0;
353}
354
355static int icmp_kmemdup_compat_sysctl_table(struct nf_proto_net *pn,
356 struct nf_icmp_net *in)
357{
358#ifdef CONFIG_SYSCTL
353#ifdef CONFIG_NF_CONNTRACK_PROC_COMPAT 359#ifdef CONFIG_NF_CONNTRACK_PROC_COMPAT
354 pn->ctl_compat_table = kmemdup(icmp_compat_sysctl_table, 360 pn->ctl_compat_table = kmemdup(icmp_compat_sysctl_table,
355 sizeof(icmp_compat_sysctl_table), 361 sizeof(icmp_compat_sysctl_table),
356 GFP_KERNEL); 362 GFP_KERNEL);
357 if (!pn->ctl_compat_table) { 363 if (!pn->ctl_compat_table)
358 kfree(pn->ctl_table);
359 pn->ctl_table = NULL;
360 return -ENOMEM; 364 return -ENOMEM;
361 } 365
362 pn->ctl_compat_table[0].data = &in->timeout; 366 pn->ctl_compat_table[0].data = &in->timeout;
363#endif 367#endif
364#endif 368#endif
365 return 0; 369 return 0;
366} 370}
367 371
372static int icmp_init_net(struct net *net, u_int16_t proto)
373{
374 int ret;
375 struct nf_icmp_net *in = icmp_pernet(net);
376 struct nf_proto_net *pn = &in->pn;
377
378 in->timeout = nf_ct_icmp_timeout;
379
380 ret = icmp_kmemdup_compat_sysctl_table(pn, in);
381 if (ret < 0)
382 return ret;
383
384 ret = icmp_kmemdup_sysctl_table(pn, in);
385 if (ret < 0)
386 nf_ct_kfree_compat_sysctl_table(pn);
387
388 return ret;
389}
390
368struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = 391struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly =
369{ 392{
370 .l3proto = PF_INET, 393 .l3proto = PF_INET,