Skip to content

Commit d62ddc2

Browse files
Alexey Dobriyandavem330
authored andcommitted
netns xfrm: add netns boilerplate
Signed-off-by: Alexey Dobriyan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c958396 commit d62ddc2

File tree

5 files changed

+59
-7
lines changed

5 files changed

+59
-7
lines changed

include/net/net_namespace.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
2020
#include <net/netns/conntrack.h>
2121
#endif
22+
#include <net/netns/xfrm.h>
2223

2324
struct proc_dir_entry;
2425
struct net_device;
@@ -73,6 +74,9 @@ struct net {
7374
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
7475
struct netns_ct ct;
7576
#endif
77+
#endif
78+
#ifdef CONFIG_XFRM
79+
struct netns_xfrm xfrm;
7680
#endif
7781
struct net_generic *gen;
7882
};

include/net/netns/xfrm.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef __NETNS_XFRM_H
2+
#define __NETNS_XFRM_H
3+
4+
struct netns_xfrm {
5+
};
6+
7+
#endif

include/net/xfrm.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,8 @@ struct xfrm6_tunnel {
12691269

12701270
extern void xfrm_init(void);
12711271
extern void xfrm4_init(void);
1272-
extern void xfrm_state_init(void);
1272+
extern int xfrm_state_init(struct net *net);
1273+
extern void xfrm_state_fini(struct net *net);
12731274
extern void xfrm4_state_init(void);
12741275
#ifdef CONFIG_XFRM
12751276
extern int xfrm6_init(void);

net/xfrm/xfrm_policy.c

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2394,12 +2394,13 @@ static int __init xfrm_statistics_init(void)
23942394
}
23952395
#endif
23962396

2397-
static void __init xfrm_policy_init(void)
2397+
static int __net_init xfrm_policy_init(struct net *net)
23982398
{
23992399
unsigned int hmask, sz;
24002400
int dir;
24012401

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",
24032404
sizeof(struct xfrm_dst),
24042405
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
24052406
NULL);
@@ -2425,16 +2426,50 @@ static void __init xfrm_policy_init(void)
24252426
}
24262427

24272428
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+
2434+
static void xfrm_policy_fini(struct net *net)
2435+
{
24292436
}
24302437

2438+
static 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+
2450+
out_policy:
2451+
xfrm_state_fini(net);
2452+
out_state:
2453+
return rv;
2454+
}
2455+
2456+
static void __net_exit xfrm_net_exit(struct net *net)
2457+
{
2458+
xfrm_policy_fini(net);
2459+
xfrm_state_fini(net);
2460+
}
2461+
2462+
static struct pernet_operations __net_initdata xfrm_net_ops = {
2463+
.init = xfrm_net_init,
2464+
.exit = xfrm_net_exit,
2465+
};
2466+
24312467
void __init xfrm_init(void)
24322468
{
2469+
register_pernet_subsys(&xfrm_net_ops);
24332470
#ifdef CONFIG_XFRM_STATISTICS
24342471
xfrm_statistics_init();
24352472
#endif
2436-
xfrm_state_init();
2437-
xfrm_policy_init();
24382473
xfrm_input_init();
24392474
#ifdef CONFIG_XFRM_STATISTICS
24402475
xfrm_proc_init();

net/xfrm/xfrm_state.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2080,7 +2080,7 @@ int xfrm_init_state(struct xfrm_state *x)
20802080

20812081
EXPORT_SYMBOL(xfrm_init_state);
20822082

2083-
void __init xfrm_state_init(void)
2083+
int __net_init xfrm_state_init(struct net *net)
20842084
{
20852085
unsigned int sz;
20862086

@@ -2094,6 +2094,11 @@ void __init xfrm_state_init(void)
20942094
xfrm_state_hmask = ((sz / sizeof(struct hlist_head)) - 1);
20952095

20962096
INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task);
2097+
return 0;
2098+
}
2099+
2100+
void xfrm_state_fini(struct net *net)
2101+
{
20972102
}
20982103

20992104
#ifdef CONFIG_AUDITSYSCALL

0 commit comments

Comments
 (0)