1use std::future::Future;
17
18use bytes::Bytes;
19
20pub trait QuinnConn: Clone + Send + Sync {
23 type AddrType: std::fmt::Debug;
25 type SockAddrType: std::fmt::Debug;
27 fn open_bi(&self) -> anapaya_quinn::OpenBi<'_>;
29 fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_>;
31 fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_>;
33 fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError>;
35 fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_>;
37 fn closed(&self) -> impl Future<Output = anapaya_quinn::ConnectionError> + Send;
39 fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError>;
41 fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]);
43 fn max_datagram_size(&self) -> Option<usize>;
45 fn datagram_send_buffer_space(&self) -> usize;
47 fn remote_address(&self) -> Self::SockAddrType;
49 fn local_ip(&self) -> Option<Self::AddrType>;
51 fn stable_id(&self) -> usize;
53 fn stats(&self) -> anapaya_quinn::ConnectionStats;
55}
56
57#[derive(Clone)]
59pub struct ScionQuinnConn {
60 pub(crate) inner: anapaya_quinn::Connection,
61 pub(crate) local_addr: Option<scion_proto::address::ScionAddr>,
63 pub(crate) remote_addr: scion_proto::address::SocketAddr,
65}
66
67impl QuinnConn for ScionQuinnConn {
68 type AddrType = scion_proto::address::ScionAddr;
69
70 type SockAddrType = scion_proto::address::SocketAddr;
71
72 fn open_bi(&self) -> anapaya_quinn::OpenBi<'_> {
73 self.inner.open_bi()
74 }
75
76 fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_> {
77 self.inner.accept_bi()
78 }
79
80 fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_> {
81 self.inner.read_datagram()
82 }
83
84 fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError> {
85 self.inner.send_datagram(data)
86 }
87
88 fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_> {
89 self.inner.send_datagram_wait(data)
90 }
91
92 async fn closed(&self) -> anapaya_quinn::ConnectionError {
93 self.inner.closed().await
94 }
95
96 fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError> {
97 self.inner.close_reason()
98 }
99
100 fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]) {
101 self.inner.close(error_code, reason)
102 }
103
104 fn max_datagram_size(&self) -> Option<usize> {
105 self.inner.max_datagram_size()
106 }
107
108 fn datagram_send_buffer_space(&self) -> usize {
109 self.inner.datagram_send_buffer_space()
110 }
111
112 fn remote_address(&self) -> Self::SockAddrType {
113 self.remote_addr
114 }
115
116 fn local_ip(&self) -> Option<Self::AddrType> {
117 self.local_addr
118 }
119
120 fn stable_id(&self) -> usize {
121 self.inner.stable_id()
122 }
123 fn stats(&self) -> anapaya_quinn::ConnectionStats {
124 self.inner.stats()
125 }
126}
127
128impl QuinnConn for anapaya_quinn::Connection {
129 type AddrType = std::net::IpAddr;
130
131 type SockAddrType = std::net::SocketAddr;
132
133 fn open_bi(&self) -> anapaya_quinn::OpenBi<'_> {
134 self.open_bi()
135 }
136
137 fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_> {
138 self.accept_bi()
139 }
140
141 fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_> {
142 self.read_datagram()
143 }
144
145 fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError> {
146 self.send_datagram(data)
147 }
148
149 fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_> {
150 self.send_datagram_wait(data)
151 }
152
153 fn closed(&self) -> impl Future<Output = anapaya_quinn::ConnectionError> + Send {
154 self.closed()
155 }
156
157 fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError> {
158 self.close_reason()
159 }
160
161 fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]) {
162 self.close(error_code, reason);
163 }
164
165 fn max_datagram_size(&self) -> Option<usize> {
166 self.max_datagram_size()
167 }
168
169 fn datagram_send_buffer_space(&self) -> usize {
170 self.datagram_send_buffer_space()
171 }
172
173 fn remote_address(&self) -> Self::SockAddrType {
174 self.remote_address()
175 }
176
177 fn local_ip(&self) -> Option<Self::AddrType> {
178 self.local_ip()
179 }
180
181 fn stable_id(&self) -> usize {
182 self.stable_id()
183 }
184 fn stats(&self) -> anapaya_quinn::ConnectionStats {
185 self.stats()
186 }
187}