1use std::net::{IpAddr, Ipv4Addr};
2use std::time::Duration;
3use xenet::net::mac::MacAddr;
4use xenet::packet::tcp::TcpOption;
5
6pub(crate) const LISTENER_WAIT_TIME_MILLIS: u64 = 100;
8
9#[derive(Clone, Copy, Debug, PartialEq)]
11pub enum ProbeType {
12 IcmpEchoProbe,
13 IcmpTimestampProbe,
14 IcmpAddressMaskProbe,
15 IcmpInformationProbe,
16 IcmpUnreachableProbe,
17 TcpProbe,
18 TcpSynAckProbe,
19 TcpRstAckProbe,
20 TcpEcnProbe,
21}
22
23#[derive(Clone, Copy, Debug)]
25pub enum TcpOptionKind {
26 Eol,
27 Nop,
28 Mss,
29 Wscale,
30 SackParmitted,
31 Sack,
32 Timestamp,
33}
34
35impl TcpOptionKind {
36 pub fn number(&self) -> u8 {
37 match *self {
38 TcpOptionKind::Eol => 0,
39 TcpOptionKind::Nop => 1,
40 TcpOptionKind::Mss => 2,
41 TcpOptionKind::Wscale => 3,
42 TcpOptionKind::SackParmitted => 4,
43 TcpOptionKind::Sack => 5,
44 TcpOptionKind::Timestamp => 8,
45 }
46 }
47 pub fn name(&self) -> String {
48 match *self {
49 TcpOptionKind::Eol => String::from("EOL"),
50 TcpOptionKind::Nop => String::from("NOP"),
51 TcpOptionKind::Mss => String::from("MSS"),
52 TcpOptionKind::Wscale => String::from("WSCALE"),
53 TcpOptionKind::SackParmitted => String::from("SACK_PERMITTED"),
54 TcpOptionKind::Sack => String::from("SACK"),
55 TcpOptionKind::Timestamp => String::from("TIMESTAMPS"),
56 }
57 }
58}
59
60#[derive(Clone, Debug)]
62pub struct ProbeTarget {
63 pub ip_addr: IpAddr,
64 pub open_tcp_port: u16,
65 pub closed_tcp_port: u16,
66 pub open_udp_port: u16,
67 pub closed_udp_port: u16,
68}
69
70impl ProbeTarget {
71 pub fn new() -> Self {
72 Self {
73 ip_addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
74 open_tcp_port: 80,
75 closed_tcp_port: 20,
76 open_udp_port: 53,
77 closed_udp_port: 33435,
78 }
79 }
80}
81
82#[derive(Clone, Debug)]
84pub struct ProbeSetting {
85 pub if_index: u32,
87 pub if_name: String,
89 pub src_mac: MacAddr,
91 pub dst_mac: MacAddr,
93 pub src_ip: IpAddr,
95 pub src_port: u16,
97 pub probe_target: ProbeTarget,
99 pub probe_types: Vec<ProbeType>,
101 pub timeout: Duration,
103 pub wait_time: Duration,
105 pub send_rate: Duration,
107 pub tunnel: bool,
109 pub loopback: bool,
111}
112
113#[derive(Copy, Clone, Debug)]
114pub enum TcpProbeKind {
115 Syn1,
116 Syn2,
117 Syn3,
118 Syn4,
119 Syn5,
120 Syn6,
121 Ecn,
122}
123
124impl TcpProbeKind {
125 pub const VALUES: [Self; 7] = [
126 Self::Syn1,
127 Self::Syn2,
128 Self::Syn3,
129 Self::Syn4,
130 Self::Syn5,
131 Self::Syn6,
132 Self::Ecn,
133 ];
134 pub fn ipv4_total_length(&self) -> u16 {
135 match *self {
136 TcpProbeKind::Syn1 => 60,
137 TcpProbeKind::Syn2 => 60,
138 TcpProbeKind::Syn3 => 60,
139 TcpProbeKind::Syn4 => 56,
140 TcpProbeKind::Syn5 => 60,
141 TcpProbeKind::Syn6 => 56,
142 TcpProbeKind::Ecn => 52,
143 }
144 }
145 pub fn ipv6_payload_length(&self) -> u16 {
146 match *self {
147 TcpProbeKind::Syn1 => 40,
148 TcpProbeKind::Syn2 => 40,
149 TcpProbeKind::Syn3 => 40,
150 TcpProbeKind::Syn4 => 36,
151 TcpProbeKind::Syn5 => 40,
152 TcpProbeKind::Syn6 => 36,
153 TcpProbeKind::Ecn => 32,
154 }
155 }
156 pub fn tcp_options(&self) -> Vec<TcpOption> {
157 match *self {
158 TcpProbeKind::Syn1 => vec![
159 TcpOption::wscale(10),
160 TcpOption::nop(),
161 TcpOption::mss(1460),
162 TcpOption::timestamp(u32::MAX, u32::MIN),
163 TcpOption::sack_perm(),
164 ],
165 TcpProbeKind::Syn2 => vec![
166 TcpOption::mss(1400),
167 TcpOption::wscale(0),
168 TcpOption::sack_perm(),
169 TcpOption::timestamp(u32::MAX, u32::MIN),
170 ],
171 TcpProbeKind::Syn3 => vec![
172 TcpOption::timestamp(u32::MAX, u32::MIN),
173 TcpOption::nop(),
174 TcpOption::nop(),
175 TcpOption::wscale(5),
176 TcpOption::nop(),
177 TcpOption::mss(640),
178 ],
179 TcpProbeKind::Syn4 => vec![
180 TcpOption::sack_perm(),
181 TcpOption::timestamp(u32::MAX, u32::MIN),
182 TcpOption::wscale(10),
183 ],
184 TcpProbeKind::Syn5 => vec![
185 TcpOption::mss(536),
186 TcpOption::sack_perm(),
187 TcpOption::timestamp(u32::MAX, u32::MIN),
188 TcpOption::wscale(10),
189 ],
190 TcpProbeKind::Syn6 => vec![
191 TcpOption::mss(265),
192 TcpOption::sack_perm(),
193 TcpOption::timestamp(u32::MAX, u32::MIN),
194 ],
195 TcpProbeKind::Ecn => vec![
196 TcpOption::wscale(10),
197 TcpOption::nop(),
198 TcpOption::mss(1460),
199 TcpOption::sack_perm(),
200 TcpOption::nop(),
201 TcpOption::nop(),
202 ],
203 }
204 }
205}