summaryrefslogtreecommitdiffhomepage
path: root/windows
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 /windows
parent5e56bfe1e7990bdd1cd2c294f97689738cdebb3e (diff)
downloadmullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.tar.xz
mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.zip
Find virtual adapter dynamically
Diffstat (limited to 'windows')
-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
6 files changed, 35 insertions, 27 deletions
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