From: Frédéric Lécaille Date: Fri, 31 Mar 2023 13:21:55 +0000 (+0200) Subject: MINOR: quic: Add a fake congestion control algorithm named "nocc" X-Git-Tag: v2.8-dev7~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db4bc6b4f3bae81944a828f8a872bae64bc27b46;p=thirdparty%2Fhaproxy.git MINOR: quic: Add a fake congestion control algorithm named "nocc" This algorithm does nothing except initializing the congestion control window to a fixed value. Very smart! Modify the QUIC congestion control configuration parser to support this new algorithm. The congestion control algorithm must be set as follows: quic-cc-algo nocc-= 6 && strncmp(arg, "nocc-", 5) == 0) { + if (!experimental_directives_allowed) { + ha_alert("'%s' algo is experimental, must be allowed via a global 'expose-experimental-directives'\n", arg); + return ERR_ALERT | ERR_FATAL; + } + + cc_algo = &quic_cc_algo_nocc; + quic_cc_nocc_fixed_cwnd = atoi(arg + 5); + } else { memprintf(err, "'%s' : unknown control congestion algorithm", args[cur_arg]); return ERR_ALERT | ERR_FATAL; diff --git a/src/quic_cc_nocc.c b/src/quic_cc_nocc.c new file mode 100644 index 0000000000..27db350240 --- /dev/null +++ b/src/quic_cc_nocc.c @@ -0,0 +1,79 @@ +/* + * Fake congestion control algorithm which does nothing except initializing + * the congestion control window to a fixed value. + * + */ + +#include +#include +#include + +#define TRACE_SOURCE &trace_quic + +unsigned int quic_cc_nocc_fixed_cwnd; + +static int quic_cc_nocc_init(struct quic_cc *cc) +{ + struct quic_path *path; + + path = container_of(cc, struct quic_path, cc); + path->cwnd = quic_cc_nocc_fixed_cwnd << 10; + return 1; +} + +static void quic_cc_nocc_slow_start(struct quic_cc *cc) +{ +} + +/* Slow start callback. */ +static void quic_cc_nocc_ss_cb(struct quic_cc *cc, struct quic_cc_event *ev) +{ + TRACE_ENTER(QUIC_EV_CONN_CC, cc->qc); + TRACE_PROTO("CC nocc", QUIC_EV_CONN_CC, cc->qc, ev, cc); + TRACE_LEAVE(QUIC_EV_CONN_CC, cc->qc); +} + +/* Congestion avoidance callback. */ +static void quic_cc_nocc_ca_cb(struct quic_cc *cc, struct quic_cc_event *ev) +{ + TRACE_ENTER(QUIC_EV_CONN_CC, cc->qc); + TRACE_PROTO("CC nocc", QUIC_EV_CONN_CC, cc->qc, ev, cc); + TRACE_LEAVE(QUIC_EV_CONN_CC, cc->qc); +} + +/* Recovery period callback. */ +static void quic_cc_nocc_rp_cb(struct quic_cc *cc, struct quic_cc_event *ev) +{ + TRACE_ENTER(QUIC_EV_CONN_CC, cc->qc); + TRACE_PROTO("CC nocc", QUIC_EV_CONN_CC, cc->qc, ev, cc); + TRACE_LEAVE(QUIC_EV_CONN_CC, cc->qc); +} + +static void quic_cc_nocc_state_trace(struct buffer *buf, const struct quic_cc *cc) +{ + struct quic_path *path; + + path = container_of(cc, struct quic_path, cc); + chunk_appendf(buf, " cwnd=%llu", (unsigned long long)path->cwnd); +} + +static void (*quic_cc_nocc_state_cbs[])(struct quic_cc *cc, + struct quic_cc_event *ev) = { + [QUIC_CC_ST_SS] = quic_cc_nocc_ss_cb, + [QUIC_CC_ST_CA] = quic_cc_nocc_ca_cb, + [QUIC_CC_ST_RP] = quic_cc_nocc_rp_cb, +}; + +static void quic_cc_nocc_event(struct quic_cc *cc, struct quic_cc_event *ev) +{ + return quic_cc_nocc_state_cbs[cc->algo->state](cc, ev); +} + +struct quic_cc_algo quic_cc_algo_nocc = { + .type = QUIC_CC_ALGO_TP_NOCC, + .init = quic_cc_nocc_init, + .event = quic_cc_nocc_event, + .slow_start = quic_cc_nocc_slow_start, + .state_trace = quic_cc_nocc_state_trace, +}; +