use std::net::IpAddr;
use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::link::{Addr, Link, MacAddr, NeighState};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ConnectionId(pub String);
impl std::fmt::Display for ConnectionId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
impl From<&str> for ConnectionId {
fn from(s: &str) -> Self {
ConnectionId(s.to_owned())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Family {
V4,
V6,
}
impl Family {
pub fn of(ip: IpAddr) -> Self {
match ip {
IpAddr::V4(_) => Family::V4,
IpAddr::V6(_) => Family::V6,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Connection {
pub id: ConnectionId,
pub medium: Medium,
pub link: Link,
pub addresses: Vec<Addr>,
pub primary_v4: Option<IpAddr>,
pub primary_v6: Option<IpAddr>,
pub v4_lease: Option<DhcpLease>,
pub gateway: Option<Gateway>,
pub dns: Vec<IpAddr>,
pub is_default: bool,
pub default_metric: Option<u32>,
pub profile: Option<Profile>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Medium {
Ethernet,
Wifi {
ssid: Option<String>,
signal: Option<WifiSignal>,
security: Option<WifiSecurity>,
},
Virtual { kind: VirtualKind },
Vpn { kind: VpnKind },
Cellular {
operator: Option<String>,
},
Loopback,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VirtualKind {
Docker,
Bridge,
Veth,
Tap,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VpnKind {
Wireguard,
OpenVpn,
Tun,
Tap,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct WifiSignal {
pub rssi_dbm: i32,
pub quality_pct: Option<u8>,
pub rate_mbps: Option<u32>,
}
impl Eq for WifiSignal {}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WifiSecurity {
Open,
Wep,
Wpa2Personal,
Wpa2Enterprise,
Wpa3Personal,
Wpa3Enterprise,
Other(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessPoint {
pub ssid: String,
pub bssid: String,
pub signal: WifiSignal,
pub frequency_mhz: u32,
pub security: WifiSecurity,
pub in_use: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Gateway {
pub ip: IpAddr,
pub lladdr: Option<MacAddr>,
pub l2_state: NeighState,
pub is_router: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Profile {
pub name: String,
pub uuid: String,
pub autoconnect: bool,
pub kind: String,
pub iface: Option<String>,
pub active: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DhcpLease {
pub expires_in: Duration,
pub server: Option<IpAddr>,
}