mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
always use shared_ptr for I2NPMessage
This commit is contained in:
parent
885d57138a
commit
06c4aca490
16
Datagram.cpp
16
Datagram.cpp
|
@ -48,15 +48,13 @@ namespace datagram
|
||||||
m_Owner->RequestDestination (ident, std::bind (&DatagramDestination::HandleLeaseSetRequestComplete, this, std::placeholders::_1, msg));
|
m_Owner->RequestDestination (ident, std::bind (&DatagramDestination::HandleLeaseSetRequestComplete, this, std::placeholders::_1, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatagramDestination::HandleLeaseSetRequestComplete (std::shared_ptr<i2p::data::LeaseSet> remote, I2NPMessage * msg)
|
void DatagramDestination::HandleLeaseSetRequestComplete (std::shared_ptr<i2p::data::LeaseSet> remote, std::shared_ptr<I2NPMessage> msg)
|
||||||
{
|
{
|
||||||
if (remote)
|
if (remote)
|
||||||
SendMsg (msg, remote);
|
SendMsg (msg, remote);
|
||||||
else
|
|
||||||
DeleteI2NPMessage (msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatagramDestination::SendMsg (I2NPMessage * msg, std::shared_ptr<const i2p::data::LeaseSet> remote)
|
void DatagramDestination::SendMsg (std::shared_ptr<I2NPMessage> msg, std::shared_ptr<const i2p::data::LeaseSet> remote)
|
||||||
{
|
{
|
||||||
auto outboundTunnel = m_Owner->GetTunnelPool ()->GetNextOutboundTunnel ();
|
auto outboundTunnel = m_Owner->GetTunnelPool ()->GetNextOutboundTunnel ();
|
||||||
auto leases = remote->GetNonExpiredLeases ();
|
auto leases = remote->GetNonExpiredLeases ();
|
||||||
|
@ -64,7 +62,7 @@ namespace datagram
|
||||||
{
|
{
|
||||||
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
||||||
uint32_t i = rand () % leases.size ();
|
uint32_t i = rand () % leases.size ();
|
||||||
auto garlic = m_Owner->WrapMessage (remote, ToSharedI2NPMessage (msg), true);
|
auto garlic = m_Owner->WrapMessage (remote, msg, true);
|
||||||
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
||||||
{
|
{
|
||||||
i2p::tunnel::eDeliveryTypeTunnel,
|
i2p::tunnel::eDeliveryTypeTunnel,
|
||||||
|
@ -79,7 +77,6 @@ namespace datagram
|
||||||
LogPrint (eLogWarning, "Failed to send datagram. All leases expired");
|
LogPrint (eLogWarning, "Failed to send datagram. All leases expired");
|
||||||
else
|
else
|
||||||
LogPrint (eLogWarning, "Failed to send datagram. No outbound tunnels");
|
LogPrint (eLogWarning, "Failed to send datagram. No outbound tunnels");
|
||||||
DeleteI2NPMessage (msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,9 +120,9 @@ namespace datagram
|
||||||
HandleDatagram (fromPort, toPort, uncompressed, uncompressedLen);
|
HandleDatagram (fromPort, toPort, uncompressed, uncompressedLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * DatagramDestination::CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort)
|
std::shared_ptr<I2NPMessage> DatagramDestination::CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage ();
|
auto msg = NewI2NPMessage ();
|
||||||
uint8_t * buf = msg->GetPayload ();
|
uint8_t * buf = msg->GetPayload ();
|
||||||
buf += 4; // reserve for length
|
buf += 4; // reserve for length
|
||||||
size_t size = m_Deflator.Deflate (payload, len, buf, msg->maxLen - msg->len);
|
size_t size = m_Deflator.Deflate (payload, len, buf, msg->maxLen - msg->len);
|
||||||
|
@ -139,10 +136,7 @@ namespace datagram
|
||||||
msg->FillI2NPMessageHeader (eI2NPData);
|
msg->FillI2NPMessageHeader (eI2NPData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
DeleteI2NPMessage (msg);
|
|
||||||
msg = nullptr;
|
msg = nullptr;
|
||||||
}
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,10 +39,10 @@ namespace datagram
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void HandleLeaseSetRequestComplete (std::shared_ptr<i2p::data::LeaseSet> leaseSet, I2NPMessage * msg);
|
void HandleLeaseSetRequestComplete (std::shared_ptr<i2p::data::LeaseSet> leaseSet, std::shared_ptr<I2NPMessage> msg);
|
||||||
|
|
||||||
I2NPMessage * CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort);
|
std::shared_ptr<I2NPMessage> CreateDataMessage (const uint8_t * payload, size_t len, uint16_t fromPort, uint16_t toPort);
|
||||||
void SendMsg (I2NPMessage * msg, std::shared_ptr<const i2p::data::LeaseSet> remote);
|
void SendMsg (std::shared_ptr<I2NPMessage> msg, std::shared_ptr<const i2p::data::LeaseSet> remote);
|
||||||
void HandleDatagram (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleDatagram (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -112,7 +112,7 @@ namespace garlic
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> GarlicRoutingSession::WrapSingleMessage (std::shared_ptr<const I2NPMessage> msg)
|
std::shared_ptr<I2NPMessage> GarlicRoutingSession::WrapSingleMessage (std::shared_ptr<const I2NPMessage> msg)
|
||||||
{
|
{
|
||||||
auto m = ToSharedI2NPMessage(NewI2NPMessage ());
|
auto m = NewI2NPMessage ();
|
||||||
m->Align (12); // in order to get buf aligned to 16 (12 + 4)
|
m->Align (12); // in order to get buf aligned to 16 (12 + 4)
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
uint8_t * buf = m->GetPayload () + 4; // 4 bytes for length
|
uint8_t * buf = m->GetPayload () + 4; // 4 bytes for length
|
||||||
|
|
|
@ -18,31 +18,21 @@ using namespace i2p::transport;
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
I2NPMessage * NewI2NPMessage ()
|
std::shared_ptr<I2NPMessage> NewI2NPMessage ()
|
||||||
{
|
{
|
||||||
return new I2NPMessageBuffer<I2NP_MAX_MESSAGE_SIZE>();
|
return std::make_shared<I2NPMessageBuffer<I2NP_MAX_MESSAGE_SIZE> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * NewI2NPShortMessage ()
|
std::shared_ptr<I2NPMessage> NewI2NPShortMessage ()
|
||||||
{
|
{
|
||||||
return new I2NPMessageBuffer<I2NP_MAX_SHORT_MESSAGE_SIZE>();
|
return std::make_shared<I2NPMessageBuffer<I2NP_MAX_SHORT_MESSAGE_SIZE> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * NewI2NPMessage (size_t len)
|
std::shared_ptr<I2NPMessage> NewI2NPMessage (size_t len)
|
||||||
{
|
{
|
||||||
return (len < I2NP_MAX_SHORT_MESSAGE_SIZE/2) ? NewI2NPShortMessage () : NewI2NPMessage ();
|
return (len < I2NP_MAX_SHORT_MESSAGE_SIZE/2) ? NewI2NPShortMessage () : NewI2NPMessage ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteI2NPMessage (I2NPMessage * msg)
|
|
||||||
{
|
|
||||||
delete msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> ToSharedI2NPMessage (I2NPMessage * msg)
|
|
||||||
{
|
|
||||||
return std::shared_ptr<I2NPMessage>(msg, DeleteI2NPMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2NPMessage::FillI2NPMessageHeader (I2NPMessageType msgType, uint32_t replyMsgID)
|
void I2NPMessage::FillI2NPMessageHeader (I2NPMessageType msgType, uint32_t replyMsgID)
|
||||||
{
|
{
|
||||||
SetTypeID (msgType);
|
SetTypeID (msgType);
|
||||||
|
@ -61,9 +51,9 @@ namespace i2p
|
||||||
SetExpiration (i2p::util::GetMillisecondsSinceEpoch () + 5000);
|
SetExpiration (i2p::util::GetMillisecondsSinceEpoch () + 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID)
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage (len);
|
auto msg = NewI2NPMessage (len);
|
||||||
if (msg->len + len < msg->maxLen)
|
if (msg->len + len < msg->maxLen)
|
||||||
{
|
{
|
||||||
memcpy (msg->GetPayload (), buf, len);
|
memcpy (msg->GetPayload (), buf, len);
|
||||||
|
@ -77,7 +67,7 @@ namespace i2p
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from)
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage ();
|
auto msg = NewI2NPMessage ();
|
||||||
if (msg->offset + len < msg->maxLen)
|
if (msg->offset + len < msg->maxLen)
|
||||||
{
|
{
|
||||||
memcpy (msg->GetBuffer (), buf, len);
|
memcpy (msg->GetBuffer (), buf, len);
|
||||||
|
@ -86,12 +76,12 @@ namespace i2p
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint (eLogError, "I2NP message length ", len, " exceeds max length");
|
LogPrint (eLogError, "I2NP message length ", len, " exceeds max length");
|
||||||
return ToSharedI2NPMessage(msg);
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID)
|
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID)
|
||||||
{
|
{
|
||||||
I2NPMessage * m = NewI2NPShortMessage ();
|
auto m = NewI2NPShortMessage ();
|
||||||
uint8_t * buf = m->GetPayload ();
|
uint8_t * buf = m->GetPayload ();
|
||||||
if (msgID)
|
if (msgID)
|
||||||
{
|
{
|
||||||
|
@ -106,13 +96,13 @@ namespace i2p
|
||||||
}
|
}
|
||||||
m->len += DELIVERY_STATUS_SIZE;
|
m->len += DELIVERY_STATUS_SIZE;
|
||||||
m->FillI2NPMessageHeader (eI2NPDeliveryStatus);
|
m->FillI2NPMessageHeader (eI2NPDeliveryStatus);
|
||||||
return ToSharedI2NPMessage (m);
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
|
std::shared_ptr<I2NPMessage> CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
|
||||||
uint32_t replyTunnelID, bool exploratory, std::set<i2p::data::IdentHash> * excludedPeers)
|
uint32_t replyTunnelID, bool exploratory, std::set<i2p::data::IdentHash> * excludedPeers)
|
||||||
{
|
{
|
||||||
auto m = ToSharedI2NPMessage (excludedPeers ? NewI2NPMessage () : NewI2NPShortMessage ());
|
auto m = excludedPeers ? NewI2NPMessage () : NewI2NPShortMessage ();
|
||||||
uint8_t * buf = m->GetPayload ();
|
uint8_t * buf = m->GetPayload ();
|
||||||
memcpy (buf, key, 32); // key
|
memcpy (buf, key, 32); // key
|
||||||
buf += 32;
|
buf += 32;
|
||||||
|
@ -159,7 +149,7 @@ namespace i2p
|
||||||
const i2p::tunnel::InboundTunnel * replyTunnel, const uint8_t * replyKey, const uint8_t * replyTag)
|
const i2p::tunnel::InboundTunnel * replyTunnel, const uint8_t * replyKey, const uint8_t * replyTag)
|
||||||
{
|
{
|
||||||
int cnt = excludedFloodfills.size ();
|
int cnt = excludedFloodfills.size ();
|
||||||
auto m = ToSharedI2NPMessage (cnt > 0 ? NewI2NPMessage () : NewI2NPShortMessage ());
|
auto m = cnt > 0 ? NewI2NPMessage () : NewI2NPShortMessage ();
|
||||||
uint8_t * buf = m->GetPayload ();
|
uint8_t * buf = m->GetPayload ();
|
||||||
memcpy (buf, dest, 32); // key
|
memcpy (buf, dest, 32); // key
|
||||||
buf += 32;
|
buf += 32;
|
||||||
|
@ -194,7 +184,7 @@ namespace i2p
|
||||||
std::shared_ptr<I2NPMessage> CreateDatabaseSearchReply (const i2p::data::IdentHash& ident,
|
std::shared_ptr<I2NPMessage> CreateDatabaseSearchReply (const i2p::data::IdentHash& ident,
|
||||||
std::vector<i2p::data::IdentHash> routers)
|
std::vector<i2p::data::IdentHash> routers)
|
||||||
{
|
{
|
||||||
auto m = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto m = NewI2NPShortMessage ();
|
||||||
uint8_t * buf = m->GetPayload ();
|
uint8_t * buf = m->GetPayload ();
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
memcpy (buf, ident, 32);
|
memcpy (buf, ident, 32);
|
||||||
|
@ -218,7 +208,7 @@ namespace i2p
|
||||||
if (!router) // we send own RouterInfo
|
if (!router) // we send own RouterInfo
|
||||||
router = context.GetSharedRouterInfo ();
|
router = context.GetSharedRouterInfo ();
|
||||||
|
|
||||||
auto m = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto m = NewI2NPShortMessage ();
|
||||||
uint8_t * payload = m->GetPayload ();
|
uint8_t * payload = m->GetPayload ();
|
||||||
|
|
||||||
memcpy (payload + DATABASE_STORE_KEY_OFFSET, router->GetIdentHash (), 32);
|
memcpy (payload + DATABASE_STORE_KEY_OFFSET, router->GetIdentHash (), 32);
|
||||||
|
@ -253,7 +243,7 @@ namespace i2p
|
||||||
std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::LeaseSet> leaseSet, uint32_t replyToken)
|
std::shared_ptr<I2NPMessage> CreateDatabaseStoreMsg (std::shared_ptr<const i2p::data::LeaseSet> leaseSet, uint32_t replyToken)
|
||||||
{
|
{
|
||||||
if (!leaseSet) return nullptr;
|
if (!leaseSet) return nullptr;
|
||||||
auto m = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto m = NewI2NPShortMessage ();
|
||||||
uint8_t * payload = m->GetPayload ();
|
uint8_t * payload = m->GetPayload ();
|
||||||
memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetIdentHash (), 32);
|
memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetIdentHash (), 32);
|
||||||
payload[DATABASE_STORE_TYPE_OFFSET] = 1; // LeaseSet
|
payload[DATABASE_STORE_TYPE_OFFSET] = 1; // LeaseSet
|
||||||
|
@ -358,14 +348,14 @@ namespace i2p
|
||||||
{
|
{
|
||||||
// so we send it to reply tunnel
|
// so we send it to reply tunnel
|
||||||
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
ToSharedI2NPMessage (CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
||||||
eI2NPVariableTunnelBuildReply, buf, len,
|
eI2NPVariableTunnelBuildReply, buf, len,
|
||||||
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
ToSharedI2NPMessage (CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len,
|
CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len,
|
||||||
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -379,14 +369,14 @@ namespace i2p
|
||||||
{
|
{
|
||||||
// so we send it to reply tunnel
|
// so we send it to reply tunnel
|
||||||
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
ToSharedI2NPMessage (CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
CreateTunnelGatewayMsg (bufbe32toh (clearText + BUILD_REQUEST_RECORD_NEXT_TUNNEL_OFFSET),
|
||||||
eI2NPTunnelBuildReply, buf, len,
|
eI2NPTunnelBuildReply, buf, len,
|
||||||
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
transports.SendMessage (clearText + BUILD_REQUEST_RECORD_NEXT_IDENT_OFFSET,
|
||||||
ToSharedI2NPMessage (CreateI2NPMessage (eI2NPTunnelBuild, buf, len,
|
CreateI2NPMessage (eI2NPTunnelBuild, buf, len,
|
||||||
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET))));
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,18 +404,18 @@ namespace i2p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf)
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (const uint8_t * buf)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPShortMessage ();
|
auto msg = NewI2NPShortMessage ();
|
||||||
memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
|
memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
|
||||||
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
||||||
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
msg->FillI2NPMessageHeader (eI2NPTunnelData);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPShortMessage ();
|
auto msg = NewI2NPShortMessage ();
|
||||||
memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
|
memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
|
||||||
htobe32buf (msg->GetPayload (), tunnelID);
|
htobe32buf (msg->GetPayload (), tunnelID);
|
||||||
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
||||||
|
@ -435,14 +425,14 @@ namespace i2p
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateEmptyTunnelDataMsg ()
|
std::shared_ptr<I2NPMessage> CreateEmptyTunnelDataMsg ()
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPShortMessage ();
|
auto msg = NewI2NPShortMessage ();
|
||||||
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
||||||
return ToSharedI2NPMessage (msg);
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len)
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage (len);
|
auto msg = NewI2NPMessage (len);
|
||||||
uint8_t * payload = msg->GetPayload ();
|
uint8_t * payload = msg->GetPayload ();
|
||||||
htobe32buf (payload + TUNNEL_GATEWAY_HEADER_TUNNELID_OFFSET, tunnelID);
|
htobe32buf (payload + TUNNEL_GATEWAY_HEADER_TUNNELID_OFFSET, tunnelID);
|
||||||
htobe16buf (payload + TUNNEL_GATEWAY_HEADER_LENGTH_OFFSET, len);
|
htobe16buf (payload + TUNNEL_GATEWAY_HEADER_LENGTH_OFFSET, len);
|
||||||
|
@ -467,16 +457,13 @@ namespace i2p
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
return CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ());
|
||||||
I2NPMessage * msg1 = CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ());
|
|
||||||
return ToSharedI2NPMessage (msg1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
|
||||||
const uint8_t * buf, size_t len, uint32_t replyMsgID)
|
const uint8_t * buf, size_t len, uint32_t replyMsgID)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage (len);
|
auto msg = NewI2NPMessage (len);
|
||||||
size_t gatewayMsgOffset = I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE;
|
size_t gatewayMsgOffset = I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE;
|
||||||
msg->offset += gatewayMsgOffset;
|
msg->offset += gatewayMsgOffset;
|
||||||
msg->len += gatewayMsgOffset;
|
msg->len += gatewayMsgOffset;
|
||||||
|
|
|
@ -196,13 +196,11 @@ namespace tunnel
|
||||||
uint8_t m_Buffer[sz + 16];
|
uint8_t m_Buffer[sz + 16];
|
||||||
};
|
};
|
||||||
|
|
||||||
I2NPMessage * NewI2NPMessage ();
|
std::shared_ptr<I2NPMessage> NewI2NPMessage ();
|
||||||
I2NPMessage * NewI2NPShortMessage ();
|
std::shared_ptr<I2NPMessage> NewI2NPShortMessage ();
|
||||||
I2NPMessage * NewI2NPMessage (size_t len);
|
std::shared_ptr<I2NPMessage> NewI2NPMessage (size_t len);
|
||||||
void DeleteI2NPMessage (I2NPMessage * msg);
|
|
||||||
std::shared_ptr<I2NPMessage> ToSharedI2NPMessage (I2NPMessage * msg);
|
|
||||||
|
|
||||||
I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0);
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0);
|
||||||
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from = nullptr);
|
std::shared_ptr<I2NPMessage> CreateI2NPMessage (const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from = nullptr);
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID);
|
std::shared_ptr<I2NPMessage> CreateDeliveryStatusMsg (uint32_t msgID);
|
||||||
|
@ -221,12 +219,12 @@ namespace tunnel
|
||||||
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
|
||||||
void HandleTunnelBuildMsg (uint8_t * buf, size_t len);
|
void HandleTunnelBuildMsg (uint8_t * buf, size_t len);
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf);
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (const uint8_t * buf);
|
||||||
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload);
|
std::shared_ptr<I2NPMessage> CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload);
|
||||||
std::shared_ptr<I2NPMessage> CreateEmptyTunnelDataMsg ();
|
std::shared_ptr<I2NPMessage> CreateEmptyTunnelDataMsg ();
|
||||||
|
|
||||||
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len);
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len);
|
||||||
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
|
||||||
const uint8_t * buf, size_t len, uint32_t replyMsgID = 0);
|
const uint8_t * buf, size_t len, uint32_t replyMsgID = 0);
|
||||||
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, std::shared_ptr<I2NPMessage> msg);
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, std::shared_ptr<I2NPMessage> msg);
|
||||||
|
|
||||||
|
|
|
@ -555,7 +555,7 @@ namespace transport
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto msg = dataSize <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage ();
|
auto msg = dataSize <= I2NP_MAX_SHORT_MESSAGE_SIZE - 2 ? NewI2NPShortMessage () : NewI2NPMessage ();
|
||||||
m_NextMessage = ToSharedI2NPMessage (msg);
|
m_NextMessage = msg;
|
||||||
memcpy (m_NextMessage->buf, buf, 16);
|
memcpy (m_NextMessage->buf, buf, 16);
|
||||||
m_NextMessageOffset = 16;
|
m_NextMessageOffset = 16;
|
||||||
m_NextMessage->offset = 2; // size field
|
m_NextMessage->offset = 2; // size field
|
||||||
|
|
|
@ -478,7 +478,7 @@ namespace data
|
||||||
if (context.IsFloodfill ())
|
if (context.IsFloodfill ())
|
||||||
{
|
{
|
||||||
// flood it
|
// flood it
|
||||||
auto floodMsg = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto floodMsg = NewI2NPShortMessage ();
|
||||||
uint8_t * payload = floodMsg->GetPayload ();
|
uint8_t * payload = floodMsg->GetPayload ();
|
||||||
memcpy (payload, buf, 33); // key + type
|
memcpy (payload, buf, 33); // key + type
|
||||||
htobe32buf (payload + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0); // zero reply token
|
htobe32buf (payload + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0); // zero reply token
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace transport
|
||||||
if (msg->len + fragmentSize > msg->maxLen)
|
if (msg->len + fragmentSize > msg->maxLen)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "SSU I2NP message size ", msg->maxLen, " is not enough");
|
LogPrint (eLogInfo, "SSU I2NP message size ", msg->maxLen, " is not enough");
|
||||||
auto newMsg = ToSharedI2NPMessage(NewI2NPMessage ());
|
auto newMsg = NewI2NPMessage ();
|
||||||
*newMsg = *msg;
|
*newMsg = *msg;
|
||||||
msg = newMsg;
|
msg = newMsg;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ namespace transport
|
||||||
if (it == m_IncompleteMessages.end ())
|
if (it == m_IncompleteMessages.end ())
|
||||||
{
|
{
|
||||||
// create new message
|
// create new message
|
||||||
auto msg = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto msg = NewI2NPShortMessage ();
|
||||||
msg->len -= I2NP_SHORT_HEADER_SIZE;
|
msg->len -= I2NP_SHORT_HEADER_SIZE;
|
||||||
it = m_IncompleteMessages.insert (std::make_pair (msgID,
|
it = m_IncompleteMessages.insert (std::make_pair (msgID,
|
||||||
std::unique_ptr<IncompleteMessage>(new IncompleteMessage (msg)))).first;
|
std::unique_ptr<IncompleteMessage>(new IncompleteMessage (msg)))).first;
|
||||||
|
|
|
@ -764,7 +764,7 @@ namespace stream
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> Stream::CreateDataMessage (const uint8_t * payload, size_t len)
|
std::shared_ptr<I2NPMessage> Stream::CreateDataMessage (const uint8_t * payload, size_t len)
|
||||||
{
|
{
|
||||||
auto msg = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
auto msg = NewI2NPShortMessage ();
|
||||||
if (len <= i2p::stream::COMPRESSION_THRESHOLD_SIZE)
|
if (len <= i2p::stream::COMPRESSION_THRESHOLD_SIZE)
|
||||||
m_LocalDestination.m_Deflator.SetCompressionLevel (Z_NO_COMPRESSION);
|
m_LocalDestination.m_Deflator.SetCompressionLevel (Z_NO_COMPRESSION);
|
||||||
else
|
else
|
||||||
|
|
|
@ -85,9 +85,9 @@ namespace tunnel
|
||||||
|
|
||||||
// send message
|
// send message
|
||||||
if (outboundTunnel)
|
if (outboundTunnel)
|
||||||
outboundTunnel->SendTunnelDataMsg (GetNextIdentHash (), 0, ToSharedI2NPMessage (msg));
|
outboundTunnel->SendTunnelDataMsg (GetNextIdentHash (), 0, msg);
|
||||||
else
|
else
|
||||||
i2p::transport::transports.SendMessage (GetNextIdentHash (), ToSharedI2NPMessage (msg));
|
i2p::transport::transports.SendMessage (GetNextIdentHash (), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tunnel::HandleTunnelBuildResponse (uint8_t * msg, size_t len)
|
bool Tunnel::HandleTunnelBuildResponse (uint8_t * msg, size_t len)
|
||||||
|
|
|
@ -93,7 +93,7 @@ namespace tunnel
|
||||||
if (fragment + size < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
|
if (fragment + size < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
|
||||||
{
|
{
|
||||||
// this is not last message. we have to copy it
|
// this is not last message. we have to copy it
|
||||||
m.data = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
m.data = NewI2NPShortMessage ();
|
||||||
m.data->offset += TUNNEL_GATEWAY_HEADER_SIZE; // reserve room for TunnelGateway header
|
m.data->offset += TUNNEL_GATEWAY_HEADER_SIZE; // reserve room for TunnelGateway header
|
||||||
m.data->len += TUNNEL_GATEWAY_HEADER_SIZE;
|
m.data->len += TUNNEL_GATEWAY_HEADER_SIZE;
|
||||||
*(m.data) = *msg;
|
*(m.data) = *msg;
|
||||||
|
@ -148,7 +148,7 @@ namespace tunnel
|
||||||
if (msg.data->len + size > msg.data->maxLen)
|
if (msg.data->len + size > msg.data->maxLen)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough");
|
LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough");
|
||||||
auto newMsg = ToSharedI2NPMessage (NewI2NPMessage ());
|
auto newMsg = NewI2NPMessage ();
|
||||||
*newMsg = *(msg.data);
|
*newMsg = *(msg.data);
|
||||||
msg.data = newMsg;
|
msg.data = newMsg;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ namespace tunnel
|
||||||
if (msg.data->len + size > msg.data->maxLen)
|
if (msg.data->len + size > msg.data->maxLen)
|
||||||
{
|
{
|
||||||
LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough");
|
LogPrint (eLogInfo, "Tunnel endpoint I2NP message size ", msg.data->maxLen, " is not enough");
|
||||||
auto newMsg = ToSharedI2NPMessage (NewI2NPMessage ());
|
auto newMsg = NewI2NPMessage ();
|
||||||
*newMsg = *(msg.data);
|
*newMsg = *(msg.data);
|
||||||
msg.data = newMsg;
|
msg.data = newMsg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,7 @@ namespace tunnel
|
||||||
|
|
||||||
void TunnelGatewayBuffer::CreateCurrentTunnelDataMessage ()
|
void TunnelGatewayBuffer::CreateCurrentTunnelDataMessage ()
|
||||||
{
|
{
|
||||||
m_CurrentTunnelDataMsg = ToSharedI2NPMessage (NewI2NPShortMessage ());
|
m_CurrentTunnelDataMsg = NewI2NPShortMessage ();
|
||||||
m_CurrentTunnelDataMsg->Align (12);
|
m_CurrentTunnelDataMsg->Align (12);
|
||||||
// we reserve space for padding
|
// we reserve space for padding
|
||||||
m_CurrentTunnelDataMsg->offset += TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE;
|
m_CurrentTunnelDataMsg->offset += TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE;
|
||||||
|
|
Loading…
Reference in a new issue