Browse Source

tunnel test

pull/46/head
orignal 11 years ago
parent
commit
014e1c54eb
  1. 21
      I2NPProtocol.cpp
  2. 3
      Tunnel.cpp
  3. 41
      TunnelPool.cpp
  4. 6
      TunnelPool.h

21
I2NPProtocol.cpp

@ -425,11 +425,6 @@ namespace i2p
int size = be16toh (header->size); int size = be16toh (header->size);
switch (header->typeID) switch (header->typeID)
{ {
case eI2NPDeliveryStatus:
LogPrint ("DeliveryStatus");
// we assume DeliveryStatusMessage is sent with garlic only
i2p::garlic::routing.HandleDeliveryStatusMessage (buf, size);
break;
case eI2NPVariableTunnelBuild: case eI2NPVariableTunnelBuild:
LogPrint ("VariableTunnelBuild"); LogPrint ("VariableTunnelBuild");
HandleVariableTunnelBuildMsg (msgID, buf, size); HandleVariableTunnelBuildMsg (msgID, buf, size);
@ -461,6 +456,10 @@ namespace i2p
LogPrint ("TunnelGateway"); LogPrint ("TunnelGateway");
HandleTunnelGatewayMsg (msg); HandleTunnelGatewayMsg (msg);
break; break;
case eI2NPGarlic:
LogPrint ("Garlic");
i2p::garlic::routing.HandleGarlicMessage (msg);
break;
case eI2NPDatabaseStore: case eI2NPDatabaseStore:
LogPrint ("DatabaseStore"); LogPrint ("DatabaseStore");
i2p::data::netdb.PostI2NPMsg (msg); i2p::data::netdb.PostI2NPMsg (msg);
@ -469,9 +468,15 @@ namespace i2p
LogPrint ("DatabaseSearchReply"); LogPrint ("DatabaseSearchReply");
i2p::data::netdb.PostI2NPMsg (msg); i2p::data::netdb.PostI2NPMsg (msg);
break; break;
case eI2NPGarlic: case eI2NPDeliveryStatus:
LogPrint ("Garlic"); LogPrint ("DeliveryStatus");
i2p::garlic::routing.HandleGarlicMessage (msg); if (msg->from && msg->from->GetTunnelPool ())
msg->from->GetTunnelPool ()->ProcessDeliveryStatus (msg);
else
{
i2p::garlic::routing.HandleDeliveryStatusMessage (msg->GetPayload (), msg->GetLength ());
DeleteI2NPMessage (msg);
}
break; break;
default: default:
HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ()); HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ());

3
Tunnel.cpp

@ -502,7 +502,10 @@ namespace tunnel
void Tunnels::ManageTunnelPools () void Tunnels::ManageTunnelPools ()
{ {
for (auto& it: m_Pools) for (auto& it: m_Pools)
{
it->CreateTunnels (); it->CreateTunnels ();
it->TestTunnels ();
}
} }
void Tunnels::PostTunnelData (I2NPMessage * msg) void Tunnels::PostTunnelData (I2NPMessage * msg)

41
TunnelPool.cpp

@ -1,9 +1,11 @@
#include <cryptopp/dh.h> #include <cryptopp/dh.h>
#include "I2PEndian.h"
#include "CryptoConst.h" #include "CryptoConst.h"
#include "Tunnel.h" #include "Tunnel.h"
#include "NetDb.h" #include "NetDb.h"
#include "Timestamp.h" #include "Timestamp.h"
#include "RouterContext.h" #include "RouterContext.h"
#include "Garlic.h"
#include "TunnelPool.h" #include "TunnelPool.h"
namespace i2p namespace i2p
@ -48,6 +50,8 @@ namespace tunnel
void TunnelPool::TunnelExpired (OutboundTunnel * expiredTunnel) void TunnelPool::TunnelExpired (OutboundTunnel * expiredTunnel)
{ {
m_OutboundTunnels.erase (expiredTunnel); m_OutboundTunnels.erase (expiredTunnel);
if (expiredTunnel == m_LastOutboundTunnel)
m_LastOutboundTunnel = nullptr;
} }
std::vector<InboundTunnel *> TunnelPool::GetInboundTunnels (int num) const std::vector<InboundTunnel *> TunnelPool::GetInboundTunnels (int num) const
@ -90,6 +94,43 @@ namespace tunnel
CreateOutboundTunnel (); CreateOutboundTunnel ();
} }
void TunnelPool::TestTunnels ()
{
auto& rnd = i2p::context.GetRandomNumberGenerator ();
for (auto it: m_Tests)
{
LogPrint ("Tunnel test ", (int)it.first, " failed");
// both outbound and inbound tunnels considered as invalid
TunnelExpired (it.second.first);
TunnelExpired (it.second.second);
}
m_Tests.clear ();
auto it1 = m_OutboundTunnels.begin ();
auto it2 = m_InboundTunnels.begin ();
while (it1 != m_OutboundTunnels.end () && it2 != m_InboundTunnels.end ())
{
uint32_t msgID = rnd.GenerateWord32 ();
m_Tests[msgID] = std::make_pair (*it1, *it2);
(*it1)->SendTunnelDataMsg ((*it2)->GetNextIdentHash (), (*it2)->GetNextTunnelID (),
CreateDeliveryStatusMsg (msgID));
it1++; it2++;
}
}
void TunnelPool::ProcessDeliveryStatus (I2NPMessage * msg)
{
I2NPDeliveryStatusMsg * deliveryStatus = (I2NPDeliveryStatusMsg *)msg->GetPayload ();
auto it = m_Tests.find (be32toh (deliveryStatus->msgID));
if (it != m_Tests.end ())
{
LogPrint ("Tunnel test ", it->first, " successive. ", i2p::util::GetMillisecondsSinceEpoch () - be64toh (deliveryStatus->timestamp), " milliseconds");
m_Tests.erase (it);
}
else
i2p::garlic::routing.HandleDeliveryStatusMessage (msg->GetPayload (), msg->GetLength ()); // TODO:
DeleteI2NPMessage (msg);
}
void TunnelPool::CreateInboundTunnel () void TunnelPool::CreateInboundTunnel ()
{ {
OutboundTunnel * outboundTunnel = m_OutboundTunnels.size () > 0 ? OutboundTunnel * outboundTunnel = m_OutboundTunnels.size () > 0 ?

6
TunnelPool.h

@ -1,8 +1,10 @@
#ifndef TUNNEL_POOL__ #ifndef TUNNEL_POOL__
#define TUNNEL_POOL__ #define TUNNEL_POOL__
#include <inttypes.h>
#include <set> #include <set>
#include <vector> #include <vector>
#include <utility>
#include "Identity.h" #include "Identity.h"
#include "LeaseSet.h" #include "LeaseSet.h"
#include "I2NPProtocol.h" #include "I2NPProtocol.h"
@ -34,6 +36,9 @@ namespace tunnel
std::vector<InboundTunnel *> GetInboundTunnels (int num) const; std::vector<InboundTunnel *> GetInboundTunnels (int num) const;
OutboundTunnel * GetNextOutboundTunnel (); OutboundTunnel * GetNextOutboundTunnel ();
void TestTunnels ();
void ProcessDeliveryStatus (I2NPMessage * msg);
private: private:
void CreateInboundTunnel (); void CreateInboundTunnel ();
@ -46,6 +51,7 @@ namespace tunnel
int m_NumTunnels; int m_NumTunnels;
std::set<InboundTunnel *, TunnelCreationTimeCmp> m_InboundTunnels; // recent tunnel appears first std::set<InboundTunnel *, TunnelCreationTimeCmp> m_InboundTunnels; // recent tunnel appears first
std::set<OutboundTunnel *, TunnelCreationTimeCmp> m_OutboundTunnels; std::set<OutboundTunnel *, TunnelCreationTimeCmp> m_OutboundTunnels;
std::map<uint32_t, std::pair<OutboundTunnel *, InboundTunnel *> > m_Tests;
OutboundTunnel * m_LastOutboundTunnel; OutboundTunnel * m_LastOutboundTunnel;
}; };
} }

Loading…
Cancel
Save