aboutsummaryrefslogtreecommitdiff
path: root/net/sctp
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp')
-rw-r--r--net/sctp/protocol.c7
-rw-r--r--net/sctp/sysctl.c21
2 files changed, 28 insertions, 0 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
index d58db315db85..0f2342be61f3 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 2b2bfe933ff1..bee36c408dde 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. */