mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-07 07:44:13 +00:00
check MTU of remote router
This commit is contained in:
parent
4e213550ff
commit
37e4bc8e5b
25
SSUData.cpp
25
SSUData.cpp
@ -12,6 +12,29 @@ namespace ssu
|
|||||||
SSUData::SSUData (SSUSession& session):
|
SSUData::SSUData (SSUSession& session):
|
||||||
m_Session (session), m_ResendTimer (session.m_Server.GetService ())
|
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 ()
|
SSUData::~SSUData ()
|
||||||
@ -245,7 +268,7 @@ namespace ssu
|
|||||||
sentMessage->numResends = 0;
|
sentMessage->numResends = 0;
|
||||||
auto& fragments = sentMessage->fragments;
|
auto& fragments = sentMessage->fragments;
|
||||||
msgID = htobe32 (msgID);
|
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 ();
|
size_t len = msg->GetLength ();
|
||||||
uint8_t * msgBuf = msg->GetSSUHeader ();
|
uint8_t * msgBuf = msg->GetSSUHeader ();
|
||||||
|
|
||||||
|
@ -15,7 +15,9 @@ namespace ssu
|
|||||||
{
|
{
|
||||||
|
|
||||||
const size_t SSU_MTU = 1484;
|
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 RESEND_INTERVAL = 3; // in seconds
|
||||||
const int MAX_NUM_RESENDS = 5;
|
const int MAX_NUM_RESENDS = 5;
|
||||||
// data flags
|
// data flags
|
||||||
@ -31,7 +33,7 @@ namespace ssu
|
|||||||
int fragmentNum;
|
int fragmentNum;
|
||||||
size_t len;
|
size_t len;
|
||||||
bool isLast;
|
bool isLast;
|
||||||
uint8_t buf[SSU_PACKET_SIZE + 18];
|
uint8_t buf[SSU_MAX_PACKET_SIZE + 18];
|
||||||
|
|
||||||
Fragment () = default;
|
Fragment () = default;
|
||||||
Fragment (int n, const uint8_t * b, int l, bool last):
|
Fragment (int n, const uint8_t * b, int l, bool last):
|
||||||
@ -93,6 +95,7 @@ namespace ssu
|
|||||||
std::map<uint32_t, IncompleteMessage *> m_IncomleteMessages;
|
std::map<uint32_t, IncompleteMessage *> m_IncomleteMessages;
|
||||||
std::map<uint32_t, SentMessage *> m_SentMessages;
|
std::map<uint32_t, SentMessage *> m_SentMessages;
|
||||||
boost::asio::deadline_timer m_ResendTimer;
|
boost::asio::deadline_timer m_ResendTimer;
|
||||||
|
int m_PacketSize;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user