netconfig_rs/
lib.rs

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/// Wrapped interface index.
11///
12/// Index is chosen, because basically all operating systems use index as an identifier.
13/// This struct can be used to manipulate interface parameters, such as IP address and MTU.
14#[derive(Debug)]
15pub struct Interface(sys::InterfaceHandle);
16
17impl Interface {
18    /// Add address to the interface
19    pub fn add_address(&self, network: IpNet) -> Result<(), Error> {
20        self.0.add_address(network)
21    }
22    /// Remove the specified address from the interface
23    pub fn remove_address(&self, network: IpNet) -> Result<(), Error> {
24        self.0.remove_address(network)
25    }
26    /// Returns list of IP addresses, assigned to this Interface
27    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    /// Returns MAC address, assigned to this Interface
55    pub fn hwaddress(&self) -> Result<MacAddr6, Error> {
56        self.0.hwaddress()
57    }
58    /// # Safety
59    /// The passed interface index must be valid
60    pub unsafe fn from_index_unchecked(index: u32) -> Self {
61        Self(sys::InterfaceHandle { index })
62    }
63    /// Returns `InterfaceHandle` from given interface index or Error if not found.
64    ///
65    /// This method checks given index for validity and interface for presence. If you want to get
66    /// `InterfaceHandle` without checking interface for presence, use [`from_index_unchecked`](Self::from_index_unchecked).
67    pub fn try_from_index(index: u32) -> Result<Self, Error> {
68        sys::InterfaceHandle::try_from_index(index)
69    }
70    /// Returns `InterfaceHandle` from given name or Error if not found.
71    ///
72    /// On Windows it uses interface name, that is similar to `ethernet_32774`.
73    /// If you want to search interface by human-readable name (like `Ethernet 1`), use `try_from_alias`
74    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}