diff options
| author | Dimitri Staessens <dimitri@ouroboros.rocks> | 2026-07-21 06:54:55 +0200 |
|---|---|---|
| committer | Sander Vrijders <sander@ouroboros.rocks> | 2026-07-22 09:04:47 +0200 |
| commit | 3388bd9e9b82df6d7fe79fa4eee7c22a3277624e (patch) | |
| tree | 2c7d17a5d793f91b43b08d891bfc2a8bfdcef067 /src/ipcpd/unicast/ca.h | |
| parent | 1ee9c1cfb5ecffbf4766a6c05d333dab712f4e77 (diff) | |
| download | ouroboros-3388bd9e9b82df6d7fe79fa4eee7c22a3277624e.tar.gz ouroboros-3388bd9e9b82df6d7fe79fa4eee7c22a3277624e.zip | |
The ECN marks were the only source of congestion information, and
going into congestion collapse (dropping a lot of ECN packets and
causing loss of signal) was unrecoverable.
The sender's slow-start ramp clock now tracks a measured RTT to avoid
overshooting into congestion collapse on the previously fixed (14ms)
doubling on long-delay (e.g. 100ms) links.
The flow allocator now carries a periodic heartbeat/ack to keep RTT
estimates up-to-date. The heartbeat also serves as a congestion
collapse detector: consecutive heartbeat losses will go into loss
recovery, halving the window and pausing Additive Increase until the
path is clear. The DT component now has a max_rtt config parameter that
serves as a hint for the layer RTT to optimize slow-start for
low-latency networks.
These two mechanisms follow TCP, however only during slow start up to
the first ECN signal and to recover from a total collapse until the
ECN signal returns. MB-ECN is still fully RTT-independent in the AI/PD
region. A shorter RTT path will just reach its equal fair share faster
than a longer RTT path.
Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/ipcpd/unicast/ca.h')
| -rw-r--r-- | src/ipcpd/unicast/ca.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/ipcpd/unicast/ca.h b/src/ipcpd/unicast/ca.h index d73d35f5..fc6de445 100644 --- a/src/ipcpd/unicast/ca.h +++ b/src/ipcpd/unicast/ca.h @@ -29,7 +29,11 @@ #include <stdbool.h> #include <sys/types.h> -int ca_init(enum pol_cong_avoid ca); +/* Buffer a policy's ca_print_stats output must fit in. */ +#define CA_STATS_STRLEN 2048 + +int ca_init(enum pol_cong_avoid ca, + uint32_t rtt_ms); void ca_fini(void); @@ -56,6 +60,13 @@ void ca_ctx_update_ece(void * ctx, uint16_t ece, uint8_t cap); +bool ca_ctx_hb_due(void * ctx, + uint64_t now); + +void ca_ctx_rtt(void * ctx, + uint64_t now, + uint64_t rtt); + int ca_calc_ecn(size_t queued, uint8_t * ecn, qoscube_t qc, |
