ant_quic/config/
nat_timeouts.rs

1//! Configurable timeouts for NAT traversal operations
2
3use crate::Duration;
4use serde::{Deserialize, Serialize};
5
6/// Configuration for NAT traversal timeouts
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct NatTraversalTimeouts {
9    /// Timeout for hole punching coordination
10    pub coordination_timeout: Duration,
11
12    /// Overall timeout for establishing a connection through NAT
13    pub connection_establishment_timeout: Duration,
14
15    /// Timeout for individual probe attempts
16    pub probe_timeout: Duration,
17
18    /// Interval between retry attempts
19    pub retry_interval: Duration,
20
21    /// Timeout for bootstrap node queries
22    pub bootstrap_query_timeout: Duration,
23
24    /// Time to wait for path migration to complete
25    pub migration_timeout: Duration,
26
27    /// Time to wait for session state transitions
28    pub session_timeout: Duration,
29}
30
31impl Default for NatTraversalTimeouts {
32    fn default() -> Self {
33        Self {
34            coordination_timeout: Duration::from_secs(10),
35            connection_establishment_timeout: Duration::from_secs(30),
36            probe_timeout: Duration::from_secs(5),
37            retry_interval: Duration::from_secs(1),
38            bootstrap_query_timeout: Duration::from_secs(5),
39            migration_timeout: Duration::from_secs(60),
40            session_timeout: Duration::from_secs(5),
41        }
42    }
43}
44
45impl NatTraversalTimeouts {
46    /// Create timeouts optimized for fast local networks
47    pub fn fast() -> Self {
48        Self {
49            coordination_timeout: Duration::from_secs(5),
50            connection_establishment_timeout: Duration::from_secs(15),
51            probe_timeout: Duration::from_secs(2),
52            retry_interval: Duration::from_millis(500),
53            bootstrap_query_timeout: Duration::from_secs(2),
54            migration_timeout: Duration::from_secs(30),
55            session_timeout: Duration::from_secs(2),
56        }
57    }
58
59    /// Create timeouts optimized for slow or unreliable networks
60    pub fn conservative() -> Self {
61        Self {
62            coordination_timeout: Duration::from_secs(20),
63            connection_establishment_timeout: Duration::from_secs(60),
64            probe_timeout: Duration::from_secs(10),
65            retry_interval: Duration::from_secs(2),
66            bootstrap_query_timeout: Duration::from_secs(10),
67            migration_timeout: Duration::from_secs(120),
68            session_timeout: Duration::from_secs(10),
69        }
70    }
71}
72
73/// Configuration for discovery operation timeouts
74#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct DiscoveryTimeouts {
76    /// Total timeout for the entire discovery process
77    pub total_timeout: Duration,
78
79    /// Timeout for scanning local network interfaces
80    pub local_scan_timeout: Duration,
81
82    /// Time to cache network interface information
83    pub interface_cache_ttl: Duration,
84
85    /// Time to cache server reflexive addresses
86    pub server_reflexive_cache_ttl: Duration,
87
88    /// Interval between health checks for bootstrap nodes
89    pub health_check_interval: Duration,
90}
91
92impl Default for DiscoveryTimeouts {
93    fn default() -> Self {
94        Self {
95            total_timeout: Duration::from_secs(30),
96            local_scan_timeout: Duration::from_secs(2),
97            interface_cache_ttl: Duration::from_secs(60),
98            server_reflexive_cache_ttl: Duration::from_secs(300),
99            health_check_interval: Duration::from_secs(30),
100        }
101    }
102}
103
104/// Configuration for relay-related timeouts
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct RelayTimeouts {
107    /// Timeout for relay request operations
108    pub request_timeout: Duration,
109
110    /// Interval between retry attempts
111    pub retry_interval: Duration,
112
113    /// Time window for rate limiting
114    pub rate_limit_window: Duration,
115}
116
117impl Default for RelayTimeouts {
118    fn default() -> Self {
119        Self {
120            request_timeout: Duration::from_secs(30),
121            retry_interval: Duration::from_millis(500),
122            rate_limit_window: Duration::from_secs(60),
123        }
124    }
125}
126
127/// Master timeout configuration
128#[derive(Debug, Clone, Default, Serialize, Deserialize)]
129pub struct TimeoutConfig {
130    /// NAT traversal timeouts
131    pub nat_traversal: NatTraversalTimeouts,
132
133    /// Discovery timeouts
134    pub discovery: DiscoveryTimeouts,
135
136    /// Relay timeouts
137    pub relay: RelayTimeouts,
138}
139
140impl TimeoutConfig {
141    /// Create a configuration optimized for fast networks
142    pub fn fast() -> Self {
143        Self {
144            nat_traversal: NatTraversalTimeouts::fast(),
145            discovery: DiscoveryTimeouts::default(), // Keep default for discovery
146            relay: RelayTimeouts::default(),
147        }
148    }
149
150    /// Create a configuration optimized for slow networks
151    pub fn conservative() -> Self {
152        Self {
153            nat_traversal: NatTraversalTimeouts::conservative(),
154            discovery: DiscoveryTimeouts::default(),
155            relay: RelayTimeouts::default(),
156        }
157    }
158}