Browse Source

PeerTest for connection through introducer

pull/1767/head
orignal 3 years ago
parent
commit
f7b6db5dad
  1. 32
      libi2pd/SSU2.cpp
  2. 5
      libi2pd/SSU2.h
  3. 1
      libi2pd/SSU2Session.h

32
libi2pd/SSU2.cpp

@ -400,29 +400,29 @@ namespace transport
} }
bool SSU2Server::CreateSession (std::shared_ptr<const i2p::data::RouterInfo> router, bool SSU2Server::CreateSession (std::shared_ptr<const i2p::data::RouterInfo> router,
std::shared_ptr<const i2p::data::RouterInfo::Address> address) std::shared_ptr<const i2p::data::RouterInfo::Address> address, bool peerTest)
{ {
if (router && address) if (router && address)
{ {
auto session = std::make_shared<SSU2Session> (*this, router, address);
if (peerTest)
session->SetOnEstablished ([session]() {session->SendPeerTest (); });
if (address->UsesIntroducer ()) if (address->UsesIntroducer ())
GetService ().post (std::bind (&SSU2Server::ConnectThroughIntroducer, this, router, address)); GetService ().post (std::bind (&SSU2Server::ConnectThroughIntroducer, this, session));
else else
GetService ().post ( GetService ().post ([session]() { session->Connect (); });
[this, router, address]()
{
auto session = std::make_shared<SSU2Session> (*this, router, address);
session->Connect ();
});
} }
else else
return false; return false;
return true; return true;
} }
void SSU2Server::ConnectThroughIntroducer (std::shared_ptr<const i2p::data::RouterInfo> router, void SSU2Server::ConnectThroughIntroducer (std::shared_ptr<SSU2Session> session)
std::shared_ptr<const i2p::data::RouterInfo::Address> address)
{ {
auto session = std::make_shared<SSU2Session> (*this, router, address); if (!session) return;
auto address = session->GetAddress ();
if (!address) return;
session->SetState (eSSU2SessionStateIntroduced); session->SetState (eSSU2SessionStateIntroduced);
// try to find existing session first // try to find existing session first
for (auto& it: address->ssu->introducers) for (auto& it: address->ssu->introducers)
@ -480,18 +480,14 @@ namespace transport
auto it = m_SessionsByRouterHash.find (router->GetIdentHash ()); auto it = m_SessionsByRouterHash.find (router->GetIdentHash ());
if (it != m_SessionsByRouterHash.end ()) if (it != m_SessionsByRouterHash.end ())
{ {
auto s = it->second;
if (it->second->IsEstablished ()) if (it->second->IsEstablished ())
it->second->SendPeerTest (); GetService ().post ([s]() { s->SendPeerTest (); });
else else
{
auto s = it->second;
s->SetOnEstablished ([s]() { s->SendPeerTest (); }); s->SetOnEstablished ([s]() { s->SendPeerTest (); });
}
return true; return true;
} }
auto s = std::make_shared<SSU2Session> (*this, router, addr); CreateSession (router, addr, true);
s->SetOnEstablished ([s]() {s->SendPeerTest (); });
s->Connect ();
return true; return true;
} }

5
libi2pd/SSU2.h

@ -66,7 +66,7 @@ namespace transport
const uint8_t * payload, size_t payloadLen, const boost::asio::ip::udp::endpoint& to); const uint8_t * payload, size_t payloadLen, const boost::asio::ip::udp::endpoint& to);
bool CreateSession (std::shared_ptr<const i2p::data::RouterInfo> router, bool CreateSession (std::shared_ptr<const i2p::data::RouterInfo> router,
std::shared_ptr<const i2p::data::RouterInfo::Address> address); std::shared_ptr<const i2p::data::RouterInfo::Address> address, bool peerTest = false);
bool StartPeerTest (std::shared_ptr<const i2p::data::RouterInfo> router, bool v4); bool StartPeerTest (std::shared_ptr<const i2p::data::RouterInfo> router, bool v4);
void UpdateOutgoingToken (const boost::asio::ip::udp::endpoint& ep, uint64_t token, uint32_t exp); void UpdateOutgoingToken (const boost::asio::ip::udp::endpoint& ep, uint64_t token, uint32_t exp);
@ -89,8 +89,7 @@ namespace transport
void ScheduleResend (); void ScheduleResend ();
void HandleResendTimer (const boost::system::error_code& ecode); void HandleResendTimer (const boost::system::error_code& ecode);
void ConnectThroughIntroducer (std::shared_ptr<const i2p::data::RouterInfo> router, void ConnectThroughIntroducer (std::shared_ptr<SSU2Session> session);
std::shared_ptr<const i2p::data::RouterInfo::Address> address);
private: private:

1
libi2pd/SSU2Session.h

@ -162,6 +162,7 @@ namespace transport
void SetRemoteEndpoint (const boost::asio::ip::udp::endpoint& ep) { m_RemoteEndpoint = ep; }; void SetRemoteEndpoint (const boost::asio::ip::udp::endpoint& ep) { m_RemoteEndpoint = ep; };
const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; }; const boost::asio::ip::udp::endpoint& GetRemoteEndpoint () const { return m_RemoteEndpoint; };
i2p::data::RouterInfo::CompatibleTransports GetRemoteTransports () const { return m_RemoteTransports; }; i2p::data::RouterInfo::CompatibleTransports GetRemoteTransports () const { return m_RemoteTransports; };
std::shared_ptr<const i2p::data::RouterInfo::Address> GetAddress () const { return m_Address; };
void SetOnEstablished (OnEstablished e) { m_OnEstablished = e; }; void SetOnEstablished (OnEstablished e) { m_OnEstablished = e; };
void Connect (); void Connect ();

Loading…
Cancel
Save