diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-01-07 10:45:53 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-01-07 10:45:53 +0100 |
| commit | 51b8fdb7e27d8f68a663a22527365abb231129c1 (patch) | |
| tree | b0051efd624b841880f5654f76f06f471a80d0e6 /talpid-core/src | |
| parent | 9390906917c7c009d9718a953cd413ba7bca250f (diff) | |
| parent | af5a98b427f9e9d8b824478c0ae01eb6792131aa (diff) | |
| download | mullvadvpn-51b8fdb7e27d8f68a663a22527365abb231129c1.tar.xz mullvadvpn-51b8fdb7e27d8f68a663a22527365abb231129c1.zip | |
Merge branch 'tap-missing-update'
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/tunnel/mod.rs | 31 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 9 | ||||
| -rw-r--r-- | talpid-core/src/winnet.rs | 3 |
3 files changed, 34 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 2191d6ed97..720e2d3729 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -403,6 +403,15 @@ impl TunnelState for ConnectingState { tunnel::Error::EnableIpv6Error => { ErrorStateCause::Ipv6Unavailable } + #[cfg(windows)] + tunnel::Error::OpenVpnTunnelMonitoringError( + tunnel::openvpn::Error::WinnetError( + crate::winnet::Error::GetTapAlias, + ), + ) + | tunnel::Error::WinnetError( + crate::winnet::Error::GetTapAlias, + ) => ErrorStateCause::TapAdapterProblem, _ => ErrorStateCause::StartTunnelError, }; ErrorState::enter(shared_values, block_reason) diff --git a/talpid-core/src/winnet.rs b/talpid-core/src/winnet.rs index 24e30fabeb..08a4937b3c 100644 --- a/talpid-core/src/winnet.rs +++ b/talpid-core/src/winnet.rs @@ -64,6 +64,9 @@ pub fn ensure_top_metric_for_interface(interface_alias: &str) -> Result<bool, Er /// Checks if IPv6 is enabled for the TAP interface pub fn get_tap_interface_ipv6_status() -> Result<bool, Error> { + // WinNet_GetTapInterfaceIpv6Status() will fail if the alias cannot be retrieved. + // Try to retrieve it first so that we may return a more specific error. + let _ = get_tap_interface_alias()?; let tap_ipv6_status = unsafe { WinNet_GetTapInterfaceIpv6Status(Some(log_sink), logging_context()) }; |
