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