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.
This commit is contained in:
Frederic Lecaille 2024-07-26 16:06:27 +02:00
parent 2dab1ba84b
commit 76ff8afa2d
3 changed files with 14 additions and 0 deletions

View File

@ -120,6 +120,7 @@ struct quic_cc_algo {
void (*event)(struct quic_cc *cc, struct quic_cc_event *ev); void (*event)(struct quic_cc *cc, struct quic_cc_event *ev);
void (*slow_start)(struct quic_cc *cc); void (*slow_start)(struct quic_cc *cc);
void (*state_trace)(struct buffer *buf, const 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); void (*hystart_start_round)(struct quic_cc *cc, uint64_t pn);
}; };

View 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))); 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 = { struct quic_cc_algo quic_cc_algo_cubic = {
.type = QUIC_CC_ALGO_TP_CUBIC, .type = QUIC_CC_ALGO_TP_CUBIC,
.init = quic_cc_cubic_init, .init = quic_cc_cubic_init,
@ -650,6 +659,7 @@ struct quic_cc_algo quic_cc_algo_cubic = {
.slow_start = quic_cc_cubic_slow_start, .slow_start = quic_cc_cubic_slow_start,
.hystart_start_round = quic_cc_cubic_hystart_start_round, .hystart_start_round = quic_cc_cubic_hystart_start_round,
.state_trace = quic_cc_cubic_state_trace, .state_trace = quic_cc_cubic_state_trace,
.state_cli = quic_cc_cubic_state_cli,
}; };
void quic_cc_cubic_check(void) void quic_cc_cubic_check(void)

View File

@ -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 (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" chunk_appendf(&trash, " srtt=%-4u rttvar=%-4u rttmin=%-4u ptoc=%-4u\n"
" cwnd=%-6llu mcwnd=%-6llu\n" " cwnd=%-6llu mcwnd=%-6llu\n"
" sentbytes=%-12llu sentbytesgso=%-12llu sentpkts=%-6llu\n" " sentbytes=%-12llu sentbytesgso=%-12llu sentpkts=%-6llu\n"