2021-12-03 15:37:49 +01:00
|
|
|
#include "HeaderSerializer.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#include "HeaderDeserializer.h"
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
HeaderSerializer::HeaderSerializer(PduConfig &pduConf, cfdp::PduType pduType,
|
|
|
|
size_t initPduDataFieldLen,
|
|
|
|
cfdp::SegmentMetadataFlag segmentMetadataFlag,
|
|
|
|
cfdp::SegmentationControl segCtrl)
|
|
|
|
: pduType(pduType),
|
|
|
|
segmentMetadataFlag(segmentMetadataFlag),
|
|
|
|
segmentationCtrl(segCtrl),
|
|
|
|
pduDataFieldLen(initPduDataFieldLen),
|
|
|
|
pduConf(pduConf) {}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
ReturnValue_t HeaderSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
|
2022-02-02 10:29:30 +01:00
|
|
|
Endianness streamEndianness) const {
|
|
|
|
if (buffer == nullptr or size == nullptr) {
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
if (maxSize < this->getSerializedSize()) {
|
|
|
|
return BUFFER_TOO_SHORT;
|
|
|
|
}
|
|
|
|
**buffer = cfdp::VERSION_BITS | this->pduType << 4 | pduConf.direction << 3 | pduConf.mode << 2 |
|
|
|
|
pduConf.crcFlag << 1 | pduConf.largeFile;
|
|
|
|
*buffer += 1;
|
|
|
|
**buffer = (pduDataFieldLen & 0xff00) >> 8;
|
|
|
|
*buffer += 1;
|
|
|
|
**buffer = pduDataFieldLen & 0x00ff;
|
|
|
|
*buffer += 1;
|
|
|
|
**buffer = segmentationCtrl << 7 | pduConf.sourceId.getWidth() << 4 | segmentMetadataFlag << 3 |
|
|
|
|
pduConf.seqNum.getWidth();
|
|
|
|
*buffer += 1;
|
|
|
|
*size += 4;
|
|
|
|
ReturnValue_t result = pduConf.sourceId.serialize(buffer, size, maxSize, streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = pduConf.seqNum.serialize(buffer, size, maxSize, streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = pduConf.destId.serialize(buffer, size, maxSize, streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t HeaderSerializer::getSerializedSize() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t shit = pduConf.seqNum.getWidth() + pduConf.sourceId.getWidth() * 2 + 4;
|
|
|
|
return shit;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t HeaderSerializer::deSerialize(const uint8_t **buffer, size_t *size,
|
2022-02-02 10:29:30 +01:00
|
|
|
Endianness streamEndianness) {
|
|
|
|
// We could implement this, but I prefer dedicated classes
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t HeaderSerializer::getWholePduSize() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
// Return size of header plus the PDU data field length
|
|
|
|
return pduDataFieldLen + HeaderSerializer::getSerializedSize();
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t HeaderSerializer::getPduDataFieldLen() const { return pduDataFieldLen; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
void HeaderSerializer::setPduDataFieldLen(size_t pduDataFieldLen) {
|
2022-02-02 10:29:30 +01:00
|
|
|
this->pduDataFieldLen = pduDataFieldLen;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
void HeaderSerializer::setPduType(cfdp::PduType pduType) { this->pduType = pduType; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
void HeaderSerializer::setSegmentMetadataFlag(cfdp::SegmentMetadataFlag segmentMetadataFlag) {
|
2022-02-02 10:29:30 +01:00
|
|
|
this->segmentMetadataFlag = segmentMetadataFlag;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::PduType HeaderSerializer::getPduType() const { return pduType; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::Direction HeaderSerializer::getDirection() const { return pduConf.direction; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::TransmissionModes HeaderSerializer::getTransmissionMode() const { return pduConf.mode; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
bool HeaderSerializer::getCrcFlag() const { return pduConf.crcFlag; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
bool HeaderSerializer::getLargeFileFlag() const { return pduConf.largeFile; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
cfdp::SegmentationControl HeaderSerializer::getSegmentationControl() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
return segmentationCtrl;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::WidthInBytes HeaderSerializer::getLenEntityIds() const { return pduConf.sourceId.getWidth(); }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::WidthInBytes HeaderSerializer::getLenSeqNum() const { return pduConf.seqNum.getWidth(); }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
cfdp::SegmentMetadataFlag HeaderSerializer::getSegmentMetadataFlag() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
return segmentMetadataFlag;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
void HeaderSerializer::getSourceId(cfdp::EntityId &sourceId) const { sourceId = pduConf.sourceId; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
void HeaderSerializer::getDestId(cfdp::EntityId &destId) const { destId = pduConf.destId; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
|
|
|
void HeaderSerializer::setSegmentationControl(cfdp::SegmentationControl segmentationControl) {
|
2022-02-02 10:29:30 +01:00
|
|
|
this->segmentationCtrl = segmentationControl;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void HeaderSerializer::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
|
2022-02-02 10:29:30 +01:00
|
|
|
seqNum = pduConf.seqNum;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool HeaderSerializer::hasSegmentMetadataFlag() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (this->segmentMetadataFlag == cfdp::SegmentMetadataFlag::PRESENT) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|