network/fundamentals/ip/
mod.rs1mod 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}