build(deps): bump ring from 0.16.20 to 0.17.14#3
Open
dependabot[bot] wants to merge 1 commit into
Open
Conversation
09bdb4a to
7a3cddc
Compare
1456055067
added a commit
that referenced
this pull request
Jul 7, 2026
…y) (#9) * docs(rfc8415): refine plan — unified allocation, in-scope v6 DAD, crates/ paths * feat(config): parse DHCPv6 IA_NA ranges and IA_PD pd_pools RFC 8415 phase 1 (config only, no runtime behavior change). - wire: add ranges (IpRange) + pd_pools (new PdPool) to v6 Net - v6 config: parsed NetRange (dual valid/preferred lifetimes, exclusions) and PdPool (with delegated_len validation + total_prefixes); wire into Network + TryFrom; add ranges()/pd_pools()/range() accessors - sample config_v6_pools.yaml + parser tests * feat(ip-manager): DHCPv6 lease persistence (RFC 8415 phase 2) Unified storage: keep the v4 leases table (INTEGER, hot path untouched) and add a leases_v6 table (16-byte BLOB addr + prefix_len) for v6 bindings. - migration: leases_v6 (addr, prefix_len, client_id/DUID+IAID, state, expiry) - Storage trait: generalize insert_max_in_range exclusions HashSet<Ipv4Addr> -> HashSet<IpAddr>; inc_ip now filters v6 exclusions too - sqlite: implement all address-keyed v6 arms via new util_v6 queries against leases_v6 (BLOB order == numeric order for big-endian v6); get_id searches both tables - tests: v6 insert/get/get_id/release, sequential alloc with exclusions, reserve->lease, v4/v6 coexistence. 12 v4 tests still green (no regression) count()/select_all() remain v4-only for now (metrics/API surface: phase 6). * fix(ip-manager): address code-review findings on v6 storage - #1 empty-range allocation now skips excluded addresses (new first_available helper), used by both v4 and v6 arms; fixes a livelock when a range's first address is excluded (was a latent v4 bug too). +regression test - #2 release_ip only deletes when the (addr,id) pair matched, so a client can't release another client's lease; applied to both v4 and v6. +test - #3 split get_id into get_id (v4) and get_id_v6 so identity lookups target one table deterministically — removes cross-family collision + v4 hot-path double query - #4 from_bytes now requires exactly 16 bytes (try_into().expect) instead of silently zero-padding a corrupt BLOB - #5 regenerate sqlx-data.json so SQLX_OFFLINE=true (CI) builds see leases_v6 - #6 to_bytes returns [u8;16] (no per-call heap alloc on the lease path) - #7 reuse util::into_clientinfo in util_v6 (drop the duplicate) - #8 drop the misleading PREFIX_LEN_NA const; use literal 128 consistently Verified in WSL: 17 ip-manager tests pass (13 v4, no regression), full workspace builds with SQLX_OFFLINE=true, clippy clean. * refactor(ip-manager): unify allocation across v4/v6 (RFC 8415 phase 3a) Generalize the reserve/next-available algorithm so DHCPv6 allocation flows through the same path as v4, per the unify-upfront decision. - new pool.rs: Pool + NetworkParams traits, impl'd for config v4 and v6 NetRange/Network (family-neutral views over IpAddr) - reserve_first / try_ip / try_lease / ping_check are now generic over these traits; the reserve loop is family-neutral (no more panic! on v6) - ping_check dispatches by family: v4 ICMP echo as before; v6 DAD (Neighbor Solicitation) is stubbed to Ok until phase 4 - add IpManager::lookup_id_v6 for the upcoming v6 plugin - test: v6 addresses allocated + leased end-to-end through reserve_first v4 unchanged: 18 ip-manager tests pass (incl. all prior v4), leases/bin build, clippy clean. * feat(dhcpv6): IA_NA address assignment plugin (RFC 8415 phase 3b/3c) Stateful DHCPv6 address assignment end-to-end: - new crate plugins/leases-v6: Plugin<v6::Message> that runs after MsgType and allocates an address per requested IA_NA via the unified reserve_first path. Solicit -> Advertise (offer/Reserve), Request or Rapid-Commit Solicit -> Reply (commit/Lease). Builds IA_NA(opt 3) + IAADDR(opt 5) with T1/T2 and preferred/valid lifetimes; empty pool yields IA_NA + NoAddrsAvail status. Identity = DUID ++ IAID. - message-type: v6 handler now classifies Solicit (Advertise, or Reply + RapidCommit) and Request (Reply), setting the response for leases-v6 to fill - config: v6 rapid_commit flag (default false) + accessor - bin: register LeasesV6 on the v6 server after MsgType Verified (WSL, SQLX_OFFLINE): leases-v6 + message-type + ip-manager + config tests pass, full workspace builds, clippy clean. Renew/Rebind/Confirm/Release/ Decline and v6 DAD are phase 4. * feat(dhcpv6): IA_NA lifecycle + v6 DAD (RFC 8415 phase 4) - leases-v6 now dispatches by message type and handles the full IA_NA lifecycle: * Renew/Rebind: extend existing bindings via new IpManager::renew (extend-only, never creates); unknown IA -> NoBinding; a Rebind matching nothing stays silent * Confirm: on-link check against the network prefix -> Success / NotOnLink (no lease change; silent if the client sent no addresses) * Release: free the client's addresses -> Success * Decline: put declined addresses on probation -> Success - v6 DAD: IpManager gains an optional ICMPv6 listener (icmp-ping already supports Icmpv6); ping_check now probes v6 addresses via ICMPv6 echo. Best-effort: disabled if the socket can't be created (some CI/containers), never fails startup - message-type: v6 handler passes Renew/Rebind/Confirm/Release/Decline through to leases-v6 (server-id presence still enforced for the types that require it) - tests: IpManager::renew extend-only semantics; IA_NA/status-code builders Verified (WSL, SQLX_OFFLINE): ip-manager 19, leases-v6 6, message-type 5 pass; full workspace builds; clippy clean. * feat(dhcpv6): IA_PD prefix delegation (RFC 8415 phase 5) Delegate prefixes from the pd_pools parsed in phase 1. - config: PdPool::iter_prefixes lazily enumerates delegated prefix bases (stepping by block size, skipping the except list) - storage: leases_v6 now stores delegated prefixes keyed by (base, prefix_len) where prefix_len != 128. New Storage PD methods (get_pd/upsert_pd/get_id_pd/ renew_pd/release_pd) via prefix-aware util_v6 queries; IA_NA path unchanged - ip-manager: allocate_pd scans a pool for the first free/expired/owned prefix (bounded scan), reusing a client's existing delegation; renew_pd/release_pd - leases-v6: Solicit/Request delegate a prefix per IA_PD -> IA_PD + IAPREFIX, NoPrefixAvail when the pool is empty; Renew/Rebind extend (NoBinding if unknown); Release frees. Confirm/Decline stay IA_NA-only (per RFC) - sqlx-data.json regenerated (offline cache) for the new PD queries Verified (WSL, SQLX_OFFLINE): ip-manager 20, leases-v6 8 tests pass (incl. allocate_pd reuse/renew/release + IA_PD/IAPREFIX builders); full workspace builds; clippy clean. * feat(dhcpv6): metrics/API surface + docs (RFC 8415 phase 6) - count() and select_all() now include leases_v6, so the /v1/leases API and the leased/probation metrics reflect v6 bindings (v4 metrics already wired; server calls recv/sent_metrics generically for both families) - example.yaml: v6 rapid_commit flag + IA_NA ranges + IA_PD pd_pools - docs: rfc_compliance.md flips the DHCPv6 rows to implemented; rfc8415_plan.md marked done with a phase table + remaining follow-ups Verified (WSL, SQLX_OFFLINE): ip-manager 20 tests pass (select_all/count now cover both families); full workspace builds; example.yaml parses via dora-cfg. Known gap: end-to-end packet-level v6 integration tests need the netns/veth sudo harness (like v4) and are deferred; logic is covered by unit + storage + allocator tests. * feat(dhcpv6): RelayForw/RelayRepl relay agent support (RFC 8415 sec 19) - dora-core server/relay.rs: unwrap a (possibly nested) Relay-forward to the innermost client message + relay chain; wrap a response into a matching Relay-reply chain, echoing link/peer address and Interface-ID - ServerDecode trait: v6 decode transparently unwraps a Relay-forward (a relay message has a different wire layout than a client message); v4 unchanged. MsgContext records the relay chain and exposes ctx.relay() - RunInner v6: relayed responses are wrapped as a Relay-reply and sent back to the relay agent (request src) instead of unicast to the client - config v6 get_network_by_addr: relayed messages pick the subnet by the relay link-address (RFC 8415 sec 13.1); leases-v6 uses it for network selection - depends on usg-dhcproto relay API additions via [patch.crates-io] -> local ../dhcproto (feat/v6-relay-api). Publish/point at the git branch for CI. Verified (WSL): dora-core 11 tests (4 relay: single/nested unwrap, wrap roundtrip w/ interface-id echo), leases-v6 8, config get_network_by_addr; full workspace builds, clippy clean. End-to-end packet path through a real relay still needs the netns harness. * docs(rfc_compliance): mark DHCPv6 relay (RelayForw/RelayRepl) implemented * build(deps): bump usg-dhcproto 0.17.1 -> 0.18.0 (relay API) The relay API additions are a breaking change in the fork, released as 0.18.0; track the new version. Still patched to the local ../dhcproto checkout until published. * fix(dhcpv6): address code-review findings on IA lifetimes/lifecycle - T1/T2 now derive from the PREFERRED lifetime, not valid (RFC 8415 §21.4), so clients renew before the address is deprecated - assign/renew use the specific range/pd_pool's (preferred, valid) lifetimes (via na_lifetimes/pd_lifetimes) instead of always the network defaults - Solicit offers are held for a short OFFER_WINDOW (60s), not the full valid lifetime, so Solicit-only clients can't exhaust the pool (committed leases still use the full valid lifetime) — new db_ttl helper - Rebind omits IAs it has no binding for instead of replying NoBinding, which is Renew-only (RFC 8415 §18.3.5); Renew still answers NoBinding - config: reject preferred_time > lease_time/valid (wire-invalid IAADDR clients would discard, §21.6) and pd_pool delegated_len >= 128 (collides with the IA_NA namespace in storage) Verified (WSL): leases-v6 8 + config 42 tests pass (incl. 2 new validation tests; T1/T2 assertions updated to preferred basis); full workspace builds, clippy clean. * build(deps): drop [patch.crates-io] now that usg-dhcproto 0.18.0 is published dora resolves usg-dhcproto 0.18.0 from crates.io; the local ../dhcproto fork override is no longer needed. Branch is now CI-buildable without the local checkout. * fix(dhcpv6): low-priority code-review findings - message-type: discard Confirm/Rebind that carry a Server Identifier (RFC 8415 §16.5 / §16.9) - leases-v6 allocate: reuse an existing binding anywhere in the network before the per-range reserve loop, so a multi-range network no longer deletes and re-issues a lease held in a different range (client address stays stable) - ip-manager allocate_pd: only reuse a client's stored delegation if it belongs to the requested pool (matching delegated_len + parent prefix), so a roamed client is not handed a prefix from a pool that does not exist on this network - sqlite upsert_pd: return Ok(()) on a mismatched family instead of panicking, matching the other v6 arms - Release/Decline: reply with a per-IA NoBinding for IAs the server has no binding for, plus the top-level Success (RFC 8415 §18.3.7 / §18.3.8) Verified (WSL): ip-manager 20, leases-v6 8, message-type 5 tests pass; full workspace builds; clippy clean. * fix(dhcpv6): address relay/lifecycle review findings (regressions + robustness) - allocate reuse: a plain Solicit no longer mutates an existing binding (was demoting a committed lease to a 60s reservation via the offer window and try_ip); only a commit (Request/Rapid-Commit) refreshes it to a full lease - allocate_prefix: reuse the client's delegation from whichever pd_pool holds it before the per-pool loop, so a multi-pool network keeps the prefix stable (the tightened per-pool reuse guard alone changed the prefix); new IpManager::lookup_id_pd - relay subnet selection: fall back to the receiving interface when the relay link-address is unspecified (LDRA / RFC 6221) or names a network we don't serve, instead of dropping the message - message-type v6: a relayed message no longer hard-fails when the receiving interface has no link-local (the client link comes from the relay) - T2 now 0.8*preferred (RFC 8415 §21.4 recommendation), was 0.875 - config check_lifetimes also guards preferred.max <= valid.max Verified (WSL): dora-core 11, ip-manager 20, leases-v6 8, message-type 5, config 42 tests pass; full workspace builds; clippy clean. * fix(dhcpv6): don't Renew/Rebind an off-link address or prefix (RFC 8415 §18.3.5) Renew/Rebind matched a client binding by DUID+IAID globally and extended it with a fresh lifetime even if the address/prefix was not on the client's currently selected link (e.g. after the client roamed). Now only extend an address that falls in one of the selected network's ranges, and a prefix delegated from one of its pd_pools (new pd_on_link helper); an off-link binding is left unextended so the client recovers via NoBinding/Solicit instead of continuing to use an unroutable address. Verified (WSL): leases-v6 8 tests pass; workspace builds; clippy clean. * refactor(dhcpv6): dedup IA lifetime computation into helpers Extract range_lifetimes(&NetRange) / pool_lifetimes(&PdPool) and use them from allocate/allocate_prefix (inline) and na_lifetimes/pd_lifetimes, removing ~7 repetitions of `.preferred()/.valid().determine_lease(None).0`. No behavior change; leases-v6 8 tests pass, clippy clean. (The release/decline per-IA loops are left as-is: abstracting them behind an async closure that captures &self adds more lifetime noise than the shallow duplication removes.) * test(dhcpv6): end-to-end packet-level relay integration tests Add self-contained loopback-relay integration tests that drive real packets through a running dora binary without netns/veth/sudo. The server binds [::1] on a non-default port (unicast replies) and each request is wrapped in a Relay-forward, so the subnet is selected by the relay link-address rather than the receiving interface. Covers the full IA_NA lifecycle (Solicit->Advertise, Request->Reply, Renew->Reply, Release->Reply/Success), stable binding across repeat Solicits, and IA_PD prefix delegation (Solicit->Advertise with an IAPREFIX from the configured pd_pool). * style(dhcpv6): apply rustfmt across v6 modules and integration tests
Bumps [ring](https://github.com/briansmith/ring) from 0.16.20 to 0.17.14. - [Changelog](https://github.com/briansmith/ring/blob/main/RELEASES.md) - [Commits](https://github.com/briansmith/ring/commits) --- updated-dependencies: - dependency-name: ring dependency-version: 0.17.14 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
7a3cddc to
a1f9434
Compare
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.
Bumps ring from 0.16.20 to 0.17.14.
Changelog
Sourced from ring's changelog.
Commits