Branch: refs/heads/misc-bugfixes Home: https://github.com/kronosnet/kronosnet Commit: 23f34268e015b3c7e6a0f9f133a02ef24f0ab86c https://github.com/kronosnet/kronosnet/commit/23f34268e015b3c7e6a0f9f133a02e... Author: Fabio M. Di Nitto fdinitto@redhat.com Date: 2026-05-22 (Fri, 22 May 2026)
Changed paths: M libknet/handle_api.c M libknet/host.c M libknet/internals.h M libknet/threads_rx.c M libknet/threads_tx.c M libknet/transport_common.c M libknet/transport_common.h
Log Message: ----------- libknet: add MSG_EOR support for SOCK_SEQPACKET socketpairs
Detected on FreeBSD 15 which changed SOCK_SEQPACKET from atomic datagrams to stream sockets with record markers. This exposed a bug in knet: we were not using MSG_EOR to mark record boundaries as required by the SOCK_SEQPACKET specification (documented in both Linux and FreeBSD man pages).
Without MSG_EOR, multiple records can coalesce into single reads, breaking packet boundaries.
Signed-off-by: Fabio M. Di Nitto fabbione@kronosnet.org Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Commit: 03473bb4e77caf6b4a1890a0dd1d1cf9f9f7fe0e https://github.com/kronosnet/kronosnet/commit/03473bb4e77caf6b4a1890a0dd1d1c... Author: Fabio M. Di Nitto fdinitto@redhat.com Date: 2026-05-22 (Fri, 22 May 2026)
Changed paths: M libknet/host.c
Log Message: ----------- libknet: fix defragmentation buffer reclamation using wrong sequence number
The defragmentation buffer reclamation was using the old received sequence number (dst_seq_num) instead of the current packet's sequence number to calculate the valid buffer window.
This caused buffers to be reclaimed based on stale sequence information, potentially freeing buffers that should still be valid or keeping buffers that should be reclaimed.
Signed-off-by: Fabio M. Di Nitto fdinitto@redhat.com Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Commit: 18fbc19b9416d836f0c04e34d0754455c88c254d https://github.com/kronosnet/kronosnet/commit/18fbc19b9416d836f0c04e34d07544... Author: Fabio M. Di Nitto fdinitto@redhat.com Date: 2026-05-22 (Fri, 22 May 2026)
Changed paths: M libknet/host.c
Log Message: ----------- libknet: fix sequence number wraparound calculation in defragmentation
The distance calculation between sequence numbers was incorrect when wraparound occurred. The formula was backwards: it subtracted in the wrong direction and didn't account for the +1 needed for modular arithmetic.
This caused incorrect buffer reclamation decisions near the SEQ_MAX boundary.
Practical examples (SEQ_MAX = 65535):
Example 1 - Normal case (no wraparound): Last packet: dst_seq_num = 1000 New packet: seq_num = 1005 Expected distance: 5
BEFORE (wrong): seq_dist = dst_seq_num - seq_num = 1000 - 1005 = -5 (negative!)
AFTER (correct): seq_dist = seq_num - dst_seq_num = 1005 - 1000 = 5
Example 2 - Wraparound case: Last packet: dst_seq_num = 65534 New packet: seq_num = 3 (wrapped around) Expected distance: 5 (65534→65535→0→1→2→3)
BEFORE (wrong): seq_dist = (SEQ_MAX - seq_num) + dst_seq_num seq_dist = (65535 - 3) + 65534 = 131066 (huge wrong number!)
AFTER (correct): seq_dist = (SEQ_MAX - dst_seq_num) + seq_num + 1 seq_dist = (65535 - 65534) + 3 + 1 = 5
The +1 accounts for the transition from 65535→0 being one step, not zero.
Verification that circular buffer cleaning is not broken:
The seq_dist value is used to determine whether the new packet is: a) Within the circular buffer window (seq_dist < KNET_CBUFFER_SIZE) b) Far enough to require full buffer clear (seq_dist > threshold) c) Should trigger incremental cleaning (fall through case)
Test case 1 - Normal sequential packet: dst_seq_num = 1000, seq_num = 1005, expected distance = 5
BEFORE: seq_dist = -5 (unsigned overflow ~65530) → Incorrectly clears entire buffer for normal sequential packets!
AFTER: seq_dist = 5 → Correctly identifies packet as within buffer window, no clearing needed
Test case 2 - Wraparound (close distance): dst_seq_num = 65534, seq_num = 3, expected distance = 5
BEFORE: seq_dist = 131066 → Falls through to circular buffer cleaning code incorrectly
AFTER: seq_dist = 5 → Correctly identifies packet as within buffer window
Test case 3 - Large jump requiring buffer clear: dst_seq_num = 1000, seq_num = 50000, expected distance = 49000
BEFORE: seq_dist = -49000 (unsigned ~16536) → Clears buffer (correct by accident)
AFTER: seq_dist = 49000 → Clears buffer (correct by design)
The circular buffer cleaning code (lines 673-684) uses seq_num and dst_seq_num directly via modulo operations to find buffer positions. It does not use seq_dist for position calculations, only for the threshold check to determine whether to run. The fix corrects the threshold logic without affecting the position calculations.
Signed-off-by: Fabio M. Di Nitto fdinitto@redhat.com Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Commit: a63f9768576d88e14bb53dd733445817199fb82d https://github.com/kronosnet/kronosnet/commit/a63f9768576d88e14bb53dd7334458... Author: Fabio M. Di Nitto fdinitto@redhat.com Date: 2026-05-22 (Fri, 22 May 2026)
Changed paths: M libknet/tests/Makefile.am A libknet/tests/int_seq_wraparound_stress.c
Log Message: ----------- [tests] add comprehensive sequence number wraparound stress test
Add new int_seq_wraparound_stress test that exercises sequence number wraparound and defragmentation buffer management with realistic packet loss scenarios.
Test scenarios:
1. Normal sequential packets with occasional loss 2. Wraparound boundary (65535->0) with packet loss 3. Large sequence jumps (>KNET_CBUFFER_SIZE) triggering buffer clearing 4. Out-of-order fragment delivery within same sequence number 5. Out-of-order complete packet delivery (different sequence numbers) 6. Extreme packet loss beyond receive window 7. Wraparound with extreme loss (>KNET_CBUFFER_SIZE gap) 8. Wraparound stress with multiple cycles and duplicate detection 9. Fragment corruption across wraparound (historical bug regression test)
Signed-off-by: Fabio M. Di Nitto fabbione@kronosnet.org Co-Authored-By: Claude Sonnet 4.5 noreply@anthropic.com
Compare: https://github.com/kronosnet/kronosnet/compare/9f5620923387...a63f9768576d
To unsubscribe from these emails, change your notification settings at https://github.com/kronosnet/kronosnet/settings/notifications