diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-09-29 14:18:32 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-11-24 18:50:04 +0100 |
| commit | 687f4e87b33c195b2b78eccd26a02a1567660d06 (patch) | |
| tree | 29390840d584a68fb9075dc5a99cd1b3555a45bf | |
| parent | 5e56bfe1e7990bdd1cd2c294f97689738cdebb3e (diff) | |
| download | mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.tar.xz mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.zip | |
Find virtual adapter dynamically
| -rw-r--r-- | gui/src/main/daemon-rpc.ts | 4 | ||||
| -rw-r--r-- | gui/src/shared/daemon-rpc-types.ts | 2 | ||||
| -rw-r--r-- | gui/src/shared/notifications/error.ts | 4 | ||||
| -rw-r--r-- | mullvad-cli/src/format.rs | 1 | ||||
| -rw-r--r-- | mullvad-daemon/src/management_interface.rs | 4 | ||||
| -rw-r--r-- | mullvad-management-interface/proto/management_interface.proto | 2 | ||||
| -rw-r--r-- | talpid-core/src/firewall/windows.rs | 8 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/mod.rs | 2 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/openvpn.rs | 20 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 14 | ||||
| -rw-r--r-- | talpid-core/src/winnet.rs | 18 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 6 | ||||
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 6 | ||||
| -rw-r--r-- | windows/libshared/src/libshared/network/interfaceutils.cpp | 42 | ||||
| -rw-r--r-- | windows/libshared/src/libshared/network/interfaceutils.h | 6 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.cpp | 4 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.def | 2 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.h | 2 |
18 files changed, 78 insertions, 69 deletions
diff --git a/gui/src/main/daemon-rpc.ts b/gui/src/main/daemon-rpc.ts index c7f4ce8608..ffb455365c 100644 --- a/gui/src/main/daemon-rpc.ts +++ b/gui/src/main/daemon-rpc.ts @@ -776,8 +776,8 @@ function convertFromTunnelStateErrorCause( return { reason: 'ipv6_unavailable' }; case grpcTypes.ErrorState.Cause.START_TUNNEL_ERROR: return { reason: 'start_tunnel_error' }; - case grpcTypes.ErrorState.Cause.TAP_ADAPTER_PROBLEM: - return { reason: 'tap_adapter_problem' }; + case grpcTypes.ErrorState.Cause.VIRTUAL_ADAPTER_PROBLEM: + return { reason: 'virtual_adapter_problem' }; case grpcTypes.ErrorState.Cause.SET_FIREWALL_POLICY_ERROR: return { reason: 'set_firewall_policy_error', diff --git a/gui/src/shared/daemon-rpc-types.ts b/gui/src/shared/daemon-rpc-types.ts index bac978f7d6..95d8758088 100644 --- a/gui/src/shared/daemon-rpc-types.ts +++ b/gui/src/shared/daemon-rpc-types.ts @@ -38,7 +38,7 @@ export type ErrorStateCause = | 'set_dns_error' | 'start_tunnel_error' | 'is_offline' - | 'tap_adapter_problem'; + | 'virtual_adapter_problem'; } | { reason: 'set_firewall_policy_error'; details: FirewallPolicyError } | { reason: 'tunnel_parameter_error'; details: TunnelParameterError } diff --git a/gui/src/shared/notifications/error.ts b/gui/src/shared/notifications/error.ts index d9fd12de1a..672dc27b94 100644 --- a/gui/src/shared/notifications/error.ts +++ b/gui/src/shared/notifications/error.ts @@ -117,10 +117,10 @@ function getMessage(errorDetails: IErrorState, accountExpiry?: string): string { 'notifications', "Your device is offline. Try connecting when it's back online.", ); - case 'tap_adapter_problem': + case 'virtual_adapter_problem': return messages.pgettext( 'notifications', - 'Unable to detect a working TAP adapter on this device. Try enabling it. Otherwise, please reinstall the app.', + 'Unable to detect a working virtual adapter on this device. Try enabling it. Otherwise, please reinstall the app.', ); } } diff --git a/mullvad-cli/src/format.rs b/mullvad-cli/src/format.rs index 92f6076e66..7070e322ac 100644 --- a/mullvad-cli/src/format.rs +++ b/mullvad-cli/src/format.rs @@ -138,7 +138,6 @@ fn error_state_to_string(error_state: &ErrorState) -> String { ); } IsOffline => "This device is offline, no tunnels can be established", - TapAdapterProblem => "A problem with the TAP adapter has been detected", #[cfg(target_os = "android")] VpnPermissionDenied => "The Android VPN permission was denied when creating the tunnel", #[cfg(not(target_os = "android"))] diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs index a19179a502..57d063c6a9 100644 --- a/mullvad-daemon/src/management_interface.rs +++ b/mullvad-daemon/src/management_interface.rs @@ -1370,8 +1370,8 @@ fn convert_state(state: TunnelState) -> types::TunnelState { i32::from(ProtoErrorCause::TunnelParameterError) } ErrorStateCause::IsOffline => i32::from(ProtoErrorCause::IsOffline), - ErrorStateCause::TapAdapterProblem => { - i32::from(ProtoErrorCause::TapAdapterProblem) + ErrorStateCause::VirtualAdapterProblem => { + i32::from(ProtoErrorCause::VirtualAdapterProblem) } #[cfg(target_os = "android")] ErrorStateCause::VpnPermissionDenied => { diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto index 6d40e50d78..817d97cd95 100644 --- a/mullvad-management-interface/proto/management_interface.proto +++ b/mullvad-management-interface/proto/management_interface.proto @@ -96,7 +96,7 @@ message ErrorState { START_TUNNEL_ERROR = 4; TUNNEL_PARAMETER_ERROR = 5; IS_OFFLINE = 6; - TAP_ADAPTER_PROBLEM = 7; + VIRTUAL_ADAPTER_PROBLEM = 7; VPN_PERMISSION_DENIED = 8; } diff --git a/talpid-core/src/firewall/windows.rs b/talpid-core/src/firewall/windows.rs index 90f1d73c78..ac1b0b41d9 100644 --- a/talpid-core/src/firewall/windows.rs +++ b/talpid-core/src/firewall/windows.rs @@ -39,9 +39,9 @@ pub enum Error { #[error(display = "Failed to reset firewall policies")] ResettingPolicy(#[error(source)] FirewallPolicyError), - /// Failure to set TAP adapter metric - #[error(display = "Unable to set TAP adapter metric")] - SetTapMetric(#[error(source)] crate::winnet::Error), + /// Failure to set virtual adapter metric + #[error(display = "Unable to set virtual adapter metric")] + SetTunMetric(#[error(source)] crate::winnet::Error), } const WINFW_TIMEOUT_SECONDS: u32 = 2; @@ -214,7 +214,7 @@ impl Firewall { }; let metrics_set = winnet::ensure_best_metric_for_interface(&tunnel_metadata.interface) - .map_err(Error::SetTapMetric)?; + .map_err(Error::SetTunMetric)?; if metrics_set { debug!("Network interface metrics were changed"); diff --git a/talpid-core/src/tunnel/mod.rs b/talpid-core/src/tunnel/mod.rs index 81ca04519a..3e27b792c8 100644 --- a/talpid-core/src/tunnel/mod.rs +++ b/talpid-core/src/tunnel/mod.rs @@ -387,7 +387,7 @@ fn try_enabling_ipv6(tunnel_parameters: &TunnelParameters) -> Result<()> { let guid = match tunnel_parameters { TunnelParameters::OpenVpn(..) => { - let alias = crate::winnet::get_tap_interface_alias().map_err(Error::WinnetError)?; + let alias = crate::winnet::get_interface_alias().map_err(Error::WinnetError)?; guid_string = crate::winnet::interface_alias_to_guid(&alias).map_err(Error::WinnetError)?; &guid_string diff --git a/talpid-core/src/tunnel/openvpn.rs b/talpid-core/src/tunnel/openvpn.rs index 00e5fa2bb1..eab4add157 100644 --- a/talpid-core/src/tunnel/openvpn.rs +++ b/talpid-core/src/tunnel/openvpn.rs @@ -70,15 +70,15 @@ pub enum Error { #[error(display = "The OpenVPN event dispatcher exited unexpectedly")] EventDispatcherExited, - /// No TAP adapter was detected + /// No virtual adapter was detected #[cfg(windows)] - #[error(display = "No TAP adapter was detected")] - MissingTapAdapter, + #[error(display = "No virtual adapter was detected")] + MissingVirtualAdapter, - /// TAP adapter seems to be disabled + /// virtual adapter seems to be disabled #[cfg(windows)] - #[error(display = "The TAP adapter appears to be disabled")] - DisabledTapAdapter, + #[error(display = "The virtual adapter appears to be disabled")] + DisabledVirtualAdapter, /// OpenVPN process died unexpectedly #[error(display = "OpenVPN process died unexpectedly")] @@ -510,10 +510,10 @@ impl<C: OpenVpnBuilder + 'static> OpenVpnMonitor<C> { if let Some(log_path) = self.log_path.take() { if let Ok(log) = fs::read_to_string(log_path) { if log.contains("There are no TAP-Windows adapters on this system") { - return Error::MissingTapAdapter; + return Error::MissingVirtualAdapter; } if log.contains("CreateFile failed on TAP device") { - return Error::DisabledTapAdapter; + return Error::DisabledVirtualAdapter; } } } @@ -601,7 +601,9 @@ impl<C: OpenVpnBuilder + 'static> OpenVpnMonitor<C> { .ca(resource_dir.join("ca.crt")); #[cfg(windows)] { - cmd.tunnel_alias(Some(OsString::from("Mullvad-WT"))); + cmd.tunnel_alias(Some( + crate::winnet::get_interface_alias().map_err(Error::WinnetError)?, + )); cmd.windows_driver(Some(crate::process::openvpn::WindowsDriver::Wintun)); } if let Some(proxy_settings) = params.proxy.clone().take() { diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 60f87787a2..bc59a1d812 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -154,18 +154,18 @@ impl ConnectingState { error @ tunnel::Error::OpenVpnTunnelMonitoringError( - tunnel::openvpn::Error::DisabledTapAdapter, + tunnel::openvpn::Error::DisabledVirtualAdapter, ) | error @ tunnel::Error::OpenVpnTunnelMonitoringError( - tunnel::openvpn::Error::MissingTapAdapter, + tunnel::openvpn::Error::MissingVirtualAdapter, ) => { warn!( "{}", - error.display_chain_with_msg("TAP adapter problem detected") + error.display_chain_with_msg("Virtual adapter problem detected") ); - Some(ErrorStateCause::TapAdapterProblem) + Some(ErrorStateCause::VirtualAdapterProblem) } error => { warn!( @@ -416,12 +416,12 @@ impl TunnelState for ConnectingState { #[cfg(windows)] tunnel::Error::OpenVpnTunnelMonitoringError( tunnel::openvpn::Error::WinnetError( - crate::winnet::Error::GetTapAlias, + crate::winnet::Error::GetVirtualAdapterAlias, ), ) | tunnel::Error::WinnetError( - crate::winnet::Error::GetTapAlias, - ) => ErrorStateCause::TapAdapterProblem, + crate::winnet::Error::GetVirtualAdapterAlias, + ) => ErrorStateCause::VirtualAdapterProblem, #[cfg(target_os = "android")] tunnel::Error::WireguardTunnelMonitoringError( tunnel::wireguard::Error::TunnelError( diff --git a/talpid-core/src/winnet.rs b/talpid-core/src/winnet.rs index 9fed90ac21..e78fd5f03b 100644 --- a/talpid-core/src/winnet.rs +++ b/talpid-core/src/winnet.rs @@ -41,9 +41,9 @@ pub enum Error { #[error(display = "Failed to read IPv6 status on the TAP network interface")] GetIpv6Status, - /// Failed to determine alias of TAP adapter. - #[error(display = "Failed to determine alias of TAP adapter")] - GetTapAlias, + /// Failed to determine alias of virtual adapter. + #[error(display = "Failed to determine alias of virtual adapter")] + GetVirtualAdapterAlias, /// Can't establish whether host is connected to a non-virtual network #[error(display = "Network connectivity undecideable")] @@ -102,15 +102,15 @@ pub fn enable_ipv6_for_adapter(interface_guid: &str) -> Result<(), Error> { } } -/// Dynamically determines the alias of the TAP adapter. -pub fn get_tap_interface_alias() -> Result<OsString, Error> { +/// Dynamically determines the alias of the virtual adapter. +pub fn get_interface_alias() -> Result<OsString, Error> { let mut alias_ptr: *mut wchar_t = ptr::null_mut(); let status = unsafe { - WinNet_GetTapInterfaceAlias(&mut alias_ptr as *mut _, Some(log_sink), logging_context()) + WinNet_GetInterfaceAlias(&mut alias_ptr as *mut _, Some(log_sink), logging_context()) }; if !status { - return Err(Error::GetTapAlias); + return Err(Error::GetVirtualAdapterAlias); } let alias = unsafe { WideCString::from_ptr_str(alias_ptr) }; @@ -521,8 +521,8 @@ mod api { sink_context: *const u8, ) -> WinNetStatus; - #[link_name = "WinNet_GetTapInterfaceAlias"] - pub fn WinNet_GetTapInterfaceAlias( + #[link_name = "WinNet_GetInterfaceAlias"] + pub fn WinNet_GetInterfaceAlias( tunnel_interface_alias: *mut *mut wchar_t, sink: Option<LogSink>, sink_context: *const u8, diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs index c803a489a7..fd476e14c6 100644 --- a/talpid-types/src/tunnel.rs +++ b/talpid-types/src/tunnel.rs @@ -96,8 +96,8 @@ pub enum ErrorStateCause { TunnelParameterError(ParameterGenerationError), /// This device is offline, no tunnels can be established. IsOffline, - /// A problem with the TAP adapter has been detected. - TapAdapterProblem, + /// A problem with the virtual adapter has been detected. + VirtualAdapterProblem, /// The Android VPN permission was denied. #[cfg(target_os = "android")] VpnPermissionDenied, @@ -177,7 +177,7 @@ impl fmt::Display for ErrorStateCause { return write!(f, "Failure to generate tunnel parameters: {}", err); } IsOffline => "This device is offline, no tunnels can be established", - TapAdapterProblem => "A problem with the TAP adapter has been detected", + VirtualAdapterProblem => "A problem with the virtual adapter has been detected", #[cfg(target_os = "android")] VpnPermissionDenied => "The Android VPN permission was denied when creating the tunnel", }; diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index 08f0e97883..0ab60ae6b2 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -452,7 +452,7 @@ void ForEachNetworkDevice(const std::optional<std::wstring> hwId, std::function< // std::wstringstream ss; - ss << L"Skipping TAP adapter due to exception caught while iterating: " + ss << L"Skipping virtual adapter due to exception caught while iterating: " << common::string::ToWide(e.what()); LogError(ss.str()); continue; @@ -928,8 +928,8 @@ int wmain(int argc, const wchar_t * argv[], const wchar_t * []) const wchar_t *hardwareId = argv[2]; const wchar_t *baseName = argv[3]; - const auto tapAdapters = GetNetworkAdapters(hardwareId); - const auto adapter = FindAdapterByAlias(tapAdapters, baseName); + const auto virtualAdapters = GetNetworkAdapters(hardwareId); + const auto adapter = FindAdapterByAlias(virtualAdapters, baseName); if (!adapter.has_value()) { diff --git a/windows/libshared/src/libshared/network/interfaceutils.cpp b/windows/libshared/src/libshared/network/interfaceutils.cpp index 042753aed6..26588206b3 100644 --- a/windows/libshared/src/libshared/network/interfaceutils.cpp +++ b/windows/libshared/src/libshared/network/interfaceutils.cpp @@ -5,6 +5,18 @@ #include <libcommon/error.h> #include <libcommon/string.h> +namespace +{ + +// Interface description substrings found for virtual adapters. +const wchar_t *TUNNEL_INTERFACE_DESCS[] = { + L"WireGuard", + L"Wintun", + L"Mullvad" +}; + +} // anonymous namespace + namespace shared::network { @@ -111,38 +123,34 @@ void InterfaceUtils::AddDeviceIpAddresses(NET_LUID device, const std::vector<SOC //static std::set<InterfaceUtils::NetworkAdapter> -InterfaceUtils::GetTapAdapters(const std::set<NetworkAdapter>& adapters) +InterfaceUtils::GetVirtualAdapters(const std::set<NetworkAdapter>& adapters) { - std::set<NetworkAdapter> tapAdapters; + std::set<NetworkAdapter> virtualAdapters; for (const auto& adapter : adapters) { - static constexpr wchar_t name[] = L"Mullvad VPN TAP Adapter"; - - // - // Compare partial name, because once you start having more TAP adapters - // they're named "Mullvad VPN TAP Adapter #2" and so on. - // - - if (0 == adapter.name().compare(0, _countof(name) - 1, name)) + for (size_t i = 0; i < ARRAYSIZE(TUNNEL_INTERFACE_DESCS); i++) { - tapAdapters.insert(adapter); + if (nullptr != wcsstr(adapter.raw().Description, TUNNEL_INTERFACE_DESCS[i])) + { + virtualAdapters.insert(adapter); + } } } - return tapAdapters; + return virtualAdapters; } //static -std::wstring InterfaceUtils::GetTapInterfaceAlias() +std::wstring InterfaceUtils::GetInterfaceAlias() { // - // Look for TAP adapter with alias "Mullvad". + // Look for virtual adapter with alias "Mullvad". // using shared::network::InterfaceUtils; - auto adapters = InterfaceUtils::GetTapAdapters(InterfaceUtils::GetAllAdapters( + auto adapters = InterfaceUtils::GetVirtualAdapters(InterfaceUtils::GetAllAdapters( AF_INET, GAA_FLAG_SKIP_UNICAST | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST )); @@ -165,7 +173,7 @@ std::wstring InterfaceUtils::GetTapInterfaceAlias() } // - // Look for TAP adapter with alias "Mullvad-1", "Mullvad-2", etc. + // Look for virtual adapter with alias "Mullvad-1", "Mullvad-2", etc. // for (auto i = 0; i < 10; ++i) @@ -182,7 +190,7 @@ std::wstring InterfaceUtils::GetTapInterfaceAlias() } } - THROW_ERROR("Unable to find TAP adapter"); + THROW_ERROR("Unable to find virtual adapter"); } } diff --git a/windows/libshared/src/libshared/network/interfaceutils.h b/windows/libshared/src/libshared/network/interfaceutils.h index 85a243d591..e29b2fbcb2 100644 --- a/windows/libshared/src/libshared/network/interfaceutils.h +++ b/windows/libshared/src/libshared/network/interfaceutils.h @@ -68,12 +68,12 @@ public: static void AddDeviceIpAddresses(NET_LUID device, const std::vector<SOCKADDR_INET> &addresses); - static std::set<NetworkAdapter> GetTapAdapters(const std::set<NetworkAdapter> &adapters); + static std::set<NetworkAdapter> GetVirtualAdapters(const std::set<NetworkAdapter> &adapters); // - // Determines alias of primary TAP adapter. + // Determines alias of primary virtual adapter. // - static std::wstring GetTapInterfaceAlias(); + static std::wstring GetInterfaceAlias(); }; } diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp index 50332a85e6..bccf5561d8 100644 --- a/windows/winnet/src/winnet/winnet.cpp +++ b/windows/winnet/src/winnet/winnet.cpp @@ -215,7 +215,7 @@ extern "C" WINNET_LINKAGE
bool
WINNET_API
-WinNet_GetTapInterfaceAlias(
+WinNet_GetInterfaceAlias(
wchar_t **alias,
MullvadLogSink logSink,
void *logSinkContext
@@ -228,7 +228,7 @@ WinNet_GetTapInterfaceAlias( THROW_ERROR("Invalid argument: alias");
}
- const auto currentAlias = InterfaceUtils::GetTapInterfaceAlias();
+ const auto currentAlias = InterfaceUtils::GetInterfaceAlias();
auto stringBuffer = new wchar_t[currentAlias.size() + 1];
wcscpy(stringBuffer, currentAlias.c_str());
diff --git a/windows/winnet/src/winnet/winnet.def b/windows/winnet/src/winnet/winnet.def index 21bb2725c7..34d3c4e59d 100644 --- a/windows/winnet/src/winnet/winnet.def +++ b/windows/winnet/src/winnet/winnet.def @@ -3,7 +3,7 @@ EXPORTS WinNet_EnsureBestMetric WinNet_InterfaceAliasToGuid WinNet_EnableIpv6ForAdapter - WinNet_GetTapInterfaceAlias + WinNet_GetInterfaceAlias WinNet_ReleaseString WinNet_ActivateConnectivityMonitor WinNet_DeactivateConnectivityMonitor diff --git a/windows/winnet/src/winnet/winnet.h b/windows/winnet/src/winnet/winnet.h index 0da271274e..5634298a93 100644 --- a/windows/winnet/src/winnet/winnet.h +++ b/windows/winnet/src/winnet/winnet.h @@ -47,7 +47,7 @@ extern "C" WINNET_LINKAGE bool WINNET_API -WinNet_GetTapInterfaceAlias( +WinNet_GetInterfaceAlias( wchar_t **alias, MullvadLogSink logSink, void *logSinkContext |
