When IPv6 is unavailable on the host, treat NetworkUnreachable at
connect() as Ok(None) instead of propagating an error, so the dual
STUN probe succeeds with just the IPv4 result and no spurious WARN.
In addition to ENETUNREACH, also treat HostUnreachable, Unsupported
and NetworkDown as non-fatal when probing IPv6 — all indicate the
family is unavailable. Guard is limited to IpFamily::V6 so any IPv4
connect failure still propagates as an error.
- Users with "scope_{name}" prefix are routed to upstreams where {name}
is present in the "scopes" property (comma-separated).
- Strict separation: Scoped upstreams are excluded from general routing, and vice versa.
- Constraint: SOCKS upstreams and DIRECT(`use_middle_proxy =
false`) mode only.
Example:
User "scope_hello" matches an upstream with `scopes = "world,hello"`
The actions-rs organization has been archived and is no longer available.
Replace the deprecated action with direct cross installation and build commands.
The actions-rs organization has been archived and is no longer available.
Replace the deprecated action with direct cross installation and build commands.
When IPv6 is unavailable on the host, treat NetworkUnreachable at
connect() as Ok(None) instead of propagating an error, so the dual
STUN probe succeeds with just the IPv4 result and no spurious WARN.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The getProxyConfigV6 endpoint returns addresses in [ipv6]:port format,
but the regex only matched IPv4 host:port, causing IPv6 ME map to be empty.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detect IPv6 availability at startup using UDP probe. When IPv6 is not
available: override prefer_ipv6 to false, skip IPv6 DC pings, pass empty
ME v6 proxy map, skip IPv6 coverage checks in health monitor, and skip
IPv6 fallback in upstream health checks. This eliminates useless
connection attempts with timeouts on IPv6-less hosts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>