Changes for version 0.01 - 2026-09-29
- First stable CPAN release.
- Add a real localhost UDP Driver loopback test using kernel UDP sockets.
- Treat peer stream-limit exhaustion as normal flow control: open_bidi_stream and open_uni_stream now return undef instead of throwing when the current peer limit is exhausted.
- Add Connection->on_stream_available for bidi/uni stream-credit recovery.
- Replenish peer MAX_STREAMS credit when peer-opened streams close.
- Add Connection->close_info with structured application, transport, TLS, certificate, handshake, idle, and drop outcomes.
- Keep local programming/configuration/internal failures as Perl exceptions.
- Send the proper QUIC CONNECTION_CLOSE for locally detected protocol and TLS failures when the connection state permits it.
- Add Stream->local_reset_code alongside remote_reset_code.
- Make transport policy explicit with the optional transport hash.
- Default to a 10 second handshake timeout, 30 second idle timeout, 1 MiB connection receive window, 256 KiB stream receive window, and 100 initial bidi/uni peer streams.
- Advertise active migration as disabled until migration support is implemented and tested.
- Add destructive lifecycle coverage for Driver, Endpoint, Connection, and Stream destruction order, Driver backpressure during close, staggered multi-connection retirement, CID cleanup, timer cleanup, and native stream cleanup.
- Rewrite README and top-level POD around the simpler public model: Driver -> Connection -> Stream, with Endpoint documented as the low-level escape hatch.
- Add examples for Linux::Event, AnyEvent, IO::Async, Mojo::IOLoop, and EV.
- Add a second IO::Async example using Future::AsyncAwait for sequential application flow without changing the callback-based Driver integration.
- Add a core IO::Select QUIC echo server for running the client examples.
- Compile and run the event-loop examples in CI on the current Perl job.
- Require concrete local IPv4/IPv6 addresses at the QUIC path boundary; reject wildcard bind addresses 0.0.0.0 and ::.
- Document packet-info/source-address requirements for wildcard-bound UDP adapters and keep those OS-specific socket operations outside Net::QUIC.
- Make the simple IO::Select echo server reject wildcard binds rather than demonstrating an incorrect QUIC path.
- Add missing_features.md to track the remaining canonical QUIC features and standardized extensions not yet exposed by Net::QUIC.
Changes for version 0.001_002 - 2026-09-27
- Require Alien::ngtcp2 0.03 and use its fixed Picotls QUIC TLS path.
- Remove the OpenSSL, GnuTLS, BoringSSL, and wolfSSL backend branches.
- Install Alien::ngtcp2 0.03 from CPAN in the full CI matrix.
- Add a private server Connection path and an in-memory client/server QUIC/TLS handshake proof for development testing.
- Add the first real client QUIC endpoint.
- Separate the event-loop Endpoint object from the application-facing Connection object before server support is added.
- Add the event-loop integration boundary: receive_datagram, next_datagram, timeout_after, and handle_timeout.
- Add Net::QUIC::Datagram for outbound UDP payload and path data.
- Generate a real QUIC Initial packet in the native test suite.
- Keep UDP sockets and timers outside Net::QUIC.
- Use Perl's allocator for endpoint-owned native memory so threaded Windows Perl does not cross C runtime heaps.
- Recognize MinGW's WIN32 define for the Windows monotonic clock path.
- Add Net::QUIC::Stream with local bidirectional and unidirectional stream opening, incoming stream discovery, send, receive, FIN, and reset.
- Replace the one-stream proof storage with independent per-stream receive and transmit queues.
- Keep transmitted stream bytes immutable until ngtcp2 acknowledges them or closes the stream.
- Return QUIC receive flow-control credit when application data is consumed.
- Schedule pending streams round-robin when producing UDP datagrams.
- Make the in-memory handshake and stream tests honor positive QUIC pacing timers instead of depending on CPU timing.
- Test concurrent streams, unidirectional streams, FIN, and reset across the full portability matrix.
- Add the first multi-connection server Endpoint.
- Route server packets by QUIC destination connection ID and track connection IDs issued and retired by ngtcp2.
- Add next_connection for pulling newly created server Connections.
- Aggregate all server Connection timers behind the same Endpoint timer.
- Schedule outbound server datagrams fairly across managed Connections.
- Test two simultaneous clients, handshakes, short-header routing, and streams through one server Endpoint.
- Add a stateless server front door before Connection allocation.
- Send Version Negotiation for unsupported QUIC versions.
- Add optional Retry/address validation with validate_address.
- Generate authenticated Retry tokens bound to the peer socket address.
- Carry verified original destination and Retry connection IDs into the server transport parameters.
- Reject Retry-token replay from a different peer address without creating Connection state.
- Test a complete Retry handshake and stream exchange.
- Verify client server certificates by default through Picotls and OpenSSL.
- Verify DNS names and IP addresses against the required server_name.
- Use OpenSSL default trust locations and allow ca_file to add a private PEM trust anchor.
- Reject untrusted certificates and trusted certificates with the wrong host name.
- Keep certificate verification mandatory; no skip-verification switch is exposed.
- Add Connection close and closed lifecycle methods.
- Keep closing and draining Connections alive for the QUIC 3-PTO wait.
- Retire idle-closed and dropped Connections without leaving Endpoint state.
- Remove retired server Connections from the managed connection list, pending accept queue, and every CID route.
- Ignore replayed packets for retired connection IDs instead of recreating a Connection.
- Reuse the existing transmit buffer for CONNECTION_CLOSE so retirement does not add another large per-Connection packet buffer.
- Test close, draining, timer retirement, CID cleanup, and retired-CID replay across the portability matrix.
- Load server certificate and private-key state once per server Endpoint.
- Share one Picotls server credential context across accepted Connections.
- Keep each Connection's Picotls session independent while retaining the shared context for the Connection lifetime.
- Stop reopening and reparsing certificate/key files for every new client.
- Fail invalid server credential paths when Endpoint->server is constructed.
- Test two handshakes after the original credential files have been deleted.
- Test that a server Connection safely retains the shared TLS object after the caller's original reference is released.
- Add Stateless Reset handling for sufficiently large unknown short-header packets without allocating new Connection state.
- Derive server reset tokens from the Endpoint-private secret and each server-issued connection ID, including the initial server connection ID.
- Drop unknown long-header packets and undersized short-header packets instead of resetting them.
- Keep Stateless Reset responses smaller than their triggering packets.
- Test unknown connection IDs, complete server connection-state loss, and normally retired connection IDs, including client recognition of the advertised reset token.
- Reclaim closed native stream state once no Perl Stream object or pending incoming-stream queue entry needs it.
- Keep closed stream status and buffered receive data available for the lifetime of the public Stream object.
- Test ownership transfer from the pending incoming-stream queue to a returned Stream object and verify native stream counts return to zero.
- Split large Stream send buffers into fixed-size native transmit chunks.
- Release fully acknowledged leading chunks without waiting for the entire original send call to be acknowledged.
- Keep chunk creation atomic so allocation failure cannot queue a partial application send.
- Test partial ACK-driven memory release while later chunks are still buffered, along with exact byte ordering and FIN behavior.
- Add Net::QUIC::Driver as the recommended event-loop adapter boundary.
- Reduce ordinary adapters to start, receive, timeout, and writable events plus send and set_timeout callbacks.
- Keep Endpoint's four primitive integration methods as the low-level API.
- Move Endpoint output draining, backpressure pause/resume, and timeout replacement rules into Driver so adapters do not reproduce them.
- Notify Driver automatically after application operations that can change QUIC output state, including Stream send/finish/reset/data consumption and Connection close.
Changes for version 0.001_001 - 2026-09-27
- Begin the Net::QUIC implementation.
- Require Alien::ngtcp2 0.02.
- Link XS against libngtcp2 and the TLS helper selected by Alien::ngtcp2.
- Add native ngtcp2 version and crypto backend diagnostics.
- Add a small native crypto self-test.
- Keep the library event-loop neutral.
Documentation
Modules
QUIC transport for Perl
one QUIC connection
UDP datagram produced by Net::QUIC
simple event-loop integration for Net::QUIC
low-level QUIC transport boundary
one QUIC byte stream