use std::net::IpAddr;
use std::sync::Arc;
use dtls::extension::extension_use_srtp::SrtpProtectionProfile;
use ice::network_type::NetworkType;
use crate::peer_connection::transport::dtls::role::RTCDtlsRole;
use crate::peer_connection::transport::ice::candidate_type::RTCIceCandidateType;
use ice::mdns::MulticastDnsMode;
use shared::error::{Error, Result};
use std::time::Duration;
pub(crate) const RECEIVE_MTU: usize = 1460;
#[derive(Default, Clone)]
pub struct Timeout {
pub ice_disconnected_timeout: Option<Duration>,
pub ice_failed_timeout: Option<Duration>,
pub ice_keepalive_interval: Option<Duration>,
pub ice_host_acceptance_min_wait: Option<Duration>,
pub ice_srflx_acceptance_min_wait: Option<Duration>,
pub ice_prflx_acceptance_min_wait: Option<Duration>,
pub ice_relay_acceptance_min_wait: Option<Duration>,
}
#[derive(Clone)]
pub struct MulticastDNS {
pub timeout: Option<Duration>,
pub mode: MulticastDnsMode,
pub local_name: String,
pub local_ip: Option<IpAddr>,
}
impl Default for MulticastDNS {
fn default() -> Self {
Self {
timeout: Some(Duration::from_secs(10)),
mode: MulticastDnsMode::Disabled, local_name: "".to_string(),
local_ip: None,
}
}
}
#[derive(Default, Clone)]
pub struct Candidates {
pub ice_lite: bool,
pub ice_network_types: Vec<NetworkType>,
pub nat_1to1_ips: Vec<String>,
pub nat_1to1_ip_candidate_type: RTCIceCandidateType,
pub username_fragment: String,
pub password: String,
pub discard_local_candidates_during_ice_restart: bool,
pub include_loopback_candidate: bool,
}
#[derive(Default, Copy, Clone)]
pub struct ReplayProtection {
pub dtls: usize,
pub srtp: usize,
pub srtcp: usize,
}
#[derive(Copy, Clone)]
pub enum SctpMaxMessageSize {
Bounded(u32),
Unbounded,
}
impl SctpMaxMessageSize {
pub const DEFAULT_MESSAGE_SIZE: u32 = 65536;
pub const MAX_MESSAGE_SIZE: u32 = 262144;
pub fn as_usize(&self) -> usize {
match self {
Self::Bounded(result) => *result as usize,
Self::Unbounded => Self::MAX_MESSAGE_SIZE as usize,
}
}
}
impl Default for SctpMaxMessageSize {
fn default() -> Self {
Self::Bounded(Self::DEFAULT_MESSAGE_SIZE)
}
}
#[derive(Default, Clone)]
pub struct SettingEngine {
pub(crate) timeout: Timeout,
pub(crate) candidates: Candidates,
pub(crate) multicast_dns: MulticastDNS,
pub(crate) replay_protection: ReplayProtection,
pub(crate) sdp_media_level_fingerprints: bool,
pub(crate) answering_dtls_role: RTCDtlsRole,
pub(crate) disable_certificate_fingerprint_verification: bool,
pub(crate) allow_insecure_verification_algorithm: bool,
pub(crate) disable_media_engine_copy: bool,
pub(crate) disable_media_engine_multiple_codecs: bool,
pub(crate) srtp_protection_profiles: Vec<SrtpProtectionProfile>,
pub(crate) receive_mtu: usize,
pub(crate) mid_generator: Option<Arc<dyn Fn(isize) -> String + Send + Sync>>,
pub(crate) sctp_max_message_size: SctpMaxMessageSize,
pub(crate) ignore_rid_pause_for_recv: bool,
pub(crate) write_ssrc_attributes_for_simulcast: bool,
}
impl SettingEngine {
pub(crate) fn get_receive_mtu(&self) -> usize {
if self.receive_mtu != 0 {
self.receive_mtu
} else {
RECEIVE_MTU
}
}
pub fn set_srtp_protection_profiles(&mut self, profiles: Vec<SrtpProtectionProfile>) {
self.srtp_protection_profiles = profiles
}
pub fn set_ice_timeouts(
&mut self,
disconnected_timeout: Option<Duration>,
failed_timeout: Option<Duration>,
keep_alive_interval: Option<Duration>,
) {
self.timeout.ice_disconnected_timeout = disconnected_timeout;
self.timeout.ice_failed_timeout = failed_timeout;
self.timeout.ice_keepalive_interval = keep_alive_interval;
}
pub fn set_host_acceptance_min_wait(&mut self, t: Option<Duration>) {
self.timeout.ice_host_acceptance_min_wait = t;
}
pub fn set_srflx_acceptance_min_wait(&mut self, t: Option<Duration>) {
self.timeout.ice_srflx_acceptance_min_wait = t;
}
pub fn set_prflx_acceptance_min_wait(&mut self, t: Option<Duration>) {
self.timeout.ice_prflx_acceptance_min_wait = t;
}
pub fn set_relay_acceptance_min_wait(&mut self, t: Option<Duration>) {
self.timeout.ice_relay_acceptance_min_wait = t;
}
pub fn set_lite(&mut self, lite: bool) {
self.candidates.ice_lite = lite;
}
pub fn set_network_types(&mut self, candidate_types: Vec<NetworkType>) {
self.candidates.ice_network_types = candidate_types;
}
pub fn set_nat_1to1_ips(&mut self, ips: Vec<String>, candidate_type: RTCIceCandidateType) {
self.candidates.nat_1to1_ips = ips;
self.candidates.nat_1to1_ip_candidate_type = candidate_type;
}
pub fn set_answering_dtls_role(&mut self, role: RTCDtlsRole) -> Result<()> {
if role != RTCDtlsRole::Client && role != RTCDtlsRole::Server {
return Err(Error::ErrSettingEngineSetAnsweringDTLSRole);
}
self.answering_dtls_role = role;
Ok(())
}
pub fn set_multicast_dns_timeout(&mut self, timeout: Option<Duration>) {
self.multicast_dns.timeout = timeout;
}
pub fn set_multicast_dns_mode(&mut self, multicast_dns_mode: MulticastDnsMode) {
self.multicast_dns.mode = multicast_dns_mode
}
pub fn set_multicast_dns_local_name(&mut self, local_name: String) {
self.multicast_dns.local_name = local_name;
}
pub fn set_multicast_dns_local_ip(&mut self, local_ip: Option<IpAddr>) {
self.multicast_dns.local_ip = local_ip;
}
pub fn set_ice_credentials(&mut self, username_fragment: String, password: String) {
self.candidates.username_fragment = username_fragment;
self.candidates.password = password;
}
pub fn disable_certificate_fingerprint_verification(&mut self, is_disabled: bool) {
self.disable_certificate_fingerprint_verification = is_disabled;
}
pub fn allow_insecure_verification_algorithm(&mut self, is_allowed: bool) {
self.allow_insecure_verification_algorithm = is_allowed;
}
pub fn set_dtls_replay_protection_window(&mut self, n: usize) {
self.replay_protection.dtls = n;
}
pub fn set_srtp_replay_protection_window(&mut self, n: usize) {
self.replay_protection.srtp = n;
}
pub fn set_srtcp_replay_protection_window(&mut self, n: usize) {
self.replay_protection.srtcp = n;
}
pub fn set_include_loopback_candidate(&mut self, allow_loopback: bool) {
self.candidates.include_loopback_candidate = allow_loopback;
}
pub fn set_sdp_media_level_fingerprints(&mut self, sdp_media_level_fingerprints: bool) {
self.sdp_media_level_fingerprints = sdp_media_level_fingerprints;
}
pub fn disable_media_engine_copy(&mut self, is_disabled: bool) {
self.disable_media_engine_copy = is_disabled;
}
pub fn disable_media_engine_multiple_codecs(&mut self, is_disabled: bool) {
self.disable_media_engine_multiple_codecs = is_disabled;
}
pub fn set_receive_mtu(&mut self, receive_mtu: usize) {
self.receive_mtu = receive_mtu;
}
pub fn set_mid_generator(&mut self, f: impl Fn(isize) -> String + Send + Sync + 'static) {
self.mid_generator = Some(Arc::new(f));
}
pub fn set_sctp_max_message_size(&mut self, max_message_size: SctpMaxMessageSize) {
self.sctp_max_message_size = max_message_size;
}
pub fn set_ignore_rid_pause_for_recv(&mut self, ignore_rid_pause_for_recv: bool) {
self.ignore_rid_pause_for_recv = ignore_rid_pause_for_recv;
}
pub fn set_write_ssrc_attributes_for_simulcast(
&mut self,
write_ssrc_attributes_for_simulcast: bool,
) {
self.write_ssrc_attributes_for_simulcast = write_ssrc_attributes_for_simulcast;
}
}