From 98ec789526691f094a754c09d710e2dd332a936c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Wed, 11 Oct 2017 16:51:42 +0200 Subject: [PATCH] nertwork engine: move tid management to Node --- include/opendht/network_engine.h | 11 ----------- include/opendht/node.h | 16 ++++++++++++++-- src/network_engine.cpp | 15 +++++++-------- src/node.cpp | 10 ++++++++++ src/request.h | 2 +- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/include/opendht/network_engine.h b/include/opendht/network_engine.h index 84dac9db..2e309927 100644 --- a/include/opendht/network_engine.h +++ b/include/opendht/network_engine.h @@ -454,16 +454,6 @@ private: */ void sendRequest(const Sp& request); - /** - * Generates a new request id, skipping the invalid id. - * - * @return the new id. - */ - uint16_t getNewTid() { - ++transaction_id; - return transaction_id == TransId::INVALID ? ++transaction_id : transaction_id; - } - struct MessageStats { unsigned ping {0}; unsigned find {0}; @@ -530,7 +520,6 @@ private: RateLimiter rate_limiter {}; // requests handling - uint16_t transaction_id {1}; std::map> requests {}; std::map partial_messages; diff --git a/include/opendht/node.h b/include/opendht/node.h index 6afdcd61..fa00d4dd 100644 --- a/include/opendht/node.h +++ b/include/opendht/node.h @@ -44,9 +44,9 @@ struct Node { time_point time {time_point::min()}; /* last time eared about */ time_point reply_time {time_point::min()}; /* time of last correct reply received */ + Node(const InfoHash& id, const SockAddr& addr); Node(const InfoHash& id, const sockaddr* sa, socklen_t salen) - : id(id), addr(sa, salen) {} - Node(const InfoHash& id, const SockAddr& addr) : id(id), addr(addr) {} + : Node(id, SockAddr(sa, salen)) {} InfoHash getId() const { return id; @@ -117,6 +117,16 @@ struct Node { */ void reset() { expired_ = false; reply_time = time_point::min(); } + /** + * Generates a new request id, skipping the invalid id. + * + * @return the new id. + */ + uint16_t getNewTid() { + ++transaction_id; + return transaction_id == net::TransId::INVALID ? ++transaction_id : transaction_id; + } + std::string toString() const; OPENDHT_PUBLIC friend std::ostream& operator<< (std::ostream& s, const Node& h); @@ -138,6 +148,8 @@ private: unsigned auth_errors {0}; bool expired_ {false}; + uint16_t transaction_id {1}; + using TransactionDist = std::uniform_int_distribution; }; } diff --git a/src/network_engine.cpp b/src/network_engine.cpp index 080fa737..40c6b5fd 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -196,7 +196,6 @@ NetworkEngine::NetworkEngine(InfoHash& myid, NetId net, int s, int s6, Logger& l if (!set_nonblocking(dht_socket6, 1)) throw DhtException("Can't set socket to non-blocking mode"); } - transaction_id = std::uniform_int_distribution{1}(rd_device); } NetworkEngine::~NetworkEngine() { @@ -629,7 +628,7 @@ NetworkEngine::send(const char *buf, size_t len, int flags, const SockAddr& addr Sp NetworkEngine::sendPing(Sp node, RequestCb&& on_done, RequestExpiredCb&& on_expired) { - auto tid = TransId {TransPrefix::PING, getNewTid()}; + auto tid = TransId {TransPrefix::PING, node->getNewTid()}; msgpack::sbuffer buffer; msgpack::packer pk(&buffer); pk.pack_map(5+(network?1:0)); @@ -689,7 +688,7 @@ NetworkEngine::sendPong(const SockAddr& addr, TransId tid) { Sp NetworkEngine::sendFindNode(Sp n, const InfoHash& target, want_t want, RequestCb&& on_done, RequestExpiredCb&& on_expired) { - auto tid = TransId {TransPrefix::FIND_NODE, getNewTid()}; + auto tid = TransId {TransPrefix::FIND_NODE, n->getNewTid()}; msgpack::sbuffer buffer; msgpack::packer pk(&buffer); pk.pack_map(5+(network?1:0)); @@ -735,7 +734,7 @@ NetworkEngine::sendFindNode(Sp n, const InfoHash& target, want_t want, Sp NetworkEngine::sendGetValues(Sp n, const InfoHash& info_hash, const Query& query, want_t want, RequestCb&& on_done, RequestExpiredCb&& on_expired) { - auto tid = TransId {TransPrefix::GET_VALUES, getNewTid()}; + auto tid = TransId {TransPrefix::GET_VALUES, n->getNewTid()}; msgpack::sbuffer buffer; msgpack::packer pk(&buffer); pk.pack_map(5+(network?1:0)); @@ -1011,13 +1010,13 @@ NetworkEngine::sendListen(Sp n, SocketCb&& socket_cb) { Sp socket; - auto tid = TransId { TransPrefix::LISTEN, previous ? previous->tid.getTid() : getNewTid() }; + auto tid = TransId { TransPrefix::LISTEN, previous ? previous->tid.getTid() : n->getNewTid() }; if (previous and previous->node == n) { socket = previous->socket; } else { if (previous) DHT_LOG.e(hash, "[node %s] trying refresh listen contract with wrong node", previous->node->toString().c_str()); - socket = n->openSocket(TransId {TransPrefix::GET_VALUES, getNewTid()}, std::move(socket_cb)); + socket = n->openSocket(TransPrefix::GET_VALUES, std::move(socket_cb)); } if (not socket) { @@ -1096,7 +1095,7 @@ NetworkEngine::sendAnnounceValue(Sp n, RequestCb&& on_done, RequestExpiredCb&& on_expired) { - auto tid = TransId {TransPrefix::ANNOUNCE_VALUES, getNewTid()}; + auto tid = TransId {TransPrefix::ANNOUNCE_VALUES, n->getNewTid()}; msgpack::sbuffer buffer; msgpack::packer pk(&buffer); pk.pack_map(5+(network?1:0)); @@ -1154,7 +1153,7 @@ NetworkEngine::sendRefreshValue(Sp n, RequestCb&& on_done, RequestExpiredCb&& on_expired) { - auto tid = TransId {TransPrefix::REFRESH, getNewTid()}; + auto tid = TransId {TransPrefix::REFRESH, n->getNewTid()}; msgpack::sbuffer buffer; msgpack::packer pk(&buffer); pk.pack_map(5+(network?1:0)); diff --git a/src/node.cpp b/src/node.cpp index a6bcc77e..6bb25d66 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -20,6 +20,7 @@ #include "node.h" #include "request.h" +#include "rng.h" #include @@ -29,6 +30,15 @@ constexpr std::chrono::minutes Node::NODE_EXPIRE_TIME; constexpr std::chrono::minutes Node::NODE_GOOD_TIME; constexpr std::chrono::seconds Node::MAX_RESPONSE_TIME; + +Node::Node(const InfoHash& id, const SockAddr& addr) +: id(id), + addr(addr) +{ + crypto::random_device rd; + transaction_id = TransactionDist{1}(rd); +} + /* This is our definition of a known-good node. */ bool Node::isGood(time_point now) const diff --git a/src/request.h b/src/request.h index 4604059f..d75554f1 100644 --- a/src/request.h +++ b/src/request.h @@ -76,7 +76,7 @@ struct Request { State getState() const { return state_; } Request(State state = State::PENDING) : state_(state) {} - Request(TransId tid, + Request(const TransId& tid, Sp node, Blob&& msg, std::function on_done,