diff options
| author | luwenpeng <[email protected]> | 2022-12-22 18:37:39 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2022-12-22 18:37:39 +0800 |
| commit | b6230c5f97f72961aac9c64580d0d036ec245c78 (patch) | |
| tree | fd953f5f5a9766c028cf43e8fe70f33158b74d1a /src/protocol | |
| parent | b7f9b6158cf89698f8702667c78b080bade1b4b2 (diff) | |
Diffstat (limited to 'src/protocol')
| -rw-r--r-- | src/protocol/ip.rs | 61 | ||||
| -rw-r--r-- | src/protocol/mod.rs | 7 |
2 files changed, 68 insertions, 0 deletions
diff --git a/src/protocol/ip.rs b/src/protocol/ip.rs new file mode 100644 index 0000000..4c6dddf --- /dev/null +++ b/src/protocol/ip.rs @@ -0,0 +1,61 @@ +use nom::number; +use nom::IResult; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum IPProtocol { + HOPOPT, + ICMP, + IGMP, + GGP, + IPINIP, + ST, + TCP, + CBT, + EGP, + IGP, + BBNRCCMON, + NVPII, + PUP, + ARGUS, + EMCON, + XNET, + CHAOS, + UDP, + IPV6, + ICMP6, + Other(u8), +} + +impl From<u8> for IPProtocol { + fn from(raw: u8) -> Self { + match raw { + 0 => IPProtocol::HOPOPT, + 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, + 58 => IPProtocol::ICMP6, + other => IPProtocol::Other(other), + } + } +} + +pub(crate) fn protocol(input: &[u8]) -> IResult<&[u8], IPProtocol> { + let (input, protocol) = number::streaming::be_u8(input)?; + + Ok((input, protocol.into())) +} diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs new file mode 100644 index 0000000..ec0d292 --- /dev/null +++ b/src/protocol/mod.rs @@ -0,0 +1,7 @@ +pub mod dns; +pub mod ethernet; +pub mod ip; +pub mod ipv4; +pub mod ipv6; +pub mod tcp; +pub mod udp; |
