aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_policy.c
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@gmail.com>2008-11-25 20:14:31 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-25 20:14:31 -0500
commitd62ddc21b674b5ac1466091ff3fbf7baa53bc92c (patch)
tree13e57abe023b5258b168e7f9108015a78493e481 /net/xfrm/xfrm_policy.c
parentc95839693d2a6612af7f75ad877012eba2f69757 (diff)
netns xfrm: add netns boilerplate
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
-rw-r--r--net/xfrm/xfrm_policy.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index ea3456daa9cb..8e7671b9e76e 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -2394,12 +2394,13 @@ static int __init xfrm_statistics_init(void)
2394} 2394}
2395#endif 2395#endif
2396 2396
2397static void __init xfrm_policy_init(void) 2397static int __net_init xfrm_policy_init(struct net *net)
2398{ 2398{
2399 unsigned int hmask, sz; 2399 unsigned int hmask, sz;
2400 int dir; 2400 int dir;
2401 2401
2402 xfrm_dst_cache = kmem_cache_create("xfrm_dst_cache", 2402 if (net_eq(net, &init_net))
2403 xfrm_dst_cache = kmem_cache_create("xfrm_dst_cache",
2403 sizeof(struct xfrm_dst), 2404 sizeof(struct xfrm_dst),
2404 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, 2405 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
2405 NULL); 2406 NULL);
@@ -2425,16 +2426,50 @@ static void __init xfrm_policy_init(void)
2425 } 2426 }
2426 2427
2427 INIT_LIST_HEAD(&xfrm_policy_all); 2428 INIT_LIST_HEAD(&xfrm_policy_all);
2428 register_netdevice_notifier(&xfrm_dev_notifier); 2429 if (net_eq(net, &init_net))
2430 register_netdevice_notifier(&xfrm_dev_notifier);
2431 return 0;
2432}
2433
2434static void xfrm_policy_fini(struct net *net)
2435{
2429} 2436}
2430 2437
2438static int __net_init xfrm_net_init(struct net *net)
2439{
2440 int rv;
2441
2442 rv = xfrm_state_init(net);
2443 if (rv < 0)
2444 goto out_state;
2445 rv = xfrm_policy_init(net);
2446 if (rv < 0)
2447 goto out_policy;
2448 return 0;
2449
2450out_policy:
2451 xfrm_state_fini(net);
2452out_state:
2453 return rv;
2454}
2455
2456static void __net_exit xfrm_net_exit(struct net *net)
2457{
2458 xfrm_policy_fini(net);
2459 xfrm_state_fini(net);
2460}
2461
2462static struct pernet_operations __net_initdata xfrm_net_ops = {
2463 .init = xfrm_net_init,
2464 .exit = xfrm_net_exit,
2465};
2466
2431void __init xfrm_init(void) 2467void __init xfrm_init(void)
2432{ 2468{
2469 register_pernet_subsys(&xfrm_net_ops);
2433#ifdef CONFIG_XFRM_STATISTICS 2470#ifdef CONFIG_XFRM_STATISTICS
2434 xfrm_statistics_init(); 2471 xfrm_statistics_init();
2435#endif 2472#endif
2436 xfrm_state_init();
2437 xfrm_policy_init();
2438 xfrm_input_init(); 2473 xfrm_input_init();
2439#ifdef CONFIG_XFRM_STATISTICS 2474#ifdef CONFIG_XFRM_STATISTICS
2440 xfrm_proc_init(); 2475 xfrm_proc_init();