mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
don't include expired lease to LeaseSet for I2Cp
This commit is contained in:
parent
0191e58b05
commit
ff5c76f8f2
@ -728,25 +728,41 @@ namespace data
|
|||||||
memset (m_Buffer + offset, 0, signingKeyLen);
|
memset (m_Buffer + offset, 0, signingKeyLen);
|
||||||
offset += signingKeyLen;
|
offset += signingKeyLen;
|
||||||
// num leases
|
// num leases
|
||||||
|
auto numLeasesPos = offset;
|
||||||
m_Buffer[offset] = num;
|
m_Buffer[offset] = num;
|
||||||
offset++;
|
offset++;
|
||||||
// leases
|
// leases
|
||||||
m_Leases = m_Buffer + offset;
|
m_Leases = m_Buffer + offset;
|
||||||
auto currentTime = i2p::util::GetMillisecondsSinceEpoch ();
|
auto currentTime = i2p::util::GetMillisecondsSinceEpoch ();
|
||||||
|
int skipped = 0;
|
||||||
for (int i = 0; i < num; i++)
|
for (int i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
|
uint64_t ts = tunnels[i]->GetCreationTime () + i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT - i2p::tunnel::TUNNEL_EXPIRATION_THRESHOLD; // 1 minute before expiration
|
||||||
|
ts *= 1000; // in milliseconds
|
||||||
|
if (ts <= currentTime)
|
||||||
|
{
|
||||||
|
// already expired, skip
|
||||||
|
skipped++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ts > m_ExpirationTime) m_ExpirationTime = ts;
|
||||||
|
// make sure leaseset is newer than previous, but adding some time to expiration date
|
||||||
|
ts += (currentTime - tunnels[i]->GetCreationTime ()*1000LL)*2/i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT; // up to 2 secs
|
||||||
memcpy (m_Buffer + offset, tunnels[i]->GetNextIdentHash (), 32);
|
memcpy (m_Buffer + offset, tunnels[i]->GetNextIdentHash (), 32);
|
||||||
offset += 32; // gateway id
|
offset += 32; // gateway id
|
||||||
htobe32buf (m_Buffer + offset, tunnels[i]->GetNextTunnelID ());
|
htobe32buf (m_Buffer + offset, tunnels[i]->GetNextTunnelID ());
|
||||||
offset += 4; // tunnel id
|
offset += 4; // tunnel id
|
||||||
uint64_t ts = tunnels[i]->GetCreationTime () + i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT - i2p::tunnel::TUNNEL_EXPIRATION_THRESHOLD; // 1 minute before expiration
|
|
||||||
ts *= 1000; // in milliseconds
|
|
||||||
if (ts > m_ExpirationTime) m_ExpirationTime = ts;
|
|
||||||
// make sure leaseset is newer than previous, but adding some time to expiration date
|
|
||||||
ts += (currentTime - tunnels[i]->GetCreationTime ()*1000LL)*2/i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT; // up to 2 secs
|
|
||||||
htobe64buf (m_Buffer + offset, ts);
|
htobe64buf (m_Buffer + offset, ts);
|
||||||
offset += 8; // end date
|
offset += 8; // end date
|
||||||
}
|
}
|
||||||
|
if (skipped > 0)
|
||||||
|
{
|
||||||
|
// adjust num leases
|
||||||
|
if (skipped > num) skipped = num;
|
||||||
|
num -= skipped;
|
||||||
|
m_BufferLen -= skipped*LEASE_SIZE;
|
||||||
|
m_Buffer[numLeasesPos] = num;
|
||||||
|
}
|
||||||
// we don't sign it yet. must be signed later on
|
// we don't sign it yet. must be signed later on
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,15 +102,15 @@ namespace client
|
|||||||
i2p::data::LocalLeaseSet ls (m_Identity, priv, tunnels); // we don't care about encryption key, we need leases only
|
i2p::data::LocalLeaseSet ls (m_Identity, priv, tunnels); // we don't care about encryption key, we need leases only
|
||||||
m_LeaseSetExpirationTime = ls.GetExpirationTime ();
|
m_LeaseSetExpirationTime = ls.GetExpirationTime ();
|
||||||
uint8_t * leases = ls.GetLeases ();
|
uint8_t * leases = ls.GetLeases ();
|
||||||
leases[-1] = tunnels.size ();
|
int numLeases = leases[-1];
|
||||||
if (m_Owner)
|
if (m_Owner && numLeases)
|
||||||
{
|
{
|
||||||
uint16_t sessionID = m_Owner->GetSessionID ();
|
uint16_t sessionID = m_Owner->GetSessionID ();
|
||||||
if (sessionID != 0xFFFF)
|
if (sessionID != 0xFFFF)
|
||||||
{
|
{
|
||||||
m_IsCreatingLeaseSet = true;
|
m_IsCreatingLeaseSet = true;
|
||||||
htobe16buf (leases - 3, sessionID);
|
htobe16buf (leases - 3, sessionID);
|
||||||
size_t l = 2/*sessionID*/ + 1/*num leases*/ + i2p::data::LEASE_SIZE*tunnels.size ();
|
size_t l = 2/*sessionID*/ + 1/*num leases*/ + i2p::data::LEASE_SIZE*numLeases;
|
||||||
m_Owner->SendI2CPMessage (I2CP_REQUEST_VARIABLE_LEASESET_MESSAGE, leases - 3, l);
|
m_Owner->SendI2CPMessage (I2CP_REQUEST_VARIABLE_LEASESET_MESSAGE, leases - 3, l);
|
||||||
m_LeaseSetCreationTimer.expires_from_now (boost::posix_time::seconds (I2CP_LEASESET_CREATION_TIMEOUT));
|
m_LeaseSetCreationTimer.expires_from_now (boost::posix_time::seconds (I2CP_LEASESET_CREATION_TIMEOUT));
|
||||||
auto s = GetSharedFromThis ();
|
auto s = GetSharedFromThis ();
|
||||||
@ -124,6 +124,8 @@ namespace client
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
LogPrint (eLogError, "I2CP: Can't request LeaseSet");
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2CPDestination::LeaseSetCreated (const uint8_t * buf, size_t len)
|
void I2CPDestination::LeaseSetCreated (const uint8_t * buf, size_t len)
|
||||||
|
Loading…
Reference in New Issue
Block a user