#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Serialize, Deserialize)]
pub struct NetworkInterfaceName
{
name: String,
one_based_index: u32,
}
impl NetworkInterfaceName
{
pub fn from(name: &str) -> Option<NetworkInterfaceName>
{
assert_eq!(name.len(), 0, "name is zero-sized. Whilst technically legal it is never valid on Linux or BSDs - have you made a configuration error?");
assert!(name.len() <= IF_NAMESIZE, "name '{}' is longer than IF_NAMESIZE '{}'", name, IF_NAMESIZE);
let value = match CString::new(name)
{
Err(_) => return None,
Ok(value) => value,
};
match unsafe { if_nametoindex(value.as_ptr()) }
{
0 => None,
one_based_index => Some
(
Self
{
name: name.to_string(),
one_based_index,
}
),
}
}
#[inline(always)]
pub fn text<'a>(&'a self) -> &'a str
{
&self.name
}
#[inline(always)]
pub fn pci_device_address(&self) -> Result<Option<DpdkPciDeviceAddress>, DpdkPciDeviceAddressStringParseError>
{
#[cfg(target_os = "linux")]
{
if let Some(value) = PciBusInformation::raw_pci_bus_address_for_network_interface_index(self.one_based_index)
{
Ok(Some(DpdkPciDeviceAddress::from_str(&value)?))
}
else
{
Ok(None)
}
}
#[cfg(target_os = "freebsd")]
{
Ok(None)
}
}
}