use super::types::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkSettings {
pub connection_preferences: ConnectionPreferences,
pub qos_settings: QosSettings,
pub firewall_settings: FirewallSettings,
pub redundancy_settings: RedundancySettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionPreferences {
pub preferred_type: ConnectionType,
pub allowed_types: Vec<ConnectionType>,
pub timeout: u32,
pub retry_attempts: u8,
pub ipv6_preferred: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QosSettings {
pub dscp_marking: DscpMarking,
pub traffic_shaping: TrafficShapingSettings,
pub congestion_control: CongestionControlSettings,
pub jitter_buffer: JitterBufferSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrafficShapingSettings {
pub enabled: bool,
pub max_burst: u32,
pub sustained_rate: u32,
pub peak_rate: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CongestionControlSettings {
pub algorithm: CongestionControlAlgorithm,
pub initial_bandwidth: u32,
pub probe_interval: u32,
pub window_size: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JitterBufferSettings {
pub min_buffer: u32,
pub max_buffer: u32,
pub target_buffer: u32,
pub adaptive: bool,
pub fast_adaptation: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FirewallSettings {
pub stun_servers: Vec<StunServerConfig>,
pub turn_servers: Vec<TurnServerConfig>,
pub ice_settings: IceSettings,
pub port_range: Option<(u16, u16)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StunServerConfig {
pub url: String,
pub port: u16,
pub protocol: StunProtocol,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TurnServerConfig {
pub url: String,
pub port: u16,
pub username: String,
pub credential: String,
pub protocol: TurnProtocol,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IceSettings {
pub gathering_policy: IceGatheringPolicy,
pub transport_policy: IceTransportPolicy,
pub candidate_timeout: u32,
pub connection_timeout: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedundancySettings {
pub enabled: bool,
pub redundancy_type: RedundancyType,
pub backup_connections: u8,
pub failover_timeout: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkConditions {
pub bandwidth: u32,
pub rtt: f32,
pub packet_loss: f32,
pub jitter: f32,
pub quality_score: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkThresholds {
pub bandwidth_thresholds: Vec<u32>,
pub latency_thresholds: Vec<u32>,
pub packet_loss_thresholds: Vec<f32>,
pub jitter_thresholds: Vec<f32>,
}
impl Default for NetworkSettings {
fn default() -> Self {
Self {
connection_preferences: ConnectionPreferences::default(),
qos_settings: QosSettings::default(),
firewall_settings: FirewallSettings::default(),
redundancy_settings: RedundancySettings::default(),
}
}
}
impl Default for ConnectionPreferences {
fn default() -> Self {
Self {
preferred_type: ConnectionType::Auto,
allowed_types: vec![
ConnectionType::P2P,
ConnectionType::ServerMediated,
ConnectionType::TurnRelay,
],
timeout: 30000, retry_attempts: 3,
ipv6_preferred: false,
}
}
}
impl Default for QosSettings {
fn default() -> Self {
Self {
dscp_marking: DscpMarking::Voice,
traffic_shaping: TrafficShapingSettings::default(),
congestion_control: CongestionControlSettings::default(),
jitter_buffer: JitterBufferSettings::default(),
}
}
}
impl Default for TrafficShapingSettings {
fn default() -> Self {
Self {
enabled: false,
max_burst: 16384, sustained_rate: 320000, peak_rate: 512000, }
}
}
impl Default for CongestionControlSettings {
fn default() -> Self {
Self {
algorithm: CongestionControlAlgorithm::WebRTC,
initial_bandwidth: 128000, probe_interval: 1000, window_size: 4096,
}
}
}
impl Default for JitterBufferSettings {
fn default() -> Self {
Self {
min_buffer: 20, max_buffer: 200, target_buffer: 60, adaptive: true,
fast_adaptation: true,
}
}
}
impl Default for FirewallSettings {
fn default() -> Self {
Self {
stun_servers: vec![StunServerConfig {
url: "stun:stun.l.google.com".to_string(),
port: 19302,
protocol: StunProtocol::UDP,
}],
turn_servers: vec![],
ice_settings: IceSettings::default(),
port_range: Some((49152, 65535)),
}
}
}
impl Default for IceSettings {
fn default() -> Self {
Self {
gathering_policy: IceGatheringPolicy::All,
transport_policy: IceTransportPolicy::All,
candidate_timeout: 10000, connection_timeout: 30000, }
}
}
impl Default for RedundancySettings {
fn default() -> Self {
Self {
enabled: false,
redundancy_type: RedundancyType::ActivePassive,
backup_connections: 1,
failover_timeout: 5000, }
}
}
impl Default for NetworkThresholds {
fn default() -> Self {
Self {
bandwidth_thresholds: vec![32, 64, 128, 256, 320],
latency_thresholds: vec![50, 100, 200, 500],
packet_loss_thresholds: vec![0.5, 1.0, 2.0, 5.0],
jitter_thresholds: vec![10.0, 20.0, 50.0, 100.0],
}
}
}