Browse Source

doesn't send peer test to a reserved address

pull/1645/head
orignal 4 years ago
parent
commit
3695aa924b
  1. 22
      libi2pd/SSUSession.cpp
  2. 16
      libi2pd/Transports.cpp

22
libi2pd/SSUSession.cpp

@ -273,7 +273,7 @@ namespace transport
s.Insert (payload, 8); // relayTag and signed on time s.Insert (payload, 8); // relayTag and signed on time
m_RelayTag = bufbe32toh (payload); m_RelayTag = bufbe32toh (payload);
payload += 4; // relayTag payload += 4; // relayTag
if (i2p::context.GetStatus () == eRouterStatusTesting) if (ourIP.is_v4 () && i2p::context.GetStatus () == eRouterStatusTesting)
{ {
auto ts = i2p::util::GetSecondsSinceEpoch (); auto ts = i2p::util::GetSecondsSinceEpoch ();
uint32_t signedOnTime = bufbe32toh(payload); uint32_t signedOnTime = bufbe32toh(payload);
@ -358,7 +358,9 @@ namespace transport
uint8_t * payload = buf + sizeof (SSUHeader); uint8_t * payload = buf + sizeof (SSUHeader);
uint8_t flag = 0; uint8_t flag = 0;
// fill extended options, 3 bytes extended options don't change message size // fill extended options, 3 bytes extended options don't change message size
if (i2p::context.GetStatus () == eRouterStatusOK) // we don't need relays bool isV4 = m_RemoteEndpoint.address ().is_v4 ();
if ((isV4 && i2p::context.GetStatus () == eRouterStatusOK) ||
(!isV4 && i2p::context.GetStatusV6 () == eRouterStatusOK)) // we don't need relays
{ {
// tell out peer to now assign relay tag // tell out peer to now assign relay tag
flag = SSU_HEADER_EXTENDED_OPTIONS_INCLUDED; flag = SSU_HEADER_EXTENDED_OPTIONS_INCLUDED;
@ -369,7 +371,6 @@ namespace transport
} }
// fill payload // fill payload
memcpy (payload, m_DHKeysPair->GetPublicKey (), 256); // x memcpy (payload, m_DHKeysPair->GetPublicKey (), 256); // x
bool isV4 = m_RemoteEndpoint.address ().is_v4 ();
if (isV4) if (isV4)
{ {
payload[256] = 4; payload[256] = 4;
@ -657,13 +658,16 @@ namespace transport
buf += ourSize; len -= ourSize; buf += ourSize; len -= ourSize;
LogPrint (eLogInfo, "SSU: Our external address is ", ourIP.to_string (), ":", ourPort); LogPrint (eLogInfo, "SSU: Our external address is ", ourIP.to_string (), ":", ourPort);
i2p::context.UpdateAddress (ourIP); i2p::context.UpdateAddress (ourIP);
if (ourPort != m_Server.GetPort ()) if (ourIP.is_v4 ())
{ {
if (i2p::context.GetStatus () == eRouterStatusTesting) if (ourPort != m_Server.GetPort ())
i2p::context.SetError (eRouterErrorSymmetricNAT); {
} if (i2p::context.GetStatus () == eRouterStatusTesting)
else if (i2p::context.GetStatus () == eRouterStatusError && i2p::context.GetError () == eRouterErrorSymmetricNAT) i2p::context.SetError (eRouterErrorSymmetricNAT);
i2p::context.SetStatus (eRouterStatusTesting); }
else if (i2p::context.GetStatus () == eRouterStatusError && i2p::context.GetError () == eRouterErrorSymmetricNAT)
i2p::context.SetStatus (eRouterStatusTesting);
}
uint32_t nonce = bufbe32toh (buf); uint32_t nonce = bufbe32toh (buf);
buf += 4; // nonce buf += 4; // nonce
auto it = m_RelayRequests.find (nonce); auto it = m_RelayRequests.find (nonce);

16
libi2pd/Transports.cpp

@ -593,12 +593,16 @@ namespace transport
auto router = i2p::data::netdb.GetRandomPeerTestRouter (true); // v4 auto router = i2p::data::netdb.GetRandomPeerTestRouter (true); // v4
if (router) if (router)
{ {
if (!statusChanged) auto addr = router->GetSSUAddress (true); // ipv4
if (addr && !i2p::util::net::IsInReservedRange(addr->host))
{ {
statusChanged = true; if (!statusChanged)
i2p::context.SetStatus (eRouterStatusTesting); // first time only {
} statusChanged = true;
m_SSUServer->CreateSession (router, true, true); // peer test v4 i2p::context.SetStatus (eRouterStatusTesting); // first time only
}
m_SSUServer->CreateSession (router, addr, true); // peer test v4
}
} }
} }
if (!statusChanged) if (!statusChanged)
@ -614,7 +618,7 @@ namespace transport
if (router) if (router)
{ {
auto addr = router->GetSSUV6Address (); auto addr = router->GetSSUV6Address ();
if (addr) if (addr && !i2p::util::net::IsInReservedRange(addr->host))
{ {
if (!statusChanged) if (!statusChanged)
{ {

Loading…
Cancel
Save