1#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
3pub enum Layer {
4 LinuxSllHeader,
6 Ethernet2Header,
8 EtherPayload,
10 VlanHeader,
12 MacsecHeader,
14 MacsecPacket,
17 IpHeader,
19 Ipv4Header,
21 Ipv4Packet,
23 IpAuthHeader,
25 Ipv6Header,
27 Ipv6Packet,
29 Ipv6ExtHeader,
31 Ipv6HopByHopHeader,
33 Ipv6DestOptionsHeader,
35 Ipv6RouteHeader,
37 Ipv6FragHeader,
39 UdpHeader,
41 UdpPayload,
43 TcpHeader,
45 Icmpv4,
47 Icmpv4Timestamp,
49 Icmpv4TimestampReply,
51 Icmpv6,
53 Arp,
55}
56
57impl Layer {
58 pub fn error_title(&self) -> &'static str {
60 use Layer::*;
61 match self {
62 LinuxSllHeader => "Linux Cooked Capture v1 Error",
63 Ethernet2Header => "Ethernet 2 Header Error",
64 EtherPayload => "Payload with Ether Type Error",
65 VlanHeader => "VLAN Header Error",
66 MacsecHeader => "MACsec Header Error",
67 MacsecPacket => "MACsec Packet Error",
68 IpHeader => "IP Header Error",
69 Ipv4Header => "IPv4 Header Error",
70 Ipv4Packet => "IPv4 Packet Error",
71 IpAuthHeader => "IP Authentication Header Error",
72 Ipv6Header => "IPv6 Header Error",
73 Ipv6Packet => "IPv6 Packet Error",
74 Ipv6ExtHeader => "IPv6 Extension Header Error",
75 Ipv6HopByHopHeader => "IPv6 Hop-by-Hop Option Header Error",
76 Ipv6DestOptionsHeader => "IPv6 Destination Options Header Error",
77 Ipv6RouteHeader => "IPv6 Routing Header Error",
78 Ipv6FragHeader => "IPv6 Fragment Header Error",
79 UdpHeader => "UDP Header Error",
80 UdpPayload => "UDP Payload Error",
81 TcpHeader => "TCP Header Error",
82 Icmpv4 => "ICMP Packet Error",
83 Icmpv4Timestamp => "ICMP Timestamp Error",
84 Icmpv4TimestampReply => "ICMP Timestamp Reply Error",
85 Icmpv6 => "ICMPv6 Packet Error",
86 Arp => "Address Resolution Protocol Packet Error",
87 }
88 }
89}
90
91impl core::fmt::Display for Layer {
92 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
93 use Layer::*;
94 match self {
95 LinuxSllHeader => write!(f, "Linux Cooked Capture v1 header"),
96 Ethernet2Header => write!(f, "Ethernet 2 header"),
97 EtherPayload => write!(f, "Ether type payload"),
98 VlanHeader => write!(f, "VLAN header"),
99 MacsecHeader => write!(f, "MACsec header"),
100 MacsecPacket => write!(f, "MACsec packet"),
101 IpHeader => write!(f, "IP header"),
102 Ipv4Header => write!(f, "IPv4 header"),
103 Ipv4Packet => write!(f, "IPv4 packet"),
104 IpAuthHeader => write!(f, "IP Authentication header"),
105 Ipv6Header => write!(f, "IPv6 header"),
106 Ipv6Packet => write!(f, "IPv6 packet"),
107 Ipv6ExtHeader => write!(f, "IPv6 extension header"),
108 Ipv6HopByHopHeader => write!(f, "IPv6 hop-by-hop option header"),
109 Ipv6DestOptionsHeader => write!(f, "IPv6 destination options header"),
110 Ipv6RouteHeader => write!(f, "IPv6 routing header"),
111 Ipv6FragHeader => write!(f, "IPv6 fragment header"),
112 UdpHeader => write!(f, "UDP header"),
113 UdpPayload => write!(f, "UDP payload"),
114 TcpHeader => write!(f, "TCP header"),
115 Icmpv4 => write!(f, "ICMP packet"),
116 Icmpv4Timestamp => write!(f, "ICMP timestamp message"),
117 Icmpv4TimestampReply => write!(f, "ICMP timestamp reply message"),
118 Icmpv6 => write!(f, "ICMPv6 packet"),
119 Arp => write!(f, "Address Resolution Protocol packet"),
120 }
121 }
122}
123
124#[cfg(test)]
125mod test {
126 use super::Layer::*;
127 use alloc::format;
128 use std::{
129 cmp::Ordering,
130 collections::hash_map::DefaultHasher,
131 hash::{Hash, Hasher},
132 };
133
134 #[test]
135 fn debug() {
136 assert_eq!("Ethernet2Header", format!("{:?}", Ethernet2Header));
137 }
138
139 #[test]
140 fn clone_eq_hash_ord() {
141 let layer = Ethernet2Header;
142 assert_eq!(layer, layer.clone());
143 let hash_a = {
144 let mut hasher = DefaultHasher::new();
145 layer.hash(&mut hasher);
146 hasher.finish()
147 };
148 let hash_b = {
149 let mut hasher = DefaultHasher::new();
150 layer.clone().hash(&mut hasher);
151 hasher.finish()
152 };
153 assert_eq!(hash_a, hash_b);
154 assert_eq!(Ordering::Equal, layer.cmp(&layer));
155 assert_eq!(Some(Ordering::Equal), layer.partial_cmp(&layer));
156 }
157
158 #[test]
159 fn error_title() {
160 let tests = [
161 (LinuxSllHeader, "Linux Cooked Capture v1 Error"),
162 (Ethernet2Header, "Ethernet 2 Header Error"),
163 (EtherPayload, "Payload with Ether Type Error"),
164 (VlanHeader, "VLAN Header Error"),
165 (MacsecHeader, "MACsec Header Error"),
166 (MacsecPacket, "MACsec Packet Error"),
167 (IpHeader, "IP Header Error"),
168 (Ipv4Header, "IPv4 Header Error"),
169 (Ipv4Packet, "IPv4 Packet Error"),
170 (IpAuthHeader, "IP Authentication Header Error"),
171 (Ipv6Header, "IPv6 Header Error"),
172 (Ipv6Packet, "IPv6 Packet Error"),
173 (Ipv6ExtHeader, "IPv6 Extension Header Error"),
174 (Ipv6HopByHopHeader, "IPv6 Hop-by-Hop Option Header Error"),
175 (
176 Ipv6DestOptionsHeader,
177 "IPv6 Destination Options Header Error",
178 ),
179 (Ipv6RouteHeader, "IPv6 Routing Header Error"),
180 (Ipv6FragHeader, "IPv6 Fragment Header Error"),
181 (UdpHeader, "UDP Header Error"),
182 (UdpPayload, "UDP Payload Error"),
183 (TcpHeader, "TCP Header Error"),
184 (Icmpv4, "ICMP Packet Error"),
185 (Icmpv4Timestamp, "ICMP Timestamp Error"),
186 (Icmpv4TimestampReply, "ICMP Timestamp Reply Error"),
187 (Icmpv6, "ICMPv6 Packet Error"),
188 (Arp, "Address Resolution Protocol Packet Error"),
189 ];
190 for test in tests {
191 assert_eq!(test.0.error_title(), test.1);
192 }
193 }
194
195 #[test]
196 fn fmt() {
197 let tests = [
198 (LinuxSllHeader, "Linux Cooked Capture v1 header"),
199 (Ethernet2Header, "Ethernet 2 header"),
200 (EtherPayload, "Ether type payload"),
201 (VlanHeader, "VLAN header"),
202 (MacsecHeader, "MACsec header"),
203 (MacsecPacket, "MACsec packet"),
204 (IpHeader, "IP header"),
205 (Ipv4Header, "IPv4 header"),
206 (Ipv4Packet, "IPv4 packet"),
207 (IpAuthHeader, "IP Authentication header"),
208 (Ipv6Header, "IPv6 header"),
209 (Ipv6Packet, "IPv6 packet"),
210 (Ipv6ExtHeader, "IPv6 extension header"),
211 (Ipv6HopByHopHeader, "IPv6 hop-by-hop option header"),
212 (Ipv6DestOptionsHeader, "IPv6 destination options header"),
213 (Ipv6RouteHeader, "IPv6 routing header"),
214 (Ipv6FragHeader, "IPv6 fragment header"),
215 (UdpHeader, "UDP header"),
216 (UdpPayload, "UDP payload"),
217 (TcpHeader, "TCP header"),
218 (Icmpv4, "ICMP packet"),
219 (Icmpv4Timestamp, "ICMP timestamp message"),
220 (Icmpv4TimestampReply, "ICMP timestamp reply message"),
221 (Icmpv6, "ICMPv6 packet"),
222 (Arp, "Address Resolution Protocol packet"),
223 ];
224 for test in tests {
225 assert_eq!(format!("{}", test.0), test.1);
226 }
227 }
228}