|
|
@ -584,13 +584,14 @@ namespace i2p |
|
|
|
memcpy (ivKey, noiseState.m_CK , 32); |
|
|
|
memcpy (ivKey, noiseState.m_CK , 32); |
|
|
|
|
|
|
|
|
|
|
|
// check if we accept this tunnel
|
|
|
|
// check if we accept this tunnel
|
|
|
|
|
|
|
|
std::shared_ptr<i2p::tunnel::TransitTunnel> transitTunnel; |
|
|
|
uint8_t retCode = 0; |
|
|
|
uint8_t retCode = 0; |
|
|
|
if (!i2p::context.AcceptsTunnels () || i2p::context.IsHighCongestion ()) |
|
|
|
if (!i2p::context.AcceptsTunnels () || i2p::context.IsHighCongestion ()) |
|
|
|
retCode = 30; |
|
|
|
retCode = 30; |
|
|
|
if (!retCode) |
|
|
|
if (!retCode) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// create new transit tunnel
|
|
|
|
// create new transit tunnel
|
|
|
|
auto transitTunnel = i2p::tunnel::CreateTransitTunnel ( |
|
|
|
transitTunnel = i2p::tunnel::CreateTransitTunnel ( |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET), |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET), |
|
|
|
clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, |
|
|
|
clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_NEXT_TUNNEL_OFFSET), |
|
|
@ -624,11 +625,22 @@ namespace i2p |
|
|
|
reply += SHORT_TUNNEL_BUILD_RECORD_SIZE; |
|
|
|
reply += SHORT_TUNNEL_BUILD_RECORD_SIZE; |
|
|
|
} |
|
|
|
} |
|
|
|
// send reply
|
|
|
|
// send reply
|
|
|
|
|
|
|
|
auto onDrop = [transitTunnel]() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (transitTunnel) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
auto t = transitTunnel->GetCreationTime (); |
|
|
|
|
|
|
|
if (t > i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT) |
|
|
|
|
|
|
|
// make transit tunnel expired
|
|
|
|
|
|
|
|
transitTunnel->SetCreationTime (t - i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
if (isEndpoint) |
|
|
|
if (isEndpoint) |
|
|
|
{ |
|
|
|
{ |
|
|
|
auto replyMsg = NewI2NPShortMessage (); |
|
|
|
auto replyMsg = NewI2NPShortMessage (); |
|
|
|
replyMsg->Concat (buf, len); |
|
|
|
replyMsg->Concat (buf, len); |
|
|
|
replyMsg->FillI2NPMessageHeader (eI2NPShortTunnelBuildReply, bufbe32toh (clearText + SHORT_REQUEST_RECORD_SEND_MSG_ID_OFFSET)); |
|
|
|
replyMsg->FillI2NPMessageHeader (eI2NPShortTunnelBuildReply, bufbe32toh (clearText + SHORT_REQUEST_RECORD_SEND_MSG_ID_OFFSET)); |
|
|
|
|
|
|
|
if (transitTunnel) replyMsg->onDrop = onDrop; |
|
|
|
if (memcmp ((const uint8_t *)i2p::context.GetIdentHash (), |
|
|
|
if (memcmp ((const uint8_t *)i2p::context.GetIdentHash (), |
|
|
|
clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, 32)) // reply IBGW is not local?
|
|
|
|
clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, 32)) // reply IBGW is not local?
|
|
|
|
{ |
|
|
|
{ |
|
|
@ -652,9 +664,12 @@ namespace i2p |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
transports.SendMessage (clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, |
|
|
|
{ |
|
|
|
CreateI2NPMessage (eI2NPShortTunnelBuild, buf, len, |
|
|
|
auto msg = CreateI2NPMessage (eI2NPShortTunnelBuild, buf, len, |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_SEND_MSG_ID_OFFSET))); |
|
|
|
bufbe32toh (clearText + SHORT_REQUEST_RECORD_SEND_MSG_ID_OFFSET)); |
|
|
|
|
|
|
|
if (transitTunnel) msg->onDrop = onDrop; |
|
|
|
|
|
|
|
transports.SendMessage (clearText + SHORT_REQUEST_RECORD_NEXT_IDENT_OFFSET, msg); |
|
|
|
|
|
|
|
} |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
record += SHORT_TUNNEL_BUILD_RECORD_SIZE; |
|
|
|
record += SHORT_TUNNEL_BUILD_RECORD_SIZE; |
|
|
@ -714,7 +729,11 @@ namespace i2p |
|
|
|
return msg; |
|
|
|
return msg; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
return CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ()); |
|
|
|
{ |
|
|
|
|
|
|
|
auto newMsg = CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ()); |
|
|
|
|
|
|
|
if (msg->onDrop) newMsg->onDrop = msg->onDrop; |
|
|
|
|
|
|
|
return newMsg; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, |
|
|
|
std::shared_ptr<I2NPMessage> CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType, |
|
|
|