From 76ff8afa2d9eb0206bc72f4e2f8ad230720dfb94 Mon Sep 17 00:00:00 2001 From: Frederic Lecaille Date: Fri, 26 Jul 2024 16:06:27 +0200 Subject: [PATCH] MINOR: quic: Add information to "show quic" for CUBIC cc. 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. --- include/haproxy/quic_cc-t.h | 1 + src/quic_cc_cubic.c | 10 ++++++++++ src/quic_cli.c | 3 +++ 3 files changed, 14 insertions(+) diff --git a/include/haproxy/quic_cc-t.h b/include/haproxy/quic_cc-t.h index 39699e450..d6fa46d65 100644 --- a/include/haproxy/quic_cc-t.h +++ b/include/haproxy/quic_cc-t.h @@ -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); }; diff --git a/src/quic_cc_cubic.c b/src/quic_cc_cubic.c index fc21aa0f5..245917d8c 100644 --- a/src/quic_cc_cubic.c +++ b/src/quic_cc_cubic.c @@ -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,6 +659,7 @@ 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, }; void quic_cc_cubic_check(void) diff --git a/src/quic_cli.c b/src/quic_cli.c index 6e9ee0c26..d5eda2e6a 100644 --- a/src/quic_cli.c +++ b/src/quic_cli.c @@ -300,6 +300,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\n" " cwnd=%-6llu mcwnd=%-6llu\n" " sentbytes=%-12llu sentbytesgso=%-12llu sentpkts=%-6llu\n"