mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 11:04:00 +01:00
refactor TBM hadling
This commit is contained in:
parent
623c3f4605
commit
a158647153
|
@ -40,7 +40,7 @@ namespace i2p
|
||||||
{
|
{
|
||||||
return std::make_shared<I2NPMessageBuffer<I2NP_MAX_MEDIUM_MESSAGE_SIZE> >();
|
return std::make_shared<I2NPMessageBuffer<I2NP_MAX_MEDIUM_MESSAGE_SIZE> >();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> NewI2NPTunnelMessage (bool endpoint)
|
std::shared_ptr<I2NPMessage> NewI2NPTunnelMessage (bool endpoint)
|
||||||
{
|
{
|
||||||
return i2p::tunnel::tunnels.NewI2NPTunnelMessage (endpoint);
|
return i2p::tunnel::tunnels.NewI2NPTunnelMessage (endpoint);
|
||||||
|
@ -51,7 +51,7 @@ namespace i2p
|
||||||
len += I2NP_HEADER_SIZE + 2;
|
len += I2NP_HEADER_SIZE + 2;
|
||||||
if (len <= I2NP_MAX_SHORT_MESSAGE_SIZE) return NewI2NPShortMessage ();
|
if (len <= I2NP_MAX_SHORT_MESSAGE_SIZE) return NewI2NPShortMessage ();
|
||||||
if (len <= I2NP_MAX_MEDIUM_MESSAGE_SIZE) return NewI2NPMediumMessage ();
|
if (len <= I2NP_MAX_MEDIUM_MESSAGE_SIZE) return NewI2NPMediumMessage ();
|
||||||
return NewI2NPMessage ();
|
return NewI2NPMessage ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2NPMessage::FillI2NPMessageHeader (I2NPMessageType msgType, uint32_t replyMsgID, bool checksum)
|
void I2NPMessage::FillI2NPMessageHeader (I2NPMessageType msgType, uint32_t replyMsgID, bool checksum)
|
||||||
|
@ -748,46 +748,38 @@ namespace i2p
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleI2NPMessage (uint8_t * msg, size_t len)
|
void HandleTunnlBuildI2NPMessage (std::shared_ptr<I2NPMessage> msg)
|
||||||
{
|
{
|
||||||
if (len < I2NP_HEADER_SIZE)
|
if (msg)
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "I2NP: Message length ", len, " is smaller than header");
|
uint8_t typeID = msg->GetTypeID();
|
||||||
return;
|
uint32_t msgID = msg->GetMsgID();
|
||||||
}
|
LogPrint (eLogDebug, "I2NP: Handling tunnel build message with len=", msg->GetLength(),", type=", (int)typeID, ", msgID=", (unsigned int)msgID);
|
||||||
uint8_t typeID = msg[I2NP_HEADER_TYPEID_OFFSET];
|
uint8_t * payload = msg->GetPayload();
|
||||||
uint32_t msgID = bufbe32toh (msg + I2NP_HEADER_MSGID_OFFSET);
|
auto size = msg->GetPayloadLength();
|
||||||
LogPrint (eLogDebug, "I2NP: Msg received len=", len,", type=", (int)typeID, ", msgID=", (unsigned int)msgID);
|
switch (typeID)
|
||||||
uint8_t * buf = msg + I2NP_HEADER_SIZE;
|
{
|
||||||
auto size = bufbe16toh (msg + I2NP_HEADER_SIZE_OFFSET);
|
case eI2NPVariableTunnelBuild:
|
||||||
len -= I2NP_HEADER_SIZE;
|
HandleVariableTunnelBuildMsg (msgID, payload, size);
|
||||||
if (size > len)
|
break;
|
||||||
{
|
case eI2NPShortTunnelBuild:
|
||||||
LogPrint (eLogError, "I2NP: Payload size ", size, " exceeds buffer length ", len);
|
HandleShortTunnelBuildMsg (msgID, payload, size);
|
||||||
size = len;
|
break;
|
||||||
}
|
case eI2NPVariableTunnelBuildReply:
|
||||||
switch (typeID)
|
HandleTunnelBuildReplyMsg (msgID, payload, size, false);
|
||||||
{
|
break;
|
||||||
case eI2NPVariableTunnelBuild:
|
case eI2NPShortTunnelBuildReply:
|
||||||
HandleVariableTunnelBuildMsg (msgID, buf, size);
|
HandleTunnelBuildReplyMsg (msgID, payload, size, true);
|
||||||
break;
|
break;
|
||||||
case eI2NPShortTunnelBuild:
|
case eI2NPTunnelBuild:
|
||||||
HandleShortTunnelBuildMsg (msgID, buf, size);
|
HandleTunnelBuildMsg (payload, size);
|
||||||
break;
|
break;
|
||||||
case eI2NPVariableTunnelBuildReply:
|
case eI2NPTunnelBuildReply:
|
||||||
HandleTunnelBuildReplyMsg (msgID, buf, size, false);
|
// TODO:
|
||||||
break;
|
break;
|
||||||
case eI2NPShortTunnelBuildReply:
|
default:
|
||||||
HandleTunnelBuildReplyMsg (msgID, buf, size, true);
|
LogPrint (eLogError, "I2NP: Unexpected message with type", (int)typeID, " during handling TBM; skipping");
|
||||||
break;
|
}
|
||||||
case eI2NPTunnelBuild:
|
|
||||||
HandleTunnelBuildMsg (buf, size);
|
|
||||||
break;
|
|
||||||
case eI2NPTunnelBuildReply:
|
|
||||||
// TODO:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogPrint (eLogWarning, "I2NP: Unexpected message ", (int)typeID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -851,7 +843,7 @@ namespace i2p
|
||||||
i2p::tunnel::tunnels.PostTunnelData (msg);
|
i2p::tunnel::tunnels.PostTunnelData (msg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ());
|
LogPrint(eLogError, "I2NP: Unexpected I2NP message with type ", int(typeID), " during handling; skipping");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,7 +295,7 @@ namespace tunnel
|
||||||
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);
|
||||||
|
|
||||||
size_t GetI2NPMessageLength (const uint8_t * msg, size_t len);
|
size_t GetI2NPMessageLength (const uint8_t * msg, size_t len);
|
||||||
void HandleI2NPMessage (uint8_t * msg, size_t len);
|
void HandleTunnlBuildI2NPMessage (std::shared_ptr<I2NPMessage> msg);
|
||||||
void HandleI2NPMessage (std::shared_ptr<I2NPMessage> msg);
|
void HandleI2NPMessage (std::shared_ptr<I2NPMessage> msg);
|
||||||
|
|
||||||
class I2NPMessagesHandler
|
class I2NPMessagesHandler
|
||||||
|
|
|
@ -516,7 +516,7 @@ namespace tunnel
|
||||||
case eI2NPShortTunnelBuildReply:
|
case eI2NPShortTunnelBuildReply:
|
||||||
case eI2NPTunnelBuild:
|
case eI2NPTunnelBuild:
|
||||||
case eI2NPTunnelBuildReply:
|
case eI2NPTunnelBuildReply:
|
||||||
HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ());
|
HandleTunnlBuildI2NPMessage (msg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LogPrint (eLogWarning, "Tunnel: Unexpected message type ", (int) typeID);
|
LogPrint (eLogWarning, "Tunnel: Unexpected message type ", (int) typeID);
|
||||||
|
@ -590,13 +590,13 @@ namespace tunnel
|
||||||
// DatabaseSearchReply with new routers
|
// DatabaseSearchReply with new routers
|
||||||
i2p::data::netdb.PostI2NPMsg (CopyI2NPMessage (msg));
|
i2p::data::netdb.PostI2NPMsg (CopyI2NPMessage (msg));
|
||||||
else if (IsRouterInfoMsg (msg))
|
else if (IsRouterInfoMsg (msg))
|
||||||
{
|
{
|
||||||
// transit DatabaseStore might contain new/updated RI
|
// transit DatabaseStore might contain new/updated RI
|
||||||
auto m = CopyI2NPMessage (msg);
|
auto m = CopyI2NPMessage (msg);
|
||||||
if (bufbe32toh (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET))
|
if (bufbe32toh (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET))
|
||||||
memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0xFF, 4); // fake replyToken meaning no reply
|
memset (m->GetPayload () + DATABASE_STORE_REPLY_TOKEN_OFFSET, 0xFF, 4); // fake replyToken meaning no reply
|
||||||
i2p::data::netdb.PostI2NPMsg (m);
|
i2p::data::netdb.PostI2NPMsg (m);
|
||||||
}
|
}
|
||||||
tunnel->SendTunnelDataMsg (msg);
|
tunnel->SendTunnelDataMsg (msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -986,6 +986,6 @@ namespace tunnel
|
||||||
LogPrint (eLogDebug, "Tunnel: Max number of transit tunnels set to ", maxNumTransitTunnels);
|
LogPrint (eLogDebug, "Tunnel: Max number of transit tunnels set to ", maxNumTransitTunnels);
|
||||||
m_MaxNumTransitTunnels = maxNumTransitTunnels;
|
m_MaxNumTransitTunnels = maxNumTransitTunnels;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue