diff options
author | Michael Tuexen <tuexen@FreeBSD.org> | 2021-09-29 00:08:37 +0000 |
---|---|---|
committer | Michael Tuexen <tuexen@FreeBSD.org> | 2021-09-29 00:08:37 +0000 |
commit | 28ea9470782d4d01004b801c3ec7d74761fcf611 (patch) | |
tree | 32a4b8aeedaa3b13545c3195123b79f2440508f9 | |
parent | 7457840230c5a470ee5df8abed6ab59c4d008a45 (diff) | |
download | src-28ea9470782d4d01004b801c3ec7d74761fcf611.tar.gz src-28ea9470782d4d01004b801c3ec7d74761fcf611.zip |
sctp: provide a specific stream scheduler function for FCFS
A KASSERT in the genric routine does not apply and triggers
incorrectly.
Reported by: syzbot+8435af157238c6a11430@syzkaller.appspotmail.com
MFC after: 1 week
-rw-r--r-- | sys/netinet/sctp_ss_functions.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/sys/netinet/sctp_ss_functions.c b/sys/netinet/sctp_ss_functions.c index fe4b96cf00ab..5293c0fee742 100644 --- a/sys/netinet/sctp_ss_functions.c +++ b/sys/netinet/sctp_ss_functions.c @@ -863,6 +863,30 @@ default_again: return (strq); } +static void +sctp_ss_fcfs_scheduled(struct sctp_tcb *stcb, + struct sctp_nets *net SCTP_UNUSED, + struct sctp_association *asoc, + struct sctp_stream_out *strq, + int moved_how_much SCTP_UNUSED) +{ + struct sctp_stream_queue_pending *sp; + + KASSERT(strq != NULL, ("strq is NULL")); + asoc->ss_data.last_out_stream = strq; + if (asoc->idata_supported == 0) { + sp = TAILQ_FIRST(&strq->outqueue); + if ((sp != NULL) && (sp->some_taken == 1)) { + asoc->ss_data.locked_on_sending = strq; + } else { + asoc->ss_data.locked_on_sending = NULL; + } + } else { + asoc->ss_data.locked_on_sending = NULL; + } + return; +} + const struct sctp_ss_functions sctp_ss_functions[] = { /* SCTP_SS_DEFAULT */ { @@ -948,7 +972,7 @@ const struct sctp_ss_functions sctp_ss_functions[] = { .sctp_ss_is_empty = sctp_ss_fcfs_is_empty, .sctp_ss_remove_from_stream = sctp_ss_fcfs_remove, .sctp_ss_select_stream = sctp_ss_fcfs_select, - .sctp_ss_scheduled = sctp_ss_default_scheduled, + .sctp_ss_scheduled = sctp_ss_fcfs_scheduled, .sctp_ss_packet_done = sctp_ss_default_packet_done, .sctp_ss_get_value = sctp_ss_default_get_value, .sctp_ss_set_value = sctp_ss_default_set_value, |