summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2016-09-21 22:35:52 +0200
committerAndré Hartmann <aha_1980@gmx.de>2016-11-01 20:19:43 +0000
commita54fd820916caed2fb13b1a38e57deb5d918f74f (patch)
treed10a94e2164ce43d2b75f189bc52f7d6c5b2736d
parent4516f444809af8a9e3fa7cad9353c2332963fafe (diff)
QCanBusFrame: Extend valid check for frame id >= 2^29
All changes to canId have to go through setFrameId, which marks frames with id >= 2^29 as invalid. This can then be checked by isValid(). Change-Id: Ie9a80c35608cdb215d8d1ce3cb314bdc77924e05 Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--src/serialbus/qcanbusframe.h23
-rw-r--r--tests/auto/qcanbusframe/tst_qcanbusframe.cpp18
2 files changed, 31 insertions, 10 deletions
diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h
index f8b1b06..84c0060 100644
--- a/src/serialbus/qcanbusframe.h
+++ b/src/serialbus/qcanbusframe.h
@@ -73,10 +73,10 @@ public:
};
explicit QCanBusFrame(FrameType type = DataFrame) Q_DECL_NOTHROW :
- canId(0x0),
isExtendedFrame(0x0),
version(0x0)
{
+ setFrameId(0x0);
setFrameType(type);
}
@@ -99,14 +99,15 @@ public:
Q_FLAGS(FrameErrors)
explicit QCanBusFrame(quint32 identifier, const QByteArray &data) :
- canId(identifier & 0x1FFFFFFFU),
format(DataFrame),
- isExtendedFrame((identifier & 0x1FFFF800U) ? 0x1 : 0x0),
+ isExtendedFrame(0x0),
version(0x0),
load(data)
{
Q_UNUSED(extra);
Q_UNUSED(reserved);
+
+ setFrameId(identifier);
}
bool isValid() const Q_DECL_NOTHROW
@@ -118,6 +119,9 @@ public:
if (!isExtendedFrame && (canId & 0x1FFFF800U))
return false;
+ if (!isValidFrameId)
+ return false;
+
// maximum permitted payload size in CAN FD
if (load.length() > 64)
return false;
@@ -168,8 +172,14 @@ public:
}
void setFrameId(quint32 newFrameId)
{
- canId = (newFrameId & 0x1FFFFFFFU);
- setExtendedFrameFormat(isExtendedFrame || (newFrameId & 0x1FFFF800U));
+ if (newFrameId < 0x20000000U) {
+ isValidFrameId = true;
+ canId = newFrameId;
+ setExtendedFrameFormat(isExtendedFrame || (newFrameId & 0x1FFFF800U));
+ } else {
+ isValidFrameId = false;
+ canId = 0;
+ }
}
void setPayload(const QByteArray &data) { load = data; }
@@ -239,7 +249,8 @@ private:
quint8 isExtendedFrame:1;
quint8 version:5;
- quint8 extra: 2; // unused
+ quint8 isValidFrameId:1;
+ quint8 extra: 1; // unused
// reserved for future use
quint8 reserved[3];
diff --git a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
index f8b3781..56fe064 100644
--- a/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
+++ b/tests/auto/qcanbusframe/tst_qcanbusframe.cpp
@@ -104,22 +104,32 @@ void tst_QCanBusFrame::id()
frame.setExtendedFrameFormat(false);
frame.setFrameId(2047u);
QCOMPARE(frame.frameId(), 2047u);
- QVERIFY(frame.hasExtendedFrameFormat() == false);
+ QVERIFY(frame.isValid());
+ QVERIFY(!frame.hasExtendedFrameFormat());
// id > 2^11 -> extended format
frame.setExtendedFrameFormat(false);
frame.setFrameId(2048u);
QCOMPARE(frame.frameId(), 2048u);
- QVERIFY(frame.hasExtendedFrameFormat() == true);
+ QVERIFY(frame.isValid());
+ QVERIFY(frame.hasExtendedFrameFormat());
// id < 2^11 -> no extended format
frame.setExtendedFrameFormat(false);
frame.setFrameId(512u);
QCOMPARE(frame.frameId(), 512u);
- QVERIFY(frame.hasExtendedFrameFormat() == false);
+ QVERIFY(frame.isValid());
+ QVERIFY(!frame.hasExtendedFrameFormat());
// id < 2^11 -> keep extended format
frame.setExtendedFrameFormat(true);
frame.setFrameId(512u);
QCOMPARE(frame.frameId(), 512u);
- QVERIFY(frame.hasExtendedFrameFormat() == true);
+ QVERIFY(frame.isValid());
+ QVERIFY(frame.hasExtendedFrameFormat());
+ // id >= 2^29 -> invalid
+ frame.setExtendedFrameFormat(false);
+ frame.setFrameId(536870912u);
+ QCOMPARE(frame.frameId(), 0u);
+ QVERIFY(!frame.isValid());
+ QVERIFY(!frame.hasExtendedFrameFormat());
}
void tst_QCanBusFrame::payload()