mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1146096: update usrsctp to rev 9209 from upstream rs=jesup
Pick up build fixes for musl-libc from upstream and a null-deref fix
This commit is contained in:
parent
97672c8488
commit
6a6a0374bb
@ -15,3 +15,4 @@ sctp updated to version 8397 from SVN on Wed Jan 9 00:41:16 EST 2013
|
||||
sctp updated to version 8443 from SVN on Sun Mar 31 09:05:07 EDT 2013
|
||||
sctp updated to version 8815 from SVN on Tue Mar 4 08:50:51 EST 2014
|
||||
sctp updated to version 9168 from SVN on Tue Mar 3 12:11:40 EST 2015
|
||||
sctp updated to version 9209 from SVN on Tue Mar 24 18:11:59 EDT 2015
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp.h 269945 2014-08-13 15:50:16Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp.h 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#ifndef _NETINET_SCTP_H_
|
||||
@ -138,6 +138,7 @@ struct sctp_paramhdr {
|
||||
#define SCTP_RECONFIG_SUPPORTED 0x00000029
|
||||
#define SCTP_NRSACK_SUPPORTED 0x00000030
|
||||
#define SCTP_PKTDROP_SUPPORTED 0x00000031
|
||||
#define SCTP_MAX_CWND 0x00000032
|
||||
|
||||
/*
|
||||
* read-only options
|
||||
|
@ -48,14 +48,9 @@ __FBSDID("$FreeBSD: head/sys/netinet/sctp_bsd_addr.c 276914 2015-01-10 20:49:57Z
|
||||
#include <netinet/sctp_asconf.h>
|
||||
#include <netinet/sctp_sysctl.h>
|
||||
#include <netinet/sctp_indata.h>
|
||||
#if defined(ANDROID)
|
||||
#include <unistd.h>
|
||||
#include <ifaddrs-android-ext.h>
|
||||
#else
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Declare all of our malloc named types */
|
||||
#ifndef __Panda__
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_cc_functions.c 271672 2014-09-16 13:48:46Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_cc_functions.c 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -56,6 +56,19 @@ __FBSDID("$FreeBSD: head/sys/netinet/sctp_cc_functions.c 271672 2014-09-16 13:48
|
||||
#define SHIFT_MPTCP_MULTI_Z 16
|
||||
#define SHIFT_MPTCP_MULTI 8
|
||||
|
||||
static void
|
||||
sctp_enforce_cwnd_limit(struct sctp_association *assoc, struct sctp_nets *net)
|
||||
{
|
||||
if ((assoc->max_cwnd > 0) &&
|
||||
(net->cwnd > assoc->max_cwnd) &&
|
||||
(net->cwnd > (net->mtu - sizeof(struct sctphdr)))) {
|
||||
net->cwnd = assoc->max_cwnd ;
|
||||
if (net->cwnd < (net->mtu - sizeof(struct sctphdr))) {
|
||||
net->cwnd = net->mtu - sizeof(struct sctphdr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sctp_set_initial_cc_param(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
{
|
||||
@ -84,6 +97,7 @@ sctp_set_initial_cc_param(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
net->cwnd = net->mtu - sizeof(struct sctphdr);
|
||||
}
|
||||
}
|
||||
sctp_enforce_cwnd_limit(assoc, net);
|
||||
net->ssthresh = assoc->peers_rwnd;
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 803000
|
||||
SDT_PROBE(sctp, cwnd, net, init,
|
||||
@ -179,6 +193,7 @@ sctp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
}
|
||||
}
|
||||
net->cwnd = net->ssthresh;
|
||||
sctp_enforce_cwnd_limit(asoc, net);
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 803000
|
||||
SDT_PROBE(sctp, cwnd, net, fr,
|
||||
stcb->asoc.my_vtag, ((stcb->sctp_ep->sctp_lport << 16) | (stcb->rport)), net,
|
||||
@ -300,7 +315,7 @@ cc_bw_same(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_t nb
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
if (net->rtt < net->cc_mod.rtcc.lbw_rtt-rtt_offset) {
|
||||
if (net->rtt < net->cc_mod.rtcc.lbw_rtt-rtt_offset) {
|
||||
/*
|
||||
* rtt decreased, there could be more room.
|
||||
* we update both the bw and the rtt here to
|
||||
@ -461,6 +476,7 @@ cc_bw_decrease(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_
|
||||
if ((net->cc_mod.rtcc.vol_reduce) &&
|
||||
(inst_ind != SCTP_INST_GAINING)) {
|
||||
net->cwnd += net->mtu;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
net->cc_mod.rtcc.vol_reduce--;
|
||||
}
|
||||
net->cc_mod.rtcc.last_step_state = 2;
|
||||
@ -496,6 +512,7 @@ cc_bw_decrease(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_
|
||||
if ((net->cc_mod.rtcc.vol_reduce) &&
|
||||
(inst_ind != SCTP_INST_GAINING)) {
|
||||
net->cwnd += net->mtu;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
net->cc_mod.rtcc.vol_reduce--;
|
||||
}
|
||||
net->cc_mod.rtcc.last_step_state = 3;
|
||||
@ -531,6 +548,7 @@ cc_bw_decrease(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_
|
||||
if ((net->cc_mod.rtcc.vol_reduce) &&
|
||||
(inst_ind != SCTP_INST_GAINING)) {
|
||||
net->cwnd += net->mtu;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
net->cc_mod.rtcc.vol_reduce--;
|
||||
}
|
||||
net->cc_mod.rtcc.last_step_state = 4;
|
||||
@ -961,6 +979,7 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb,
|
||||
break;
|
||||
}
|
||||
net->cwnd += incr;
|
||||
sctp_enforce_cwnd_limit(asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, incr,
|
||||
SCTP_CWND_LOG_FROM_SS);
|
||||
@ -1028,6 +1047,7 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb,
|
||||
break;
|
||||
}
|
||||
net->cwnd += incr;
|
||||
sctp_enforce_cwnd_limit(asoc, net);
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 803000
|
||||
SDT_PROBE(sctp, cwnd, net, ack,
|
||||
stcb->asoc.my_vtag,
|
||||
@ -1315,7 +1335,7 @@ sctp_cwnd_update_after_packet_dropped(struct sctp_tcb *stcb,
|
||||
/* We always have 1 MTU */
|
||||
net->cwnd = net->mtu;
|
||||
}
|
||||
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
if (net->cwnd - old_cwnd != 0) {
|
||||
/* log only changes */
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 803000
|
||||
@ -1342,6 +1362,7 @@ sctp_cwnd_update_after_output(struct sctp_tcb *stcb,
|
||||
net->ssthresh = net->cwnd;
|
||||
if (burst_limit) {
|
||||
net->cwnd = (net->flight_size + (burst_limit * net->mtu));
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 803000
|
||||
SDT_PROBE(sctp, cwnd, net, bl,
|
||||
stcb->asoc.my_vtag,
|
||||
@ -1681,6 +1702,7 @@ static void
|
||||
sctp_hs_cwnd_increase(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
{
|
||||
int cur_val, i, indx, incr;
|
||||
int old_cwnd = net->cwnd;
|
||||
|
||||
cur_val = net->cwnd >> 10;
|
||||
indx = SCTP_HS_TABLE_SIZE - 1;
|
||||
@ -1689,14 +1711,8 @@ sctp_hs_cwnd_increase(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
/* normal mode */
|
||||
if (net->net_ack > net->mtu) {
|
||||
net->cwnd += net->mtu;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->mtu, SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
} else {
|
||||
net->cwnd += net->net_ack;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->net_ack, SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = net->last_hs_used; i < SCTP_HS_TABLE_SIZE; i++) {
|
||||
@ -1708,9 +1724,10 @@ sctp_hs_cwnd_increase(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
net->last_hs_used = indx;
|
||||
incr = ((sctp_cwnd_adjust[indx].increase) << 10);
|
||||
net->cwnd += incr;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, incr, SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
}
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd), SCTP_CWND_LOG_FROM_SS);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1749,6 +1766,7 @@ sctp_hs_cwnd_decrease(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
net->last_hs_used = indx;
|
||||
}
|
||||
}
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd), SCTP_CWND_LOG_FROM_FR);
|
||||
}
|
||||
@ -1877,9 +1895,7 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb,
|
||||
if (net->cwnd <= net->ssthresh) {
|
||||
/* We are in slow start */
|
||||
if (net->flight_size + net->net_ack >= net->cwnd) {
|
||||
|
||||
sctp_hs_cwnd_increase(stcb, net);
|
||||
|
||||
} else {
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->net_ack,
|
||||
@ -1893,6 +1909,7 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb,
|
||||
(net->partial_bytes_acked >= net->cwnd)) {
|
||||
net->partial_bytes_acked -= net->cwnd;
|
||||
net->cwnd += net->mtu;
|
||||
sctp_enforce_cwnd_limit(asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->mtu,
|
||||
SCTP_CWND_LOG_FROM_CA);
|
||||
@ -2131,6 +2148,7 @@ htcp_cong_avoid(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
}
|
||||
|
||||
}
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
} else {
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->net_ack,
|
||||
@ -2151,6 +2169,7 @@ htcp_cong_avoid(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
*/
|
||||
net->cwnd += net->mtu;
|
||||
net->partial_bytes_acked = 0;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
htcp_alpha_update(&net->cc_mod.htcp_ca);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, net->mtu,
|
||||
@ -2196,6 +2215,7 @@ sctp_htcp_set_initial_cc_param(struct sctp_tcb *stcb, struct sctp_nets *net)
|
||||
*/
|
||||
net->cwnd = min((net->mtu * 4), max((2 * net->mtu), SCTP_INITIAL_CWND));
|
||||
net->ssthresh = stcb->asoc.peers_rwnd;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
htcp_init(net);
|
||||
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_CWND_MONITOR_ENABLE|SCTP_CWND_LOGGING_ENABLE)) {
|
||||
@ -2275,7 +2295,7 @@ sctp_htcp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
struct sctp_association *asoc)
|
||||
{
|
||||
struct sctp_nets *net;
|
||||
/*
|
||||
/*
|
||||
* CMT fast recovery code. Need to debug. ((sctp_cmt_on_off > 0) &&
|
||||
* (net->fast_retran_loss_recovery == 0)))
|
||||
*/
|
||||
@ -2297,6 +2317,7 @@ sctp_htcp_cwnd_update_after_fr(struct sctp_tcb *stcb,
|
||||
htcp_reset(&net->cc_mod.htcp_ca);
|
||||
net->ssthresh = htcp_recalc_ssthresh(net);
|
||||
net->cwnd = net->ssthresh;
|
||||
sctp_enforce_cwnd_limit(asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd),
|
||||
SCTP_CWND_LOG_FROM_FR);
|
||||
@ -2375,6 +2396,7 @@ sctp_htcp_cwnd_update_after_ecn_echo(struct sctp_tcb *stcb,
|
||||
net->RTO <<= 1;
|
||||
}
|
||||
net->cwnd = net->ssthresh;
|
||||
sctp_enforce_cwnd_limit(&stcb->asoc, net);
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) {
|
||||
sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd), SCTP_CWND_LOG_FROM_SAT);
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_indata.c 276914 2015-01-10 20:49:57Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_indata.c 280440 2015-03-24 15:05:36Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -2619,12 +2619,14 @@ sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1
|
||||
* cumack trackers for first transmissions,
|
||||
* and retransmissions.
|
||||
*/
|
||||
if ((tp1->whoTo->find_pseudo_cumack == 1) && (tp1->sent < SCTP_DATAGRAM_RESEND) &&
|
||||
if ((tp1->sent < SCTP_DATAGRAM_RESEND) &&
|
||||
(tp1->whoTo->find_pseudo_cumack == 1) &&
|
||||
(tp1->snd_count == 1)) {
|
||||
tp1->whoTo->pseudo_cumack = tp1->rec.data.TSN_seq;
|
||||
tp1->whoTo->find_pseudo_cumack = 0;
|
||||
}
|
||||
if ((tp1->whoTo->find_rtx_pseudo_cumack == 1) && (tp1->sent < SCTP_DATAGRAM_RESEND) &&
|
||||
if ((tp1->sent < SCTP_DATAGRAM_RESEND) &&
|
||||
(tp1->whoTo->find_rtx_pseudo_cumack == 1) &&
|
||||
(tp1->snd_count > 1)) {
|
||||
tp1->whoTo->rtx_pseudo_cumack = tp1->rec.data.TSN_seq;
|
||||
tp1->whoTo->find_rtx_pseudo_cumack = 0;
|
||||
@ -3520,7 +3522,7 @@ sctp_window_probe_recovery(struct sctp_tcb *stcb,
|
||||
if ((tp1->sent >= SCTP_DATAGRAM_ACKED) || (tp1->data == NULL)) {
|
||||
/* TSN's skipped we do NOT move back. */
|
||||
sctp_misc_ints(SCTP_FLIGHT_LOG_DWN_WP_FWD,
|
||||
tp1->whoTo->flight_size,
|
||||
tp1->whoTo ? tp1->whoTo->flight_size : 0,
|
||||
tp1->book_size,
|
||||
(uintptr_t)tp1->whoTo,
|
||||
tp1->rec.data.TSN_seq);
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_input.c 277805 2015-01-27 19:35:38Z delphij $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_input.c 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -2897,6 +2897,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
inp->sctp_mobility_features = (*inp_p)->sctp_mobility_features;
|
||||
inp->sctp_socket = so;
|
||||
inp->sctp_frag_point = (*inp_p)->sctp_frag_point;
|
||||
inp->max_cwnd = (*inp_p)->max_cwnd;
|
||||
inp->sctp_cmt_on_off = (*inp_p)->sctp_cmt_on_off;
|
||||
inp->ecn_supported = (*inp_p)->ecn_supported;
|
||||
inp->prsctp_supported = (*inp_p)->prsctp_supported;
|
||||
|
@ -273,7 +273,6 @@ typedef char* caddr_t;
|
||||
#endif
|
||||
|
||||
#else /* !defined(Userspace_os_Windows) */
|
||||
#include <sys/cdefs.h> /* needed? added from old __FreeBSD__ */
|
||||
#include <sys/socket.h>
|
||||
#if defined(__Userspace_os_DragonFly) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_Linux) || defined(__Userspace_os_NetBSD) || defined(__Userspace_os_OpenBSD) || defined(__Userspace_os_NaCl)
|
||||
#include <pthread.h>
|
||||
@ -437,10 +436,10 @@ struct sx {int dummy;};
|
||||
/* #include <sys/param.h> in FreeBSD defines MSIZE */
|
||||
/* #include <sys/ktr.h> */
|
||||
/* #include <sys/systm.h> */
|
||||
#if defined(__Userspace_os_Windows)
|
||||
#include <user_queue.h>
|
||||
#else
|
||||
#if defined(HAVE_SYS_QUEUE_H)
|
||||
#include <sys/queue.h>
|
||||
#else
|
||||
#include <user_queue.h>
|
||||
#endif
|
||||
#include <user_malloc.h>
|
||||
/* #include <sys/kernel.h> */
|
||||
@ -496,7 +495,7 @@ struct sx {int dummy;};
|
||||
/* for getifaddrs */
|
||||
#include <sys/types.h>
|
||||
#if !defined(__Userspace_os_Windows)
|
||||
#if !defined(ANDROID) && (defined(INET) || defined(INET6))
|
||||
#if defined(INET) || defined(INET6)
|
||||
#include <ifaddrs.h>
|
||||
#endif
|
||||
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.c 277350 2015-01-18 22:00:39Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.c 280371 2015-03-23 15:12:02Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -9735,8 +9735,6 @@ sctp_send_asconf_ack(struct sctp_tcb *stcb)
|
||||
atomic_add_int(&chk->whoTo->ref_count, 1);
|
||||
}
|
||||
chk->data = m_ack;
|
||||
chk->send_size = 0;
|
||||
/* Get size */
|
||||
chk->send_size = ack->len;
|
||||
chk->sent = SCTP_DATAGRAM_UNSENT;
|
||||
chk->snd_count = 0;
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 277031 2015-01-11 21:55:30Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 280459 2015-03-24 21:12:45Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -71,6 +71,9 @@ __FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 277031 2015-01-11 21:55:30Z tuex
|
||||
#endif
|
||||
#if defined(__Userspace__)
|
||||
#include <user_socketvar.h>
|
||||
#if !defined(__Userspace_os_Windows)
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
@ -2201,7 +2204,7 @@ sctp_swap_inpcb_for_listen(struct sctp_inpcb *inp)
|
||||
{
|
||||
/* For 1-2-1 with port reuse */
|
||||
struct sctppcbhead *head;
|
||||
struct sctp_inpcb *tinp;
|
||||
struct sctp_inpcb *tinp, *ninp;
|
||||
|
||||
if (sctp_is_feature_off(inp, SCTP_PCB_FLAGS_PORTREUSE)) {
|
||||
/* only works with port reuse on */
|
||||
@ -2211,10 +2214,11 @@ sctp_swap_inpcb_for_listen(struct sctp_inpcb *inp)
|
||||
return (0);
|
||||
}
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
SCTP_INP_INFO_WLOCK();
|
||||
head = &SCTP_BASE_INFO(sctp_ephash)[SCTP_PCBHASH_ALLADDR(inp->sctp_lport,
|
||||
SCTP_BASE_INFO(hashmark))];
|
||||
/* Kick out all non-listeners to the TCP hash */
|
||||
LIST_FOREACH(tinp, head, sctp_hash) {
|
||||
LIST_FOREACH_SAFE(tinp, head, sctp_hash, ninp) {
|
||||
if (tinp->sctp_lport != inp->sctp_lport) {
|
||||
continue;
|
||||
}
|
||||
@ -2242,6 +2246,7 @@ sctp_swap_inpcb_for_listen(struct sctp_inpcb *inp)
|
||||
LIST_INSERT_HEAD(head, inp, sctp_hash);
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
SCTP_INP_RLOCK(inp);
|
||||
SCTP_INP_INFO_WUNLOCK();
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -2832,6 +2837,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
|
||||
inp->sctp_associd_counter = 1;
|
||||
inp->partial_delivery_point = SCTP_SB_LIMIT_RCV(so) >> SCTP_PARTIAL_DELIVERY_SHIFT;
|
||||
inp->sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT;
|
||||
inp->max_cwnd = 0;
|
||||
inp->sctp_cmt_on_off = SCTP_BASE_SYSCTL(sctp_cmt_on_off);
|
||||
inp->ecn_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_ecn_enable);
|
||||
inp->prsctp_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_pr_enable);
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.h 275427 2014-12-02 20:29:29Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.h 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#ifndef _NETINET_SCTP_PCB_H_
|
||||
@ -478,6 +478,7 @@ struct sctp_inpcb {
|
||||
uint32_t sctp_frag_point;
|
||||
uint32_t partial_delivery_point;
|
||||
uint32_t sctp_context;
|
||||
uint32_t max_cwnd;
|
||||
uint8_t local_strreset_support;
|
||||
uint32_t sctp_cmt_on_off;
|
||||
uint8_t ecn_supported;
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_peeloff.c 269858 2014-08-12 11:30:16Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_peeloff.c 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -134,6 +134,7 @@ sctp_do_peeloff(struct socket *head, struct socket *so, sctp_assoc_t assoc_id)
|
||||
n_inp->pktdrop_supported = inp->pktdrop_supported;
|
||||
n_inp->partial_delivery_point = inp->partial_delivery_point;
|
||||
n_inp->sctp_context = inp->sctp_context;
|
||||
n_inp->max_cwnd = inp->max_cwnd;
|
||||
n_inp->local_strreset_support = inp->local_strreset_support;
|
||||
n_inp->inp_starting_point_for_iterator = NULL;
|
||||
/* copy in the authentication parameters from the original endpoint */
|
||||
@ -249,6 +250,7 @@ sctp_get_peeloff(struct socket *head, sctp_assoc_t assoc_id, int *error)
|
||||
n_inp->pktdrop_supported = inp->pktdrop_supported;
|
||||
n_inp->partial_delivery_point = inp->partial_delivery_point;
|
||||
n_inp->sctp_context = inp->sctp_context;
|
||||
n_inp->max_cwnd = inp->max_cwnd;
|
||||
n_inp->local_strreset_support = inp->local_strreset_support;
|
||||
n_inp->inp_starting_point_for_iterator = NULL;
|
||||
#if defined(__Userspace__)
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 275483 2014-12-04 21:17:50Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 279859 2015-03-10 19:49:25Z tuexen $");
|
||||
#endif
|
||||
|
||||
#ifndef _NETINET_SCTP_STRUCTS_H_
|
||||
@ -1249,6 +1249,7 @@ struct sctp_association {
|
||||
uint8_t sctp_cmt_pf;
|
||||
uint8_t use_precise_time;
|
||||
uint64_t sctp_features;
|
||||
uint32_t max_cwnd;
|
||||
uint16_t port; /* remote UDP encapsulation port */
|
||||
/*
|
||||
* The mapping array is used to track out of order sequences above
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 277380 2015-01-19 11:52:08Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 279841 2015-03-10 09:16:31Z tuexen $");
|
||||
#endif
|
||||
|
||||
#define _IP_VHL
|
||||
@ -162,7 +162,7 @@ sctp_threshold_management(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
struct mbuf *op_err;
|
||||
|
||||
op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION,
|
||||
"Association error couter exceeded");
|
||||
"Association error counter exceeded");
|
||||
inp->last_abort_code = SCTP_FROM_SCTP_TIMER+SCTP_LOC_1;
|
||||
sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
|
||||
return (1);
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 277815 2015-01-27 21:30:24Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 280459 2015-03-24 21:12:45Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -295,21 +295,19 @@ sctp_pathmtu_adjustment(struct sctp_tcb *stcb, uint16_t nxtsz)
|
||||
if (chk->sent < SCTP_DATAGRAM_RESEND) {
|
||||
sctp_flight_size_decrease(chk);
|
||||
sctp_total_flight_decrease(stcb, chk);
|
||||
}
|
||||
if (chk->sent != SCTP_DATAGRAM_RESEND) {
|
||||
chk->sent = SCTP_DATAGRAM_RESEND;
|
||||
sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
|
||||
chk->rec.data.doing_fast_retransmit = 0;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
|
||||
sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_PMTU,
|
||||
chk->whoTo->flight_size,
|
||||
chk->book_size,
|
||||
(uintptr_t)chk->whoTo,
|
||||
chk->rec.data.TSN_seq);
|
||||
}
|
||||
/* Clear any time so NO RTT is being done */
|
||||
chk->do_rtt = 0;
|
||||
}
|
||||
chk->sent = SCTP_DATAGRAM_RESEND;
|
||||
chk->rec.data.doing_fast_retransmit = 0;
|
||||
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
|
||||
sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_PMTU,
|
||||
chk->whoTo->flight_size,
|
||||
chk->book_size,
|
||||
(uintptr_t)chk->whoTo,
|
||||
chk->rec.data.TSN_seq);
|
||||
}
|
||||
/* Clear any time so NO RTT is being done */
|
||||
chk->do_rtt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4388,6 +4386,33 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SCTP_MAX_CWND:
|
||||
{
|
||||
struct sctp_assoc_value *av;
|
||||
|
||||
SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, *optsize);
|
||||
SCTP_FIND_STCB(inp, stcb, av->assoc_id);
|
||||
|
||||
if (stcb) {
|
||||
av->assoc_value = stcb->asoc.max_cwnd;
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
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->max_cwnd;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
} else {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
error = EINVAL;
|
||||
}
|
||||
}
|
||||
if (error == 0) {
|
||||
*optsize = sizeof(struct sctp_assoc_value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT);
|
||||
error = ENOPROTOOPT;
|
||||
@ -7037,14 +7062,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
if (stcb != NULL) {
|
||||
if (net != NULL) {
|
||||
net->failure_threshold = thlds->spt_pathmaxrxt;
|
||||
net->pf_threshold = thlds->spt_pathpfthld;
|
||||
if (net->dest_state & SCTP_ADDR_PF) {
|
||||
if ((net->failure_threshold > thlds->spt_pathmaxrxt) ||
|
||||
(net->failure_threshold <= thlds->spt_pathpfthld)) {
|
||||
if ((net->error_count > net->failure_threshold) ||
|
||||
(net->error_count <= net->pf_threshold)) {
|
||||
net->dest_state &= ~SCTP_ADDR_PF;
|
||||
}
|
||||
} else {
|
||||
if ((net->failure_threshold > thlds->spt_pathpfthld) &&
|
||||
(net->failure_threshold <= thlds->spt_pathmaxrxt)) {
|
||||
if ((net->error_count > net->pf_threshold) &&
|
||||
(net->error_count <= net->failure_threshold)) {
|
||||
net->dest_state |= SCTP_ADDR_PF;
|
||||
sctp_send_hb(stcb, net, SCTP_SO_LOCKED);
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3);
|
||||
@ -7052,28 +7079,28 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
}
|
||||
if (net->dest_state & SCTP_ADDR_REACHABLE) {
|
||||
if (net->failure_threshold > thlds->spt_pathmaxrxt) {
|
||||
if (net->error_count > net->failure_threshold) {
|
||||
net->dest_state &= ~SCTP_ADDR_REACHABLE;
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED);
|
||||
}
|
||||
} else {
|
||||
if (net->failure_threshold <= thlds->spt_pathmaxrxt) {
|
||||
if (net->error_count <= net->failure_threshold) {
|
||||
net->dest_state |= SCTP_ADDR_REACHABLE;
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED);
|
||||
}
|
||||
}
|
||||
net->failure_threshold = thlds->spt_pathmaxrxt;
|
||||
net->pf_threshold = thlds->spt_pathpfthld;
|
||||
} else {
|
||||
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||
net->failure_threshold = thlds->spt_pathmaxrxt;
|
||||
net->pf_threshold = thlds->spt_pathpfthld;
|
||||
if (net->dest_state & SCTP_ADDR_PF) {
|
||||
if ((net->failure_threshold > thlds->spt_pathmaxrxt) ||
|
||||
(net->failure_threshold <= thlds->spt_pathpfthld)) {
|
||||
if ((net->error_count > net->failure_threshold) ||
|
||||
(net->error_count <= net->pf_threshold)) {
|
||||
net->dest_state &= ~SCTP_ADDR_PF;
|
||||
}
|
||||
} else {
|
||||
if ((net->failure_threshold > thlds->spt_pathpfthld) &&
|
||||
(net->failure_threshold <= thlds->spt_pathmaxrxt)) {
|
||||
if ((net->error_count > net->pf_threshold) &&
|
||||
(net->error_count <= net->failure_threshold)) {
|
||||
net->dest_state |= SCTP_ADDR_PF;
|
||||
sctp_send_hb(stcb, net, SCTP_SO_LOCKED);
|
||||
sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3);
|
||||
@ -7081,22 +7108,21 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
}
|
||||
if (net->dest_state & SCTP_ADDR_REACHABLE) {
|
||||
if (net->failure_threshold > thlds->spt_pathmaxrxt) {
|
||||
if (net->error_count > net->failure_threshold) {
|
||||
net->dest_state &= ~SCTP_ADDR_REACHABLE;
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED);
|
||||
}
|
||||
} else {
|
||||
if (net->failure_threshold <= thlds->spt_pathmaxrxt) {
|
||||
if (net->error_count <= net->failure_threshold) {
|
||||
net->dest_state |= SCTP_ADDR_REACHABLE;
|
||||
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED);
|
||||
}
|
||||
}
|
||||
net->failure_threshold = thlds->spt_pathmaxrxt;
|
||||
net->pf_threshold = thlds->spt_pathpfthld;
|
||||
}
|
||||
stcb->asoc.def_net_failure = thlds->spt_pathmaxrxt;
|
||||
stcb->asoc.def_net_pf_threshold = thlds->spt_pathpfthld;
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
|
||||
@ -7449,6 +7475,42 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SCTP_MAX_CWND:
|
||||
{
|
||||
struct sctp_assoc_value *av;
|
||||
struct sctp_nets *net;
|
||||
|
||||
SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, optsize);
|
||||
SCTP_FIND_STCB(inp, stcb, av->assoc_id);
|
||||
|
||||
if (stcb) {
|
||||
stcb->asoc.max_cwnd = av->assoc_value;
|
||||
if (stcb->asoc.max_cwnd > 0) {
|
||||
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||
if ((net->cwnd > stcb->asoc.max_cwnd) &&
|
||||
(net->cwnd > (net->mtu - sizeof(struct sctphdr)))) {
|
||||
net->cwnd = stcb->asoc.max_cwnd;
|
||||
if (net->cwnd < (net->mtu - sizeof(struct sctphdr))) {
|
||||
net->cwnd = net->mtu - sizeof(struct sctphdr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
} else {
|
||||
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);
|
||||
inp->max_cwnd = av->assoc_value;
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
} else {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
error = EINVAL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT);
|
||||
error = ENOPROTOOPT;
|
||||
@ -8047,8 +8109,8 @@ sctp_listen(struct socket *so, struct proc *p)
|
||||
SOCK_LOCK(so);
|
||||
#if (defined(__FreeBSD__) && __FreeBSD_version > 500000) || defined(__Userspace__)
|
||||
error = solisten_proto_check(so);
|
||||
SOCK_UNLOCK(so);
|
||||
if (error) {
|
||||
SOCK_UNLOCK(so);
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
return (error);
|
||||
}
|
||||
@ -8062,29 +8124,28 @@ sctp_listen(struct socket *so, struct proc *p)
|
||||
* - We must then move the guy that was listener to the TCP Pool.
|
||||
*/
|
||||
if (sctp_swap_inpcb_for_listen(inp)) {
|
||||
goto in_use;
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EADDRINUSE);
|
||||
return (EADDRINUSE);
|
||||
}
|
||||
}
|
||||
|
||||
if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) &&
|
||||
(inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED)) {
|
||||
/* We are already connected AND the TCP model */
|
||||
in_use:
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
SOCK_UNLOCK(so);
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EADDRINUSE);
|
||||
return (EADDRINUSE);
|
||||
}
|
||||
SCTP_INP_RUNLOCK(inp);
|
||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) {
|
||||
/* We must do a bind. */
|
||||
SOCK_UNLOCK(so);
|
||||
if ((error = sctp_inpcb_bind(so, NULL, NULL, p))) {
|
||||
/* bind error, probably perm */
|
||||
return (error);
|
||||
}
|
||||
SOCK_LOCK(so);
|
||||
}
|
||||
SOCK_LOCK(so);
|
||||
#if (defined(__FreeBSD__) && __FreeBSD_version > 500000) || defined(__Windows__) || defined(__Userspace__)
|
||||
#if __FreeBSD_version >= 700000 || defined(__Windows__) || defined(__Userspace__)
|
||||
/* It appears for 7.0 and on, we must always call this. */
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctputil.c 277049 2015-01-12 07:39:52Z tuexen $");
|
||||
__FBSDID("$FreeBSD: head/sys/netinet/sctputil.c 280439 2015-03-24 14:51:46Z tuexen $");
|
||||
#endif
|
||||
|
||||
#include <netinet/sctp_os.h>
|
||||
@ -1000,6 +1000,7 @@ sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
asoc->sctp_frag_point = inp->sctp_frag_point;
|
||||
asoc->sctp_features = inp->sctp_features;
|
||||
asoc->default_dscp = inp->sctp_ep.default_dscp;
|
||||
asoc->max_cwnd = inp->max_cwnd;
|
||||
#ifdef INET6
|
||||
if (inp->sctp_ep.default_flowlabel) {
|
||||
asoc->default_flowlabel = inp->sctp_ep.default_flowlabel;
|
||||
@ -2863,7 +2864,11 @@ set_error:
|
||||
|
||||
static void
|
||||
sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state,
|
||||
struct sockaddr *sa, uint32_t error)
|
||||
struct sockaddr *sa, uint32_t error, int so_locked
|
||||
#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING)
|
||||
SCTP_UNUSED
|
||||
#endif
|
||||
)
|
||||
{
|
||||
struct mbuf *m_notify;
|
||||
struct sctp_paddr_change *spc;
|
||||
@ -2959,7 +2964,7 @@ sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state,
|
||||
control,
|
||||
&stcb->sctp_socket->so_rcv, 1,
|
||||
SCTP_READ_LOCK_NOT_HELD,
|
||||
SCTP_SO_NOT_LOCKED);
|
||||
so_locked);
|
||||
}
|
||||
|
||||
|
||||
@ -3757,7 +3762,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb,
|
||||
|
||||
net = (struct sctp_nets *)data;
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_UNREACHABLE,
|
||||
(struct sockaddr *)&net->ro._l_addr, error);
|
||||
(struct sockaddr *)&net->ro._l_addr, error, so_locked);
|
||||
break;
|
||||
}
|
||||
case SCTP_NOTIFY_INTERFACE_UP:
|
||||
@ -3766,7 +3771,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb,
|
||||
|
||||
net = (struct sctp_nets *)data;
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_AVAILABLE,
|
||||
(struct sockaddr *)&net->ro._l_addr, error);
|
||||
(struct sockaddr *)&net->ro._l_addr, error, so_locked);
|
||||
break;
|
||||
}
|
||||
case SCTP_NOTIFY_INTERFACE_CONFIRMED:
|
||||
@ -3775,7 +3780,7 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb,
|
||||
|
||||
net = (struct sctp_nets *)data;
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_CONFIRMED,
|
||||
(struct sockaddr *)&net->ro._l_addr, error);
|
||||
(struct sockaddr *)&net->ro._l_addr, error, so_locked);
|
||||
break;
|
||||
}
|
||||
case SCTP_NOTIFY_SPECIAL_SP_FAIL:
|
||||
@ -3845,15 +3850,15 @@ sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb,
|
||||
break;
|
||||
case SCTP_NOTIFY_ASCONF_ADD_IP:
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data,
|
||||
error);
|
||||
error, so_locked);
|
||||
break;
|
||||
case SCTP_NOTIFY_ASCONF_DELETE_IP:
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_REMOVED, data,
|
||||
error);
|
||||
error, so_locked);
|
||||
break;
|
||||
case SCTP_NOTIFY_ASCONF_SET_PRIMARY:
|
||||
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_MADE_PRIM, data,
|
||||
error);
|
||||
error, so_locked);
|
||||
break;
|
||||
case SCTP_NOTIFY_PEER_SHUTDOWN:
|
||||
sctp_notify_shutdown_event(stcb);
|
||||
@ -5337,17 +5342,13 @@ sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
|
||||
chk->rec.data.payloadtype = sp->ppid;
|
||||
chk->rec.data.context = sp->context;
|
||||
chk->flags = sp->act_flags;
|
||||
if (sp->net)
|
||||
chk->whoTo = sp->net;
|
||||
else
|
||||
chk->whoTo = stcb->asoc.primary_destination;
|
||||
atomic_add_int(&chk->whoTo->ref_count, 1);
|
||||
chk->whoTo = NULL;
|
||||
#if defined(__FreeBSD__) || defined(__Panda__)
|
||||
chk->rec.data.TSN_seq = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1);
|
||||
#else
|
||||
chk->rec.data.TSN_seq = stcb->asoc.sending_seq++;
|
||||
#endif
|
||||
stcb->asoc.pr_sctp_cnt++;
|
||||
strq->chunks_on_queues++;
|
||||
TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, chk, sctp_next);
|
||||
stcb->asoc.sent_queue_cnt++;
|
||||
stcb->asoc.pr_sctp_cnt++;
|
||||
|
@ -31,9 +31,6 @@
|
||||
#ifndef _USER_QUEUE_H_
|
||||
#define _USER_QUEUE_H_
|
||||
|
||||
#if !defined (__Userspace_os_Windows)
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
/*
|
||||
* This file defines four types of data structures: singly-linked lists,
|
||||
* singly-linked tail queues, lists and tail queues.
|
||||
|
Loading…
Reference in New Issue
Block a user