Commit ebb7e95d authored by Eric W. Biederman's avatar Eric W. Biederman Committed by David S. Miller

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: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: default avatarVlad Yasevich <vyasevich@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b01a2407
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
struct sock; struct sock;
struct proc_dir_entry; struct proc_dir_entry;
struct sctp_mib; struct sctp_mib;
struct ctl_table_header;
struct netns_sctp { struct netns_sctp {
DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics); DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics);
...@@ -11,7 +12,9 @@ struct netns_sctp { ...@@ -11,7 +12,9 @@ struct netns_sctp {
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
struct proc_dir_entry *proc_net_sctp; struct proc_dir_entry *proc_net_sctp;
#endif #endif
#ifdef CONFIG_SYSCTL
struct ctl_table_header *sysctl_header;
#endif
/* This is the global socket data structure used for responding to /* This is the global socket data structure used for responding to
* the Out-of-the-blue (OOTB) packets. A control sock will be created * the Out-of-the-blue (OOTB) packets. A control sock will be created
* for this socket at the initialization time. * for this socket at the initialization time.
...@@ -32,6 +35,7 @@ struct netns_sctp { ...@@ -32,6 +35,7 @@ struct netns_sctp {
/* Lock that protects the local_addr_list writers */ /* Lock that protects the local_addr_list writers */
spinlock_t local_addr_lock; spinlock_t local_addr_lock;
}; };
#endif /* __NETNS_SCTP_H__ */ #endif /* __NETNS_SCTP_H__ */
...@@ -375,9 +375,13 @@ static inline void sctp_dbg_objcnt_exit(struct net *) { return; } ...@@ -375,9 +375,13 @@ static inline void sctp_dbg_objcnt_exit(struct net *) { return; }
#if defined CONFIG_SYSCTL #if defined CONFIG_SYSCTL
void sctp_sysctl_register(void); void sctp_sysctl_register(void);
void sctp_sysctl_unregister(void); void sctp_sysctl_unregister(void);
int sctp_sysctl_net_register(struct net *net);
void sctp_sysctl_net_unregister(struct net *net);
#else #else
static inline void sctp_sysctl_register(void) { return; } static inline void sctp_sysctl_register(void) { return; }
static inline void sctp_sysctl_unregister(void) { return; } static inline void sctp_sysctl_unregister(void) { return; }
static inline int sctp_sysctl_net_register(struct net *net) { return 0; }
static inline void sctp_sysctl_net_unregister(struct net *net) { return; }
#endif #endif
/* Size of Supported Address Parameter for 'x' address types. */ /* Size of Supported Address Parameter for 'x' address types. */
......
...@@ -1169,6 +1169,10 @@ static int sctp_net_init(struct net *net) ...@@ -1169,6 +1169,10 @@ static int sctp_net_init(struct net *net)
{ {
int status; int status;
status = sctp_sysctl_net_register(net);
if (status)
goto err_sysctl_register;
/* Allocate and initialise sctp mibs. */ /* Allocate and initialise sctp mibs. */
status = init_sctp_mibs(net); status = init_sctp_mibs(net);
if (status) if (status)
...@@ -1208,6 +1212,8 @@ static int sctp_net_init(struct net *net) ...@@ -1208,6 +1212,8 @@ static int sctp_net_init(struct net *net)
err_init_proc: err_init_proc:
cleanup_sctp_mibs(net); cleanup_sctp_mibs(net);
err_init_mibs: err_init_mibs:
sctp_sysctl_net_unregister(net);
err_sysctl_register:
return status; return status;
} }
...@@ -1224,6 +1230,7 @@ static void sctp_net_exit(struct net *net) ...@@ -1224,6 +1230,7 @@ static void sctp_net_exit(struct net *net)
sctp_proc_exit(net); sctp_proc_exit(net);
cleanup_sctp_mibs(net); cleanup_sctp_mibs(net);
sctp_sysctl_net_unregister(net);
} }
static struct pernet_operations sctp_net_ops = { static struct pernet_operations sctp_net_ops = {
......
...@@ -284,6 +284,27 @@ static ctl_table sctp_table[] = { ...@@ -284,6 +284,27 @@ static ctl_table sctp_table[] = {
{ /* sentinel */ } { /* 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; static struct ctl_table_header * sctp_sysctl_header;
/* Sysctl registration. */ /* Sysctl registration. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment