From 5c0314e1875bde789d061c44feed195aa1b005fc Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Thu, 30 Apr 2015 12:04:55 +0300 Subject: [PATCH] Dedicated error code for transfers of excessive length --- libuavcan/include/uavcan/error.hpp | 1 + libuavcan/src/transport/uc_transfer_sender.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libuavcan/include/uavcan/error.hpp b/libuavcan/include/uavcan/error.hpp index bce8b4ed00..3776f27b8e 100644 --- a/libuavcan/include/uavcan/error.hpp +++ b/libuavcan/include/uavcan/error.hpp @@ -33,6 +33,7 @@ const int16_t ErrNotInited = 8; const int16_t ErrRecursiveCall = 9; const int16_t ErrLogic = 10; const int16_t ErrPassiveMode = 11; ///< Operation not permitted in passive mode +const int16_t ErrTransferTooLong = 12; ///< Transfer of this length cannot be sent with given transfer type /** * @} */ diff --git a/libuavcan/src/transport/uc_transfer_sender.cpp b/libuavcan/src/transport/uc_transfer_sender.cpp index 31315073c2..f75b3cc149 100644 --- a/libuavcan/src/transport/uc_transfer_sender.cpp +++ b/libuavcan/src/transport/uc_transfer_sender.cpp @@ -21,8 +21,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic { if (payload_len > getMaxPayloadLenForTransferType(transfer_type)) { - UAVCAN_ASSERT(0); - return -ErrInvalidParam; + return -ErrTransferTooLong; } Frame frame(data_type_.getID(), transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid); @@ -129,6 +128,12 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic int TransferSender::send(const uint8_t* payload, unsigned payload_len, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id) { + // This check must be performed before TID is incremented to avoid skipping TID values on failures + if (payload_len > getMaxPayloadLenForTransferType(transfer_type)) + { + return -ErrTransferTooLong; + } + const OutgoingTransferRegistryKey otr_key(data_type_.getID(), transfer_type, dst_node_id); UAVCAN_ASSERT(!tx_deadline.isZero());