mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2024-11-11 19:10:55 +00:00
shared_ptr for local destination in TunnelPool
This commit is contained in:
parent
8ad20c0db3
commit
4599f6919c
@ -82,7 +82,7 @@ namespace client
|
|||||||
LogPrint (eLogInfo, "Explicit peers set to ", it->second);
|
LogPrint (eLogInfo, "Explicit peers set to ", it->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_Pool = i2p::tunnel::tunnels.CreateTunnelPool (this, inboundTunnelLen, outboundTunnelLen, inboundTunnelsQuantity, outboundTunnelsQuantity);
|
m_Pool = i2p::tunnel::tunnels.CreateTunnelPool (inboundTunnelLen, outboundTunnelLen, inboundTunnelsQuantity, outboundTunnelsQuantity);
|
||||||
if (explicitPeers)
|
if (explicitPeers)
|
||||||
m_Pool->SetExplicitPeers (explicitPeers);
|
m_Pool->SetExplicitPeers (explicitPeers);
|
||||||
if (m_IsPublic)
|
if (m_IsPublic)
|
||||||
@ -122,7 +122,7 @@ namespace client
|
|||||||
if (!m_IsRunning)
|
if (!m_IsRunning)
|
||||||
{
|
{
|
||||||
m_IsRunning = true;
|
m_IsRunning = true;
|
||||||
m_Pool->SetLocalDestination (this);
|
m_Pool->SetLocalDestination (shared_from_this ());
|
||||||
m_Pool->SetActive (true);
|
m_Pool->SetActive (true);
|
||||||
m_Thread = new std::thread (std::bind (&ClientDestination::Run, this));
|
m_Thread = new std::thread (std::bind (&ClientDestination::Run, this));
|
||||||
m_StreamingDestination = std::make_shared<i2p::stream::StreamingDestination> (shared_from_this ()); // TODO:
|
m_StreamingDestination = std::make_shared<i2p::stream::StreamingDestination> (shared_from_this ()); // TODO:
|
||||||
@ -199,7 +199,7 @@ namespace client
|
|||||||
|
|
||||||
void ClientDestination::UpdateLeaseSet ()
|
void ClientDestination::UpdateLeaseSet ()
|
||||||
{
|
{
|
||||||
m_LeaseSet.reset (new i2p::data::LeaseSet (*m_Pool));
|
m_LeaseSet.reset (new i2p::data::LeaseSet (m_Pool));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientDestination::SubmitSessionKey (const uint8_t * key, const uint8_t * tag)
|
bool ClientDestination::SubmitSessionKey (const uint8_t * key, const uint8_t * tag)
|
||||||
|
@ -21,11 +21,12 @@ namespace data
|
|||||||
ReadFromBuffer ();
|
ReadFromBuffer ();
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaseSet::LeaseSet (const i2p::tunnel::TunnelPool& pool):
|
LeaseSet::LeaseSet (std::shared_ptr<const i2p::tunnel::TunnelPool> pool):
|
||||||
m_IsValid (true)
|
m_IsValid (true)
|
||||||
{
|
{
|
||||||
|
if (!pool) return;
|
||||||
// header
|
// header
|
||||||
const i2p::data::LocalDestination * localDestination = pool.GetLocalDestination ();
|
auto localDestination = pool->GetLocalDestination ();
|
||||||
if (!localDestination)
|
if (!localDestination)
|
||||||
{
|
{
|
||||||
m_Buffer = nullptr;
|
m_Buffer = nullptr;
|
||||||
@ -41,7 +42,7 @@ namespace data
|
|||||||
auto signingKeyLen = localDestination->GetIdentity ()->GetSigningPublicKeyLen ();
|
auto signingKeyLen = localDestination->GetIdentity ()->GetSigningPublicKeyLen ();
|
||||||
memset (m_Buffer + m_BufferLen, 0, signingKeyLen);
|
memset (m_Buffer + m_BufferLen, 0, signingKeyLen);
|
||||||
m_BufferLen += signingKeyLen;
|
m_BufferLen += signingKeyLen;
|
||||||
auto tunnels = pool.GetInboundTunnels (5); // 5 tunnels maximum
|
auto tunnels = pool->GetInboundTunnels (5); // 5 tunnels maximum
|
||||||
m_Buffer[m_BufferLen] = tunnels.size (); // num leases
|
m_Buffer[m_BufferLen] = tunnels.size (); // num leases
|
||||||
m_BufferLen++;
|
m_BufferLen++;
|
||||||
// leases
|
// leases
|
||||||
|
@ -37,7 +37,7 @@ namespace data
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
LeaseSet (const uint8_t * buf, size_t len);
|
LeaseSet (const uint8_t * buf, size_t len);
|
||||||
LeaseSet (const i2p::tunnel::TunnelPool& pool);
|
LeaseSet (std::shared_ptr<const i2p::tunnel::TunnelPool> pool);
|
||||||
~LeaseSet () { delete[] m_Buffer; };
|
~LeaseSet () { delete[] m_Buffer; };
|
||||||
void Update (const uint8_t * buf, size_t len);
|
void Update (const uint8_t * buf, size_t len);
|
||||||
std::shared_ptr<const IdentityEx> GetIdentity () const { return m_Identity; };
|
std::shared_ptr<const IdentityEx> GetIdentity () const { return m_Identity; };
|
||||||
|
@ -39,6 +39,12 @@ namespace i2p
|
|||||||
return std::shared_ptr<const i2p::data::RouterInfo> (&m_RouterInfo,
|
return std::shared_ptr<const i2p::data::RouterInfo> (&m_RouterInfo,
|
||||||
[](const i2p::data::RouterInfo *) {});
|
[](const i2p::data::RouterInfo *) {});
|
||||||
}
|
}
|
||||||
|
std::shared_ptr<i2p::garlic::GarlicDestination> GetSharedDestination ()
|
||||||
|
{
|
||||||
|
return std::shared_ptr<i2p::garlic::GarlicDestination> (this,
|
||||||
|
[](i2p::garlic::GarlicDestination *) {});
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t GetUptime () const;
|
uint32_t GetUptime () const;
|
||||||
uint32_t GetStartupTime () const { return m_StartupTime; };
|
uint32_t GetStartupTime () const { return m_StartupTime; };
|
||||||
uint64_t GetLastUpdateTime () const { return m_LastUpdateTime; };
|
uint64_t GetLastUpdateTime () const { return m_LastUpdateTime; };
|
||||||
|
10
Tunnel.cpp
10
Tunnel.cpp
@ -333,9 +333,10 @@ namespace tunnel
|
|||||||
return tunnel;
|
return tunnel;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<TunnelPool> Tunnels::CreateTunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels)
|
std::shared_ptr<TunnelPool> Tunnels::CreateTunnelPool (int numInboundHops,
|
||||||
|
int numOutboundHops, int numInboundTunnels, int numOutboundTunnels)
|
||||||
{
|
{
|
||||||
auto pool = std::make_shared<TunnelPool> (localDestination, numInboundHops, numOutboundHops, numInboundTunnels, numOutboundTunnels);
|
auto pool = std::make_shared<TunnelPool> (numInboundHops, numOutboundHops, numInboundTunnels, numOutboundTunnels);
|
||||||
std::unique_lock<std::mutex> l(m_PoolsMutex);
|
std::unique_lock<std::mutex> l(m_PoolsMutex);
|
||||||
m_Pools.push_back (pool);
|
m_Pools.push_back (pool);
|
||||||
return pool;
|
return pool;
|
||||||
@ -649,7 +650,10 @@ namespace tunnel
|
|||||||
LogPrint ("Creating zero hops inbound tunnel...");
|
LogPrint ("Creating zero hops inbound tunnel...");
|
||||||
CreateZeroHopsInboundTunnel ();
|
CreateZeroHopsInboundTunnel ();
|
||||||
if (!m_ExploratoryPool)
|
if (!m_ExploratoryPool)
|
||||||
m_ExploratoryPool = CreateTunnelPool (&i2p::context, 2, 2, 5, 5); // 2-hop exploratory, 5 tunnels
|
{
|
||||||
|
m_ExploratoryPool = CreateTunnelPool (2, 2, 5, 5); // 2-hop exploratory, 5 tunnels
|
||||||
|
m_ExploratoryPool->SetLocalDestination (i2p::context.GetSharedDestination ());
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
Tunnel.h
3
Tunnel.h
@ -153,7 +153,8 @@ namespace tunnel
|
|||||||
std::shared_ptr<TTunnel> CreateTunnel (std::shared_ptr<TunnelConfig> config, std::shared_ptr<OutboundTunnel> outboundTunnel = nullptr);
|
std::shared_ptr<TTunnel> CreateTunnel (std::shared_ptr<TunnelConfig> config, std::shared_ptr<OutboundTunnel> outboundTunnel = nullptr);
|
||||||
void AddPendingTunnel (uint32_t replyMsgID, std::shared_ptr<InboundTunnel> tunnel);
|
void AddPendingTunnel (uint32_t replyMsgID, std::shared_ptr<InboundTunnel> tunnel);
|
||||||
void AddPendingTunnel (uint32_t replyMsgID, std::shared_ptr<OutboundTunnel> tunnel);
|
void AddPendingTunnel (uint32_t replyMsgID, std::shared_ptr<OutboundTunnel> tunnel);
|
||||||
std::shared_ptr<TunnelPool> CreateTunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOuboundHops, int numInboundTunnels, int numOutboundTunnels);
|
std::shared_ptr<TunnelPool> CreateTunnelPool (int numInboundHops,
|
||||||
|
int numOuboundHops, int numInboundTunnels, int numOutboundTunnels);
|
||||||
void DeleteTunnelPool (std::shared_ptr<TunnelPool> pool);
|
void DeleteTunnelPool (std::shared_ptr<TunnelPool> pool);
|
||||||
void StopTunnelPool (std::shared_ptr<TunnelPool> pool);
|
void StopTunnelPool (std::shared_ptr<TunnelPool> pool);
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@ namespace i2p
|
|||||||
{
|
{
|
||||||
namespace tunnel
|
namespace tunnel
|
||||||
{
|
{
|
||||||
TunnelPool::TunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels):
|
TunnelPool::TunnelPool (int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels):
|
||||||
m_LocalDestination (localDestination), 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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -298,7 +298,7 @@ namespace tunnel
|
|||||||
|
|
||||||
std::shared_ptr<const i2p::data::RouterInfo> TunnelPool::SelectNextHop (std::shared_ptr<const i2p::data::RouterInfo> prevHop) const
|
std::shared_ptr<const i2p::data::RouterInfo> TunnelPool::SelectNextHop (std::shared_ptr<const i2p::data::RouterInfo> prevHop) const
|
||||||
{
|
{
|
||||||
bool isExploratory = (m_LocalDestination == &i2p::context); // TODO: implement it better
|
bool isExploratory = (i2p::tunnel::tunnels.GetExploratoryPool () == shared_from_this ());
|
||||||
auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop):
|
auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop):
|
||||||
i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop);
|
i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop);
|
||||||
|
|
||||||
|
@ -27,11 +27,11 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels);
|
TunnelPool (int numInboundHops, int numOutboundHops, int numInboundTunnels, int numOutboundTunnels);
|
||||||
~TunnelPool ();
|
~TunnelPool ();
|
||||||
|
|
||||||
i2p::garlic::GarlicDestination * GetLocalDestination () const { return m_LocalDestination; };
|
std::shared_ptr<i2p::garlic::GarlicDestination> GetLocalDestination () const { return m_LocalDestination; };
|
||||||
void SetLocalDestination (i2p::garlic::GarlicDestination * destination) { m_LocalDestination = destination; };
|
void SetLocalDestination (std::shared_ptr<i2p::garlic::GarlicDestination> destination) { m_LocalDestination = destination; };
|
||||||
void SetExplicitPeers (std::shared_ptr<std::vector<i2p::data::IdentHash> > explicitPeers);
|
void SetExplicitPeers (std::shared_ptr<std::vector<i2p::data::IdentHash> > explicitPeers);
|
||||||
|
|
||||||
void CreateTunnels ();
|
void CreateTunnels ();
|
||||||
@ -67,7 +67,7 @@ namespace tunnel
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
i2p::garlic::GarlicDestination * m_LocalDestination;
|
std::shared_ptr<i2p::garlic::GarlicDestination> m_LocalDestination;
|
||||||
int m_NumInboundHops, m_NumOutboundHops, m_NumInboundTunnels, m_NumOutboundTunnels;
|
int m_NumInboundHops, m_NumOutboundHops, m_NumInboundTunnels, m_NumOutboundTunnels;
|
||||||
std::shared_ptr<std::vector<i2p::data::IdentHash> > m_ExplicitPeers;
|
std::shared_ptr<std::vector<i2p::data::IdentHash> > m_ExplicitPeers;
|
||||||
mutable std::mutex m_InboundTunnelsMutex;
|
mutable std::mutex m_InboundTunnelsMutex;
|
||||||
|
Loading…
Reference in New Issue
Block a user