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