net_parser_rs/layer3/
mod.rs

1pub mod arp;
2pub mod ipv4;
3pub mod ipv6;
4
5pub use arp::Arp as Arp;
6pub use ipv4::IPv4 as IPv4;
7pub use ipv6::IPv6 as IPv6;
8
9use log::*;
10
11///
12/// Available layer 3 representations
13///
14#[derive(Clone, Copy, Debug)]
15pub enum Layer3<'a> {
16    Arp(Arp),
17    IPv4(IPv4<'a>),
18    IPv6(IPv6<'a>),
19    //Lldp(lldp::Lldp)
20}
21
22///
23/// IP Protocol numbers https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
24///
25#[derive(Clone, Copy, Debug, PartialEq, Eq)]
26pub enum InternetProtocolId {
27    AuthenticationHeader,
28    HopByHop,
29    EncapsulatingSecurityPayload,
30    ICMP,
31    IPv6Route,
32    IPv6Fragment,
33    IPv6NoNext,
34    IPv6Options,
35    Tcp,
36    Udp,
37}
38
39impl InternetProtocolId {
40    pub fn value(&self) -> u8 {
41        match self {
42            InternetProtocolId::AuthenticationHeader => 50,
43            InternetProtocolId::HopByHop => 0,
44            InternetProtocolId::EncapsulatingSecurityPayload => 51,
45            InternetProtocolId::ICMP => 1,
46            InternetProtocolId::IPv6Route => 43,
47            InternetProtocolId::IPv6Fragment => 44,
48            InternetProtocolId::IPv6NoNext => 59,
49            InternetProtocolId::IPv6Options => 60,
50            InternetProtocolId::Tcp => 6,
51            InternetProtocolId::Udp => 17,
52        }
53    }
54    pub fn new(value: u8) -> Option<InternetProtocolId> {
55        match value {
56            0 => Some(InternetProtocolId::HopByHop),
57            1 => Some(InternetProtocolId::ICMP),
58            6 => Some(InternetProtocolId::Tcp),
59            17 => Some(InternetProtocolId::Udp),
60            43 => Some(InternetProtocolId::IPv6Route),
61            44 => Some(InternetProtocolId::IPv6Fragment),
62            50 => Some(InternetProtocolId::AuthenticationHeader),
63            51 => Some(InternetProtocolId::EncapsulatingSecurityPayload),
64            59 => Some(InternetProtocolId::IPv6NoNext),
65            60 => Some(InternetProtocolId::IPv6Options),
66            _ => {
67                //TODO: change to warn once list is more complete
68                debug!("Encountered {:02x} when parsing layer 4 id", value);
69                None
70            }
71        }
72    }
73
74    pub fn has_next_option(v: InternetProtocolId) -> bool {
75        match v {
76            InternetProtocolId::AuthenticationHeader => true,
77            InternetProtocolId::EncapsulatingSecurityPayload => true,
78            InternetProtocolId::HopByHop => true,
79            InternetProtocolId::IPv6Route => true,
80            InternetProtocolId::IPv6Fragment => true,
81            InternetProtocolId::IPv6Options => true,
82            _ => false,
83        }
84    }
85}