diff --git a/LeaseSet.cpp b/LeaseSet.cpp index 2b75b463..b62a4598 100644 --- a/LeaseSet.cpp +++ b/LeaseSet.cpp @@ -57,13 +57,13 @@ namespace data LogPrint ("LeaseSet verification failed"); } - std::vector LeaseSet::GetNonExpiredLeases () const + std::set LeaseSet::GetNonExpiredLeases () const { auto ts = i2p::util::GetMillisecondsSinceEpoch (); - std::vector leases; + std::set leases; for (auto& it: m_Leases) if (ts < it.endDate) - leases.push_back (it); + leases.insert (it); return leases; } diff --git a/LeaseSet.h b/LeaseSet.h index 294e32d0..6bcc8122 100644 --- a/LeaseSet.h +++ b/LeaseSet.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "Identity.h" namespace i2p @@ -18,6 +19,14 @@ namespace data uint8_t tunnelGateway[32]; uint32_t tunnelID; uint64_t endDate; + + bool operator< (const Lease& other) const + { + if (endDate != other.endDate) + return endDate > other.endDate; + else + return tunnelID < other.tunnelID; + } }; #pragma pack() @@ -34,7 +43,7 @@ namespace data const Identity& GetIdentity () const { return m_Identity; }; const IdentHash& GetIdentHash () const { return m_IdentHash; }; const std::vector& GetLeases () const { return m_Leases; }; - std::vector GetNonExpiredLeases () const; + std::set GetNonExpiredLeases () const; bool HasExpiredLeases () const; bool HasNonExpiredLeases () const; const uint8_t * GetEncryptionPublicKey () const { return m_EncryptionKey; }; diff --git a/Streaming.cpp b/Streaming.cpp index 5d59b6f0..c7cd9ad3 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -173,9 +173,10 @@ namespace stream if (!m_OutboundTunnel) m_OutboundTunnel = i2p::tunnel::tunnels.GetNextOutboundTunnel (); - if (m_OutboundTunnel) + auto leases = m_RemoteLeaseSet->GetNonExpiredLeases (); + if (m_OutboundTunnel && !leases.empty ()) { - auto& lease = m_RemoteLeaseSet->GetLeases ()[0]; // TODO: + auto& lease = *leases.begin (); // TODO: m_OutboundTunnel->SendTunnelDataMsg (lease.tunnelGateway, lease.tunnelID, msg); } else @@ -209,7 +210,7 @@ namespace stream auto leases = m_RemoteLeaseSet->GetNonExpiredLeases (); if (!leases.empty ()) { - auto& lease = leases[0]; // TODO: + auto& lease = *leases.begin (); // TODO: m_OutboundTunnel->SendTunnelDataMsg (lease.tunnelGateway, lease.tunnelID, msg); LogPrint ("Quick Ack sent"); } @@ -252,11 +253,12 @@ namespace stream I2NPMessage * msg = i2p::garlic::routing.WrapSingleMessage (m_RemoteLeaseSet, CreateDataMessage (this, packet, size)); - if (m_OutboundTunnel) + auto leases = m_RemoteLeaseSet->GetNonExpiredLeases (); + if (m_OutboundTunnel && !leases.empty ()) { - auto& lease = m_RemoteLeaseSet->GetLeases ()[0]; // TODO: + auto& lease = *leases.begin (); // TODO: m_OutboundTunnel->SendTunnelDataMsg (lease.tunnelGateway, lease.tunnelID, msg); - LogPrint ("FIN sent"); + LogPrint ("FIN sent"); } else DeleteI2NPMessage (msg);