xref: /webrtc/ice/src/candidate/candidate_relay.rs (revision 5b79f08a)
1 use super::candidate_base::*;
2 use super::*;
3 use crate::error::*;
4 use crate::rand::generate_cand_id;
5 use crate::util::*;
6 use std::sync::{
7     atomic::{AtomicU16, AtomicU8},
8     Arc,
9 };
10 use util::sync::Mutex as SyncMutex;
11 
12 /// The config required to create a new `CandidateRelay`.
13 #[derive(Default)]
14 pub struct CandidateRelayConfig {
15     pub base_config: CandidateBaseConfig,
16 
17     pub rel_addr: String,
18     pub rel_port: u16,
19     pub relay_client: Option<Arc<turn::client::Client>>,
20 }
21 
22 impl CandidateRelayConfig {
23     /// Creates a new relay candidate.
new_candidate_relay(self) -> Result<CandidateBase>24     pub fn new_candidate_relay(self) -> Result<CandidateBase> {
25         let mut candidate_id = self.base_config.candidate_id;
26         if candidate_id.is_empty() {
27             candidate_id = generate_cand_id();
28         }
29 
30         let ip: IpAddr = match self.base_config.address.parse() {
31             Ok(ip) => ip,
32             Err(_) => return Err(Error::ErrAddressParseFailed),
33         };
34         let network_type = determine_network_type(&self.base_config.network, &ip)?;
35 
36         let c = CandidateBase {
37             id: candidate_id,
38             network_type: AtomicU8::new(network_type as u8),
39             candidate_type: CandidateType::Relay,
40             address: self.base_config.address,
41             port: self.base_config.port,
42             resolved_addr: SyncMutex::new(create_addr(network_type, ip, self.base_config.port)),
43             component: AtomicU16::new(self.base_config.component),
44             foundation_override: self.base_config.foundation,
45             priority_override: self.base_config.priority,
46             related_address: Some(CandidateRelatedAddress {
47                 address: self.rel_addr,
48                 port: self.rel_port,
49             }),
50             conn: self.base_config.conn,
51             relay_client: self.relay_client.clone(),
52             ..CandidateBase::default()
53         };
54 
55         Ok(c)
56     }
57 }
58