From 13c565597640f4529077cac40c361f66709275d8 Mon Sep 17 00:00:00 2001 From: Ian Monroe Date: Thu, 12 Mar 2026 23:09:13 +0000 Subject: [PATCH] feat: support link-local connections in Preferences dialog most link-local IPs are just noise, but if an entire interface is link-local only, maybe someone is hooking up their computers directly by ethernet cable Still filter virtual interfacts with only local link --- src/lib/gui/core/NetworkMonitor.cpp | 11 ++++++++++- src/lib/gui/core/NetworkMonitor.h | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib/gui/core/NetworkMonitor.cpp b/src/lib/gui/core/NetworkMonitor.cpp index b58ca45fb..6c6165046 100644 --- a/src/lib/gui/core/NetworkMonitor.cpp +++ b/src/lib/gui/core/NetworkMonitor.cpp @@ -71,11 +71,16 @@ QStringList NetworkMonitor::validAddresses() const bool isVirtualType = interface.type() == QNetworkInterface::Virtual; const bool isVirtual = isVirtualInterface(interface.humanReadableName()) || isP2P || isVirtualType; const auto addressEntries = interface.addressEntries(); + // link-local is only worth offering when it's a physical interface's only address, e.g. a direct ethernet cable + const bool hasNonLinkLocal = std::ranges::any_of(addressEntries, [](const QNetworkAddressEntry &entry) { + return !entry.ip().isLoopback() && !entry.ip().isLinkLocal(); + }); + const bool skipLinkLocal = isVirtual || hasNonLinkLocal; for (const auto &entry : addressEntries) { const QHostAddress address = entry.ip(); - if (address.isLinkLocal() || address.isLoopback() || uniqueAddresses.contains(address)) { + if (address.isLoopback() || (skipLinkLocal && address.isLinkLocal()) || uniqueAddresses.contains(address)) { continue; } @@ -98,6 +103,8 @@ QStringList NetworkMonitor::validAddresses() std::ranges::sort(physicalIP4, [](const QHostAddress &a, const QHostAddress &b) { if (a.isPrivateUse() != b.isPrivateUse()) return a.isPrivateUse(); + if (a.isLinkLocal() != b.isLinkLocal()) + return a.isLinkLocal(); return a.toIPv4Address() < b.toIPv4Address(); }); @@ -108,6 +115,8 @@ QStringList NetworkMonitor::validAddresses() std::ranges::sort(physicalIP6, [](const QHostAddress &a, const QHostAddress &b) { if (a.isPrivateUse() != b.isPrivateUse()) return a.isPrivateUse(); + if (a.isLinkLocal() != b.isLinkLocal()) + return a.isLinkLocal(); return a.toString() < b.toString(); }); diff --git a/src/lib/gui/core/NetworkMonitor.h b/src/lib/gui/core/NetworkMonitor.h index f687fb713..a57efea85 100644 --- a/src/lib/gui/core/NetworkMonitor.h +++ b/src/lib/gui/core/NetworkMonitor.h @@ -47,7 +47,7 @@ public: void stopMonitoring(); /** - * @brief Get list of all available IP addresses (excluding local and link-local addresses) + * @brief Get list of all available IP addresses (excluding loopback addresses) * @return IP address list */ static QStringList validAddresses();