summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
m---------dist-assets/binaries0
-rw-r--r--talpid-core/src/tunnel/mod.rs2
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs15
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs29
-rw-r--r--talpid-core/src/tunnel_state_machine/disconnecting_state.rs31
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();