void (*on_pkt_lost)(struct quic_cc *cc,
struct quic_tx_packet *pkt, uint32_t lost_bytes);
void (*congestion_event)(struct quic_cc *cc, uint32_t ts);
+ void (*check_app_limited)(const struct quic_cc *cc, int sent);
};
#endif /* USE_QUIC */
return p->send_quantum / p->mtu;
}
+/* Update the delivery rate sampling state about the application limitation. */
+static void bbr_check_app_limited(const struct quic_cc *cc, int sent)
+{
+ struct bbr *bbr = quic_cc_priv(cc);
+ struct quic_cc_drs *drs = &bbr->drs;
+ struct quic_cc_path *p = container_of(cc, struct quic_cc_path, cc);
+
+ if (p->in_flight >= p->cwnd) {
+ drs->is_cwnd_limited = 1;
+ }
+ else if (!sent) {
+ drs->app_limited = drs->delivered + p->in_flight;
+ if (!drs->app_limited)
+ drs->app_limited = p->mtu;
+ }
+}
+
static inline const char *bbr_state_str(struct bbr *bbr)
{
switch (bbr->state) {
.on_ack_rcvd = bbr_update_on_ack,
.congestion_event = bbr_congestion_event,
.on_pkt_lost = bbr_update_on_loss,
+ .check_app_limited = bbr_check_app_limited,
.state_cli = bbr_state_cli,
};
#include <haproxy/pool.h>
#include <haproxy/trace.h>
+#include <haproxy/quic_cc_drs.h>
#include <haproxy/quic_cid.h>
#include <haproxy/quic_conn.h>
#include <haproxy/quic_pacing.h>
TRACE_STATE("preparing data (from MUX)", QUIC_EV_CONN_TXPKT, qc);
qel_register_send(&send_list, qc->ael, frms);
sent = qc_send(qc, 0, &send_list, max_dgram);
+
+ if (pacer && qc->path->cc.algo->check_app_limited)
+ qc->path->cc.algo->check_app_limited(&qc->path->cc, sent);
+
if (sent <= 0) {
ret = QUIC_TX_ERR_FATAL;
}