BUG/MINOR: quic: fix computed length of emitted STREAM frames

qc_build_frms() is responsible to encode multiple frames in a single
QUIC packet. It accounts for room left in the buffer packet for each
newly encded frame.

An incorrect computation was performed when encoding a STREAM frame in a
single packet. Frame length was accounted twice which would reduce in
excess the buffer packet room. This caused the remaining built frames to
be reduced with the resulting packet not able to fill the whole MTU.

The impact of this bug should be minimal. It is only present when
multiple frames are encoded in a single packet after a STREAM. However
in this case datagrams built are smaller than expecting, which is
suboptimal for bandwith.

This should be backported up to 2.6.
This commit is contained in:
Amaury Denoyelle 2024-06-05 11:37:44 +02:00
parent 711338e1ce
commit 50470a5181

View File

@ -1425,6 +1425,7 @@ static int qc_build_frms(struct list *outlist, struct list *inlist,
ret = 0;
if (*len > room)
goto leave;
room -= *len;
/* If we are not probing we must take into an account the congestion
* control window.
@ -1458,8 +1459,8 @@ static int qc_build_frms(struct list *outlist, struct list *inlist,
QUIC_EV_CONN_BCFRMS, qc, &room, len);
/* Compute the length of this CRYPTO frame header */
hlen = 1 + quic_int_getsize(cf->crypto.offset);
/* Compute the data length of this CRyPTO frame. */
dlen = max_stream_data_size(room, *len + hlen, cf->crypto.len);
/* Compute the data length of this CRYPTO frame. */
dlen = max_stream_data_size(room, hlen, cf->crypto.len);
TRACE_DEVEL(" CRYPTO data length (hlen, crypto.len, dlen)",
QUIC_EV_CONN_BCFRMS, qc, &hlen, &cf->crypto.len, &dlen);
if (!dlen)
@ -1550,7 +1551,7 @@ static int qc_build_frms(struct list *outlist, struct list *inlist,
hlen = 1 + quic_int_getsize(cf->stream.id) +
((cf->type & QUIC_STREAM_FRAME_TYPE_OFF_BIT) ? quic_int_getsize(cf->stream.offset.key) : 0);
/* Compute the data length of this STREAM frame. */
avail_room = room - hlen - *len;
avail_room = room - hlen;
if ((ssize_t)avail_room <= 0)
continue;