Releases: genmeta/dquic
Release list
v0.7.0-beta.4
dquic v0.7.0-beta.4
Path admissibility
- Validate concrete QUIC paths before creating connection paths or accepting connectless initial packets.
- Preserve receive-side destination and IPv6 link-local scope evidence through UDP, interface, connection, and traversal layers.
- Keep outbound wildcard-source selection owned by the selected IO while rejecting invalid direct/link, address-family, scope, and loopback combinations.
- Report only accepted direct paths and prevent invalid connectless packets from consuming listener backlog or registering ODCIDs.
Published crates
qudp 0.7.0-beta.1qinterface 0.7.0-beta.2qtraversal 0.7.0-beta.4qconnection 0.8.0-beta.1dquic 0.7.0-beta.4
Authentication and provenance
- Tag:
v0.7.0-beta.4 - Annotated tag object:
7af14b995715a1a6fbb6fca74f0cc78c2e1c3758 - Target commit:
388a3ec99837480f8fc0eed7e400aa3f12a11c3e - Workflow run: https://github.com/genmeta/dquic/actions/runs/29478110675
- Workflow attempt:
1 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.7.0-beta.3
dquic v0.7.0-beta.3
Changes
- Make interface watching opt-in through the
netwatcherfeature acrossqinterface,qconnection, anddquic. - Move
qinterfaceto the0.7.0prerelease compatibility line because its default public API no longer exposes watcher-only methods. - Keep the published transport dependency graph on one compatible
qinterfaceversion.
Published crates
qinterfacev0.7.0-beta.1qtraversalv0.7.0-beta.3qconnectionv0.7.0-beta.2dquicv0.7.0-beta.3
Unchanged workspace crates remain on their existing published versions. h3-shim remains outside the dquic release surface.
Authentication and provenance
- Tag:
v0.7.0-beta.3 - Annotated tag object:
e6002165220a9d63bd33b58ba3a157d2077f6521 - Target commit:
56a82f5a96fc38c9c54a796d057d3489fb9def68 - Workflow run: https://github.com/genmeta/dquic/actions/runs/29414289443
- Workflow attempt:
1 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.7.0-beta.2
dquic v0.7.0-beta.2
Changes
- Preserve distinct DNS resolver sources for the same peer endpoint address in
qtraversal, so source-specific NAT traversal constraints such as mDNS NIC affinity remain available. - Keep duplicate peer endpoint insertion idempotent.
- Standardize dquic tracing/logging.
- Mark prerelease tags as GitHub prereleases in release automation.
Published crates
qtraversalv0.7.0-beta.2dquicv0.7.0-beta.2
Unchanged workspace crates remain on their existing published versions. h3-shim remains outside the dquic release surface.
Authentication and provenance
- Tag:
v0.7.0-beta.2 - Annotated tag object:
54e7b4f1a4bbb9c087be3bc68dec341e247d83d6 - Target commit:
3a00b5401402209c3783d938d8575d176486c03e - Workflow run: https://github.com/genmeta/dquic/actions/runs/28780925587
- Workflow attempt:
1 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.7.0-beta.1
Beta release for the dquic transport line.
-
Correct the
qresolve::Publishabstraction boundary: publish implementations now own their wire format, packet construction, authentication, and backend-specific encoding details instead of requiring callers to construct publish packets across the trait boundary. -
Decouple the public publish contract from a specific packet format, making future backend migrations and test/mock publisher implementations easier.
-
Advance
qresolve,qtraversal,qconnection, anddquicto0.7.0-beta.1for the new resolver/transport compatibility line. -
Keep unchanged workspace members on their existing release lines.
-
qresolve 0.7.0-beta.1 -
qtraversal 0.7.0-beta.1 -
qconnection 0.7.0-beta.1 -
dquic 0.7.0-beta.1 -
crates.io via tag-triggered publish CI
Authentication and provenance
- Tag:
v0.7.0-beta.1 - Annotated tag object:
1bcd9010d287d5085953dc6f5c3973e013dae115 - Target commit:
20253cbd6c874301ec4d8ab7ca014c0390324c61 - Workflow run: https://github.com/genmeta/dquic/actions/runs/28573900151
- Workflow attempt:
1 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.6.0
dquic v0.6.0
This release moves the dquic release-surface crates to the 0.6.0 compatibility line, centered on typed local endpoints, connection-owned path discovery, and safer connection/path lifecycle handling.
Highlights:
- Added typed local endpoint publishing in qinterface, replacing the generic location-event model.
- Routed observed local endpoint sets through qconnection's AddressBook so connection path discovery remains connection-owned.
- Reworked STUN endpoint advertisement in qtraversal around keyed, owned endpoint updates.
- Preserved partial path bursts instead of dropping already-loaded burst segments on later load errors.
- Terminated invalid pathless connections more explicitly.
- Exposed attempted connection state for callers that need to distinguish pre-establishment failure states.
- Reduced eager per-path allocation and lazily initialized packet-space dispatch.
- Released dropped location observers, closed connection resources, and ready IO wakers more reliably.
- Kept interface rebinding from reusing closed IO and avoided holding interface locks while notifying device subscribers.
Compatibility notes:
- Release-surface workspace crates are bumped to 0.6.0.
- qmacro intentionally remains on 0.5.1.
- h3-shim remains on 0.5.1 and is not part of the dquic release surface.
- qconnection local endpoint compatibility APIs were removed; callers should pass Locations at subscription sites and rely on the typed endpoint flow.
Release surface:
- dquic 0.6.0
- qbase 0.6.0
- qconnection 0.6.0
- qcongestion 0.6.0
- qdatagram 0.6.0
- qevent 0.6.0
- qinterface 0.6.0
- qprotocol 0.6.0
- qrecovery 0.6.0
- qresolve 0.6.0
- qtraversal 0.6.0
- qudp 0.6.0
Full changelog: v0.5.2-qconnection...v0.6.0
Authentication and provenance
- Tag:
v0.6.0 - Annotated tag object:
86ea4e4b20d17cdc3ca9b2ea1c252e4c03a9ac98 - Target commit:
f4946d565a6788069eb40fcdac39085c67d9f528 - Workflow run: https://github.com/genmeta/dquic/actions/runs/28186217573
- Workflow attempt:
2 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.5.2-qconnection
qconnection 0.5.2
Staged member-crate release for qconnection.
This release publishes qconnection 0.5.2 only. The wider dquic workspace and dquic crate remain at 0.5.1.
Highlights
- Fixed connection close/termination cleanup paths so closing resources are finalized after PTO.
- Retained connections while closing, allowing delayed cleanup to complete reliably.
- Routed close events through connection state and termination ownership.
- Added final closed-state tracking so
Closedwaits for the real terminal state. - Preserved silent close behavior for silent refusal paths.
- Added coverage for close handoff cleanup and silent close forwarding.
Downstream Impact
Downstreams using normal Cargo version requirements can pick up this patch with:
cargo update -p qconnectionProjects depending on dquic = "0.5.1" can also receive qconnection 0.5.2 transitively, because the published dquic 0.5.1 dependency requirement for qconnection is compatible with 0.5.2.
This will not update consumers that pin qconnection = "=0.5.1" or use a git/path/patch override.
Release Automation
- The publish workflow now selects only initialized crates with missing versions, so this staged tag publishes
qconnectiononly. v*tag-triggered publish runs now create a GitHub Release automatically after the crates.io publish step succeeds.
Release Surface
- Published crate:
qconnection 0.5.2 - Tag:
v0.5.2-qconnection - Repository target branch:
main - Publish path: tag-triggered
Publish crates.ioworkflow
Full changelog: v0.5.1...v0.5.2-qconnection
Authentication and provenance
- Tag:
v0.5.2-qconnection - Annotated tag object:
5dd832e2925066377f0c993173d641670b526f3d - Target commit:
3be337954640e8c91f51b95b86823a64d3ba66a3 - Workflow run: https://github.com/genmeta/dquic/actions/runs/27701238911
- Workflow attempt:
1 - Published by: GitHub Actions
Publish crates.ioworkflow
v0.5.1
dquic v0.5.1
This release focuses on traversal correctness, interface/bind semantics,
connection lifecycle cleanup, and workspace publish readiness across the
dquic stack.
Traversal and NAT maintenance
qtraversalnow refreshes receive-side routing dependencies correctly during
reinit and interface rebind.- NAT mappings are refreshed sooner to reduce stale external-address state.
- Local endpoints are now tracked in the traversal address book.
- STUN probe handling now uses typed errors instead of looser classification.
- Traversal verification was tightened to wait explicitly for STUN data.
These changes make punching, rebinding, and long-lived traversal sessions more
predictable under interface churn and mapping refresh.
Interface and UDP bind semantics
qinterfaceno longer treats transient interface statistics (rx/tx
counters and timestamps) as meaningful interface changes.- Interface-bound UDP sockets are now bound to their devices more explicitly.
qudpnow treatsinet://[::]:PORTas strict IPv6-only behavior.
Downstreams that need dual-stack exposure should bind IPv4 and IPv6
explicitly instead of relying on an IPv6 wildcard bind to cover both.
Connection lifecycle and timers
dquic::commonno longer blocksNetwork::bindon synchronous STUN
resolution.qconnectionnow exposesArc<Connection>directly and breaks the strong
reference cycle that could keep connections alive after external owners were
dropped.qconnectionnow exposes local punch endpoints.qbaseidle-timer handling was corrected, including path-creation start
behavior and incorrect send-side renewal.- TLS terminology was normalized from
agenttoauthority. - connection auth log copy was normalized accordingly.
Resolver, protocol, and TLS surface
- a new
qprotocolcrate now carries routing / control protocol pieces qresolveresolver traits are now downcastableqresolvecan distinguish H3 DNS sources more explicitlyqresolvepublish metadata now declares the requiredtokio/netfeature set- custom server certificate verification gained OCSP support
Workspace publish readiness
- the workspace publish surface was prepared for
0.5.1 qprotocolpublishing metadata now uses the workspace README- unused dependencies were removed across workspace crates
- release workflow naming was normalized to
publish - the workspace publish workflow now supports sequential publish handling for
the full crate set
Upgrade notes
QuicClient/QuicListenersconnection-returning APIs now expose
Arc<Connection>directlyinet://[::]:PORTis now IPv6-only- TLS naming has been normalized from
agenttoauthority - the workspace now includes the new
qprotocolcrate
Full changelog: v0.5.0...v0.5.1
v0.5.0
dquic v0.5.0
The project has been renamed from gm-quic to dquic.
The private gm-quic-traversal fork is now merged into the main tree,
contributing two new crates:
qtraversal— STUN client/server, hole punching, port prediction.qresolve— DNS resolver trait and implementation.
qunreliable has been renamed to qdatagram.
qinterface has been reworked around a BindUri-based identifier and
a component-oriented core, replacing the previous iface/local/factory layout.
Connection is now Clone, and the client connect path does multi-path
probing with async resolution. A new qconnection::traversal module
wires things into qtraversal. qbase gains frames for address management
and hole punching (add_address, remove_address, punch_hello,
punch_done, punch_me_now); ReceiveFrame/SendFrame move into frame::io;
*_FRAME_TYPE constants are replaced by WriteFrameType;
PacketContains is renamed to PacketContent.
The top-level dquic crate exposes per-interface STUN / relay configuration,
on-demand NAT detection, extended ToCertificate / ToPrivateKey
implementations, and a Router::close() for clean shutdown.
New traversal-client / traversal-server examples demonstrate the flow,
and the old inline tests have been extracted into tests/{auth,echo,traversal}.rs.
Notable fixes include STUN agent filtering by iface family,
a puncher deadlock resolved around address_book,
reliable direct PunchDone confirmation, client-only 0-RTT logging,
and renewed localhost test certificates.
Dependencies netdev, rand, reqwest, and nix were bumped.
CI gains traversal, commitlint, and feishu-bot workflows;
interop.yml is removed; the Docker image builds with cache.
Upgrade notes
- Rename dependencies:
gm-quic→dquic,qunreliable→qdatagram. - Migrate from the old
qinterface::iface/local/factorymodules
to the newBindUri+ component API. - Replace
*_FRAME_TYPEconstants withWriteFrameType. - Rename
PacketContainstoPacketContent.
Full changelog: v0.4.0...v0.5.0
v0.4.0
Summary
Core & Network
Rewrote interface monitoring and packet assembly for better stability. Improved connection lifecycle management, added connection metrics, and implemented Sink/Stream traits for stream IO.
Identity
Introduced identity-based signing and verification mechanisms, enabling secure identity authentication and verification for both client and server.
Client and Server
Enhanced client capabilities with built-in DNS resolution support and optimized interface binding logic for better connectivity. Optimize QuicListeners API
Community
Added support for R2CN.
Toolchain
Modernized the codebase by adopting Rust 2024 edition and upgrading the Minimum Supported Rust Version (MSRV) to 1.88.
Improvements
Improved TLS state handling and Windows compatibility. Implemented various performance optimizations around buffer management and idle timer handling.
What's Changed
- fix: remove TooManyPart error for parsing BindUri by @huster-zhangpeng in #613
- fix: compatibility with windows interface names by @huster-zhangpeng in #614
- fix: use the interface's ip to test liveness at first by @huster-zhangpeng in #615
- feat: rewrite quic packets assembly by @eareimu in #616
- fix: remove incorrect assertions and boundary judgments by @eareimu in #618
- docs: fix typo in README_CN.md by @ytlm in #617
- fix(qinterface): recreate the path when its interface is rebound by @eareimu in #619
- fix: compatible with traversal by @eareimu in #620
- ci: rename gm-quic-multi-path to fix benchmark ci by @eareimu in #621
- feat: publish endpoint address when binding interface by @metah3m in #622
- build(deps): update x509-parser requirement from 0.17 to 0.18 by @dependabot[bot] in #623
- build(deps): update windows-sys requirement from 0.60 to 0.61 by @dependabot[bot] in #624
- fix: correct typo in builder function name for crypto provider by @stevefan1999-personal in #629
- feat: fine-grained control over client auth behavior, remove or downgrade logs, fix the definition of error that violates the standard library design by @eareimu in #628
- feat: miscellaneous by @eareimu in #635
- feat: support R2CN by @huster-zhangpeng in #634
- build(deps): update netdev requirement from 0.31 to 0.39 by @dependabot[bot] in #632
- Replace u8 with Dir enum in FrameType for stream direction by @Copilot in #637
- docs: add Dependencies and MSRV badge by @huster-zhangpeng in #638
- Add connection-level metrics for QUIC stream data volumes by @Copilot in #640
- fix(readme): code examples by @eareimu in #644
- Replace raw u8 flags with typed enums in FrameType by @Copilot in #643
- feat: agent, client builtin dns by @eareimu in #646
- build(deps): update darling requirement from 0.21 to 0.23 by @dependabot[bot] in #645
- feat: release v0.4.0 by @eareimu in #647
New Contributors
- @ytlm made their first contribution in #617
- @stevefan1999-personal made their first contribution in #629
- @Copilot made their first contribution in #637
Full Changelog: v0.3.0...v0.4.0
v0.3.0
Summary
Multipath Transport Support
- Support multipath data transmission, improving transport capacity and reliability
- Implement multipath handshaking while maintaining compatibility with traditional QUIC implementations
0-RTT Support
- Implement 0-RTT feature with simple API usage
Security Enhancements
- Add client authentication mechanism (AuthClient)
- Implement anti-port-scanning functionality to enhance server security
Timeout Mechanism Improvements
- Implement comprehensive handshake timeout and idle timeout control
- Active heartbeat packet mechanism to maintain connection liveness, optimizing long-connection scenarios
BindURI Abstraction
- Support binding to network interfaces rather than just IP addresses
- Enhanced network interface dynamic adaptation capability, significantly improving mobility support
In addition, there are numerous architectural optimizations and bug fixes, including parameters system refactoring, error handling mechanism optimization, and multiple critical bug fixes.
What's Changed
- feat: use AbstractAddr to identify an QuicInterafce by @eareimu in #530
- feat: distinguishing between real Servers and Listeners, reject client connections to the wrong host by @eareimu in #531
- docs: document addresses, and quic interface by @eareimu in #532
- feat: enhanced security for listeners by @eareimu in #533
- feat(qinterface): separate interface management and routing by @eareimu in #535
- feat: zero rtt by @eareimu in #534
- feat: rewrite connection establishment and 0rtt by @eareimu in #541
- docs(qbase): correct description of panic condition by @eareimu in #542
- refactor: use procedural macros and redesign parameters by @eareimu in #543
- feat: idle timeout while handshaking by @eareimu in #544
- fix: burst task wakeup it self more than 50% times by @eareimu in #545
- fix: try to rebind ipv6 addr multi times if ipv6 addr is not available by @huster-zhangpeng in #547
- refactor: extract role module by @huster-zhangpeng in #548
- feat: add error module for qbase::param by @huster-zhangpeng in #549
- refactor: move net::addr::IpFamily to net::Family, add AddrFamily trait by @huster-zhangpeng in #550
- feat: add trait CancelStream and StopSending by @huster-zhangpeng in #551
- refactor: rename qinterface::ifaces to qinterface::iface by @huster-zhangpeng in #552
- feat: multipath handshake by @eareimu in #553
- refactor: rename frame::EncodeFrame tp EncodeSize by @huster-zhangpeng in #554
- feat: add local::Locations by @huster-zhangpeng in #555
- refactor: rename qinterface::local::Topic to Observer by @huster-zhangpeng in #556
- fix(qconnection): ZERO is unhandled in get_local_max_idle_timeout by @eareimu in #557
- fix: rcvdJournal::trigger_ack_frame never triggered by @eareimu in #558
- fix(qbase): infinite loop when processing unknown parameters by @eareimu in #559
- fix(qinterface): packets dropped when there are too many packets by @eareimu in #560
- perf(qinterface): make Locations lock free by @eareimu in #561
- build(deps): update windows-sys requirement from 0.59 to 0.60 by @dependabot[bot] in #539
- feat: the standard URI format to describe BindUri by @eareimu in #562
- feat(qbase): generalize Pathway and Link to reduce conversions by @eareimu in #563
- fix: ack infinite loop by @metah3m in #565
- build(deps): update socket2 requirement from 0.5 to 0.6 by @dependabot[bot] in #569
- build(deps): update indicatif requirement from 0.17 to 0.18 by @dependabot[bot] in #567
- fix: send buffer state debug_assert failed by @eareimu in #564
- feat: handling some errors using custom error types by @eareimu in #566
- fix: packet loss cannot be triggered without ack by @metah3m in #570
- refactor: rename trait DescribeData to ContinuousData by @huster-zhangpeng in #571
- fix: fix: acked packet would not be lost, just ignore this lost event by @huster-zhangpeng in #572
- fix: the initial packets should always use the initial dcid(for client, odcid) by @huster-zhangpeng in #576
- fix/qlog by @eareimu in #573
- feat: support ansi option for examples by @eareimu in #575
- refactor: unify errors and logs, remove useless code by @eareimu in #574
- fix: increase loss delay to avoid backlog when packet loss by @metah3m in #577
- refactor: rename module prefered_address to preferred_address by @huster-zhangpeng in #579
- fix: add the missing path validated signal by @eareimu in #578
- feat: reuse initial_dcid for multipath handshaking by @huster-zhangpeng in #580
- fix: release ArcParametersGuard before traversing paths to avoid deadlock by @metah3m in #581
- fix: path first load crypto force by @metah3m in #582
- feat(qbase): make SendWakers wake-up balanced by @eareimu in #583
- fix: delay path validation start and reduce interval by @eareimu in #584
- fix: backoff initial rtt when packet loss by @metah3m in #587
- build(deps): update darling requirement from 0.20 to 0.21 by @dependabot[bot] in #588
- build(deps): update rcgen requirement from 0.13 to 0.14 by @dependabot[bot] in #568
- refactor: rename one_rtt_ready to tls_fin by @eareimu in #586
- fix: make loading of 0rtt and 1rtt packets exclusive by @eareimu in #589
- feat: negotiating handshake path in multipath handshake by @eareimu in #585
- fix: bufMap::may_lost error by @huster-zhangpeng in #590
- fix: skip path validation for handshake path by @eareimu in #591
- fix: fixed packet loss detect not working after ack by @eareimu in #592
- docs: update readmes with new api and benchmark by @eareimu in #593
- feat: add server management APIs with custom error types by @eareimu in #594
- feat(qinterface): allow interface (re)binding failures by @eareimu in #595
- fix: odcid entry dropped unexpectly by @eareimu in #596
- fix(qconnections): path ctxs may leak when server connection closed by @eareimu in #597
- refactor: rename unsuppoet to unsupport by @huster-zhangpeng in #598
- feat: impl MaxIdleTimer and DeferIdleTimer by @huster-zhangpeng in #599
- feat: remove client reuse connection option by @eareimu in #601
- feat: use DeferIdleTimer and MaxIdleTimer correctly by @huster-zhangpeng in #600
- feat: handshake timeout by @eareimu in #602
- feat: actively send heartbeat packets by @huster-zhangpeng in #603
- feat: too many pto timeout events occured is an error by @huster-zhangpeng in #604
- feat(qevent): tracing qlogger by @eareimu in #605
- feat: simplify and hide connection events by @eareimu in #606
- feat: split the path task into multiple tokio tasks by @eareimu in #607
- refactor: improve AuthClient, add tests by @eareimu in #608
- fix: path validate panic when tls handshake failed by @eareimu in #609
- feat(qinterface): add poll_close for QuicIO, fix possiable deadlock by @eareimu in #610
- fix: detect network change and rebind interface by @eareimu in #611
- feat: release v0.3.0 by @eareimu in #612...