netconfig_rs/
lib.rs

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