use alloc::{string::String, vec::Vec};
use core::net::Ipv4Addr;
use smoltcp::wire::{EthernetAddress, Ipv4Address, Ipv4Cidr};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct InterfaceId(u32);
impl InterfaceId {
pub const LOOPBACK: Self = Self(1);
pub const fn new(raw: u32) -> Self {
Self(raw)
}
pub const fn get(self) -> u32 {
self.0
}
pub const fn to_linux_ifindex(self) -> i32 {
self.0 as i32
}
pub const fn from_linux_ifindex(ifindex: i32) -> Option<Self> {
if ifindex > 0 {
Some(Self(ifindex as u32))
} else {
None
}
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum InterfaceKind {
Loopback,
Ethernet,
}
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct InterfaceFlags: u32 {
const UP = 1 << 0;
const RUNNING = 1 << 1;
const LOOPBACK = 1 << 2;
const BROADCAST = 1 << 3;
const MULTICAST = 1 << 4;
}
}
#[derive(Debug, Clone)]
pub struct InterfaceInfo {
pub id: InterfaceId,
pub name: String,
pub kind: InterfaceKind,
pub mac: Option<EthernetAddress>,
pub ipv4: Option<Ipv4InterfaceConfig>,
pub mtu: usize,
pub flags: InterfaceFlags,
pub metric: u32,
}
#[derive(Debug, Clone)]
pub enum InterfaceMatcher {
ByOrder(usize),
ByMac(EthernetAddress),
ByDriverName(String),
}
#[derive(Debug, Clone, Default)]
pub struct NetworkConfig {
pub interfaces: Vec<InterfaceConfig>,
pub default_dns_servers: Vec<Ipv4Addr>,
}
#[derive(Debug, Clone)]
pub struct InterfaceConfig {
pub name: String,
pub match_by: InterfaceMatcher,
pub static_ip: Option<StaticIpConfig>,
pub dhcp: bool,
pub metric: u32,
pub dns_servers: Vec<Ipv4Addr>,
}
#[derive(Debug, Clone)]
pub struct StaticIpConfig {
pub ip: Ipv4Addr,
pub prefix_len: u8,
pub gateway: Ipv4Addr,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct Ipv4InterfaceConfig {
pub address: Ipv4Cidr,
pub gateway: Option<Ipv4Address>,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum DnsSource {
Dhcp,
Static,
Fallback,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub(crate) struct DnsServerEntry {
pub server: Ipv4Address,
pub interface_id: InterfaceId,
pub metric: u32,
pub source: DnsSource,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct RouteInfo {
pub filter: smoltcp::wire::IpCidr,
pub via: Option<smoltcp::wire::IpAddress>,
pub interface_id: InterfaceId,
pub source: smoltcp::wire::IpAddress,
pub metric: u32,
}
#[derive(Debug, Clone, Copy, Default, Eq, PartialEq)]
pub struct DeviceBinding {
pub bound_if: Option<InterfaceId>,
}