CFDP SOURCE handler #157

Merged
muellerr merged 107 commits from cfdp-source-handler into develop 2023-10-19 10:59:55 +02:00
4 changed files with 29 additions and 16 deletions
Showing only changes of commit bb186fc965 - Show all commits

View File

@ -75,7 +75,7 @@ struct EntityId : public VarLenField {
explicit EntityId(UnsignedByteField<T> byteField) : VarLenField(byteField) {} explicit EntityId(UnsignedByteField<T> byteField) : VarLenField(byteField) {}
EntityId(cfdp::WidthInBytes width, size_t entityId) : VarLenField(width, entityId) {} 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) { if (buffer == nullptr or size == nullptr) {
return returnvalue::FAILED; return returnvalue::FAILED;
} }
@ -87,6 +87,19 @@ struct EntityId : public VarLenField {
*size += 1; *size += 1;
return serialize(buffer, size, maxSize, SerializeIF::Endianness::NETWORK); 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<WidthInBytes>(**buffer);
*buffer += 1;
*deserLen -= 1;
return VarLenField::deSerialize(width, buffer, deserLen, SerializeIF::Endianness::NETWORK);
}
}; };
struct TransactionSeqNum : public VarLenField { struct TransactionSeqNum : public VarLenField {

View File

@ -6,7 +6,6 @@ cfdp::PutRequest::PutRequest(cfdp::EntityId destId, const uint8_t *msgsToUser,
size_t msgsToUserTotalSize, const uint8_t *fsRequests, size_t msgsToUserTotalSize, const uint8_t *fsRequests,
size_t fsRequestsSize) size_t fsRequestsSize)
: destId(std::move(destId)), : destId(std::move(destId)),
destIdWidth(destId.getWidth()),
metadataOnly(true), metadataOnly(true),
msgsToUsersTotalSize(msgsToUserTotalSize), msgsToUsersTotalSize(msgsToUserTotalSize),
msgsToUserStartPtr(msgsToUser), msgsToUserStartPtr(msgsToUser),
@ -23,7 +22,7 @@ ReturnValue_t cfdp::PutRequest::serialize(uint8_t **buffer, size_t *size, size_t
if (*size + getSerializedSize() > maxSize) { if (*size + getSerializedSize() > maxSize) {
return SerializeIF::BUFFER_TOO_SHORT; 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) { if (result != OK) {
return result; 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, ReturnValue_t cfdp::PutRequest::deSerialize(const uint8_t **buffer, size_t *size,
SerializeIF::Endianness streamEndianness) { SerializeIF::Endianness streamEndianness) {
ReturnValue_t result = if (buffer == nullptr or size == nullptr) {
SerializeAdapter::deSerialize(&destIdWidth, buffer, size, streamEndianness); return FAILED;
if (result != OK) {
return result;
} }
ReturnValue_t result = destId.deSerializeFromLv(buffer, size);
result = destId.deSerialize(static_cast<cfdp::WidthInBytes>(destIdWidth), buffer, size,
streamEndianness);
if (result != OK) { if (result != OK) {
return result; 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 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) { if (!metadataOnly) {
baseSize += sizeof(sourceNameSize) + sourceNameSize + sizeof(destNameSize) + destNameSize + 2; baseSize += sizeof(sourceNameSize) + sourceNameSize + sizeof(destNameSize) + destNameSize + 2;
} }

View File

@ -37,7 +37,6 @@ class PutRequest : public SerializeIF {
[[nodiscard]] bool isMetadataOnly() const; [[nodiscard]] bool isMetadataOnly() const;
private: private:
uint8_t destIdWidth = 0;
uint8_t metadataOnly = true; uint8_t metadataOnly = true;
// Transaction parameters. Omitted if the put request is metadata only. // Transaction parameters. Omitted if the put request is metadata only.
const char* destName = nullptr; const char* destName = nullptr;

View File

@ -1,12 +1,14 @@
#include <catch2/catch_test_macros.hpp> #include <catch2/catch_test_macros.hpp>
#include "fsfw/cfdp/CfdpMessage.h"
#include "fsfw/cfdp/VarLenFields.h" #include "fsfw/cfdp/VarLenFields.h"
#include "fsfw/cfdp/handler/PutRequest.h"
#include "fsfw/cfdp/handler/ReservedMessageParser.h" #include "fsfw/cfdp/handler/ReservedMessageParser.h"
#include "fsfw/cfdp/tlv/Lv.h" #include "fsfw/cfdp/tlv/Lv.h"
#include "fsfw/cfdp/tlv/ReservedMessageCreator.h" #include "fsfw/cfdp/tlv/ReservedMessageCreator.h"
#include "fsfw/cfdp/CfdpMessage.h"
#include "fsfw/cfdp/tlv/StringLv.h" #include "fsfw/cfdp/tlv/StringLv.h"
#include "fsfw/globalfunctions/arrayprinter.h" #include "fsfw/globalfunctions/arrayprinter.h"
#include "fsfw/serialize.h"
#include "mocks/MessageQueueMock.h" #include "mocks/MessageQueueMock.h"
#include "mocks/StorageManagerMock.h" #include "mocks/StorageManagerMock.h"
@ -41,7 +43,7 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") {
arrayprinter::print(buffer.data(), serLen); arrayprinter::print(buffer.data(), serLen);
ReservedMessageParser parser(ipcStore, msgQueue, destQueueId); ReservedMessageParser parser(ipcStore, msgQueue, destQueueId);
CHECK(parser.parse(buffer.data(), serLen) == OK); REQUIRE(parser.parse(buffer.data(), serLen) == OK);
CommandMessage msg; CommandMessage msg;
CHECK(msgQueue.wasMessageSent()); CHECK(msgQueue.wasMessageSent());
CHECK(msgQueue.numberOfSentMessages() == 1); CHECK(msgQueue.numberOfSentMessages() == 1);
@ -49,6 +51,9 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") {
store_address_t storeId = CfdpMessage::getStoreId(&msg); store_address_t storeId = CfdpMessage::getStoreId(&msg);
const uint8_t* data; const uint8_t* data;
size_t packetLen; size_t packetLen;
ipcStore.getData(storeId, &data, &packetLen); CHECK(ipcStore.getData(storeId, &data, &packetLen) == OK);
CHECK(packetLen > 0); CHECK(packetLen > 0);
PutRequest putRequest;
size_t dummy = packetLen;
CHECK(putRequest.deSerialize(&data, &dummy, SerializeIF::Endianness::MACHINE) == OK);
} }