mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-13 10:02:38 +00:00
Fix the handling of [gs]etsockopt() unconnected 1-to-1 style sockets.
While there: * Fix a locking issue in setsockopt() of SCTP_CMT_ON_OFF. * Fix a bug in setsockopt() of SCTP_DEFAULT_PRINFO, where the pr_value was ignored. Approved by: re@ MFC after: 2 months.
This commit is contained in:
parent
ca96e26a71
commit
3900c0936f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=224918
@ -1767,7 +1767,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = stcb->asoc.sctp_cmt_on_off;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_cmt_on_off;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1791,7 +1793,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = stcb->asoc.congestion_control_module;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.sctp_default_cc_module;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1834,7 +1838,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = stcb->asoc.stream_scheduling_module;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.sctp_default_ss_module;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -1949,7 +1955,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = stcb->asoc.context;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_context;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -2022,7 +2030,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
sack->sack_freq = stcb->asoc.sack_freq;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (sack->sack_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
@ -2067,7 +2077,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = stcb->asoc.max_burst;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
av->assoc_value = inp->sctp_ep.max_burst;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -2093,7 +2105,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
av->assoc_value = sctp_get_frag_point(stcb, &stcb->asoc);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_RLOCK(inp);
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
|
||||
ovh = SCTP_MED_OVERHEAD;
|
||||
@ -2462,7 +2476,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
paddrp->spp_assoc_id = sctp_get_associd(stcb);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
/* Use endpoint defaults */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
paddrp->spp_pathmaxrxt = inp->sctp_ep.def_net_failure;
|
||||
@ -2637,7 +2653,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
srto->srto_min = stcb->asoc.minrto;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (srto->srto_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
@ -2691,7 +2709,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
sasoc->sasoc_local_rwnd = stcb->asoc.my_rwnd;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
@ -2720,7 +2740,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
memcpy(s_info, &stcb->asoc.def_send, sizeof(stcb->asoc.def_send));
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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);
|
||||
@ -2822,7 +2844,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
scact->scact_keynumber = stcb->asoc.authinfo.active_keyid;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (scact->scact_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(scact->scact_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
/* get the endpoint active key */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
scact->scact_keynumber = inp->sctp_ep.default_keyid;
|
||||
@ -2861,7 +2885,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (sac->gauth_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sac->gauth_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
/* get off the endpoint */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
chklist = inp->sctp_ep.local_auth_chunks;
|
||||
@ -2967,7 +2993,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
event->se_on = sctp_stcb_is_feature_on(inp, stcb, event_type);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (event->se_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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);
|
||||
@ -3035,7 +3063,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
info->snd_context = stcb->asoc.def_send.sinfo_context;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (info->snd_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
@ -3065,7 +3095,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
info->pr_value = stcb->asoc.def_send.sinfo_timetolive;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (info->pr_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
@ -3153,7 +3185,9 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
thlds->spt_assoc_id = sctp_get_associd(stcb);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(thlds->spt_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
/* Use endpoint defaults */
|
||||
SCTP_INP_RLOCK(inp);
|
||||
thlds->spt_pathmaxrxt = inp->sctp_ep.def_net_failure;
|
||||
@ -3347,7 +3381,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
stcb->asoc.sctp_cmt_on_off = av->assoc_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_cmt_on_off = av->assoc_value;
|
||||
@ -3360,8 +3396,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
stcb->asoc.sctp_cmt_on_off = av->assoc_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
}
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -3394,7 +3430,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.sctp_default_cc_module = av->assoc_value;
|
||||
@ -3474,7 +3512,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.sctp_default_ss_module = av->assoc_value;
|
||||
@ -3548,7 +3588,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
stcb->asoc.context = av->assoc_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_context = av->assoc_value;
|
||||
@ -3614,7 +3656,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((sack->sack_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sack->sack_delay) {
|
||||
@ -3709,7 +3753,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
error = sctp_insert_sharedkey(shared_keys, shared_key);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((sca->sca_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
shared_keys = &inp->sctp_ep.shared_keys;
|
||||
@ -3853,7 +3899,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((scact->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_auth_setactivekey_ep(inp, scact->scact_keynumber)) {
|
||||
@ -3890,7 +3938,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((scdel->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_delete_sharedkey_ep(inp, scdel->scact_keynumber)) {
|
||||
@ -3927,7 +3977,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((keyid->scact_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sctp_deact_sharedkey_ep(inp, keyid->scact_keynumber)) {
|
||||
@ -4193,7 +4245,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
stcb->asoc.max_burst = av->assoc_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((av->assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->sctp_ep.max_burst = av->assoc_value;
|
||||
@ -4233,7 +4287,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (av->assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(av->assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
/*
|
||||
* FIXME MT: I think this is not in
|
||||
@ -4441,7 +4497,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
memcpy(&inp->def_send, s_info, min(optsize, sizeof(inp->def_send)));
|
||||
@ -4740,7 +4798,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
/************************NO TCB, SET TO default stuff ******************/
|
||||
if (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
/*
|
||||
* For the TOS/FLOWLABEL stuff you
|
||||
@ -4806,7 +4866,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (srto->srto_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(srto->srto_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (srto->srto_initial)
|
||||
new_init = srto->srto_initial;
|
||||
@ -4858,7 +4920,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (sasoc->sasoc_asocmaxrxt)
|
||||
inp->sctp_ep.max_send_times = sasoc->sasoc_asocmaxrxt;
|
||||
@ -5178,13 +5242,17 @@ 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) &&
|
||||
((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);
|
||||
error = ENOTSUP;
|
||||
break;
|
||||
}
|
||||
if ((event->se_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
if (event->se_on) {
|
||||
@ -5262,7 +5330,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((info->snd_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
SCTP_INP_WLOCK(inp);
|
||||
inp->def_send.sinfo_stream = info->snd_sid;
|
||||
@ -5308,13 +5378,17 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
if (stcb) {
|
||||
stcb->asoc.def_send.sinfo_flags &= 0xfff0;
|
||||
stcb->asoc.def_send.sinfo_flags |= info->pr_policy;
|
||||
stcb->asoc.def_send.sinfo_timetolive = info->pr_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((info->pr_assoc_id == SCTP_FUTURE_ASSOC) ||
|
||||
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)) {
|
||||
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) ||
|
||||
@ -5324,6 +5398,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
stcb->asoc.def_send.sinfo_flags &= 0xfff0;
|
||||
stcb->asoc.def_send.sinfo_flags |= info->pr_policy;
|
||||
stcb->asoc.def_send.sinfo_timetolive = info->pr_value;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
}
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
@ -5459,7 +5534,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
stcb->asoc.def_net_pf_threshold = thlds->spt_pathpfthld;
|
||||
}
|
||||
} else {
|
||||
if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
(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;
|
||||
|
Loading…
Reference in New Issue
Block a user