Description On Windows, the OS reports the fate of a previously sent UDP datagram against the **next `recv`** on that socket. A send to a port with no listener draws an ICMP port-unreachable, reported as `WSAECONNRESET`; a send whose datagram has its TTL expire in transit draws an ICMP time-exceeded, reported as `WSAENETRESET`. We already ignore `WSAECONNRESET` on the recv path (the Rust standard library maps `WSAECONNRESET` to `io::ErrorKind::ConnectionReset which we ignore in the `EndpointDriver`). Windows provides ioctls to suppress these notifications altogether, which saves a syscall and has no downsides for us, as we never handle recv errors related to a previous send anyway. This disables both `SIO_UDP_CONNRESET` (port-unreachable / `WSAECONNRESET`) and `SIO_UDP_NETRESET` (TTL-expired / `WSAENETRESET`) in `UdpSocketState::new`. ## Notes & open questions Comes with a regression test that I confirmed to fail on Windows without the fix. It deterministically reproduces the port-unreachable (`WSAECONNRESET`) path. `SIO_UDP_CONNRESET` and `SIO_UDP_NETRESET` are ioctls, not socket options, so they go through `WSAIoctl` rather than the existing `set_socket_option`/`setsockopt` helper. `SIO_UDP_NETRESET` requires Windows 8+, and neither is implemented under Wine; a missing ioctl is logged and tolerated rather than treated as fatal. ## Change checklist - [x] Self-review. - [x] Documentation updates following the [style guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text), if relevant. - [x] Tests if relevant. - [x] All breaking changes documented. --------- Co-authored-by: Floris Bruynooghe <flub@n0.computer>
noq
General purpose implementation of the QUIC transport
protocol in pure
Rust. Noq is built as an async-friendly API in the noq crate on top
of a sans-io protocol library in noq-proto.
Noq started out as a fork of the excellent Quinn project. The main focus of development has been towards adding support for more QUIC (draft) extensions:
Features
- Easy to use futures-based async API.
- Client and server server functionality.
- 0-RTT and 0.5-RTT data support.
- Ordered and unordered stream reads.
- Custom and zero-length connection identifiers.
- Fully pluggable crypto API with a Rustls implementation using ring or aws-lc-rs provided by default for convenience.
- Broad platform support, including Linux, Windows, macOS, android, iOS and wasm.
Standards
The noq library aims to be correct implementation of various QUIC standards:
- Supports the core QUIC specifications:
- The standardised QUIC extensions:
- Draft extensions:
- qlog: Structured Logging for Network Protocols.
- QUIC Multipath.
- With experimental qlog support.
- QUIC Address Discovery (QAD).
- Using QUIC to traverse NATs (QNT).
Getting started
Examples at https://github.com/n0-computer/noq/blob/main/noq/examples
$ cargo run --example server ./
$ cargo run --example client https://localhost:4433/Cargo.toml
This launches an HTTP 0.9 server over the QUIC transport on the loopback address serving the current working directory, with the client fetching ./Cargo.toml. By default, the server generates a self-signed certificate and stores it to disk, where the client will automatically find and trust it.
License
Copyright 2025 The quinn developers Copyright 2025 N0, INC.
This project is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.