#ifndef TUNNEL_POOL__ #define TUNNEL_POOL__ #include #include #include #include #include "Identity.h" #include "LeaseSet.h" #include "I2NPProtocol.h" #include "TunnelBase.h" #include "RouterContext.h" namespace i2p { namespace tunnel { class Tunnel; class InboundTunnel; class OutboundTunnel; class TunnelPool // per local destination { public: TunnelPool (i2p::data::LocalDestination& localDestination, int numHops, int numTunnels = 5); ~TunnelPool (); const uint8_t * GetEncryptionPrivateKey () const { return m_LocalDestination.GetEncryptionPrivateKey (); }; const uint8_t * GetEncryptionPublicKey () const { return m_LocalDestination.GetEncryptionPublicKey (); }; bool IsExploratory () const { return m_LocalDestination.GetIdentHash () == i2p::context.GetIdentHash (); }; void CreateTunnels (); void TunnelCreated (InboundTunnel * createdTunnel); void TunnelExpired (InboundTunnel * expiredTunnel); void TunnelCreated (OutboundTunnel * createdTunnel); void TunnelExpired (OutboundTunnel * expiredTunnel); std::vector GetInboundTunnels (int num) const; OutboundTunnel * GetNextOutboundTunnel (); InboundTunnel * GetNextInboundTunnel (); const i2p::data::IdentHash& GetIdentHash () { return m_LocalDestination.GetIdentHash (); }; void TestTunnels (); void ProcessDeliveryStatus (I2NPMessage * msg); private: void CreateInboundTunnel (); void CreateOutboundTunnel (); template typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels); private: i2p::data::LocalDestination& m_LocalDestination; int m_NumHops, m_NumTunnels; std::set m_InboundTunnels; // recent tunnel appears first std::set m_OutboundTunnels; std::map > m_Tests; }; } } #endif