net_parser_rs/flow/layer4/
udp.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::info::layer4::{Id, Info as L4Info};
6use crate::flow::layer4::FlowExtraction;
7use crate::layer4::udp::Udp;
8
9pub mod errors {
10    use crate::errors::Error as NetParserError;
11    use thiserror::{Error as ThisError};
12
13    #[derive(Debug, ThisError)]
14    pub enum Error {
15        #[error("Error parsing UDP: {0:?}")]
16        NetParser(#[from] NetParserError),
17    }
18
19    unsafe impl Sync for Error {}
20    unsafe impl Send for Error {}
21}
22
23impl<'a> FlowExtraction for Udp<'a> {
24    fn extract_flow(&self, l2: L2Info, l3: L3Info) -> Result<Flow, Error> {
25        Ok(Flow::new(
26            l2,
27            l3,
28            L4Info {
29                id: Id::Udp,
30                dst_port: self.dst_port,
31                src_port: self.src_port,
32            }
33        ))
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    use crate::common::MacAddress;
42    use crate::flow::info::layer2::{Id as L2Id, Info as L2Info};
43    use crate::flow::info::layer3::{Id as L3Id, Info as L3Info};
44    use crate::flow::info::layer4::{Id as L4Id};
45    use crate::layer4::udp::Udp;
46    use crate::layer4::udp::tests::RAW_DATA;
47
48    #[test]
49    fn convert_udp() {
50        let _ = env_logger::try_init();
51
52        let (rem, l4) = Udp::parse(RAW_DATA).expect("Unable to parse");
53
54        assert!(rem.is_empty());
55
56        let l2 = L2Info {
57            id: L2Id::Ethernet,
58            src_mac: MacAddress::default(),
59            dst_mac: MacAddress::default(),
60            vlan: 0
61        };
62
63        let l3 = L3Info {
64            id: L3Id::IPv4,
65            src_ip: "0.0.0.0".parse().expect("Could not parse"),
66            dst_ip: "0.0.0.0".parse().expect("Could not parse")
67        };
68
69        let info = l4.extract_flow(l2, l3).expect("Could not convert to layer 4 info");
70
71        assert_eq!(info.layer2, L2Id::Ethernet);
72        assert_eq!(info.layer3, L3Id::IPv4);
73        assert_eq!(info.layer4, L4Id::Udp);
74        assert_eq!(info.destination.port, 80);
75        assert_eq!(info.source.port, 50871);
76    }
77}