Handle IPv6 ENETUNREACH in STUN probe gracefully

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.
This commit is contained in:
ivulit 2026-02-18 23:22:31 +03:00
parent efba10f839
commit e54dce5366
No known key found for this signature in database
1 changed files with 11 additions and 4 deletions

View File

@ -50,10 +50,17 @@ pub async fn stun_probe_family(stun_addr: &str, family: IpFamily) -> Result<Opti
let target_addr = resolve_stun_addr(stun_addr, family).await?; let target_addr = resolve_stun_addr(stun_addr, family).await?;
if let Some(addr) = target_addr { if let Some(addr) = target_addr {
socket match socket.connect(addr).await {
.connect(addr) Ok(()) => {}
.await Err(e) if family == IpFamily::V6 && matches!(
.map_err(|e| ProxyError::Proxy(format!("STUN connect failed: {e}")))?; e.kind(),
std::io::ErrorKind::NetworkUnreachable
| std::io::ErrorKind::HostUnreachable
| std::io::ErrorKind::Unsupported
| std::io::ErrorKind::NetworkDown
) => return Ok(None),
Err(e) => return Err(ProxyError::Proxy(format!("STUN connect failed: {e}"))),
}
} else { } else {
return Ok(None); return Ok(None);
} }