1use crate::Archived;
4
5#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
7#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
8#[repr(transparent)]
9pub struct ArchivedIpv4Addr {
10 octets: [Archived<u8>; 4],
11}
12
13impl ArchivedIpv4Addr {
14 #[inline]
16 pub const fn octets(&self) -> [u8; 4] {
17 self.octets
18 }
19}
20
21#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
23#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
24#[repr(transparent)]
25pub struct ArchivedIpv6Addr {
26 octets: [Archived<u8>; 16],
27}
28
29impl ArchivedIpv6Addr {
30 #[inline]
32 pub const fn segments(&self) -> [u16; 8] {
33 [
34 u16::from_be_bytes([self.octets[0], self.octets[1]]),
35 u16::from_be_bytes([self.octets[2], self.octets[3]]),
36 u16::from_be_bytes([self.octets[4], self.octets[5]]),
37 u16::from_be_bytes([self.octets[6], self.octets[7]]),
38 u16::from_be_bytes([self.octets[8], self.octets[9]]),
39 u16::from_be_bytes([self.octets[10], self.octets[11]]),
40 u16::from_be_bytes([self.octets[12], self.octets[13]]),
41 u16::from_be_bytes([self.octets[14], self.octets[15]]),
42 ]
43 }
44}
45
46#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
48#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
49#[repr(u8)]
50pub enum ArchivedIpAddr {
51 V4(ArchivedIpv4Addr),
53 V6(ArchivedIpv6Addr),
55}
56
57impl ArchivedIpAddr {
58 #[inline]
61 pub const fn is_ipv4(&self) -> bool {
62 matches!(self, ArchivedIpAddr::V4(_))
63 }
64
65 #[inline]
68 pub const fn is_ipv6(&self) -> bool {
69 matches!(self, ArchivedIpAddr::V6(_))
70 }
71}
72
73#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
75#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
76#[cfg_attr(feature = "strict", repr(C))]
77pub struct ArchivedSocketAddrV4 {
78 pub(crate) ip: ArchivedIpv4Addr,
79 pub(crate) port: Archived<u16>,
80}
81
82impl ArchivedSocketAddrV4 {
83 #[inline]
85 pub const fn ip(&self) -> &ArchivedIpv4Addr {
86 &self.ip
87 }
88
89 #[inline]
91 pub const fn port(&self) -> u16 {
92 from_archived!(self.port)
93 }
94}
95
96#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
98#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
99#[cfg_attr(feature = "strict", repr(C))]
100pub struct ArchivedSocketAddrV6 {
101 pub(crate) ip: ArchivedIpv6Addr,
102 pub(crate) port: Archived<u16>,
103 pub(crate) flowinfo: Archived<u32>,
104 pub(crate) scope_id: Archived<u32>,
105}
106
107impl ArchivedSocketAddrV6 {
108 #[inline]
112 pub const fn flowinfo(&self) -> u32 {
113 from_archived!(self.flowinfo)
114 }
115
116 #[inline]
118 pub const fn ip(&self) -> &ArchivedIpv6Addr {
119 &self.ip
120 }
121
122 #[inline]
124 pub const fn port(&self) -> u16 {
125 from_archived!(self.port)
126 }
127
128 #[inline]
132 pub const fn scope_id(&self) -> u32 {
133 from_archived!(self.scope_id)
134 }
135}
136
137#[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))]
139#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
140#[repr(u8)]
141pub enum ArchivedSocketAddr {
142 V4(ArchivedSocketAddrV4),
144 V6(ArchivedSocketAddrV6),
146}
147
148impl ArchivedSocketAddr {
149 #[inline]
151 pub fn port(&self) -> u16 {
152 match self {
153 ArchivedSocketAddr::V4(addr) => addr.port(),
154 ArchivedSocketAddr::V6(addr) => addr.port(),
155 }
156 }
157
158 #[inline]
161 pub fn is_ipv4(&self) -> bool {
162 matches!(self, ArchivedSocketAddr::V4(_))
163 }
164
165 #[inline]
168 pub fn is_ipv6(&self) -> bool {
169 matches!(self, ArchivedSocketAddr::V6(_))
170 }
171}