@@ -83,34 +83,34 @@ pub async fn run_udp_forwarder(
8383 let mut map = clients. lock( ) . await ;
8484
8585 // Get or create per-client ephemeral socket
86- if ! map. contains_key ( & client_addr) {
87- let std_sock = match std:: net :: UdpSocket :: bind ( "0.0.0.0:0" ) {
88- Ok ( s ) => s ,
89- Err ( e ) => {
90- tracing :: warn! ( "udp ephemeral bind for {client_addr}: {e}" ) ;
91- continue ;
92- }
93- } ;
94- std_sock . set_nonblocking ( true ) . unwrap ( ) ;
95- let socket = Arc :: new ( UdpSocket :: from_std ( std_sock ) . unwrap ( ) ) ;
96-
97- let return_cancel = cancel . child_token ( ) ;
98- // Spawn return-path task
99- tokio :: spawn ( udp_return_path (
100- host_socket . clone ( ) ,
101- socket . clone( ) ,
102- client_addr ,
103- return_cancel . child_token ( ) ,
104- ) ) ;
105-
106- map . insert ( client_addr , ClientState {
107- socket ,
108- last_active : Instant :: now ( ) ,
109- _cancel : return_cancel ,
110- } ) ;
111- }
112-
113- let entry = map . get_mut ( & client_addr ) . unwrap ( ) ;
86+ let entry = match map. entry ( client_addr) {
87+ std:: collections :: hash_map :: Entry :: Occupied ( e ) => e . into_mut ( ) ,
88+ std :: collections :: hash_map :: Entry :: Vacant ( e ) => {
89+ let std_sock = match std :: net :: UdpSocket :: bind ( "0.0.0.0:0" ) {
90+ Ok ( s ) => s ,
91+ Err ( e ) => {
92+ tracing :: warn! ( "udp ephemeral bind for {client_addr}: {e}" ) ;
93+ continue ;
94+ }
95+ } ;
96+ std_sock . set_nonblocking ( true ) . unwrap ( ) ;
97+ let socket = Arc :: new ( UdpSocket :: from_std ( std_sock ) . unwrap ( ) ) ;
98+
99+ let return_cancel = cancel . child_token ( ) ;
100+ tokio :: spawn ( udp_return_path (
101+ host_socket . clone( ) ,
102+ socket . clone ( ) ,
103+ client_addr ,
104+ return_cancel . child_token ( ) ,
105+ ) ) ;
106+
107+ e . insert ( ClientState {
108+ socket ,
109+ last_active : Instant :: now ( ) ,
110+ _cancel : return_cancel ,
111+ } )
112+ }
113+ } ;
114114 entry. last_active = Instant :: now( ) ;
115115
116116 // Forward client data to target
@@ -164,7 +164,9 @@ mod tests {
164164 let mut buf = vec ! [ 0u8 ; UDP_BUF_SIZE ] ;
165165 loop {
166166 match echo. recv_from ( & mut buf) . await {
167- Ok ( ( n, from) ) => { let _ = echo. send_to ( & buf[ ..n] , from) . await ; }
167+ Ok ( ( n, from) ) => {
168+ let _ = echo. send_to ( & buf[ ..n] , from) . await ;
169+ }
168170 Err ( _) => break ,
169171 }
170172 }
@@ -186,10 +188,10 @@ mod tests {
186188 client. send_to ( b"hello udp" , fwd_addr) . await . unwrap ( ) ;
187189
188190 let mut buf = vec ! [ 0u8 ; 64 ] ;
189- let ( n, _) = tokio:: time:: timeout (
190- Duration :: from_secs ( 2 ) ,
191- client . recv_from ( & mut buf ) ,
192- ) . await . unwrap ( ) . unwrap ( ) ;
191+ let ( n, _) = tokio:: time:: timeout ( Duration :: from_secs ( 2 ) , client . recv_from ( & mut buf ) )
192+ . await
193+ . unwrap ( )
194+ . unwrap ( ) ;
193195 assert_eq ! ( & buf[ ..n] , b"hello udp" ) ;
194196
195197 cancel. cancel ( ) ;
0 commit comments