diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-03-16 10:58:36 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-03-18 10:27:41 +0100 |
| commit | 38bcad1ba806f26f307a9f5ea91d53f4f83d994f (patch) | |
| tree | fbca01f21218def723c19856bae396b2ed6f6865 | |
| parent | 302bf767db78b7cb1e76ea64414e33daa52e809f (diff) | |
| download | mullvadvpn-38bcad1ba806f26f307a9f5ea91d53f4f83d994f.tar.xz mullvadvpn-38bcad1ba806f26f307a9f5ea91d53f4f83d994f.zip | |
Filter out most irrelevant interface events
| -rw-r--r-- | windows/winnet/src/winnet/routing/defaultroutemonitor.cpp | 58 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/routing/defaultroutemonitor.h | 3 |
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(); }; |
