55
66use std:: collections:: VecDeque ;
77use std:: sync:: Arc ;
8+ use std:: sync:: atomic:: AtomicBool ;
89use std:: sync:: atomic:: Ordering ;
910
1011use bytes:: Bytes ;
1112use tokio:: sync:: OwnedSemaphorePermit ;
1213use tokio_util:: sync:: CancellationToken ;
1314
1415use crate :: protocol:: {
15- Carrier , CompactUdpFrame , DATAGRAM_UDP_CLOSE , DATAGRAM_UDP_REQUEST , DATAGRAM_UDP_RESPONSE ,
16- FlowHeader , FlowKind , FlowRole , decode_udp_compact, decode_udp_datagram_parts,
17- encode_udp_compact, new_udp_datagram_header,
16+ Carrier , CompactUdpFrame , DATAGRAM_UDP_CLOSE , DATAGRAM_UDP_COMPACT_CLOSE ,
17+ DATAGRAM_UDP_OPEN_ACK , DATAGRAM_UDP_REQUEST , DATAGRAM_UDP_RESPONSE , FlowHeader , FlowKind ,
18+ FlowRole , decode_udp_compact, decode_udp_datagram_parts, encode_udp_compact,
19+ new_udp_datagram_header,
1820} ;
1921
2022use super :: flow:: { PortalUdpFlow , QueuedDatagram , UdpFlowKey } ;
@@ -112,11 +114,18 @@ impl PortalSession {
112114 (
113115 state. target == target && state. downlink == downlink,
114116 state. sender . clone ( ) ,
117+ state. acked . load ( Ordering :: Acquire ) ,
115118 )
116119 } ) ;
117- if let Some ( ( valid, sender) ) = existing {
120+ if let Some ( ( valid, sender, acked ) ) = existing {
118121 if valid {
119122 let _ = sender. try_send ( payload) ;
123+ if acked
124+ && let Ok ( frame) =
125+ encode_udp_compact ( DATAGRAM_UDP_OPEN_ACK , flow_id, & [ ] )
126+ {
127+ let _ = self . conn . send_datagram ( Bytes :: from ( frame) ) ;
128+ }
120129 } else {
121130 drop ( sender) ;
122131 self . reject_compact_flow ( flow_id) . await ;
@@ -130,12 +139,14 @@ impl PortalSession {
130139 return ;
131140 }
132141 let ( sender, receiver) = tokio:: sync:: mpsc:: channel ( 64 ) ;
142+ let acked = Arc :: new ( AtomicBool :: new ( false ) ) ;
133143 self . compact_udp_flows . lock ( ) . await . insert (
134144 flow_id,
135145 CompactUdpState {
136146 target : target. clone ( ) ,
137147 downlink,
138148 sender : sender. clone ( ) ,
149+ acked : acked. clone ( ) ,
139150 } ,
140151 ) ;
141152 let _ = sender. try_send ( payload) ;
@@ -159,6 +170,10 @@ impl PortalSession {
159170 downlink_carrier : Carrier :: Udp ,
160171 uplink_path : path. clone ( ) ,
161172 downlink_path : path,
173+ compact_ack : Some ( crate :: portal:: pairing:: CompactAck {
174+ conn : self . conn . clone ( ) ,
175+ acked,
176+ } ) ,
162177 } )
163178 } else {
164179 let header = FlowHeader {
@@ -175,9 +190,17 @@ impl PortalSession {
175190 self . session_id ,
176191 header,
177192 target,
178- self . link_path ( ) ,
179- Some ( crate :: portal:: pairing:: UdpUp :: Quic ( receiver) ) ,
180- None ,
193+ crate :: portal:: pairing:: LinkHalf :: quic (
194+ self . link_path ( ) ,
195+ self . quic_generation ( ) ,
196+ ) ,
197+ crate :: portal:: pairing:: UdpHalf :: Uplink {
198+ uplink : crate :: portal:: pairing:: UdpUp :: Quic ( receiver) ,
199+ compact_ack : Some ( crate :: portal:: pairing:: CompactAck {
200+ conn : self . conn . clone ( ) ,
201+ acked,
202+ } ) ,
203+ } ,
181204 )
182205 . await
183206 {
@@ -199,15 +222,17 @@ impl PortalSession {
199222 }
200223 }
201224 CompactUdpFrame :: Data { flow_id, payload } => {
202- if let Some ( sender) = self
225+ let sender = self
203226 . compact_udp_flows
204227 . lock ( )
205228 . await
206229 . get ( & flow_id)
207- . map ( |s| s. sender . clone ( ) )
208- {
230+ . map ( |s| s. sender . clone ( ) ) ;
231+ if let Some ( sender ) = sender {
209232 let payload_offset = payload. as_ptr ( ) as usize - data. as_ptr ( ) as usize ;
210233 let _ = sender. try_send ( data. slice ( payload_offset..) ) ;
234+ } else {
235+ self . reject_compact_flow ( flow_id) . await ;
211236 }
212237 }
213238 CompactUdpFrame :: Close { flow_id } => {
@@ -227,7 +252,7 @@ impl PortalSession {
227252 . pairing
228253 . cancel_udp ( self . session_id , flow_id)
229254 . await ;
230- if let Ok ( frame) = encode_udp_compact ( DATAGRAM_UDP_CLOSE , flow_id, & [ ] ) {
255+ if let Ok ( frame) = encode_udp_compact ( DATAGRAM_UDP_COMPACT_CLOSE , flow_id, & [ ] ) {
231256 let _ = self . conn . send_datagram ( Bytes :: from ( frame) ) ;
232257 }
233258 }
0 commit comments