Browse Source

don't iterate through addresses when it's not necessary

pull/1828/head
orignal 2 years ago
parent
commit
476e6aae35
  1. 86
      libi2pd/RouterContext.cpp
  2. 106
      libi2pd/RouterInfo.cpp

86
libi2pd/RouterContext.cpp

@ -427,35 +427,53 @@ namespace i2p
auto addresses = m_RouterInfo.GetAddresses (); auto addresses = m_RouterInfo.GetAddresses ();
if (!addresses) return; if (!addresses) return;
bool updated = false; bool updated = false;
for (auto& address : *addresses) if (host.is_v4 ())
{
auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V4Idx];
if (addr && addr->host != host)
{
addr->host = host;
updated = true;
}
addr = (*addresses)[i2p::data::RouterInfo::eSSU2V4Idx];
if (addr && addr->host != host)
{
addr->host = host;
updated = true;
}
}
else if (host.is_v6 ())
{ {
if (!address) continue; auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V6Idx];
if (address->host != host && address->IsCompatible (host) && if (addr && addr->host != host)
!i2p::util::net::IsYggdrasilAddress (address->host))
{ {
// update host addr->host = host;
address->host = host;
updated = true; updated = true;
} }
if (host.is_v6 () && address->IsV6 () && address->ssu && addr = (*addresses)[i2p::data::RouterInfo::eSSU2V6Idx];
(!address->ssu->mtu || updated) && m_StatusV6 != eRouterStatusProxy) if (addr && (addr->host != host || !addr->ssu->mtu))
{ {
// update MTU addr->host = host;
auto mtu = i2p::util::net::GetMTU (host); if (m_StatusV6 != eRouterStatusProxy)
if (mtu)
{ {
LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); // update MTU
int maxMTU = i2p::util::net::GetMaxMTU (host.to_v6 ()); auto mtu = i2p::util::net::GetMTU (host);
if (mtu > maxMTU) if (mtu)
{ {
mtu = maxMTU; LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu);
LogPrint(eLogWarning, "Router: MTU dropped to upper limit of ", maxMTU, " bytes"); int maxMTU = i2p::util::net::GetMaxMTU (host.to_v6 ());
if (mtu > maxMTU)
{
mtu = maxMTU;
LogPrint(eLogWarning, "Router: MTU dropped to upper limit of ", maxMTU, " bytes");
}
addr->ssu->mtu = mtu;
} }
address->ssu->mtu = mtu;
updated = true;
} }
updated = true;
} }
} }
auto ts = i2p::util::GetSecondsSinceEpoch (); auto ts = i2p::util::GetSecondsSinceEpoch ();
if (updated || ts > m_LastUpdateTime + ROUTER_INFO_UPDATE_INTERVAL) if (updated || ts > m_LastUpdateTime + ROUTER_INFO_UPDATE_INTERVAL)
UpdateRouterInfo (); UpdateRouterInfo ();
@ -477,18 +495,12 @@ namespace i2p
void RouterContext::ClearSSU2Introducers (bool v4) void RouterContext::ClearSSU2Introducers (bool v4)
{ {
auto addresses = m_RouterInfo.GetAddresses (); auto addr = m_RouterInfo.GetSSU2Address (v4);
if (!addresses) return; if (addr && !addr->ssu->introducers.empty ())
bool updated = false; {
for (auto& addr : *addresses) addr->ssu->introducers.clear ();
if (addr && addr->IsSSU2 () && ((v4 && addr->IsV4 ()) || (!v4 && addr->IsV6 ())) &&
addr->ssu && !addr->ssu->introducers.empty ())
{
addr->ssu->introducers.clear ();
updated = true;
}
if (updated)
UpdateRouterInfo (); UpdateRouterInfo ();
}
} }
void RouterContext::SetFloodfill (bool floodfill) void RouterContext::SetFloodfill (bool floodfill)
@ -829,26 +841,26 @@ namespace i2p
{ {
if (supportsmesh) if (supportsmesh)
{ {
auto addresses = m_RouterInfo.GetAddresses ();
if (!addresses) return;
m_RouterInfo.EnableMesh (); m_RouterInfo.EnableMesh ();
if ((*addresses)[i2p::data::RouterInfo::eNTCP2V6MeshIdx]) return; // we have mesh address already
uint16_t port = 0; uint16_t port = 0;
i2p::config::GetOption ("ntcp2.port", port); i2p::config::GetOption ("ntcp2.port", port);
if (!port) i2p::config::GetOption("port", port); if (!port) i2p::config::GetOption("port", port);
bool foundMesh = false; if (!port)
auto addresses = m_RouterInfo.GetAddresses ();
if (addresses)
{ {
for (auto& addr: *addresses) for (auto& addr: *addresses)
{ {
if (!port && addr) port = addr->port; if (addr && addr->port)
if (addr && i2p::util::net::IsYggdrasilAddress (addr->host))
{ {
foundMesh = true; port = addr->port;
break; break;
} }
} }
} }
if (!foundMesh) if (!port) port = SelectRandomPort ();
m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, host, port); m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, host, port);
} }
else else
m_RouterInfo.DisableMesh (); m_RouterInfo.DisableMesh ();

106
libi2pd/RouterInfo.cpp

@ -742,15 +742,17 @@ namespace data
{ {
if (IsV6 ()) if (IsV6 ())
{ {
for (auto& it : *m_Addresses) if ((*m_Addresses)[eNTCP2V6Idx])
{ {
if (it && it->IsV6 ()) if ((*m_Addresses)[eNTCP2V6Idx]->IsV4 ())
{ (*m_Addresses)[eNTCP2V6Idx]->caps &= ~AddressCaps::eV6;
if (it->IsV4 ()) (*m_Addresses)[eNTCP2V6Idx].reset ();
it->caps &= ~AddressCaps::eV6; }
else if ((*m_Addresses)[eSSU2V6Idx])
it.reset (); {
} if ((*m_Addresses)[eSSU2V6Idx]->IsV4 ())
(*m_Addresses)[eSSU2V6Idx]->caps &= ~AddressCaps::eV6;
(*m_Addresses)[eSSU2V6Idx].reset ();
} }
UpdateSupportedTransports (); UpdateSupportedTransports ();
} }
@ -760,15 +762,17 @@ namespace data
{ {
if (IsV4 ()) if (IsV4 ())
{ {
for (auto& it : *m_Addresses) if ((*m_Addresses)[eNTCP2V4Idx])
{ {
if (it && it->IsV4 ()) if ((*m_Addresses)[eNTCP2V4Idx]->IsV6 ())
{ (*m_Addresses)[eNTCP2V4Idx]->caps &= ~AddressCaps::eV4;
if (it->IsV6 ()) (*m_Addresses)[eNTCP2V4Idx].reset ();
it->caps &= ~AddressCaps::eV4; }
else if ((*m_Addresses)[eSSU2V4Idx])
it.reset (); {
} if ((*m_Addresses)[eSSU2V4Idx]->IsV6 ())
(*m_Addresses)[eSSU2V4Idx]->caps &= ~AddressCaps::eV4;
(*m_Addresses)[eSSU2V4Idx].reset ();
} }
UpdateSupportedTransports (); UpdateSupportedTransports ();
} }
@ -789,11 +793,7 @@ namespace data
{ {
m_SupportedTransports &= ~eNTCP2V6Mesh; m_SupportedTransports &= ~eNTCP2V6Mesh;
m_ReachableTransports &= ~eNTCP2V6Mesh; m_ReachableTransports &= ~eNTCP2V6Mesh;
for (auto& it: *m_Addresses) (*m_Addresses)[eNTCP2V6MeshIdx].reset ();
{
if (it && i2p::util::net::IsYggdrasilAddress (it->host))
it.reset ();
}
} }
} }
@ -859,12 +859,10 @@ namespace data
std::shared_ptr<const RouterInfo::Address> RouterInfo::GetSSU2AddressWithStaticKey (const uint8_t * key, bool isV6) const std::shared_ptr<const RouterInfo::Address> RouterInfo::GetSSU2AddressWithStaticKey (const uint8_t * key, bool isV6) const
{ {
if (!key) return nullptr; if (!key) return nullptr;
return GetAddress ( auto addr = (*GetAddresses ())[isV6 ? eSSU2V6Idx : eSSU2V4Idx];
[key, isV6](std::shared_ptr<const RouterInfo::Address> address)->bool if (addr && !memcmp (addr->s, key, 32))
{ return addr;
return address->IsSSU2 () && !memcmp (address->s, key, 32) && return nullptr;
((isV6 && address->IsV6 ()) || (!isV6 && address->IsV4 ()));
});
} }
std::shared_ptr<const RouterInfo::Address> RouterInfo::GetPublishedNTCP2V4Address () const std::shared_ptr<const RouterInfo::Address> RouterInfo::GetPublishedNTCP2V4Address () const
@ -910,23 +908,15 @@ namespace data
bool RouterInfo::IsSSU2PeerTesting (bool v4) const bool RouterInfo::IsSSU2PeerTesting (bool v4) const
{ {
if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false; if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false;
return (bool)GetAddress ( auto addr = (*GetAddresses ())[v4 ? eSSU2V4Idx : eSSU2V6Idx];
[v4](std::shared_ptr<const RouterInfo::Address> address)->bool return addr && addr->IsPeerTesting () && addr->IsReachableSSU ();
{
return (address->IsSSU2 ()) && address->IsPeerTesting () &&
((v4 && address->IsV4 ()) || (!v4 && address->IsV6 ())) && address->IsReachableSSU ();
});
} }
bool RouterInfo::IsSSU2Introducer (bool v4) const bool RouterInfo::IsSSU2Introducer (bool v4) const
{ {
if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false; if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false;
return (bool)GetAddress ( auto addr = (*GetAddresses ())[v4 ? eSSU2V4Idx : eSSU2V6Idx];
[v4](std::shared_ptr<const RouterInfo::Address> address)->bool return addr && addr->IsIntroducer () && !addr->host.is_unspecified () && addr->port;
{
return (address->IsSSU2 ()) && address->IsIntroducer () &&
((v4 && address->IsV4 ()) || (!v4 && address->IsV6 ())) && !address->host.is_unspecified ();
});
} }
void RouterInfo::SetUnreachableAddressesTransportCaps (uint8_t transports) void RouterInfo::SetUnreachableAddressesTransportCaps (uint8_t transports)
@ -1269,16 +1259,14 @@ namespace data
{ {
auto addresses = GetAddresses (); auto addresses = GetAddresses ();
if (!addresses) return false; if (!addresses) return false;
for (auto& addr : *addresses) auto addr = (*addresses)[v4 ? eSSU2V4Idx : eSSU2V6Idx];
if (addr)
{ {
if (addr && addr->IsSSU2 () && ((v4 && addr->IsV4 ()) || (!v4 && addr->IsV6 ()))) for (auto& intro: addr->ssu->introducers)
{ if (intro.iTag == introducer.iTag) return false; // already presented
for (auto& intro: addr->ssu->introducers) addr->ssu->introducers.push_back (introducer);
if (intro.iTag == introducer.iTag) return false; // already presented SetReachableTransports (GetReachableTransports () | ((addr->IsV4 () ? eSSU2V4 : eSSU2V6)));
addr->ssu->introducers.push_back (introducer); return true;
SetReachableTransports (GetReachableTransports () | ((addr->IsV4 () ? eSSU2V4 : eSSU2V6)));
return true;
}
} }
return false; return false;
} }
@ -1287,19 +1275,17 @@ namespace data
{ {
auto addresses = GetAddresses (); auto addresses = GetAddresses ();
if (!addresses) return false; if (!addresses) return false;
for (auto& addr: *addresses) auto addr = (*addresses)[v4 ? eSSU2V4Idx : eSSU2V6Idx];
if (addr)
{ {
if (addr && addr->IsSSU2 () && ((v4 && addr->IsV4 ()) || (!v4 && addr->IsV6 ()))) for (auto it = addr->ssu->introducers.begin (); it != addr->ssu->introducers.end (); ++it)
{ if (h == it->iH)
for (auto it = addr->ssu->introducers.begin (); it != addr->ssu->introducers.end (); ++it) {
if (h == it->iH) addr->ssu->introducers.erase (it);
{ if (addr->ssu->introducers.empty ())
addr->ssu->introducers.erase (it); SetReachableTransports (GetReachableTransports () & ~(addr->IsV4 () ? eSSU2V4 : eSSU2V6));
if (addr->ssu->introducers.empty ()) return true;
SetReachableTransports (GetReachableTransports () & ~(addr->IsV4 () ? eSSU2V4 : eSSU2V6)); }
return true;
}
}
} }
return false; return false;
} }

Loading…
Cancel
Save