Really ignore the SCTP association identifier on 1-to-1 style sockets
as requiresd by the socket API specification. Thanks to Inaki Baz Castillo, who found this bug running the userland stack with valgrind and reported the issue in https://github.com/sctplab/usrsctp/issues/408 MFC after: 1 week
This commit is contained in:
parent
b476ae7f52
commit
f727fee546
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=355172
@ -1675,7 +1675,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
if (inp->idata_supported) {
|
||||
av->assoc_value = 1;
|
||||
@ -1705,7 +1706,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_cmt_on_off;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1731,7 +1733,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.sctp_default_cc_module;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1776,7 +1779,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.sctp_default_ss_module;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1914,7 +1918,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_context;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1990,7 +1995,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sack->sack_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(sack->sack_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
sack->sack_delay = TICKS_TO_MSEC(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_RECV]);
|
||||
sack->sack_freq = inp->sctp_ep.sctp_sack_freq;
|
||||
@ -2037,7 +2043,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.max_burst;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -2065,7 +2072,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
|
||||
ovh = SCTP_MED_OVERHEAD;
|
||||
@ -2466,7 +2474,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
/* Use endpoint defaults */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
paddrp->spp_pathmaxrxt = inp->sctp_ep.def_net_failure;
|
||||
@ -2694,7 +2703,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(srto->srto_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(srto->srto_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
srto->srto_initial = inp->sctp_ep.initial_rto;
|
||||
srto->srto_max = inp->sctp_ep.sctp_maxrto;
|
||||
@ -2750,7 +2760,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
sasoc->sasoc_cookie_life = TICKS_TO_MSEC(inp->sctp_ep.def_cookie_life);
|
||||
sasoc->sasoc_asocmaxrxt = inp->sctp_ep.max_send_times;
|
||||
@ -2781,7 +2792,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
memcpy(s_info, &inp->def_send, sizeof(inp->def_send));
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -2901,7 +2913,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(scact->scact_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(scact->scact_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
/* get the endpoint active key */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
scact->scact_keynumber = inp->sctp_ep.default_keyid;
|
||||
@ -2943,7 +2956,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sac->gauth_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(sac->gauth_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
/* get off the endpoint */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
chklist = inp->sctp_ep.local_auth_chunks;
|
||||
@ -3061,7 +3075,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(event->se_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(event->se_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
event->se_on = sctp_is_feature_on(inp, event_type);
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3134,7 +3149,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(info->snd_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(info->snd_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
info->snd_sid = inp->def_send.sinfo_stream;
|
||||
info->snd_flags = inp->def_send.sinfo_flags;
|
||||
@ -3166,7 +3182,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(info->pr_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(info->pr_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
info->pr_policy = PR_SCTP_POLICY(inp->def_send.sinfo_flags);
|
||||
info->pr_value = inp->def_send.sinfo_timetolive;
|
||||
@ -3277,7 +3294,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(thlds->spt_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(thlds->spt_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
/* Use endpoint defaults */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
thlds->spt_pathmaxrxt = inp->sctp_ep.def_net_failure;
|
||||
@ -3385,7 +3403,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(encaps->sue_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(encaps->sue_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
encaps->sue_port = inp->sctp_ep.port;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3412,7 +3431,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->ecn_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3439,7 +3459,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->prsctp_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3466,7 +3487,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->auth_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3493,7 +3515,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->asconf_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3520,7 +3543,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->reconfig_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3547,7 +3571,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->nrsack_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3574,7 +3599,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->pktdrop_supported;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3601,7 +3627,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = (uint32_t)inp->local_strreset_support;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3703,7 +3730,8 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->max_cwnd;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -3892,7 +3920,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->idata_supported = 0;
|
||||
@ -3936,14 +3965,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_cmt_on_off = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -3985,14 +4016,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.sctp_default_cc_module = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4017,7 +4050,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
SCTP_CHECK_AND_CAST(cc_opt, optval, struct sctp_cc_option, optsize);
|
||||
SCTP_FIND_STCB(inp, stcb, cc_opt->aid_value.assoc_id);
|
||||
if (stcb == NULL) {
|
||||
if (cc_opt->aid_value.assoc_id == SCTP_CURRENT_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(cc_opt->aid_value.assoc_id == SCTP_CURRENT_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4068,14 +4102,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.sctp_default_ss_module = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4107,7 +4143,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_CURRENT_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_CURRENT_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4148,14 +4185,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_context = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4216,8 +4255,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sack->sack_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(sack->sack_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((sack->sack_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(sack->sack_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sack->sack_delay) {
|
||||
inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_RECV] = MSEC_TO_TICKS(sack->sack_delay);
|
||||
@ -4227,8 +4267,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((sack->sack_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(sack->sack_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((sack->sack_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(sack->sack_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4315,8 +4356,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sca->sca_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(sca->sca_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((sca->sca_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(sca->sca_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
shared_keys = &inp->sctp_ep.shared_keys;
|
||||
/*
|
||||
@ -4350,8 +4392,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
error = sctp_insert_sharedkey(shared_keys, shared_key);
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((sca->sca_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(sca->sca_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((sca->sca_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(sca->sca_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4462,8 +4505,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(scact->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(scact->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((scact->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(scact->scact_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_auth_setactivekey_ep(inp, scact->scact_keynumber)) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
@ -4471,8 +4515,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((scact->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(scact->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((scact->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(scact->scact_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4501,8 +4546,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(scdel->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(scdel->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((scdel->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(scdel->scact_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_delete_sharedkey_ep(inp, scdel->scact_keynumber)) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
@ -4510,8 +4556,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((scdel->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(scdel->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((scdel->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(scdel->scact_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4540,8 +4587,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(keyid->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(keyid->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((keyid->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(keyid->scact_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_deact_sharedkey_ep(inp, keyid->scact_keynumber)) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
@ -4549,8 +4597,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((keyid->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(keyid->scact_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((keyid->scact_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(keyid->scact_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4579,14 +4628,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->local_strreset_support = (uint8_t)av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4934,14 +4985,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.max_burst = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((av->assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(av->assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -4976,7 +5029,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
/*
|
||||
* FIXME MT: I think this is not in
|
||||
@ -5187,14 +5241,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
memcpy(&inp->def_send, s_info, min(optsize, sizeof(inp->def_send)));
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((s_info->sinfo_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((s_info->sinfo_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(s_info->sinfo_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -5542,7 +5598,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
/************************NO TCB, SET TO default stuff ******************/
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
/*
|
||||
* For the TOS/FLOWLABEL stuff you
|
||||
@ -5633,7 +5690,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(srto->srto_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(srto->srto_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (srto->srto_initial)
|
||||
new_init = srto->srto_initial;
|
||||
@ -5687,7 +5745,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sasoc->sasoc_asocmaxrxt)
|
||||
inp->sctp_ep.max_send_times = sasoc->sasoc_asocmaxrxt;
|
||||
@ -6098,8 +6157,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
* sender dry events
|
||||
*/
|
||||
if ((event_type == SCTP_PCB_FLAGS_DRYEVNT) &&
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) == 0) &&
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) == 0) &&
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((event->se_assoc_id == SCTP_ALL_ASSOC) ||
|
||||
(event->se_assoc_id == SCTP_CURRENT_ASSOC))) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTSUP);
|
||||
@ -6108,8 +6166,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(event->se_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(event->se_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((event->se_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(event->se_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (event->se_on) {
|
||||
sctp_feature_on(inp, event_type);
|
||||
@ -6118,8 +6177,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((event->se_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(event->se_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((event->se_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(event->se_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -6192,8 +6252,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(info->snd_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(info->snd_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((info->snd_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(info->snd_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->def_send.sinfo_stream = info->snd_sid;
|
||||
policy = PR_SCTP_POLICY(inp->def_send.sinfo_flags);
|
||||
@ -6203,8 +6264,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
inp->def_send.sinfo_context = info->snd_context;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((info->snd_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(info->snd_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((info->snd_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(info->snd_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -6246,16 +6308,18 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(info->pr_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(info->pr_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((info->pr_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
(info->pr_assoc_id == SCTP_ALL_ASSOC)))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->def_send.sinfo_flags &= 0xfff0;
|
||||
inp->def_send.sinfo_flags |= info->pr_policy;
|
||||
inp->def_send.sinfo_timetolive = info->pr_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
}
|
||||
if ((info->pr_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(info->pr_assoc_id == SCTP_ALL_ASSOC)) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
((info->pr_assoc_id == SCTP_CURRENT_ASSOC) ||
|
||||
(info->pr_assoc_id == SCTP_ALL_ASSOC))) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
@ -6430,7 +6494,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(thlds->spt_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(thlds->spt_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.def_net_failure = thlds->spt_pathmaxrxt;
|
||||
inp->sctp_ep.def_net_pf_threshold = thlds->spt_pathpfthld;
|
||||
@ -6534,7 +6599,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(encaps->sue_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(encaps->sue_assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.port = encaps->sue_port;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
@ -6559,7 +6625,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->ecn_supported = 0;
|
||||
@ -6588,7 +6655,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->prsctp_supported = 0;
|
||||
@ -6617,7 +6685,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
if ((av->assoc_value == 0) &&
|
||||
(inp->asconf_supported == 1)) {
|
||||
/*
|
||||
@ -6656,7 +6725,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
if ((av->assoc_value != 0) &&
|
||||
(inp->auth_supported == 0)) {
|
||||
/*
|
||||
@ -6703,7 +6773,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->reconfig_supported = 0;
|
||||
@ -6732,7 +6803,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->nrsack_supported = 0;
|
||||
@ -6761,7 +6833,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (av->assoc_value == 0) {
|
||||
inp->pktdrop_supported = 0;
|
||||
@ -6801,7 +6874,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC))) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->max_cwnd = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
|
Loading…
Reference in New Issue
Block a user