summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2018-08-17 15:03:16 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2018-08-17 14:03:43 +0000
commitc2625696b2429d1c1d4e9bde97383d3f72d9d04e (patch)
treef78b232eb18779c1e5ddb26be1faa529e14dad58
parent5914dded6d17d2073d9ae0bcbaf9a9f655883144 (diff)
AN183: Add support for sending routing system broadcast frames
Change-Id: I08d13f19dfab20a3a58a5a123e8f8305cc7023af Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r--src/knx/netip/qknxnetiproutinginterface.cpp32
-rw-r--r--src/knx/netip/qknxnetiproutinginterface.h2
-rw-r--r--src/knx/netip/qknxnetiproutingsystembroadcast.cpp8
-rw-r--r--tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp45
-rw-r--r--tests/auto/qknxnetiproutingsystembroadcast/tst_qknxnetiproutingsystembroadcast.cpp2
5 files changed, 81 insertions, 8 deletions
diff --git a/src/knx/netip/qknxnetiproutinginterface.cpp b/src/knx/netip/qknxnetiproutinginterface.cpp
index e140080..0f7b0a3 100644
--- a/src/knx/netip/qknxnetiproutinginterface.cpp
+++ b/src/knx/netip/qknxnetiproutinginterface.cpp
@@ -34,6 +34,7 @@
#include "qknxnetiproutingbusy.h"
#include "qknxnetiproutingindication.h"
#include "qknxnetiproutinglostmessage.h"
+#include "qknxnetiproutingsystembroadcast.h"
#include <QtCore/qrandom.h>
#include <QtCore/qtimer.h>
@@ -234,6 +235,13 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn void QKnxNetIpRoutingInterface::routingSystemBroadcastSent(QKnxNetIpFrame frame)
+
+ This signal is emitted when the KNXnet/IP router has finished sending the
+ routing system broadcast \a frame.
+*/
+
+/*!
\fn void QKnxNetIpRoutingInterface::stateChanged(QKnxNetIpRoutingInterface::State state)
This signal is emitted when the KNXnet/IP router transitions to a different
@@ -500,6 +508,30 @@ void QKnxNetIpRoutingInterface::sendRoutingLostMessage(const QKnxNetIpFrame &fra
}
/*!
+ Multicasts the routing system broadcast \a frame through the network interface
+ associated with the QKnxNetIpRoutingInterface.
+*/
+void QKnxNetIpRoutingInterface::sendRoutingSystemBroadcast(const QKnxLinkLayerFrame &linkFrame)
+{
+ Q_D(QKnxNetIpRoutingInterface);
+
+ auto netipFrame = QKnxNetIpRoutingSystemBroadcastProxy::builder()
+ .setCemi(linkFrame)
+ .create();
+
+ QKnxNetIpRoutingSystemBroadcastProxy proxy(netipFrame);
+ if (!proxy.isValid())
+ return;
+
+ if (!d->sendFrame(netipFrame)) {
+ d->errorOccurred(QKnxNetIpRoutingInterface::Error::KnxRouting, tr("Could not send routing "
+ "system broadcast."));
+ } else {
+ emit routingSystemBroadcastSent(netipFrame);
+ }
+}
+
+/*!
Signals the QKnxNetIpRoutingInterface to start listening for messages
received and accept sending messages.
*/
diff --git a/src/knx/netip/qknxnetiproutinginterface.h b/src/knx/netip/qknxnetiproutinginterface.h
index ec353c0..29365fc 100644
--- a/src/knx/netip/qknxnetiproutinginterface.h
+++ b/src/knx/netip/qknxnetiproutinginterface.h
@@ -114,6 +114,7 @@ public Q_SLOTS:
void sendRoutingIndication(const QKnxNetIpFrame &frame);
void sendRoutingBusy(const QKnxNetIpFrame &frame);
void sendRoutingLostMessage(const QKnxNetIpFrame &frame);
+ void sendRoutingSystemBroadcast(const QKnxLinkLayerFrame &linkFrame);
void start();
void stop();
@@ -122,6 +123,7 @@ Q_SIGNALS:
void routingIndicationSent(QKnxNetIpFrame frame);
void routingBusySent(QKnxNetIpFrame frame);
void routingLostCountSent(QKnxNetIpFrame frame);
+ void routingSystemBroadcastSent(QKnxNetIpFrame frame);
void routingIndicationReceived(QKnxNetIpFrame frame, QKnxNetIpRoutingInterface::FilterAction action);
void routingBusyReceived(QKnxNetIpFrame frame);
diff --git a/src/knx/netip/qknxnetiproutingsystembroadcast.cpp b/src/knx/netip/qknxnetiproutingsystembroadcast.cpp
index 8b999a3..961b356 100644
--- a/src/knx/netip/qknxnetiproutingsystembroadcast.cpp
+++ b/src/knx/netip/qknxnetiproutingsystembroadcast.cpp
@@ -92,8 +92,8 @@ namespace QKnxPrivate
// specified in (AN 158: Data security) shall be set to 1.
return linkFrame.extendedControlField().destinationAddressType() == QKnxAddress::Type::Group
&& linkFrame.controlField().broadcast() == QKnxControlField::Broadcast::System
- && linkFrame.messageCode() != QKnxLinkLayerFrame::MessageCode::DataIndication
- && linkFrame.destinationAddress().type() != QKnxAddress::Type::Group;
+ && linkFrame.messageCode() == QKnxLinkLayerFrame::MessageCode::DataIndication
+ && linkFrame.destinationAddress().type() == QKnxAddress::Type::Group;
}
}
@@ -166,9 +166,7 @@ QKnxNetIpRoutingSystemBroadcastProxy::Builder &
QKnxNetIpRoutingSystemBroadcastProxy::Builder::setCemi(const QKnxLinkLayerFrame &cemi)
{
if (QKnxPrivate::isCemiValid(cemi))
- return *this;
-
- m_llf = cemi;
+ m_llf = cemi;
return *this;
}
diff --git a/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp b/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
index aa20035..c046e2b 100644
--- a/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
+++ b/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
@@ -33,6 +33,7 @@
#include <QtKnx/qknxnetiproutingbusy.h>
#include <QtKnx/qknxnetiproutingindication.h>
#include <QtKnx/qknxnetiproutinglostmessage.h>
+#include <QtKnx/qknxnetiproutingsystembroadcast.h>
#include <QtKnx/private/qknxnetiproutinginterface_p.h>
#include <QtKnx/private/qknxtestingrouter_p.h>
@@ -66,6 +67,7 @@ private slots:
void test_routing_receives_indications();
void test_routing_receives_busy();
void test_routing_busy_sent_packets_same_individual_address();
+ void test_routing_interface_sends_system_broadcast();
void test_routing_filter();
void test_routing_filter_data();
@@ -405,6 +407,47 @@ void tst_QKnxNetIpRoutingInterface::test_routing_busy_sent_packets_same_individu
QCOMPARE(m_routingInterface.state(), QKnxNetIpRoutingInterface::State::NeighborBusy);
}
+void tst_QKnxNetIpRoutingInterface::test_routing_interface_sends_system_broadcast()
+{
+ if (!runTests)
+ return;
+
+ m_routingInterface.start();
+
+ auto dst = QKnxAddress::createGroup(1, 1, 1);
+ auto tpdu = QKnxTpduFactory::Multicast::createGroupValueReadTpdu();
+ auto ctrl = QKnxControlField::builder()
+ .setFrameFormat(QKnxControlField::FrameFormat::Standard)
+ .setBroadcast(QKnxControlField::Broadcast::System)
+ .setPriority(QKnxControlField::Priority::Normal)
+ .create();
+
+ auto extCtrl = QKnxExtendedControlField::builder()
+ .setDestinationAddressType(dst.type())
+ .setHopCount(6)
+ .create();
+
+ auto frame = QKnxLinkLayerFrame::builder()
+ .setControlField(ctrl)
+ .setExtendedControlField(extCtrl)
+ .setTpdu(tpdu)
+ .setDestinationAddress(dst)
+ .setSourceAddress({ QKnxAddress::Type::Individual, 0 })
+ .setMessageCode(QKnxLinkLayerFrame::MessageCode::DataIndication)
+ .setMedium(QKnx::MediumType::NetIP)
+ .createFrame();
+
+ bool sbcSent = false;
+ QObject::connect(&m_routingInterface,
+ &QKnxNetIpRoutingInterface::routingSystemBroadcastSent, [&](QKnxNetIpFrame frame) {
+ sbcSent = true;
+ QKnxNetIpRoutingSystemBroadcastProxy sbc(frame);
+ QVERIFY(sbc.isValid());
+ });
+ m_routingInterface.sendRoutingSystemBroadcast(frame);
+ QVERIFY(sbcSent);
+}
+
void tst_QKnxNetIpRoutingInterface::test_routing_filter()
{
if (!runTests)
@@ -423,7 +466,6 @@ void tst_QKnxNetIpRoutingInterface::test_routing_filter()
m_routingInterface.start();
bool receivedIndication = false;
-
QObject::connect(&m_routingInterface, &QKnxNetIpRoutingInterface::routingIndicationReceived
, [&](QKnxNetIpFrame frame
, QKnxNetIpRoutingInterface::FilterAction routingAction) {
@@ -433,7 +475,6 @@ void tst_QKnxNetIpRoutingInterface::test_routing_filter()
receivedIndication = true;
});
-
auto frame = dummyRoutingIndication(dst, hopCount);
simulateFramesReceived(frame);
QVERIFY(receivedIndication);
diff --git a/tests/auto/qknxnetiproutingsystembroadcast/tst_qknxnetiproutingsystembroadcast.cpp b/tests/auto/qknxnetiproutingsystembroadcast/tst_qknxnetiproutingsystembroadcast.cpp
index 0d17c4f..6fc3dbf 100644
--- a/tests/auto/qknxnetiproutingsystembroadcast/tst_qknxnetiproutingsystembroadcast.cpp
+++ b/tests/auto/qknxnetiproutingsystembroadcast/tst_qknxnetiproutingsystembroadcast.cpp
@@ -73,7 +73,7 @@ void tst_QKnxNetIpRoutingSystemBroadcast::setValidCemi()
auto tpdu = QKnxTpduFactory::Multicast::createGroupValueReadTpdu();
auto ctrl = QKnxControlField::builder()
.setFrameFormat(QKnxControlField::FrameFormat::Standard)
- .setBroadcast(QKnxControlField::Broadcast::Domain)
+ .setBroadcast(QKnxControlField::Broadcast::System)
.setPriority(QKnxControlField::Priority::Normal)
.create();