diff --git a/HTTPServer.cpp b/HTTPServer.cpp
index 7121d17b..f4cd7b82 100644
--- a/HTTPServer.cpp
+++ b/HTTPServer.cpp
@@ -772,7 +772,6 @@ namespace util
s << "
SSU
";
for (auto it: ssuServer->GetSessions ())
{
- // incoming connections don't have remote router
auto endpoint = it.second->GetRemoteEndpoint ();
if (it.second->IsOutgoing ()) s << "-->";
s << endpoint.address ().to_string () << ":" << endpoint.port ();
@@ -780,8 +779,17 @@ namespace util
s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
if (it.second->GetRelayTag ())
s << " [itag:" << it.second->GetRelayTag () << "]";
- s << "
";
- s << std::endl;
+ s << "
" << std::endl;
+ }
+ s << "
SSU6
";
+ for (auto it: ssuServer->GetSessionsV6 ())
+ {
+ auto endpoint = it.second->GetRemoteEndpoint ();
+ if (it.second->IsOutgoing ()) s << "-->";
+ s << endpoint.address ().to_string () << ":" << endpoint.port ();
+ if (!it.second->IsOutgoing ()) s << "-->";
+ s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
+ s << "
" << std::endl;
}
}
}
diff --git a/SSU.cpp b/SSU.cpp
index 4005e228..4d5ae9db 100644
--- a/SSU.cpp
+++ b/SSU.cpp
@@ -174,7 +174,7 @@ namespace transport
moreBytes = m_Socket.available();
}
- m_Service.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets));
+ m_Service.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets, m_Sessions));
Receive ();
}
else
@@ -201,7 +201,7 @@ namespace transport
moreBytes = m_SocketV6.available();
}
- m_ServiceV6.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets));
+ m_ServiceV6.post (std::bind (&SSUServer::HandleReceivedPackets, this, packets, m_SessionsV6));
ReceiveV6 ();
}
else
@@ -211,7 +211,8 @@ namespace transport
}
}
- void SSUServer::HandleReceivedPackets (std::vector packets)
+ void SSUServer::HandleReceivedPackets (std::vector packets,
+ std::map >& sessions)
{
std::shared_ptr session;
for (auto it1: packets)
@@ -222,17 +223,14 @@ namespace transport
if (!session || session->GetRemoteEndpoint () != packet->from) // we received packet for other session than previous
{
if (session) session->FlushData ();
- auto it = m_Sessions.find (packet->from);
- if (it != m_Sessions.end ())
+ auto it = sessions.find (packet->from);
+ if (it != sessions.end ())
session = it->second;
if (!session)
{
session = std::make_shared (*this, packet->from);
session->WaitForConnect ();
- {
- std::unique_lock l(m_SessionsMutex);
- m_Sessions[packet->from] = session;
- }
+ sessions[packet->from] = session;
LogPrint (eLogInfo, "New SSU session from ", packet->from.address ().to_string (), ":", packet->from.port (), " created");
}
}
@@ -265,8 +263,9 @@ namespace transport
std::shared_ptr SSUServer::FindSession (const boost::asio::ip::udp::endpoint& e) const
{
- auto it = m_Sessions.find (e);
- if (it != m_Sessions.end ())
+ auto& sessions = e.address ().is_v6 () ? m_SessionsV6 : m_Sessions;
+ auto it = sessions.find (e);
+ if (it != sessions.end ())
return it->second;
else
return nullptr;
@@ -295,8 +294,9 @@ namespace transport
void SSUServer::CreateDirectSession (std::shared_ptr router, boost::asio::ip::udp::endpoint remoteEndpoint, bool peerTest)
{
- auto it = m_Sessions.find (remoteEndpoint);
- if (it != m_Sessions.end ())
+ auto& sessions = remoteEndpoint.address ().is_v6 () ? m_SessionsV6 : m_Sessions;
+ auto it = sessions.find (remoteEndpoint);
+ if (it != sessions.end ())
{
auto session = it->second;
if (peerTest && session->GetState () == eSessionStateEstablished)
@@ -306,10 +306,7 @@ namespace transport
{
// otherwise create new session
auto session = std::make_shared (*this, remoteEndpoint, router, peerTest);
- {
- std::unique_lock l(m_SessionsMutex);
- m_Sessions[remoteEndpoint] = session;
- }
+ sessions[remoteEndpoint] = session;
// connect
LogPrint ("Creating new SSU session to [", i2p::data::GetIdentHashAbbreviation (router->GetIdentHash ()), "] ",
remoteEndpoint.address ().to_string (), ":", remoteEndpoint.port ());
@@ -360,15 +357,11 @@ namespace transport
introducer = &(address->introducers[0]); // TODO:
boost::asio::ip::udp::endpoint introducerEndpoint (introducer->iHost, introducer->iPort);
introducerSession = std::make_shared (*this, introducerEndpoint, router);
- std::unique_lock l(m_SessionsMutex);
m_Sessions[introducerEndpoint] = introducerSession;
}
// create session
auto session = std::make_shared (*this, remoteEndpoint, router, peerTest);
- {
- std::unique_lock l(m_SessionsMutex);
- m_Sessions[remoteEndpoint] = session;
- }
+ m_Sessions[remoteEndpoint] = session;
// introduce
LogPrint ("Introduce new SSU session to [", i2p::data::GetIdentHashAbbreviation (router->GetIdentHash ()),
"] through introducer ", introducer->iHost, ":", introducer->iPort);
@@ -393,21 +386,27 @@ namespace transport
if (session)
{
session->Close ();
- std::unique_lock l(m_SessionsMutex);
- m_Sessions.erase (session->GetRemoteEndpoint ());
+ auto& ep = session->GetRemoteEndpoint ();
+ if (ep.address ().is_v6 ())
+ m_SessionsV6.erase (ep);
+ else
+ m_Sessions.erase (ep);
}
}
void SSUServer::DeleteAllSessions ()
{
- std::unique_lock l(m_SessionsMutex);
for (auto it: m_Sessions)
it.second->Close ();
m_Sessions.clear ();
+
+ for (auto it: m_SessionsV6)
+ it.second->Close ();
+ m_SessionsV6.clear ();
}
template
- std::shared_ptr SSUServer::GetRandomSession (Filter filter)
+ std::shared_ptr SSUServer::GetRandomV4Session (Filter filter) // v4 only
{
std::vector > filteredSessions;
for (auto s :m_Sessions)
@@ -420,9 +419,9 @@ namespace transport
return nullptr;
}
- std::shared_ptr SSUServer::GetRandomEstablishedSession (std::shared_ptr excluded)
+ std::shared_ptr SSUServer::GetRandomEstablishedV4Session (std::shared_ptr excluded) // v4 only
{
- return GetRandomSession (
+ return GetRandomV4Session (
[excluded](std::shared_ptr session)->bool
{
return session->GetState () == eSessionStateEstablished && !session->IsV6 () &&
@@ -437,7 +436,7 @@ namespace transport
std::set ret;
for (int i = 0; i < maxNumIntroducers; i++)
{
- auto session = GetRandomSession (
+ auto session = GetRandomV4Session (
[&ret, ts](std::shared_ptr session)->bool
{
return session->GetRelayTag () && !ret.count (session.get ()) &&
diff --git a/SSU.h b/SSU.h
index 08f54642..fc01644f 100644
--- a/SSU.h
+++ b/SSU.h
@@ -43,7 +43,7 @@ namespace transport
void CreateSession (std::shared_ptr router, bool peerTest = false);
std::shared_ptr FindSession (std::shared_ptr router) const;
std::shared_ptr FindSession (const boost::asio::ip::udp::endpoint& e) const;
- std::shared_ptr GetRandomEstablishedSession (std::shared_ptr excluded);
+ std::shared_ptr GetRandomEstablishedV4Session (std::shared_ptr excluded);
void DeleteSession (std::shared_ptr session);
void DeleteAllSessions ();
@@ -69,12 +69,13 @@ namespace transport
void ReceiveV6 ();
void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred, SSUPacket * packet);
void HandleReceivedFromV6 (const boost::system::error_code& ecode, std::size_t bytes_transferred, SSUPacket * packet);
- void HandleReceivedPackets (std::vector packets);
+ void HandleReceivedPackets (std::vector packets,
+ std::map >& sessions);
void CreateSessionThroughIntroducer (std::shared_ptr router, bool peerTest = false);
void CreateDirectSession (std::shared_ptr router, boost::asio::ip::udp::endpoint remoteEndpoint, bool peerTest);
template
- std::shared_ptr GetRandomSession (Filter filter);
+ std::shared_ptr GetRandomV4Session (Filter filter);
std::set FindIntroducers (int maxNumIntroducers);
void ScheduleIntroducersUpdateTimer ();
@@ -100,14 +101,14 @@ namespace transport
boost::asio::ip::udp::socket m_Socket, m_SocketV6;
boost::asio::deadline_timer m_IntroducersUpdateTimer, m_PeerTestsCleanupTimer;
std::list m_Introducers; // introducers we are connected to
- mutable std::mutex m_SessionsMutex;
- std::map > m_Sessions;
+ std::map > m_Sessions, m_SessionsV6;
std::map m_Relays; // we are introducer
std::map m_PeerTests; // nonce -> creation time in milliseconds
public:
// for HTTP only
const decltype(m_Sessions)& GetSessions () const { return m_Sessions; };
+ const decltype(m_SessionsV6)& GetSessionsV6 () const { return m_SessionsV6; };
};
}
}
diff --git a/SSUSession.cpp b/SSUSession.cpp
index b09dcf1f..ff5d1182 100644
--- a/SSUSession.cpp
+++ b/SSUSession.cpp
@@ -931,7 +931,7 @@ namespace transport
else
{
LogPrint (eLogDebug, "SSU peer test from Alice. We are Bob");
- auto session = m_Server.GetRandomEstablishedSession (shared_from_this ()); // Charlie
+ auto session = m_Server.GetRandomEstablishedV4Session (shared_from_this ()); // Charlie, TODO: implement v6 support
if (session)
{
m_Server.NewPeerTest (nonce, ePeerTestParticipantBob, shared_from_this ());