summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-01 20:51:20 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-11-04 17:29:17 +0000
commit14977a1b9c47efde12d0ab8a13b581af67932842 (patch)
tree53ddc634e46afbae391ffe790d9c4d85dc77eb8c
parentb02ea5b346fabfb4d5e257cf9f3f3d3db9aaee5b (diff)
downloadmullvadvpn-14977a1b9c47efde12d0ab8a13b581af67932842.tar.xz
mullvadvpn-14977a1b9c47efde12d0ab8a13b581af67932842.zip
Recreate tunnel on too many reconnects
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index da71d392f3..efc75f3cbb 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -28,6 +28,7 @@ use talpid_types::{
};
+const MAX_ATTEMPTS_WITH_SAME_TUN: u32 = 5;
const MIN_TUNNEL_ALIVE_TIME: Duration = Duration::from_millis(1000);
/// The tunnel has been started, but it is not established/functional.
@@ -350,11 +351,26 @@ impl TunnelState for ConnectingState {
);
BlockedState::enter(shared_values, BlockReason::StartTunnelError)
} else {
+ let tun_provider: &mut dyn TunProvider =
+ shared_values.tun_provider.borrow_mut();
+
+ #[cfg(target_os = "android")]
+ {
+ if retry_attempt > 0 && retry_attempt % MAX_ATTEMPTS_WITH_SAME_TUN == 0 {
+ if let Err(error) = tun_provider.create_tun() {
+ error!(
+ "{}",
+ error.display_chain_with_msg("Failed to recreate tun device")
+ );
+ }
+ }
+ }
+
match Self::start_tunnel(
tunnel_parameters,
&shared_values.log_dir,
&shared_values.resource_dir,
- shared_values.tun_provider.borrow_mut(),
+ tun_provider,
retry_attempt,
) {
Ok(connecting_state) => {