Space Packet Size Check #644

Closed
meierj wants to merge 4 commits from meier/upstream-pus-distributor-bugfix into development
9 changed files with 39 additions and 12 deletions

View File

@ -33,7 +33,11 @@ CFDPDistributor::TcMqMapIter CFDPDistributor::selectDestination() {
if (this->currentPacket == nullptr) {
return queueMapIt;
}
this->currentPacket->setStoreAddress(this->currentMessage.getStorageId());
ReturnValue_t result = this->currentPacket->setStoreAddress(this->currentMessage.getStorageId());
if (result != HasReturnvaluesIF::RETURN_OK) {
tcStatus = PACKET_TOO_SHORT;
return this->queueMap.end();
}
if (currentPacket->getWholeData() != nullptr) {
tcStatus = checker.checkPacket(currentPacket);
if (tcStatus != HasReturnvaluesIF::RETURN_OK) {

View File

@ -27,7 +27,12 @@ PUSDistributor::TcMqMapIter PUSDistributor::selectDestination() {
if (this->currentPacket == nullptr) {
return queueMapIt;
}
this->currentPacket->setStoreAddress(this->currentMessage.getStorageId(), currentPacket);
ReturnValue_t result =
this->currentPacket->setStoreAddress(this->currentMessage.getStorageId(), currentPacket);
if (result != HasReturnvaluesIF::RETURN_OK) {
tcStatus = PACKET_TOO_SHORT;
return this->queueMap.end();
}
if (currentPacket->getWholeData() != nullptr) {
tcStatus = checker.checkPacket(currentPacket);
if (tcStatus != HasReturnvaluesIF::RETURN_OK) {
@ -106,6 +111,14 @@ ReturnValue_t PUSDistributor::registerService(AcceptsTelecommandsIF* service) {
MessageQueueId_t PUSDistributor::getRequestQueue() { return tcQueue->getId(); }
ReturnValue_t PUSDistributor::callbackAfterSending(ReturnValue_t queueStatus) {
if (tcStatus == PACKET_LOST or tcStatus == PACKET_TOO_SHORT) {
// The ack flags, packet id and sequence control are unknown for a packet which is too short or
// has been lost
this->verifyChannel.sendFailureReport(tc_verification::ACCEPTANCE_FAILURE, UNKNOWN_ACK_FLAGS,
UNKNOWN_PACKET_ID, UNKNOWN_SEQUENCE_CONTROL, tcStatus);
currentPacket->deletePacket();
return RETURN_FAILED;
}
if (queueStatus != RETURN_OK) {
tcStatus = queueStatus;
}

View File

@ -72,6 +72,11 @@ class PUSDistributor : public TcDistributor, public PUSDistributorIF, public Acc
* success/failure messages.
*/
ReturnValue_t callbackAfterSending(ReturnValue_t queueStatus) override;
private:
static const uint8_t UNKNOWN_ACK_FLAGS = 0;
static const uint8_t UNKNOWN_PACKET_ID = 0;
static const uint8_t UNKNOWN_SEQUENCE_CONTROL = 0;
};
#endif /* FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_ */

View File

@ -36,6 +36,7 @@ class TcDistributor : public SystemObject, public ExecutableObjectIF, public Has
static constexpr ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE(1);
static constexpr ReturnValue_t DESTINATION_NOT_FOUND = MAKE_RETURN_CODE(2);
static constexpr ReturnValue_t SERVICE_ID_ALREADY_EXISTS = MAKE_RETURN_CODE(3);
static constexpr ReturnValue_t PACKET_TOO_SHORT = MAKE_RETURN_CODE(4);
/**
* Within the default constructor, the SystemObject id is set and the
* message queue is initialized.

View File

@ -37,7 +37,7 @@ ReturnValue_t CFDPPacketStored::deletePacket() {
// CFDPPacket* CFDPPacketStored::getPacketBase() {
// return this;
// }
void CFDPPacketStored::setStoreAddress(store_address_t setAddress) {
ReturnValue_t CFDPPacketStored::setStoreAddress(store_address_t setAddress) {
this->storeAddress = setAddress;
const uint8_t* tempData = nullptr;
size_t tempSize;
@ -46,11 +46,11 @@ void CFDPPacketStored::setStoreAddress(store_address_t setAddress) {
status = this->store->getData(this->storeAddress, &tempData, &tempSize);
}
if (status == StorageManagerIF::RETURN_OK) {
this->setData(const_cast<uint8_t*>(tempData), tempSize);
return this->setData(const_cast<uint8_t*>(tempData), tempSize);
} else {
// To circumvent size checks
this->setData(nullptr, -1);
this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
// To circumvent size checks
return this->setData(nullptr, -1);
}
}

View File

@ -29,7 +29,7 @@ class CFDPPacketStored : public CFDPPacket, public TcPacketStoredBase {
*/
ReturnValue_t getData(const uint8_t** dataPtr, size_t* dataSize);
void setStoreAddress(store_address_t setAddress);
ReturnValue_t setStoreAddress(store_address_t setAddress);
store_address_t getStoreAddress();

View File

@ -42,7 +42,7 @@ bool TcPacketStoredBase::checkAndSetStore() {
return true;
}
void TcPacketStoredBase::setStoreAddress(store_address_t setAddress,
ReturnValue_t TcPacketStoredBase::setStoreAddress(store_address_t setAddress,
RedirectableDataPointerIF* packet) {
this->storeAddress = setAddress;
const uint8_t* tempData = nullptr;
@ -53,10 +53,10 @@ void TcPacketStoredBase::setStoreAddress(store_address_t setAddress,
}
if (status == StorageManagerIF::RETURN_OK) {
packet->setData(const_cast<uint8_t*>(tempData), tempSize);
return packet->setData(const_cast<uint8_t*>(tempData), tempSize);
} else {
packet->setData(nullptr, -1);
this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
return packet->setData(nullptr, -1);
}
}

View File

@ -38,7 +38,8 @@ class TcPacketStoredBase : public TcPacketStoredIF {
*/
ReturnValue_t getData(const uint8_t** dataPtr, size_t* dataSize) override;
void setStoreAddress(store_address_t setAddress, RedirectableDataPointerIF* packet) override;
ReturnValue_t setStoreAddress(store_address_t setAddress,
RedirectableDataPointerIF* packet) override;
store_address_t getStoreAddress() override;
/**

View File

@ -16,8 +16,11 @@ class TcPacketStoredIF {
* With this call, the stored packet can be set to another packet in a store. This is useful
* if the packet is a class member and used for more than one packet.
* @param setAddress The new packet id to link to.
*
* @return RETURN_OK if successful otherwise error return code.
*/
virtual void setStoreAddress(store_address_t setAddress, RedirectableDataPointerIF* packet) = 0;
virtual ReturnValue_t setStoreAddress(store_address_t setAddress,
RedirectableDataPointerIF* packet) = 0;
virtual store_address_t getStoreAddress() = 0;