1use std::{net::SocketAddr, time::Duration};
2
3use irtt_proto::{Clock, ReceivedStats, StampAt};
4
5pub(crate) const DEFAULT_PORT: u16 = 2112;
6pub const MAX_DSCP_CODEPOINT: u8 = 63;
7pub const MAX_TTL: u32 = 255;
8pub const MAX_UDP_PAYLOAD_LENGTH: u32 = 65_507;
9pub const MAX_SERVER_FILL_BYTES: usize = 32;
10pub(crate) const DEFAULT_DURATION: Duration = Duration::from_secs(3);
11pub(crate) const DEFAULT_INTERVAL: Duration = Duration::from_secs(1);
12pub(crate) const DEFAULT_OPEN_TIMEOUTS: [Duration; 4] = [
13 Duration::from_secs(1),
14 Duration::from_secs(2),
15 Duration::from_secs(4),
16 Duration::from_secs(8),
17];
18pub(crate) const MIN_OPEN_TIMEOUT: Duration = Duration::from_millis(200);
19pub(crate) const DEFAULT_PROBE_TIMEOUT: Duration = Duration::from_secs(4);
20pub(crate) const DEFAULT_MAX_PENDING: usize = 4096;
21
22#[derive(Debug, Clone, PartialEq, Eq)]
23pub struct ClientConfig {
24 pub server_addr: String,
25 pub duration: Option<Duration>,
26 pub interval: Duration,
27 pub length: u32,
28 pub received_stats: ReceivedStats,
29 pub stamp_at: StampAt,
30 pub clock: Clock,
31 pub dscp: u8,
32 pub hmac_key: Option<Vec<u8>>,
33 pub server_fill: Option<String>,
34 pub open_timeouts: Vec<Duration>,
35 pub run_mode: RunMode,
36 pub negotiation_policy: NegotiationPolicy,
37 pub socket_config: SocketConfig,
38 pub probe_timeout: Duration,
39 pub max_pending_probes: usize,
40}
41
42impl Default for ClientConfig {
43 fn default() -> Self {
44 Self {
45 server_addr: format!("127.0.0.1:{DEFAULT_PORT}"),
46 duration: Some(DEFAULT_DURATION),
47 interval: DEFAULT_INTERVAL,
48 length: 0,
49 received_stats: ReceivedStats::Both,
50 stamp_at: StampAt::Both,
51 clock: Clock::Both,
52 dscp: 0,
53 hmac_key: None,
54 server_fill: None,
55 open_timeouts: DEFAULT_OPEN_TIMEOUTS.to_vec(),
56 run_mode: RunMode::Normal,
57 negotiation_policy: NegotiationPolicy::Strict,
58 socket_config: SocketConfig::default(),
59 probe_timeout: DEFAULT_PROBE_TIMEOUT,
60 max_pending_probes: DEFAULT_MAX_PENDING,
61 }
62 }
63}
64
65#[derive(Debug, Clone, PartialEq, Eq, Default)]
66pub struct SocketConfig {
67 pub bind_addr: Option<SocketAddr>,
68 pub ttl: Option<u32>,
69 pub ipv4_only: bool,
70 pub ipv6_only: bool,
71 pub recv_timeout: Option<Duration>,
72}
73
74#[derive(Debug, Clone, Copy, PartialEq, Eq)]
75pub enum NegotiationPolicy {
76 Strict,
77 Loose,
78}
79
80#[derive(Debug, Clone, Copy, PartialEq, Eq)]
81pub enum RunMode {
82 Normal,
83 NoTest,
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq)]
87pub struct RecvBudget {
88 pub max_packets: usize,
89}
90
91impl Default for RecvBudget {
92 fn default() -> Self {
93 Self { max_packets: 64 }
94 }
95}