1use std::net::SocketAddr;
2use std::sync::Arc;
3
4use tokio::net::{TcpStream, UdpSocket};
5
6use crate::fetch::AsyncReadWrite;
7
8#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, serde::Serialize, serde::Deserialize)]
9pub struct QuicAssocId(pub u64);
10
11pub enum L4Conn {
12 Tcp(TcpStream),
13 Peeked(Box<dyn AsyncReadWrite + Send>),
19 Tls(Box<dyn AsyncReadWrite + Send>),
28 Udp(UdpAssoc),
29}
30
31pub struct UdpAssoc {
32 pub socket: Arc<UdpSocket>,
33 pub peer: SocketAddr,
34 pub quic: Option<QuicAssocId>,
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40
41 fn _accepts_l4_conn(_: &L4Conn) {}
44
45 #[test]
46 fn quic_assoc_id_serde_round_trip() {
47 let id = QuicAssocId(0xdead_beef_cafe_babe);
48 let encoded = serde_json::to_string(&id).expect("serialize");
49 let decoded: QuicAssocId = serde_json::from_str(&encoded).expect("deserialize");
50 assert_eq!(decoded, id);
51 }
52
53 #[test]
54 fn quic_assoc_id_equality_is_structural() {
55 assert_eq!(QuicAssocId(42), QuicAssocId(42));
56 assert_ne!(QuicAssocId(42), QuicAssocId(43));
57 }
58}