xref: /webrtc/ice/src/udp_network.rs (revision ffe74184)
1 use std::sync::Arc;
2 
3 use super::udp_mux::UDPMux;
4 use super::Error;
5 
6 #[derive(Default, Clone)]
7 pub struct EphemeralUDP {
8     port_min: u16,
9     port_max: u16,
10 }
11 
12 impl EphemeralUDP {
new(port_min: u16, port_max: u16) -> Result<Self, Error>13     pub fn new(port_min: u16, port_max: u16) -> Result<Self, Error> {
14         let mut s = Self::default();
15         s.set_ports(port_min, port_max)?;
16 
17         Ok(s)
18     }
19 
port_min(&self) -> u1620     pub fn port_min(&self) -> u16 {
21         self.port_min
22     }
23 
port_max(&self) -> u1624     pub fn port_max(&self) -> u16 {
25         self.port_max
26     }
27 
set_ports(&mut self, port_min: u16, port_max: u16) -> Result<(), Error>28     pub fn set_ports(&mut self, port_min: u16, port_max: u16) -> Result<(), Error> {
29         if port_max < port_min {
30             return Err(Error::ErrPort);
31         }
32 
33         self.port_min = port_min;
34         self.port_max = port_max;
35 
36         Ok(())
37     }
38 }
39 
40 /// Configuration for the underlying UDP network stack.
41 /// There are two ways to configure this Ephemeral and Muxed.
42 ///
43 /// **Ephemeral mode**
44 ///
45 /// In Ephemeral mode sockets are created and bound to random ports during ICE
46 /// gathering. The ports to use can be restricted by setting [`EphemeralUDP::port_min`] and
47 /// [`EphemeralEphemeralUDP::port_max`] in which case only ports in this range will be used.
48 ///
49 /// **Muxed**
50 ///
51 /// In muxed mode a single UDP socket is used and all connections are muxed over this single socket.
52 ///
53 #[derive(Clone)]
54 pub enum UDPNetwork {
55     Ephemeral(EphemeralUDP),
56     Muxed(Arc<dyn UDPMux + Send + Sync>),
57 }
58 
59 impl Default for UDPNetwork {
default() -> Self60     fn default() -> Self {
61         Self::Ephemeral(Default::default())
62     }
63 }
64 
65 impl UDPNetwork {
is_ephemeral(&self) -> bool66     fn is_ephemeral(&self) -> bool {
67         matches!(self, Self::Ephemeral(_))
68     }
69 
is_muxed(&self) -> bool70     fn is_muxed(&self) -> bool {
71         matches!(self, Self::Muxed(_))
72     }
73 }
74 
75 #[cfg(test)]
76 mod test {
77     use super::EphemeralUDP;
78 
79     #[test]
test_ephemeral_udp_constructor()80     fn test_ephemeral_udp_constructor() {
81         assert!(
82             EphemeralUDP::new(3000, 2999).is_err(),
83             "EphemeralUDP should not allow invalid port range"
84         );
85 
86         let e = EphemeralUDP::default();
87         assert_eq!(e.port_min(), 0, "EphemeralUDP should default port_min to 0");
88         assert_eq!(e.port_max(), 0, "EphemeralUDP should default port_max to 0");
89     }
90 
91     #[test]
test_ephemeral_udp_set_ports()92     fn test_ephemeral_udp_set_ports() {
93         let mut e = EphemeralUDP::default();
94 
95         assert!(
96             e.set_ports(3000, 2999).is_err(),
97             "EphemeralUDP should not allow invalid port range"
98         );
99 
100         assert!(
101             e.set_ports(6000, 6001).is_ok(),
102             "EphemeralUDP::set_ports should allow valid port range"
103         );
104 
105         assert_eq!(
106             e.port_min(),
107             6000,
108             "Ports set with `EphemeralUDP::set_ports` should be reflected"
109         );
110         assert_eq!(
111             e.port_max(),
112             6001,
113             "Ports set with `EphemeralUDP::set_ports` should be reflected"
114         );
115     }
116 }
117