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