Expand description
§dig-ip — canonical address-family discovery + IPv6-first happy-eyeballs dial
The ONE ecosystem implementation of CLAUDE.md §5.2 (IPv6-first, IPv4-fallback for peer comms).
Before this crate, three drifting copies of the happy-eyeballs racer lived in dig-nat,
dig-gossip, and dig-node-core, and NONE of them filtered by LOCAL capability — so an
IPv4-only host still emitted IPv6 SYNs, and an IPv6-only peer from an IPv4-only host was
attempted-then-timed-out rather than reported cleanly unreachable. dig-ip consolidates them and
adds the missing half: the local∩peer family INTERSECTION.
§The pipeline
LocalStack— which families THIS host can reach (detect/cached/from_flags).PeerCandidates— a peer’s family-tagged candidate addresses, aggregated from every discovery source (CandidateSource) and de-duplicated.dial_order— the local∩peer family intersection, IPv6-first, that FAILS OPEN when local detection cannot confidently name a common family; a typedNoCommonFamilyonly when the peer offers no candidate at all.connect— the RFC-8305 happy-eyeballs racer over that order, IPv6-preferred with graceful IPv4 fallback; the transport dial is a caller-supplied closure so this crate stays a leaf with no TLS/socket dependency.
§The core guarantee
When local detection is AFFIRMATIVE for at least one of the peer’s families, the intersection is an
optimization: an address of a family the local host affirmatively lacks, or a family the peer lacks,
is not dialed (“an IPv6 client doesn’t try to connect to an IPv4-only client”, and vice-versa).
Because negative detection is unreliable — an overlay / split-tunnel / pre-route host probes
ENETUNREACH for a family it can actually reach — an EMPTY intersection over a peer that has
candidates fails OPEN (attempts them all, IPv6-first) rather than stranding a reachable peer;
NoCommonFamily means only “the peer offered nothing to dial”.
Structs§
- Candidate
- A single family-tagged candidate address for a peer.
- Dial
Config - Tuning for the happy-eyeballs candidate race.
- Dial
Winner - The winning connection plus which candidate/family established it.
- Local
Stack - The address families THIS host can originate connections on.
- NoCommon
Family - The peer offers no candidate address at all, so there is nothing to dial.
- Peer
Candidates - A peer’s aggregated, family-tagged, de-duplicated candidate addresses.
Enums§
- Candidate
Source - Where a candidate address was learned — provenance, kept for observability and so a future policy could weight sources. It does not affect the family-intersection rule (that is family-only).
- Connect
Error - Why a
connectattempt produced no connection. - Family
- An IP address family: IPv6 (preferred) or IPv4 (fallback).
Traits§
- From
Timeout - How to construct the caller’s error type for a per-attempt timeout. Implemented for
String(the common test/closure error) and any type convertible from astd::io::Error.
Functions§
- connect
- Establish a connection to
peer, IPv6-first with graceful IPv4 fallback, over the local∩peer family intersection (dial_order). - dial_
order - The addresses to dial, in IPv6-first preference order.