diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-01-29 14:52:28 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-01-31 11:02:51 +0100 |
| commit | d42c51875bbdd4eb609a5b25ceb2a2691cc94fab (patch) | |
| tree | 8f5a2c92e37e00dc3c1d4273ced0514c595f2656 | |
| parent | 997fb7f6847d915d29e363083b6593cbd7da5ba4 (diff) | |
| download | mullvadvpn-d42c51875bbdd4eb609a5b25ceb2a2691cc94fab.tar.xz mullvadvpn-d42c51875bbdd4eb609a5b25ceb2a2691cc94fab.zip | |
Add tunnel creation error on Windows
| -rw-r--r-- | mullvad-management-interface/proto/management_interface.proto | 11 | ||||
| -rw-r--r-- | mullvad-management-interface/src/types/conversions/states.rs | 23 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 12 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 11 |
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}"); } |
