]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-quic: support MAX_DATA frame parsing
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 8 Mar 2022 15:23:03 +0000 (16:23 +0100)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 23 Mar 2022 09:14:14 +0000 (10:14 +0100)
This commit is similar to the previous one but with MAX_DATA frames.
This allows to increase the connection level flow-control limit. If the
connection was blocked due to QC_CF_BLK_MFCTL flag, the flag is reseted.

include/haproxy/mux_quic.h
src/mux_quic.c
src/xprt_quic.c

index 3db4406760de44444ce35fd7ef6c0ad57840f396..ea6986c5869a99dcdc8c5ca9fb0f40488e3a9459 100644 (file)
@@ -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_data(struct qcc *qcc, uint64_t max);
 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);
index e3a43f5b737059a6ca5a78d57ef4e33307a6c2bd..3242d8f8d7b73ff1e8b57971ebf89eefaf6350dc 100644 (file)
@@ -253,6 +253,24 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
        return 0;
 }
 
+/* Handle a new MAX_DATA frame. <max> must contains the maximum data field of
+ * the frame.
+ *
+ * Returns 0 on success else non-zero.
+ */
+int qcc_recv_max_data(struct qcc *qcc, uint64_t max)
+{
+       if (qcc->rfctl.md < max) {
+               qcc->rfctl.md = max;
+
+               if (qcc->flags & QC_CF_BLK_MFCTL) {
+                       qcc->flags &= ~QC_CF_BLK_MFCTL;
+                       tasklet_wakeup(qcc->wait_event.tasklet);
+               }
+       }
+       return 0;
+}
+
 /* Handle a new MAX_STREAM_DATA frame. <max> must contains the maximum data
  * field of the frame and <id> is the identifier of the QUIC stream.
  *
index 799621ba8d252ebeab9a10c0b381fdc713dafebe..9a1e9eb5cdb0cfbfdb9b16eccbe284908e46b1a6 100644 (file)
@@ -2455,6 +2455,11 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct
                        break;
                }
                case QUIC_FT_MAX_DATA:
+                       if (qc->mux_state == QC_MUX_READY) {
+                               struct quic_max_data *data = &frm.max_data;
+                               qcc_recv_max_data(qc->qcc, data->max_data);
+                       }
+                       break;
                case QUIC_FT_MAX_STREAM_DATA:
                        if (qc->mux_state == QC_MUX_READY) {
                                struct quic_max_stream_data *data = &frm.max_stream_data;