MINOR: quic: Add information to "show quic" for CUBIC cc.
authorFrederic Lecaille <flecaille@haproxy.com>
Fri, 26 Jul 2024 14:06:27 +0000 (16:06 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 29 Jul 2024 09:56:13 +0000 (11:56 +0200)
Add ->state_cli() new callback to quic_cc_algo struct to define a
function called by the "show quic (cc|full)" commands to dump some information
about the congestion algorithm internal state currently in use by the QUIC
connections.

Implement this callback for CUBIC algorithm to dump its internal variables:
   - K: (the time to reach the cubic curve inflexion point),
   - last_w_max: the last maximum window value reached before intering
     the last recovery period. This is also the window value at the
     inflexion point of the cubic curve,
   - wdiff: the difference between the current window value and last_w_max.
     So negative before the inflexion point, and positive after.

(cherry picked from commit 76ff8afa2d9eb0206bc72f4e2f8ad230720dfb94)
[wt: adjusted ctx in quic_cli since no GSO]
Signed-off-by: Willy Tarreau <w@1wt.eu>

include/haproxy/quic_cc-t.h
src/quic_cc_cubic.c
src/quic_cli.c

index e678172..99e8f0c 100644 (file)
@@ -120,6 +120,7 @@ struct quic_cc_algo {
        void (*event)(struct quic_cc *cc, struct quic_cc_event *ev);
        void (*slow_start)(struct quic_cc *cc);
        void (*state_trace)(struct buffer *buf, const struct quic_cc *cc);
+       void (*state_cli)(struct buffer *buf, const struct quic_cc_path *path);
        void (*hystart_start_round)(struct quic_cc *cc, uint64_t pn);
 };
 
index 97bb74e..86f2cf8 100644 (file)
@@ -643,6 +643,15 @@ static void quic_cc_cubic_state_trace(struct buffer *buf, const struct quic_cc *
                      TICKS_TO_MS(tick_remain(c->recovery_start_time, now_ms)));
 }
 
+static void quic_cc_cubic_state_cli(struct buffer *buf, const struct quic_cc_path *path)
+{
+       struct cubic *c = quic_cc_priv(&path->cc);
+
+       chunk_appendf(buf, "  cc: state=%s ssthresh=%u K=%u last_w_max=%u wdiff=%ld\n",
+                     quic_cc_state_str(c->state), c->ssthresh, c->K, c->last_w_max,
+                     (int64_t)(path->cwnd - c->last_w_max));
+}
+
 struct quic_cc_algo quic_cc_algo_cubic = {
        .type        = QUIC_CC_ALGO_TP_CUBIC,
        .init        = quic_cc_cubic_init,
@@ -650,4 +659,5 @@ struct quic_cc_algo quic_cc_algo_cubic = {
        .slow_start  = quic_cc_cubic_slow_start,
        .hystart_start_round = quic_cc_cubic_hystart_start_round,
        .state_trace = quic_cc_cubic_state_trace,
+       .state_cli   = quic_cc_cubic_state_cli,
 };
index a6e9cca..9cce04c 100644 (file)
@@ -303,6 +303,9 @@ static void dump_quic_full(struct show_quic_ctx *ctx, struct quic_conn *qc)
        }
 
        if (ctx->fields & QUIC_DUMP_FLD_CC) {
+               if (qc->path->cc.algo->state_cli)
+                       qc->path->cc.algo->state_cli(&trash, qc->path);
+
                chunk_appendf(&trash, "  srtt=%-4u rttvar=%-4u rttmin=%-4u ptoc=%-4u cwnd=%-6llu"
                                      " mcwnd=%-6llu sentpkts=%-6llu lostpkts=%-6llu reorderedpkts=%-6llu\n",
                              qc->path->loss.srtt, qc->path->loss.rtt_var,