summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/src/tunnel/mod.rs56
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs65
2 files changed, 63 insertions, 58 deletions
diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs
index 70693d60e7..c36e660aff 100644
--- a/talpid-core/src/tunnel/mod.rs
+++ b/talpid-core/src/tunnel/mod.rs
@@ -5,9 +5,12 @@ use std::path;
#[cfg(not(target_os = "android"))]
use talpid_routing::RouteManagerHandle;
pub use talpid_tunnel::{TunnelArgs, TunnelEvent, TunnelMetadata};
+#[cfg(target_os = "android")]
+use talpid_tunnel::tun_provider;
#[cfg(not(target_os = "android"))]
use talpid_types::net::openvpn as openvpn_types;
use talpid_types::net::{wireguard as wireguard_types, TunnelParameters};
+use talpid_types::tunnel::ErrorStateCause;
const OPENVPN_LOG_FILENAME: &str = "openvpn.log";
const WIREGUARD_LOG_FILENAME: &str = "wireguard.log";
@@ -44,6 +47,59 @@ pub enum Error {
AssignMtuError,
}
+impl Into<ErrorStateCause> for Error {
+ fn into(self) -> ErrorStateCause {
+ match self {
+ Error::EnableIpv6Error => ErrorStateCause::Ipv6Unavailable,
+
+ #[cfg(target_os = "android")]
+ Error::WireguardTunnelMonitoringError(
+ talpid_wireguard::Error::TunnelError(
+ talpid_wireguard::TunnelError::SetupTunnelDevice(
+ tun_provider::Error::OtherLegacyAlwaysOnVpn,
+ ),
+ ),
+ ) => ErrorStateCause::OtherLegacyAlwaysOnVpn,
+
+ #[cfg(target_os = "android")]
+ Error::WireguardTunnelMonitoringError(
+ talpid_wireguard::Error::TunnelError(
+ talpid_wireguard::TunnelError::SetupTunnelDevice(
+ tun_provider::Error::OtherAlwaysOnApp { app_name },
+ ),
+ ),
+ ) => ErrorStateCause::OtherAlwaysOnApp { app_name },
+
+ #[cfg(target_os = "android")]
+ Error::WireguardTunnelMonitoringError(
+ talpid_wireguard::Error::TunnelError(
+ talpid_wireguard::TunnelError::SetupTunnelDevice(
+ tun_provider::Error::NotPrepared,
+ ),
+ ),
+ ) => ErrorStateCause::NotPrepared,
+
+ #[cfg(target_os = "android")]
+ Error::WireguardTunnelMonitoringError(
+ talpid_wireguard::Error::TunnelError(
+ talpid_wireguard::TunnelError::SetupTunnelDevice(
+ tun_provider::Error::InvalidDnsServers(addresses),
+ ),
+ ),
+ ) => ErrorStateCause::InvalidDnsServers(addresses),
+ #[cfg(target_os = "windows")]
+ error => match error.get_tunnel_device_error() {
+ Some(error) => ErrorStateCause::CreateTunnelDevice {
+ os_error: error.raw_os_error(),
+ },
+ None => ErrorStateCause::StartTunnelError,
+ },
+ #[cfg(not(target_os = "windows"))]
+ _ => ErrorStateCause::StartTunnelError,
+ }
+ }
+}
+
impl Error {
/// Return whether retrying the operation that caused this error is likely to succeed.
pub fn is_recoverable(&self) -> bool {
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index f07a941ac1..c616d6c205 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -26,9 +26,6 @@ use talpid_types::{
ErrorExt,
};
-#[cfg(target_os = "android")]
-use talpid_tunnel::tun_provider;
-
use super::connected_state::TunnelEventsReceiver;
pub(crate) type TunnelCloseEvent = Fuse<oneshot::Receiver<Option<ErrorStateCause>>>;
@@ -218,7 +215,7 @@ impl ConnectingState {
) -> Self {
let (event_tx, event_rx) = mpsc::unbounded();
let on_tunnel_event =
- move |event| -> std::pin::Pin<Box<dyn std::future::Future<Output = ()> + Send>> {
+ move |event| -> std::pin::Pin<Box<dyn std::future::Future<Output=()> + Send>> {
let (tx, rx) = oneshot::channel();
let _ = event_tx.unbounded_send((event, tx));
Box::pin(async move {
@@ -265,55 +262,7 @@ impl ConnectingState {
}
Err(error) => {
log::error!("{}", error.display_chain_with_msg("Failed to start tunnel"));
- let block_reason = match error {
- tunnel::Error::EnableIpv6Error => ErrorStateCause::Ipv6Unavailable,
-
- #[cfg(target_os = "android")]
- tunnel::Error::WireguardTunnelMonitoringError(
- talpid_wireguard::Error::TunnelError(
- talpid_wireguard::TunnelError::SetupTunnelDevice(
- tun_provider::Error::OtherLegacyAlwaysOnVpn,
- ),
- ),
- ) => ErrorStateCause::OtherLegacyAlwaysOnVpn,
-
- #[cfg(target_os = "android")]
- tunnel::Error::WireguardTunnelMonitoringError(
- talpid_wireguard::Error::TunnelError(
- talpid_wireguard::TunnelError::SetupTunnelDevice(
- tun_provider::Error::OtherAlwaysOnApp { app_name },
- ),
- ),
- ) => ErrorStateCause::OtherAlwaysOnApp { app_name },
-
- #[cfg(target_os = "android")]
- tunnel::Error::WireguardTunnelMonitoringError(
- talpid_wireguard::Error::TunnelError(
- talpid_wireguard::TunnelError::SetupTunnelDevice(
- tun_provider::Error::NotPrepared,
- ),
- ),
- ) => ErrorStateCause::NotPrepared,
-
- #[cfg(target_os = "android")]
- tunnel::Error::WireguardTunnelMonitoringError(
- talpid_wireguard::Error::TunnelError(
- talpid_wireguard::TunnelError::SetupTunnelDevice(
- tun_provider::Error::InvalidDnsServers(addresses),
- ),
- ),
- ) => ErrorStateCause::InvalidDnsServers(addresses),
- #[cfg(target_os = "windows")]
- error => match error.get_tunnel_device_error() {
- Some(error) => ErrorStateCause::CreateTunnelDevice {
- os_error: error.raw_os_error(),
- },
- None => ErrorStateCause::StartTunnelError,
- },
- #[cfg(not(target_os = "windows"))]
- _ => ErrorStateCause::StartTunnelError,
- };
- Some(block_reason)
+ Some(error.into())
}
};
@@ -355,14 +304,14 @@ impl ConnectingState {
None
}
error @ tunnel::Error::WireguardTunnelMonitoringError(..)
- if !should_retry(&error, retry_attempt) =>
- {
- log::error!(
+ if !should_retry(&error, retry_attempt) =>
+ {
+ log::error!(
"{}",
error.display_chain_with_msg("Tunnel has stopped unexpectedly")
);
- Some(ErrorStateCause::StartTunnelError)
- }
+ Some(ErrorStateCause::StartTunnelError)
+ }
error => {
log::warn!(
"{}",