From 8727ff466883d31a25c5e21132f07fab42b441c1 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Tue, 8 Mar 2022 10:39:55 +0100 Subject: [PATCH] MINOR: mux-quic: support MAX_STREAM_DATA frame parsing Implement a MUX method to parse MAX_STREAM_DATA. If the limit is greater than the previous one and the stream was blocked, the flag QC_SF_BLK_SFCTL is removed. --- include/haproxy/mux_quic.h | 1 + src/mux_quic.c | 26 ++++++++++++++++++++++++++ src/xprt_quic.c | 6 ++++++ 3 files changed, 33 insertions(+) diff --git a/include/haproxy/mux_quic.h b/include/haproxy/mux_quic.h index a5b105376..3db440676 100644 --- a/include/haproxy/mux_quic.h +++ b/include/haproxy/mux_quic.h @@ -22,6 +22,7 @@ void qcs_notify_send(struct qcs *qcs); int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset, char fin, char *data, struct qcs **out_qcs); +int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max); int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs); void qcc_streams_sent_done(struct qcs *qcs, uint64_t data, uint64_t offset); diff --git a/src/mux_quic.c b/src/mux_quic.c index 7a8ccfa49..e3a43f5b7 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -253,6 +253,32 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset, return 0; } +/* Handle a new MAX_STREAM_DATA frame. must contains the maximum data + * field of the frame and is the identifier of the QUIC stream. + * + * Returns 0 on success else non-zero. + */ +int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max) +{ + struct qcs *qcs; + struct eb64_node *node; + + node = eb64_lookup(&qcc->streams_by_id, id); + if (node) { + qcs = eb64_entry(&node->node, struct qcs, by_id); + if (max > qcs->tx.msd) { + qcs->tx.msd = max; + + if (qcs->flags & QC_SF_BLK_SFCTL) { + qcs->flags &= ~QC_SF_BLK_SFCTL; + tasklet_wakeup(qcc->wait_event.tasklet); + } + } + } + + return 0; +} + /* Decode the content of STREAM frames already received on the stream instance * . * diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 4e14bad6e..799621ba8 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2456,6 +2456,12 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct } case QUIC_FT_MAX_DATA: case QUIC_FT_MAX_STREAM_DATA: + if (qc->mux_state == QC_MUX_READY) { + struct quic_max_stream_data *data = &frm.max_stream_data; + qcc_recv_max_stream_data(qc->qcc, data->id, + data->max_stream_data); + } + break; case QUIC_FT_MAX_STREAMS_BIDI: case QUIC_FT_MAX_STREAMS_UNI: case QUIC_FT_DATA_BLOCKED: