summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-03-16 10:58:36 +0100
committerDavid Lönnhager <david.l@mullvad.net>2022-03-18 10:27:41 +0100
commit38bcad1ba806f26f307a9f5ea91d53f4f83d994f (patch)
treefbca01f21218def723c19856bae396b2ed6f6865
parent302bf767db78b7cb1e76ea64414e33daa52e809f (diff)
downloadmullvadvpn-38bcad1ba806f26f307a9f5ea91d53f4f83d994f.tar.xz
mullvadvpn-38bcad1ba806f26f307a9f5ea91d53f4f83d994f.zip
Filter out most irrelevant interface events
-rw-r--r--windows/winnet/src/winnet/routing/defaultroutemonitor.cpp58
-rw-r--r--windows/winnet/src/winnet/routing/defaultroutemonitor.h3
2 files changed, 54 insertions, 7 deletions
diff --git a/windows/winnet/src/winnet/routing/defaultroutemonitor.cpp b/windows/winnet/src/winnet/routing/defaultroutemonitor.cpp
index 56521ec9d8..cd0f7304e2 100644
--- a/windows/winnet/src/winnet/routing/defaultroutemonitor.cpp
+++ b/windows/winnet/src/winnet/routing/defaultroutemonitor.cpp
@@ -23,6 +23,7 @@ DefaultRouteMonitor::DefaultRouteMonitor
: m_family(family)
, m_callback(callback)
, m_logSink(logSink)
+ , m_refreshCurrentRoute(false)
, m_evaluateRoutesGuard(std::make_unique<common::BurstGuard>(
std::bind(&DefaultRouteMonitor::evaluateRoutes, this),
POINT_TWO_SECOND_BURST,
@@ -102,29 +103,62 @@ void NETIOAPI_API_ DefaultRouteMonitor::RouteChangeCallback
return;
}
- reinterpret_cast<DefaultRouteMonitor *>(context)->m_evaluateRoutesGuard->trigger();
+ const auto monitor = reinterpret_cast<DefaultRouteMonitor*>(context);
+ monitor->updateRefreshFlag(row->InterfaceLuid, row->InterfaceIndex);
+ monitor->m_evaluateRoutesGuard->trigger();
}
//static
void NETIOAPI_API_ DefaultRouteMonitor::InterfaceChangeCallback
(
void *context,
- MIB_IPINTERFACE_ROW *,
+ MIB_IPINTERFACE_ROW *row,
MIB_NOTIFICATION_TYPE
)
{
- reinterpret_cast<DefaultRouteMonitor *>(context)->m_evaluateRoutesGuard->trigger();
+ const auto monitor = reinterpret_cast<DefaultRouteMonitor*>(context);
+ monitor->updateRefreshFlag(row->InterfaceLuid, row->InterfaceIndex);
+ monitor->m_evaluateRoutesGuard->trigger();
}
//static
void NETIOAPI_API_ DefaultRouteMonitor::AddressChangeCallback
(
- void* context,
- MIB_UNICASTIPADDRESS_ROW*,
+ void *context,
+ MIB_UNICASTIPADDRESS_ROW *row,
MIB_NOTIFICATION_TYPE
)
{
- reinterpret_cast<DefaultRouteMonitor*>(context)->m_evaluateRoutesGuard->trigger();
+ const auto monitor = reinterpret_cast<DefaultRouteMonitor*>(context);
+ monitor->updateRefreshFlag(row->InterfaceLuid, row->InterfaceIndex);
+ monitor->m_evaluateRoutesGuard->trigger();
+}
+
+void DefaultRouteMonitor::updateRefreshFlag(const NET_LUID &luid, const NET_IFINDEX &index)
+{
+ std::scoped_lock<std::mutex> lock(m_evaluationLock);
+
+ if (!m_bestRoute.has_value())
+ {
+ return;
+ }
+
+ if (luid.Value == m_bestRoute->iface.Value)
+ {
+ m_refreshCurrentRoute = true;
+ return;
+ }
+
+ if (luid.Value != 0)
+ {
+ return;
+ }
+
+ NET_IFINDEX defaultInterfaceIndex = 0;
+ const auto routeLuid = &m_bestRoute->iface;
+ ConvertInterfaceLuidToIndex(routeLuid, &defaultInterfaceIndex);
+ m_refreshCurrentRoute = index == defaultInterfaceIndex ||
+ (defaultInterfaceIndex == NET_IFINDEX_UNSPECIFIED);
}
void DefaultRouteMonitor::evaluateRoutes()
@@ -150,6 +184,9 @@ void DefaultRouteMonitor::evaluateRoutesInner()
{
std::optional<InterfaceAndGateway> currentBestRoute;
+ bool refreshCurrent = m_refreshCurrentRoute;
+ m_refreshCurrentRoute = false;
+
try
{
currentBestRoute = GetBestDefaultRoute(m_family);
@@ -194,8 +231,15 @@ void DefaultRouteMonitor::evaluateRoutesInner()
{
m_bestRoute = currentBestRoute;
m_callback(EventType::Updated, m_bestRoute);
+
+ return;
}
- else
+
+ //
+ // Interface details may have changed.
+ //
+
+ if (refreshCurrent)
{
m_callback(EventType::UpdatedDetails, m_bestRoute);
}
diff --git a/windows/winnet/src/winnet/routing/defaultroutemonitor.h b/windows/winnet/src/winnet/routing/defaultroutemonitor.h
index 24be69a835..ce2a3ce3f6 100644
--- a/windows/winnet/src/winnet/routing/defaultroutemonitor.h
+++ b/windows/winnet/src/winnet/routing/defaultroutemonitor.h
@@ -57,6 +57,7 @@ private:
std::unique_ptr<common::BurstGuard> m_evaluateRoutesGuard;
std::optional<InterfaceAndGateway> m_bestRoute;
+ bool m_refreshCurrentRoute;
HANDLE m_routeNotificationHandle;
HANDLE m_interfaceNotificationHandle;
@@ -68,6 +69,8 @@ private:
static void NETIOAPI_API_ InterfaceChangeCallback(void *context, MIB_IPINTERFACE_ROW *row, MIB_NOTIFICATION_TYPE notificationType);
static void NETIOAPI_API_ AddressChangeCallback(void *context, MIB_UNICASTIPADDRESS_ROW *row, MIB_NOTIFICATION_TYPE notificationType);
+ void updateRefreshFlag(const NET_LUID &luid, const NET_IFINDEX &index);
+
void evaluateRoutes();
void evaluateRoutesInner();
};