use std::net::{IpAddr, Ipv6Addr, SocketAddr, UdpSocket};
use std::sync::OnceLock;
pub fn cached_host_ipv6_route() -> bool {
static CACHE: OnceLock<bool> = OnceLock::new();
*CACHE.get_or_init(probe_host_ipv6_route_uncached)
}
fn probe_host_ipv6_route_uncached() -> bool {
let Ok(sock) = UdpSocket::bind(SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0)) else {
return false;
};
let target = SocketAddr::new(
IpAddr::V6(Ipv6Addr::new(0x2606, 0x4700, 0x4700, 0, 0, 0, 0, 0x1111)),
53,
);
sock.connect(target).is_ok()
&& sock
.local_addr()
.map(|a| match a.ip() {
IpAddr::V6(v6) => !v6.is_unspecified() && !v6.is_loopback(),
_ => false,
})
.unwrap_or(false)
}