diff options
author | Xin Long <lucien.xin@gmail.com> | 2019-01-28 15:08:36 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-30 00:44:07 -0800 |
commit | 92fc3bd928c9329bf3f6f5c4210bbe4ba4bd3299 (patch) | |
tree | d7eed3c098ad382867e864ec6d656eb440eb2fd9 /net/sctp/socket.c | |
parent | 707e45b3dc5a68243782de11e852e8d2cc63b739 (diff) | |
download | linux-stable-92fc3bd928c9329bf3f6f5c4210bbe4ba4bd3299.tar.gz linux-stable-92fc3bd928c9329bf3f6f5c4210bbe4ba4bd3299.tar.bz2 linux-stable-92fc3bd928c9329bf3f6f5c4210bbe4ba4bd3299.zip |
sctp: use SCTP_FUTURE_ASSOC and add SCTP_CURRENT_ASSOC for SCTP_DEFAULT_SNDINFO sockopt
Check with SCTP_ALL_ASSOC instead in sctp_setsockopt_default_sndinfo and
check with SCTP_FUTURE_ASSOC instead in sctp_getsockopt_default_sndinfo,
it's compatible with 0.
SCTP_CURRENT_ASSOC is supported for SCTP_DEFAULT_SNDINFO in this patch.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r-- | net/sctp/socket.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 3d3b4f0b1dbb..6a674cfe4616 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3067,20 +3067,37 @@ static int sctp_setsockopt_default_sndinfo(struct sock *sk, return -EINVAL; asoc = sctp_id2assoc(sk, info.snd_assoc_id); - if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) + if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC && + sctp_style(sk, UDP)) return -EINVAL; + if (asoc) { asoc->default_stream = info.snd_sid; asoc->default_flags = info.snd_flags; asoc->default_ppid = info.snd_ppid; asoc->default_context = info.snd_context; - } else { + + return 0; + } + + if (info.snd_assoc_id == SCTP_FUTURE_ASSOC || + info.snd_assoc_id == SCTP_ALL_ASSOC) { sp->default_stream = info.snd_sid; sp->default_flags = info.snd_flags; sp->default_ppid = info.snd_ppid; sp->default_context = info.snd_context; } + if (info.snd_assoc_id == SCTP_CURRENT_ASSOC || + info.snd_assoc_id == SCTP_ALL_ASSOC) { + list_for_each_entry(asoc, &sp->ep->asocs, asocs) { + asoc->default_stream = info.snd_sid; + asoc->default_flags = info.snd_flags; + asoc->default_ppid = info.snd_ppid; + asoc->default_context = info.snd_context; + } + } + return 0; } @@ -6287,8 +6304,10 @@ static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len, return -EFAULT; asoc = sctp_id2assoc(sk, info.snd_assoc_id); - if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) + if (!asoc && info.snd_assoc_id != SCTP_FUTURE_ASSOC && + sctp_style(sk, UDP)) return -EINVAL; + if (asoc) { info.snd_sid = asoc->default_stream; info.snd_flags = asoc->default_flags; |