Browse Source

Merge pull request #1927 from wekoq/refactor_TBM_handling

refactor TBM hadling
pull/1928/head
orignal 2 years ago committed by GitHub
parent
commit
5a09c11e90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 80
      libi2pd/I2NPProtocol.cpp
  2. 2
      libi2pd/I2NPProtocol.h
  3. 8
      libi2pd/Tunnel.cpp

80
libi2pd/I2NPProtocol.cpp

@ -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)
@ -428,7 +428,7 @@ namespace i2p
{ {
LogPrint (eLogError, "I2NP: Too many records in VaribleTunnelBuild message ", num); LogPrint (eLogError, "I2NP: Too many records in VaribleTunnelBuild message ", num);
return; return;
} }
if (len < num*TUNNEL_BUILD_RECORD_SIZE + 1) if (len < num*TUNNEL_BUILD_RECORD_SIZE + 1)
{ {
LogPrint (eLogError, "I2NP: VaribleTunnelBuild message of ", num, " records is too short ", len); LogPrint (eLogError, "I2NP: VaribleTunnelBuild message of ", num, " records is too short ", len);
@ -486,7 +486,7 @@ namespace i2p
{ {
LogPrint (eLogError, "I2NP: Too many records in TunnelBuildReply message ", num); LogPrint (eLogError, "I2NP: Too many records in TunnelBuildReply message ", num);
return; return;
} }
size_t recordSize = isShort ? SHORT_TUNNEL_BUILD_RECORD_SIZE : TUNNEL_BUILD_RECORD_SIZE; size_t recordSize = isShort ? SHORT_TUNNEL_BUILD_RECORD_SIZE : TUNNEL_BUILD_RECORD_SIZE;
if (len < num*recordSize + 1) if (len < num*recordSize + 1)
{ {
@ -522,7 +522,7 @@ namespace i2p
{ {
LogPrint (eLogError, "I2NP: Too many records in ShortTunnelBuild message ", num); LogPrint (eLogError, "I2NP: Too many records in ShortTunnelBuild message ", num);
return; return;
} }
if (len < num*SHORT_TUNNEL_BUILD_RECORD_SIZE + 1) if (len < num*SHORT_TUNNEL_BUILD_RECORD_SIZE + 1)
{ {
LogPrint (eLogError, "I2NP: ShortTunnelBuild message of ", num, " records is too short ", len); LogPrint (eLogError, "I2NP: ShortTunnelBuild message of ", num, " records is too short ", len);
@ -748,46 +748,38 @@ namespace i2p
return l; return l;
} }
void HandleI2NPMessage (uint8_t * msg, size_t len) void HandleTunnelBuildI2NPMessage (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");
} }
} }
} }

2
libi2pd/I2NPProtocol.h

@ -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 HandleTunnelBuildI2NPMessage (std::shared_ptr<I2NPMessage> msg);
void HandleI2NPMessage (std::shared_ptr<I2NPMessage> msg); void HandleI2NPMessage (std::shared_ptr<I2NPMessage> msg);
class I2NPMessagesHandler class I2NPMessagesHandler

8
libi2pd/Tunnel.cpp

@ -516,7 +516,7 @@ namespace tunnel
case eI2NPShortTunnelBuildReply: case eI2NPShortTunnelBuildReply:
case eI2NPTunnelBuild: case eI2NPTunnelBuild:
case eI2NPTunnelBuildReply: case eI2NPTunnelBuildReply:
HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ()); HandleTunnelBuildI2NPMessage (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…
Cancel
Save