From: Frederic Lecaille Date: Mon, 12 Feb 2024 10:07:54 +0000 (+0100) Subject: BUG/MEDIUM: quic: Wrong K CUBIC calculation. X-Git-Tag: v3.0-dev4~62 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=406c63ba44666deb7f09a36748039aaafa8a7d5d;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: quic: Wrong K CUBIC calculation. The formula for K CUBIC calculation is as follows: K = cubic_root(W_max * (1 - beta_quic) / C). Note that this does not match the comment. But the aim of this patch is to not hide a bug inside another patch to update this K CUBIC calculation. The unit of C is bytes/s^3 (or segments/s^3). And we want to store K as milliseconds. So, the conversion inside the cubic_root() to convert seconds in milliseconds is wrong. The unit used here is bytes/(ms/1000)^3 or bytes*1000^3/ms^3. That said, it is preferable to compute K as seconds, then convert to milliseconds as done by this patch. Must be backported as far as 2.6. --- diff --git a/src/quic_cc_cubic.c b/src/quic_cc_cubic.c index a0f85466f8..7c478c6340 100644 --- a/src/quic_cc_cubic.c +++ b/src/quic_cc_cubic.c @@ -242,7 +242,9 @@ static inline void quic_cubic_update(struct quic_cc *cc, uint32_t acked) * Note that K is stored in milliseconds. */ c->K = cubic_root((c->last_w_max - path->cwnd) * - (CUBIC_ONE_SCALED - CUBIC_BETA_SCALED) * 1000 / (CUBIC_C_SCALED * path->mtu)); + (CUBIC_ONE_SCALED - CUBIC_BETA_SCALED) / (CUBIC_C_SCALED * path->mtu)); + /* Convert to miliseconds. */ + c->K *= 1000; c->W_target = c->last_w_max; }