From bb186fc965d56ce77c3255d7af3aa2224506d8a0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 26 Jul 2023 16:58:58 +0200 Subject: [PATCH] more bugfixes --- src/fsfw/cfdp/VarLenFields.h | 15 ++++++++++++++- src/fsfw/cfdp/handler/PutRequest.cpp | 18 +++++++----------- src/fsfw/cfdp/handler/PutRequest.h | 1 - .../cfdp/handler/testReservedMsgParser.cpp | 11 ++++++++--- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/fsfw/cfdp/VarLenFields.h b/src/fsfw/cfdp/VarLenFields.h index db094db6..f6dbc2b0 100644 --- a/src/fsfw/cfdp/VarLenFields.h +++ b/src/fsfw/cfdp/VarLenFields.h @@ -75,7 +75,7 @@ struct EntityId : public VarLenField { explicit EntityId(UnsignedByteField byteField) : VarLenField(byteField) {} EntityId(cfdp::WidthInBytes width, size_t entityId) : VarLenField(width, entityId) {} - ReturnValue_t serializeAsLv(uint8_t **buffer, size_t *size, size_t maxSize) { + ReturnValue_t serializeAsLv(uint8_t **buffer, size_t *size, size_t maxSize) const { if (buffer == nullptr or size == nullptr) { return returnvalue::FAILED; } @@ -87,6 +87,19 @@ struct EntityId : public VarLenField { *size += 1; return serialize(buffer, size, maxSize, SerializeIF::Endianness::NETWORK); } + + ReturnValue_t deSerializeFromLv(const uint8_t **buffer, size_t *deserLen) { + if (buffer == nullptr or deserLen == nullptr) { + return returnvalue::FAILED; + } + if (*deserLen < 2) { + return SerializeIF::STREAM_TOO_SHORT; + } + auto width = static_cast(**buffer); + *buffer += 1; + *deserLen -= 1; + return VarLenField::deSerialize(width, buffer, deserLen, SerializeIF::Endianness::NETWORK); + } }; struct TransactionSeqNum : public VarLenField { diff --git a/src/fsfw/cfdp/handler/PutRequest.cpp b/src/fsfw/cfdp/handler/PutRequest.cpp index b3afda30..4cc91a3b 100644 --- a/src/fsfw/cfdp/handler/PutRequest.cpp +++ b/src/fsfw/cfdp/handler/PutRequest.cpp @@ -6,7 +6,6 @@ cfdp::PutRequest::PutRequest(cfdp::EntityId destId, const uint8_t *msgsToUser, size_t msgsToUserTotalSize, const uint8_t *fsRequests, size_t fsRequestsSize) : destId(std::move(destId)), - destIdWidth(destId.getWidth()), metadataOnly(true), msgsToUsersTotalSize(msgsToUserTotalSize), msgsToUserStartPtr(msgsToUser), @@ -17,13 +16,13 @@ cfdp::PutRequest::PutRequest(cfdp::EntityId destId, const uint8_t *msgsToUser, ReturnValue_t cfdp::PutRequest::serialize(uint8_t **buffer, size_t *size, size_t maxSize, SerializeIF::Endianness streamEndianness) const { - if(buffer == nullptr or size == nullptr) { + if (buffer == nullptr or size == nullptr) { return FAILED; } if (*size + getSerializedSize() > maxSize) { return SerializeIF::BUFFER_TOO_SHORT; } - ReturnValue_t result = destId.serialize(buffer, size, maxSize, streamEndianness); + ReturnValue_t result = destId.serializeAsLv(buffer, size, maxSize); if (result != OK) { return result; } @@ -89,14 +88,10 @@ ReturnValue_t cfdp::PutRequest::serialize(uint8_t **buffer, size_t *size, size_t ReturnValue_t cfdp::PutRequest::deSerialize(const uint8_t **buffer, size_t *size, SerializeIF::Endianness streamEndianness) { - ReturnValue_t result = - SerializeAdapter::deSerialize(&destIdWidth, buffer, size, streamEndianness); - if (result != OK) { - return result; + if (buffer == nullptr or size == nullptr) { + return FAILED; } - - result = destId.deSerialize(static_cast(destIdWidth), buffer, size, - streamEndianness); + ReturnValue_t result = destId.deSerializeFromLv(buffer, size); if (result != OK) { return result; } @@ -155,7 +150,8 @@ ReturnValue_t cfdp::PutRequest::deSerialize(const uint8_t **buffer, size_t *size } size_t cfdp::PutRequest::getSerializedSize() const { - size_t baseSize = 1 + destId.getSerializedSize(); + // Entity ID LV (1 leading size byte) and the metadata only flag. + size_t baseSize = 1 + destId.getSerializedSize() + 1; if (!metadataOnly) { baseSize += sizeof(sourceNameSize) + sourceNameSize + sizeof(destNameSize) + destNameSize + 2; } diff --git a/src/fsfw/cfdp/handler/PutRequest.h b/src/fsfw/cfdp/handler/PutRequest.h index b842f4e2..e323c6e3 100644 --- a/src/fsfw/cfdp/handler/PutRequest.h +++ b/src/fsfw/cfdp/handler/PutRequest.h @@ -37,7 +37,6 @@ class PutRequest : public SerializeIF { [[nodiscard]] bool isMetadataOnly() const; private: - uint8_t destIdWidth = 0; uint8_t metadataOnly = true; // Transaction parameters. Omitted if the put request is metadata only. const char* destName = nullptr; diff --git a/unittests/cfdp/handler/testReservedMsgParser.cpp b/unittests/cfdp/handler/testReservedMsgParser.cpp index 0b9f5782..622ebafe 100644 --- a/unittests/cfdp/handler/testReservedMsgParser.cpp +++ b/unittests/cfdp/handler/testReservedMsgParser.cpp @@ -1,12 +1,14 @@ #include +#include "fsfw/cfdp/CfdpMessage.h" #include "fsfw/cfdp/VarLenFields.h" +#include "fsfw/cfdp/handler/PutRequest.h" #include "fsfw/cfdp/handler/ReservedMessageParser.h" #include "fsfw/cfdp/tlv/Lv.h" #include "fsfw/cfdp/tlv/ReservedMessageCreator.h" -#include "fsfw/cfdp/CfdpMessage.h" #include "fsfw/cfdp/tlv/StringLv.h" #include "fsfw/globalfunctions/arrayprinter.h" +#include "fsfw/serialize.h" #include "mocks/MessageQueueMock.h" #include "mocks/StorageManagerMock.h" @@ -41,7 +43,7 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") { arrayprinter::print(buffer.data(), serLen); ReservedMessageParser parser(ipcStore, msgQueue, destQueueId); - CHECK(parser.parse(buffer.data(), serLen) == OK); + REQUIRE(parser.parse(buffer.data(), serLen) == OK); CommandMessage msg; CHECK(msgQueue.wasMessageSent()); CHECK(msgQueue.numberOfSentMessages() == 1); @@ -49,6 +51,9 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") { store_address_t storeId = CfdpMessage::getStoreId(&msg); const uint8_t* data; size_t packetLen; - ipcStore.getData(storeId, &data, &packetLen); + CHECK(ipcStore.getData(storeId, &data, &packetLen) == OK); CHECK(packetLen > 0); + PutRequest putRequest; + size_t dummy = packetLen; + CHECK(putRequest.deSerialize(&data, &dummy, SerializeIF::Endianness::MACHINE) == OK); }