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, remote: SocketAddr, scheduled_at: Instant, sent_at: ClientTimestamp, bytes: usize, send_call: Duration, timer_error: Duration, }, EchoReply { seq: u32, 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, sent_at: ClientTimestamp, timeout_at: std::time::Instant, }, DuplicateReply { seq: u32, remote: SocketAddr, received_at: ClientTimestamp, bytes: usize, }, LateReply { seq: u32, 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, at: ClientTimestamp, }, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[non_exhaustive] 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, } /// Receive-side packet metadata observed outside the IRTT wire protocol. /// /// `None` means the metadata was unavailable. `Some(0)` means the metadata was /// observed and its value was zero. #[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, } #[cfg(test)] mod tests { use super::PacketMeta; #[test] fn packet_meta_default_is_unavailable() { let meta = PacketMeta::default(); assert_eq!(meta.traffic_class, None); assert_eq!(meta.dscp, None); assert_eq!(meta.ecn, None); assert_eq!(meta.kernel_rx_timestamp, None); } }