From a65400471aeefb356cfdc61bbf0b2b2a0b866653 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 22 Jan 2014 07:44:41 -0500 Subject: [PATCH] use kademlia to pick floodfill for destination --- NetDb.cpp | 43 ++++++++++++++++++++++++++++--------------- NetDb.h | 8 ++++---- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/NetDb.cpp b/NetDb.cpp index 9b454598..6cf9e251 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -239,16 +239,6 @@ namespace data void NetDb::RequestDestination (const IdentHash& destination, bool isLeaseSet) { - auto floodfill= GetRandomNTCPRouter (true); - if (floodfill) - RequestDestination (destination, floodfill, isLeaseSet); - else - LogPrint ("No floodfill routers found"); - } - - void NetDb::RequestDestination (const IdentHash& destination, const RouterInfo * floodfill, bool isLeaseSet) - { - if (!floodfill) return; i2p::tunnel::OutboundTunnel * outbound = i2p::tunnel::tunnels.GetNextOutboundTunnel (); if (outbound) { @@ -256,9 +246,31 @@ namespace data if (inbound) { RequestedDestination * dest = CreateRequestedDestination (destination, isLeaseSet); - dest->SetLastOutboundTunnel (outbound); - auto msg = dest->CreateRequestMessage (floodfill, inbound); - outbound->SendTunnelDataMsg (floodfill->GetIdentHash (), 0, msg); + auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ()); + if (floodfill) + { + std::vector msgs; + // our RouterInfo + msgs.push_back (i2p::tunnel::TunnelMessageBlock + { + i2p::tunnel::eDeliveryTypeRouter, + floodfill->GetIdentHash (), 0, + CreateDatabaseStoreMsg () + }); + + // DatabaseLookup message + dest->SetLastOutboundTunnel (outbound); + msgs.push_back (i2p::tunnel::TunnelMessageBlock + { + i2p::tunnel::eDeliveryTypeRouter, + floodfill->GetIdentHash (), 0, + dest->CreateRequestMessage (floodfill, inbound) + }); + + outbound->SendTunnelDataMsg (msgs); + } + else + LogPrint ("No more floodfills found"); } else LogPrint ("No inbound tunnels found"); @@ -487,7 +499,8 @@ namespace data if (msg) m_Queue.Put (msg); } - const RouterInfo * NetDb::GetClosestFloodfill (const IdentHash& destination) const + const RouterInfo * NetDb::GetClosestFloodfill (const IdentHash& destination, + const std::set& excluded) const { RouterInfo * r = nullptr; XORMetric minMetric; @@ -495,7 +508,7 @@ namespace data minMetric.SetMax (); for (auto it: m_RouterInfos) { - if (it.second->IsFloodfill () &&! it.second->IsUnreachable ()) + if (it.second->IsFloodfill () &&! it.second->IsUnreachable () && !excluded.count (it.first)) { XORMetric m = destKey ^ it.second->GetRoutingKey (); if (m < minMetric) diff --git a/NetDb.h b/NetDb.h index 02a585ef..75c2c81b 100644 --- a/NetDb.h +++ b/NetDb.h @@ -26,7 +26,8 @@ namespace data const IdentHash& GetDestination () const { return m_Destination; }; int GetNumExcludedPeers () const { return m_ExcludedPeers.size (); }; - const RouterInfo * GetLastRouter () const { return m_LastRouter; }; + const std::set& GetExcludedPeers () { return m_ExcludedPeers; }; + const RouterInfo * GetLastRouter () const { return m_LastRouter; }; const i2p::tunnel::InboundTunnel * GetLastReplyTunnel () const { return m_LastReplyTunnel; }; bool IsExploratory () const { return m_IsExploratory; }; bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); }; @@ -62,8 +63,7 @@ namespace data void RequestDestination (const char * b32); // in base32 void RequestDestination (const IdentHash& destination, bool isLeaseSet = false); - void RequestDestination (const IdentHash& destination, const RouterInfo * floodfill, bool isLeaseSet = false); - + void HandleDatabaseStoreMsg (uint8_t * buf, size_t len); void HandleDatabaseSearchReplyMsg (I2NPMessage * msg); @@ -78,7 +78,7 @@ namespace data void SaveUpdated (const char * directory); void Run (); // exploratory thread void Explore (); - const RouterInfo * GetClosestFloodfill (const IdentHash& destination) const; + const RouterInfo * GetClosestFloodfill (const IdentHash& destination, const std::set& excluded) const; RequestedDestination * CreateRequestedDestination (const IdentHash& dest, bool isLeaseSet, bool isExploratory = false);