use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Capabilities {
pub datagram_probes: bool,
pub loaded_latency: bool,
pub path_stats: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct ServerLimits {
pub test_duration_ms: u32,
pub parallel_streams: u16,
pub chunk_size: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u16)]
pub enum ErrorCode {
UnsupportedVersion = 1,
InvalidRequest = 2,
Busy = 3,
UnknownTest = 4,
Internal = 5,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ControlMessage {
ClientHello {
protocol_versions: Vec<u16>,
capabilities: Capabilities,
},
ServerHello {
selected_version: u16,
limits: ServerLimits,
capabilities: Capabilities,
},
StartLatency {
test_id: u64,
duration_ms: u32,
interval_ms: u32,
},
StartLoss {
test_id: u64,
duration_ms: u32,
rate_per_second: u32,
timeout_ms: u32,
},
StartDownload {
test_id: u64,
duration_ms: u32,
streams: u16,
chunk_size: u32,
},
StartUpload {
test_id: u64,
duration_ms: u32,
streams: u16,
chunk_size: u32,
},
TestReady {
test_id: u64,
},
ThroughputProgress {
test_id: u64,
received_bytes: u64,
duration_ns: u64,
},
StopTest {
test_id: u64,
},
TestFinished {
test_id: u64,
received_bytes: u64,
duration_ns: u64,
},
FlowFinished,
FlowFinishedAck,
Error {
code: ErrorCode,
message: String,
},
}