mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-04-28 11:47:48 +02:00
update introducer's iTag is session to introducer was replaced to new one
This commit is contained in:
parent
c3a1631319
commit
64e4b3871a
6 changed files with 48 additions and 13 deletions
|
@ -1212,14 +1212,14 @@ namespace transport
|
|||
void SSU2Server::UpdateIntroducers (bool v4)
|
||||
{
|
||||
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||
std::list<i2p::data::IdentHash> newList, impliedList;
|
||||
std::list<std::pair<i2p::data::IdentHash, uint32_t> > newList, impliedList;
|
||||
auto& introducers = v4 ? m_Introducers : m_IntroducersV6;
|
||||
std::unordered_set<i2p::data::IdentHash> excluded;
|
||||
for (const auto& it : introducers)
|
||||
for (const auto& [ident, tag] : introducers)
|
||||
{
|
||||
std::shared_ptr<SSU2Session> session = FindSession (it);
|
||||
std::shared_ptr<SSU2Session> session = FindSession (ident);
|
||||
if (session)
|
||||
excluded.insert (it);
|
||||
excluded.insert (ident);
|
||||
if (session)
|
||||
{
|
||||
if (session->IsEstablished () && session->GetRelayTag () && session->IsOutgoing () && // still session with introducer?
|
||||
|
@ -1227,19 +1227,27 @@ namespace transport
|
|||
{
|
||||
session->SendKeepAlive ();
|
||||
if (ts < session->GetCreationTime () + SSU2_TO_INTRODUCER_SESSION_DURATION)
|
||||
newList.push_back (it);
|
||||
{
|
||||
newList.push_back ({ident, session->GetRelayTag ()});
|
||||
if (tag != session->GetRelayTag ())
|
||||
{
|
||||
LogPrint (eLogDebug, "SSU2: Introducer session to ", session->GetIdentHashBase64() , " was replaced. iTag ", tag, "->", session->GetRelayTag ());
|
||||
i2p::context.UpdateSSU2Introducer (ident, v4, session->GetRelayTag (),
|
||||
session->GetCreationTime () + SSU2_TO_INTRODUCER_SESSION_EXPIRATION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
impliedList.push_back (it); // keep in introducers list, but not publish
|
||||
impliedList.push_back ({ident, session->GetRelayTag ()}); // keep in introducers list, but not publish
|
||||
session = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
session = nullptr;
|
||||
}
|
||||
|
||||
if (!session)
|
||||
i2p::context.RemoveSSU2Introducer (it, v4);
|
||||
i2p::context.RemoveSSU2Introducer (ident, v4);
|
||||
}
|
||||
if (newList.size () < SSU2_MAX_NUM_INTRODUCERS)
|
||||
{
|
||||
|
@ -1249,13 +1257,14 @@ namespace transport
|
|||
// bump creation time for previous introducers if no new sessions found
|
||||
LogPrint (eLogDebug, "SSU2: No new introducers found. Trying to reuse existing");
|
||||
impliedList.clear ();
|
||||
for (auto& it : introducers)
|
||||
for (const auto& [ident, tag] : introducers)
|
||||
{
|
||||
auto session = FindSession (it);
|
||||
auto session = FindSession (ident);
|
||||
if (session && session->IsEstablished () && session->GetRelayTag () && session->IsOutgoing ())
|
||||
{
|
||||
session->SetCreationTime (session->GetCreationTime () + SSU2_TO_INTRODUCER_SESSION_DURATION);
|
||||
if (std::find (newList.begin (), newList.end (), it) == newList.end ())
|
||||
if (std::find_if (newList.begin (), newList.end (),
|
||||
[&ident](const auto& s){ return ident == s.first; }) == newList.end ())
|
||||
sessions.push_back (session);
|
||||
}
|
||||
}
|
||||
|
@ -1276,7 +1285,7 @@ namespace transport
|
|||
{
|
||||
LogPrint (eLogDebug, "SSU2: Introducer added ", it->GetRelayTag (), " at ",
|
||||
i2p::data::GetIdentHashAbbreviation (it->GetRemoteIdentity ()->GetIdentHash ()));
|
||||
newList.push_back (it->GetRemoteIdentity ()->GetIdentHash ());
|
||||
newList.push_back ({ it->GetRemoteIdentity ()->GetIdentHash (), tag });
|
||||
if (newList.size () >= SSU2_MAX_NUM_INTRODUCERS) break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue