diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2016-09-21 22:35:52 +0200 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2016-11-01 20:19:43 +0000 |
commit | a54fd820916caed2fb13b1a38e57deb5d918f74f (patch) | |
tree | d10a94e2164ce43d2b75f189bc52f7d6c5b2736d | |
parent | 4516f444809af8a9e3fa7cad9353c2332963fafe (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.h | 23 | ||||
-rw-r--r-- | tests/auto/qcanbusframe/tst_qcanbusframe.cpp | 18 |
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() |