handling of space packets which are too short
This commit is contained in:
parent
39881e7671
commit
36669fd4d9
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user