network/fundamentals/ip/
mod.rs

1mod ipv4;
2mod ipv6;
3
4use core::fmt::Display;
5
6pub use ipv4::*;
7pub use ipv6::*;
8
9#[repr(C)]
10#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
11pub enum IpAddress {
12    IPv4(Ipv4),
13    IPv6(Ipv6),
14}
15
16impl Default for IpAddress {
17    fn default() -> Self {
18        IpAddress::IPv4(Ipv4::default())
19    }
20}
21
22impl IpAddress {
23    pub const fn new_ipv4(value: [u8; 4]) -> Self {
24        Self::IPv4(Ipv4::new(value))
25    }
26
27    pub const fn new_ipv6(value: [u16; 8]) -> Self {
28        Self::IPv6(Ipv6::new(value))
29    }
30
31    pub const fn into_smoltcp(&self) -> smoltcp::wire::IpAddress {
32        match self {
33            IpAddress::IPv4(value) => smoltcp::wire::IpAddress::Ipv4(value.into_smoltcp()),
34            IpAddress::IPv6(value) => smoltcp::wire::IpAddress::Ipv6(value.into_smoltcp()),
35        }
36    }
37
38    pub const fn from_smoltcp(value: &smoltcp::wire::IpAddress) -> Self {
39        match value {
40            smoltcp::wire::IpAddress::Ipv4(v4_addr) => {
41                IpAddress::IPv4(crate::Ipv4::from_smoltcp(v4_addr))
42            }
43            smoltcp::wire::IpAddress::Ipv6(v6_addr) => {
44                IpAddress::IPv6(crate::Ipv6::from_smoltcp(v6_addr))
45            }
46        }
47    }
48}
49
50impl TryFrom<&str> for IpAddress {
51    type Error = ();
52
53    fn try_from(value: &str) -> Result<Self, Self::Error> {
54        if let Ok(ipv4) = Ipv4::try_from(value) {
55            Ok(IpAddress::IPv4(ipv4))
56        } else if let Ok(ipv6) = Ipv6::try_from(value) {
57            Ok(IpAddress::IPv6(ipv6))
58        } else {
59            Err(())
60        }
61    }
62}
63
64impl From<[u8; 4]> for IpAddress {
65    fn from(value: [u8; 4]) -> Self {
66        IpAddress::IPv4(Ipv4::new(value))
67    }
68}
69
70impl From<&[u8; 4]> for IpAddress {
71    fn from(value: &[u8; 4]) -> Self {
72        IpAddress::IPv4(Ipv4::new(*value))
73    }
74}
75
76impl From<[u8; 16]> for IpAddress {
77    fn from(value: [u8; 16]) -> Self {
78        IpAddress::IPv6(Ipv6::from_inner(value))
79    }
80}
81
82impl From<&[u8; 16]> for IpAddress {
83    fn from(value: &[u8; 16]) -> Self {
84        IpAddress::IPv6(Ipv6::from_inner(*value))
85    }
86}
87
88impl From<IpAddress> for smoltcp::wire::IpAddress {
89    fn from(value: IpAddress) -> Self {
90        value.into_smoltcp()
91    }
92}
93
94impl From<smoltcp::wire::IpAddress> for IpAddress {
95    fn from(value: smoltcp::wire::IpAddress) -> Self {
96        IpAddress::from_smoltcp(&value)
97    }
98}
99
100impl Display for IpAddress {
101    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
102        match self {
103            IpAddress::IPv4(value) => write!(f, "{value}"),
104            IpAddress::IPv6(value) => write!(f, "{value}"),
105        }
106    }
107}
108
109impl From<Ipv4> for IpAddress {
110    fn from(value: Ipv4) -> Self {
111        Self::IPv4(value)
112    }
113}
114
115impl From<Ipv6> for IpAddress {
116    fn from(value: Ipv6) -> Self {
117        Self::IPv6(value)
118    }
119}