mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-03-10 05:11:10 +00:00
add hooks for custom peer selection
This commit is contained in:
parent
048d3c8386
commit
28fdd992c9
@ -15,7 +15,8 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
TunnelPool::TunnelPool (int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels):
|
TunnelPool::TunnelPool (int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels):
|
||||||
m_NumInboundHops (numInboundHops), m_NumOutboundHops (numOutboundHops),
|
m_NumInboundHops (numInboundHops), m_NumOutboundHops (numOutboundHops),
|
||||||
m_NumInboundTunnels (numInboundTunnels), m_NumOutboundTunnels (numOutboundTunnels), m_IsActive (true)
|
m_NumInboundTunnels (numInboundTunnels), m_NumOutboundTunnels (numOutboundTunnels), m_IsActive (true),
|
||||||
|
m_CustomPeerSelector(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,9 +328,14 @@ namespace tunnel
|
|||||||
|
|
||||||
bool TunnelPool::SelectPeers (std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers, bool isInbound)
|
bool TunnelPool::SelectPeers (std::vector<std::shared_ptr<const i2p::data::IdentityEx> >& peers, bool isInbound)
|
||||||
{
|
{
|
||||||
if (m_ExplicitPeers) return SelectExplicitPeers (peers, isInbound);
|
|
||||||
int numHops = isInbound ? m_NumInboundHops : m_NumOutboundHops;
|
int numHops = isInbound ? m_NumInboundHops : m_NumOutboundHops;
|
||||||
if (numHops <= 0) return true; // peers is empty
|
// peers is empty
|
||||||
|
if (numHops <= 0) return true;
|
||||||
|
// custom peer selector in use
|
||||||
|
if (m_CustomPeerSelector) return m_CustomPeerSelector->SelectPeers(peers, numHops, isInbound);
|
||||||
|
// explicit peers in use
|
||||||
|
if (m_ExplicitPeers) return SelectExplicitPeers (peers, isInbound);
|
||||||
|
|
||||||
auto prevHop = i2p::context.GetSharedRouterInfo ();
|
auto prevHop = i2p::context.GetSharedRouterInfo ();
|
||||||
if(i2p::transport::transports.RoutesRestricted())
|
if(i2p::transport::transports.RoutesRestricted())
|
||||||
{
|
{
|
||||||
|
17
TunnelPool.h
17
TunnelPool.h
@ -23,6 +23,16 @@ namespace tunnel
|
|||||||
class InboundTunnel;
|
class InboundTunnel;
|
||||||
class OutboundTunnel;
|
class OutboundTunnel;
|
||||||
|
|
||||||
|
/** interface for custom tunnel peer selection algorithm */
|
||||||
|
struct ITunnelPeerSelector
|
||||||
|
{
|
||||||
|
typedef std::shared_ptr<const i2p::data::IdentityEx> Peer;
|
||||||
|
typedef std::vector<Peer> TunnelPath;
|
||||||
|
virtual bool SelectPeers(TunnelPath & peers, int hops, bool isInbound) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::shared_ptr<ITunnelPeerSelector> TunnelPeerSelector;
|
||||||
|
|
||||||
class TunnelPool: public std::enable_shared_from_this<TunnelPool> // per local destination
|
class TunnelPool: public std::enable_shared_from_this<TunnelPool> // per local destination
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -55,7 +65,10 @@ namespace tunnel
|
|||||||
|
|
||||||
int GetNumInboundTunnels () const { return m_NumInboundTunnels; };
|
int GetNumInboundTunnels () const { return m_NumInboundTunnels; };
|
||||||
int GetNumOutboundTunnels () const { return m_NumOutboundTunnels; };
|
int GetNumOutboundTunnels () const { return m_NumOutboundTunnels; };
|
||||||
|
|
||||||
|
void SetCustomPeerSelector(TunnelPeerSelector selector);
|
||||||
|
TunnelPeerSelector GetCustomPeerSelector() const { return m_CustomPeerSelector; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void CreateInboundTunnel ();
|
void CreateInboundTunnel ();
|
||||||
@ -79,7 +92,7 @@ namespace tunnel
|
|||||||
mutable std::mutex m_TestsMutex;
|
mutable std::mutex m_TestsMutex;
|
||||||
std::map<uint32_t, std::pair<std::shared_ptr<OutboundTunnel>, std::shared_ptr<InboundTunnel> > > m_Tests;
|
std::map<uint32_t, std::pair<std::shared_ptr<OutboundTunnel>, std::shared_ptr<InboundTunnel> > > m_Tests;
|
||||||
bool m_IsActive;
|
bool m_IsActive;
|
||||||
|
TunnelPeerSelector m_CustomPeerSelector;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// for HTTP only
|
// for HTTP only
|
||||||
|
Loading…
x
Reference in New Issue
Block a user