diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-01-02 16:45:38 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-01-07 10:28:35 +0100 |
| commit | fd1fe67e85946236dfa5d3c4a688cf3630898a0a (patch) | |
| tree | bd53d8fbc4da8907a4e98752cb3e8b07ea694655 | |
| parent | dc64fb58a88918f751f3e26571bf0ef6f99fd722 (diff) | |
| download | mullvadvpn-fd1fe67e85946236dfa5d3c4a688cf3630898a0a.tar.xz mullvadvpn-fd1fe67e85946236dfa5d3c4a688cf3630898a0a.zip | |
Distinguish between IPv6 being disabled and failure to obtain IPv6
status, so that we may set a precise block reason
| -rw-r--r-- | talpid-core/src/tunnel/mod.rs | 31 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 3 |
2 files changed, 25 insertions, 9 deletions
diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs index 6d167efed3..bcf5721bb8 100644 --- a/talpid-core/src/tunnel/mod.rs +++ b/talpid-core/src/tunnel/mod.rs @@ -33,6 +33,11 @@ pub enum Error { #[error(display = "Can't enable IPv6 on tunnel interface because IPv6 is disabled")] EnableIpv6Error, + /// Failure in Windows syscall. + #[cfg(windows)] + #[error(display = "Failure in Windows syscall")] + WinnetError(#[error(source)] crate::winnet::Error), + /// Running on an operating system which is not supported yet. #[error(display = "Tunnel type not supported on this operating system")] UnsupportedPlatform, @@ -200,8 +205,13 @@ impl TunnelMonitor { } fn ensure_ipv6_can_be_used_if_enabled(tunnel_options: &GenericTunnelOptions) -> Result<()> { - if tunnel_options.enable_ipv6 && !is_ipv6_enabled_in_os() { - Err(Error::EnableIpv6Error) + if tunnel_options.enable_ipv6 { + let enabled = is_ipv6_enabled_in_os()?; + if enabled { + Ok(()) + } else { + Err(Error::EnableIpv6Error) + } } else { Ok(()) } @@ -308,7 +318,7 @@ impl InternalTunnelMonitor { } -fn is_ipv6_enabled_in_os() -> bool { +fn is_ipv6_enabled_in_os() -> Result<bool> { #[cfg(windows)] { use winreg::{enums::*, RegKey}; @@ -324,7 +334,8 @@ fn is_ipv6_enabled_in_os() -> bool { (ipv6_disabled_bits & IPV6_DISABLED_ON_TUNNELS_MASK) == 0 }) .unwrap_or(true); - let enabled_on_tap = crate::winnet::get_tap_interface_ipv6_status().unwrap_or(false); + let enabled_on_tap = + crate::winnet::get_tap_interface_ipv6_status().map_err(Error::WinnetError)?; if !globally_enabled { log::debug!("IPv6 disabled in tunnel interfaces"); @@ -333,16 +344,18 @@ fn is_ipv6_enabled_in_os() -> bool { log::debug!("IPv6 disabled in TAP adapter"); } - globally_enabled && enabled_on_tap + Ok(globally_enabled && enabled_on_tap) } #[cfg(target_os = "linux")] { - std::fs::read_to_string("/proc/sys/net/ipv6/conf/all/disable_ipv6") - .map(|disable_ipv6| disable_ipv6.trim() == "0") - .unwrap_or(false) + Ok( + std::fs::read_to_string("/proc/sys/net/ipv6/conf/all/disable_ipv6") + .map(|disable_ipv6| disable_ipv6.trim() == "0") + .unwrap_or(false), + ) } #[cfg(any(target_os = "macos", target_os = "android"))] { - true + Ok(true) } } diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 31490d6ffd..720e2d3729 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -408,6 +408,9 @@ impl TunnelState for ConnectingState { tunnel::openvpn::Error::WinnetError( crate::winnet::Error::GetTapAlias, ), + ) + | tunnel::Error::WinnetError( + crate::winnet::Error::GetTapAlias, ) => ErrorStateCause::TapAdapterProblem, _ => ErrorStateCause::StartTunnelError, }; |
