v0.9.1
Fixed
- The SNI gate no longer costs every admitted handshake a probe timeout. Only a client's first Initial packets are keyed by their own Destination Connection ID; once the server has answered, the client addresses it by the connection ID the server chose (RFC 9000 §7.2) while its Initial keys stay those of the first packet (RFC 9001 §5.2). v0.9.0 refused the client's acknowledgement of the server's Initial as a forgery it could not open and blinded its datagram, and the Handshake packet carrying the client's Finished usually rides in that same datagram, so with
expected_sniset every handshake waited for the client to retransmit and the server never took an Initial RTT sample. Such a packet now passes; nothing that is not one of them gets further, because quinn cannot open it either and drops it without a reply. Only servers withexpected_sniset were affected; the default empty list was never touched by it.
Testing
- Two unit tests craft a 1200-byte Initial with quinn's own Initial keys: one keyed by its Destination Connection ID opens and is judged by the name it carries, proving the construction; one addressed to the server's connection ID but keyed by the client's first is passed, and turns red when the refusal comes back. quinn's own client does not coalesce those two packets on loopback, which is why the on-wire suite had stayed green.
- Cross-implementation interop (masque-go + aioquic) and the full suite were re-run against this tree before tagging, both green with a clean server log.
Upgrading: nothing to do. If you set expected_sni on v0.9.0 and saw handshakes take an extra round trip, or every connection logging rtt_ms equal to initial_rtt_ms, this release is the fix.
Static musl builds for x86_64 and aarch64. Verify with SHA256SUMS.
Each archive carries the binary, LICENSE, README.md and the script/ and docs/ directories. Installing and updating is described in docs/deployment.md.
Full Changelog: v0.9.0...v0.9.1