]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: Useless TX buffer size reduction in closing state
authorFrederic Lecaille <flecaille@haproxy.com>
Wed, 25 Jun 2025 08:15:50 +0000 (10:15 +0200)
committerFrederic Lecaille <flecaille@haproxy.com>
Thu, 26 Jun 2025 07:48:00 +0000 (09:48 +0200)
There is no need to limit the size of the TX buffer to QUIC_MIN_CC_PKTSIZE bytes
when the connection is in closing state. There is already a test which limits the
number of bytes to be used from this TX buffer after this useless test removed.
It limits this number of bytes to the size of the TX buffer itself:

    if (end > (unsigned char *)b_wrap(buf))
    end = (unsigned char *)b_wrap(buf);

This is exactly what is needed when the connection is in closing state. Indeed,
the size of the TX buffers are limited to reduce the memory usage. The connection
only needs to send short datagrams with at most 2 packets with a CONNECTION_CLOSE*
frames. They are built only one time and backed up into small TX buffer allocated
from a dedicated pool.
The size of this TX buffer is QUIC_MAX_CC_BUFSIZE which depends on QUIC_MIN_CC_PKTSIZE:

 #define QUIC_MIN_CC_PKTSIZE  128
 #define QUIC_MAX_CC_BUFSIZE (2 * (QUIC_MIN_CC_PKTSIZE + QUIC_DGRAM_HEADLEN))

This size is smaller than an MTU.

This patch should be backported as far as 2.9 to ease further backports to come.

src/quic_tx.c

index 01b53b60ece6eface3d1714cd13eddb483247524..342a2dc5836b143620656a89786311d6075f06cf 100644 (file)
@@ -663,9 +663,7 @@ static int qc_prep_pkts(struct quic_conn *qc, struct buffer *buf,
                         * to stay under MTU limit.
                         */
                        if (!dglen) {
-                               if (cc)
-                                       end = pos + QUIC_MIN_CC_PKTSIZE;
-                               else if (!quic_peer_validated_addr(qc) && qc_is_listener(qc))
+                               if (!quic_peer_validated_addr(qc) && qc_is_listener(qc))
                                        end = pos + QUIC_MIN(qc->path->mtu, quic_may_send_bytes(qc));
                                else
                                        end = pos + qc->path->mtu;