use std::{ net::SocketAddr, time::{Duration, Instant}, }; use crate::{session::NegotiatedParams, timing::ClientTimestamp}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum OpenOutcome { Started { remote: SocketAddr, token: u64, negotiated: NegotiatedParams, event: ClientEvent, }, NoTestCompleted { remote: SocketAddr, negotiated: NegotiatedParams, event: ClientEvent, }, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum ClientEvent { SessionStarted { remote: SocketAddr, token: u64, negotiated: NegotiatedParams, at: ClientTimestamp, }, NoTestCompleted { remote: SocketAddr, negotiated: NegotiatedParams, at: ClientTimestamp, }, SessionClosed { remote: SocketAddr, token: u64, at: ClientTimestamp, }, EchoSent { seq: u32, logical_seq: u64, remote: SocketAddr, scheduled_at: Instant, sent_at: ClientTimestamp, bytes: usize, send_call: Duration, timer_error: Duration, }, EchoReply { seq: u32, logical_seq: u64, remote: SocketAddr, sent_at: ClientTimestamp, received_at: ClientTimestamp, rtt: RttSample, server_timing: Option, one_way: Option, received_stats: Option, bytes: usize, packet_meta: PacketMeta, }, EchoLoss { seq: u32, logical_seq: u64, sent_at: ClientTimestamp, timeout_at: std::time::Instant, }, DuplicateReply { seq: u32, remote: SocketAddr, received_at: ClientTimestamp, bytes: usize, }, LateReply { seq: u32, logical_seq: Option, highest_seen: u32, remote: SocketAddr, sent_at: Option, received_at: ClientTimestamp, rtt: Option, server_timing: Option, one_way: Option, received_stats: Option, bytes: usize, packet_meta: PacketMeta, }, Warning { kind: WarningKind, message: String, }, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum WarningKind { MalformedOrUnrelatedPacket, WrongToken, UntrackedReply, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct RttSample { pub raw: Duration, pub adjusted: Option, pub effective: Duration, pub adjusted_signed: Option, pub effective_signed: SignedDuration, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct SignedDuration { pub ns: i128, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ServerTiming { pub receive_wall_ns: Option, pub receive_mono_ns: Option, pub send_wall_ns: Option, pub send_mono_ns: Option, pub midpoint_wall_ns: Option, pub midpoint_mono_ns: Option, pub processing: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct OneWayDelaySample { pub client_to_server: Option, pub server_to_client: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ReceivedStatsSample { pub count: Option, pub window: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct PacketMeta { pub traffic_class: Option, pub dscp: Option, pub ecn: Option, pub kernel_rx_timestamp: Option, }