i2pd/TransitTunnel.h

111 lines
3.1 KiB
C
Raw Normal View History

2013-11-10 23:19:49 +00:00
#ifndef TRANSIT_TUNNEL_H__
#define TRANSIT_TUNNEL_H__
#include <inttypes.h>
2015-01-22 02:50:46 +00:00
#include <vector>
2014-06-26 19:41:12 +00:00
#include <mutex>
#include "aes.h"
2013-11-10 23:19:49 +00:00
#include "I2NPProtocol.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
2013-11-29 12:52:09 +00:00
#include "TunnelBase.h"
2013-11-10 23:19:49 +00:00
namespace i2p
{
namespace tunnel
{
2015-01-22 02:50:46 +00:00
class TransitTunnel: public TunnelBase
2013-11-10 23:19:49 +00:00
{
public:
TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
2013-11-29 12:52:09 +00:00
const uint8_t * layerKey,const uint8_t * ivKey);
2013-11-10 23:19:49 +00:00
2015-01-22 02:50:46 +00:00
virtual size_t GetNumTransmittedBytes () const { return 0; };
2013-11-10 23:19:49 +00:00
uint32_t GetTunnelID () const { return m_TunnelID; };
2013-11-29 12:52:09 +00:00
// implements TunnelBase
void SendTunnelDataMsg (i2p::I2NPMessage * msg);
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
2013-11-29 12:52:09 +00:00
void EncryptTunnelMsg (I2NPMessage * tunnelMsg);
uint32_t GetNextTunnelID () const { return m_NextTunnelID; };
const i2p::data::IdentHash& GetNextIdentHash () const { return m_NextIdent; };
2013-11-10 23:19:49 +00:00
private:
uint32_t m_TunnelID, m_NextTunnelID;
2013-11-29 12:52:09 +00:00
i2p::data::IdentHash m_NextIdent;
2013-11-10 23:19:49 +00:00
2014-05-15 21:55:09 +00:00
i2p::crypto::TunnelEncryption m_Encryption;
2013-11-10 23:19:49 +00:00
};
2013-11-29 12:52:09 +00:00
2015-01-22 02:50:46 +00:00
class TransitTunnelParticipant: public TransitTunnel
{
public:
TransitTunnelParticipant (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
layerKey, ivKey), m_NumTransmittedBytes (0) {};
~TransitTunnelParticipant ();
size_t GetNumTransmittedBytes () const { return m_NumTransmittedBytes; };
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
void FlushTunnelDataMsgs ();
private:
size_t m_NumTransmittedBytes;
std::vector<i2p::I2NPMessage *> m_TunnelDataMsgs;
};
2013-11-29 12:52:09 +00:00
class TransitTunnelGateway: public TransitTunnel
{
public:
TransitTunnelGateway (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
layerKey, ivKey), m_Gateway(this) {};
void SendTunnelDataMsg (i2p::I2NPMessage * msg);
2015-01-24 03:05:33 +00:00
void FlushTunnelDataMsgs ();
2014-01-06 03:52:17 +00:00
size_t GetNumTransmittedBytes () const { return m_Gateway.GetNumSentBytes (); };
2013-11-29 12:52:09 +00:00
private:
2014-06-26 19:41:12 +00:00
std::mutex m_SendMutex;
2013-11-29 12:52:09 +00:00
TunnelGateway m_Gateway;
};
class TransitTunnelEndpoint: public TransitTunnel
{
public:
TransitTunnelEndpoint (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey),
m_Endpoint (false) {}; // transit endpoint is always outbound
2013-11-29 12:52:09 +00:00
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
2014-01-06 03:52:17 +00:00
size_t GetNumTransmittedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }
2013-11-29 12:52:09 +00:00
private:
TunnelEndpoint m_Endpoint;
};
TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint);
2013-11-10 23:19:49 +00:00
}
}
#endif