use std::net::{IpAddr, Ipv6Addr, SocketAddr};
use crate::PeerSocketAddr;
pub(in super::super) fn canonical_ip_addr(v6_addr: &Ipv6Addr) -> IpAddr {
use IpAddr::*;
v6_addr
.to_ipv4_mapped()
.map(V4)
.unwrap_or_else(|| V6(*v6_addr))
}
pub fn canonical_socket_addr(socket_addr: impl Into<SocketAddr>) -> SocketAddr {
use SocketAddr::*;
let mut socket_addr = socket_addr.into();
if let V6(v6_socket_addr) = socket_addr {
let canonical_ip = canonical_ip_addr(v6_socket_addr.ip());
socket_addr = SocketAddr::new(canonical_ip, socket_addr.port());
}
socket_addr
}
pub(crate) fn canonical_ip(ip: IpAddr) -> IpAddr {
canonical_socket_addr(SocketAddr::new(ip, 0)).ip()
}
pub fn canonical_peer_addr(peer_socket_addr: impl Into<PeerSocketAddr>) -> PeerSocketAddr {
let peer_socket_addr = peer_socket_addr.into();
canonical_socket_addr(*peer_socket_addr).into()
}