<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ouroboros, branch 0.24.0</title>
<subtitle>Ouroboros main repository</subtitle>
<id>https://ouroboros.rocks/cgit/ouroboros/atom?h=0.24.0</id>
<link rel='self' href='https://ouroboros.rocks/cgit/ouroboros/atom?h=0.24.0'/>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/'/>
<updated>2026-07-19T09:44:36+00:00</updated>
<entry>
<title>ipcpd: Remove mutex on DT stats</title>
<updated>2026-07-19T09:44:36+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-11T13:12:47+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=736de20b2b152c6124f5de1d1f4b9fb810119847'/>
<id>urn:sha1:736de20b2b152c6124f5de1d1f4b9fb810119847</id>
<content type='text'>
There was a bug where the flow's stat mutex was zero'd while
held. Removed the mutex alltogether; use stamp != 0 as the validity
guard of the flow stats while reading stats.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>ipcpd: Add congestion avoidance unit tests</title>
<updated>2026-07-19T09:44:36+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-05T17:00:03+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=37fed06ef3f9ee395c671d91b3312679aeb4e6f1'/>
<id>urn:sha1:37fed06ef3f9ee395c671d91b3312679aeb4e6f1</id>
<content type='text'>
Cover the shared per-aggregate contexts, the mb-ecn policy and the
link capacity estimator.

The controller tests pin the invariants of the algorithm: the first
mark is reported immediately, the receiver's congestion mean is
independent of packet rate and its window adapts to hold a fixed
sample count, increase and decrease are invariant under control
cadence, a starved sender still cuts and later recovers, signals age
out on rate-relative horizons, capacity feedback derives the rate
floor and recovery slope with clamps and a staleness fallback, and
the pacer bounds the burst after idle.

The estimator tests drive synthetic arrival traces: the capacity code
survives a round trip within its resolution, hops combine by MIN,
busy-period drain measures the link rate, windows extend on slow
links, sparse idle observations are tolerated where unsaturated
windows are rejected, shaped links measure at the shaped rate, stale
windows are discarded, and windows bordering an empty queue can only
lower the estimate.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>ipcpd: Rework congestion avoidance</title>
<updated>2026-07-19T09:44:36+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-05T16:58:37+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=d050aea4cd892d71ed7fc78b6c6149a7231db5fc'/>
<id>urn:sha1:d050aea4cd892d71ed7fc78b6c6149a7231db5fc</id>
<content type='text'>
Congestion avoidance is a property of the layer, orthogonal to ARQ
and to flow control: FRCP retransmits and lets the peer pace the
sender, per flow, end-to-end; the IPCP paces path aggregates. Each
signal means one thing: a loss triggers a retransmission, a mark
means congestion, the peer window means a slow receiver. Every flow
is paced by the same rate law whatever its QoS, so a greedy raw
sender shares a bottleneck fairly with a reliable stream.

The unit of control is the (destination address, QoS cube)
aggregate: all flows toward that destination share one controller
and one rate; a start-time fair-queuing pacer divides the rate
across them by deadline instead of blocking the send path, and a
new flow rides the aggregate's estimates at its current rate, with
no probing of its own. Slow start runs once per aggregate.

The congestion signal is a multi-bit magnitude: forwarders mark
packets with their standing queue depth, MAX-combined across hops,
so a packet carries the deepest queue on its path. The receiver
feeds back a time-integral mean over a window that adapts to the
flow's byte rate, measuring a slow flow with the same fidelity as a
fast one. The sender runs AIMD scaled by elapsed wall-clock time,
which makes the steady-state allocation RTT-independent.

The PCI gains one byte: the path capacity as a quarter-log2 code.
Forwarders estimate their egress rate from busy-period drain and
MIN-stamp the byte, the receiver returns the window minimum with
its feedback, and the sender scales its rate floor and additive
slope to the bottleneck (C / 32). A deep cut implies a backlogged
bottleneck and a backlogged bottleneck advertises its capacity, so
the scaled floor is live exactly when recovery needs it: the probe
heals a halving in seconds at any link rate, and the floor bounds
the deepest hole to a factor 32 below the bottleneck.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>tools: Raise ocbr server thread pool to 64</title>
<updated>2026-07-19T09:44:36+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-05T16:50:02+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=573b4798008555b0776c1d3699d13bfad36cbbd0'/>
<id>urn:sha1:573b4798008555b0776c1d3699d13bfad36cbbd0</id>
<content type='text'>
10 threads is not enough to deeply test congestion avoidance.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>irmd: Fix congestion config from file</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-11T04:59:37+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=8ca3d5727ffd9daea27c0418d685aa31608613bd'/>
<id>urn:sha1:8ca3d5727ffd9daea27c0418d685aa31608613bd</id>
<content type='text'>
The configfile logic was matching "lfa" instead of "mb-ecn".

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>irmd: Reject rekey without KEX config</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-10T19:27:15+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=8bebdf2e3e3a4ead8a728f0a594e8592457660b7'/>
<id>urn:sha1:8bebdf2e3e3a4ead8a728f0a594e8592457660b7</id>
<content type='text'>
A rekey without KEX config should be rejected rather than downgrading
to plaintext. Tests added.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>lib: Whitespace cleanup in dev and frct</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-10T15:09:58+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=17263ccd93ba07fb32de12cfd540bd531f23bef2'/>
<id>urn:sha1:17263ccd93ba07fb32de12cfd540bd531f23bef2</id>
<content type='text'>
Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>tools: Key oftp cleanup on path arguments</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-10T15:09:58+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=8228212b0c4e1fe313d0a171f61fd103554bf5ab'/>
<id>urn:sha1:8228212b0c4e1fe313d0a171f61fd103554bf5ab</id>
<content type='text'>
The cleanup guards compared the stream against the stdin/stdout
globals, which tripped the clang static analyzer.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>irmd: Fix oap_test suppression list</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-10T15:09:58+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=eeea0006825ac404e20656e148c2db47b454dd6a'/>
<id>urn:sha1:eeea0006825ac404e20656e148c2db47b454dd6a</id>
<content type='text'>
he crypto-disabled branch of the test driver referenced two tests that
were folded into test_oap_ts_reject_all() and missed newer ones.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
<entry>
<title>lib: Fix crypt_test without crypto backend</title>
<updated>2026-07-19T09:44:35+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-07-10T15:09:58+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=669383b4afac1f0a72c3c1106f1b6d61abc16e78'/>
<id>urn:sha1:669383b4afac1f0a72c3c1106f1b6d61abc16e78</id>
<content type='text'>
Creating a context without OpenSSL fails (returns NULL) after adding
the key rotation logic (requires HKDF). Assert instead that context
creation returns NULL without OpenSSL.

Signed-off-by: Dimitri Staessens &lt;dimitri@ouroboros.rocks&gt;
Signed-off-by: Sander Vrijders &lt;sander@ouroboros.rocks&gt;
</content>
</entry>
</feed>
