etherparse/err/
layer.rs

1/// Layers on which an error can occur.
2#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
3pub enum Layer {
4    /// Error occurred in the Linux Cooked Capture v1 (SLL) header.
5    LinuxSllHeader,
6    /// Error occurred in the ethernet 2 header.
7    Ethernet2Header,
8    /// Payload identified by an ether type number (e.g. after an ethernet 2 header).
9    EtherPayload,
10    /// Error occurred in the vlan header.
11    VlanHeader,
12    /// Error occurred in the MACsec header (also known as Sectag).
13    MacsecHeader,
14    /// Error occurred while verifying the total MACsec packet length is long enough
15    /// for the "short length".
16    MacsecPacket,
17    /// Error occurred when decoding an IP header (v4 or v6).
18    IpHeader,
19    /// Error occurred in the IPv4 layer.
20    Ipv4Header,
21    /// Error occurred verifying the total length of an IPv4 packet.
22    Ipv4Packet,
23    /// Error occurred in the IP Authentication header.
24    IpAuthHeader,
25    /// Error occurred in the IPv6 layer.
26    Ipv6Header,
27    /// Error occurred verifying the payload length of an IPv6 packet.
28    Ipv6Packet,
29    /// Error occurred while decoding a generic IPv6 extension header.
30    Ipv6ExtHeader,
31    /// Error occurred while decoding "IPv6 Hop-by-Hop Option" extension header.
32    Ipv6HopByHopHeader,
33    /// Error occurred while decoding "IPv6 Destination Options" extension header.
34    Ipv6DestOptionsHeader,
35    /// Error occurred while decoding "IPv6 Routing" extension header.
36    Ipv6RouteHeader,
37    /// Error occurred while decoding an IPv6 fragment header.
38    Ipv6FragHeader,
39    /// Error occurred while decoding an UDP header.
40    UdpHeader,
41    /// Error occurred verifying the length of the UDP payload.
42    UdpPayload,
43    /// Error occurred while decoding a TCP header.
44    TcpHeader,
45    /// Error occurred while parsing an ICMP packet.
46    Icmpv4,
47    /// Error occurred while parsing an ICMP timestamp packet.
48    Icmpv4Timestamp,
49    /// Error occurred while parsing an ICMP timestamp reply packet.
50    Icmpv4TimestampReply,
51    /// Error occurred while parsing an ICMPv6 packet.
52    Icmpv6,
53    /// Error occurred while parsing an Address Resolution Protocol packet.
54    Arp,
55}
56
57impl Layer {
58    /// String that is used as a title for the error.
59    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}