datagram_socket/
socket_stats.rs1use std::ops::Deref;
28use std::sync::atomic::AtomicI64;
29use std::sync::atomic::Ordering;
30use std::sync::Arc;
31use std::sync::RwLock;
32use std::time::Duration;
33use std::time::SystemTime;
34
35pub trait AsSocketStats {
36 fn as_socket_stats(&self) -> SocketStats;
37
38 fn as_quic_stats(&self) -> Option<&Arc<QuicAuditStats>> {
39 None
40 }
41}
42
43#[derive(Debug, Clone, Copy, Default)]
44pub struct SocketStats {
45 pub pmtu: u16,
46 pub rtt_us: i64,
47 pub cwnd: u64,
48 pub packets_sent: u64,
49 pub packets_recvd: u64,
50 pub packets_lost: u64,
51 pub packets_retrans: u64,
52 pub bytes_sent: u64,
53 pub bytes_recvd: u64,
54 pub bytes_lost: u64,
55 pub bytes_retrans: u64,
56}
57
58type BoxError = Box<dyn std::error::Error + Send + Sync>;
59
60#[derive(Debug)]
61pub struct QuicAuditStats {
62 recvd_conn_close_transport_error_code: AtomicI64,
64 sent_conn_close_transport_error_code: AtomicI64,
66 recvd_conn_close_application_error_code: AtomicI64,
68 sent_conn_close_application_error_code: AtomicI64,
70 transport_handshake_duration_us: AtomicI64,
72 transport_handshake_start: Arc<RwLock<Option<SystemTime>>>,
74 connection_close_reason: RwLock<Option<BoxError>>,
76 pub quic_connection_id: Vec<u8>,
79}
80
81impl QuicAuditStats {
82 #[inline]
83 pub fn new(quic_connection_id: Vec<u8>) -> Self {
84 Self {
85 recvd_conn_close_transport_error_code: AtomicI64::new(-1),
86 sent_conn_close_transport_error_code: AtomicI64::new(-1),
87 recvd_conn_close_application_error_code: AtomicI64::new(-1),
88 sent_conn_close_application_error_code: AtomicI64::new(-1),
89 transport_handshake_duration_us: AtomicI64::new(-1),
90 transport_handshake_start: Arc::new(RwLock::new(None)),
91 connection_close_reason: RwLock::new(None),
92 quic_connection_id,
93 }
94 }
95
96 #[inline]
97 pub fn recvd_conn_close_transport_error_code(&self) -> i64 {
98 self.recvd_conn_close_transport_error_code
99 .load(Ordering::SeqCst)
100 }
101
102 #[inline]
103 pub fn sent_conn_close_transport_error_code(&self) -> i64 {
104 self.sent_conn_close_transport_error_code
105 .load(Ordering::SeqCst)
106 }
107
108 #[inline]
109 pub fn recvd_conn_close_application_error_code(&self) -> i64 {
110 self.recvd_conn_close_application_error_code
111 .load(Ordering::SeqCst)
112 }
113
114 #[inline]
115 pub fn sent_conn_close_application_error_code(&self) -> i64 {
116 self.sent_conn_close_application_error_code
117 .load(Ordering::SeqCst)
118 }
119
120 #[inline]
121 pub fn set_recvd_conn_close_transport_error_code(
122 &self, recvd_conn_close_transport_error_code: i64,
123 ) {
124 self.recvd_conn_close_transport_error_code
125 .store(recvd_conn_close_transport_error_code, Ordering::SeqCst)
126 }
127
128 #[inline]
129 pub fn set_sent_conn_close_transport_error_code(
130 &self, sent_conn_close_transport_error_code: i64,
131 ) {
132 self.sent_conn_close_transport_error_code
133 .store(sent_conn_close_transport_error_code, Ordering::SeqCst)
134 }
135
136 #[inline]
137 pub fn set_recvd_conn_close_application_error_code(
138 &self, recvd_conn_close_application_error_code: i64,
139 ) {
140 self.recvd_conn_close_application_error_code
141 .store(recvd_conn_close_application_error_code, Ordering::SeqCst)
142 }
143
144 #[inline]
145 pub fn set_sent_conn_close_application_error_code(
146 &self, sent_conn_close_application_error_code: i64,
147 ) {
148 self.sent_conn_close_application_error_code
149 .store(sent_conn_close_application_error_code, Ordering::SeqCst)
150 }
151
152 #[inline]
153 pub fn transport_handshake_duration_us(&self) -> i64 {
154 self.transport_handshake_duration_us.load(Ordering::SeqCst)
155 }
156
157 #[inline]
158 pub fn set_transport_handshake_start(&self, start_time: SystemTime) {
159 *self.transport_handshake_start.write().unwrap() = Some(start_time);
160 }
161
162 #[inline]
163 pub fn set_transport_handshake_duration(&self, duration: Duration) {
164 let dur = i64::try_from(duration.as_micros()).unwrap_or(-1);
165 self.transport_handshake_duration_us
166 .store(dur, Ordering::SeqCst);
167 }
168
169 #[inline]
170 pub fn transport_handshake_start(&self) -> Arc<RwLock<Option<SystemTime>>> {
171 Arc::clone(&self.transport_handshake_start)
172 }
173
174 #[inline]
175 pub fn connection_close_reason(
176 &self,
177 ) -> impl Deref<Target = Option<BoxError>> + '_ {
178 self.connection_close_reason.read().unwrap()
179 }
180
181 #[inline]
182 pub fn set_connection_close_reason(&self, error: BoxError) {
183 *self.connection_close_reason.write().unwrap() = Some(error);
184 }
185}
186
187#[derive(Debug, Copy, Clone, PartialEq, Eq)]
188pub enum StreamClosureKind {
189 None,
190 Implicit,
191 Explicit,
192}