mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 20:44:39 +00:00
don't iterate through addresses when it's not necessary
This commit is contained in:
parent
d30ee99cf1
commit
476e6aae35
@ -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 ())
|
||||||
{
|
{
|
||||||
if (!address) continue;
|
auto addr = (*addresses)[i2p::data::RouterInfo::eNTCP2V4Idx];
|
||||||
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::eSSU2V4Idx];
|
||||||
(!address->ssu->mtu || updated) && m_StatusV6 != eRouterStatusProxy)
|
if (addr && addr->host != host)
|
||||||
{
|
{
|
||||||
// update MTU
|
addr->host = host;
|
||||||
auto mtu = i2p::util::net::GetMTU (host);
|
updated = true;
|
||||||
if (mtu)
|
}
|
||||||
{
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
address->ssu->mtu = mtu;
|
|
||||||
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))
|
||||||
|
{
|
||||||
|
addr->host = host;
|
||||||
|
if (m_StatusV6 != eRouterStatusProxy)
|
||||||
|
{
|
||||||
|
// update MTU
|
||||||
|
auto mtu = i2p::util::net::GetMTU (host);
|
||||||
|
if (mtu)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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))
|
{
|
||||||
{
|
port = addr->port;
|
||||||
foundMesh = true;
|
|
||||||
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 ();
|
||||||
|
@ -742,16 +742,18 @@ 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,16 +762,18 @@ 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…
x
Reference in New Issue
Block a user