summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-09-29 14:18:32 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-11-24 18:50:04 +0100
commit687f4e87b33c195b2b78eccd26a02a1567660d06 (patch)
tree29390840d584a68fb9075dc5a99cd1b3555a45bf
parent5e56bfe1e7990bdd1cd2c294f97689738cdebb3e (diff)
downloadmullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.tar.xz
mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.zip
Find virtual adapter dynamically
-rw-r--r--gui/src/main/daemon-rpc.ts4
-rw-r--r--gui/src/shared/daemon-rpc-types.ts2
-rw-r--r--gui/src/shared/notifications/error.ts4
-rw-r--r--mullvad-cli/src/format.rs1
-rw-r--r--mullvad-daemon/src/management_interface.rs4
-rw-r--r--mullvad-management-interface/proto/management_interface.proto2
-rw-r--r--talpid-core/src/firewall/windows.rs8
-rw-r--r--talpid-core/src/tunnel/mod.rs2
-rw-r--r--talpid-core/src/tunnel/openvpn.rs20
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs14
-rw-r--r--talpid-core/src/winnet.rs18
-rw-r--r--talpid-types/src/tunnel.rs6
-rw-r--r--windows/driverlogic/src/driverlogic.cpp6
-rw-r--r--windows/libshared/src/libshared/network/interfaceutils.cpp42
-rw-r--r--windows/libshared/src/libshared/network/interfaceutils.h6
-rw-r--r--windows/winnet/src/winnet/winnet.cpp4
-rw-r--r--windows/winnet/src/winnet/winnet.def2
-rw-r--r--windows/winnet/src/winnet/winnet.h2
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