multicast_discovery_socket/
config.rs

1use std::borrow::Cow;
2use std::iter::once;
3use std::net::IpAddr;
4use std::ops::Range;
5use std::time::Duration;
6
7const DEFAULT_ANNOUNCE_INTERVAL: Duration = Duration::from_secs(3);
8const DEFAULT_EXTENDED_ANNOUNCEMENT_EFFECT_DUR: Duration = Duration::from_secs(30);
9const DEFAULT_EXTEND_REQUEST_INTERVAL: Duration = Duration::from_secs(12);
10
11#[derive(Clone, Debug)]
12pub struct MulticastDiscoveryConfig {
13    pub multicast_group_ip: std::net::Ipv4Addr,
14    pub multicast_port: u16,
15    pub multicast_backup_ports: Vec<u16>,
16    pub service_name: Cow<'static, str>,
17    pub central_discovery_addr: Option<IpAddr>,
18
19    pub announce_interval: Duration,
20    pub extended_announcement_effect_dur: Duration,
21    pub extend_request_interval: Duration,
22    
23    pub enable_announce: bool,
24    pub discover_replies: bool
25}
26
27impl MulticastDiscoveryConfig {
28    pub fn new(
29        multicast_group_ip: std::net::Ipv4Addr,
30        service_name: Cow<'static, str>
31    ) -> Self {
32        Self {
33            multicast_group_ip,
34            multicast_port: 37337,
35            multicast_backup_ports: (61345..61347).collect(),
36            service_name,
37            central_discovery_addr: None,
38            enable_announce: true,
39            discover_replies: true,
40            
41            announce_interval: DEFAULT_ANNOUNCE_INTERVAL,
42            extended_announcement_effect_dur: DEFAULT_EXTENDED_ANNOUNCEMENT_EFFECT_DUR,
43            extend_request_interval: DEFAULT_EXTEND_REQUEST_INTERVAL,
44        }
45    }
46    
47    pub fn with_multicast_port(mut self, multicast_port: u16) -> Self {
48        self.multicast_port = multicast_port;
49        self
50    }
51    
52    pub fn with_backup_ports(mut self, backup_ports: Range<u16>) -> Self {
53        self.multicast_backup_ports = backup_ports.collect();
54        self
55    }
56    
57    pub fn iter_ports(&self) -> impl Iterator<Item = u16> + '_ {
58        once(self.multicast_port).chain(self.multicast_backup_ports.iter().copied())
59    }
60    
61    pub fn with_disabled_announce(mut self) -> Self {
62        self.enable_announce = false;
63        self
64    }
65    
66    pub fn with_disabled_discover_replies(mut self) -> Self {
67        self.discover_replies = false;
68        self
69    }
70    
71    pub fn with_announce_interval(mut self, announce_interval: Duration) -> Self {
72        self.announce_interval = announce_interval;
73        self
74    }
75    
76    pub fn with_extended_announcement_effect_dur(mut self, effect_duration: Duration) -> Self {
77        self.extended_announcement_effect_dur = effect_duration;
78        self
79    }
80    
81    pub fn with_extend_request_interval(mut self, extend_request_interval: Duration) -> Self {
82        self.extend_request_interval = extend_request_interval;
83        self
84    }
85}