diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-09-18 10:39:54 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-09-18 08:59:46 +0000 |
commit | 42a0d50005922cfa64db57ddbb5c9a3407b56abf (patch) | |
tree | 675d52e908543ae4c2f5ec20981e4962d10cfff1 | |
parent | 750f0a2963f701c6984a073212080513e5c15e1e (diff) |
Fix routing algorithm
1. fix filter action for frames with group address
2. refactored algorithm
Change-Id: I8e6362cd958744bbbab3297ab767e60c4935aa05
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r-- | src/knx/netip/qknxnetiprouter_p.cpp | 28 | ||||
-rw-r--r-- | tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp | 2 |
2 files changed, 17 insertions, 13 deletions
diff --git a/src/knx/netip/qknxnetiprouter_p.cpp b/src/knx/netip/qknxnetiprouter_p.cpp index fca79eb..2b100ee 100644 --- a/src/knx/netip/qknxnetiprouter_p.cpp +++ b/src/knx/netip/qknxnetiprouter_p.cpp @@ -366,11 +366,9 @@ QKnxNetIpRouter::FilterAction auto hopCount = extCtrlField.hopCount(); if (dst.type() == QKnxAddress::Type::Group) { - // TODO: review this part - auto gAdd = QKnxAddress::createGroup(dst.mainOrAreaSection(), dst.middleOrLineSection(), 0); bool routingCondition = true; if (m_routingMode == QKnxNetIpRouter::RoutingMode::Filter) - routingCondition = m_filterTable.contains(gAdd); + routingCondition = m_filterTable.contains(dst); if (m_routingMode == QKnxNetIpRouter::RoutingMode::Block) return QKnxNetIpRouter::FilterAction::IgnoreTotally; if (routingCondition && hopCount > 0 && hopCount <= 7) @@ -386,25 +384,31 @@ QKnxNetIpRouter::FilterAction auto ownAddress = m_individualAddress; bool isLineCoupler = ownAddress.middleOrLineSection() != 0; + if (isLineCoupler) { - // sub-line to main line routing - bool notInOwnSubnetwork = (dst.mainOrAreaSection() != ownAddress.mainOrAreaSection()) - || (dst.middleOrLineSection() == ownAddress.middleOrLineSection()); - if (notInOwnSubnetwork) { - if (dst.subOrDeviceSection() == 0) // address to this line coupler + bool mainLineToSubline = (dst.mainOrAreaSection() == ownAddress.mainOrAreaSection()) + && (dst.middleOrLineSection() == ownAddress.middleOrLineSection()); + if (mainLineToSubline) { + if (dst.subOrDeviceSection() == 0) return QKnxNetIpRouter::FilterAction::ForwardLocally; if (hopCount > 0 && hopCount <= 7) + return QKnxNetIpRouter::FilterAction::RouteDecremented; + return QKnxNetIpRouter::FilterAction::IgnoreAcked; + } + + bool sublineToMainline = !mainLineToSubline; + if (sublineToMainline) { + if (hopCount > 0 && hopCount <= 7) return QKnxNetIpRouter::FilterAction::RouteDecremented; return QKnxNetIpRouter::FilterAction::IgnoreAcked; } - // no main line to sub-line routing done by a KNXnet/IP RoutingInteface + return QKnxNetIpRouter::FilterAction::IgnoreTotally; } - // backbone to main line - if (dst.mainOrAreaSection() == ownAddress.mainOrAreaSection()) { + bool backboneToMainLine = dst.mainOrAreaSection() == ownAddress.mainOrAreaSection(); + if (backboneToMainLine) { if (dst.middleOrLineSection() == 0 && dst.subOrDeviceSection() == 0) - // address to area coupler or backbone router. return QKnxNetIpRouter::FilterAction::ForwardLocally; if (hopCount > 0 && hopCount <= 7) return QKnxNetIpRouter::FilterAction::RouteDecremented; diff --git a/tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp b/tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp index 8806edd..31738fe 100644 --- a/tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp +++ b/tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp @@ -518,7 +518,7 @@ void tst_QKnxNetIpRouter::test_routing_filter_data() QTest::addColumn<QKnxNetIpRouter::FilterTable>("filterTable"); QKnxNetIpRouter::FilterTable filterTable; - filterTable << QKnxAddress::createGroup(1,1,0); + filterTable << QKnxAddress::createGroup(1, 1, 1); QTest::newRow("RouterIndividual(1.1.0)_groupDestination(1.1.1)_hop6") << QKnxAddress::createIndividual(1,1,0) << QKnxAddress::createGroup(1,1,1) |