net_parser_rs/flow/layer4/
vxlan.rs

1use crate::flow::Flow;
2use crate::flow::errors::Error;
3use crate::flow::info::layer2::{Info as L2Info};
4use crate::flow::info::layer3::{Info as L3Info};
5use crate::flow::layer2::{FlowExtraction as Layer2Extraction};
6use crate::flow::layer4::FlowExtraction;
7use crate::layer2::ethernet::Ethernet;
8use crate::layer4::Vxlan;
9
10use log::*;
11
12pub mod errors {
13    use crate::errors::Error as NetParserError;
14    use crate::layer2::ethernet::EthernetTypeId;
15    use thiserror::{Error as ThisError};
16
17    #[derive(Debug, ThisError)]
18    pub enum Error {
19        #[error("Error parsing Vxlan: {0:?}")]
20        NetParser(#[from] NetParserError),
21        #[error("Incomplete parse of {:?}: {}", l3, size)]
22        Incomplete {
23            l3: EthernetTypeId,
24            size: usize
25        },
26    }
27
28    unsafe impl Sync for Error {}
29    unsafe impl Send for Error {}
30}
31
32impl<'a> FlowExtraction for Vxlan<'a> {
33    fn extract_flow(&self, _l2: L2Info, _l3: L3Info) -> Result<Flow, Error> {
34        Ethernet::parse(self.payload)
35            .map_err(|e| {
36                error!("Error parsing ethernet {:?}", e);
37                Error::L4(errors::Error::NetParser(e).into())
38            })
39            .and_then(|r| {
40                let (rem, l2) = r;
41                if rem.is_empty() {
42                    l2.extract_flow()
43                } else {
44                    Err(Error::L4(errors::Error::Incomplete {
45                        l3: l2.ether_type,
46                        size: rem.len()
47                    }.into()))
48                }
49            })
50    }
51}