summaryrefslogtreecommitdiffhomepage
path: root/windows/libshared
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/libshared
parent5e56bfe1e7990bdd1cd2c294f97689738cdebb3e (diff)
downloadmullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.tar.xz
mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.zip
Find virtual adapter dynamically
Diffstat (limited to 'windows/libshared')
-rw-r--r--windows/libshared/src/libshared/network/interfaceutils.cpp42
-rw-r--r--windows/libshared/src/libshared/network/interfaceutils.h6
2 files changed, 28 insertions, 20 deletions
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();
};
}