diff --git a/SSUData.cpp b/SSUData.cpp index 62bff62e..9cfecd7e 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -12,6 +12,29 @@ namespace ssu SSUData::SSUData (SSUSession& session): m_Session (session), m_ResendTimer (session.m_Server.GetService ()) { + m_PacketSize = SSU_MAX_PACKET_SIZE; + auto remoteRouter = session.GetRemoteRouter (); + if (remoteRouter) + { + auto ssuAddress = remoteRouter->GetSSUAddress (); + if (ssuAddress && ssuAddress->mtu) + { + 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; + LogPrint ("MTU=", ssuAddress->mtu, " packet size=", m_PacketSize); + } + else + { + LogPrint ("Unexpected MTU ", ssuAddress->mtu); + m_PacketSize = SSU_MAX_PACKET_SIZE; + } + } + } } SSUData::~SSUData () @@ -245,7 +268,7 @@ namespace ssu sentMessage->numResends = 0; auto& fragments = sentMessage->fragments; msgID = htobe32 (msgID); - size_t payloadSize = SSU_PACKET_SIZE - sizeof (SSUHeader) - 9; // 9 = flag + #frg(1) + messageID(4) + frag info (3) + size_t payloadSize = m_PacketSize - sizeof (SSUHeader) - 9; // 9 = flag + #frg(1) + messageID(4) + frag info (3) size_t len = msg->GetLength (); uint8_t * msgBuf = msg->GetSSUHeader (); diff --git a/SSUData.h b/SSUData.h index 0dddbaa8..9d29757e 100644 --- a/SSUData.h +++ b/SSUData.h @@ -15,7 +15,9 @@ namespace ssu { const size_t SSU_MTU = 1484; - const size_t SSU_PACKET_SIZE = SSU_MTU - 20 - 8; // 20 - IPv4 header, 8 - UDP + const size_t IPV4_HEADER_SIZE = 20; + const size_t UDP_HEADER_SIZE = 8; + const size_t SSU_MAX_PACKET_SIZE = SSU_MTU - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; // 1456 const int RESEND_INTERVAL = 3; // in seconds const int MAX_NUM_RESENDS = 5; // data flags @@ -31,7 +33,7 @@ namespace ssu int fragmentNum; size_t len; bool isLast; - uint8_t buf[SSU_PACKET_SIZE + 18]; + uint8_t buf[SSU_MAX_PACKET_SIZE + 18]; Fragment () = default; Fragment (int n, const uint8_t * b, int l, bool last): @@ -93,6 +95,7 @@ namespace ssu std::map m_IncomleteMessages; std::map m_SentMessages; boost::asio::deadline_timer m_ResendTimer; + int m_PacketSize; }; } }