1use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Debug, Clone)]
6pub struct Iface {
7 pub name: String,
8 pub ipv4: Option<Ipv4Addr>,
9 pub ipv6: Option<Ipv6Addr>,
10 pub index: u32,
11}
12
13#[derive(Debug, Clone, Default)]
14pub enum Stack {
15 #[default]
16 V4,
17 V6,
18}
19impl From<&SocketAddr> for Stack {
20 fn from(value: &SocketAddr) -> Self {
21 match value {
22 SocketAddr::V4(..) => Self::V4,
23 SocketAddr::V6(..) => Self::V6,
24 }
25 }
26}
27impl From<&IpAddr> for Stack {
28 fn from(value: &IpAddr) -> Self {
29 match value {
30 IpAddr::V4(..) => Self::V4,
31 IpAddr::V6(..) => Self::V6,
32 }
33 }
34}
35
36#[derive(Serialize, Debug, Clone, Copy)]
37pub enum Network {
38 TCP,
39 UDP,
40 ICMPv4,
41 ICMPv6,
42}
43
44#[derive(Debug, Clone, Copy)]
45pub enum StackPrefer {
46 V4,
47 V6,
48 V4V6,
49 V6V4,
50}
51
52impl StackPrefer {
53 pub fn support_v6(&self) -> bool {
54 !matches!(self, StackPrefer::V4)
55 }
56}