net_parser_rs/flow/layer4/
vxlan.rs1use 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}