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 /windows/libshared | |
| parent | 5e56bfe1e7990bdd1cd2c294f97689738cdebb3e (diff) | |
| download | mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.tar.xz mullvadvpn-687f4e87b33c195b2b78eccd26a02a1567660d06.zip | |
Find virtual adapter dynamically
Diffstat (limited to 'windows/libshared')
| -rw-r--r-- | windows/libshared/src/libshared/network/interfaceutils.cpp | 42 | ||||
| -rw-r--r-- | windows/libshared/src/libshared/network/interfaceutils.h | 6 |
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(); }; } |
