<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ouroboros/src/lib, branch be</title>
<subtitle>Ouroboros main repository</subtitle>
<id>https://ouroboros.rocks/cgit/ouroboros/atom?h=be</id>
<link rel='self' href='https://ouroboros.rocks/cgit/ouroboros/atom?h=be'/>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/'/>
<updated>2026-06-03T06:02:34+00:00</updated>
<entry>
<title>lib: Reclaim aged leaked ssm pool blocks</title>
<updated>2026-06-03T06:02:34+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-06-01T06:41:34+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=bdfea870024b8efd0a0bd16f8978482d8bbf9ed9'/>
<id>urn:sha1:bdfea870024b8efd0a0bd16f8978482d8bbf9ed9</id>
<content type='text'>
The reclaim_pid_from_sc() function reaped any block allocated with
refcount from a dead PID, but cross-process hand-offs can leave a
block briefly allocated by the producer while a live consumer still
holds it. This skips reclaim within SSM_POOL_RECLAIM_AGE_S (default
60s) so in-flight hand-offs survive a producer crash.

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 overflow in ssm_flow_set_notify</title>
<updated>2026-06-03T06:02:34+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-06-01T06:37:39+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=b88c120f68b0e9f779fa0071a2ad095b93d5aaf6'/>
<id>urn:sha1:b88c120f68b0e9f779fa0071a2ad095b93d5aaf6</id>
<content type='text'>
ssm_flow_set_notify wrote past the fqueue because of a missing bound
check, corrupting adjacent memory under burst. Drop redundant FLOW_PKT
when full and reserve the last slot for control events so they aren't
starved by data-plane traffic.

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: Send stream FIN in the window</title>
<updated>2026-06-01T05:43:48+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-30T17:50:50+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=9056ba37925b7ecb4b5724633b1b288ed58951bd'/>
<id>urn:sha1:9056ba37925b7ecb4b5724633b1b288ed58951bd</id>
<content type='text'>
The stream FIN was not gated on the flow control window, potentially
causing a seqno overrun if the windows was full.

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 missing newlines in hash.c</title>
<updated>2026-06-01T05:43:48+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-30T10:33:26+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=8ca71e4d4b62c05110a73c20a6aa28fa86a6fa53'/>
<id>urn:sha1:8ca71e4d4b62c05110a73c20a6aa28fa86a6fa53</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>lib: Fix FRCT seqno leak on rxm alloc failure</title>
<updated>2026-06-01T05:43:48+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-30T10:27:58+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=6d787a674797c656c71442767360810457e3d24b'/>
<id>urn:sha1:6d787a674797c656c71442767360810457e3d24b</id>
<content type='text'>
The seqno was committed before calling rxm_arm, whose malloc could
fail and silently leave the seqno without a retransmission entry. None
of the recovery paths (RTO timer, RACK, SACK-driven, NACK-driven) can
repair a slot with NULL rxm, so the gap persists until the receiver's
keepalive marks the flow dead.

This fix splits rxm_arm into rxm_alloc plus rxm_arm (post-state
install). sack_rxm_snd follows the same alloc-then-arm shape.

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 double pool_remove on tx-path failure</title>
<updated>2026-06-01T05:43:43+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-30T09:53:30+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=c3fe693a46026130cbff8906b350933c739d681e'/>
<id>urn:sha1:c3fe693a46026130cbff8906b350933c739d681e</id>
<content type='text'>
The flow_tx_spb function consumed the spb on every failure path via
ssm_pool_remove, while its caller ipcp_flow_write left the spb to its
caller on early outs, causing ssm_pool_remove to be called twice.

In Debug builds this aborts at the old_ref == 0 check.

This aligns flow_tx_spb with np1_flow_write and dt_write_packet: spb
consumed on success, retained on failure. External callers already
release on failure, so no caller-side changes outside of dev.c are
needed.

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 mixed declarations in hash.c</title>
<updated>2026-05-27T13:54:57+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-24T08:21:16+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=8ee68491daad630f5cd9168852f974633ce5ffd4'/>
<id>urn:sha1:8ee68491daad630f5cd9168852f974633ce5ffd4</id>
<content type='text'>
The contexts are not declared at the top of the function anymore after
addition of the CRC8/CRC16 variants (no implementation in libgcrypt).

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: Add FIN and receive-side linger for msg dealloc</title>
<updated>2026-05-22T06:13:50+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-21T20:49:15+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=5d0cf67a38695ebe65a0506b5c6d6c0d229a3b3e'/>
<id>urn:sha1:5d0cf67a38695ebe65a0506b5c6d6c0d229a3b3e</id>
<content type='text'>
qos_msg flows had no end-of-stream signal: a deallocating sender
relied on the peer's inactivity timers (~30 s) to notice. Worse, the
dealloc-linger path was bugged: a receiver that called flow_dealloc
would stop draining its rx_rb while the peer's tail retransmits kept
arriving. Peer retransmitted into a black hole until its own dealloc
fired, and the whole shutdown stretched takes t_a time.

Generalizes frcti_stream_fin_snd to frcti_fin_snd; for msg mode emit a
FRCT_FIN-only control packet with the FIN seqno boundary in
pci-&gt;ackno. Receiver-side frcti_rcv latches rcv_fin_seen and stores
the boundary on FRCT_FIN-without-DATA.

Fix comment on the FRCT flags.

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: Allow up to two TLPs per recovery episode</title>
<updated>2026-05-22T06:13:50+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-21T20:23:01+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=3ad96a09df9dfd8e63e494887f7ef5bc07f244b5'/>
<id>urn:sha1:3ad96a09df9dfd8e63e494887f7ef5bc07f244b5</id>
<content type='text'>
RFC 8985 §7.3 permits up to two tail loss probes before falling back
to RTO. Previously FRCP allowed exactly one TLP per episode, making
tail-loss recovery dependent on a successful first probe; if that
probe was lost the sender fell straight to slow RTO with exponential
backoff.

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: Further align FRCP with TCP RFCs</title>
<updated>2026-05-22T06:13:50+00:00</updated>
<author>
<name>Dimitri Staessens</name>
<email>dimitri@ouroboros.rocks</email>
</author>
<published>2026-05-21T19:42:57+00:00</published>
<link rel='alternate' type='text/html' href='https://ouroboros.rocks/cgit/ouroboros/commit/?id=6a8b532870cf8c642adb1b7554691cadb8be5257'/>
<id>urn:sha1:6a8b532870cf8c642adb1b7554691cadb8be5257</id>
<content type='text'>
Only the HoL slot retransmits on RTO; non-HoL slots defer and rely on
SACK/RACK fast-rxm for recovery. Matches RFC 6298 §5.4 + RFC 8985 §3
and Linux tcp_retransmit_skb(head, 1). Eliminates the spurious-RTO
storm where ~50-66% of retransmits arrived as duplicates at the peer.

Co-fixes for three latent state-machine bugs that the previous
spurious-retx mask was hiding:

  - recovery_enter: seal recovery_high at the false→true edge only
    (RFC 6582 §3.2). Previously extended on every gap-SACK, which
    trapped the sender in NewReno indefinitely once any cum-ACK fell
    behind the moving recovery_high.

  - rtt_sample_eligible: drop the in_recovery super-gate. Karn at the
    per-slot SND_RTX|SND_TLP level is already correct (matches Linux).

  - rxm_due defer interval: use base RTO, not rto&lt;&lt;rto_mul. Inheriting
    HoL's backoff parked deferred slots tens of seconds in the future.

Bring RACK reorder-window scaling into RFC 8985 §7.2 compliance:
reo_wnd_mult widens at most once per RTT, gated via a srtt-elapsed
check in reo_wnd_on_dsack.

Stat refactor for clearer attribution: rename rxm_snd → rxm_rto (now
RTO-driven sends only), add rxm_nack and rxm_due_defer, split rxm_rcv
into total FRCT_RXM arrivals and rxm_dup_rcv (duplicates). Expose
rx/tx ring queue depths as RIB stats.

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