feat(uring): FEC-safe GSO batching via fate tags (#17) #24
No reviewers
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
femboy/yip!24
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/uring-gso-fate-tags"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements the signed-off design in
docs/superpowers/specs/2026-07-02-uring-gso-fate-tags-design.md. Closes #17.Problem
GSO was pinned to
MAX_GSO_SEGMENTS_PER_SEND = 1because coalescing a RaptorQ object's source symbol with its own repair into oneUDP_SEGMENTsuper-skb makes a single netem drop take both → FEC can't recover (empirically: cap=8 → ~95% delivery, FAIL). So GSO was silently disabled while still paying cmsg cost.Fix
EgressDatagram { fate: u16, bytes }inyip-io::poll;Dispatch::on_tunreturns&[EgressDatagram].DataPlanesetsfate = symbol.object_id(already known at encode time — noyip-transportAPI change, no wire change).PollDriverignoresfate.UringDriverstages egress datagrams inpending_gsoacross TUN-read completions in onepoll_once;flush_pending_gsoforms batches taking at most one datagram per distinct fate per skb, so a coalesced skb never holds two symbols of one object.can_coalesce_gso_taggedis the single unit-tested correctness choke point.queue_udp_gsois now generic overAsRef<[u8]>so tagged + untagged callers share it.MAX_GSO_SEGMENTS_PER_SEND1 → 32 (now a throughput/blast-radius knob, not a correctness guard). ARQ-retransmit egress stays non-GSO (out of scope, documented).Verification
arq_recovers_bulk_lossunderYIP_USE_URING=1with GSO active → 99.3% delivery (≥98%), ARQ retransmits 132 (>0). This is the test that failed at ~95% with the naive cap bump.gso_submission_count == 0(never coalesced); distinct-fate large batch asserts chunking with a de-tautologized expected count (hardcoded literals, not the function under test); fallback test rewritten around distinct fates. yip-io (19) + yipd (36) green.🤖 Generated with Claude Code