From 5026dbc1b37903b3577fc35d6211d880677cae28 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 14 Jul 2022 20:12:27 -0400 Subject: [PATCH] receive bigger packets --- libi2pd/SSU2.cpp | 2 +- libi2pd/SSU2Session.cpp | 16 ++++++++-------- libi2pd/SSU2Session.h | 5 ++--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp index c1eb09f3..438dfa41 100644 --- a/libi2pd/SSU2.cpp +++ b/libi2pd/SSU2.cpp @@ -175,7 +175,7 @@ namespace transport while (moreBytes && packets.size () < 32) { packet = m_PacketsPool.AcquireMt (); - packet->len = socket.receive_from (boost::asio::buffer (packet->buf, SSU2_MTU), packet->from, 0, ec); + packet->len = socket.receive_from (boost::asio::buffer (packet->buf, SSU2_MAX_PACKET_SIZE), packet->from, 0, ec); if (!ec) { i2p::transport::transports.UpdateReceivedBytes (packet->len); diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 80d6e795..1b53a156 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -26,7 +26,7 @@ namespace transport m_SendPacketNum (0), m_ReceivePacketNum (0), m_IsDataReceived (false), m_WindowSize (SSU2_MAX_WINDOW_SIZE), m_RelayTag (0), m_ConnectTimer (server.GetService ()), m_TerminationReason (eSSU2TerminationReasonNormalClose), - m_MaxPayloadSize (SSU2_MAX_PAYLOAD_SIZE) + m_MaxPayloadSize (SSU2_MIN_PACKET_SIZE - IPV6_HEADER_SIZE - UDP_HEADER_SIZE - 32) // min size { m_NoiseState.reset (new i2p::crypto::NoiseSymmetricState); if (in_RemoteRouter && m_Address) @@ -669,9 +669,9 @@ namespace transport m_SentHandshakePacket->payloadSize = payloadSize; if (header.h.flags[0] > 1) { - if (payloadSize > SSU2_MAX_PAYLOAD_SIZE - 64) + if (payloadSize > m_MaxPayloadSize - 48) { - payloadSize = SSU2_MAX_PAYLOAD_SIZE - 64 - (rand () % 16); + payloadSize = m_MaxPayloadSize - 48 - (rand () % 16); if (m_SentHandshakePacket->payloadSize - payloadSize < 24) payloadSize -= 24; } @@ -1131,8 +1131,8 @@ namespace transport memset (header.h.flags, 0, 3); uint8_t nonce[12]; CreateNonce (m_SendPacketNum, nonce); - uint8_t payload[SSU2_MTU]; - i2p::crypto::AEADChaCha20Poly1305 (buf, len, header.buf, 16, m_KeyDataSend, nonce, payload, SSU2_MTU, true); + uint8_t payload[SSU2_MAX_PACKET_SIZE]; + i2p::crypto::AEADChaCha20Poly1305 (buf, len, header.buf, 16, m_KeyDataSend, nonce, payload, SSU2_MAX_PACKET_SIZE, true); header.ll[0] ^= CreateHeaderMask (m_Address->i, payload + (len - 8)); header.ll[1] ^= CreateHeaderMask (m_KeyDataSend + 32, payload + (len + 4)); m_Server.Send (header.buf, 16, payload, len + 16, m_RemoteEndpoint); @@ -1154,7 +1154,7 @@ namespace transport SendQuickAck (); // in case it was SessionConfirmed return; } - uint8_t payload[SSU2_MTU]; + uint8_t payload[SSU2_MAX_PACKET_SIZE]; size_t payloadSize = len - 32; uint32_t packetNum = be32toh (header.h.packetNum); uint8_t nonce[12]; @@ -1468,12 +1468,12 @@ namespace transport i2p::data::netdb.PopulateRouterInfoBuffer (r); else LogPrint (eLogWarning, "SSU2: RelayRequest Alice's router info not found"); - uint8_t payload[SSU2_MAX_PAYLOAD_SIZE]; + uint8_t payload[SSU2_MAX_PACKET_SIZE]; size_t payloadSize = r ? CreateRouterInfoBlock (payload, m_MaxPayloadSize - len - 32, r) : 0; if (!payloadSize && r) session->SendFragmentedMessage (CreateDatabaseStoreMsg (r)); payloadSize += CreateRelayIntroBlock (payload + payloadSize, m_MaxPayloadSize - payloadSize, buf + 1, len -1); - if (payloadSize < SSU2_MAX_PAYLOAD_SIZE) + if (payloadSize < m_MaxPayloadSize) payloadSize += CreatePaddingBlock (payload + payloadSize, m_MaxPayloadSize - payloadSize); session->SendData (payload, payloadSize); } diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index bb6f4d55..7ee89edd 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -33,8 +33,7 @@ namespace transport const int SSU2_RELAY_NONCE_EXPIRATION_TIMEOUT = 10; // in seconds const int SSU2_PEER_TEST_EXPIRATION_TIMEOUT = 60; // 60 seconds const size_t SSU2_MAX_PACKET_SIZE = 1500; - const size_t SSU2_MTU = SSU2_MAX_PACKET_SIZE - IPV6_HEADER_SIZE - UDP_HEADER_SIZE; // TODO: ipv4 - const size_t SSU2_MAX_PAYLOAD_SIZE = SSU2_MTU - 32; + const size_t SSU2_MIN_PACKET_SIZE = 1280; const int SSU2_HANDSHAKE_RESEND_INTERVAL = 1; // in seconds const int SSU2_RESEND_INTERVAL = 3; // in seconds const int SSU2_MAX_NUM_RESENDS = 5; @@ -153,7 +152,7 @@ namespace transport { struct Fragment { - uint8_t buf[SSU2_MTU]; + uint8_t buf[SSU2_MAX_PACKET_SIZE]; size_t len; bool isLast; };