diff --git a/Destination.h b/Destination.h index 7f3a904a..229a5943 100644 --- a/Destination.h +++ b/Destination.h @@ -88,6 +88,7 @@ namespace client // implements GarlicDestination const i2p::data::LeaseSet * GetLeaseSet (); + std::shared_ptr GetTunnelPool () const { return m_Pool; } void HandleI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr from); // override GarlicDestination diff --git a/Garlic.cpp b/Garlic.cpp index 87c7ae2a..c86947d1 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -297,16 +297,15 @@ namespace garlic size_t size = 0; if (m_Owner) { - auto leases = m_Owner->GetLeaseSet ()->GetNonExpiredLeases (); - if (!leases.empty ()) + auto inboundTunnel = m_Owner->GetTunnelPool ()->GetNextInboundTunnel (); + if (inboundTunnel) { buf[size] = eGarlicDeliveryTypeTunnel << 5; // delivery instructions flag tunnel size++; - uint32_t i = m_Rnd.GenerateWord32 (0, leases.size () - 1); // hash and tunnelID sequence is reversed for Garlic - memcpy (buf + size, leases[i].tunnelGateway, 32); // To Hash + memcpy (buf + size, inboundTunnel->GetNextIdentHash (), 32); // To Hash size += 32; - htobe32buf (buf + size, leases[i].tunnelID); // tunnelID + htobe32buf (buf + size, inboundTunnel->GetNextTunnelID ()); // tunnelID size += 4; // create msg I2NPMessage * msg = CreateDeliveryStatusMsg (msgID); @@ -333,7 +332,7 @@ namespace garlic size += 3; } else - LogPrint ("All tunnels of local LeaseSet expired"); + LogPrint (eLogError, "No inbound tunnels in the pool for DeliveryStatus"); } else LogPrint ("Missing local LeaseSet"); diff --git a/Garlic.h b/Garlic.h index 4b02d987..bb60a776 100644 --- a/Garlic.h +++ b/Garlic.h @@ -110,7 +110,7 @@ namespace garlic i2p::crypto::CBCEncryption m_Encryption; CryptoPP::AutoSeededRandomPool m_Rnd; }; - + class GarlicDestination: public i2p::data::LocalDestination { public: @@ -133,6 +133,7 @@ namespace garlic virtual void SetLeaseSetUpdated (); virtual const i2p::data::LeaseSet * GetLeaseSet () = 0; // TODO + virtual std::shared_ptr GetTunnelPool () const = 0; virtual void HandleI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr from) = 0; protected: diff --git a/RouterContext.cpp b/RouterContext.cpp index e3cd358d..d2659016 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -289,6 +289,11 @@ namespace i2p fk.write ((char *)&keys, sizeof (keys)); } + std::shared_ptr RouterContext::GetTunnelPool () const + { + return i2p::tunnel::tunnels.GetExploratoryPool (); + } + void RouterContext::HandleI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr from) { i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from)); diff --git a/RouterContext.h b/RouterContext.h index 7492a4e2..81ef4867 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -73,6 +73,7 @@ namespace i2p // implements GarlicDestination const i2p::data::LeaseSet * GetLeaseSet () { return nullptr; }; + std::shared_ptr GetTunnelPool () const; void HandleI2NPMessage (const uint8_t * buf, size_t len, std::shared_ptr from); private: