mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
don't create temporary NTCP send buffer
This commit is contained in:
parent
2280312501
commit
18ec2e9ce8
@ -19,8 +19,8 @@ namespace i2p
|
|||||||
I2NPMessage * NewI2NPMessage ()
|
I2NPMessage * NewI2NPMessage ()
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = new I2NPMessage;
|
I2NPMessage * msg = new I2NPMessage;
|
||||||
msg->offset = 0;
|
msg->offset = 2; // reserve 2 bytes for NTCP header, should reserve more for SSU in future
|
||||||
msg->len = sizeof (I2NPHeader);
|
msg->len = sizeof (I2NPHeader) + 2;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ namespace i2p
|
|||||||
msgID++;
|
msgID++;
|
||||||
}
|
}
|
||||||
header->expiration = htobe64 (i2p::util::GetMillisecondsSinceEpoch () + 5000); // TODO: 5 secs is a magic number
|
header->expiration = htobe64 (i2p::util::GetMillisecondsSinceEpoch () + 5000); // TODO: 5 secs is a magic number
|
||||||
int len = msg->len - sizeof (I2NPHeader);
|
int len = msg->GetLength () - sizeof (I2NPHeader);
|
||||||
header->size = htobe16 (len);
|
header->size = htobe16 (len);
|
||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
CryptoPP::SHA256().CalculateDigest(hash, msg->GetPayload (), len);
|
CryptoPP::SHA256().CalculateDigest(hash, msg->GetPayload (), len);
|
||||||
|
@ -397,19 +397,23 @@ namespace ntcp
|
|||||||
m_NextMessage = i2p::NewI2NPMessage ();
|
m_NextMessage = i2p::NewI2NPMessage ();
|
||||||
m_NextMessageOffset = 0;
|
m_NextMessageOffset = 0;
|
||||||
|
|
||||||
uint8_t decrypted[16];
|
m_Decryption.ProcessData (m_NextMessage->buf, encrypted, 16);
|
||||||
m_Decryption.ProcessData (decrypted, encrypted, 16);
|
uint16_t dataSize = be16toh (*(uint16_t *)m_NextMessage->buf);
|
||||||
uint16_t dataSize = be16toh (*(uint16_t *)decrypted);
|
|
||||||
if (dataSize)
|
if (dataSize)
|
||||||
{
|
{
|
||||||
// new message
|
// new message
|
||||||
memcpy (m_NextMessage->buf, decrypted + 2, 14);
|
m_NextMessageOffset += 16;
|
||||||
m_NextMessageOffset += 14;
|
m_NextMessage->offset = 2; // size field
|
||||||
m_NextMessage->len = dataSize;
|
m_NextMessage->len = dataSize + 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
// timestamp
|
// timestamp
|
||||||
LogPrint ("Timestamp");
|
LogPrint ("Timestamp");
|
||||||
|
i2p::DeleteI2NPMessage (m_NextMessage);
|
||||||
|
m_NextMessage = nullptr;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else // message continues
|
else // message continues
|
||||||
{
|
{
|
||||||
@ -421,18 +425,38 @@ namespace ntcp
|
|||||||
{
|
{
|
||||||
// we have a complete I2NP message
|
// we have a complete I2NP message
|
||||||
i2p::HandleI2NPMessage (m_NextMessage);
|
i2p::HandleI2NPMessage (m_NextMessage);
|
||||||
m_NextMessage = 0;
|
m_NextMessage = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCPSession::Send (const uint8_t * buf, int len, bool zeroSize)
|
void NTCPSession::Send (i2p::I2NPMessage * msg)
|
||||||
{
|
{
|
||||||
uint8_t * sendBuffer = new uint8_t[NTCP_MAX_MESSAGE_SIZE];
|
uint8_t * sendBuffer;
|
||||||
*((uint16_t *)sendBuffer) = zeroSize ? 0 :htobe16 (len);
|
int len;
|
||||||
|
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
|
// regular I2NP
|
||||||
|
if (msg->offset < 2)
|
||||||
|
{
|
||||||
|
LogPrint ("Malformed I2NP message");
|
||||||
|
i2p::DeleteI2NPMessage (msg);
|
||||||
|
}
|
||||||
|
sendBuffer = msg->GetBuffer () - 2;
|
||||||
|
len = msg->GetLength ();
|
||||||
|
*((uint16_t *)sendBuffer) = htobe16 (len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// prepare timestamp
|
||||||
|
sendBuffer = m_TimeSyncBuffer;
|
||||||
|
len = 4;
|
||||||
|
*((uint16_t *)sendBuffer) = 0;
|
||||||
|
*((uint32_t *)(sendBuffer + 2)) = htobe32 (time (0));
|
||||||
|
}
|
||||||
int rem = (len + 6) % 16;
|
int rem = (len + 6) % 16;
|
||||||
int padding = 0;
|
int padding = 0;
|
||||||
if (rem > 0) padding = 16 - rem;
|
if (rem > 0) padding = 16 - rem;
|
||||||
memcpy (sendBuffer + 2, buf, len);
|
|
||||||
// TODO: fill padding
|
// TODO: fill padding
|
||||||
m_Adler.CalculateDigest (sendBuffer + len + 2 + padding, sendBuffer, len + 2+ padding);
|
m_Adler.CalculateDigest (sendBuffer + len + 2 + padding, sendBuffer, len + 2+ padding);
|
||||||
|
|
||||||
@ -443,12 +467,13 @@ namespace ntcp
|
|||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::async_write (m_Socket, boost::asio::buffer (sendBuffer, l), boost::asio::transfer_all (),
|
boost::asio::async_write (m_Socket, boost::asio::buffer (sendBuffer, l), boost::asio::transfer_all (),
|
||||||
boost::bind(&NTCPSession::HandleSent, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, sendBuffer));
|
boost::bind(&NTCPSession::HandleSent, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCPSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint8_t * sentBuffer)
|
void NTCPSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, i2p::I2NPMessage * msg)
|
||||||
{
|
{
|
||||||
delete sentBuffer;
|
if (msg)
|
||||||
|
i2p::DeleteI2NPMessage (msg);
|
||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint ("Couldn't send msg: ", ecode.message ());
|
LogPrint ("Couldn't send msg: ", ecode.message ());
|
||||||
@ -462,8 +487,7 @@ namespace ntcp
|
|||||||
|
|
||||||
void NTCPSession::SendTimeSyncMessage ()
|
void NTCPSession::SendTimeSyncMessage ()
|
||||||
{
|
{
|
||||||
uint32_t t = htobe32 (time (0));
|
Send (nullptr);
|
||||||
Send ((uint8_t *)&t, 4, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NTCPSession::SendI2NPMessage (I2NPMessage * msg)
|
void NTCPSession::SendI2NPMessage (I2NPMessage * msg)
|
||||||
@ -471,10 +495,7 @@ namespace ntcp
|
|||||||
if (msg)
|
if (msg)
|
||||||
{
|
{
|
||||||
if (m_IsEstablished)
|
if (m_IsEstablished)
|
||||||
{
|
Send (msg);
|
||||||
Send (msg->GetBuffer (), msg->GetLength ());
|
|
||||||
DeleteI2NPMessage (msg);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
m_DelayedMessage = msg;
|
m_DelayedMessage = msg;
|
||||||
}
|
}
|
||||||
|
@ -103,8 +103,8 @@ namespace ntcp
|
|||||||
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
||||||
void DecryptNextBlock (const uint8_t * encrypted);
|
void DecryptNextBlock (const uint8_t * encrypted);
|
||||||
|
|
||||||
void Send (const uint8_t * buf, int len, bool zeroSize = false);
|
void Send (i2p::I2NPMessage * msg);
|
||||||
void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint8_t * sentBuffer);
|
void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, i2p::I2NPMessage * msg);
|
||||||
|
|
||||||
void SendTimeSyncMessage ();
|
void SendTimeSyncMessage ();
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ namespace ntcp
|
|||||||
NTCPPhase3 m_Phase3;
|
NTCPPhase3 m_Phase3;
|
||||||
NTCPPhase4 m_Phase4;
|
NTCPPhase4 m_Phase4;
|
||||||
|
|
||||||
uint8_t m_ReceiveBuffer[i2p::NTCP_MAX_MESSAGE_SIZE*2];
|
uint8_t m_ReceiveBuffer[i2p::NTCP_MAX_MESSAGE_SIZE*2], m_TimeSyncBuffer[16];
|
||||||
int m_ReceiveBufferOffset;
|
int m_ReceiveBufferOffset;
|
||||||
|
|
||||||
i2p::I2NPMessage * m_NextMessage, * m_DelayedMessage;
|
i2p::I2NPMessage * m_NextMessage, * m_DelayedMessage;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user