xref: /webrtc/ice/src/candidate/candidate_host.rs (revision 5b79f08a)
1 use super::candidate_base::*;
2 use super::*;
3 use crate::rand::generate_cand_id;
4 
5 use std::sync::atomic::{AtomicU16, AtomicU8};
6 
7 /// The config required to create a new `CandidateHost`.
8 #[derive(Default)]
9 pub struct CandidateHostConfig {
10     pub base_config: CandidateBaseConfig,
11 
12     pub tcp_type: TcpType,
13 }
14 
15 impl CandidateHostConfig {
16     /// Creates a new host candidate.
new_candidate_host(self) -> Result<CandidateBase>17     pub fn new_candidate_host(self) -> Result<CandidateBase> {
18         let mut candidate_id = self.base_config.candidate_id;
19         if candidate_id.is_empty() {
20             candidate_id = generate_cand_id();
21         }
22 
23         let c = CandidateBase {
24             id: candidate_id,
25             address: self.base_config.address.clone(),
26             candidate_type: CandidateType::Host,
27             component: AtomicU16::new(self.base_config.component),
28             port: self.base_config.port,
29             tcp_type: self.tcp_type,
30             foundation_override: self.base_config.foundation,
31             priority_override: self.base_config.priority,
32             network: self.base_config.network,
33             network_type: AtomicU8::new(NetworkType::Udp4 as u8),
34             conn: self.base_config.conn,
35             ..CandidateBase::default()
36         };
37 
38         if !self.base_config.address.ends_with(".local") {
39             let ip = self.base_config.address.parse()?;
40             c.set_ip(&ip)?;
41         };
42 
43         Ok(c)
44     }
45 }
46