Browse Source

find all introducers at the time

pull/1656/head
orignal 3 years ago
parent
commit
b5618af308
  1. 35
      libi2pd/SSU.cpp
  2. 2
      libi2pd/SSU.h

35
libi2pd/SSU.cpp

@ -662,23 +662,28 @@ namespace transport
); );
} }
std::set<SSUSession *> SSUServer::FindIntroducers (int maxNumIntroducers, bool v4) std::list<std::shared_ptr<SSUSession> > SSUServer::FindIntroducers (int maxNumIntroducers, bool v4)
{ {
uint32_t ts = i2p::util::GetSecondsSinceEpoch (); uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
std::set<SSUSession *> ret; std::list<std::shared_ptr<SSUSession> > ret;
auto filter = [&ret, ts](std::shared_ptr<SSUSession> session)->bool const auto& sessions = v4 ? m_Sessions : m_SessionsV6;
for (const auto& s : sessions)
{
if (s.second->GetRelayTag () && s.second->GetState () == eSessionStateEstablished &&
ts < s.second->GetCreationTime () + SSU_TO_INTRODUCER_SESSION_DURATION)
ret.push_back (s.second);
}
if ((int)ret.size () > maxNumIntroducers)
{
// shink ret randomly
int sz = ret.size () - maxNumIntroducers;
for (int i = 0; i < sz; i++)
{ {
return session->GetRelayTag () && !ret.count (session.get ()) && auto ind = rand () % ret.size ();
session->GetState () == eSessionStateEstablished && auto it = ret.begin ();
ts < session->GetCreationTime () + SSU_TO_INTRODUCER_SESSION_DURATION; std::advance (it, ind);
}; ret.erase (it);
for (int i = 0; i < maxNumIntroducers; i++) }
{
auto session = v4 ? GetRandomV4Session (filter) : GetRandomV6Session (filter);
if (session)
ret.insert (session.get ());
else
break;
} }
return ret; return ret;
} }
@ -770,7 +775,7 @@ namespace transport
if (numIntroducers < SSU_MAX_NUM_INTRODUCERS) if (numIntroducers < SSU_MAX_NUM_INTRODUCERS)
{ {
// create new // create new
auto sessions = FindIntroducers (SSU_MAX_NUM_INTRODUCERS - numIntroducers, v4); auto sessions = FindIntroducers (SSU_MAX_NUM_INTRODUCERS, v4); // try to find if duplicates
for (const auto& it1: sessions) for (const auto& it1: sessions)
{ {
const auto& ep = it1->GetRemoteEndpoint (); const auto& ep = it1->GetRemoteEndpoint ();

2
libi2pd/SSU.h

@ -100,7 +100,7 @@ namespace transport
template<typename Filter> template<typename Filter>
std::shared_ptr<SSUSession> GetRandomV6Session (Filter filter); std::shared_ptr<SSUSession> GetRandomV6Session (Filter filter);
std::set<SSUSession *> FindIntroducers (int maxNumIntroducers, bool v4); std::list<std::shared_ptr<SSUSession> > FindIntroducers (int maxNumIntroducers, bool v4);
void ScheduleIntroducersUpdateTimer (); void ScheduleIntroducersUpdateTimer ();
void ScheduleIntroducersUpdateTimerV6 (); void ScheduleIntroducersUpdateTimerV6 ();
void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode, bool v4); void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode, bool v4);

Loading…
Cancel
Save