1mod link;
23
24pub use link::*;
25pub use nix::sys::socket::{
26 SockaddrIn as Inet4Addr, SockaddrIn6 as Inet6Addr, SockaddrStorage as NetAddr, UnixAddr,
27};
28pub use std::net::{Ipv4Addr, Ipv6Addr};
29pub const UNSPECIFIED6: Ipv6Addr = Ipv6Addr::UNSPECIFIED;
30pub const UNSPECIFIED4: Ipv4Addr = Ipv4Addr::UNSPECIFIED;
31pub const ALL_NODES: Ipv6Addr = Ipv6Addr::new(
32 0xff02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
33);
34pub const ALL_ROUTERS: Ipv6Addr = Ipv6Addr::new(
35 0xff02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002,
36);
37
38pub trait ToNetAddr {
40 fn to_net_addr(&self) -> NetAddr;
41}
42
43impl<X: nix::sys::socket::SockaddrLike> ToNetAddr for X {
44 fn to_net_addr(&self) -> NetAddr {
45 use nix::sys::socket::SockaddrLike;
46 unsafe {
47 NetAddr::from_raw(<Self as SockaddrLike>::as_ptr(self), Some(Self::size())).unwrap()
48 }
49 }
50}
51
52pub fn tokio_to_unixaddr(src: &tokio::net::unix::SocketAddr) -> UnixAddr {
53 if let Some(path) = src.as_pathname() {
54 UnixAddr::new(path).unwrap()
55 } else {
56 unimplemented!()
57 }
58}
59
60pub fn to_net_addr<X: ToNetAddr>(x: X) -> NetAddr {
62 x.to_net_addr()
63}
64
65pub trait WithPort {
67 fn with_port(&self, port: u16) -> NetAddr;
68}
69
70impl WithPort for std::net::Ipv4Addr {
71 fn with_port(&self, port: u16) -> NetAddr {
72 Inet4Addr::from(std::net::SocketAddrV4::new(*self, port)).to_net_addr()
73 }
74}
75
76impl WithPort for std::net::Ipv6Addr {
77 fn with_port(&self, port: u16) -> NetAddr {
78 Inet6Addr::from(std::net::SocketAddrV6::new(*self, port, 0, 0)).to_net_addr()
79 }
80}
81
82impl WithPort for std::net::IpAddr {
83 fn with_port(&self, port: u16) -> NetAddr {
84 match self {
85 Self::V4(ip) => ip.with_port(port),
86 Self::V6(ip) => ip.with_port(port),
87 }
88 }
89}
90
91pub trait NetAddrExt {
98 fn to_std_socket_addr(&self) -> Option<std::net::SocketAddr>;
99 fn to_unix_addr(&self) -> Option<UnixAddr>;
100 fn ip(&self) -> Option<std::net::IpAddr>;
101 fn port(&self) -> Option<u16>;
102}
103
104impl NetAddrExt for NetAddr {
105 fn to_std_socket_addr(&self) -> Option<std::net::SocketAddr> {
106 if let Some(&v4) = self.as_sockaddr_in() {
107 Some(std::net::SocketAddrV4::from(v4).into())
108 } else if let Some(&v6) = self.as_sockaddr_in6() {
109 Some(std::net::SocketAddrV6::from(v6).into())
110 } else {
111 None
112 }
113 }
114 fn to_unix_addr(&self) -> Option<UnixAddr> {
116 use nix::sys::socket::SockaddrLike;
117 if self.family() == Some(nix::sys::socket::AddressFamily::Unix) {
118 unsafe { UnixAddr::from_raw(<Self as SockaddrLike>::as_ptr(self), Some(Self::size())) }
119 } else {
120 None
121 }
122 }
123 fn ip(&self) -> Option<std::net::IpAddr> {
124 if let Some(&v4) = self.as_sockaddr_in() {
125 Some(std::net::Ipv4Addr::from(v4.ip()).into())
126 } else if let Some(&v6) = self.as_sockaddr_in6() {
127 Some(v6.ip().into())
128 } else {
129 None
130 }
131 }
132 fn port(&self) -> Option<u16> {
133 if let Some(&v4) = self.as_sockaddr_in() {
134 Some(v4.port())
135 } else if let Some(&v6) = self.as_sockaddr_in6() {
136 Some(v6.port())
137 } else {
138 None
139 }
140 }
141}