From 4df2fe90c8d656995b95274bc4df164d3632334d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Sun, 29 May 2022 11:36:03 +0200 Subject: [PATCH] MINOR: quic: Send STOP_SENDING frames if mux is released If the connection client timeout has expired, the mux is released. If the client decides to initiate a new request, we do not ack its request. This leads the client to endlessly sent it request. This patch makes a QUIC listener send a STOP_SENDING frame in such a situation. --- src/xprt_quic.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 16478d7d9..115339eee 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2379,6 +2379,35 @@ static void qc_cc_err_count_inc(struct quic_conn *qc, struct quic_frame *frm) } } +/* Enqueue a STOP_SENDING frame to send into 1RTT packet number space + * frame list to send. + * Return 1 if succeeded, 0 if not. + */ +static int qc_stop_sending_frm_enqueue(struct quic_conn *qc, uint64_t id) +{ + struct quic_frame *frm; + struct quic_enc_level *qel = &qc->els[QUIC_TLS_ENC_LEVEL_APP]; + uint64_t app_error_code; + + /* TODO: the mux may be released, we cannot have more + * information about the application error code to send + * at this time. + */ + app_error_code = H3_REQUEST_REJECTED; + + frm = pool_zalloc(pool_head_quic_frame); + if (!frm) + return 0; + + frm->type = QUIC_FT_STOP_SENDING; + frm->stop_sending.id = id; + frm->stop_sending.app_error_code = app_error_code; + LIST_INIT(&frm->reflist); + LIST_APPEND(&qel->pktns->tx.frms, &frm->list); + + return 1; +} + /* Parse all the frames of QUIC packet for QUIC connection with * as I/O handler context and as encryption level. * Returns 1 if succeeded, 0 if failed. @@ -2521,6 +2550,9 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct } else { TRACE_PROTO("Stream not found", QUIC_EV_CONN_PRSHPKT, qc); + if (!qc_stop_sending_frm_enqueue(qc, stream->id)) + TRACE_PROTO("could not enqueue STOP_SENDING frame", QUIC_EV_CONN_PRSHPKT, qc); + goto err; } }