summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-27 10:01:27 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-09-27 10:01:27 -0300
commitc35d1308dfbaed42731ea4dfe584025d60ebd8f2 (patch)
tree8b47faed045b5a446fff49130edc1e8b0473284a
parent0382ea64b4edd68de91741d22bb511f4e5b18a9d (diff)
parent9ee5ef68ea1b79ed90b7a09789520eedf5bfca5e (diff)
downloadmullvadvpn-c35d1308dfbaed42731ea4dfe584025d60ebd8f2.tar.xz
mullvadvpn-c35d1308dfbaed42731ea4dfe584025d60ebd8f2.zip
Merge branch 'stop-pinger'
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs13
-rw-r--r--talpid-core/src/tunnel/wireguard/ping_monitor.rs12
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(