summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2018-09-18 10:39:54 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2018-09-18 08:59:46 +0000
commit42a0d50005922cfa64db57ddbb5c9a3407b56abf (patch)
tree675d52e908543ae4c2f5ec20981e4962d10cfff1
parent750f0a2963f701c6984a073212080513e5c15e1e (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.cpp28
-rw-r--r--tests/auto/qknxnetiprouter/tst_qknxnetiprouter.cpp2
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)