From 696337f631a57ffb8420df7ed8867e8af0e577fc Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Tue, 9 Jan 2024 11:42:08 +0100 Subject: [PATCH] BUG/MINOR: mux-quic: do not prevent non-STREAM sending on flow control Data emitted by QUIC MUX is restrained by the peer flow control. This is checked on stream and connection level inside qcc_io_send(). The connection level check was placed early in qcc_io_send() preambule. However, this also prevents emission of other frames STOP_SENDING and RESET_STREAM, until flow control limitation is increased by a received MAX_DATA. Note that local flow control frame emission is done prior in qcc_io_send() and so are not impacted. In the worst case, if no MAX_DATA is received for some time, this could delay significantly streams closure and resource free. However, this should be rare as other peers should anticipate emission of MAX_DATA before reaching flow control limit. In the end, this is also covered by the MUX timeout so the impact should be minimal To fix this, move the connection level check directly inside QCS sending loop. Note that this could cause unnecessary looping when connection flow control level is reached and no STOP_SENDING/RESET_STREAM are needed. This should be backported up to 2.6. (cherry picked from commit 333f2cababa36f4289493647fed4f7dce0babc77) Signed-off-by: Christopher Faulet --- src/mux_quic.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mux_quic.c b/src/mux_quic.c index ea88090..56806db 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -2045,9 +2045,6 @@ static int qcc_io_send(struct qcc *qcc) } } - if (qcc->flags & QC_CF_BLK_MFCTL) - goto out; - /* Send STREAM/STOP_SENDING/RESET_STREAM data for registered streams. */ list_for_each_entry_safe(qcs, qcs_tmp, &qcc->send_list, el_send) { /* Check if all QCS were processed. */ @@ -2091,7 +2088,8 @@ static int qcc_io_send(struct qcc *qcc) continue; } - if (!(qcs->flags & QC_SF_BLK_SFCTL)) { + if (!(qcc->flags & QC_CF_BLK_MFCTL) && + !(qcs->flags & QC_SF_BLK_SFCTL)) { if ((ret = qcs_send(qcs, &frms)) < 0) { /* Temporarily remove QCS from send-list. */ LIST_DEL_INIT(&qcs->el_send); -- 1.7.10.4