diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-08-07 07:23:59 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-14 23:30:37 -0700 |
commit | ebb7e95d9351f77a8ec1fca20eb645051401b7b2 (patch) | |
tree | 9edfe4abbdac8c05f3fe19ef3eb5d7e32500b69b /net/sctp | |
parent | b01a24078fa3fc4f0f447d1306ce5adc495ead86 (diff) | |
download | linux-3.10-ebb7e95d9351f77a8ec1fca20eb645051401b7b2.tar.gz linux-3.10-ebb7e95d9351f77a8ec1fca20eb645051401b7b2.tar.bz2 linux-3.10-ebb7e95d9351f77a8ec1fca20eb645051401b7b2.zip |
sctp: Add infrastructure for per net sysctls
Start with an empty sctp_net_table that will be populated as the various
tunable sysctls are made per net.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/protocol.c | 7 | ||||
-rw-r--r-- | net/sctp/sysctl.c | 21 |
2 files changed, 28 insertions, 0 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index d58db315db8..0f2342be61f 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1169,6 +1169,10 @@ static int sctp_net_init(struct net *net) { int status; + status = sctp_sysctl_net_register(net); + if (status) + goto err_sysctl_register; + /* Allocate and initialise sctp mibs. */ status = init_sctp_mibs(net); if (status) @@ -1208,6 +1212,8 @@ err_ctl_sock_init: err_init_proc: cleanup_sctp_mibs(net); err_init_mibs: + sctp_sysctl_net_unregister(net); +err_sysctl_register: return status; } @@ -1224,6 +1230,7 @@ static void sctp_net_exit(struct net *net) sctp_proc_exit(net); cleanup_sctp_mibs(net); + sctp_sysctl_net_unregister(net); } static struct pernet_operations sctp_net_ops = { diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 2b2bfe933ff..bee36c408dd 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c @@ -284,6 +284,27 @@ static ctl_table sctp_table[] = { { /* sentinel */ } }; +static ctl_table sctp_net_table[] = { + { /* sentinel */ } +}; + +int sctp_sysctl_net_register(struct net *net) +{ + struct ctl_table *table; + + table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL); + if (!table) + return -ENOMEM; + + net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table); + return 0; +} + +void sctp_sysctl_net_unregister(struct net *net) +{ + unregister_net_sysctl_table(net->sctp.sysctl_header); +} + static struct ctl_table_header * sctp_sysctl_header; /* Sysctl registration. */ |