aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/sctp_ss_functions.c
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-09-29 00:08:37 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-09-29 00:08:37 +0000
commit28ea9470782d4d01004b801c3ec7d74761fcf611 (patch)
tree32a4b8aeedaa3b13545c3195123b79f2440508f9 /sys/netinet/sctp_ss_functions.c
parent7457840230c5a470ee5df8abed6ab59c4d008a45 (diff)
downloadsrc-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
Diffstat (limited to 'sys/netinet/sctp_ss_functions.c')
-rw-r--r--sys/netinet/sctp_ss_functions.c26
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,