mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-03-21 16:49:10 +01:00
exclude expired SSU2 introducers
This commit is contained in:
parent
24e325db62
commit
827a88d772
2 changed files with 57 additions and 24 deletions
|
@ -386,7 +386,10 @@ namespace data
|
||||||
((it.iHost.is_v4 () && address->IsV4 ()) || (it.iHost.is_v6 () && address->IsV6 ())))
|
((it.iHost.is_v4 () && address->IsV4 ()) || (it.iHost.is_v6 () && address->IsV6 ())))
|
||||||
numValid++;
|
numValid++;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
it.iPort = 0;
|
it.iPort = 0;
|
||||||
|
if (isV2) numValid++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (numValid)
|
if (numValid)
|
||||||
m_ReachableTransports |= supportedTransports;
|
m_ReachableTransports |= supportedTransports;
|
||||||
|
@ -409,13 +412,28 @@ namespace data
|
||||||
if (address->host.is_v4 ()) m_ReachableTransports |= eSSU2V4;
|
if (address->host.is_v4 ()) m_ReachableTransports |= eSSU2V4;
|
||||||
if (address->host.is_v6 ()) m_ReachableTransports |= eSSU2V6;
|
if (address->host.is_v6 ()) m_ReachableTransports |= eSSU2V6;
|
||||||
}
|
}
|
||||||
|
if (address->transportStyle == eTransportSSU2)
|
||||||
|
{
|
||||||
|
if (address->port) address->published = true;
|
||||||
|
if (address->ssu && !address->ssu->introducers.empty ())
|
||||||
|
{
|
||||||
|
// exclude invalid introducers
|
||||||
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
int numValid = 0;
|
||||||
|
for (auto& it: address->ssu->introducers)
|
||||||
|
{
|
||||||
|
if (it.iTag && ts <= it.iExp)
|
||||||
|
numValid++;
|
||||||
|
else
|
||||||
|
it.iTag = 0;
|
||||||
}
|
}
|
||||||
if (supportedTransports)
|
if (numValid)
|
||||||
{
|
m_ReachableTransports |= supportedTransports;
|
||||||
if (!(m_SupportedTransports & supportedTransports)) // avoid duplicates
|
else
|
||||||
{
|
address->ssu->introducers.resize (0);
|
||||||
addresses->push_back(address);
|
}
|
||||||
if (address->transportStyle == eTransportSSU && isV2)
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// create additional SSU2 address. TODO: remove later
|
// create additional SSU2 address. TODO: remove later
|
||||||
auto ssu2addr = std::make_shared<Address> ();
|
auto ssu2addr = std::make_shared<Address> ();
|
||||||
|
@ -425,12 +443,22 @@ namespace data
|
||||||
ssu2addr->date = address->date; ssu2addr->caps = address->caps;
|
ssu2addr->date = address->date; ssu2addr->caps = address->caps;
|
||||||
ssu2addr->published = address->published;
|
ssu2addr->published = address->published;
|
||||||
ssu2addr->ssu.reset (new SSUExt ()); ssu2addr->ssu->mtu = address->ssu->mtu;
|
ssu2addr->ssu.reset (new SSUExt ()); ssu2addr->ssu->mtu = address->ssu->mtu;
|
||||||
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
if (!address->ssu->introducers.empty ())
|
||||||
|
{
|
||||||
for (const auto& introducer: address->ssu->introducers)
|
for (const auto& introducer: address->ssu->introducers)
|
||||||
if (!introducer.iPort) // SSU2
|
if (!introducer.iPort && introducer.iHost.is_unspecified () && ts < introducer.iExp) // SSU2
|
||||||
ssu2addr->ssu->introducers.push_back (introducer);
|
ssu2addr->ssu->introducers.push_back (introducer);
|
||||||
|
if (!ssu2addr->ssu->introducers.empty ())
|
||||||
|
m_ReachableTransports |= supportedTransports;
|
||||||
|
}
|
||||||
addresses->push_back(ssu2addr);
|
addresses->push_back(ssu2addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (supportedTransports)
|
||||||
|
{
|
||||||
|
if (!(m_SupportedTransports & supportedTransports)) // avoid duplicates
|
||||||
|
addresses->push_back(address);
|
||||||
m_SupportedTransports |= supportedTransports;
|
m_SupportedTransports |= supportedTransports;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -499,9 +499,12 @@ namespace transport
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// we have to start a new session to an introducer
|
// we have to start a new session to an introducer
|
||||||
|
auto ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
std::shared_ptr<i2p::data::RouterInfo> r;
|
std::shared_ptr<i2p::data::RouterInfo> r;
|
||||||
uint32_t relayTag = 0;
|
uint32_t relayTag = 0;
|
||||||
for (auto& it: address->ssu->introducers)
|
for (auto& it: address->ssu->introducers)
|
||||||
|
{
|
||||||
|
if (it.iTag && ts < it.iExp)
|
||||||
{
|
{
|
||||||
r = i2p::data::netdb.FindRouter (it.iKey);
|
r = i2p::data::netdb.FindRouter (it.iKey);
|
||||||
if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ()))
|
if (r && r->IsReachableFrom (i2p::context.GetRouterInfo ()))
|
||||||
|
@ -510,6 +513,7 @@ namespace transport
|
||||||
if (relayTag) break;
|
if (relayTag) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (r)
|
if (r)
|
||||||
{
|
{
|
||||||
if (relayTag)
|
if (relayTag)
|
||||||
|
@ -548,6 +552,7 @@ namespace transport
|
||||||
{
|
{
|
||||||
// introducers not found, try to request them
|
// introducers not found, try to request them
|
||||||
for (auto& it: address->ssu->introducers)
|
for (auto& it: address->ssu->introducers)
|
||||||
|
if (it.iTag && ts < it.iExp)
|
||||||
i2p::data::netdb.RequestDestination (it.iKey);
|
i2p::data::netdb.RequestDestination (it.iKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue