i2pd/TransitTunnel.h

104 lines
3.0 KiB
C
Raw Normal View History

2013-11-11 03:19:49 +04:00
#ifndef TRANSIT_TUNNEL_H__
#define TRANSIT_TUNNEL_H__
#include <inttypes.h>
2015-01-22 05:50:46 +03:00
#include <vector>
2014-06-26 23:41:12 +04:00
#include <mutex>
#include <memory>
2015-11-03 17:15:49 +03:00
#include "Crypto.h"
2013-11-11 03:19:49 +04:00
#include "I2NPProtocol.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
2013-11-29 16:52:09 +04:00
#include "TunnelBase.h"
2013-11-11 03:19:49 +04:00
namespace i2p
{
namespace tunnel
{
2015-01-22 05:50:46 +03:00
class TransitTunnel: public TunnelBase
2013-11-11 03:19:49 +04:00
{
public:
TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
2013-11-29 16:52:09 +04:00
const uint8_t * layerKey,const uint8_t * ivKey);
2013-11-11 03:19:49 +04:00
2015-01-22 05:50:46 +03:00
virtual size_t GetNumTransmittedBytes () const { return 0; };
2013-11-11 03:19:49 +04:00
2013-11-29 16:52:09 +04:00
// implements TunnelBase
void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg);
void HandleTunnelDataMsg (std::shared_ptr<const i2p::I2NPMessage> tunnelMsg);
2015-11-03 17:15:49 +03:00
void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out);
2013-11-11 03:19:49 +04:00
private:
2014-05-16 01:55:09 +04:00
i2p::crypto::TunnelEncryption m_Encryption;
2013-11-11 03:19:49 +04:00
};
2013-11-29 16:52:09 +04:00
2015-01-22 05:50:46 +03: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 (std::shared_ptr<const i2p::I2NPMessage> tunnelMsg);
2015-01-22 05:50:46 +03:00
void FlushTunnelDataMsgs ();
private:
size_t m_NumTransmittedBytes;
std::vector<std::shared_ptr<i2p::I2NPMessage> > m_TunnelDataMsgs;
2015-01-22 05:50:46 +03:00
};
2013-11-29 16:52:09 +04: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 (std::shared_ptr<i2p::I2NPMessage> msg);
2015-01-24 06:05:33 +03:00
void FlushTunnelDataMsgs ();
2014-01-06 07:52:17 +04:00
size_t GetNumTransmittedBytes () const { return m_Gateway.GetNumSentBytes (); };
2013-11-29 16:52:09 +04:00
private:
2014-06-26 23:41:12 +04:00
std::mutex m_SendMutex;
2013-11-29 16:52:09 +04: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 16:52:09 +04:00
void HandleTunnelDataMsg (std::shared_ptr<const i2p::I2NPMessage> tunnelMsg);
2014-01-06 07:52:17 +04:00
size_t GetNumTransmittedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }
2013-11-29 16:52:09 +04: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-11 03:19:49 +04:00
}
}
#endif