diff options
| m--------- | dist-assets/binaries | 0 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/mod.rs | 2 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connected_state.rs | 15 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 29 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/disconnecting_state.rs | 31 |
5 files changed, 53 insertions, 24 deletions
diff --git a/dist-assets/binaries b/dist-assets/binaries -Subproject 19ad32e0385d959356c9fc8f62e5b69b6725d82 +Subproject fcd078e6a1c1d301f566171b0836d7022bfd4a0 diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs index a8c601b724..9014ee16ab 100644 --- a/talpid-core/src/tunnel/mod.rs +++ b/talpid-core/src/tunnel/mod.rs @@ -57,7 +57,7 @@ pub enum Error { /// There was an error listening for events from the Wireguard tunnel #[cfg(any(target_os = "android", target_os = "linux", target_os = "macos"))] #[error(display = "Failed while listening for events from the Wireguard tunnel")] - WirguardTunnelMonitoringError(#[error(cause)] wireguard::Error), + WireguardTunnelMonitoringError(#[error(cause)] wireguard::Error), } diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs index 7421ef42eb..fd26b20bc3 100644 --- a/talpid-core/src/tunnel_state_machine/connected_state.rs +++ b/talpid-core/src/tunnel_state_machine/connected_state.rs @@ -20,8 +20,8 @@ pub struct ConnectedStateBootstrap { pub metadata: TunnelMetadata, pub tunnel_events: mpsc::UnboundedReceiver<TunnelEvent>, pub tunnel_parameters: TunnelParameters, - pub tunnel_close_event: oneshot::Receiver<Option<BlockReason>>, - pub close_handle: CloseHandle, + pub tunnel_close_event: Option<oneshot::Receiver<Option<BlockReason>>>, + pub close_handle: Option<CloseHandle>, } /// The tunnel is up and working. @@ -29,8 +29,8 @@ pub struct ConnectedState { metadata: TunnelMetadata, tunnel_events: mpsc::UnboundedReceiver<TunnelEvent>, tunnel_parameters: TunnelParameters, - tunnel_close_event: oneshot::Receiver<Option<BlockReason>>, - close_handle: CloseHandle, + tunnel_close_event: Option<oneshot::Receiver<Option<BlockReason>>>, + close_handle: Option<CloseHandle>, } impl ConnectedState { @@ -175,7 +175,12 @@ impl ConnectedState { ) -> EventConsequence<Self> { use self::EventConsequence::*; - match self.tunnel_close_event.poll() { + let poll_result = match &mut self.tunnel_close_event { + Some(tunnel_close_event) => tunnel_close_event.poll(), + None => Ok(Async::NotReady), + }; + + match poll_result { Ok(Async::Ready(block_reason)) => { if let Some(reason) = block_reason { return NewState(BlockedState::enter(shared_values, reason)); diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index d9ac78442a..dd4cc492ac 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -34,8 +34,8 @@ const MIN_TUNNEL_ALIVE_TIME: Duration = Duration::from_millis(1000); pub struct ConnectingState { tunnel_events: mpsc::UnboundedReceiver<TunnelEvent>, tunnel_parameters: TunnelParameters, - tunnel_close_event: oneshot::Receiver<Option<BlockReason>>, - close_handle: CloseHandle, + tunnel_close_event: Option<oneshot::Receiver<Option<BlockReason>>>, + close_handle: Option<CloseHandle>, retry_attempt: u32, } @@ -78,7 +78,7 @@ impl ConnectingState { on_tunnel_event, tun_provider, )?; - let close_handle = monitor.close_handle(); + let close_handle = Some(monitor.close_handle()); let tunnel_close_event = Self::spawn_tunnel_monitor_wait_thread(monitor); Ok(ConnectingState { @@ -92,7 +92,7 @@ impl ConnectingState { fn spawn_tunnel_monitor_wait_thread( tunnel_monitor: TunnelMonitor, - ) -> oneshot::Receiver<Option<BlockReason>> { + ) -> Option<oneshot::Receiver<Option<BlockReason>>> { let (tunnel_close_event_tx, tunnel_close_event_rx) = oneshot::channel(); thread::spawn(move || { @@ -113,7 +113,7 @@ impl ConnectingState { trace!("Tunnel monitor thread exit"); }); - tunnel_close_event_rx + Some(tunnel_close_event_rx) } fn wait_for_tunnel_monitor(tunnel_monitor: TunnelMonitor) -> Option<BlockReason> { @@ -270,7 +270,12 @@ impl ConnectingState { mut self, shared_values: &mut SharedTunnelStateValues, ) -> EventConsequence<Self> { - match self.tunnel_close_event.poll() { + let poll_result = match &mut self.tunnel_close_event { + Some(tunnel_close_event) => tunnel_close_event.poll(), + None => Ok(Async::NotReady), + }; + + match poll_result { Ok(Async::Ready(block_reason)) => { if let Some(reason) = block_reason { return EventConsequence::NewState(BlockedState::enter(shared_values, reason)); @@ -339,6 +344,18 @@ impl TunnelState for ConnectingState { TunnelStateTransition::Connecting(params.get_tunnel_endpoint()), ) } + #[cfg(not(windows))] + Err(tunnel::Error::WireguardTunnelMonitoringError( + tunnel::wireguard::Error::StartWireguardError { status: -2 }, + )) => { + log::warn!( + "Retrying to connect after failing to start Wireguard tunnel" + ); + DisconnectingState::enter( + shared_values, + (None, None, AfterDisconnect::Reconnect(retry_attempt + 1)), + ) + } Err(error) => { log::error!("Failed to start tunnel: {}", error); let block_reason = match error { diff --git a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs index 3dd1951806..733a6e2448 100644 --- a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs @@ -16,7 +16,7 @@ use talpid_types::{ /// This state is active from when we manually trigger a tunnel kill until the tunnel wait /// operation (TunnelExit) returned. pub struct DisconnectingState { - exited: oneshot::Receiver<Option<BlockReason>>, + exited: Option<oneshot::Receiver<Option<BlockReason>>>, after_disconnect: AfterDisconnect, } @@ -101,7 +101,12 @@ impl DisconnectingState { ) -> EventConsequence<Self> { use self::EventConsequence::*; - match self.exited.poll() { + let poll_result = match &mut self.exited { + Some(exited) => exited.poll(), + None => Ok(Async::Ready(None)), + }; + + match poll_result { Ok(Async::NotReady) => NoEvents(self), Ok(Async::Ready(block_reason)) => { NewState(self.after_disconnect(block_reason, shared_values)) @@ -131,8 +136,8 @@ impl DisconnectingState { impl TunnelState for DisconnectingState { type Bootstrap = ( - CloseHandle, - oneshot::Receiver<Option<BlockReason>>, + Option<CloseHandle>, + Option<oneshot::Receiver<Option<BlockReason>>>, AfterDisconnect, ); @@ -140,14 +145,16 @@ impl TunnelState for DisconnectingState { _: &mut SharedTunnelStateValues, (close_handle, exited, after_disconnect): Self::Bootstrap, ) -> (TunnelStateWrapper, TunnelStateTransition) { - thread::spawn(move || { - if let Err(error) = close_handle.close() { - log::error!( - "{}", - error.display_chain_with_msg("Failed to close the tunnel") - ); - } - }); + if let Some(close_handle) = close_handle { + thread::spawn(move || { + if let Err(error) = close_handle.close() { + log::error!( + "{}", + error.display_chain_with_msg("Failed to close the tunnel") + ); + } + }); + } let action_after_disconnect = after_disconnect.action(); |
