webrtc_ice/candidate/
candidate_relay.rs1use portable_atomic::{AtomicU16, AtomicU8};
2use std::sync::Arc;
3
4use util::sync::Mutex as SyncMutex;
5
6use super::candidate_base::*;
7use super::*;
8use crate::error::*;
9use crate::rand::generate_cand_id;
10use crate::util::*;
11
12#[derive(Default)]
14pub 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
22impl CandidateRelayConfig {
23 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}