summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-management-interface/proto/management_interface.proto11
-rw-r--r--mullvad-management-interface/src/types/conversions/states.rs23
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs12
-rw-r--r--talpid-types/src/tunnel.rs11
4 files changed, 51 insertions, 6 deletions
diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto
index 7f2ad07b43..21de18df8e 100644
--- a/mullvad-management-interface/proto/management_interface.proto
+++ b/mullvad-management-interface/proto/management_interface.proto
@@ -134,10 +134,11 @@ message ErrorState {
SET_FIREWALL_POLICY_ERROR = 2;
SET_DNS_ERROR = 3;
START_TUNNEL_ERROR = 4;
- TUNNEL_PARAMETER_ERROR = 5;
- IS_OFFLINE = 6;
- VPN_PERMISSION_DENIED = 7;
- SPLIT_TUNNEL_ERROR = 8;
+ CREATE_TUNNEL_DEVICE = 5;
+ TUNNEL_PARAMETER_ERROR = 6;
+ IS_OFFLINE = 7;
+ VPN_PERMISSION_DENIED = 8;
+ SPLIT_TUNNEL_ERROR = 9;
}
enum AuthFailedError {
@@ -175,6 +176,8 @@ message ErrorState {
GenerationError parameter_error = 4;
// SET_FIREWALL_POLICY_ERROR
FirewallPolicyError policy_error = 5;
+ // CREATE_TUNNEL_DEVICE
+ optional int32 create_tunnel_error = 6;
}
message TunnelState {
diff --git a/mullvad-management-interface/src/types/conversions/states.rs b/mullvad-management-interface/src/types/conversions/states.rs
index 17329193c9..f6e41f4d87 100644
--- a/mullvad-management-interface/src/types/conversions/states.rs
+++ b/mullvad-management-interface/src/types/conversions/states.rs
@@ -89,6 +89,10 @@ impl From<mullvad_types::states::TunnelState> for proto::TunnelState {
talpid_tunnel::ErrorStateCause::StartTunnelError => {
i32::from(Cause::StartTunnelError)
}
+ #[cfg(target_os = "windows")]
+ talpid_tunnel::ErrorStateCause::CreateTunnelDevice { os_error: _ } => {
+ i32::from(Cause::CreateTunnelDevice)
+ }
talpid_tunnel::ErrorStateCause::TunnelParameterError(_) => {
i32::from(Cause::TunnelParameterError)
}
@@ -142,6 +146,15 @@ impl From<mullvad_types::states::TunnelState> for proto::TunnelState {
} else {
None
},
+ #[cfg(not(target_os = "windows"))]
+ create_tunnel_error: None,
+ #[cfg(target_os = "windows")]
+ create_tunnel_error: match error_state.cause() {
+ talpid_tunnel::ErrorStateCause::CreateTunnelDevice { os_error } => {
+ *os_error
+ }
+ _ => None,
+ },
}),
})
}
@@ -254,8 +267,12 @@ impl TryFrom<proto::TunnelState> for mullvad_types::states::TunnelState {
auth_failed_error,
parameter_error,
policy_error,
+ create_tunnel_error,
}),
})) => {
+ #[cfg(not(target_os = "windows"))]
+ let _ = create_tunnel_error;
+
let cause = match proto::error_state::Cause::try_from(cause) {
Ok(proto::error_state::Cause::AuthFailed) => {
let auth_failed = try_auth_failed_from_i32(auth_failed_error)?;
@@ -286,6 +303,12 @@ impl TryFrom<proto::TunnelState> for mullvad_types::states::TunnelState {
Ok(proto::error_state::Cause::StartTunnelError) => {
talpid_tunnel::ErrorStateCause::StartTunnelError
}
+ #[cfg(target_os = "windows")]
+ Ok(proto::error_state::Cause::CreateTunnelDevice) => {
+ talpid_tunnel::ErrorStateCause::CreateTunnelDevice {
+ os_error: create_tunnel_error,
+ }
+ }
Ok(proto::error_state::Cause::TunnelParameterError) => {
let parameter_error = match proto::error_state::GenerationError::try_from(parameter_error) {
Ok(proto::error_state::GenerationError::CustomTunnelHostResolutionError) => talpid_tunnel::ParameterGenerationError::CustomTunnelHostResultionError,
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index 1a000c6136..3b0afd8abf 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -278,6 +278,14 @@ impl ConnectingState {
),
),
) => 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)
@@ -581,8 +589,8 @@ impl ConnectingState {
#[cfg_attr(not(target_os = "windows"), allow(unused_variables))]
fn should_retry(error: &tunnel::Error, retry_attempt: u32) -> bool {
#[cfg(target_os = "windows")]
- if error.get_tunnel_device_error().is_some() && retry_attempt < MAX_ATTEMPT_CREATE_TUN {
- return true;
+ if error.get_tunnel_device_error().is_some() {
+ return retry_attempt < MAX_ATTEMPT_CREATE_TUN;
}
error.is_recoverable()
}
diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs
index c035206a1d..ebd3121a86 100644
--- a/talpid-types/src/tunnel.rs
+++ b/talpid-types/src/tunnel.rs
@@ -95,6 +95,9 @@ pub enum ErrorStateCause {
/// Android has rejected one or more DNS server addresses.
#[cfg(target_os = "android")]
InvalidDnsServers(Vec<IpAddr>),
+ /// Failed to create tunnel device.
+ #[cfg(target_os = "windows")]
+ CreateTunnelDevice { os_error: Option<i32> },
/// Failed to start connection to remote server.
StartTunnelError,
/// Tunnel parameter generation failure
@@ -198,6 +201,14 @@ impl fmt::Display for ErrorStateCause {
);
}
StartTunnelError => "Failed to start connection to remote server",
+ #[cfg(target_os = "windows")]
+ CreateTunnelDevice {
+ os_error: Some(error),
+ } => return write!(f, "Failed to create tunnel device: {error}"),
+ #[cfg(target_os = "windows")]
+ CreateTunnelDevice { os_error: None } => {
+ return write!(f, "Failed to create tunnel device")
+ }
TunnelParameterError(ref err) => {
return write!(f, "Failure to generate tunnel parameters: {err}");
}