From 4238df3e9fe4a01b22d55fb7088319017bdbab8b Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Mon, 20 Jul 2015 18:11:53 +0300 Subject: [PATCH] Proper OTR deadlines --- .../include/uavcan/transport/outgoing_transfer_registry.hpp | 3 +++ libuavcan/src/transport/uc_outgoing_transfer_registry.cpp | 5 +++++ libuavcan/src/transport/uc_transfer_sender.cpp | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libuavcan/include/uavcan/transport/outgoing_transfer_registry.hpp b/libuavcan/include/uavcan/transport/outgoing_transfer_registry.hpp index 1a85d0b681..4a93fd2be7 100644 --- a/libuavcan/include/uavcan/transport/outgoing_transfer_registry.hpp +++ b/libuavcan/include/uavcan/transport/outgoing_transfer_registry.hpp @@ -64,7 +64,10 @@ public: class UAVCAN_EXPORT IOutgoingTransferRegistry { public: + static const MonotonicDuration MinEntryLifetime; + virtual ~IOutgoingTransferRegistry() { } + virtual TransferID* accessOrCreate(const OutgoingTransferRegistryKey& key, MonotonicTime new_deadline) = 0; virtual bool exists(DataTypeID dtid, TransferType tt) const = 0; virtual void cleanup(MonotonicTime deadline) = 0; diff --git a/libuavcan/src/transport/uc_outgoing_transfer_registry.cpp b/libuavcan/src/transport/uc_outgoing_transfer_registry.cpp index 66cb4a5ad8..f840fa8cc6 100644 --- a/libuavcan/src/transport/uc_outgoing_transfer_registry.cpp +++ b/libuavcan/src/transport/uc_outgoing_transfer_registry.cpp @@ -19,4 +19,9 @@ std::string OutgoingTransferRegistryKey::toString() const } #endif +/* + * IOutgoingTransferRegistry + */ +const MonotonicDuration IOutgoingTransferRegistry::MinEntryLifetime = MonotonicDuration::fromMSec(2000); + } diff --git a/libuavcan/src/transport/uc_transfer_sender.cpp b/libuavcan/src/transport/uc_transfer_sender.cpp index 2d95ec1993..f0829976a6 100644 --- a/libuavcan/src/transport/uc_transfer_sender.cpp +++ b/libuavcan/src/transport/uc_transfer_sender.cpp @@ -152,7 +152,8 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic const OutgoingTransferRegistryKey otr_key(data_type_id_, transfer_type, dst_node_id); UAVCAN_ASSERT(!tx_deadline.isZero()); - const MonotonicTime otr_deadline = tx_deadline + max_transfer_interval_ * 2; + const MonotonicTime otr_deadline = tx_deadline + max(max_transfer_interval_ * 2, + IOutgoingTransferRegistry::MinEntryLifetime); TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline); if (tid == NULL)