diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-11-24 11:58:26 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-11-24 18:50:04 +0100 |
| commit | 6fb00c9c0890e661bef225c7d40bde8c0ea858ff (patch) | |
| tree | 31fa0d43eb7bb97bf7d895fa81ded864800620db /windows/driverlogic/src/driverlogic.cpp | |
| parent | 500ef2da6738e8679be76b590d5078dbc4fb0eb6 (diff) | |
| download | mullvadvpn-6fb00c9c0890e661bef225c7d40bde8c0ea858ff.tar.xz mullvadvpn-6fb00c9c0890e661bef225c7d40bde8c0ea858ff.zip | |
Don't replace existing network adapter in driverlogic
Diffstat (limited to 'windows/driverlogic/src/driverlogic.cpp')
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index 663436a7fd..acc601811b 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -666,6 +666,48 @@ void CreateNetDevice(const std::wstring &hardwareId, const std::optional<std::ws } } +std::wstring FindFreeAdapterAlias(const std::set<NetworkAdapter> &adapters, const std::wstring &baseName) +{ + if (adapters.empty()) + { + return baseName; + } + + auto findByAlias = [](const std::set<NetworkAdapter> &adapters, const std::wstring &alias) + { + const auto it = std::find_if(adapters.begin(), adapters.end(), [&alias](const NetworkAdapter &candidate) + { + return 0 == _wcsicmp(candidate.alias.c_str(), alias.c_str()); + }); + + return it; + }; + + const auto foundAdapter = findByAlias(adapters, baseName); + + if (adapters.end() == foundAdapter) + { + return baseName; + } + + for (auto i = 1; i < 100; ++i) + { + std::wstringstream ss; + + ss << baseName << L"-" << i; + + const auto alias = ss.str(); + const auto nextAdapter = findByAlias(adapters, alias); + + if (adapters.end() == nextAdapter) + { + return alias; + } + } + + THROW_ERROR("Cannot find an unused adapter alias") +} + std::optional<NetworkAdapter> FindAdapterByAlias(const std::set<NetworkAdapter> &tapAdapters, const std::wstring &baseName) { if (tapAdapters.empty()) @@ -881,9 +923,12 @@ int HandleWintunCommands(int argc, const wchar_t *argv[]) requestGuid = &guidObject; } + const auto adapters = GetNetworkAdapters(std::nullopt); + const auto freeAdapterName = FindFreeAdapterAlias(adapters, adapter); + const auto handle = wintun.createAdapter( pool, - adapter, + freeAdapterName.c_str(), requestGuid, nullptr ); |
