diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-08-17 15:03:16 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-08-17 14:03:43 +0000 |
commit | c2625696b2429d1c1d4e9bde97383d3f72d9d04e (patch) | |
tree | f78b232eb18779c1e5ddb26be1faa529e14dad58 | |
parent | 5914dded6d17d2073d9ae0bcbaf9a9f655883144 (diff) |
AN183: Add support for sending routing system broadcast frames
Change-Id: I08d13f19dfab20a3a58a5a123e8f8305cc7023af
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
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(); |