multicast_discovery_socket/
config.rs1use 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}
25
26impl MulticastDiscoveryConfig {
27 pub fn new(
28 multicast_group_ip: std::net::Ipv4Addr,
29 service_name: Cow<'static, str>
30 ) -> Self {
31 Self {
32 multicast_group_ip,
33 multicast_port: 37337,
34 multicast_backup_ports: (61345..61347).collect(),
35 service_name,
36 central_discovery_addr: None,
37 enable_announce: true,
38
39 announce_interval: DEFAULT_ANNOUNCE_INTERVAL,
40 extended_announcement_effect_dur: DEFAULT_EXTENDED_ANNOUNCEMENT_EFFECT_DUR,
41 extend_request_interval: DEFAULT_EXTEND_REQUEST_INTERVAL,
42 }
43 }
44
45 pub fn with_multicast_port(mut self, multicast_port: u16) -> Self {
46 self.multicast_port = multicast_port;
47 self
48 }
49
50 pub fn with_backup_ports(mut self, backup_ports: Range<u16>) -> Self {
51 self.multicast_backup_ports = backup_ports.collect();
52 self
53 }
54
55 pub fn iter_ports(&self) -> impl Iterator<Item = u16> + '_ {
56 once(self.multicast_port).chain(self.multicast_backup_ports.iter().copied())
57 }
58
59 pub fn with_disabled_announce(mut self) -> Self {
60 self.enable_announce = false;
61 self
62 }
63
64 pub fn with_announce_interval(mut self, announce_interval: Duration) -> Self {
65 self.announce_interval = announce_interval;
66 self
67 }
68
69 pub fn with_extended_announcement_effect_dur(mut self, effect_duration: Duration) -> Self {
70 self.extended_announcement_effect_dur = effect_duration;
71 self
72 }
73
74 pub fn with_extend_request_interval(mut self, extend_request_interval: Duration) -> Self {
75 self.extend_request_interval = extend_request_interval;
76 self
77 }
78}