diff --git a/NetDb.cpp b/NetDb.cpp index 4a460d8f..38814549 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -9,6 +9,7 @@ #include "Timestamp.h" #include "I2NPProtocol.h" #include "Tunnel.h" +#include "Transports.h" #include "RouterContext.h" #include "Garlic.h" #include "NetDb.h" @@ -30,6 +31,16 @@ namespace data m_LastReplyTunnel = replyTunnel; return msg; } + + I2NPMessage * RequestedDestination::CreateRequestMessage (const IdentHash& floodfill) + { + I2NPMessage * msg = i2p::CreateDatabaseLookupMsg (m_Destination, + i2p::context.GetRouterInfo ().GetIdentHash () , 0, false, &m_ExcludedPeers); + m_ExcludedPeers.insert (floodfill); + m_LastRouter = nullptr; + m_LastReplyTunnel = nullptr; + return msg; + } NetDb netdb; @@ -252,44 +263,49 @@ namespace data void NetDb::RequestDestination (const IdentHash& destination, bool isLeaseSet) { - i2p::tunnel::OutboundTunnel * outbound = i2p::tunnel::tunnels.GetNextOutboundTunnel (); - if (outbound) - { - i2p::tunnel::InboundTunnel * inbound = i2p::tunnel::tunnels.GetNextInboundTunnel (); - if (inbound) + if (isLeaseSet) // we request LeaseSet through tunnels + { + i2p::tunnel::OutboundTunnel * outbound = i2p::tunnel::tunnels.GetNextOutboundTunnel (); + if (outbound) { - RequestedDestination * dest = CreateRequestedDestination (destination, isLeaseSet); - 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) - }); + i2p::tunnel::InboundTunnel * inbound = i2p::tunnel::tunnels.GetNextInboundTunnel (); + if (inbound) + { + RequestedDestination * dest = CreateRequestedDestination (destination, isLeaseSet); + auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ()); + if (floodfill) + { + std::vector msgs; + // DatabaseLookup message + dest->SetLastOutboundTunnel (outbound); + msgs.push_back (i2p::tunnel::TunnelMessageBlock + { + i2p::tunnel::eDeliveryTypeRouter, + floodfill->GetIdentHash (), 0, + dest->CreateRequestMessage (floodfill, inbound) + }); - outbound->SendTunnelDataMsg (msgs); + outbound->SendTunnelDataMsg (msgs); + } + else + LogPrint ("No more floodfills found"); } else - LogPrint ("No more floodfills found"); - } + LogPrint ("No inbound tunnels found"); + } else - LogPrint ("No inbound tunnels found"); - } - else - LogPrint ("No outbound tunnels found"); + LogPrint ("No outbound tunnels found"); + } + else // RouterInfo is requested directly + { + RequestedDestination * dest = CreateRequestedDestination (destination, false); + auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ()); + if (floodfill) + { + dest->SetLastOutboundTunnel (nullptr); + i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ())); + } + } } void NetDb::HandleDatabaseStoreMsg (uint8_t * buf, size_t len) @@ -402,11 +418,18 @@ namespace data dest->GetLastRouter ()->GetIdentHash (), 0, msg }); } + } + else // we should send directly + { + if (!dest->IsLeaseSet ()) // if not LeaseSet + i2p::transports.SendMessage (router, dest->CreateRequestMessage (router)); + else + LogPrint ("Can't request LeaseSet"); } } } - if (msgs.size () > 0) + if (outbound && msgs.size () > 0) outbound->SendTunnelDataMsg (msgs); } else diff --git a/NetDb.h b/NetDb.h index 7f56c169..7baebc5d 100644 --- a/NetDb.h +++ b/NetDb.h @@ -30,9 +30,11 @@ namespace data const RouterInfo * GetLastRouter () const { return m_LastRouter; }; const i2p::tunnel::InboundTunnel * GetLastReplyTunnel () const { return m_LastReplyTunnel; }; bool IsExploratory () const { return m_IsExploratory; }; + bool IsLeaseSet () const { return m_IsLeaseSet; }; bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); }; I2NPMessage * CreateRequestMessage (const RouterInfo * router, const i2p::tunnel::InboundTunnel * replyTunnel); - + I2NPMessage * CreateRequestMessage (const IdentHash& floodfill); + i2p::tunnel::OutboundTunnel * GetLastOutboundTunnel () const { return m_LastOutboundTunnel; }; void SetLastOutboundTunnel (i2p::tunnel::OutboundTunnel * tunnel) { m_LastOutboundTunnel = tunnel; };