diff --git a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/cluster_manager.hpp b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/cluster_manager.hpp index 6e0a8e038c..f237b19436 100644 --- a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/cluster_manager.hpp +++ b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/cluster_manager.hpp @@ -89,22 +89,6 @@ private: return NULL; } - void addServer(NodeID node_id) - { - UAVCAN_ASSERT((num_known_servers_ + 1) < MaxClusterSize); - if (!isKnownServer(node_id) && node_id.isUnicast()) - { - tracer_.onEvent(TraceRaftNewServerDiscovered, node_id.get()); - servers_[num_known_servers_].node_id = node_id; - servers_[num_known_servers_].resetIndices(log_); - num_known_servers_ = static_cast(num_known_servers_ + 1U); - } - else - { - UAVCAN_ASSERT(0); - } - } - virtual void handleTimerEvent(const TimerEvent&) { UAVCAN_ASSERT(num_known_servers_ < cluster_size_); @@ -301,6 +285,25 @@ public: return 0; } + /** + * Adds once server regardless of the discovery logic. + */ + void addServer(NodeID node_id) + { + UAVCAN_ASSERT((num_known_servers_ + 1) < MaxClusterSize); + if (!isKnownServer(node_id) && node_id.isUnicast()) + { + tracer_.onEvent(TraceRaftNewServerDiscovered, node_id.get()); + servers_[num_known_servers_].node_id = node_id; + servers_[num_known_servers_].resetIndices(log_); + num_known_servers_ = static_cast(num_known_servers_ + 1U); + } + else + { + UAVCAN_ASSERT(0); + } + } + /** * Whether such server has been discovered. */ diff --git a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp index a1600a9e16..8abdb8919e 100644 --- a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp +++ b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/distributed/raft_core.hpp @@ -457,9 +457,16 @@ private: { if (!cluster_.isKnownServer(request.getSrcNodeID())) { - trace(TraceRaftRequestIgnored, request.getSrcNodeID().get()); - response.setResponseEnabled(false); - return; + if (cluster_.isClusterDiscovered()) + { + trace(TraceRaftRequestIgnored, request.getSrcNodeID().get()); + response.setResponseEnabled(false); + return; + } + else + { + cluster_.addServer(request.getSrcNodeID()); + } } UAVCAN_ASSERT(response.isResponseEnabled()); // This is default