use std::net::Ipv4Addr;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct Ipv4Interface {
pub(crate) name: String,
pub(crate) ip: Ipv4Addr,
pub(crate) broadcast: Ipv4Addr,
}
pub(crate) fn list_ipv4_interfaces() -> Vec<Ipv4Interface> {
let Ok(ifaces) = if_addrs::get_if_addrs() else {
return Vec::new();
};
let mut result = Vec::new();
for iface in ifaces {
if iface.is_loopback() {
continue;
}
if let if_addrs::IfAddr::V4(v4) = &iface.addr {
let broadcast = v4.broadcast.unwrap_or_else(|| {
let ip_bits = u32::from(v4.ip);
let mask_bits = u32::from(v4.netmask);
Ipv4Addr::from(ip_bits | !mask_bits)
});
result.push(Ipv4Interface {
name: iface.name.clone(),
ip: v4.ip,
broadcast,
});
}
}
result
}