mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
select next tunnel with compatible transports
This commit is contained in:
parent
c0400bfd07
commit
1a8a32a773
@ -555,18 +555,6 @@ namespace client
|
|||||||
shared_from_this (), std::placeholders::_1));
|
shared_from_this (), std::placeholders::_1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto outbound = m_Pool->GetNextOutboundTunnel ();
|
|
||||||
if (!outbound)
|
|
||||||
{
|
|
||||||
LogPrint (eLogError, "Destination: Can't publish LeaseSet. No outbound tunnels");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto inbound = m_Pool->GetNextInboundTunnel ();
|
|
||||||
if (!inbound)
|
|
||||||
{
|
|
||||||
LogPrint (eLogError, "Destination: Can't publish LeaseSet. No inbound tunnels");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto floodfill = i2p::data::netdb.GetClosestFloodfill (leaseSet->GetIdentHash (), m_ExcludedFloodfills);
|
auto floodfill = i2p::data::netdb.GetClosestFloodfill (leaseSet->GetIdentHash (), m_ExcludedFloodfills);
|
||||||
if (!floodfill)
|
if (!floodfill)
|
||||||
{
|
{
|
||||||
@ -575,6 +563,18 @@ namespace client
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_ExcludedFloodfills.insert (floodfill->GetIdentHash ());
|
m_ExcludedFloodfills.insert (floodfill->GetIdentHash ());
|
||||||
|
auto outbound = m_Pool->GetNextOutboundTunnel (nullptr, floodfill->GetCompatibleTransports (false));
|
||||||
|
if (!outbound)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "Destination: Can't publish LeaseSet. No outbound tunnels");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto inbound = m_Pool->GetNextInboundTunnel (nullptr, floodfill->GetCompatibleTransports (true));
|
||||||
|
if (!inbound)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "Destination: Can't publish LeaseSet. No inbound tunnels");
|
||||||
|
return;
|
||||||
|
}
|
||||||
LogPrint (eLogDebug, "Destination: Publish LeaseSet of ", GetIdentHash ().ToBase32 ());
|
LogPrint (eLogDebug, "Destination: Publish LeaseSet of ", GetIdentHash ().ToBase32 ());
|
||||||
RAND_bytes ((uint8_t *)&m_PublishReplyToken, 4);
|
RAND_bytes ((uint8_t *)&m_PublishReplyToken, 4);
|
||||||
auto msg = WrapMessageForRouter (floodfill, i2p::CreateDatabaseStoreMsg (leaseSet, m_PublishReplyToken, inbound));
|
auto msg = WrapMessageForRouter (floodfill, i2p::CreateDatabaseStoreMsg (leaseSet, m_PublishReplyToken, inbound));
|
||||||
@ -751,10 +751,10 @@ namespace client
|
|||||||
std::shared_ptr<const i2p::data::RouterInfo> nextFloodfill, std::shared_ptr<LeaseSetRequest> request)
|
std::shared_ptr<const i2p::data::RouterInfo> nextFloodfill, std::shared_ptr<LeaseSetRequest> request)
|
||||||
{
|
{
|
||||||
if (!request->replyTunnel || !request->replyTunnel->IsEstablished ())
|
if (!request->replyTunnel || !request->replyTunnel->IsEstablished ())
|
||||||
request->replyTunnel = m_Pool->GetNextInboundTunnel ();
|
request->replyTunnel = m_Pool->GetNextInboundTunnel (nullptr, nextFloodfill->GetCompatibleTransports (true));
|
||||||
if (!request->replyTunnel) LogPrint (eLogError, "Destination: Can't send LeaseSet request, no inbound tunnels found");
|
if (!request->replyTunnel) LogPrint (eLogError, "Destination: Can't send LeaseSet request, no inbound tunnels found");
|
||||||
if (!request->outboundTunnel || !request->outboundTunnel->IsEstablished ())
|
if (!request->outboundTunnel || !request->outboundTunnel->IsEstablished ())
|
||||||
request->outboundTunnel = m_Pool->GetNextOutboundTunnel ();
|
request->outboundTunnel = m_Pool->GetNextOutboundTunnel (nullptr, nextFloodfill->GetCompatibleTransports (false));
|
||||||
if (!request->outboundTunnel) LogPrint (eLogError, "Destination: Can't send LeaseSet request, no outbound tunnels found");
|
if (!request->outboundTunnel) LogPrint (eLogError, "Destination: Can't send LeaseSet request, no outbound tunnels found");
|
||||||
|
|
||||||
if (request->replyTunnel && request->outboundTunnel)
|
if (request->replyTunnel && request->outboundTunnel)
|
||||||
|
@ -64,7 +64,8 @@ namespace data
|
|||||||
eNTCP2V6 = 0x02,
|
eNTCP2V6 = 0x02,
|
||||||
eSSUV4 = 0x04,
|
eSSUV4 = 0x04,
|
||||||
eSSUV6 = 0x08,
|
eSSUV6 = 0x08,
|
||||||
eNTCP2V6Mesh = 0x10
|
eNTCP2V6Mesh = 0x10,
|
||||||
|
eAllTransports = 0xFF
|
||||||
};
|
};
|
||||||
typedef uint8_t CompatibleTransports;
|
typedef uint8_t CompatibleTransports;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ namespace tunnel
|
|||||||
Tunnel::Tunnel (std::shared_ptr<const TunnelConfig> config):
|
Tunnel::Tunnel (std::shared_ptr<const TunnelConfig> config):
|
||||||
TunnelBase (config->GetTunnelID (), config->GetNextTunnelID (), config->GetNextIdentHash ()),
|
TunnelBase (config->GetTunnelID (), config->GetNextTunnelID (), config->GetNextIdentHash ()),
|
||||||
m_Config (config), m_IsShortBuildMessage (false), m_Pool (nullptr),
|
m_Config (config), m_IsShortBuildMessage (false), m_Pool (nullptr),
|
||||||
m_State (eTunnelStatePending), m_FarEndTransports (0),
|
m_State (eTunnelStatePending), m_FarEndTransports (i2p::data::RouterInfo::eAllTransports),
|
||||||
m_IsRecreated (false), m_Latency (0)
|
m_IsRecreated (false), m_Latency (0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,7 @@ namespace tunnel
|
|||||||
std::vector<std::shared_ptr<const i2p::data::IdentityEx> > GetPeers () const;
|
std::vector<std::shared_ptr<const i2p::data::IdentityEx> > GetPeers () const;
|
||||||
std::vector<std::shared_ptr<const i2p::data::IdentityEx> > GetInvertedPeers () const;
|
std::vector<std::shared_ptr<const i2p::data::IdentityEx> > GetInvertedPeers () const;
|
||||||
bool IsShortBuildMessage () const { return m_IsShortBuildMessage; };
|
bool IsShortBuildMessage () const { return m_IsShortBuildMessage; };
|
||||||
|
i2p::data::RouterInfo::CompatibleTransports GetFarEndTransports () const { return m_FarEndTransports; };
|
||||||
TunnelState GetState () const { return m_State; };
|
TunnelState GetState () const { return m_State; };
|
||||||
void SetState (TunnelState state);
|
void SetState (TunnelState state);
|
||||||
bool IsEstablished () const { return m_State == eTunnelStateEstablished; };
|
bool IsEstablished () const { return m_State == eTunnelStateEstablished; };
|
||||||
|
@ -82,7 +82,7 @@ namespace tunnel
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
TunnelConfig (const std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers,
|
TunnelConfig (const std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers,
|
||||||
bool isShort, i2p::data::RouterInfo::CompatibleTransports farEndTransports = 0): // inbound
|
bool isShort, i2p::data::RouterInfo::CompatibleTransports farEndTransports = i2p::data::RouterInfo::eAllTransports): // inbound
|
||||||
m_IsShort (isShort), m_FarEndTransports (farEndTransports)
|
m_IsShort (isShort), m_FarEndTransports (farEndTransports)
|
||||||
{
|
{
|
||||||
CreatePeers (peers);
|
CreatePeers (peers);
|
||||||
@ -91,7 +91,7 @@ namespace tunnel
|
|||||||
|
|
||||||
TunnelConfig (const std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers,
|
TunnelConfig (const std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers,
|
||||||
uint32_t replyTunnelID, const i2p::data::IdentHash& replyIdent, bool isShort,
|
uint32_t replyTunnelID, const i2p::data::IdentHash& replyIdent, bool isShort,
|
||||||
i2p::data::RouterInfo::CompatibleTransports farEndTransports = 0): // outbound
|
i2p::data::RouterInfo::CompatibleTransports farEndTransports = i2p::data::RouterInfo::eAllTransports): // outbound
|
||||||
m_IsShort (isShort), m_FarEndTransports (farEndTransports)
|
m_IsShort (isShort), m_FarEndTransports (farEndTransports)
|
||||||
{
|
{
|
||||||
CreatePeers (peers);
|
CreatePeers (peers);
|
||||||
|
@ -190,20 +190,23 @@ namespace tunnel
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<OutboundTunnel> TunnelPool::GetNextOutboundTunnel (std::shared_ptr<OutboundTunnel> excluded) const
|
std::shared_ptr<OutboundTunnel> TunnelPool::GetNextOutboundTunnel (std::shared_ptr<OutboundTunnel> excluded,
|
||||||
|
i2p::data::RouterInfo::CompatibleTransports compatible) const
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
|
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
|
||||||
return GetNextTunnel (m_OutboundTunnels, excluded);
|
return GetNextTunnel (m_OutboundTunnels, excluded, compatible);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<InboundTunnel> TunnelPool::GetNextInboundTunnel (std::shared_ptr<InboundTunnel> excluded) const
|
std::shared_ptr<InboundTunnel> TunnelPool::GetNextInboundTunnel (std::shared_ptr<InboundTunnel> excluded,
|
||||||
|
i2p::data::RouterInfo::CompatibleTransports compatible) const
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
|
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
|
||||||
return GetNextTunnel (m_InboundTunnels, excluded);
|
return GetNextTunnel (m_InboundTunnels, excluded, compatible);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class TTunnels>
|
template<class TTunnels>
|
||||||
typename TTunnels::value_type TunnelPool::GetNextTunnel (TTunnels& tunnels, typename TTunnels::value_type excluded) const
|
typename TTunnels::value_type TunnelPool::GetNextTunnel (TTunnels& tunnels,
|
||||||
|
typename TTunnels::value_type excluded, i2p::data::RouterInfo::CompatibleTransports compatible) const
|
||||||
{
|
{
|
||||||
if (tunnels.empty ()) return nullptr;
|
if (tunnels.empty ()) return nullptr;
|
||||||
uint32_t ind = rand () % (tunnels.size ()/2 + 1), i = 0;
|
uint32_t ind = rand () % (tunnels.size ()/2 + 1), i = 0;
|
||||||
@ -211,7 +214,7 @@ namespace tunnel
|
|||||||
typename TTunnels::value_type tunnel = nullptr;
|
typename TTunnels::value_type tunnel = nullptr;
|
||||||
for (const auto& it: tunnels)
|
for (const auto& it: tunnels)
|
||||||
{
|
{
|
||||||
if (it->IsEstablished () && it != excluded)
|
if (it->IsEstablished () && it != excluded && (compatible & it->GetFarEndTransports ()))
|
||||||
{
|
{
|
||||||
if (it->IsSlow () || (HasLatencyRequirement() && it->LatencyIsKnown() &&
|
if (it->IsSlow () || (HasLatencyRequirement() && it->LatencyIsKnown() &&
|
||||||
!it->LatencyFitsRange(m_MinLatency, m_MaxLatency)))
|
!it->LatencyFitsRange(m_MinLatency, m_MaxLatency)))
|
||||||
|
@ -76,8 +76,10 @@ namespace tunnel
|
|||||||
void RecreateInboundTunnel (std::shared_ptr<InboundTunnel> tunnel);
|
void RecreateInboundTunnel (std::shared_ptr<InboundTunnel> tunnel);
|
||||||
void RecreateOutboundTunnel (std::shared_ptr<OutboundTunnel> tunnel);
|
void RecreateOutboundTunnel (std::shared_ptr<OutboundTunnel> tunnel);
|
||||||
std::vector<std::shared_ptr<InboundTunnel> > GetInboundTunnels (int num) const;
|
std::vector<std::shared_ptr<InboundTunnel> > GetInboundTunnels (int num) const;
|
||||||
std::shared_ptr<OutboundTunnel> GetNextOutboundTunnel (std::shared_ptr<OutboundTunnel> excluded = nullptr) const;
|
std::shared_ptr<OutboundTunnel> GetNextOutboundTunnel (std::shared_ptr<OutboundTunnel> excluded = nullptr,
|
||||||
std::shared_ptr<InboundTunnel> GetNextInboundTunnel (std::shared_ptr<InboundTunnel> excluded = nullptr) const;
|
i2p::data::RouterInfo::CompatibleTransports compatible = i2p::data::RouterInfo::eAllTransports) const;
|
||||||
|
std::shared_ptr<InboundTunnel> GetNextInboundTunnel (std::shared_ptr<InboundTunnel> excluded = nullptr,
|
||||||
|
i2p::data::RouterInfo::CompatibleTransports compatible = i2p::data::RouterInfo::eAllTransports) const;
|
||||||
std::shared_ptr<OutboundTunnel> GetNewOutboundTunnel (std::shared_ptr<OutboundTunnel> old) const;
|
std::shared_ptr<OutboundTunnel> GetNewOutboundTunnel (std::shared_ptr<OutboundTunnel> old) const;
|
||||||
void TestTunnels ();
|
void TestTunnels ();
|
||||||
void ManageTunnels (uint64_t ts);
|
void ManageTunnels (uint64_t ts);
|
||||||
@ -120,7 +122,8 @@ namespace tunnel
|
|||||||
void CreateOutboundTunnel ();
|
void CreateOutboundTunnel ();
|
||||||
void CreatePairedInboundTunnel (std::shared_ptr<OutboundTunnel> outboundTunnel);
|
void CreatePairedInboundTunnel (std::shared_ptr<OutboundTunnel> outboundTunnel);
|
||||||
template<class TTunnels>
|
template<class TTunnels>
|
||||||
typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels, typename TTunnels::value_type excluded) const;
|
typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels,
|
||||||
|
typename TTunnels::value_type excluded, i2p::data::RouterInfo::CompatibleTransports compatible) const;
|
||||||
bool SelectPeers (Path& path, bool isInbound);
|
bool SelectPeers (Path& path, bool isInbound);
|
||||||
bool SelectExplicitPeers (Path& path, bool isInbound);
|
bool SelectExplicitPeers (Path& path, bool isInbound);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user