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}