#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub(crate) struct ethtool_drvinfo
{
pub(crate) cmd: u32,
pub(crate) driver: [c_char; 32],
pub(crate) version: [c_char; 32],
pub(crate) fw_version: [c_char; ETHTOOL_FWVERS_LEN],
pub(crate) bus_info: [c_char; ETHTOOL_BUSINFO_LEN],
pub(crate) erom_version: [c_char; ETHTOOL_EROMVERS_LEN],
reserved2: [c_char; 12],
pub(crate) n_priv_flags: u32,
pub(crate) n_stats: u32,
#[deprecated]
pub(crate) testinfo_len: u32,
pub(crate) eedump_len: u32,
pub(crate) regdump_len: u32,
}
impl EthtoolCommand for ethtool_drvinfo
{
#[inline(always)]
fn command(&self) -> u32
{
self.cmd
}
}
impl ethtool_drvinfo
{
#[inline(always)]
pub(crate) fn as_driver_and_device_information(self) -> Result<DriverAndDeviceInformation, ObjectNameFromBytesError>
{
#[inline(always)]
fn optional_object_name_32(object_name_32: [c_char; 32]) -> Result<Option<ObjectName32>, ObjectNameFromBytesError>
{
let value = if object_name_32.is_empty()
{
None
}
else
{
Some(ObjectName32::try_from(object_name_32)?)
};
Ok(value)
}
#[inline(always)]
fn non_zero_u32(value: u32) -> Option<NonZeroU32>
{
unsafe { transmute(value) }
}
Ok
(
DriverAndDeviceInformation
{
driver_name: ObjectName32::try_from(self.bus_info)?,
driver_version: optional_object_name_32(self.version)?,
device_bus_device_address: optional_object_name_32(self.bus_info)?.map(BusDeviceAddress::from),
device_firmware_version: optional_object_name_32(self.fw_version)?,
device_expansion_eeprom_version: optional_object_name_32(self.erom_version)?,
device_eeprom_blob_size_in_bytes: non_zero_u32(self.eedump_len),
device_registers_blob_size_in_bytes: non_zero_u32(self.regdump_len),
}
)
}
}