1use serde::{Deserialize, Serialize};
8
9use super::IdentityConfig;
10use crate::mmp::{DEFAULT_LOG_INTERVAL_SECS, DEFAULT_OWD_WINDOW_SIZE, MmpConfig, MmpMode};
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct LimitsConfig {
19 #[serde(default = "LimitsConfig::default_max_connections")]
21 pub max_connections: usize,
22 #[serde(default = "LimitsConfig::default_max_peers")]
24 pub max_peers: usize,
25 #[serde(default = "LimitsConfig::default_max_links")]
27 pub max_links: usize,
28 #[serde(default = "LimitsConfig::default_max_pending_inbound")]
30 pub max_pending_inbound: usize,
31}
32
33impl Default for LimitsConfig {
34 fn default() -> Self {
35 Self {
36 max_connections: 256,
37 max_peers: 128,
38 max_links: 256,
39 max_pending_inbound: 1000,
40 }
41 }
42}
43
44impl LimitsConfig {
45 fn default_max_connections() -> usize {
46 256
47 }
48 fn default_max_peers() -> usize {
49 128
50 }
51 fn default_max_links() -> usize {
52 256
53 }
54 fn default_max_pending_inbound() -> usize {
55 1000
56 }
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct RateLimitConfig {
62 #[serde(default = "RateLimitConfig::default_handshake_burst")]
64 pub handshake_burst: u32,
65 #[serde(default = "RateLimitConfig::default_handshake_rate")]
67 pub handshake_rate: f64,
68 #[serde(default = "RateLimitConfig::default_handshake_timeout_secs")]
70 pub handshake_timeout_secs: u64,
71 #[serde(default = "RateLimitConfig::default_handshake_resend_interval_ms")]
74 pub handshake_resend_interval_ms: u64,
75 #[serde(default = "RateLimitConfig::default_handshake_resend_backoff")]
77 pub handshake_resend_backoff: f64,
78 #[serde(default = "RateLimitConfig::default_handshake_max_resends")]
80 pub handshake_max_resends: u32,
81}
82
83impl Default for RateLimitConfig {
84 fn default() -> Self {
85 Self {
86 handshake_burst: 100,
87 handshake_rate: 10.0,
88 handshake_timeout_secs: 30,
89 handshake_resend_interval_ms: 1000,
90 handshake_resend_backoff: 2.0,
91 handshake_max_resends: 5,
92 }
93 }
94}
95
96impl RateLimitConfig {
97 fn default_handshake_burst() -> u32 {
98 100
99 }
100 fn default_handshake_rate() -> f64 {
101 10.0
102 }
103 fn default_handshake_timeout_secs() -> u64 {
104 30
105 }
106 fn default_handshake_resend_interval_ms() -> u64 {
107 1000
108 }
109 fn default_handshake_resend_backoff() -> f64 {
110 2.0
111 }
112 fn default_handshake_max_resends() -> u32 {
113 5
114 }
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct RetryConfig {
120 #[serde(default = "RetryConfig::default_max_retries")]
122 pub max_retries: u32,
123 #[serde(default = "RetryConfig::default_base_interval_secs")]
125 pub base_interval_secs: u64,
126 #[serde(default = "RetryConfig::default_max_backoff_secs")]
128 pub max_backoff_secs: u64,
129}
130
131impl Default for RetryConfig {
132 fn default() -> Self {
133 Self {
134 max_retries: 5,
135 base_interval_secs: 5,
136 max_backoff_secs: 300,
137 }
138 }
139}
140
141impl RetryConfig {
142 fn default_max_retries() -> u32 {
143 5
144 }
145 fn default_base_interval_secs() -> u64 {
146 5
147 }
148 fn default_max_backoff_secs() -> u64 {
149 300
150 }
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct CacheConfig {
156 #[serde(default = "CacheConfig::default_coord_size")]
158 pub coord_size: usize,
159 #[serde(default = "CacheConfig::default_coord_ttl_secs")]
161 pub coord_ttl_secs: u64,
162 #[serde(default = "CacheConfig::default_identity_size")]
164 pub identity_size: usize,
165}
166
167impl Default for CacheConfig {
168 fn default() -> Self {
169 Self {
170 coord_size: 50_000,
171 coord_ttl_secs: 300,
172 identity_size: 10_000,
173 }
174 }
175}
176
177impl CacheConfig {
178 fn default_coord_size() -> usize {
179 50_000
180 }
181 fn default_coord_ttl_secs() -> u64 {
182 300
183 }
184 fn default_identity_size() -> usize {
185 10_000
186 }
187}
188
189mod discovery;
190
191pub use discovery::{
192 DiscoveryConfig, NostrDiscoveryConfig, NostrDiscoveryPolicy, NostrPeerfindingSource,
193};
194
195#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct TreeConfig {
198 #[serde(default = "TreeConfig::default_announce_min_interval_ms")]
200 pub announce_min_interval_ms: u64,
201 #[serde(default = "TreeConfig::default_parent_hysteresis")]
207 pub parent_hysteresis: f64,
208 #[serde(default = "TreeConfig::default_hold_down_secs")]
213 pub hold_down_secs: u64,
214 #[serde(default = "TreeConfig::default_reeval_interval_secs")]
220 pub reeval_interval_secs: u64,
221 #[serde(default = "TreeConfig::default_flap_threshold")]
223 pub flap_threshold: u32,
224 #[serde(default = "TreeConfig::default_flap_window_secs")]
226 pub flap_window_secs: u64,
227 #[serde(default = "TreeConfig::default_flap_dampening_secs")]
229 pub flap_dampening_secs: u64,
230}
231
232impl Default for TreeConfig {
233 fn default() -> Self {
234 Self {
235 announce_min_interval_ms: 500,
236 parent_hysteresis: 0.2,
237 hold_down_secs: 30,
238 reeval_interval_secs: 60,
239 flap_threshold: 4,
240 flap_window_secs: 60,
241 flap_dampening_secs: 120,
242 }
243 }
244}
245
246impl TreeConfig {
247 fn default_announce_min_interval_ms() -> u64 {
248 500
249 }
250 fn default_parent_hysteresis() -> f64 {
251 0.2
252 }
253 fn default_hold_down_secs() -> u64 {
254 30
255 }
256 fn default_reeval_interval_secs() -> u64 {
257 60
258 }
259 fn default_flap_threshold() -> u32 {
260 4
261 }
262 fn default_flap_window_secs() -> u64 {
263 60
264 }
265 fn default_flap_dampening_secs() -> u64 {
266 120
267 }
268}
269
270#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct RoutingConfig {
273 #[serde(default)]
275 pub mode: RoutingMode,
276 #[serde(default = "RoutingConfig::default_learned_ttl_secs")]
278 pub learned_ttl_secs: u64,
279 #[serde(default = "RoutingConfig::default_max_learned_routes_per_dest")]
283 pub max_learned_routes_per_dest: usize,
284 #[serde(default = "RoutingConfig::default_learned_fallback_explore_interval")]
287 pub learned_fallback_explore_interval: u64,
288}
289
290impl Default for RoutingConfig {
291 fn default() -> Self {
292 Self {
293 mode: RoutingMode::default(),
294 learned_ttl_secs: 300,
295 max_learned_routes_per_dest: 4,
296 learned_fallback_explore_interval: 16,
297 }
298 }
299}
300
301impl RoutingConfig {
302 fn default_learned_ttl_secs() -> u64 {
303 300
304 }
305
306 fn default_max_learned_routes_per_dest() -> usize {
307 4
308 }
309
310 fn default_learned_fallback_explore_interval() -> u64 {
311 16
312 }
313}
314
315#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
317#[serde(rename_all = "snake_case")]
318pub enum RoutingMode {
319 #[default]
321 Tree,
322 ReplyLearned,
327}
328
329impl std::fmt::Display for RoutingMode {
330 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
331 match self {
332 RoutingMode::Tree => write!(f, "tree"),
333 RoutingMode::ReplyLearned => write!(f, "reply_learned"),
334 }
335 }
336}
337
338#[derive(Debug, Clone, Serialize, Deserialize)]
340pub struct BloomConfig {
341 #[serde(default = "BloomConfig::default_update_debounce_ms")]
343 pub update_debounce_ms: u64,
344 #[serde(default = "BloomConfig::default_max_inbound_fpr")]
352 pub max_inbound_fpr: f64,
353}
354
355impl Default for BloomConfig {
356 fn default() -> Self {
357 Self {
358 update_debounce_ms: 500,
359 max_inbound_fpr: 0.10,
360 }
361 }
362}
363
364impl BloomConfig {
365 fn default_update_debounce_ms() -> u64 {
366 500
367 }
368 fn default_max_inbound_fpr() -> f64 {
369 0.10
370 }
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
375pub struct SessionConfig {
376 #[serde(default = "SessionConfig::default_ttl")]
378 pub default_ttl: u8,
379 #[serde(default = "SessionConfig::default_pending_packets_per_dest")]
381 pub pending_packets_per_dest: usize,
382 #[serde(default = "SessionConfig::default_pending_max_destinations")]
384 pub pending_max_destinations: usize,
385 #[serde(default = "SessionConfig::default_idle_timeout_secs")]
389 pub idle_timeout_secs: u64,
390 #[serde(default = "SessionConfig::default_coords_warmup_packets")]
394 pub coords_warmup_packets: u8,
395 #[serde(default = "SessionConfig::default_coords_response_interval_ms")]
399 pub coords_response_interval_ms: u64,
400}
401
402impl Default for SessionConfig {
403 fn default() -> Self {
404 Self {
405 default_ttl: 64,
406 pending_packets_per_dest: 16,
407 pending_max_destinations: 256,
408 idle_timeout_secs: 90,
409 coords_warmup_packets: 5,
410 coords_response_interval_ms: 2000,
411 }
412 }
413}
414
415impl SessionConfig {
416 fn default_ttl() -> u8 {
417 64
418 }
419 fn default_pending_packets_per_dest() -> usize {
420 16
421 }
422 fn default_pending_max_destinations() -> usize {
423 256
424 }
425 fn default_idle_timeout_secs() -> u64 {
426 90
427 }
428 fn default_coords_warmup_packets() -> u8 {
429 5
430 }
431 fn default_coords_response_interval_ms() -> u64 {
432 2000
433 }
434}
435
436#[derive(Debug, Clone, Serialize, Deserialize)]
443pub struct SessionMmpConfig {
444 #[serde(default)]
446 pub mode: MmpMode,
447
448 #[serde(default = "SessionMmpConfig::default_log_interval_secs")]
450 pub log_interval_secs: u64,
451
452 #[serde(default = "SessionMmpConfig::default_owd_window_size")]
454 pub owd_window_size: usize,
455}
456
457impl Default for SessionMmpConfig {
458 fn default() -> Self {
459 Self {
460 mode: MmpMode::default(),
461 log_interval_secs: DEFAULT_LOG_INTERVAL_SECS,
462 owd_window_size: DEFAULT_OWD_WINDOW_SIZE,
463 }
464 }
465}
466
467impl SessionMmpConfig {
468 fn default_log_interval_secs() -> u64 {
469 DEFAULT_LOG_INTERVAL_SECS
470 }
471 fn default_owd_window_size() -> usize {
472 DEFAULT_OWD_WINDOW_SIZE
473 }
474}
475
476#[derive(Debug, Clone, Serialize, Deserialize)]
478pub struct ControlConfig {
479 #[serde(default = "ControlConfig::default_enabled")]
481 pub enabled: bool,
482 #[serde(default = "ControlConfig::default_socket_path")]
484 pub socket_path: String,
485}
486
487impl Default for ControlConfig {
488 fn default() -> Self {
489 Self {
490 enabled: true,
491 socket_path: Self::default_socket_path(),
492 }
493 }
494}
495
496impl ControlConfig {
497 fn default_enabled() -> bool {
498 true
499 }
500
501 fn default_socket_path() -> String {
508 #[cfg(unix)]
509 {
510 super::resolve_default_socket("control.sock")
511 }
512 #[cfg(windows)]
513 {
514 "21210".to_string()
515 }
516 }
517}
518
519const DEFAULT_PACKET_CHANNEL_CAPACITY: usize = 16_384;
520
521#[derive(Debug, Clone, Serialize, Deserialize)]
523pub struct BuffersConfig {
524 #[serde(default = "BuffersConfig::default_packet_channel")]
529 pub packet_channel: usize,
530 #[serde(default = "BuffersConfig::default_tun_channel")]
532 pub tun_channel: usize,
533 #[serde(default = "BuffersConfig::default_dns_channel")]
535 pub dns_channel: usize,
536}
537
538impl Default for BuffersConfig {
539 fn default() -> Self {
540 Self {
541 packet_channel: DEFAULT_PACKET_CHANNEL_CAPACITY,
542 tun_channel: 1024,
543 dns_channel: 64,
544 }
545 }
546}
547
548impl BuffersConfig {
549 fn default_packet_channel() -> usize {
550 DEFAULT_PACKET_CHANNEL_CAPACITY
551 }
552 fn default_tun_channel() -> usize {
553 1024
554 }
555 fn default_dns_channel() -> usize {
556 64
557 }
558}
559
560const DEFAULT_REKEY_AFTER_MESSAGES: u64 = 1 << 48;
577
578#[derive(Debug, Clone, Serialize, Deserialize)]
579pub struct RekeyConfig {
580 #[serde(default = "RekeyConfig::default_enabled")]
582 pub enabled: bool,
583
584 #[serde(default = "RekeyConfig::default_after_secs")]
586 pub after_secs: u64,
587
588 #[serde(default = "RekeyConfig::default_after_messages")]
590 pub after_messages: u64,
591}
592
593impl Default for RekeyConfig {
594 fn default() -> Self {
595 Self {
596 enabled: true,
597 after_secs: 120,
598 after_messages: DEFAULT_REKEY_AFTER_MESSAGES,
599 }
600 }
601}
602
603impl RekeyConfig {
604 fn default_enabled() -> bool {
605 true
606 }
607 fn default_after_secs() -> u64 {
608 120
609 }
610 fn default_after_messages() -> u64 {
611 DEFAULT_REKEY_AFTER_MESSAGES
612 }
613}
614
615#[derive(Debug, Clone, Serialize, Deserialize)]
621pub struct EcnConfig {
622 #[serde(default = "EcnConfig::default_enabled")]
624 pub enabled: bool,
625
626 #[serde(default = "EcnConfig::default_loss_threshold")]
630 pub loss_threshold: f64,
631
632 #[serde(default = "EcnConfig::default_etx_threshold")]
636 pub etx_threshold: f64,
637}
638
639impl Default for EcnConfig {
640 fn default() -> Self {
641 Self {
642 enabled: true,
643 loss_threshold: 0.05,
644 etx_threshold: 3.0,
645 }
646 }
647}
648
649impl EcnConfig {
650 fn default_enabled() -> bool {
651 true
652 }
653 fn default_loss_threshold() -> f64 {
654 0.05
655 }
656 fn default_etx_threshold() -> f64 {
657 3.0
658 }
659}
660
661#[derive(Debug, Clone, Serialize, Deserialize)]
667pub struct NodeConfig {
668 #[serde(default)]
670 pub identity: IdentityConfig,
671
672 #[serde(default, skip_serializing_if = "std::ops::Not::not")]
674 pub leaf_only: bool,
675
676 #[serde(default = "NodeConfig::default_tick_interval_secs")]
678 pub tick_interval_secs: u64,
679
680 #[serde(default = "NodeConfig::default_base_rtt_ms")]
682 pub base_rtt_ms: u64,
683
684 #[serde(default = "NodeConfig::default_heartbeat_interval_secs")]
686 pub heartbeat_interval_secs: u64,
687
688 #[serde(default = "NodeConfig::default_link_dead_timeout_secs")]
691 pub link_dead_timeout_secs: u64,
692
693 #[serde(default = "NodeConfig::default_fast_link_dead_timeout_secs")]
703 pub fast_link_dead_timeout_secs: u64,
704
705 #[serde(default)]
707 pub limits: LimitsConfig,
708
709 #[serde(default)]
711 pub rate_limit: RateLimitConfig,
712
713 #[serde(default)]
715 pub retry: RetryConfig,
716
717 #[serde(default)]
719 pub cache: CacheConfig,
720
721 #[serde(default)]
723 pub discovery: DiscoveryConfig,
724
725 #[serde(default)]
727 pub tree: TreeConfig,
728
729 #[serde(default)]
731 pub routing: RoutingConfig,
732
733 #[serde(default)]
735 pub bloom: BloomConfig,
736
737 #[serde(default)]
739 pub session: SessionConfig,
740
741 #[serde(default)]
743 pub buffers: BuffersConfig,
744
745 #[serde(default)]
747 pub control: ControlConfig,
748
749 #[serde(default)]
751 pub mmp: MmpConfig,
752
753 #[serde(default)]
755 pub session_mmp: SessionMmpConfig,
756
757 #[serde(default)]
759 pub ecn: EcnConfig,
760
761 #[serde(default)]
763 pub rekey: RekeyConfig,
764
765 #[serde(default = "NodeConfig::default_system_files_enabled")]
768 pub system_files_enabled: bool,
769
770 #[serde(default)]
773 pub log_level: Option<String>,
774}
775
776impl Default for NodeConfig {
777 fn default() -> Self {
778 Self {
779 identity: IdentityConfig::default(),
780 leaf_only: false,
781 tick_interval_secs: 1,
782 base_rtt_ms: 100,
783 heartbeat_interval_secs: 10,
784 link_dead_timeout_secs: 30,
785 fast_link_dead_timeout_secs: 5,
786 limits: LimitsConfig::default(),
787 rate_limit: RateLimitConfig::default(),
788 retry: RetryConfig::default(),
789 cache: CacheConfig::default(),
790 discovery: DiscoveryConfig::default(),
791 tree: TreeConfig::default(),
792 routing: RoutingConfig::default(),
793 bloom: BloomConfig::default(),
794 session: SessionConfig::default(),
795 buffers: BuffersConfig::default(),
796 control: ControlConfig::default(),
797 mmp: MmpConfig::default(),
798 session_mmp: SessionMmpConfig::default(),
799 ecn: EcnConfig::default(),
800 rekey: RekeyConfig::default(),
801 system_files_enabled: true,
802 log_level: None,
803 }
804 }
805}
806
807impl NodeConfig {
808 pub fn log_level(&self) -> tracing::Level {
810 match self
811 .log_level
812 .as_deref()
813 .map(|s| s.to_lowercase())
814 .as_deref()
815 {
816 Some("trace") => tracing::Level::TRACE,
817 Some("debug") => tracing::Level::DEBUG,
818 Some("warn") | Some("warning") => tracing::Level::WARN,
819 Some("error") => tracing::Level::ERROR,
820 _ => tracing::Level::INFO,
821 }
822 }
823
824 fn default_tick_interval_secs() -> u64 {
825 1
826 }
827 fn default_base_rtt_ms() -> u64 {
828 100
829 }
830 fn default_heartbeat_interval_secs() -> u64 {
831 10
832 }
833 fn default_link_dead_timeout_secs() -> u64 {
834 30
835 }
836 fn default_fast_link_dead_timeout_secs() -> u64 {
837 5
838 }
839 fn default_system_files_enabled() -> bool {
840 true
841 }
842}
843
844#[cfg(test)]
845mod tests;