v0.5.1 changes#718
Merged
Merged
Conversation
netdev::Interface's derived PartialEq includes rx/tx stats and a timestamp that change on every poll for active interfaces, which produced a spurious InterfaceEvent::Changed on every scan. Compare only the reconfigurable fields that actually affect bind/route decisions.
Network::bind no longer resolves the STUN server synchronously before binding. DNS lookup is now delegated entirely to the StunClientsComponent background task, which already has per-lookup timeout protection and retries until MIN_AGENTS is reached. This removes a latent hang: if the configured resolver chain contains a sub-resolver that pends forever (e.g. an unreachable H3 DNS endpoint), bind would block indefinitely waiting on the first agent. Binding now completes immediately regardless of resolver health. Also parallelize bind_many using FuturesUnordered so multiple interfaces are bound concurrently; existing callers aggregate by BindUri key and are order-independent.
…nce cycle - Rename ConnectionState to Connection and remove the Connection(Arc<ConnectionState>) newtype wrapper; callers now receive Arc<Connection> directly - spawn_drive_connection now holds Weak<Connection> and upgrades per event, breaking the strong cycle that kept connections alive after all external Arc references were dropped - QuicClient::new_connection, QuicClient::connect, QuicClient::connected_to_with_source, and QuicListeners::accept now return Arc<Connection> - DNS drain task in QuicClient::connect uses Weak<Connection> and races against terminated() so it exits promptly on shutdown - Update http-server, h3-server, h3-client examples for the new Arc<Connection> API
StunClientComponent::reinit was cloning the old stun_router instead of fetching the freshly reinited one from StunRouterComponent, causing the new keep-alive task to deliver STUN packets to a stale router after interface rebind. Mirror StunClientsComponent::reinit by going through iface.with_components to obtain the new router.
fddeaa5 to
fe2ce7d
Compare
2f9fe4e to
4eb1215
Compare
huster-zhangpeng
approved these changes
Jun 15, 2026
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.
dquic v0.5.1
This release focuses on traversal correctness, interface/bind semantics,
connection lifecycle cleanup, and workspace publish readiness across the
dquicstack.Traversal and NAT maintenance
qtraversalnow refreshes receive-side routing dependencies correctly duringreinit and interface rebind.
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/txcounters and timestamps) as meaningful interface changes.
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 STUNresolution.
qconnectionnow exposesArc<Connection>directly and breaks the strongreference cycle that could keep connections alive after external owners were
dropped.
qconnectionnow exposes local punch endpoints.qbaseidle-timer handling was corrected, including path-creation startbehavior and incorrect send-side renewal.
agenttoauthority.Resolver, protocol, and TLS surface
qprotocolcrate now carries routing / control protocol piecesqresolveresolver traits are now downcastableqresolvecan distinguish H3 DNS sources more explicitlyqresolvepublish metadata now declares the requiredtokio/netfeature setWorkspace publish readiness
0.5.1qprotocolpublishing metadata now uses the workspace READMEpublishthe full crate set
Upgrade notes
QuicClient/QuicListenersconnection-returning APIs now exposeArc<Connection>directlyinet://[::]:PORTis now IPv6-onlyagenttoauthorityqprotocolcrateFull changelog: v0.5.0...v0.5.1