summaryrefslogtreecommitdiffhomepage
path: root/windows
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2020-02-01 15:21:00 +0100
committerOdd Stranne <odd@mullvad.net>2020-02-03 13:42:46 +0100
commit746e0ddf05a53911fddc4ae2fc8dfb67600ede8e (patch)
tree170517b7a8c8e058bfaf664237f3a93aed522fa1 /windows
parentb0c0b86acd7b147a1dfcbee71e4d00dcb22ea711 (diff)
downloadmullvadvpn-746e0ddf05a53911fddc4ae2fc8dfb67600ede8e.tar.xz
mullvadvpn-746e0ddf05a53911fddc4ae2fc8dfb67600ede8e.zip
Rearrange code and public structs
Diffstat (limited to 'windows')
-rw-r--r--windows/winnet/src/winnet/converters.cpp118
-rw-r--r--windows/winnet/src/winnet/converters.h16
-rw-r--r--windows/winnet/src/winnet/winnet.cpp157
-rw-r--r--windows/winnet/src/winnet/winnet.h23
-rw-r--r--windows/winnet/src/winnet/winnet.vcxproj2
-rw-r--r--windows/winnet/src/winnet/winnet.vcxproj.filters2
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" />