From dffbef0dc9f999bf5d03a675b4b868fd980f5f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Wed, 28 Aug 2024 15:18:41 +0200 Subject: [PATCH] SMA: Fix circular disovery on multiple interfaces in the same network MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Simon Stürz --- sma/speedwire/speedwireinterface.cpp | 31 ++++++++++++++++++++++++++++ sma/speedwire/speedwireinterface.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/sma/speedwire/speedwireinterface.cpp b/sma/speedwire/speedwireinterface.cpp index 08ae14e..c4356f8 100644 --- a/sma/speedwire/speedwireinterface.cpp +++ b/sma/speedwire/speedwireinterface.cpp @@ -72,6 +72,10 @@ SpeedwireInterface::SpeedwireInterface(quint32 sourceSerialNumber, QObject *pare datagram.resize(m_multicast->pendingDatagramSize()); m_multicast->readDatagram(datagram.data(), datagram.size(), &senderAddress, &senderPort); + // Filter our own requests on the multicast + if (isOwnInterface(senderAddress)) + return; + qCDebug(dcSma()).noquote() << "SpeedwireInterface: Multicast socket received data from" << QString("%1:%2").arg(senderAddress.toString()).arg(senderPort); //qCDebug(dcSma()) << "SpeedwireInterface: " << datagram.toHex(); emit dataReceived(senderAddress, senderPort, datagram, true); @@ -111,6 +115,33 @@ bool SpeedwireInterface::available() const return m_available; } +bool SpeedwireInterface::isOwnInterface(const QHostAddress &hostAddress) +{ + foreach (const QNetworkInterface &networkInterface, QNetworkInterface::allInterfaces()) { + if (networkInterface.flags().testFlag(QNetworkInterface::IsLoopBack)) + continue; + + if (!networkInterface.flags().testFlag(QNetworkInterface::IsUp)) + continue; + + if (!networkInterface.flags().testFlag(QNetworkInterface::IsRunning)) + continue; + + foreach (const QNetworkAddressEntry &entry, networkInterface.addressEntries()) { + + // Only IPv4 + if (entry.ip().protocol() != QAbstractSocket::IPv4Protocol) + continue; + + if (entry.ip() == hostAddress) { + return true; + } + } + } + + return false; +} + void SpeedwireInterface::reconfigureMulticastGroup() { qCDebug(dcSma()) << "Reconfigure multicast interfaces"; diff --git a/sma/speedwire/speedwireinterface.h b/sma/speedwire/speedwireinterface.h index 566e4aa..630883a 100644 --- a/sma/speedwire/speedwireinterface.h +++ b/sma/speedwire/speedwireinterface.h @@ -48,6 +48,8 @@ public: bool available() const; + static bool isOwnInterface(const QHostAddress &hostAddress); + quint32 sourceSerialNumber() const; bool initialize();