#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Layer {
LinuxSllHeader,
Ethernet2Header,
EtherPayload,
VlanHeader,
MacsecHeader,
MacsecPacket,
IpHeader,
Ipv4Header,
Ipv4Packet,
IpAuthHeader,
Ipv6Header,
Ipv6Packet,
Ipv6ExtHeader,
Ipv6HopByHopHeader,
Ipv6DestOptionsHeader,
Ipv6RouteHeader,
Ipv6FragHeader,
UdpHeader,
UdpPayload,
TcpHeader,
Icmpv4,
Icmpv4Timestamp,
Icmpv4TimestampReply,
Icmpv6,
Arp,
}
impl Layer {
pub fn error_title(&self) -> &'static str {
use Layer::*;
match self {
LinuxSllHeader => "Linux Cooked Capture v1 Error",
Ethernet2Header => "Ethernet 2 Header Error",
EtherPayload => "Payload with Ether Type Error",
VlanHeader => "VLAN Header Error",
MacsecHeader => "MACsec Header Error",
MacsecPacket => "MACsec Packet Error",
IpHeader => "IP Header Error",
Ipv4Header => "IPv4 Header Error",
Ipv4Packet => "IPv4 Packet Error",
IpAuthHeader => "IP Authentication Header Error",
Ipv6Header => "IPv6 Header Error",
Ipv6Packet => "IPv6 Packet Error",
Ipv6ExtHeader => "IPv6 Extension Header Error",
Ipv6HopByHopHeader => "IPv6 Hop-by-Hop Option Header Error",
Ipv6DestOptionsHeader => "IPv6 Destination Options Header Error",
Ipv6RouteHeader => "IPv6 Routing Header Error",
Ipv6FragHeader => "IPv6 Fragment Header Error",
UdpHeader => "UDP Header Error",
UdpPayload => "UDP Payload Error",
TcpHeader => "TCP Header Error",
Icmpv4 => "ICMP Packet Error",
Icmpv4Timestamp => "ICMP Timestamp Error",
Icmpv4TimestampReply => "ICMP Timestamp Reply Error",
Icmpv6 => "ICMPv6 Packet Error",
Arp => "Address Resolution Protocol Packet Error",
}
}
}
impl core::fmt::Display for Layer {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
use Layer::*;
match self {
LinuxSllHeader => write!(f, "Linux Cooked Capture v1 header"),
Ethernet2Header => write!(f, "Ethernet 2 header"),
EtherPayload => write!(f, "Ether type payload"),
VlanHeader => write!(f, "VLAN header"),
MacsecHeader => write!(f, "MACsec header"),
MacsecPacket => write!(f, "MACsec packet"),
IpHeader => write!(f, "IP header"),
Ipv4Header => write!(f, "IPv4 header"),
Ipv4Packet => write!(f, "IPv4 packet"),
IpAuthHeader => write!(f, "IP Authentication header"),
Ipv6Header => write!(f, "IPv6 header"),
Ipv6Packet => write!(f, "IPv6 packet"),
Ipv6ExtHeader => write!(f, "IPv6 extension header"),
Ipv6HopByHopHeader => write!(f, "IPv6 hop-by-hop option header"),
Ipv6DestOptionsHeader => write!(f, "IPv6 destination options header"),
Ipv6RouteHeader => write!(f, "IPv6 routing header"),
Ipv6FragHeader => write!(f, "IPv6 fragment header"),
UdpHeader => write!(f, "UDP header"),
UdpPayload => write!(f, "UDP payload"),
TcpHeader => write!(f, "TCP header"),
Icmpv4 => write!(f, "ICMP packet"),
Icmpv4Timestamp => write!(f, "ICMP timestamp message"),
Icmpv4TimestampReply => write!(f, "ICMP timestamp reply message"),
Icmpv6 => write!(f, "ICMPv6 packet"),
Arp => write!(f, "Address Resolution Protocol packet"),
}
}
}
#[cfg(test)]
mod test {
use super::Layer::*;
use alloc::format;
use std::{
cmp::Ordering,
collections::hash_map::DefaultHasher,
hash::{Hash, Hasher},
};
#[test]
fn debug() {
assert_eq!("Ethernet2Header", format!("{:?}", Ethernet2Header));
}
#[test]
fn clone_eq_hash_ord() {
let layer = Ethernet2Header;
assert_eq!(layer, layer.clone());
let hash_a = {
let mut hasher = DefaultHasher::new();
layer.hash(&mut hasher);
hasher.finish()
};
let hash_b = {
let mut hasher = DefaultHasher::new();
layer.clone().hash(&mut hasher);
hasher.finish()
};
assert_eq!(hash_a, hash_b);
assert_eq!(Ordering::Equal, layer.cmp(&layer));
assert_eq!(Some(Ordering::Equal), layer.partial_cmp(&layer));
}
#[test]
fn error_title() {
let tests = [
(LinuxSllHeader, "Linux Cooked Capture v1 Error"),
(Ethernet2Header, "Ethernet 2 Header Error"),
(EtherPayload, "Payload with Ether Type Error"),
(VlanHeader, "VLAN Header Error"),
(MacsecHeader, "MACsec Header Error"),
(MacsecPacket, "MACsec Packet Error"),
(IpHeader, "IP Header Error"),
(Ipv4Header, "IPv4 Header Error"),
(Ipv4Packet, "IPv4 Packet Error"),
(IpAuthHeader, "IP Authentication Header Error"),
(Ipv6Header, "IPv6 Header Error"),
(Ipv6Packet, "IPv6 Packet Error"),
(Ipv6ExtHeader, "IPv6 Extension Header Error"),
(Ipv6HopByHopHeader, "IPv6 Hop-by-Hop Option Header Error"),
(
Ipv6DestOptionsHeader,
"IPv6 Destination Options Header Error",
),
(Ipv6RouteHeader, "IPv6 Routing Header Error"),
(Ipv6FragHeader, "IPv6 Fragment Header Error"),
(UdpHeader, "UDP Header Error"),
(UdpPayload, "UDP Payload Error"),
(TcpHeader, "TCP Header Error"),
(Icmpv4, "ICMP Packet Error"),
(Icmpv4Timestamp, "ICMP Timestamp Error"),
(Icmpv4TimestampReply, "ICMP Timestamp Reply Error"),
(Icmpv6, "ICMPv6 Packet Error"),
(Arp, "Address Resolution Protocol Packet Error"),
];
for test in tests {
assert_eq!(test.0.error_title(), test.1);
}
}
#[test]
fn fmt() {
let tests = [
(LinuxSllHeader, "Linux Cooked Capture v1 header"),
(Ethernet2Header, "Ethernet 2 header"),
(EtherPayload, "Ether type payload"),
(VlanHeader, "VLAN header"),
(MacsecHeader, "MACsec header"),
(MacsecPacket, "MACsec packet"),
(IpHeader, "IP header"),
(Ipv4Header, "IPv4 header"),
(Ipv4Packet, "IPv4 packet"),
(IpAuthHeader, "IP Authentication header"),
(Ipv6Header, "IPv6 header"),
(Ipv6Packet, "IPv6 packet"),
(Ipv6ExtHeader, "IPv6 extension header"),
(Ipv6HopByHopHeader, "IPv6 hop-by-hop option header"),
(Ipv6DestOptionsHeader, "IPv6 destination options header"),
(Ipv6RouteHeader, "IPv6 routing header"),
(Ipv6FragHeader, "IPv6 fragment header"),
(UdpHeader, "UDP header"),
(UdpPayload, "UDP payload"),
(TcpHeader, "TCP header"),
(Icmpv4, "ICMP packet"),
(Icmpv4Timestamp, "ICMP timestamp message"),
(Icmpv4TimestampReply, "ICMP timestamp reply message"),
(Icmpv6, "ICMPv6 packet"),
(Arp, "Address Resolution Protocol packet"),
];
for test in tests {
assert_eq!(format!("{}", test.0), test.1);
}
}
}