Browse Source

don't request relay tag for every session if we have enough introducers

pull/2072/head
orignal 7 months ago
parent
commit
0b97b4294c
  1. 1
      libi2pd/SSU2.h
  2. 12
      libi2pd/SSU2Session.cpp

1
libi2pd/SSU2.h

@ -72,6 +72,7 @@ namespace transport
bool IsSupported (const boost::asio::ip::address& addr) const; bool IsSupported (const boost::asio::ip::address& addr) const;
uint16_t GetPort (bool v4) const; uint16_t GetPort (bool v4) const;
std::mt19937& GetRng () { return m_Rng; } std::mt19937& GetRng () { return m_Rng; }
bool IsMaxNumIntroducers (bool v4) const { return (v4 ? m_Introducers.size () : m_IntroducersV6.size ()) >= SSU2_MAX_NUM_INTRODUCERS; }
bool IsSyncClockFromPeers () const { return m_IsSyncClockFromPeers; }; bool IsSyncClockFromPeers () const { return m_IsSyncClockFromPeers; };
void AdjustTimeOffset (int64_t offset, std::shared_ptr<const i2p::data::IdentityEx> from); void AdjustTimeOffset (int64_t offset, std::shared_ptr<const i2p::data::IdentityEx> from);

12
libi2pd/SSU2Session.cpp

@ -680,10 +680,14 @@ namespace transport
size_t payloadSize = 7; size_t payloadSize = 7;
if (GetRouterStatus () == eRouterStatusFirewalled && m_Address->IsIntroducer ()) if (GetRouterStatus () == eRouterStatusFirewalled && m_Address->IsIntroducer ())
{ {
// relay tag request if (!m_Server.IsMaxNumIntroducers (m_RemoteEndpoint.address ().is_v4 ()) ||
payload[payloadSize] = eSSU2BlkRelayTagRequest; m_Server.GetRng ()() & 0x01) // request tag with probability 1/2 if we have enough introducers
memset (payload + payloadSize + 1, 0, 2); // size = 0 {
payloadSize += 3; // relay tag request
payload[payloadSize] = eSSU2BlkRelayTagRequest;
memset (payload + payloadSize + 1, 0, 2); // size = 0
payloadSize += 3;
}
} }
payloadSize += CreatePaddingBlock (payload + payloadSize, 40 - payloadSize, 1); payloadSize += CreatePaddingBlock (payload + payloadSize, 40 - payloadSize, 1);
// KDF for session request // KDF for session request

Loading…
Cancel
Save