summaryrefslogtreecommitdiffhomepage
path: root/windows
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-05-07 16:19:56 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-05-13 17:56:36 +0200
commit99259312fa3aef722a01bfefe45778f6d9c11b24 (patch)
tree173116f7672878bd77087f501f7187d8083536f2 /windows
parentd2b88b052ee1300250fcba9ba30b9c21c51dd20c (diff)
downloadmullvadvpn-99259312fa3aef722a01bfefe45778f6d9c11b24.tar.xz
mullvadvpn-99259312fa3aef722a01bfefe45778f6d9c11b24.zip
Update route manager on Windows
Diffstat (limited to 'windows')
-rw-r--r--windows/winnet/src/winnet/routing/routemanager.cpp49
-rw-r--r--windows/winnet/src/winnet/routing/routemanager.h1
-rw-r--r--windows/winnet/src/winnet/winnet.cpp29
-rw-r--r--windows/winnet/src/winnet/winnet.h7
4 files changed, 65 insertions, 21 deletions
diff --git a/windows/winnet/src/winnet/routing/routemanager.cpp b/windows/winnet/src/winnet/routing/routemanager.cpp
index 81ee4e3d96..9d5b36ff98 100644
--- a/windows/winnet/src/winnet/routing/routemanager.cpp
+++ b/windows/winnet/src/winnet/routing/routemanager.cpp
@@ -209,27 +209,7 @@ RouteManager::~RouteManager()
m_routeMonitorV4.reset();
m_routeMonitorV6.reset();
- //
- // Delete all routes owned by us.
- //
-
- for (const auto &record : m_routes)
- {
- try
- {
- deleteFromRoutingTable(record.registeredRoute);
- }
- catch (const std::exception &ex)
- {
- std::wstringstream ss;
-
- ss << L"Failed to delete route as part of cleaning up, Route: "
- << FormatRegisteredRoute(record.registeredRoute);
-
- m_logSink->error(common::string::ToAnsi(ss.str()).c_str());
- m_logSink->error(ex.what());
- }
- }
+ deleteAppliedRoutes();
}
void RouteManager::addRoutes(const std::vector<Route> &routes)
@@ -302,6 +282,33 @@ void RouteManager::deleteRoutes(const std::vector<Route> &routes)
}
}
+void RouteManager::deleteAppliedRoutes()
+{
+ //
+ // Delete all routes owned by us.
+ //
+
+ for (const auto &record : m_routes)
+ {
+ try
+ {
+ deleteFromRoutingTable(record.registeredRoute);
+ }
+ catch (const std::exception & ex)
+ {
+ std::wstringstream ss;
+
+ ss << L"Failed to delete route while clearing applied routes, Route: "
+ << FormatRegisteredRoute(record.registeredRoute);
+
+ m_logSink->error(common::string::ToAnsi(ss.str()).c_str());
+ m_logSink->error(ex.what());
+ }
+ }
+
+ m_routes.clear();
+}
+
RouteManager::CallbackHandle RouteManager::registerDefaultRouteChangedCallback(DefaultRouteChangedCallback callback)
{
AutoRecursiveLockType lock(m_defaultRouteCallbacksLock);
diff --git a/windows/winnet/src/winnet/routing/routemanager.h b/windows/winnet/src/winnet/routing/routemanager.h
index 92c712e25d..07cc7dbf40 100644
--- a/windows/winnet/src/winnet/routing/routemanager.h
+++ b/windows/winnet/src/winnet/routing/routemanager.h
@@ -32,6 +32,7 @@ public:
void addRoutes(const std::vector<Route> &routes);
void deleteRoutes(const std::vector<Route> &routes);
+ void deleteAppliedRoutes();
using DefaultRouteChangedEventType = DefaultRouteMonitor::EventType;
diff --git a/windows/winnet/src/winnet/winnet.cpp b/windows/winnet/src/winnet/winnet.cpp
index ac56e94ff6..c52fc57d60 100644
--- a/windows/winnet/src/winnet/winnet.cpp
+++ b/windows/winnet/src/winnet/winnet.cpp
@@ -385,6 +385,35 @@ extern "C"
WINNET_LINKAGE
bool
WINNET_API
+WinNet_DeleteAppliedRoutes()
+{
+ AutoLockType lock(g_RouteManagerLock);
+
+ if (nullptr == g_RouteManager)
+ {
+ return false;
+ }
+
+ try
+ {
+ g_RouteManager->deleteAppliedRoutes();
+ return true;
+ }
+ catch (const std::exception & err)
+ {
+ common::error::UnwindException(err, g_RouteManagerLogSink);
+ return false;
+ }
+ catch (...)
+ {
+ return false;
+ }
+}
+
+extern "C"
+WINNET_LINKAGE
+bool
+WINNET_API
WinNet_DeleteRoute(
const WINNET_ROUTE *route
)
diff --git a/windows/winnet/src/winnet/winnet.h b/windows/winnet/src/winnet/winnet.h
index 98b0083f03..3597b01a26 100644
--- a/windows/winnet/src/winnet/winnet.h
+++ b/windows/winnet/src/winnet/winnet.h
@@ -173,6 +173,13 @@ WinNet_DeleteRoute(
const WINNET_ROUTE *route
);
+extern "C"
+WINNET_LINKAGE
+bool
+WINNET_API
+WinNet_DeleteAppliedRoutes(
+);
+
enum WINNET_DEFAULT_ROUTE_CHANGED_EVENT_TYPE
{
// Best default route changed.