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 ());