diff --git a/SSU.h b/SSU.h index b9fb781e..8169a957 100644 --- a/SSU.h +++ b/SSU.h @@ -72,6 +72,7 @@ namespace transport void WaitForIntroduction (); void Close (); boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; }; + bool IsV6 () const { return m_RemoteEndpoint.address ().is_v6 (); }; void SendI2NPMessage (I2NPMessage * msg); void SendPeerTest (); // Alice @@ -188,7 +189,7 @@ namespace transport boost::asio::ip::udp::endpoint m_SenderEndpoint; boost::asio::deadline_timer m_IntroducersUpdateTimer; std::list m_Introducers; // introducers we are connected to - uint8_t m_ReceiveBuffer[2*SSU_MTU]; + uint8_t m_ReceiveBuffer[2*SSU_MTU_V4]; std::map m_Sessions; std::map m_Relays; // we are introducer diff --git a/SSUData.cpp b/SSUData.cpp index 8b8f0ead..2c902ed4 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -13,7 +13,8 @@ namespace transport SSUData::SSUData (SSUSession& session): m_Session (session), m_ResendTimer (session.m_Server.GetService ()) { - m_PacketSize = SSU_MAX_PACKET_SIZE; + m_MaxPacketSize = session.IsV6 () ? SSU_V6_MAX_PACKET_SIZE : SSU_V4_MAX_PACKET_SIZE; + m_PacketSize = m_MaxPacketSize; auto remoteRouter = session.GetRemoteRouter (); if (remoteRouter) AdjustPacketSize (*remoteRouter); @@ -36,19 +37,22 @@ namespace transport auto ssuAddress = remoteRouter.GetSSUAddress (); if (ssuAddress && ssuAddress->mtu) { - m_PacketSize = ssuAddress->mtu - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; + if (m_Session.IsV6 ()) + m_PacketSize = ssuAddress->mtu - IPV6_HEADER_SIZE - UDP_HEADER_SIZE; + else + m_PacketSize = ssuAddress->mtu - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; if (m_PacketSize > 0) { // make sure packet size multiple of 16 m_PacketSize >>= 4; m_PacketSize <<= 4; - if (m_PacketSize > (int)SSU_MAX_PACKET_SIZE) m_PacketSize = SSU_MAX_PACKET_SIZE; + if (m_PacketSize > m_MaxPacketSize) m_PacketSize = m_MaxPacketSize; LogPrint ("MTU=", ssuAddress->mtu, " packet size=", m_PacketSize); } else { LogPrint (eLogWarning, "Unexpected MTU ", ssuAddress->mtu); - m_PacketSize = SSU_MAX_PACKET_SIZE; + m_PacketSize = m_MaxPacketSize; } } } diff --git a/SSUData.h b/SSUData.h index 2b6abead..e362acd3 100644 --- a/SSUData.h +++ b/SSUData.h @@ -16,10 +16,13 @@ namespace i2p namespace transport { - const size_t SSU_MTU = 1484; + const size_t SSU_MTU_V4 = 1484; + const size_t SSU_MTU_V6 = 1472; const size_t IPV4_HEADER_SIZE = 20; + const size_t IPV6_HEADER_SIZE = 40; const size_t UDP_HEADER_SIZE = 8; - const size_t SSU_MAX_PACKET_SIZE = SSU_MTU - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; // 1456 + const size_t SSU_V4_MAX_PACKET_SIZE = SSU_MTU_V4 - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; // 1456 + const size_t SSU_V6_MAX_PACKET_SIZE = SSU_MTU_V6 - IPV6_HEADER_SIZE - UDP_HEADER_SIZE; // 1424 const int RESEND_INTERVAL = 3; // in seconds const int MAX_NUM_RESENDS = 5; // data flags @@ -35,7 +38,7 @@ namespace transport int fragmentNum; size_t len; bool isLast; - uint8_t buf[SSU_MAX_PACKET_SIZE + 18]; + uint8_t buf[SSU_V4_MAX_PACKET_SIZE + 18]; // use biggest Fragment () = default; Fragment (int n, const uint8_t * b, int l, bool last): @@ -102,7 +105,7 @@ namespace transport std::map m_SentMessages; std::set m_ReceivedMessages; boost::asio::deadline_timer m_ResendTimer; - int m_PacketSize; + int m_MaxPacketSize, m_PacketSize; }; } }