diff options
| author | David Lönnhager <david.l@mullvad.net> | 2019-12-02 12:35:03 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2019-12-03 09:17:30 +0100 |
| commit | 478240a0a572a15b45c4fd6033ffb4e28d496f82 (patch) | |
| tree | 2f6c726df7c58ec755405d7932d0ffca868c4502 /windows | |
| parent | 4b8d6a6fb9c7b00de6feca0a6a7229fa49e4dc95 (diff) | |
| download | mullvadvpn-478240a0a572a15b45c4fd6033ffb4e28d496f82.tar.xz mullvadvpn-478240a0a572a15b45c4fd6033ffb4e28d496f82.zip | |
Move InterfaceUtils into shared library, and move Nci into libcommon
Diffstat (limited to 'windows')
19 files changed, 305 insertions, 362 deletions
diff --git a/windows/nsis-plugins/src/driverlogic/context.cpp b/windows/nsis-plugins/src/driverlogic/context.cpp index 083e533ddb..2598377091 100644 --- a/windows/nsis-plugins/src/driverlogic/context.cpp +++ b/windows/nsis-plugins/src/driverlogic/context.cpp @@ -1,10 +1,11 @@ #include "stdafx.h" #include "context.h" -#include "ncicontext.h" +#include <libcommon/guid.h> #include <libcommon/string.h> #include <libcommon/error.h> #include <libcommon/memory.h> +#include <libcommon/network/nci.h> #include <log/log.h> #include <winsock2.h> @@ -251,7 +252,7 @@ std::set<Context::NetworkAdapter> GetTapAdapters() SetupDiDestroyDeviceInfoList(devInfo); }; - NciContext nci; + common::network::Nci nci; for (int memberIndex = 0; ; memberIndex++) { @@ -284,12 +285,7 @@ std::set<Context::NetworkAdapter> GetTapAdapters() // const std::wstring guid = GetNetCfgInstanceId(devInfo, devInfoData); - - IID guidObj = { 0 }; - if (S_OK != IIDFromString(&guid[0], &guidObj)) - { - throw std::runtime_error("IIDFromString() failed"); - } + GUID guidObj = common::Guid::FromString(guid); adapters.emplace(Context::NetworkAdapter( guid, @@ -382,18 +378,14 @@ void Context::recordCurrentState() void Context::rollbackTapAliases() { - NciContext nci; + common::network::Nci nci; for (const auto &adapter : m_currentState) { const auto oldInfo = m_baseline.find(adapter); if (m_baseline.end() != oldInfo) { - IID guidObj = { 0 }; - if (S_OK != IIDFromString(&adapter.guid[0], &guidObj)) - { - throw std::runtime_error("IIDFromString() failed"); - } + GUID guidObj = common::Guid::FromString(&adapter.guid[0]); nci.setConnectionName(guidObj, oldInfo->alias.c_str()); } diff --git a/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj b/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj index ff268f19d3..5a4e4b18c4 100644 --- a/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj +++ b/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj @@ -103,7 +103,6 @@ </ItemDefinitionGroup> <ItemGroup> <ClInclude Include="context.h" /> - <ClInclude Include="ncicontext.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> </ItemGroup> @@ -111,7 +110,6 @@ <ClCompile Include="dllmain.cpp" /> <ClCompile Include="driverlogic.cpp" /> <ClCompile Include="context.cpp" /> - <ClCompile Include="ncicontext.cpp" /> <ClCompile Include="stdafx.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> diff --git a/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj.filters b/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj.filters index eff46cba67..2c25d275f1 100644 --- a/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj.filters +++ b/windows/nsis-plugins/src/driverlogic/driverlogic.vcxproj.filters @@ -4,14 +4,12 @@ <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> <ClInclude Include="context.h" /> - <ClInclude Include="ncicontext.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="driverlogic.cpp" /> <ClCompile Include="stdafx.cpp" /> <ClCompile Include="context.cpp" /> - <ClCompile Include="ncicontext.cpp" /> </ItemGroup> <ItemGroup> <None Include="driverlogic.def" /> diff --git a/windows/nsis-plugins/src/driverlogic/ncicontext.cpp b/windows/nsis-plugins/src/driverlogic/ncicontext.cpp deleted file mode 100644 index 988199f470..0000000000 --- a/windows/nsis-plugins/src/driverlogic/ncicontext.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "stdafx.h" -#include "ncicontext.h" -#include <libcommon/error.h> -#include <libcommon/filesystem.h> -#include <filesystem> -#include <stdexcept> - -NciContext::NciContext() -{ - std::wstring systemDir = common::fs::GetKnownFolderPath( - FOLDERID_System, - KF_FLAG_DEFAULT, - nullptr - ); - const auto lsassPath = std::filesystem::path(systemDir).append(L"nci.dll"); - - dllHandle = LoadLibraryW(lsassPath.c_str()); - - if (nullptr == dllHandle) - { - throw std::runtime_error("Failed to load nci.dll"); - } - - m_nciGetConnectionName = reinterpret_cast<nciGetConnectionNameFunc>( - GetProcAddress(dllHandle, "NciGetConnectionName")); - - if (nullptr == m_nciGetConnectionName) - { - FreeLibrary(dllHandle); - throw std::runtime_error("Failed to obtain pointer to nciGetConnectionName"); - } - - m_nciSetConnectionName = reinterpret_cast<nciSetConnectionNameFunc>( - GetProcAddress(dllHandle, "NciSetConnectionName")); - - if (nullptr == m_nciSetConnectionName) - { - FreeLibrary(dllHandle); - throw std::runtime_error("Failed to obtain pointer to nciSetConnectionName"); - } -} - -NciContext::~NciContext() -{ - FreeLibrary(dllHandle); -} - -std::wstring NciContext::getConnectionName(const GUID& guid) -{ - DWORD nameLen = 0; - DWORD status = m_nciGetConnectionName(&guid, nullptr, 0, &nameLen); - - if (0 != status) - { - common::error::Throw( - "NciGetConnectionName() failed", - status - ); - } - - std::wstring buffer; - buffer.resize(nameLen / sizeof(wchar_t)); - - DWORD capacity = static_cast<DWORD>(buffer.capacity() * sizeof(wchar_t)); - status = m_nciGetConnectionName(&guid, &buffer[0], capacity, nullptr); - - if (0 != status) - { - common::error::Throw( - "NciGetConnectionName() failed", - status - ); - } - - return buffer; -} - -void NciContext::setConnectionName(const GUID& guid, const wchar_t* newName) -{ - const auto status = m_nciSetConnectionName(&guid, newName); - if (0 != status) - { - common::error::Throw( - "NciSetConnectionName() failed", - status - ); - } -} diff --git a/windows/nsis-plugins/src/driverlogic/ncicontext.h b/windows/nsis-plugins/src/driverlogic/ncicontext.h deleted file mode 100644 index 00dfa27f04..0000000000 --- a/windows/nsis-plugins/src/driverlogic/ncicontext.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include <windows.h> -#include <string> - -// -// Interface for nci.dll. -// - -class NciContext -{ - HMODULE dllHandle; - - using nciGetConnectionNameFunc = DWORD(__stdcall*)(const GUID*, wchar_t*, DWORD, DWORD*); - using nciSetConnectionNameFunc = DWORD(__stdcall*)(const GUID*, const wchar_t*); - - nciGetConnectionNameFunc m_nciGetConnectionName; - nciSetConnectionNameFunc m_nciSetConnectionName; - - NciContext(NciContext&) = delete; - NciContext& operator=(NciContext&) = delete; - -public: - - NciContext(); - ~NciContext(); - - NciContext(NciContext&&) = default; - NciContext& operator=(NciContext&&) = default; - - std::wstring getConnectionName(const GUID& guid); - void setConnectionName(const GUID& guid, const wchar_t* newName); -}; diff --git a/windows/shared/shared.sln b/windows/shared/shared.sln index d735b2d82d..d664af8399 100644 --- a/windows/shared/shared.sln +++ b/windows/shared/shared.sln @@ -3,6 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.29324.140 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shared", "src\shared\shared.vcxproj", "{EE69EA4A-CF71-4B88-866B-957F60C4CE0D}" + ProjectSection(ProjectDependencies) = postProject + {B52E2D10-A94A-4605-914A-2DCEF6A757EF} = {B52E2D10-A94A-4605-914A-2DCEF6A757EF} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcommon", "..\windows-libraries\src\libcommon\libcommon.vcxproj", "{B52E2D10-A94A-4605-914A-2DCEF6A757EF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -24,6 +29,14 @@ Global {EE69EA4A-CF71-4B88-866B-957F60C4CE0D}.Release|x86.ActiveCfg = Release|Win32 {EE69EA4A-CF71-4B88-866B-957F60C4CE0D}.Release|x86.Build.0 = Release|Win32 {EE69EA4A-CF71-4B88-866B-957F60C4CE0D}.Release|x86.Deploy.0 = Release|Win32 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Debug|x64.ActiveCfg = Debug|x64 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Debug|x64.Build.0 = Debug|x64 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Debug|x86.ActiveCfg = Debug|Win32 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Debug|x86.Build.0 = Debug|Win32 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x64.ActiveCfg = Release|x64 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x64.Build.0 = Release|x64 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x86.ActiveCfg = Release|Win32 + {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/windows/shared/src/shared/network/interfaceutils.cpp b/windows/shared/src/shared/network/interfaceutils.cpp new file mode 100644 index 0000000000..6d56ec82d2 --- /dev/null +++ b/windows/shared/src/shared/network/interfaceutils.cpp @@ -0,0 +1,177 @@ +#include "stdafx.h" +#include <sstream> +#include <algorithm> +#include "interfaceutils.h" +#include <libcommon/error.h> +#include <libcommon/string.h> + +namespace shared::network +{ + +InterfaceUtils::NetworkAdapter::NetworkAdapter( + const common::network::Nci &nci, + const std::shared_ptr<std::vector<uint8_t>> addressesBuffer, + const IP_ADAPTER_ADDRESSES &entry +) + : m_addressesBuffer(addressesBuffer) + , m_entry(entry) +{ + m_guid = common::string::ToWide(entry.AdapterName); + + try + { + // + // FIXME: + // Work around incorrect alias sometimes + // being returned on Windows 8. + // + // Steps to reproduce: + // 1. Install NDIS 6 TAP driver v9.00.00.21. + // 2. Update driver to v9.24.2.601. + // 3. Rename TAP adapter. + // + // GetAdaptersAddresses() returns a generic name + // for the *first* adapter instead of the correct + // one, whereas ConvertInterfaceAliasToLuid() and + // ConvertInterfaceLuidToAlias() yield correct values. + // + + IID guidObj = { 0 }; + if (S_OK != IIDFromString(&m_guid[0], &guidObj)) + { + throw std::runtime_error("IIDFromString() failed"); + } + + m_alias = nci.getConnectionName(guidObj); + } + catch (const std::exception &) + { + m_alias = entry.FriendlyName; + } + + m_name = entry.Description; +} + +//static +std::set<InterfaceUtils::NetworkAdapter> InterfaceUtils::GetAllAdapters(ULONG family, ULONG flags) +{ + ULONG bufferSize = 0; + + auto status = GetAdaptersAddresses(family, flags, nullptr, nullptr, &bufferSize); + + THROW_UNLESS(ERROR_BUFFER_OVERFLOW, status, "Probe for adapter listing buffer size"); + + // Memory is cheap, this avoids a looping construct. + bufferSize *= 2; + + auto buffer = std::make_shared<std::vector<uint8_t>>(bufferSize); + auto addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(&(*buffer)[0]); + + status = GetAdaptersAddresses(family, flags, nullptr, addresses, &bufferSize); + + THROW_UNLESS(ERROR_SUCCESS, status, "Retrieve adapter listing"); + + std::set<NetworkAdapter> adapters; + + common::network::Nci nci; + + for (auto it = addresses; nullptr != it; it = it->Next) + { + adapters.emplace(NetworkAdapter(nci, buffer, *it)); + } + + return adapters; +} + +//static +void InterfaceUtils::AddDeviceIpAddresses(NET_LUID device, const std::vector<SOCKADDR_INET> &addresses) +{ + for (const auto &address : addresses) + { + MIB_UNICASTIPADDRESS_ROW row; + InitializeUnicastIpAddressEntry(&row); + + row.InterfaceLuid = device; + row.Address = address; + + THROW_UNLESS(NO_ERROR, CreateUnicastIpAddressEntry(&row), "Assign IP address on network interface"); + } +} + +//static +std::set<InterfaceUtils::NetworkAdapter> +InterfaceUtils::GetTapAdapters(const std::set<NetworkAdapter>& adapters) +{ + std::set<NetworkAdapter> tapAdapters; + + for (const auto& adapter : adapters) + { + static const wchar_t name[] = L"TAP-Windows Adapter V9"; + + // + // Compare partial name, because once you start having more TAP adapters + // they're named "TAP-Windows Adapter V9 #2" and so on. + // + + if (0 == adapter.name().compare(0, _countof(name) - 1, name)) + { + tapAdapters.insert(adapter); + } + } + + return tapAdapters; +} + +//static +std::wstring InterfaceUtils::GetTapInterfaceAlias() +{ + // + // Look for TAP adapter with alias "Mullvad". + // + + using shared::network::InterfaceUtils; + + auto adapters = InterfaceUtils::GetTapAdapters(InterfaceUtils::GetAllAdapters( + AF_INET, + GAA_FLAG_SKIP_UNICAST | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST + )); + + auto findByAlias = [](const std::set<InterfaceUtils::NetworkAdapter>& adapters, const std::wstring& alias) + { + const auto it = std::find_if(adapters.begin(), adapters.end(), [&alias](const InterfaceUtils::NetworkAdapter& candidate) + { + return 0 == _wcsicmp(candidate.alias().c_str(), alias.c_str()); + }); + + return it != adapters.end(); + }; + + static const wchar_t baseAlias[] = L"Mullvad"; + + if (findByAlias(adapters, baseAlias)) + { + return baseAlias; + } + + // + // Look for TAP adapter with alias "Mullvad-1", "Mullvad-2", etc. + // + + for (auto i = 0; i < 10; ++i) + { + std::wstringstream ss; + + ss << baseAlias << L"-" << i; + + const auto alias = ss.str(); + + if (findByAlias(adapters, alias)) + { + return alias; + } + } + + throw std::runtime_error("Unable to find TAP adapter"); +} + +} diff --git a/windows/shared/src/shared/network/interfaceutils.h b/windows/shared/src/shared/network/interfaceutils.h new file mode 100644 index 0000000000..85a243d591 --- /dev/null +++ b/windows/shared/src/shared/network/interfaceutils.h @@ -0,0 +1,79 @@ +#pragma once + +#include <string> +#include <set> +#include <vector> +#include <memory> +#include <cstdint> + +// Secret include order to get most common networking structs/apis +// And avoiding compilation errors +#include <winsock2.h> +#include <windows.h> +#include <ws2def.h> +#include <ws2ipdef.h> +#include <iphlpapi.h> +#include <netioapi.h> +// end + +#include <libcommon/network/nci.h> + +namespace shared::network +{ + +class InterfaceUtils +{ + InterfaceUtils() = delete; + +public: + + class NetworkAdapter + { + + public: + + const std::wstring &guid() const { return m_guid; } + const std::wstring &name() const { return m_name; } + const std::wstring &alias() const { return m_alias; } + + bool operator<(const NetworkAdapter &rhs) const + { + return _wcsicmp(m_guid.c_str(), rhs.m_guid.c_str()) < 0; + } + + const IP_ADAPTER_ADDRESSES &raw() const + { + return m_entry; + } + + private: + + NetworkAdapter( + const common::network::Nci &nci, + const std::shared_ptr<std::vector<uint8_t>> addressesBuffer, + const IP_ADAPTER_ADDRESSES &entry + ); + + friend class InterfaceUtils; + + const IP_ADAPTER_ADDRESSES &m_entry; + std::shared_ptr<std::vector<uint8_t>> m_addressesBuffer; + + std::wstring m_guid; + std::wstring m_name; + std::wstring m_alias; + }; + + static std::set<NetworkAdapter> GetAllAdapters(ULONG family, ULONG flags); + + static void AddDeviceIpAddresses(NET_LUID device, const std::vector<SOCKADDR_INET> &addresses); + + static std::set<NetworkAdapter> GetTapAdapters(const std::set<NetworkAdapter> &adapters); + + // + // Determines alias of primary TAP adapter. + // + static std::wstring GetTapInterfaceAlias(); +}; + +} diff --git a/windows/shared/src/shared/shared.vcxproj b/windows/shared/src/shared/shared.vcxproj index 771aaa14bd..a5dc7cf4f2 100644 --- a/windows/shared/src/shared/shared.vcxproj +++ b/windows/shared/src/shared/shared.vcxproj @@ -178,10 +178,12 @@ <ItemGroup> <ClInclude Include="logsink.h" /> <ClInclude Include="ilogsink.h" /> + <ClInclude Include="network\interfaceutils.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> </ItemGroup> <ItemGroup> + <ClCompile Include="network\interfaceutils.cpp" /> <ClCompile Include="stdafx.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> diff --git a/windows/shared/src/shared/shared.vcxproj.filters b/windows/shared/src/shared/shared.vcxproj.filters index 00c566d6e6..61b48a6937 100644 --- a/windows/shared/src/shared/shared.vcxproj.filters +++ b/windows/shared/src/shared/shared.vcxproj.filters @@ -5,8 +5,19 @@ <ClInclude Include="logsink.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> + <ClInclude Include="network\interfaceutils.h"> + <Filter>network</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="stdafx.cpp" /> + <ClCompile Include="network\interfaceutils.cpp"> + <Filter>network</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <Filter Include="network"> + <UniqueIdentifier>{c36884fc-7afc-42a8-b852-c0aafcfcc1c2}</UniqueIdentifier> + </Filter> </ItemGroup> </Project>
\ No newline at end of file diff --git a/windows/shared/src/shared/stdafx.h b/windows/shared/src/shared/stdafx.h index fc6b905b83..59e4616a97 100644 --- a/windows/shared/src/shared/stdafx.h +++ b/windows/shared/src/shared/stdafx.h @@ -10,3 +10,6 @@ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> +#include <string> +#include <sstream> +#include <algorithm> diff --git a/windows/windns/src/windns/windns.cpp b/windows/windns/src/windns/windns.cpp index 1687586c7b..db3c9bf2b2 100644 --- a/windows/windns/src/windns/windns.cpp +++ b/windows/windns/src/windns/windns.cpp @@ -1,10 +1,11 @@ #include "stdafx.h" +#include <libcommon/guid.h> #include <libcommon/string.h> #include <libcommon/network/adapters.h> +#include <libcommon/network/ncicontext.h> #include "windns.h" #include "confineoperation.h" #include "netsh.h" -#include "ncicontext.h" #include "logsink.h" #include <memory> #include <vector> @@ -97,20 +98,13 @@ AdapterDnsAddresses GetAdapterDnsAddresses(const std::wstring &adapterAlias) const IP_ADAPTER_ADDRESSES *adapter; - NciContext nci; + common::network::NciContext nci; while (nullptr != (adapter = adapters.next())) { std::wstring name; - IID guidObj = { 0 }; - - auto guid = std::string(adapter->AdapterName); - auto wguid = std::wstring(guid.begin(), guid.end()); - - if (S_OK != IIDFromString(&wguid[0], &guidObj)) - { - throw std::runtime_error("IIDFromString() failed"); - } + const auto guidObj = + common::Guid::FromString(common::string::ToWide(adapter->AdapterName)); try { diff --git a/windows/windns/src/windns/windns.vcxproj b/windows/windns/src/windns/windns.vcxproj index 308cfb1aea..b2b68a999f 100644 --- a/windows/windns/src/windns/windns.vcxproj +++ b/windows/windns/src/windns/windns.vcxproj @@ -178,7 +178,6 @@ <ClInclude Include="confineoperation.h" /> <ClInclude Include="logsink.h" /> <ClInclude Include="ilogsink.h" /> - <ClInclude Include="ncicontext.h" /> <ClInclude Include="netsh.h" /> <ClInclude Include="stdafx.h" /> <ClInclude Include="targetver.h" /> @@ -188,7 +187,6 @@ <ClCompile Include="confineoperation.cpp" /> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="logsink.cpp" /> - <ClCompile Include="ncicontext.cpp" /> <ClCompile Include="netsh.cpp" /> <ClCompile Include="stdafx.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> diff --git a/windows/windns/src/windns/windns.vcxproj.filters b/windows/windns/src/windns/windns.vcxproj.filters index d551081fe0..e71bf3e814 100644 --- a/windows/windns/src/windns/windns.vcxproj.filters +++ b/windows/windns/src/windns/windns.vcxproj.filters @@ -8,7 +8,6 @@ <ClInclude Include="confineoperation.h" /> <ClInclude Include="ilogsink.h" /> <ClInclude Include="logsink.h" /> - <ClInclude Include="ncicontext.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="dllmain.cpp" /> @@ -17,7 +16,6 @@ <ClCompile Include="netsh.cpp" /> <ClCompile Include="confineoperation.cpp" /> <ClCompile Include="logsink.cpp" /> - <ClCompile Include="ncicontext.cpp" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="windns.rc" /> diff --git a/windows/winnet/src/winnet/interfaceutils.cpp b/windows/winnet/src/winnet/interfaceutils.cpp deleted file mode 100644 index e64fbb376e..0000000000 --- a/windows/winnet/src/winnet/interfaceutils.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include "stdafx.h" -#include "interfaceutils.h" -#include "ncicontext.h" -#include "libcommon/error.h" -#include "libcommon/string.h" -#include <cstdint> -#include <algorithm> - -//static -std::set<InterfaceUtils::NetworkAdapter> InterfaceUtils::GetAllAdapters() -{ - ULONG bufferSize = 0; - - const ULONG flags = GAA_FLAG_SKIP_UNICAST | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; - - auto status = GetAdaptersAddresses(AF_INET, flags, nullptr, nullptr, &bufferSize); - - THROW_UNLESS(ERROR_BUFFER_OVERFLOW, status, "Probe for adapter listing buffer size"); - - // Memory is cheap, this avoids a looping construct. - bufferSize *= 2; - - std::vector<uint8_t> buffer(bufferSize); - - status = GetAdaptersAddresses(AF_INET, flags, nullptr, - reinterpret_cast<PIP_ADAPTER_ADDRESSES>(&buffer[0]), &bufferSize); - - THROW_UNLESS(ERROR_SUCCESS, status, "Retrieve adapter listing"); - - std::set<NetworkAdapter> adapters; - - NciContext nci; - - for (auto it = (PIP_ADAPTER_ADDRESSES)&buffer[0]; nullptr != it; it = it->Next) - { - auto guid = std::string(it->AdapterName); - auto wguid = std::wstring(guid.begin(), guid.end()); - - IID guidObj = { 0 }; - if (S_OK != IIDFromString(&wguid[0], &guidObj)) - { - throw std::runtime_error("IIDFromString() failed"); - } - - try - { - std::wstring name = nci.getConnectionName(guidObj); - - adapters.emplace(NetworkAdapter(common::string::ToWide(it->AdapterName), - it->Description, /*it->FriendlyName*/ name)); - } - catch (...) - { - } - } - - return adapters; -} - -//static -std::set<InterfaceUtils::NetworkAdapter> -InterfaceUtils::GetTapAdapters(const std::set<InterfaceUtils::NetworkAdapter> &adapters) -{ - std::set<NetworkAdapter> tapAdapters; - - for (const auto &adapter : adapters) - { - static const wchar_t name[] = L"TAP-Windows Adapter V9"; - - // - // Compare partial name, because once you start having more TAP adapters - // they're named "TAP-Windows Adapter V9 #2" and so on. - // - - if (0 == adapter.name.compare(0, _countof(name) - 1, name)) - { - tapAdapters.insert(adapter); - } - } - - return tapAdapters; -} - -//static -std::wstring InterfaceUtils::GetTapInterfaceAlias() -{ - // - // Look for TAP adapter with alias "Mullvad". - // - - auto adapters = GetTapAdapters(GetAllAdapters()); - - 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 != adapters.end(); - }; - - static const wchar_t baseAlias[] = L"Mullvad"; - - if (findByAlias(adapters, baseAlias)) - { - return baseAlias; - } - - // - // Look for TAP adapter with alias "Mullvad-1", "Mullvad-2", etc. - // - - for (auto i = 0; i < 10; ++i) - { - std::wstringstream ss; - - ss << baseAlias << L"-" << i; - - const auto alias = ss.str(); - - if (findByAlias(adapters, alias)) - { - return alias; - } - } - - throw std::runtime_error("Unable to find TAP adapter"); -} - -//static -void InterfaceUtils::AddDeviceIpAddresses(NET_LUID device, const std::vector<SOCKADDR_INET> &addresses) -{ - for (const auto &address : addresses) - { - MIB_UNICASTIPADDRESS_ROW row; - InitializeUnicastIpAddressEntry(&row); - - row.InterfaceLuid = device; - row.Address = address; - - THROW_UNLESS(NO_ERROR, CreateUnicastIpAddressEntry(&row), "Assign IP address on network interface"); - } -} diff --git a/windows/winnet/src/winnet/interfaceutils.h b/windows/winnet/src/winnet/interfaceutils.h deleted file mode 100644 index 8ab1249a50..0000000000 --- a/windows/winnet/src/winnet/interfaceutils.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include <string> -#include <set> -#include <vector> - -// Secret include order to get most common networking structs/apis -// And avoiding compilation errors -#include <winsock2.h> -#include <windows.h> -#include <ws2def.h> -#include <ws2ipdef.h> -#include <iphlpapi.h> -#include <netioapi.h> -// end - -class InterfaceUtils -{ - InterfaceUtils() = delete; - -public: - - struct NetworkAdapter - { - std::wstring guid; - std::wstring name; - std::wstring alias; - - NetworkAdapter(std::wstring _guid, std::wstring _name, std::wstring _alias) - : guid(_guid) - , name(_name) - , alias(_alias) - { - } - - bool operator<(const NetworkAdapter &rhs) const - { - return _wcsicmp(guid.c_str(), rhs.guid.c_str()) < 0; - } - }; - - static std::set<NetworkAdapter> GetAllAdapters(); - static std::set<NetworkAdapter> GetTapAdapters(const std::set<NetworkAdapter> &adapters); - - // - // Determines alias of primary TAP adapter. - // - static std::wstring GetTapInterfaceAlias(); - - static void AddDeviceIpAddresses(NET_LUID device, const std::vector<SOCKADDR_INET> &addresses); -}; diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp index 690af747f2..c94970b863 100644 --- a/windows/winnet/src/winnet/winnet.cpp +++ b/windows/winnet/src/winnet/winnet.cpp @@ -1,10 +1,10 @@ #include "stdafx.h"
#include "winnet.h"
#include "NetworkInterfaces.h"
-#include "interfaceutils.h"
#include "offlinemonitor.h"
#include "routing/routemanager.h"
#include <shared/logsinkadapter.h>
+#include <shared/network/interfaceutils.h>
#include <libcommon/error.h>
#include <libcommon/network.h>
#include <cstdint>
@@ -14,7 +14,9 @@ #include <mutex>
using namespace winnet::routing;
+using namespace common::network;
using AutoLockType = std::scoped_lock<std::mutex>;
+using namespace shared::network;
namespace
{
diff --git a/windows/winnet/src/winnet/winnet.vcxproj b/windows/winnet/src/winnet/winnet.vcxproj index 5943ca53c8..5fb0a50ec5 100644 --- a/windows/winnet/src/winnet/winnet.vcxproj +++ b/windows/winnet/src/winnet/winnet.vcxproj @@ -27,11 +27,9 @@ </ProjectConfiguration> </ItemGroup> <ItemGroup> - <ClCompile Include="ncicontext.cpp" /> <ClCompile Include="networkadaptermonitor.cpp" /> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="InterfacePair.cpp" /> - <ClCompile Include="interfaceutils.cpp" /> <ClCompile Include="offlinemonitor.cpp" /> <ClCompile Include="NetworkInterfaces.cpp" /> <ClCompile Include="routing\defaultroutemonitor.cpp" /> @@ -42,10 +40,8 @@ <ClCompile Include="winnet.cpp" /> </ItemGroup> <ItemGroup> - <ClInclude Include="ncicontext.h" /> <ClInclude Include="networkadaptermonitor.h" /> <ClInclude Include="InterfacePair.h" /> - <ClInclude Include="interfaceutils.h" /> <ClInclude Include="offlinemonitor.h" /> <ClInclude Include="NetworkInterfaces.h" /> <ClInclude Include="routing\defaultroutemonitor.h" /> @@ -181,7 +177,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'"> @@ -205,7 +201,7 @@ </Link> <Lib> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-Debug</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib</AdditionalDependencies> </Lib> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> @@ -223,7 +219,7 @@ <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> </Link> @@ -248,7 +244,7 @@ <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> </Link> <Lib> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib</AdditionalDependencies> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-Debug</AdditionalLibraryDirectories> </Lib> </ItemDefinitionGroup> @@ -273,7 +269,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -297,7 +293,7 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <ModuleDefinitionFile>winnet.def</ModuleDefinitionFile> <AdditionalLibraryDirectories>$(SolutionDir)/bin/$(Platform)-$(Configuration)</AdditionalLibraryDirectories> - <AdditionalDependencies>libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>shared.lib;libcommon.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/windows/winnet/src/winnet/winnet.vcxproj.filters b/windows/winnet/src/winnet/winnet.vcxproj.filters index dfe6d29ec7..db5a7c8b3a 100644 --- a/windows/winnet/src/winnet/winnet.vcxproj.filters +++ b/windows/winnet/src/winnet/winnet.vcxproj.filters @@ -6,7 +6,6 @@ <ClCompile Include="winnet.cpp" /> <ClCompile Include="NetworkInterfaces.cpp" /> <ClCompile Include="InterfacePair.cpp" /> - <ClCompile Include="interfaceutils.cpp" /> <ClCompile Include="networkadaptermonitor.cpp" /> <ClCompile Include="offlinemonitor.cpp" /> <ClCompile Include="routing\types.cpp"> @@ -28,7 +27,6 @@ <ClInclude Include="winnet.h" /> <ClInclude Include="NetworkInterfaces.h" /> <ClInclude Include="InterfacePair.h" /> - <ClInclude Include="interfaceutils.h" /> <ClInclude Include="networkadaptermonitor.h" /> <ClInclude Include="offlinemonitor.h" /> <ClInclude Include="routing\types.h"> |
