From ff72487b02c01de0c2a6ea416a2f23637bc6ef6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20D=C3=A9saulniers?= Date: Tue, 15 Mar 2016 11:29:42 -0400 Subject: [PATCH] fix no values sent in response to 'find' request This was due to using the wrong InfoHash field from the ParsedMessage when responding to 'find' request. --- include/opendht/network_engine.h | 26 +++++++++++++------------- src/dht.cpp | 21 +++++++++++---------- src/network_engine.cpp | 4 ++-- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/include/opendht/network_engine.h b/include/opendht/network_engine.h index 652ff8ff..96ba3f65 100644 --- a/include/opendht/network_engine.h +++ b/include/opendht/network_engine.h @@ -406,20 +406,20 @@ private: struct ParsedMessage { MessageType type; - InfoHash id; - InfoHash info_hash; - InfoHash target; - TransId tid; - Blob token; - Value::Id value_id; - time_point created { time_point::max() }; - Blob nodes4; - Blob nodes6; - std::vector> values; - want_t want; - uint16_t error_code; + InfoHash id; /* the id of the sender */ + InfoHash info_hash; /* hash for which values are requested */ + InfoHash target; /* target id around which to find nodes */ + TransId tid; /* transaction id */ + Blob token; /* security token */ + Value::Id value_id; /* the value id */ + time_point created { time_point::max() }; /* time when value was first created */ + Blob nodes4; /* IPv4 nodes in response to a 'find' request */ + Blob nodes6; /* IPv6 nodes in response to a 'find' request */ + std::vector> values; /* values for a 'get' request */ + want_t want; /* states if ipv4 or ipv6 request */ + uint16_t error_code; /* error code in case of error */ std::string ua; - Address addr; + Address addr; /* reported address by the distant node */ void msgpack_unpack(msgpack::object o); }; diff --git a/src/dht.cpp b/src/dht.cpp index 41d232c3..e1fa651a 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -2600,17 +2600,17 @@ Dht::onPing(std::shared_ptr) } NetworkEngine::RequestAnswer -Dht::onFindNode(std::shared_ptr node, InfoHash& hash, want_t want) +Dht::onFindNode(std::shared_ptr node, InfoHash& target, want_t want) { const auto& now = scheduler.time(); Blob ntoken = makeToken((sockaddr*)&node->ss, false); std::vector> nodes, nodes6; if (want & WANT4) { - auto tmp = buckets.findClosestNodes(hash, now, TARGET_NODES); + auto tmp = buckets.findClosestNodes(target, now, TARGET_NODES); nodes.insert(nodes.begin(), tmp.begin(), tmp.end()); } if (want & WANT6) { - auto tmp = buckets6.findClosestNodes(hash, now, TARGET_NODES); + auto tmp = buckets6.findClosestNodes(target, now, TARGET_NODES); nodes6.insert(nodes6.begin(), tmp.begin(), tmp.end()); } return NetworkEngine::RequestAnswer {ntoken, Value::INVALID_ID, {}, std::move(nodes), std::move(nodes6)}; @@ -2620,7 +2620,7 @@ NetworkEngine::RequestAnswer Dht::onGetValues(std::shared_ptr node, InfoHash& hash, want_t) { const auto& now = scheduler.time(); - NetworkEngine::RequestAnswer* answer; + std::shared_ptr answer {}; if (hash == zeroes) { DHT_LOG.WARN("[node %s %s] Eek! Got get_values with no info_hash.", node->id.toString().c_str(), print_addr(node->ss, node->sslen).c_str()); @@ -2628,12 +2628,12 @@ Dht::onGetValues(std::shared_ptr node, InfoHash& hash, want_t) } else { auto st = findStorage(hash); Blob ntoken = makeToken((sockaddr*)&node->ss, false); - answer = new NetworkEngine::RequestAnswer { - ntoken, - 0, - {}, - buckets.findClosestNodes(hash, now, TARGET_NODES), - buckets6.findClosestNodes(hash, now, TARGET_NODES) + answer = std::shared_ptr { + new NetworkEngine::RequestAnswer { + ntoken, 0, {}, + buckets.findClosestNodes(hash, now, TARGET_NODES), + buckets6.findClosestNodes(hash, now, TARGET_NODES) + } }; if (st != store.end() && not st->empty()) { DHT_LOG.DEBUG("[node %s %s] sending %u values.", @@ -2657,6 +2657,7 @@ Dht::onGetValuesDone(std::shared_ptr status, Netwo if (not sr) return; + DHT_LOG.DEBUG("[search %s IPv%c] got reply to 'get'", sr->id.toString().c_str(), sr->af == AF_INET ? '4' : '6'); const auto& now = scheduler.time(); sr->insertNode(status->node, now, a.ntoken); for (auto& sn : sr->nodes) { diff --git a/src/network_engine.cpp b/src/network_engine.cpp index a9e5ef6c..ffa3581e 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -176,7 +176,7 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr DHT_LOG.DEBUG("[node %s %s] got 'find' request (%d).", msg.id.toString().c_str(), print_addr(from, fromlen).c_str(), msg.want); ++in_stats.find; - RequestAnswer answer = onFindNode(node, msg.info_hash, msg.want); + RequestAnswer answer = onFindNode(node, msg.target, msg.want); auto nnodes = bufferNodes(from->sa_family, msg.target, msg.want, answer.nodes, answer.nodes6); sendNodesValues(from, fromlen, msg.tid, nnodes.first, nnodes.second, {}, answer.ntoken); break; @@ -186,7 +186,7 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr node->id.toString().c_str(), print_addr(node->ss, node->sslen).c_str(), msg.info_hash.toString().c_str()); ++in_stats.get; RequestAnswer answer = onGetValues(node, msg.info_hash, msg.want); - auto nnodes = bufferNodes(from->sa_family, msg.target, msg.want, answer.nodes, answer.nodes6); + auto nnodes = bufferNodes(from->sa_family, msg.info_hash, msg.want, answer.nodes, answer.nodes6); sendNodesValues(from, fromlen, msg.tid, nnodes.first, nnodes.second, answer.values, answer.ntoken); break; }