aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2020-05-07 03:24:34 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2020-05-07 03:24:34 +0000
commit9f3a35b9673e6ab081886e32275112631e320f66 (patch)
tree2d18ce45eee51b42ffb3058b3f914020b171dabe
parentb9e41808820a27421ef81f5cb257f3ad587a2469 (diff)
downloadsrc-9f3a35b9673e6ab081886e32275112631e320f66.tar.gz
src-9f3a35b9673e6ab081886e32275112631e320f66.zip
MFC r358028: Fix SCTP stream scheduler bug
Fix the non-default stream schedulers such that do not interleave user messages when it is now allowed. Thanks to Christian Wright for reporting the issue for the userland stack and providing a fix for the priority scheduler.
Notes
Notes: svn path=/stable/11/; revision=360766
-rw-r--r--sys/netinet/sctp_ss_functions.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/netinet/sctp_ss_functions.c b/sys/netinet/sctp_ss_functions.c
index 48bdbb2dba03..f695e185fd91 100644
--- a/sys/netinet/sctp_ss_functions.c
+++ b/sys/netinet/sctp_ss_functions.c
@@ -515,6 +515,9 @@ sctp_ss_prio_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net,
{
struct sctp_stream_out *strq, *strqt, *strqn;
+ if (asoc->ss_data.locked_on_sending) {
+ return (asoc->ss_data.locked_on_sending);
+ }
strqt = asoc->ss_data.last_out_stream;
prio_again:
/* Find the next stream to use */
@@ -692,6 +695,9 @@ sctp_ss_fb_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net,
{
struct sctp_stream_out *strq = NULL, *strqt;
+ if (asoc->ss_data.locked_on_sending) {
+ return (asoc->ss_data.locked_on_sending);
+ }
if (asoc->ss_data.last_out_stream == NULL ||
TAILQ_FIRST(&asoc->ss_data.out.wheel) == TAILQ_LAST(&asoc->ss_data.out.wheel, sctpwheel_listhead)) {
strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel);
@@ -898,6 +904,9 @@ sctp_ss_fcfs_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net,
struct sctp_stream_out *strq;
struct sctp_stream_queue_pending *sp;
+ if (asoc->ss_data.locked_on_sending) {
+ return (asoc->ss_data.locked_on_sending);
+ }
sp = TAILQ_FIRST(&asoc->ss_data.out.list);
default_again:
if (sp != NULL) {