use crate::protocol::codec::Decode; use nom::number; use nom::IResult; /****************************************************************************** * Struct ******************************************************************************/ #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum IPProtocol { IPV6HOP, ICMP, IGMP, GGP, IPINIP, ST, TCP, CBT, EGP, IGP, BBNRCCMON, NVPII, PUP, ARGUS, EMCON, XNET, CHAOS, UDP, IPV6, IPV6ROUTING, IPV6FRAGMENT, GRE, ESP, AUTH, ICMP6, IPV6DEST, Other(u8), } /****************************************************************************** * API ******************************************************************************/ impl From for IPProtocol { fn from(raw: u8) -> Self { match raw { 0 => IPProtocol::IPV6HOP, // IPv6 Hop-by-Hop Options 1 => IPProtocol::ICMP, 2 => IPProtocol::IGMP, 3 => IPProtocol::GGP, 4 => IPProtocol::IPINIP, 5 => IPProtocol::ST, 6 => IPProtocol::TCP, 7 => IPProtocol::CBT, 8 => IPProtocol::EGP, 9 => IPProtocol::IGP, 10 => IPProtocol::BBNRCCMON, 11 => IPProtocol::NVPII, 12 => IPProtocol::PUP, 13 => IPProtocol::ARGUS, 14 => IPProtocol::EMCON, 15 => IPProtocol::XNET, 16 => IPProtocol::CHAOS, 17 => IPProtocol::UDP, 41 => IPProtocol::IPV6, 43 => IPProtocol::IPV6ROUTING, // IPv6 Routing Header 44 => IPProtocol::IPV6FRAGMENT, // IPv6 Fragment Header 47 => IPProtocol::GRE, // GRE encapsulation [RFC2784][RFC2890] 50 => IPProtocol::ESP, // Encap Security Payload [RFC4303] 51 => IPProtocol::AUTH, // Authentication Header [RFC4302] 58 => IPProtocol::ICMP6, 60 => IPProtocol::IPV6DEST, // IPv6 Destination Options other => IPProtocol::Other(other), } } } impl IPProtocol { pub fn is_ipv6_ext_header(next_header: IPProtocol) -> bool { match next_header { IPProtocol::IPV6HOP => true, IPProtocol::IPV6ROUTING => true, IPProtocol::IPV6FRAGMENT => true, // IPProtocol::ESP => true, IPProtocol::AUTH => true, IPProtocol::IPV6DEST => true, _ => false, } } } impl Decode for IPProtocol { type Iterm = IPProtocol; fn decode(input: &[u8]) -> IResult<&[u8], IPProtocol> { let (input, protocol) = number::streaming::be_u8(input)?; Ok((input, protocol.into())) } }