Skip to content

Commit 9bf3825

Browse files
committed
feat: added --tos (-Q) flag to set the TOS (aka DSCP+ECN) flag for TCP and UDP tracing
1 parent 6a6a490 commit 9bf3825

File tree

4 files changed

+31
-11
lines changed

4 files changed

+31
-11
lines changed

src/config.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,12 @@ pub struct Args {
150150
#[clap(long, default_value_t = 0, display_order = 14)]
151151
pub payload_pattern: u8,
152152

153+
/// The TOS (i.e. DSCP+ECN) IP header value (TCP and UDP only)
154+
#[clap(short = 'Q', long, default_value_t = 0, display_order = 15)]
155+
pub tos: u8,
156+
153157
/// The socket read timeout
154-
#[clap(long, default_value = "10ms", display_order = 15)]
158+
#[clap(long, default_value = "10ms", display_order = 16)]
155159
pub read_timeout: String,
156160

157161
/// How to perform DNS queries.
@@ -160,16 +164,16 @@ pub struct Args {
160164
short = 'r',
161165
long,
162166
default_value = "system",
163-
display_order = 16
167+
display_order = 17
164168
)]
165169
pub dns_resolve_method: DnsResolveMethod,
166170

167171
/// The maximum time to wait to perform DNS queries.
168-
#[clap(long, default_value = "5s", display_order = 17)]
172+
#[clap(long, default_value = "5s", display_order = 18)]
169173
pub dns_timeout: String,
170174

171175
/// Lookup autonomous system (AS) information during DNS queries.
172-
#[clap(long, short = 'z', display_order = 18)]
176+
#[clap(long, short = 'z', display_order = 19)]
173177
pub dns_lookup_as_info: bool,
174178

175179
/// How to render addresses.
@@ -178,28 +182,28 @@ pub struct Args {
178182
short = 'a',
179183
long,
180184
default_value = "host",
181-
display_order = 19
185+
display_order = 20
182186
)]
183187
pub tui_address_mode: AddressMode,
184188

185189
/// The maximum number of addresses to show per hop
186-
#[clap(short = 'M', long, display_order = 20)]
190+
#[clap(short = 'M', long, display_order = 21)]
187191
pub tui_max_addrs: Option<u8>,
188192

189193
/// The maximum number of samples to record per hop
190-
#[clap(long, short = 's', default_value_t = 256, display_order = 21)]
194+
#[clap(long, short = 's', default_value_t = 256, display_order = 22)]
191195
pub tui_max_samples: usize,
192196

193197
/// Preserve the screen on exit
194-
#[clap(long, display_order = 22)]
198+
#[clap(long, display_order = 23)]
195199
pub tui_preserve_screen: bool,
196200

197201
/// The TUI refresh rate
198-
#[clap(long, default_value = "100ms", display_order = 23)]
202+
#[clap(long, default_value = "100ms", display_order = 24)]
199203
pub tui_refresh_rate: String,
200204

201205
/// The number of report cycles to run
202-
#[clap(short = 'c', long, default_value_t = 10, display_order = 24)]
206+
#[clap(short = 'c', long, default_value_t = 10, display_order = 25)]
203207
pub report_cycles: usize,
204208
}
205209

@@ -214,6 +218,7 @@ pub struct TrippyConfig {
214218
pub grace_duration: Duration,
215219
pub max_inflight: u8,
216220
pub initial_sequence: u16,
221+
pub tos: u8,
217222
pub read_timeout: Duration,
218223
pub packet_size: u16,
219224
pub payload_pattern: u8,
@@ -286,6 +291,7 @@ impl TryFrom<(Args, u16)> for TrippyConfig {
286291
read_timeout,
287292
packet_size: args.packet_size,
288293
payload_pattern: args.payload_pattern,
294+
tos: args.tos,
289295
source_addr: source_address,
290296
source_port,
291297
target_port: args.target_port,

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ fn make_channel_config(
143143
trace_identifier,
144144
args.packet_size,
145145
args.payload_pattern,
146+
args.tos,
146147
args.source_port,
147148
args.target_port,
148149
args.read_timeout,

src/tracing/net.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use crate::tracing::error::TracerError::{AddressNotAvailable, InvalidSourceAddr};
22
use crate::tracing::error::{TraceResult, TracerError};
3-
use crate::tracing::types::{DestinationPort, PacketSize, PayloadPattern, SourcePort, TraceId};
3+
use crate::tracing::types::{
4+
DestinationPort, PacketSize, PayloadPattern, SourcePort, TraceId, TypeOfService,
5+
};
46
use crate::tracing::util::Required;
57
use crate::tracing::{Probe, TracerProtocol};
68
use arrayvec::ArrayVec;
@@ -110,6 +112,7 @@ pub struct TracerChannelConfig {
110112
identifier: TraceId,
111113
packet_size: PacketSize,
112114
payload_pattern: PayloadPattern,
115+
tos: TypeOfService,
113116
source_port: SourcePort,
114117
destination_port: DestinationPort,
115118
icmp_read_timeout: Duration,
@@ -126,6 +129,7 @@ impl TracerChannelConfig {
126129
identifier: u16,
127130
packet_size: u16,
128131
payload_pattern: u8,
132+
tos: u8,
129133
source_port: u16,
130134
destination_port: u16,
131135
icmp_read_timeout: Duration,
@@ -138,6 +142,7 @@ impl TracerChannelConfig {
138142
identifier: TraceId(identifier),
139143
packet_size: PacketSize(packet_size),
140144
payload_pattern: PayloadPattern(payload_pattern),
145+
tos: TypeOfService(tos),
141146
source_port: SourcePort(source_port),
142147
destination_port: DestinationPort(destination_port),
143148
icmp_read_timeout,
@@ -154,6 +159,7 @@ pub struct TracerChannel {
154159
identifier: TraceId,
155160
packet_size: PacketSize,
156161
payload_pattern: PayloadPattern,
162+
tos: TypeOfService,
157163
source_port: SourcePort,
158164
destination_port: DestinationPort,
159165
icmp_read_timeout: Duration,
@@ -180,6 +186,7 @@ impl TracerChannel {
180186
identifier: config.identifier,
181187
packet_size: config.packet_size,
182188
payload_pattern: config.payload_pattern,
189+
tos: config.tos,
183190
source_port: config.source_port,
184191
destination_port: config.destination_port,
185192
icmp_read_timeout: config.icmp_read_timeout,
@@ -255,6 +262,7 @@ impl TracerChannel {
255262
}
256263
};
257264
socket.set_ttl(u32::from(probe.ttl.0))?;
265+
socket.set_tos(u32::from(self.tos.0))?;
258266
let remote_addr = SocketAddr::new(self.dest_addr, probe.sequence.0);
259267
let packet_size = usize::from(self.packet_size.0);
260268
if packet_size > MAX_PACKET_SIZE {
@@ -285,6 +293,7 @@ impl TracerChannel {
285293
}
286294
};
287295
socket.set_ttl(u32::from(probe.ttl.0))?;
296+
socket.set_tos(u32::from(self.tos.0))?;
288297
let remote_addr = SocketAddr::new(self.dest_addr, self.destination_port.0);
289298
match socket.connect(&SockAddr::from(remote_addr)) {
290299
Ok(_) => {}

src/tracing/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ pub struct PacketSize(pub u16);
3636
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Ord, PartialOrd, From)]
3737
pub struct PayloadPattern(pub u8);
3838

39+
/// `TypeOfService` (aka `DSCP` & `ECN`) newtype.
40+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Ord, PartialOrd, From)]
41+
pub struct TypeOfService(pub u8);
42+
3943
/// Source port newtype.
4044
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Ord, PartialOrd, From)]
4145
pub struct SourcePort(pub u16);

0 commit comments

Comments
 (0)