1mod error;
2pub use error::Error;
3pub use ipnet;
4use ipnet::IpNet;
5use std::collections::HashSet;
6
7pub mod sys;
8
9#[derive(Debug)]
14pub struct Interface(sys::InterfaceHandle);
15
16impl Interface {
17 pub fn add_address(&self, network: IpNet) -> Result<(), Error> {
19 self.0.add_address(network)
20 }
21 pub fn remove_address(&self, network: IpNet) -> Result<(), Error> {
23 self.0.remove_address(network)
24 }
25 pub fn addresses(&self) -> Result<Vec<IpNet>, Error> {
27 self.0.addresses()
28 }
29 pub fn mtu(&self) -> Result<u32, Error> {
30 self.0.mtu()
31 }
32 pub fn set_mtu(&self, mtu: u32) -> Result<(), Error> {
33 self.0.set_mtu(mtu)
34 }
35 #[cfg(windows)]
36 pub fn set_mtu_v4(&self, mtu: u32) -> Result<(), Error> {
37 self.0.set_mtu_v4(mtu)
38 }
39 #[cfg(windows)]
40 pub fn set_mtu_v6(&self, mtu: u32) -> Result<(), Error> {
41 self.0.set_mtu_v6(mtu)
42 }
43 #[cfg(windows)]
44 pub fn mtu_v4(&self) -> Result<u32, Error> {
45 self.0.mtu_v4()
46 }
47 #[cfg(windows)]
48 pub fn mtu_v6(&self) -> Result<u32, Error> {
49 self.0.mtu_v6()
50 }
51 pub fn name(&self) -> Result<String, Error> {
52 self.0.name()
53 }
54 pub fn index(&self) -> Result<u32, Error> {
55 self.0.index()
56 }
57 pub fn hwaddress(&self) -> Result<[u8; 6], Error> {
59 self.0.hwaddress()
60 }
61 pub unsafe fn from_index_unchecked(index: u32) -> Self {
64 Self(sys::InterfaceHandle { index })
65 }
66 pub fn try_from_index(index: u32) -> Result<Self, Error> {
71 sys::InterfaceHandle::try_from_index(index)
72 }
73 pub fn try_from_name(name: &str) -> Result<Self, Error> {
78 sys::InterfaceHandle::try_from_name(name)
79 }
80}
81
82pub fn list_interfaces() -> Result<Vec<Interface>, Error> {
83 sys::list_interfaces()
84}
85
86pub fn list_addresses() -> Result<Vec<IpNet>, Error> {
87 let interfaces = list_interfaces()?;
88
89 let addresses = interfaces
90 .iter()
91 .flat_map(|iface| iface.addresses())
92 .flatten();
93
94 Ok(HashSet::<IpNet>::from_iter(addresses)
95 .iter()
96 .cloned()
97 .collect())
98}