@@ -15,6 +15,7 @@ use std::io;
15
15
use std:: io:: ErrorKind ;
16
16
use std:: net:: { Ipv4Addr , Ipv6Addr , SocketAddr } ;
17
17
use std:: sync:: Arc ;
18
+ use std:: time:: Duration ;
18
19
use tokio:: sync:: Notify ;
19
20
20
21
// We left AllowedIPs since it's boltconn that manages routing.
@@ -157,12 +158,16 @@ impl WireguardTunnel {
157
158
let name = config. name . clone ( ) ;
158
159
local_async_run ( async move {
159
160
// dedicated to poll UDP from small kernel buffer
160
- loop {
161
+ while !in_tx . is_disconnected ( ) {
161
162
let key = match pool. clone ( ) . create_owned ( ) {
162
163
Some ( mut buf) => {
163
164
let key = BufferIndex :: Pool ( buf. key ( ) ) ;
164
165
buf. resize ( MAX_UDP_PKT_SIZE , 0 ) ;
165
- let Ok ( len) = socket. recv ( & mut buf) . await else {
166
+ let recv_result = tokio:: select! {
167
+ recv_result = socket. recv( & mut buf) => recv_result,
168
+ _ = tokio:: time:: sleep( Duration :: from_millis( 500 ) ) => continue ,
169
+ } ;
170
+ let Ok ( len) = recv_result else {
166
171
tracing:: warn!(
167
172
"WireGuard #{} failed to receive from socket" ,
168
173
name,
@@ -174,7 +179,11 @@ impl WireguardTunnel {
174
179
}
175
180
None => {
176
181
let mut buf = vec ! [ 0 ; MAX_UDP_PKT_SIZE ] ;
177
- let len = match socket. recv ( & mut buf) . await {
182
+ let recv_result = tokio:: select! {
183
+ recv_result = socket. recv( & mut buf) => recv_result,
184
+ _ = tokio:: time:: sleep( Duration :: from_millis( 500 ) ) => continue ,
185
+ } ;
186
+ let len = match recv_result {
178
187
Ok ( len) => len,
179
188
Err ( e) => {
180
189
tracing:: warn!(
@@ -190,9 +199,14 @@ impl WireguardTunnel {
190
199
}
191
200
} ;
192
201
if let Err ( err) = in_tx. try_send ( key) {
202
+ let is_disconnected =
203
+ matches ! ( err, flume:: TrySendError :: Disconnected ( _) ) ;
193
204
if let BufferIndex :: Pool ( key) = err. into_inner ( ) {
194
205
pool. clear ( key) ;
195
206
}
207
+ if is_disconnected {
208
+ break ;
209
+ }
196
210
tracing:: warn!( "channel full, dropping packet" ) ;
197
211
}
198
212
}
0 commit comments