From 1441c1371bc585d729188c6cfa96ef9997ecbe40 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 18 Sep 2014 14:37:29 -0400 Subject: [PATCH] adjust MTU for incoming SSU sessions --- SSU.cpp | 1 + SSUData.cpp | 51 +++++++++++++++++++++++++++++++-------------------- SSUData.h | 6 ++++++ 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/SSU.cpp b/SSU.cpp index d5fbdca6..e6ac08ec 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -236,6 +236,7 @@ namespace ssu i2p::data::Identity ident; ident.FromBuffer (payload, identitySize); m_RemoteIdent = ident.Hash (); + m_Data.UpdatePacketSize (m_RemoteIdent); } else LogPrint ("SSU unexpected identity size ", identitySize); diff --git a/SSUData.cpp b/SSUData.cpp index 9cfecd7e..62ffba61 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -2,6 +2,7 @@ #include #include "Log.h" #include "Timestamp.h" +#include "NetDb.h" #include "SSU.h" #include "SSUData.h" @@ -15,26 +16,7 @@ namespace ssu 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; - } - } - } + AdjustPacketSize (*remoteRouter); } SSUData::~SSUData () @@ -49,6 +31,35 @@ namespace ssu delete it.second; } + void SSUData::AdjustPacketSize (const i2p::data::RouterInfo& 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; + } + } + } + + void SSUData::UpdatePacketSize (const i2p::data::IdentHash& remoteIdent) + { + auto routerInfo = i2p::data::netdb.FindRouter (remoteIdent); + if (routerInfo) + AdjustPacketSize (*routerInfo); + } + void SSUData::ProcessSentMessageAck (uint32_t msgID) { auto it = m_SentMessages.find (msgID); diff --git a/SSUData.h b/SSUData.h index 9d29757e..afa36f8d 100644 --- a/SSUData.h +++ b/SSUData.h @@ -8,6 +8,8 @@ #include #include #include "I2NPProtocol.h" +#include "Identity.h" +#include "RouterInfo.h" namespace i2p { @@ -78,6 +80,8 @@ namespace ssu void ProcessMessage (uint8_t * buf, size_t len); void Send (i2p::I2NPMessage * msg); + void UpdatePacketSize (const i2p::data::IdentHash& remoteIdent); + private: void SendMsgAck (uint32_t msgID); @@ -89,6 +93,8 @@ namespace ssu void ScheduleResend (); void HandleResendTimer (const boost::system::error_code& ecode); + void AdjustPacketSize (const i2p::data::RouterInfo& remoteRouter); + private: SSUSession& m_Session;