net_parser_rs/flow/layer4/
udp.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::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}