use std::time::Duration;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PathKind {
Direct,
DirectIpv4,
DirectIpv6,
Relay,
Mixed,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MeasurementPathReport {
pub negotiation_time: Duration,
pub initial_path: PathKind,
pub final_path: PathKind,
pub path_changed: bool,
pub became_direct: bool,
pub time_to_direct: Option<Duration>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LatencyReport {
pub samples: u32,
pub min: Duration,
pub mean: Duration,
pub p50: Duration,
pub p95: Duration,
pub p99: Duration,
pub max: Duration,
pub jitter_mean: Duration,
pub jitter_p95: Duration,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LossReport {
pub sent: u64,
pub received: u64,
pub timed_out: u64,
pub duplicated: u64,
pub reordered: u64,
pub timeout_ratio: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ThroughputReport {
pub received_bytes: u64,
pub measurement_duration: Duration,
pub bits_per_second: f64,
pub streams: u16,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LoadedLatencyReport {
pub idle_p50: Duration,
pub download_p50: Duration,
pub download_increase: Duration,
pub upload_p50: Duration,
pub upload_increase: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TransportReport {
pub lost_packets: u64,
pub lost_bytes: u64,
pub congestion_events: u64,
pub udp_rx_datagrams: u64,
pub udp_tx_datagrams: u64,
pub current_mtu: u16,
pub black_holes_detected: u64,
pub final_rtt: Duration,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetBenchReport {
pub schema_version: u16,
pub protocol_version: u16,
pub peer_id: String,
pub total_duration: Duration,
pub path: MeasurementPathReport,
pub idle_latency: LatencyReport,
pub loss: LossReport,
pub download: ThroughputReport,
pub upload: ThroughputReport,
pub loaded_latency: LoadedLatencyReport,
pub transport: TransportReport,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetBenchProbeReport {
pub schema_version: u16,
pub protocol_version: u16,
pub peer_id: String,
pub total_duration: Duration,
pub path: MeasurementPathReport,
pub idle_latency: LatencyReport,
pub loss: LossReport,
pub transport: TransportReport,
}