diff --git a/HTTPServer.cpp b/HTTPServer.cpp index c2a235fa..038f6321 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -238,7 +238,7 @@ namespace util void HTTPConnection::FillContent (std::stringstream& s) { s << "Data path: " << i2p::util::filesystem::GetDataDir().string() << "
" << "
"; - s << "Our external address:" << "
" << "
"; + s << "Our external address:" << "
"; for (auto& address : i2p::context.GetRouterInfo().GetAddresses()) { switch (address.transportStyle) @@ -254,7 +254,10 @@ namespace util } s << address.host.to_string() << ":" << address.port << "
"; } - + s << "
Routers: " << i2p::data::netdb.GetNumRouters () << " "; + s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << " "; + s << "LeaseSets: " << i2p::data::netdb.GetNumLeaseSets () << "
"; + s << "

Tunnels

"; for (auto it: i2p::tunnel::tunnels.GetOutboundTunnels ()) { diff --git a/NetDb.cpp b/NetDb.cpp index 553ee52b..e80c5f78 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -533,21 +533,21 @@ namespace data } void NetDb::Explore () - { - auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool (); - auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : nullptr; - auto inbound = exploratoryPool ? exploratoryPool->GetNextInboundTunnel () : nullptr; - if (outbound && inbound) - { - CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); - uint8_t randomHash[32]; - rnd.GenerateBlock (randomHash, 32); - RequestedDestination * dest = CreateRequestedDestination (IdentHash (randomHash), false, true); - dest->SetLastOutboundTunnel (outbound); - auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ()); - if (floodfill) + { + CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); + uint8_t randomHash[32]; + rnd.GenerateBlock (randomHash, 32); + RequestedDestination * dest = CreateRequestedDestination (IdentHash (randomHash), false, true); + auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ()); + if (floodfill) + { + LogPrint ("Exploring new routers ..."); + auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool (); + auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : nullptr; + auto inbound = exploratoryPool ? exploratoryPool->GetNextInboundTunnel () : nullptr; + if (outbound && inbound) { - LogPrint ("Exploring new routers ..."); + dest->SetLastOutboundTunnel (outbound); std::vector msgs; msgs.push_back (i2p::tunnel::TunnelMessageBlock { @@ -564,8 +564,14 @@ namespace data outbound->SendTunnelDataMsg (msgs); } else - DeleteRequestedDestination (dest); - } + { + dest->SetLastOutboundTunnel (nullptr); + dest->SetLastReplyTunnel (nullptr); + i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ())); + } + } + else + DeleteRequestedDestination (dest); } void NetDb::Publish () diff --git a/NetDb.h b/NetDb.h index 35fbe844..632affe3 100644 --- a/NetDb.h +++ b/NetDb.h @@ -33,6 +33,7 @@ namespace data void ClearExcludedPeers (); const RouterInfo * GetLastRouter () const { return m_LastRouter; }; const i2p::tunnel::InboundTunnel * GetLastReplyTunnel () const { return m_LastReplyTunnel; }; + void SetLastReplyTunnel (i2p::tunnel::InboundTunnel * tunnel) { m_LastReplyTunnel = tunnel; }; bool IsExploratory () const { return m_IsExploratory; }; bool IsLeaseSet () const { return m_IsLeaseSet; }; bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); }; @@ -78,6 +79,11 @@ namespace data const RouterInfo * GetRandomRouter (const RouterInfo * compatibleWith = nullptr, uint8_t caps = 0) const; void PostI2NPMsg (I2NPMessage * msg); + + // for web interface + int GetNumRouters () const { return m_RouterInfos.size (); }; + int GetNumFloodfills () const { return m_Floodfills.size (); }; + int GetNumLeaseSets () const { return m_LeaseSets.size (); }; private: