From 476e6aae3590afba136d5469c8db6b3b8b0dc052 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 16 Dec 2022 19:57:19 -0500 Subject: [PATCH] don't iterate through addresses when it's not necessary --- libi2pd/RouterContext.cpp | 98 ++++++++++++++++++--------------- libi2pd/RouterInfo.cpp | 110 +++++++++++++++++--------------------- 2 files changed, 103 insertions(+), 105 deletions(-) diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 7568692f..9d696db9 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -427,35 +427,53 @@ namespace i2p auto addresses = m_RouterInfo.GetAddresses (); if (!addresses) return; bool updated = false; - for (auto& address : *addresses) + if (host.is_v4 ()) { - if (!address) continue; - if (address->host != host && address->IsCompatible (host) && - !i2p::util::net::IsYggdrasilAddress (address->host)) + auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V4Idx]; + if (addr && addr->host != host) { - // update host - address->host = host; + addr->host = host; updated = true; - } - if (host.is_v6 () && address->IsV6 () && address->ssu && - (!address->ssu->mtu || updated) && m_StatusV6 != eRouterStatusProxy) + } + addr = (*addresses)[i2p::data::RouterInfo::eSSU2V4Idx]; + if (addr && addr->host != host) + { + addr->host = host; + updated = true; + } + } + else if (host.is_v6 ()) + { + auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V6Idx]; + if (addr && addr->host != host) + { + addr->host = host; + updated = true; + } + addr = (*addresses)[i2p::data::RouterInfo::eSSU2V6Idx]; + if (addr && (addr->host != host || !addr->ssu->mtu)) { - // update MTU - auto mtu = i2p::util::net::GetMTU (host); - if (mtu) + addr->host = host; + if (m_StatusV6 != eRouterStatusProxy) { - LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); - int maxMTU = i2p::util::net::GetMaxMTU (host.to_v6 ()); - if (mtu > maxMTU) + // update MTU + auto mtu = i2p::util::net::GetMTU (host); + if (mtu) { - mtu = maxMTU; - LogPrint(eLogWarning, "Router: MTU dropped to upper limit of ", maxMTU, " bytes"); + LogPrint (eLogDebug, "Router: Our v6 MTU=", mtu); + 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 (); if (updated || ts > m_LastUpdateTime + ROUTER_INFO_UPDATE_INTERVAL) UpdateRouterInfo (); @@ -477,18 +495,12 @@ namespace i2p void RouterContext::ClearSSU2Introducers (bool v4) { - auto addresses = m_RouterInfo.GetAddresses (); - if (!addresses) return; - bool updated = false; - for (auto& addr : *addresses) - if (addr && addr->IsSSU2 () && ((v4 && addr->IsV4 ()) || (!v4 && addr->IsV6 ())) && - addr->ssu && !addr->ssu->introducers.empty ()) - { - addr->ssu->introducers.clear (); - updated = true; - } - if (updated) + auto addr = m_RouterInfo.GetSSU2Address (v4); + if (addr && !addr->ssu->introducers.empty ()) + { + addr->ssu->introducers.clear (); UpdateRouterInfo (); + } } void RouterContext::SetFloodfill (bool floodfill) @@ -829,26 +841,26 @@ namespace i2p { if (supportsmesh) { + auto addresses = m_RouterInfo.GetAddresses (); + if (!addresses) return; m_RouterInfo.EnableMesh (); + if ((*addresses)[i2p::data::RouterInfo::eNTCP2V6MeshIdx]) return; // we have mesh address already uint16_t port = 0; i2p::config::GetOption ("ntcp2.port", port); if (!port) i2p::config::GetOption("port", port); - bool foundMesh = false; - auto addresses = m_RouterInfo.GetAddresses (); - if (addresses) + if (!port) { for (auto& addr: *addresses) { - if (!port && addr) port = addr->port; - if (addr && i2p::util::net::IsYggdrasilAddress (addr->host)) - { - foundMesh = true; + if (addr && addr->port) + { + port = addr->port; break; - } + } } } - if (!foundMesh) - m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, host, port); + if (!port) port = SelectRandomPort (); + m_RouterInfo.AddNTCP2Address (m_NTCP2Keys->staticPublicKey, m_NTCP2Keys->iv, host, port); } else m_RouterInfo.DisableMesh (); diff --git a/libi2pd/RouterInfo.cpp b/libi2pd/RouterInfo.cpp index a83fd043..177ae8b3 100644 --- a/libi2pd/RouterInfo.cpp +++ b/libi2pd/RouterInfo.cpp @@ -742,16 +742,18 @@ namespace data { if (IsV6 ()) { - for (auto& it : *m_Addresses) + if ((*m_Addresses)[eNTCP2V6Idx]) { - if (it && it->IsV6 ()) - { - if (it->IsV4 ()) - it->caps &= ~AddressCaps::eV6; - else - it.reset (); - } - } + if ((*m_Addresses)[eNTCP2V6Idx]->IsV4 ()) + (*m_Addresses)[eNTCP2V6Idx]->caps &= ~AddressCaps::eV6; + (*m_Addresses)[eNTCP2V6Idx].reset (); + } + if ((*m_Addresses)[eSSU2V6Idx]) + { + if ((*m_Addresses)[eSSU2V6Idx]->IsV4 ()) + (*m_Addresses)[eSSU2V6Idx]->caps &= ~AddressCaps::eV6; + (*m_Addresses)[eSSU2V6Idx].reset (); + } UpdateSupportedTransports (); } } @@ -760,16 +762,18 @@ namespace data { if (IsV4 ()) { - for (auto& it : *m_Addresses) + if ((*m_Addresses)[eNTCP2V4Idx]) { - if (it && it->IsV4 ()) - { - if (it->IsV6 ()) - it->caps &= ~AddressCaps::eV4; - else - it.reset (); - } - } + if ((*m_Addresses)[eNTCP2V4Idx]->IsV6 ()) + (*m_Addresses)[eNTCP2V4Idx]->caps &= ~AddressCaps::eV4; + (*m_Addresses)[eNTCP2V4Idx].reset (); + } + if ((*m_Addresses)[eSSU2V4Idx]) + { + if ((*m_Addresses)[eSSU2V4Idx]->IsV6 ()) + (*m_Addresses)[eSSU2V4Idx]->caps &= ~AddressCaps::eV4; + (*m_Addresses)[eSSU2V4Idx].reset (); + } UpdateSupportedTransports (); } } @@ -789,11 +793,7 @@ namespace data { m_SupportedTransports &= ~eNTCP2V6Mesh; m_ReachableTransports &= ~eNTCP2V6Mesh; - for (auto& it: *m_Addresses) - { - if (it && i2p::util::net::IsYggdrasilAddress (it->host)) - it.reset (); - } + (*m_Addresses)[eNTCP2V6MeshIdx].reset (); } } @@ -859,12 +859,10 @@ namespace data std::shared_ptr RouterInfo::GetSSU2AddressWithStaticKey (const uint8_t * key, bool isV6) const { if (!key) return nullptr; - return GetAddress ( - [key, isV6](std::shared_ptr address)->bool - { - return address->IsSSU2 () && !memcmp (address->s, key, 32) && - ((isV6 && address->IsV6 ()) || (!isV6 && address->IsV4 ())); - }); + auto addr = (*GetAddresses ())[isV6 ? eSSU2V6Idx : eSSU2V4Idx]; + if (addr && !memcmp (addr->s, key, 32)) + return addr; + return nullptr; } std::shared_ptr RouterInfo::GetPublishedNTCP2V4Address () const @@ -910,23 +908,15 @@ namespace data bool RouterInfo::IsSSU2PeerTesting (bool v4) const { if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false; - return (bool)GetAddress ( - [v4](std::shared_ptr address)->bool - { - return (address->IsSSU2 ()) && address->IsPeerTesting () && - ((v4 && address->IsV4 ()) || (!v4 && address->IsV6 ())) && address->IsReachableSSU (); - }); + auto addr = (*GetAddresses ())[v4 ? eSSU2V4Idx : eSSU2V6Idx]; + return addr && addr->IsPeerTesting () && addr->IsReachableSSU (); } bool RouterInfo::IsSSU2Introducer (bool v4) const { if (!(m_SupportedTransports & (v4 ? eSSU2V4 : eSSU2V6))) return false; - return (bool)GetAddress ( - [v4](std::shared_ptr address)->bool - { - return (address->IsSSU2 ()) && address->IsIntroducer () && - ((v4 && address->IsV4 ()) || (!v4 && address->IsV6 ())) && !address->host.is_unspecified (); - }); + auto addr = (*GetAddresses ())[v4 ? eSSU2V4Idx : eSSU2V6Idx]; + return addr && addr->IsIntroducer () && !addr->host.is_unspecified () && addr->port; } void RouterInfo::SetUnreachableAddressesTransportCaps (uint8_t transports) @@ -1269,16 +1259,14 @@ namespace data { auto addresses = GetAddresses (); 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 - addr->ssu->introducers.push_back (introducer); - SetReachableTransports (GetReachableTransports () | ((addr->IsV4 () ? eSSU2V4 : eSSU2V6))); - return true; - } + for (auto& intro: addr->ssu->introducers) + if (intro.iTag == introducer.iTag) return false; // already presented + addr->ssu->introducers.push_back (introducer); + SetReachableTransports (GetReachableTransports () | ((addr->IsV4 () ? eSSU2V4 : eSSU2V6))); + return true; } return false; } @@ -1287,19 +1275,17 @@ namespace data { auto addresses = GetAddresses (); 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) - { - addr->ssu->introducers.erase (it); - if (addr->ssu->introducers.empty ()) - SetReachableTransports (GetReachableTransports () & ~(addr->IsV4 () ? eSSU2V4 : eSSU2V6)); - return true; - } - } + 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 ()) + SetReachableTransports (GetReachableTransports () & ~(addr->IsV4 () ? eSSU2V4 : eSSU2V6)); + return true; + } } return false; }