diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-27 10:01:27 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-09-27 10:01:27 -0300 |
| commit | c35d1308dfbaed42731ea4dfe584025d60ebd8f2 (patch) | |
| tree | 8b47faed045b5a446fff49130edc1e8b0473284a | |
| parent | 0382ea64b4edd68de91741d22bb511f4e5b18a9d (diff) | |
| parent | 9ee5ef68ea1b79ed90b7a09789520eedf5bfca5e (diff) | |
| download | mullvadvpn-c35d1308dfbaed42731ea4dfe584025d60ebd8f2.tar.xz mullvadvpn-c35d1308dfbaed42731ea4dfe584025d60ebd8f2.zip | |
Merge branch 'stop-pinger'
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/mod.rs | 13 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/wireguard/ping_monitor.rs | 12 |
2 files changed, 21 insertions, 4 deletions
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs index 0721a2ead7..861134d2ef 100644 --- a/talpid-core/src/tunnel/wireguard/mod.rs +++ b/talpid-core/src/tunnel/wireguard/mod.rs @@ -80,6 +80,7 @@ pub struct WireguardMonitor { event_callback: Box<dyn Fn(TunnelEvent) + Send + Sync + 'static>, close_msg_sender: mpsc::Sender<CloseMsg>, close_msg_receiver: mpsc::Receiver<CloseMsg>, + pinger_stop_sender: mpsc::Sender<()>, } impl WireguardMonitor { @@ -103,12 +104,14 @@ impl WireguardMonitor { .map_err(Error::SetupRoutingError)?; let event_callback = Box::new(on_event.clone()); let (close_msg_sender, close_msg_receiver) = mpsc::channel(); + let (pinger_tx, pinger_rx) = mpsc::channel(); let monitor = WireguardMonitor { tunnel, route_handle, event_callback, close_msg_sender, close_msg_receiver, + pinger_stop_sender: pinger_tx, }; let metadata = monitor.tunnel_metadata(&config); @@ -121,8 +124,12 @@ impl WireguardMonitor { Ok(()) => { (on_event)(TunnelEvent::Up(metadata)); - if let Err(e) = ping_monitor::monitor_ping(gateway, PING_TIMEOUT, &iface_name) { - log::trace!("Ping monitor failed - {}", e); + match ping_monitor::monitor_ping(gateway, PING_TIMEOUT, &iface_name, pinger_rx) + { + Ok(()) => return, + Err(error) => { + log::trace!("{}", error.display_chain_with_msg("Ping monitor failed")); + } } } Err(error) => { @@ -152,6 +159,8 @@ impl WireguardMonitor { Err(_) => Ok(()), }; + let _ = self.pinger_stop_sender.send(()); + // Clear routes manually - otherwise there will be some log spam since the tunnel device // can be removed before the routes are cleared, which automatically clears some of the // routes that were set. diff --git a/talpid-core/src/tunnel/wireguard/ping_monitor.rs b/talpid-core/src/tunnel/wireguard/ping_monitor.rs index 89b13ee637..9af4c3c8b1 100644 --- a/talpid-core/src/tunnel/wireguard/ping_monitor.rs +++ b/talpid-core/src/tunnel/wireguard/ping_monitor.rs @@ -1,6 +1,7 @@ use std::{ io, net::IpAddr, + sync::mpsc, thread, time::{Duration, Instant}, }; @@ -14,8 +15,13 @@ pub enum Error { TimeoutError, } -pub fn monitor_ping(ip: IpAddr, timeout_secs: u16, interface: &str) -> Result<(), Error> { - loop { +pub fn monitor_ping( + ip: IpAddr, + timeout_secs: u16, + interface: &str, + close_receiver: mpsc::Receiver<()>, +) -> Result<(), Error> { + while let Err(mpsc::TryRecvError::Empty) = close_receiver.try_recv() { let start = Instant::now(); ping(ip, timeout_secs, &interface, false)?; if let Some(remaining) = @@ -24,6 +30,8 @@ pub fn monitor_ping(ip: IpAddr, timeout_secs: u16, interface: &str) -> Result<() thread::sleep(remaining); } } + + Ok(()) } pub fn ping( |
