use std::net::Ipv4Addr;
use crate::wire::UtpLinkSpeed;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct UtpLinkErrors {
pub in_error: bool,
pub in_fcs_error: bool,
pub in_collision: bool,
pub out_deferred: bool,
pub out_excessive: bool,
pub polarity_error: bool,
pub skew_warning: bool,
pub length_warning: bool,
}
impl UtpLinkErrors {
pub(crate) const fn from_wire(v: u8) -> Self {
Self {
in_error: v & (1 << 0) != 0,
in_fcs_error: v & (1 << 1) != 0,
in_collision: v & (1 << 2) != 0,
out_deferred: v & (1 << 3) != 0,
out_excessive: v & (1 << 4) != 0,
polarity_error: v & (1 << 5) != 0,
skew_warning: v & (1 << 6) != 0,
length_warning: v & (1 << 7) != 0,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct UtpCableStatus {
pub polarity: bool,
pub pair: u8,
pub skew: u32,
pub length: u32,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum VctStatus {
#[default]
Healthy,
Warning,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MacAddress(pub [u8; 6]);
impl core::fmt::Display for MacAddress {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let [a, b, c, d, e, g] = self.0;
write!(f, "{a:02X}:{b:02X}:{c:02X}:{d:02X}:{e:02X}:{g:02X}")
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct NetworkPortStatus {
pub port: u16,
pub name: String,
pub link_speed: UtpLinkSpeed,
pub link_full_duplex: bool,
pub ip: Option<Ipv4Addr>,
pub querier: Option<Ipv4Addr>,
pub mac_address: Option<MacAddress>,
pub errors: Option<UtpLinkErrors>,
pub vct_status: Option<[VctStatus; 4]>,
pub cable_status: Vec<UtpCableStatus>,
}