Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The ring's sends carried only UDP_SEGMENT and its receives only UDP_GRO, so a relay on the io_uring runtime never marked ECT(0) and never read a mark back; the peer's ACKs carried no ECN counts and noq disabled ECN on the first one. TxBuf::send takes a Transmit with the codepoint, the socket enables IP_RECVTOS and IPV6_RECVTCLASS, and Packet::ecn reports what arrived. The noq and quinn adapters pass it both ways; quiche has no ECN API and sends unmarked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kixelated
force-pushed
the
quest/m2/quic/ecn-uring
branch
from
September 20, 2026 19:54
b8297f7 to
220c91f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes and deletes
quest/m2/quic/ecn-uring.md;ecn-measure.mdbecomes ready andecn.md(L4S) drops the blocker.rs/moq-uring/src/udp.rscarried onlyUDP_SEGMENTon send andUDP_GROon receive, so a relay on the io_uring runtime never marked ECT(0) and never read a mark back. The peer's ACKs carried no ECN counts and noq-proto disabled ECN on the first one.noq-udpalready did this right; this brings the ring's path level with it.udp::Ecn(Ect0/Ect1/Ce, same bits as noq'sEcnCodepoint) andudp::Transmit { to, len, segment, ecn };TxBuf::sendtakes the struct instead of growing to four arguments.IP_TOS(v4 or v4-mapped destination) orIPV6_TCLASSbesideUDP_SEGMENTin the same control buffer, so a GSO train marks every segment.IP_RECVTOSand, on a v6 socket,IPV6_RECVTCLASStoo (Linux reports a v4-mapped datagram's mark asIP_TOS). Failure is an error, not a warning.gro_stridebecomes aRecvMetawalk over every control message;Packet::ecn()reports the mark (GRO only coalesces datagrams with the same TOS, so one per completion is exact).Transmit::ecnat both send sites andPacket::ecn()into bothEndpoint::handlecalls. quiche has no ECN API; its callers send unmarked.Regression
rs/moq-uring/tests/ecn.rs: a worker socket pair round-trips ECT(0) over v4 and v6 as a lone datagram, a GSO train, and with GRO/GSO/multishot off; CE survives; an unmarked send reads backNone. Fails onmain(no cmsg either way). Runs in the existingrs uringnightly lane and skips loudly below the kernel floor like its siblings.Verification
cargo clippy -p moq-uring --lib --target x86_64-unknown-linux-gnu -D warningspasses cross-compiled from macOS for thenoq,quinn, andqlogfeature sets. The test targets cannot be cross-checked from macOS (boring-sys bindgen needs Linux libc headers), so the tests have not run yet; they need a Linux 6.12+ box:just rs uring.Public API and wire impact
moq-uringis 0.0.1 and unpublished.udp::TxBuf::sendsignature changes,udp::Ecn,udp::Transmit, andudp::Packet::ecnare new. No wire, config, or doc change; a relay's packets now carry ECT(0) on the io_uring runtime, as they already did on tokio.🤖 Generated with Claude Code
(written by Claude Opus 5)