Adds a dedicated IPv6 QUIC endpoint (IPV6_V6ONLY=1 via socket2) alongside the existing IPv4 signal endpoint for proper dual-stack P2P connectivity. Previous [::]:0 dual-stack attempt broke IPv4 on Android; this uses separate sockets per address family like WebRTC/libwebrtc. - create_ipv6_endpoint(): socket2-based IPv6-only UDP socket, tries same port as IPv4 signal EP, falls back to ephemeral - local_host_candidates(v4_port, v6_port): now gathers IPv6 global-unicast (2000::/3) and unique-local (fc00::/7) addrs - dual_path::race(): A-role accepts on both v4+v6 via select!, D-role routes each candidate to matching-AF endpoint - Graceful fallback: if IPv6 unavailable, .ok() → None → pure IPv4 behavior identical to pre-Phase-7 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
26 lines
754 B
TOML
26 lines
754 B
TOML
[package]
|
|
name = "wzp-transport"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
description = "WarzonePhone transport layer — QUIC (quinn) with DATAGRAM frames"
|
|
|
|
[dependencies]
|
|
wzp-proto = { workspace = true }
|
|
quinn = { workspace = true }
|
|
tokio = { workspace = true }
|
|
bytes = { workspace = true }
|
|
tracing = { workspace = true }
|
|
async-trait = { workspace = true }
|
|
serde_json = "1"
|
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
|
|
socket2 = { workspace = true }
|
|
rcgen = "0.13"
|
|
ed25519-dalek = { workspace = true }
|
|
hkdf = { workspace = true }
|
|
sha2 = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
tokio = { workspace = true, features = ["rt-multi-thread", "macros"] }
|