1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
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<u8> 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()))
}
}
|