diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index e551010a..680cde63 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -742,6 +742,7 @@ namespace transport } m_PacketsPool.CleanUpMt (); + m_SentPacketsPool.CleanUp (); ScheduleTermination (); } } diff --git a/libi2pd/SSU2.h b/libi2pd/SSU2.h index 00e944e4..8bada7a6 100644 --- a/libi2pd/SSU2.h +++ b/libi2pd/SSU2.h @@ -87,6 +87,8 @@ namespace transport void RescheduleIntroducersUpdateTimer (); void RescheduleIntroducersUpdateTimerV6 (); + + i2p::util::MemoryPool& GetSentPacketsPool () { return m_SentPacketsPool; }; private: @@ -124,6 +126,7 @@ namespace transport std::map > m_Relays; // we are introducer, relay tag -> session std::list m_Introducers, m_IntroducersV6; // introducers we are connected to i2p::util::MemoryPoolMt m_PacketsPool; + i2p::util::MemoryPool m_SentPacketsPool; boost::asio::deadline_timer m_TerminationTimer, m_ResendTimer, m_IntroducersUpdateTimer, m_IntroducersUpdateTimerV6; std::shared_ptr m_LastSession; diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index a0789281..fd109609 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -282,7 +282,7 @@ namespace transport if (!m_SendQueue.empty () && m_SentPackets.size () <= m_WindowSize) { auto ts = i2p::util::GetMillisecondsSinceEpoch (); - auto packet = std::make_shared(); + auto packet = m_Server.GetSentPacketsPool ().AcquireShared (); size_t ackBlockSize = CreateAckBlock (packet->payload, m_MaxPayloadSize); bool ackBlockSent = false; packet->payloadSize += ackBlockSize; @@ -304,7 +304,7 @@ namespace transport else { // create new packet and copy ack block - auto newPacket = std::make_shared(); + auto newPacket = m_Server.GetSentPacketsPool ().AcquireShared (); memcpy (newPacket->payload, packet->payload, ackBlockSize); newPacket->payloadSize = ackBlockSize; // complete current packet @@ -361,7 +361,7 @@ namespace transport uint32_t msgID; memcpy (&msgID, msg->GetHeader () + I2NP_HEADER_MSGID_OFFSET, 4); auto ts = i2p::util::GetMillisecondsSinceEpoch (); - auto packet = std::make_shared(); + auto packet = m_Server.GetSentPacketsPool ().AcquireShared (); if (extraSize >= 8) { packet->payloadSize = CreateAckBlock (packet->payload, extraSize); @@ -371,7 +371,7 @@ namespace transport uint32_t packetNum = SendData (packet->payload, packet->payloadSize); packet->sendTime = ts; m_SentPackets.emplace (packetNum, packet); - packet = std::make_shared(); + packet = m_Server.GetSentPacketsPool ().AcquireShared (); } else extraSize -= packet->payloadSize; @@ -389,7 +389,7 @@ namespace transport while (msg->offset < msg->len) { offset = extraSize > 0 ? (rand () % extraSize) : 0; - packet = std::make_shared(); + packet = m_Server.GetSentPacketsPool ().AcquireShared (); packet->payloadSize = CreateFollowOnFragmentBlock (packet->payload, m_MaxPayloadSize - offset, msg, fragmentNum, msgID); extraSize -= offset; if (msg->offset >= msg->len && packet->payloadSize + 16 < m_MaxPayloadSize) // last fragment @@ -413,7 +413,7 @@ namespace transport } // resend data packets if (m_SentPackets.empty ()) return; - std::map > resentPackets; + std::map > resentPackets; for (auto it = m_SentPackets.begin (); it != m_SentPackets.end (); ) if (ts >= it->second->sendTime + it->second->numResends*m_RTO) { diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index 1a00f38a..767c3e04 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -172,6 +172,14 @@ namespace transport void AttachNextFragment (const uint8_t * fragment, size_t fragmentSize); }; + struct SSU2SentPacket + { + uint8_t payload[SSU2_MAX_PACKET_SIZE]; + size_t payloadSize = 0; + uint64_t sendTime; // in milliseconds + int numResends = 0; + }; + // RouterInfo flags const uint8_t SSU2_ROUTER_INFO_FLAG_REQUEST_FLOOD = 0x01; const uint8_t SSU2_ROUTER_INFO_FLAG_GZIP = 0x02; @@ -192,14 +200,6 @@ namespace transport } h; }; - struct SentPacket - { - uint8_t payload[SSU2_MAX_PACKET_SIZE]; - size_t payloadSize = 0; - uint64_t sendTime; // in milliseconds - int numResends = 0; - }; - struct HandshakePacket { Header header; @@ -327,7 +327,7 @@ namespace transport uint8_t m_KeyDataSend[64], m_KeyDataReceive[64]; uint32_t m_SendPacketNum, m_ReceivePacketNum; std::set m_OutOfSequencePackets; // packet nums > receive packet num - std::map > m_SentPackets; // packetNum -> packet + std::map > m_SentPackets; // packetNum -> packet std::map > m_IncompleteMessages; // I2NP std::map, uint64_t > > m_RelaySessions; // nonce->(Alice, timestamp) for Bob or nonce->(Charlie, timestamp) for Alice std::map, uint64_t > > m_PeerTests; // same as for relay sessions