2022-08-03 15:22:39 +02:00
|
|
|
#include "HeaderCreator.h"
|
|
|
|
|
2022-09-08 11:26:17 +02:00
|
|
|
HeaderCreator::HeaderCreator(PduConfig &pduConf, cfdp::PduTypes pduType, size_t initPduDataFieldLen,
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::SegmentMetadataFlag segmentMetadataFlag,
|
|
|
|
cfdp::SegmentationControl segCtrl)
|
|
|
|
: pduType(pduType),
|
|
|
|
segmentMetadataFlag(segmentMetadataFlag),
|
|
|
|
segmentationCtrl(segCtrl),
|
|
|
|
pduDataFieldLen(initPduDataFieldLen),
|
|
|
|
pduConf(pduConf) {}
|
|
|
|
|
|
|
|
ReturnValue_t HeaderCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
|
|
|
|
Endianness streamEndianness) const {
|
|
|
|
if (buffer == nullptr or size == nullptr) {
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::FAILED;
|
2022-08-03 15:22:39 +02:00
|
|
|
}
|
|
|
|
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);
|
2022-08-22 16:35:53 +02:00
|
|
|
if (result != returnvalue::OK) {
|
2022-08-03 15:22:39 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = pduConf.seqNum.serialize(buffer, size, maxSize, streamEndianness);
|
2022-08-22 16:35:53 +02:00
|
|
|
if (result != returnvalue::OK) {
|
2022-08-03 15:22:39 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = pduConf.destId.serialize(buffer, size, maxSize, streamEndianness);
|
2022-08-22 16:35:53 +02:00
|
|
|
if (result != returnvalue::OK) {
|
2022-08-03 15:22:39 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::OK;
|
2022-08-03 15:22:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t HeaderCreator::getSerializedSize() const {
|
2022-08-03 16:00:48 +02:00
|
|
|
return pduConf.seqNum.getWidth() + pduConf.sourceId.getWidth() * 2 + 4;
|
2022-08-03 15:22:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t HeaderCreator::deSerialize(const uint8_t **buffer, size_t *size,
|
|
|
|
Endianness streamEndianness) {
|
|
|
|
// We could implement this, but I prefer dedicated classes
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::FAILED;
|
2022-08-03 15:22:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t HeaderCreator::getWholePduSize() const {
|
|
|
|
// Return size of header plus the PDU data field length
|
|
|
|
return pduDataFieldLen + HeaderCreator::getSerializedSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t HeaderCreator::getPduDataFieldLen() const { return pduDataFieldLen; }
|
|
|
|
|
|
|
|
void HeaderCreator::setPduDataFieldLen(size_t pduDataFieldLen_) {
|
|
|
|
pduDataFieldLen = pduDataFieldLen_;
|
|
|
|
}
|
|
|
|
|
2022-09-08 11:26:17 +02:00
|
|
|
void HeaderCreator::setPduType(cfdp::PduTypes pduType_) { pduType = pduType_; }
|
2022-08-03 15:22:39 +02:00
|
|
|
|
|
|
|
void HeaderCreator::setSegmentMetadataFlag(cfdp::SegmentMetadataFlag segmentMetadataFlag_) {
|
|
|
|
segmentMetadataFlag = segmentMetadataFlag_;
|
|
|
|
}
|
|
|
|
|
2022-09-08 11:26:17 +02:00
|
|
|
cfdp::PduTypes HeaderCreator::getPduType() const { return pduType; }
|
2022-08-03 15:22:39 +02:00
|
|
|
|
|
|
|
cfdp::Direction HeaderCreator::getDirection() const { return pduConf.direction; }
|
|
|
|
|
|
|
|
cfdp::TransmissionModes HeaderCreator::getTransmissionMode() const { return pduConf.mode; }
|
|
|
|
|
|
|
|
bool HeaderCreator::getCrcFlag() const { return pduConf.crcFlag; }
|
|
|
|
|
|
|
|
bool HeaderCreator::getLargeFileFlag() const { return pduConf.largeFile; }
|
|
|
|
|
|
|
|
cfdp::SegmentationControl HeaderCreator::getSegmentationControl() const { return segmentationCtrl; }
|
|
|
|
|
|
|
|
cfdp::WidthInBytes HeaderCreator::getLenEntityIds() const { return pduConf.sourceId.getWidth(); }
|
|
|
|
|
|
|
|
cfdp::WidthInBytes HeaderCreator::getLenSeqNum() const { return pduConf.seqNum.getWidth(); }
|
|
|
|
|
|
|
|
cfdp::SegmentMetadataFlag HeaderCreator::getSegmentMetadataFlag() const {
|
|
|
|
return segmentMetadataFlag;
|
|
|
|
}
|
|
|
|
|
|
|
|
void HeaderCreator::getSourceId(cfdp::EntityId &sourceId) const { sourceId = pduConf.sourceId; }
|
|
|
|
|
|
|
|
void HeaderCreator::getDestId(cfdp::EntityId &destId) const { destId = pduConf.destId; }
|
|
|
|
|
|
|
|
void HeaderCreator::setSegmentationControl(cfdp::SegmentationControl segmentationControl) {
|
|
|
|
this->segmentationCtrl = segmentationControl;
|
|
|
|
}
|
|
|
|
|
|
|
|
void HeaderCreator::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
|
|
|
|
seqNum = pduConf.seqNum;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool HeaderCreator::hasSegmentMetadataFlag() const {
|
|
|
|
if (this->segmentMetadataFlag == cfdp::SegmentMetadataFlag::PRESENT) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|