netscan_os/
result.rs

1use netscan_pcap::PacketFrame;
2
3use super::setting::ProbeType;
4use std::net::IpAddr;
5
6#[derive(Clone, Debug)]
7pub struct IcmpEchoResult {
8    pub icmp_echo_reply: bool,
9    pub fingerprints: Vec<PacketFrame>,
10}
11
12impl IcmpEchoResult {
13    pub fn new() -> IcmpEchoResult {
14        IcmpEchoResult {
15            icmp_echo_reply: false,
16            fingerprints: vec![],
17        }
18    }
19}
20
21#[derive(Clone, Debug)]
22pub struct IcmpTimestampResult {
23    pub icmp_timestamp_reply: bool,
24    pub fingerprints: Vec<PacketFrame>,
25}
26
27impl IcmpTimestampResult {
28    pub fn new() -> IcmpTimestampResult {
29        IcmpTimestampResult {
30            icmp_timestamp_reply: false,
31            fingerprints: vec![],
32        }
33    }
34}
35
36#[derive(Clone, Debug)]
37pub struct IcmpAddressMaskResult {
38    pub icmp_address_mask_reply: bool,
39    pub fingerprints: Vec<PacketFrame>,
40}
41
42impl IcmpAddressMaskResult {
43    pub fn new() -> IcmpAddressMaskResult {
44        IcmpAddressMaskResult {
45            icmp_address_mask_reply: false,
46            fingerprints: vec![],
47        }
48    }
49}
50
51#[derive(Clone, Debug)]
52pub struct IcmpInformationResult {
53    pub icmp_information_reply: bool,
54    pub fingerprints: Vec<PacketFrame>,
55}
56
57impl IcmpInformationResult {
58    pub fn new() -> IcmpInformationResult {
59        IcmpInformationResult {
60            icmp_information_reply: false,
61            fingerprints: vec![],
62        }
63    }
64}
65
66#[derive(Clone, Debug)]
67pub struct IcmpUnreachableIpResult {
68    pub icmp_unreachable_reply: bool,
69    pub icmp_unreachable_size: usize,
70    pub ip_total_length: u16,
71    pub ip_id: u16,
72    pub ip_df: bool,
73    pub ip_ttl: u8,
74    pub fingerprints: Vec<PacketFrame>,
75}
76
77impl IcmpUnreachableIpResult {
78    pub fn new() -> IcmpUnreachableIpResult {
79        IcmpUnreachableIpResult {
80            icmp_unreachable_reply: false,
81            icmp_unreachable_size: 0,
82            ip_total_length: 0,
83            ip_id: 0,
84            ip_df: false,
85            ip_ttl: 0,
86            fingerprints: vec![],
87        }
88    }
89}
90
91#[derive(Clone, Debug)]
92pub struct TcpSynAckResult {
93    pub syn_ack_response: bool,
94    pub fingerprints: Vec<PacketFrame>,
95}
96
97impl TcpSynAckResult {
98    pub fn new() -> TcpSynAckResult {
99        TcpSynAckResult {
100            syn_ack_response: false,
101            fingerprints: vec![],
102        }
103    }
104}
105
106#[derive(Clone, Debug)]
107pub struct TcpRstAckResult {
108    pub rst_ack_response: bool,
109    pub fingerprints: Vec<PacketFrame>,
110}
111
112impl TcpRstAckResult {
113    pub fn new() -> TcpRstAckResult {
114        TcpRstAckResult {
115            rst_ack_response: false,
116            fingerprints: vec![],
117        }
118    }
119}
120
121#[derive(Clone, Debug)]
122pub struct TcpEcnResult {
123    pub syn_ack_ece_response: bool,
124    pub fingerprints: Vec<PacketFrame>,
125}
126
127impl TcpEcnResult {
128    pub fn new() -> TcpEcnResult {
129        TcpEcnResult {
130            syn_ack_ece_response: false,
131            fingerprints: vec![],
132        }
133    }
134}
135
136#[derive(Clone, Debug)]
137pub struct ProbeResult {
138    pub ip_addr: IpAddr,
139    pub icmp_echo_result: Option<IcmpEchoResult>,
140    pub icmp_timestamp_result: Option<IcmpTimestampResult>,
141    pub icmp_address_mask_result: Option<IcmpAddressMaskResult>,
142    pub icmp_information_result: Option<IcmpInformationResult>,
143    pub icmp_unreachable_ip_result: Option<IcmpUnreachableIpResult>,
144    pub tcp_syn_ack_result: Option<TcpSynAckResult>,
145    pub tcp_rst_ack_result: Option<TcpRstAckResult>,
146    pub tcp_ecn_result: Option<TcpEcnResult>,
147}
148
149impl ProbeResult {
150    pub fn new(ip_addr: IpAddr) -> ProbeResult {
151        ProbeResult {
152            ip_addr: ip_addr,
153            icmp_echo_result: None,
154            icmp_timestamp_result: None,
155            icmp_address_mask_result: None,
156            icmp_information_result: None,
157            icmp_unreachable_ip_result: None,
158            tcp_syn_ack_result: None,
159            tcp_rst_ack_result: None,
160            tcp_ecn_result: None,
161        }
162    }
163    pub fn new_with_types(ip_addr: IpAddr, types: Vec<ProbeType>) -> ProbeResult {
164        ProbeResult {
165            ip_addr: ip_addr,
166            icmp_echo_result: if types.contains(&ProbeType::IcmpEchoProbe) {
167                Some(IcmpEchoResult::new())
168            } else {
169                None
170            },
171            icmp_timestamp_result: if types.contains(&ProbeType::IcmpTimestampProbe) {
172                Some(IcmpTimestampResult::new())
173            } else {
174                None
175            },
176            icmp_address_mask_result: if types.contains(&ProbeType::IcmpAddressMaskProbe) {
177                Some(IcmpAddressMaskResult::new())
178            } else {
179                None
180            },
181            icmp_information_result: if types.contains(&ProbeType::IcmpInformationProbe) {
182                Some(IcmpInformationResult::new())
183            } else {
184                None
185            },
186            icmp_unreachable_ip_result: if types.contains(&ProbeType::IcmpUnreachableProbe) {
187                Some(IcmpUnreachableIpResult::new())
188            } else {
189                None
190            },
191            tcp_syn_ack_result: if types.contains(&ProbeType::TcpSynAckProbe) {
192                Some(TcpSynAckResult::new())
193            } else {
194                None
195            },
196            tcp_rst_ack_result: if types.contains(&ProbeType::TcpRstAckProbe) {
197                Some(TcpRstAckResult::new())
198            } else {
199                None
200            },
201            tcp_ecn_result: if types.contains(&ProbeType::TcpEcnProbe) {
202                Some(TcpEcnResult::new())
203            } else {
204                None
205            },
206        }
207    }
208}