From: Wen Yang Read sibling SCTP limits from the current namespace on each call. Suggested-by: Joel Granados Signed-off-by: Wen Yang --- net/sctp/sysctl.c | 147 +++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 75 deletions(-) diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 59c6f22337ea..ed296f568887 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c @@ -24,25 +24,6 @@ #include #include #include -#include - -static int timer_max = 86400000; /* ms in one day */ -static int sack_timer_min = 1; -static int sack_timer_max = 500; -static int addr_scope_max = SCTP_SCOPE_POLICY_MAX; -static int rwnd_scale_max = 16; -static int rto_alpha_min = 0; -static int rto_beta_min = 0; -static int rto_alpha_max = 1000; -static int rto_beta_max = 1000; -static int pf_expose_max = SCTP_PF_EXPOSE_MAX; -static int ps_retrans_max = SCTP_PS_RETRANS_MAX; -static int udp_port_max = 65535; - -static unsigned long max_autoclose_min = 0; -static unsigned long max_autoclose_max = - (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) - ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; static int proc_sctp_do_hmac_alg(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); @@ -50,6 +31,26 @@ static int proc_sctp_do_rto_min(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); static int proc_sctp_do_rto_max(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); +static int proc_sctp_do_pf_retrans(const struct ctl_table *ctl, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + struct net *net = container_of(ctl->data, struct net, sctp.pf_retrans); + struct ctl_table tmp = *ctl; + + tmp.max = (unsigned long)READ_ONCE(net->sctp.ps_retrans); + return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); +} + +static int proc_sctp_do_ps_retrans(const struct ctl_table *ctl, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + struct net *net = container_of(ctl->data, struct net, sctp.ps_retrans); + struct ctl_table tmp = *ctl; + + tmp.min = (unsigned long)READ_ONCE(net->sctp.pf_retrans); + return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); +} + static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); static int proc_sctp_do_alpha_beta(const struct ctl_table *ctl, int write, @@ -65,7 +66,7 @@ static struct ctl_table sctp_table[] = { .data = &sysctl_sctp_mem, .maxlen = sizeof(sysctl_sctp_mem), .mode = 0644, - .proc_handler = proc_doulongvec_minmax + .proc_handler = proc_doulongvec_minmax, .min = 0, .max = ULONG_MAX, }, @@ -102,8 +103,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_sctp_do_rto_min, - .extra1 = SYSCTL_ONE, - .extra2 = &init_net.sctp.rto_max + .min = 1, + .max = UINT_MAX, }, [SCTP_RTO_MAX_IDX] = { .procname = "rto_max", @@ -111,26 +112,26 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_sctp_do_rto_max, - .extra1 = &init_net.sctp.rto_min, - .extra2 = &timer_max + .min = 0, + .max = 86400000, }, [SCTP_PF_RETRANS_IDX] = { .procname = "pf_retrans", .data = &init_net.sctp.pf_retrans, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = &init_net.sctp.ps_retrans, + .proc_handler = proc_sctp_do_pf_retrans, + .min = 0, + .max = INT_MAX, }, [SCTP_PS_RETRANS_IDX] = { .procname = "ps_retrans", .data = &init_net.sctp.ps_retrans, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec_minmax, - .extra1 = &init_net.sctp.pf_retrans, - .extra2 = &ps_retrans_max, + .proc_handler = proc_sctp_do_ps_retrans, + .min = (unsigned long)INT_MIN, + .max = SCTP_PS_RETRANS_MAX, }, { .procname = "rto_initial", @@ -138,8 +139,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = &timer_max + .min = 1, + .max = 86400000 }, { .procname = "rto_alpha_exp_divisor", @@ -147,8 +148,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_sctp_do_alpha_beta, - .extra1 = &rto_alpha_min, - .extra2 = &rto_alpha_max, + .min = 0, + .max = 1000, }, { .procname = "rto_beta_exp_divisor", @@ -156,8 +157,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_sctp_do_alpha_beta, - .extra1 = &rto_beta_min, - .extra2 = &rto_beta_max, + .min = 0, + .max = 1000, }, { .procname = "max_burst", @@ -165,8 +166,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_INT_MAX, + .min = 0, + .max = INT_MAX, }, { .procname = "cookie_preserve_enable", @@ -188,8 +189,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = &timer_max + .min = 1, + .max = 86400000 }, { .procname = "sack_timeout", @@ -197,8 +198,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = &sack_timer_min, - .extra2 = &sack_timer_max, + .min = 1, + .max = 500, }, { .procname = "hb_interval", @@ -206,8 +207,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = &timer_max + .min = 1, + .max = 86400000 }, { .procname = "association_max_retrans", @@ -215,8 +216,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = SYSCTL_INT_MAX, + .min = 1, + .max = INT_MAX, }, { .procname = "path_max_retrans", @@ -224,8 +225,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = SYSCTL_INT_MAX, + .min = 1, + .max = INT_MAX, }, { .procname = "max_init_retransmits", @@ -233,8 +234,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = SYSCTL_INT_MAX, + .min = 1, + .max = INT_MAX, }, { .procname = "sndbuf_policy", @@ -319,8 +320,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_sctp_do_udp_port, - .extra1 = SYSCTL_ZERO, - .extra2 = &udp_port_max, + .min = 0, + .max = 65535, }, { .procname = "encap_port", @@ -328,8 +329,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = &udp_port_max, + .min = 0, + .max = 65535, }, { .procname = "addr_scope_policy", @@ -337,8 +338,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = &addr_scope_max, + .min = 0, + .max = SCTP_SCOPE_POLICY_MAX, }, { .procname = "rwnd_update_shift", @@ -346,8 +347,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = &rwnd_scale_max, + .min = 1, + .max = 16, }, { .procname = "max_autoclose", @@ -355,8 +356,9 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(unsigned long), .mode = 0644, .proc_handler = &proc_doulongvec_minmax, - .extra1 = &max_autoclose_min, - .extra2 = &max_autoclose_max, + .min = 0, + .max = (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) + ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ, }, #ifdef CONFIG_NET_L3_MASTER_DEV { @@ -365,8 +367,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, + .min = 0, + .max = 1, }, #endif { @@ -382,8 +384,8 @@ static const struct ctl_table sctp_net_table[] = { .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ZERO, - .extra2 = &pf_expose_max, + .min = 0, + .max = SCTP_PF_EXPOSE_MAX, }, }; @@ -426,8 +428,8 @@ static int proc_sctp_do_rto_min(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos) { struct net *net = container_of(ctl->data, struct net, sctp.rto_min); - unsigned int min = *(unsigned int *) ctl->extra1; - unsigned int max = *(unsigned int *) ctl->extra2; + unsigned int min = ctl->min; + unsigned int max = READ_ONCE(net->sctp.rto_max); struct ctl_table tbl; int ret, new_value; @@ -454,8 +456,8 @@ static int proc_sctp_do_rto_max(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos) { struct net *net = container_of(ctl->data, struct net, sctp.rto_max); - unsigned int min = *(unsigned int *) ctl->extra1; - unsigned int max = *(unsigned int *) ctl->extra2; + unsigned int min = READ_ONCE(net->sctp.rto_min); + unsigned int max = ctl->max; struct ctl_table tbl; int ret, new_value; @@ -523,8 +525,8 @@ static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos) { struct net *net = container_of(ctl->data, struct net, sctp.udp_port); - unsigned int min = *(unsigned int *)ctl->extra1; - unsigned int max = *(unsigned int *)ctl->extra2; + unsigned int min = ctl->min; + unsigned int max = ctl->max; struct ctl_table tbl; int ret, new_value; @@ -602,11 +604,6 @@ int sctp_sysctl_net_register(struct net *net) for (i = 0; i < table_size; i++) table[i].data += (char *)(&net->sctp) - (char *)&init_net.sctp; - table[SCTP_RTO_MIN_IDX].extra2 = &net->sctp.rto_max; - table[SCTP_RTO_MAX_IDX].extra1 = &net->sctp.rto_min; - table[SCTP_PF_RETRANS_IDX].extra2 = &net->sctp.ps_retrans; - table[SCTP_PS_RETRANS_IDX].extra1 = &net->sctp.pf_retrans; - net->sctp.sysctl_header = register_net_sysctl_sz(net, "net/sctp", table, table_size); if (net->sctp.sysctl_header == NULL) { -- 2.25.1