diff options
| author | Odd Stranne <odd@mullvad.net> | 2020-02-01 15:21:00 +0100 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2020-02-03 13:42:46 +0100 |
| commit | 746e0ddf05a53911fddc4ae2fc8dfb67600ede8e (patch) | |
| tree | 170517b7a8c8e058bfaf664237f3a93aed522fa1 /windows | |
| parent | b0c0b86acd7b147a1dfcbee71e4d00dcb22ea711 (diff) | |
| download | mullvadvpn-746e0ddf05a53911fddc4ae2fc8dfb67600ede8e.tar.xz mullvadvpn-746e0ddf05a53911fddc4ae2fc8dfb67600ede8e.zip | |
Rearrange code and public structs
Diffstat (limited to 'windows')
| -rw-r--r-- | windows/winnet/src/winnet/converters.cpp | 118 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/converters.h | 16 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.cpp | 157 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.h | 23 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.vcxproj | 2 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/winnet.vcxproj.filters | 2 |
6 files changed, 153 insertions, 165 deletions
diff --git a/windows/winnet/src/winnet/converters.cpp b/windows/winnet/src/winnet/converters.cpp new file mode 100644 index 0000000000..3584f8e34f --- /dev/null +++ b/windows/winnet/src/winnet/converters.cpp @@ -0,0 +1,118 @@ +#include <stdafx.h> +#include "converters.h" +#include <libcommon/error.h> +#include <cstdint> + +using namespace winnet::routing; + +namespace +{ + +SOCKADDR_INET IpToNative(const WINNET_IP &from) +{ + SOCKADDR_INET to = { 0 }; + + switch (from.family) + { + case WINNET_ADDR_FAMILY_IPV4: + { + to.Ipv4.sin_family = AF_INET; + to.Ipv4.sin_addr.s_addr = *reinterpret_cast<const uint32_t*>(from.bytes); + + break; + } + case WINNET_ADDR_FAMILY_IPV6: + { + to.Ipv6.sin6_family = AF_INET6; + memcpy(to.Ipv6.sin6_addr.u.Byte, from.bytes, 16); + + break; + } + default: + { + THROW_ERROR("Invalid network address family"); + } + } + + return to; +} + +} // anonymous namespace + +namespace winnet +{ + +Network ConvertNetwork(const WINNET_IP_NETWORK &in) +{ + // + // Convert WINNET_IPNETWORK into Network aka IP_ADDRESS_PREFIX + // + + Network out = { 0 }; + + out.PrefixLength = in.prefix; + out.Prefix = IpToNative(in.addr); + + return out; +} + +std::optional<Node> ConvertNode(const WINNET_NODE *in) +{ + if (nullptr == in) + { + return std::nullopt; + } + + if (nullptr == in->deviceName && nullptr == in->gateway) + { + THROW_ERROR("Invalid 'WINNET_NODE' definition"); + } + + std::optional<std::wstring> deviceName; + std::optional<NodeAddress> gateway; + + if (nullptr != in->deviceName) + { + deviceName = in->deviceName; + } + + if (nullptr != in->gateway) + { + gateway = IpToNative(*in->gateway); + } + + return Node(deviceName, gateway); +} + +std::vector<Route> ConvertRoutes(const WINNET_ROUTE *routes, uint32_t numRoutes) +{ + std::vector<Route> out; + + out.reserve(numRoutes); + + for (size_t i = 0; i < numRoutes; ++i) + { + out.emplace_back(Route + { + ConvertNetwork(routes[i].network), + ConvertNode(routes[i].node) + }); + } + + return out; +} + +std::vector<SOCKADDR_INET> ConvertAddresses(const WINNET_IP *addresses, uint32_t numAddresses) +{ + std::vector<SOCKADDR_INET> out; + out.reserve(numAddresses); + + for (uint32_t i = 0; i < numAddresses; ++i) + { + out.emplace_back(IpToNative(addresses[i])); + } + + return out; +} + +} diff --git a/windows/winnet/src/winnet/converters.h b/windows/winnet/src/winnet/converters.h new file mode 100644 index 0000000000..8a1c59e4da --- /dev/null +++ b/windows/winnet/src/winnet/converters.h @@ -0,0 +1,16 @@ +#pragma once + +#include "winnet.h" +#include "routing/types.h" +#include <optional> +#include <vector> + +namespace winnet +{ + +routing::Network ConvertNetwork(const WINNET_IP_NETWORK &in); +std::optional<routing::Node> ConvertNode(const WINNET_NODE *in); +std::vector<routing::Route> ConvertRoutes(const WINNET_ROUTE *routes, uint32_t numRoutes); +std::vector<SOCKADDR_INET> ConvertAddresses(const WINNET_IP *addresses, uint32_t numAddresses); + +} diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp index 5dafc790e8..59a08b826c 100644 --- a/windows/winnet/src/winnet/winnet.cpp +++ b/windows/winnet/src/winnet/winnet.cpp @@ -3,6 +3,7 @@ #include "NetworkInterfaces.h"
#include "offlinemonitor.h"
#include "routing/routemanager.h"
+#include "converters.h"
#include <libshared/logging/logsinkadapter.h>
#include <libshared/logging/unwind.h>
#include <libshared/network/interfaceutils.h>
@@ -28,156 +29,6 @@ std::mutex g_RouteManagerLock; RouteManager *g_RouteManager = nullptr;
std::shared_ptr<shared::logging::LogSinkAdapter> g_RouteManagerLogSink;
-Network ConvertNetwork(const WINNET_IPNETWORK &in)
-{
- //
- // Convert WINNET_IPNETWORK into Network aka IP_ADDRESS_PREFIX
- //
-
- Network out{ 0 };
-
- out.PrefixLength = in.prefix;
-
- switch (in.type)
- {
- case WINNET_IP_TYPE_IPV4:
- {
- out.Prefix.si_family = AF_INET;
- out.Prefix.Ipv4.sin_family = AF_INET;
- out.Prefix.Ipv4.sin_addr.s_addr = *reinterpret_cast<const uint32_t *>(in.bytes);
-
- break;
- }
- case WINNET_IP_TYPE_IPV6:
- {
- out.Prefix.si_family = AF_INET6;
- out.Prefix.Ipv6.sin6_family = AF_INET6;
- memcpy(out.Prefix.Ipv6.sin6_addr.u.Byte, in.bytes, 16);
-
- break;
- }
- default:
- {
- THROW_ERROR("Missing case handler in switch clause");
- }
- }
-
- return out;
-}
-
-std::optional<Node> ConvertNode(const WINNET_NODE *in)
-{
- if (nullptr == in)
- {
- return {};
- }
-
- if (nullptr == in->deviceName && nullptr == in->gateway)
- {
- THROW_ERROR("Invalid 'WINNET_NODE' definition");
- }
-
- std::optional<std::wstring> deviceName;
- std::optional<NodeAddress> gateway;
-
- if (nullptr != in->deviceName)
- {
- deviceName = in->deviceName;
- }
-
- if (nullptr != in->gateway)
- {
- NodeAddress gw { 0 };
-
- switch (in->gateway->type)
- {
- case WINNET_IP_TYPE_IPV4:
- {
- gw.si_family = AF_INET;
- gw.Ipv4.sin_addr.s_addr = *reinterpret_cast<const uint32_t *>(in->gateway->bytes);
-
- break;
- }
- case WINNET_IP_TYPE_IPV6:
- {
- gw.si_family = AF_INET6;
- memcpy(&gw.Ipv6.sin6_addr.u.Byte, in->gateway->bytes, 16);
-
- break;
- }
- default:
- {
- THROW_ERROR("Invalid gateway type specifier in 'WINNET_NODE' definition");
- }
- }
-
- gateway = gw;
- }
-
- return Node(deviceName, gateway);
-}
-
-std::vector<Route> ConvertRoutes(const WINNET_ROUTE *routes, uint32_t numRoutes)
-{
- std::vector<Route> out;
-
- out.reserve(numRoutes);
-
- for (size_t i = 0; i < numRoutes; ++i)
- {
- out.emplace_back(Route
- {
- ConvertNetwork(routes[i].network),
- ConvertNode(routes[i].node)
- });
- }
-
- return out;
-}
-
-std::vector<SOCKADDR_INET> ConvertAddresses(const WINNET_IP *addresses, uint32_t numAddresses)
-{
- //
- // This duplicates the same logic we have above.
- // TODO: Fix when time permits.
- //
-
- std::vector<SOCKADDR_INET> out;
- out.reserve(numAddresses);
-
- for (uint32_t i = 0; i < numAddresses; ++i)
- {
- const WINNET_IP &from = addresses[i];
- SOCKADDR_INET to{ 0 };
-
- switch (from.type)
- {
- case WINNET_IP_TYPE_IPV4:
- {
- to.si_family = AF_INET;
- to.Ipv4.sin_addr.s_addr = *reinterpret_cast<const uint32_t *>(from.bytes);
-
- break;
- }
- case WINNET_IP_TYPE_IPV6:
- {
- to.si_family = AF_INET6;
- memcpy(&to.Ipv6.sin6_addr.u.Byte, from.bytes, 16);
-
- break;
- }
- default:
- {
- THROW_ERROR("Invalid address family in 'WINNET_IP' definition");
- }
- }
-
- out.push_back(to);
- }
-
- return out;
-}
-
} //anonymous namespace
extern "C"
@@ -406,7 +257,7 @@ WinNet_AddRoutes( try
{
- g_RouteManager->addRoutes(ConvertRoutes(routes, numRoutes));
+ g_RouteManager->addRoutes(winnet::ConvertRoutes(routes, numRoutes));
return true;
}
catch (const std::exception &err)
@@ -449,7 +300,7 @@ WinNet_DeleteRoutes( try
{
- g_RouteManager->deleteRoutes(ConvertRoutes(routes, numRoutes));
+ g_RouteManager->deleteRoutes(winnet::ConvertRoutes(routes, numRoutes));
return true;
}
catch (const std::exception &err)
@@ -628,7 +479,7 @@ WinNet_AddDeviceIpAddresses( THROW_ERROR(msg.c_str());
}
- InterfaceUtils::AddDeviceIpAddresses(luid, ConvertAddresses(addresses, numAddresses));
+ InterfaceUtils::AddDeviceIpAddresses(luid, winnet::ConvertAddresses(addresses, numAddresses));
return true;
}
diff --git a/windows/winnet/src/winnet/winnet.h b/windows/winnet/src/winnet/winnet.h index 40ccf9f421..29efd4fd12 100644 --- a/windows/winnet/src/winnet/winnet.h +++ b/windows/winnet/src/winnet/winnet.h @@ -91,26 +91,25 @@ WINNET_API WinNet_DeactivateConnectivityMonitor( ); -enum WINNET_IP_TYPE +enum WINNET_ADDR_FAMILY { - WINNET_IP_TYPE_IPV4 = 0, - WINNET_IP_TYPE_IPV6 = 1, + WINNET_ADDR_FAMILY_IPV4 = 0, + WINNET_ADDR_FAMILY_IPV6 = 1, }; -typedef struct tag_WINNET_IPNETWORK +typedef struct tag_WINNET_IP { - WINNET_IP_TYPE type; + WINNET_ADDR_FAMILY family; uint8_t bytes[16]; // Network byte order. - uint8_t prefix; } -WINNET_IPNETWORK; +WINNET_IP; -typedef struct tag_WINNET_IP +typedef struct tag_WINNET_IP_NETWORK { - WINNET_IP_TYPE type; - uint8_t bytes[16]; // Network byte order. + uint8_t prefix; + WINNET_IP addr; } -WINNET_IP; +WINNET_IP_NETWORK; typedef struct tag_WINNET_NODE { @@ -121,7 +120,7 @@ WINNET_NODE; typedef struct tag_WINNET_ROUTE { - WINNET_IPNETWORK network; + WINNET_IP_NETWORK network; const WINNET_NODE *node; } WINNET_ROUTE; diff --git a/windows/winnet/src/winnet/winnet.vcxproj b/windows/winnet/src/winnet/winnet.vcxproj index c21f75b2c1..7b4578d4b1 100644 --- a/windows/winnet/src/winnet/winnet.vcxproj +++ b/windows/winnet/src/winnet/winnet.vcxproj @@ -27,6 +27,7 @@ </ProjectConfiguration> </ItemGroup> <ItemGroup> + <ClCompile Include="converters.cpp" /> <ClCompile Include="networkadaptermonitor.cpp" /> <ClCompile Include="dllmain.cpp" /> <ClCompile Include="InterfacePair.cpp" /> @@ -40,6 +41,7 @@ <ClCompile Include="winnet.cpp" /> </ItemGroup> <ItemGroup> + <ClInclude Include="converters.h" /> <ClInclude Include="networkadaptermonitor.h" /> <ClInclude Include="InterfacePair.h" /> <ClInclude Include="offlinemonitor.h" /> diff --git a/windows/winnet/src/winnet/winnet.vcxproj.filters b/windows/winnet/src/winnet/winnet.vcxproj.filters index db5a7c8b3a..2d5a039c6b 100644 --- a/windows/winnet/src/winnet/winnet.vcxproj.filters +++ b/windows/winnet/src/winnet/winnet.vcxproj.filters @@ -20,6 +20,7 @@ <ClCompile Include="routing\routemanager.cpp"> <Filter>routing</Filter> </ClCompile> + <ClCompile Include="converters.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="stdafx.h" /> @@ -41,6 +42,7 @@ <ClInclude Include="routing\routemanager.h"> <Filter>routing</Filter> </ClInclude> + <ClInclude Include="converters.h" /> </ItemGroup> <ItemGroup> <None Include="winnet.def" /> |
