|
|
@ -9,6 +9,7 @@ |
|
|
|
#include "Timestamp.h" |
|
|
|
#include "Timestamp.h" |
|
|
|
#include "I2NPProtocol.h" |
|
|
|
#include "I2NPProtocol.h" |
|
|
|
#include "Tunnel.h" |
|
|
|
#include "Tunnel.h" |
|
|
|
|
|
|
|
#include "Transports.h" |
|
|
|
#include "RouterContext.h" |
|
|
|
#include "RouterContext.h" |
|
|
|
#include "Garlic.h" |
|
|
|
#include "Garlic.h" |
|
|
|
#include "NetDb.h" |
|
|
|
#include "NetDb.h" |
|
|
@ -30,6 +31,16 @@ namespace data |
|
|
|
m_LastReplyTunnel = replyTunnel; |
|
|
|
m_LastReplyTunnel = replyTunnel; |
|
|
|
return msg; |
|
|
|
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; |
|
|
|
NetDb netdb; |
|
|
|
|
|
|
|
|
|
|
@ -252,44 +263,49 @@ namespace data |
|
|
|
|
|
|
|
|
|
|
|
void NetDb::RequestDestination (const IdentHash& destination, bool isLeaseSet) |
|
|
|
void NetDb::RequestDestination (const IdentHash& destination, bool isLeaseSet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
i2p::tunnel::OutboundTunnel * outbound = i2p::tunnel::tunnels.GetNextOutboundTunnel (); |
|
|
|
if (isLeaseSet) // we request LeaseSet through tunnels
|
|
|
|
if (outbound) |
|
|
|
{ |
|
|
|
{ |
|
|
|
i2p::tunnel::OutboundTunnel * outbound = i2p::tunnel::tunnels.GetNextOutboundTunnel (); |
|
|
|
i2p::tunnel::InboundTunnel * inbound = i2p::tunnel::tunnels.GetNextInboundTunnel (); |
|
|
|
if (outbound) |
|
|
|
if (inbound) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
RequestedDestination * dest = CreateRequestedDestination (destination, isLeaseSet); |
|
|
|
i2p::tunnel::InboundTunnel * inbound = i2p::tunnel::tunnels.GetNextInboundTunnel (); |
|
|
|
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ()); |
|
|
|
if (inbound) |
|
|
|
if (floodfill) |
|
|
|
{ |
|
|
|
{ |
|
|
|
RequestedDestination * dest = CreateRequestedDestination (destination, isLeaseSet); |
|
|
|
std::vector<i2p::tunnel::TunnelMessageBlock> msgs; |
|
|
|
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ()); |
|
|
|
// our RouterInfo
|
|
|
|
if (floodfill) |
|
|
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<i2p::tunnel::TunnelMessageBlock> msgs; |
|
|
|
i2p::tunnel::eDeliveryTypeRouter, |
|
|
|
// DatabaseLookup message
|
|
|
|
floodfill->GetIdentHash (), 0, |
|
|
|
dest->SetLastOutboundTunnel (outbound); |
|
|
|
CreateDatabaseStoreMsg () |
|
|
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock |
|
|
|
}); |
|
|
|
{ |
|
|
|
|
|
|
|
i2p::tunnel::eDeliveryTypeRouter, |
|
|
|
// DatabaseLookup message
|
|
|
|
floodfill->GetIdentHash (), 0, |
|
|
|
dest->SetLastOutboundTunnel (outbound); |
|
|
|
dest->CreateRequestMessage (floodfill, inbound) |
|
|
|
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 |
|
|
|
else |
|
|
|
LogPrint ("No more floodfills found"); |
|
|
|
LogPrint ("No inbound tunnels found"); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
LogPrint ("No inbound tunnels found"); |
|
|
|
LogPrint ("No outbound tunnels found"); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else // RouterInfo is requested directly
|
|
|
|
LogPrint ("No outbound tunnels found"); |
|
|
|
{ |
|
|
|
|
|
|
|
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) |
|
|
|
void NetDb::HandleDatabaseStoreMsg (uint8_t * buf, size_t len) |
|
|
@ -402,11 +418,18 @@ namespace data |
|
|
|
dest->GetLastRouter ()->GetIdentHash (), 0, msg |
|
|
|
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); |
|
|
|
outbound->SendTunnelDataMsg (msgs); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|