Skip to main content

irtt_client/
config.rs

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}