summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-28 08:14:05 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-28 09:04:13 -0300
commita4b4ec0de092d8c33ae462011a562615c27dda9e (patch)
treed32c657695d4a79e6d1c5c756319a0738b3baab4
parentd06c6732a9a0a088c9670e95f6ff7a82fc41e48f (diff)
downloadmullvadvpn-a4b4ec0de092d8c33ae462011a562615c27dda9e.tar.xz
mullvadvpn-a4b4ec0de092d8c33ae462011a562615c27dda9e.zip
Stop reconnection attempt on tunnel state changes
-rw-r--r--mullvad-daemon/src/lib.rs26
1 files changed, 20 insertions, 6 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 1c7f17c4e0..22103282cf 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -168,6 +168,7 @@ pub struct Daemon {
state: DaemonExecutionState,
rx: mpsc::Receiver<DaemonEvent>,
tx: mpsc::Sender<DaemonEvent>,
+ reconnection_loop_tx: Option<mpsc::Sender<()>>,
management_interface_broadcaster: management_interface::EventBroadcaster,
#[cfg(unix)]
management_interface_socket_path: String,
@@ -231,6 +232,7 @@ impl Daemon {
state: DaemonExecutionState::Running,
rx,
tx,
+ reconnection_loop_tx: None,
management_interface_broadcaster: management_interface_result.0,
#[cfg(unix)]
management_interface_socket_path: management_interface_result.1,
@@ -319,6 +321,8 @@ impl Daemon {
fn handle_tunnel_state_transition(&mut self, tunnel_state: TunnelStateTransition) {
use self::TunnelStateTransition::*;
+ self.unschedule_reconnect();
+
debug!("New tunnel state: {:?}", tunnel_state);
match tunnel_state {
Disconnected => {
@@ -342,19 +346,29 @@ impl Daemon {
}
fn schedule_reconnect(&mut self, delay: Duration) {
- let command_tx = self.tx.clone();
+ let tunnel_command_tx = self.tx.clone();
+ let (tx, rx) = mpsc::channel();
+
+ self.reconnection_loop_tx = Some(tx);
thread::spawn(move || {
let (result_tx, _result_rx) = oneshot::channel();
- thread::sleep(delay);
- debug!("Attempting to reconnect");
- let _ = command_tx.send(DaemonEvent::ManagementInterfaceEvent(
- ManagementCommand::SetTargetState(result_tx, TargetState::Secured),
- ));
+ if let Err(mpsc::RecvTimeoutError::Timeout) = rx.recv_timeout(delay) {
+ debug!("Attempting to reconnect");
+ let _ = tunnel_command_tx.send(DaemonEvent::ManagementInterfaceEvent(
+ ManagementCommand::SetTargetState(result_tx, TargetState::Secured),
+ ));
+ }
});
}
+ fn unschedule_reconnect(&mut self) {
+ if let Some(tx) = self.reconnection_loop_tx.take() {
+ let _ = tx.send(());
+ }
+ }
+
fn handle_management_interface_event(&mut self, event: ManagementCommand) {
use ManagementCommand::*;
match event {