summaryrefslogtreecommitdiff
path: root/src/tools/irm/irm_ipcp_bootstrap.c
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2026-07-21 06:54:55 +0200
committerSander Vrijders <sander@ouroboros.rocks>2026-07-22 09:04:47 +0200
commit3388bd9e9b82df6d7fe79fa4eee7c22a3277624e (patch)
tree2c7d17a5d793f91b43b08d891bfc2a8bfdcef067 /src/tools/irm/irm_ipcp_bootstrap.c
parent1ee9c1cfb5ecffbf4766a6c05d333dab712f4e77 (diff)
downloadouroboros-3388bd9e9b82df6d7fe79fa4eee7c22a3277624e.tar.gz
ouroboros-3388bd9e9b82df6d7fe79fa4eee7c22a3277624e.zip
ipcpd: Add flow overshoot protection to mb-ecntestingbe
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/tools/irm/irm_ipcp_bootstrap.c')
-rw-r--r--src/tools/irm/irm_ipcp_bootstrap.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/tools/irm/irm_ipcp_bootstrap.c b/src/tools/irm/irm_ipcp_bootstrap.c
index de73b076..cc8bf8fa 100644
--- a/src/tools/irm/irm_ipcp_bootstrap.c
+++ b/src/tools/irm/irm_ipcp_bootstrap.c
@@ -105,7 +105,8 @@ static char * usage_str = \
" [Data Transfer Constants]\n"
" [addr <address size> (default: %d)]\n"
" [eid <eid size> (default: %d)]\n"
- " [ttl <max time-to-live>, default: %d)]\n\n"
+ " [ttl <max time-to-live>, default: %d)]\n"
+ " [rtt <max layer RTT in ms> (default: %d)]\n\n"
"if DIRECTORY_POLICY == " DHT_DIR "\n"
" [dht_alpha <search factor> (default: %u)]\n"
" [dht_k <replication factor> (default: %u)]\n"
@@ -152,7 +153,7 @@ static void usage(void)
/* unicast */
FLAT_RANDOM, DHT_DIR, SHA3_256, LINK_STATE, MB_ECN_CA,
/* dt */
- DT(addr_size), DT(eid_size), DT(max_ttl),
+ DT(addr_size), DT(eid_size), DT(max_ttl), DT(max_rtt),
/* dht */
DHT(alpha), DHT(k), DHT(t_expire),
DHT(t_refresh), DHT(t_replicate),
@@ -184,6 +185,7 @@ int do_bootstrap_ipcp(int argc,
uint8_t addr_size = DT(addr_size);
uint8_t eid_size = DT(eid_size);
uint8_t max_ttl = DT(max_ttl);
+ uint16_t max_rtt = DT(max_rtt);
struct routing_config routing = default_routing_config;
enum pol_addr_auth addr_auth_type = UNI(addr_auth_type);
enum pol_cong_avoid cong_avoid = UNI(cong_avoid);
@@ -250,6 +252,8 @@ int do_bootstrap_ipcp(int argc,
eid_size = atoi(*(argv + 1));
} else if (matches(*argv, "ttl") == 0) {
max_ttl = atoi(*(argv + 1));
+ } else if (matches(*argv, "rtt") == 0) {
+ max_rtt = atoi(*(argv + 1));
} else if (matches(*argv, "port") == 0) {
port4 = atoi(*(argv + 1));
port6 = port4;
@@ -422,6 +426,7 @@ int do_bootstrap_ipcp(int argc,
conf.unicast.dt.addr_size = addr_size;
conf.unicast.dt.eid_size = eid_size;
conf.unicast.dt.max_ttl = max_ttl;
+ conf.unicast.dt.max_rtt = max_rtt;
conf.unicast.dt.routing = routing;
conf.unicast.addr_auth_type = addr_auth_type;
conf.unicast.cong_avoid = cong_avoid;