use crate::interface::interface::Interface;
use windows_sys::Win32::NetworkManagement::IpHelper::{GetIfEntry2, MIB_IF_ROW2, MIB_IF_ROW2_0};
use windows_sys::Win32::Networking::WinSock as ws;
pub const IFF_UP: u32 = ws::IFF_UP;
pub const IFF_BROADCAST: u32 = ws::IFF_BROADCAST;
pub const IFF_LOOPBACK: u32 = ws::IFF_LOOPBACK;
pub const IFF_POINTOPOINT: u32 = ws::IFF_POINTTOPOINT;
pub const IFF_MULTICAST: u32 = ws::IFF_MULTICAST;
const IFF_CONNECTOR_PRESENT: u8 = 0b0000_0100;
pub fn is_physical_interface(interface: &Interface) -> bool {
is_connector_present(interface.index)
|| (interface.is_up()
&& interface.is_running()
&& !interface.is_tun()
&& !interface.is_loopback())
}
pub fn is_running(interface: &Interface) -> bool {
interface.is_up()
}
pub fn is_connector_present(if_index: u32) -> bool {
let mut row: MIB_IF_ROW2 = unsafe { std::mem::zeroed() };
row.InterfaceIndex = if_index;
unsafe {
if GetIfEntry2(&mut row) != 0 {
eprintln!("Failed to get interface entry for index: {}", if_index);
return false;
}
}
let oper_status_flags: MIB_IF_ROW2_0 = row.InterfaceAndOperStatusFlags;
oper_status_flags._bitfield & IFF_CONNECTOR_PRESENT != 0
}