mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-24 14:54:49 +08:00
Merge branch 'sctp'
Wang Weidong says: ==================== sctp: check the rto_min and rto_max v6 -> v7: -patch2: fix the whitespace issues which pointed out by Daniel v5 -> v6: split the v5' first patch to patch1 and patch2, and remove the macro in constants.h -patch1: do rto_min/max socket option handling in its own patch, and fix the check of rto_min/max. -patch2: do rto_min/max sysctl handling in its own patch. -patch3: add Suggested-by Daniel. v4 -> v5: - patch1: add marco in constants.h and fix up spacing as suggested by Daniel - patch2: add a patch for fix up do_hmac_alg for according to do_rto_min[max] v3 -> v4: -patch1: fix use init_net directly which suggested by Vlad. v2 -> v3: -patch1: add proc_handler for check rto_min and rto_max which suggested by Vlad v1 -> v2: -patch1: fix the From Name which pointed out by David, and add the ACK by Neil ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
4585a79d16
@ -2815,6 +2815,8 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne
|
||||
{
|
||||
struct sctp_rtoinfo rtoinfo;
|
||||
struct sctp_association *asoc;
|
||||
unsigned long rto_min, rto_max;
|
||||
struct sctp_sock *sp = sctp_sk(sk);
|
||||
|
||||
if (optlen != sizeof (struct sctp_rtoinfo))
|
||||
return -EINVAL;
|
||||
@ -2828,26 +2830,36 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne
|
||||
if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
|
||||
return -EINVAL;
|
||||
|
||||
rto_max = rtoinfo.srto_max;
|
||||
rto_min = rtoinfo.srto_min;
|
||||
|
||||
if (rto_max)
|
||||
rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
|
||||
else
|
||||
rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max;
|
||||
|
||||
if (rto_min)
|
||||
rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min;
|
||||
else
|
||||
rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min;
|
||||
|
||||
if (rto_min > rto_max)
|
||||
return -EINVAL;
|
||||
|
||||
if (asoc) {
|
||||
if (rtoinfo.srto_initial != 0)
|
||||
asoc->rto_initial =
|
||||
msecs_to_jiffies(rtoinfo.srto_initial);
|
||||
if (rtoinfo.srto_max != 0)
|
||||
asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max);
|
||||
if (rtoinfo.srto_min != 0)
|
||||
asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min);
|
||||
asoc->rto_max = rto_max;
|
||||
asoc->rto_min = rto_min;
|
||||
} else {
|
||||
/* If there is no association or the association-id = 0
|
||||
* set the values to the endpoint.
|
||||
*/
|
||||
struct sctp_sock *sp = sctp_sk(sk);
|
||||
|
||||
if (rtoinfo.srto_initial != 0)
|
||||
sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
|
||||
if (rtoinfo.srto_max != 0)
|
||||
sp->rtoinfo.srto_max = rtoinfo.srto_max;
|
||||
if (rtoinfo.srto_min != 0)
|
||||
sp->rtoinfo.srto_min = rtoinfo.srto_min;
|
||||
sp->rtoinfo.srto_max = rto_max;
|
||||
sp->rtoinfo.srto_min = rto_min;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -56,11 +56,16 @@ extern long sysctl_sctp_mem[3];
|
||||
extern int sysctl_sctp_rmem[3];
|
||||
extern int sysctl_sctp_wmem[3];
|
||||
|
||||
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl,
|
||||
int write,
|
||||
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
|
||||
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 +107,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
|
||||
},
|
||||
{
|
||||
@ -294,8 +299,7 @@ static struct ctl_table sctp_net_table[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl,
|
||||
int write,
|
||||
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
|
||||
void __user *buffer, size_t *lenp,
|
||||
loff_t *ppos)
|
||||
{
|
||||
@ -342,6 +346,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,
|
||||
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,
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user