On 12/09/2013 09:46 PM, Wang Weidong wrote: > rto_min should be smaller than rto_max while rto_max should be larger > than rto_min. Add two proc_handler for the checking. > > Suggested-by: Vlad Yasevich <vyasevich@xxxxxxxxx> > Signed-off-by: Wang Weidong <wangweidong1@xxxxxxxxxx> > --- > net/sctp/sysctl.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 65 insertions(+), 4 deletions(-) > > diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c > index 6b36561..ed4ec89 100644 > --- a/net/sctp/sysctl.c > +++ b/net/sctp/sysctl.c > @@ -61,6 +61,13 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, > void __user *buffer, size_t *lenp, > > loff_t *ppos); > +static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, > + void __user *buffer, size_t *lenp, > + loff_t *ppos); > +static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, > + void __user *buffer, size_t *lenp, > + loff_t *ppos); > + > static struct ctl_table sctp_table[] = { > { > .procname = "sctp_mem", > @@ -102,17 +109,17 @@ static struct ctl_table sctp_net_table[] = { > .data = &init_net.sctp.rto_min, > .maxlen = sizeof(unsigned int), > .mode = 0644, > - .proc_handler = proc_dointvec_minmax, > + .proc_handler = proc_sctp_do_rto_min, > .extra1 = &one, > - .extra2 = &timer_max > + .extra2 = &init_net.sctp.rto_max > }, > { > .procname = "rto_max", > .data = &init_net.sctp.rto_max, > .maxlen = sizeof(unsigned int), > .mode = 0644, > - .proc_handler = proc_dointvec_minmax, > - .extra1 = &one, > + .proc_handler = proc_sctp_do_rto_max, > + .extra1 = &init_net.sctp.rto_min, > .extra2 = &timer_max > }, > { > @@ -342,6 +349,60 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, > return ret; > } > > +static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, > + void __user*buffer, size_t *lenp, ^^^^ Please put a space before the '*'. > + loff_t *ppos) > +{ > + struct net *net = current->nsproxy->net_ns; > + int new_value; > + struct ctl_table tbl; > + unsigned int min = *(unsigned int *) ctl->extra1; > + unsigned int max = *(unsigned int *) ctl->extra2; > + int ret; > + > + memset(&tbl, 0, sizeof(struct ctl_table)); > + tbl.maxlen = sizeof(unsigned int); > + > + if (write) > + tbl.data = &new_value; > + else > + tbl.data = &net->sctp.rto_min; > + ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); > + if (write) { > + if (ret || new_value > max || new_value < min) > + return -EINVAL; > + net->sctp.rto_min = new_value; > + } > + return ret; > +} > + > +static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, > + void __user*buffer, size_t *lenp, ^^^^ Please put a space after the before the '*'. Thanks -vlad > + loff_t *ppos) > +{ > + struct net *net = current->nsproxy->net_ns; > + int new_value; > + struct ctl_table tbl; > + unsigned int min = *(unsigned int *) ctl->extra1; > + unsigned int max = *(unsigned int *) ctl->extra2; > + int ret; > + > + memset(&tbl, 0, sizeof(struct ctl_table)); > + tbl.maxlen = sizeof(unsigned int); > + > + if (write) > + tbl.data = &new_value; > + else > + tbl.data = &net->sctp.rto_max; > + ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); > + if (write) { > + if (ret || new_value > max || new_value < min) > + return -EINVAL; > + net->sctp.rto_max = new_value; > + } > + return ret; > +} > + > int sctp_sysctl_net_register(struct net *net) > { > struct ctl_table *table; > -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html