webrtc_ice/candidate/
candidate_relay.rs

1use 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/// The config required to create a new `CandidateRelay`.
13#[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    /// Creates a new relay candidate.
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}