mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 04:04:16 +00:00
cumulative update
This commit is contained in:
parent
30b80beb1b
commit
cee2d171f4
@ -139,21 +139,20 @@ namespace garlic
|
|||||||
I2NPMessage * GarlicRouting::WrapSingleMessage (const i2p::data::RoutingDestination * destination, I2NPMessage * msg)
|
I2NPMessage * GarlicRouting::WrapSingleMessage (const i2p::data::RoutingDestination * destination, I2NPMessage * msg)
|
||||||
{
|
{
|
||||||
if (!destination) return nullptr;
|
if (!destination) return nullptr;
|
||||||
std::string dest ((const char *)destination->GetIdentHash (), 32);
|
auto it = m_Sessions.find (destination->GetIdentHash ());
|
||||||
auto it = m_Sessions.find (dest);
|
|
||||||
GarlicRoutingSession * session = nullptr;
|
GarlicRoutingSession * session = nullptr;
|
||||||
if (it != m_Sessions.end ())
|
if (it != m_Sessions.end ())
|
||||||
session = it->second;
|
session = it->second;
|
||||||
if (!session)
|
if (!session)
|
||||||
{
|
{
|
||||||
session = new GarlicRoutingSession (destination, 4); // TODO: change it later
|
session = new GarlicRoutingSession (destination, 4); // TODO: change it later
|
||||||
m_Sessions[dest] = session;
|
m_Sessions[destination->GetIdentHash ()] = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2NPMessage * ret = session->WrapSingleMessage (msg);
|
I2NPMessage * ret = session->WrapSingleMessage (msg);
|
||||||
if (session->GetNumRemainingSessionTags () <= 0)
|
if (session->GetNumRemainingSessionTags () <= 0)
|
||||||
{
|
{
|
||||||
m_Sessions.erase (dest);
|
m_Sessions.erase (destination->GetIdentHash ());
|
||||||
delete session;
|
delete session;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
2
Garlic.h
2
Garlic.h
@ -69,7 +69,7 @@ namespace garlic
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::map<std::string, GarlicRoutingSession *> m_Sessions;
|
std::map<i2p::data::IdentHash, GarlicRoutingSession *> m_Sessions;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern GarlicRouting routing;
|
extern GarlicRouting routing;
|
||||||
|
@ -144,36 +144,6 @@ namespace i2p
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleDatabaseStoreMsg (uint8_t * buf, size_t len)
|
|
||||||
{
|
|
||||||
I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)buf;
|
|
||||||
size_t offset = sizeof (I2NPDatabaseStoreMsg);
|
|
||||||
if (msg->replyToken)
|
|
||||||
offset += 36;
|
|
||||||
if (msg->type)
|
|
||||||
{
|
|
||||||
LogPrint ("LeaseSet");
|
|
||||||
i2p::data::netdb.AddLeaseSet (buf + offset, len - offset);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LogPrint ("RouterInfo");
|
|
||||||
size_t size = be16toh (*(uint16_t *)(buf + offset));
|
|
||||||
if (size > 2048)
|
|
||||||
{
|
|
||||||
LogPrint ("Invalid RouterInfo length ", (int)size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
offset += 2;
|
|
||||||
CryptoPP::Gunzip decompressor;
|
|
||||||
decompressor.Put (buf + offset, size);
|
|
||||||
decompressor.MessageEnd();
|
|
||||||
uint8_t uncompressed[2048];
|
|
||||||
int uncomressedSize = decompressor.MaxRetrievable ();
|
|
||||||
decompressor.Get (uncompressed, uncomressedSize);
|
|
||||||
i2p::data::netdb.AddRouterInfo (uncompressed, uncomressedSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
||||||
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
||||||
@ -204,7 +174,7 @@ namespace i2p
|
|||||||
I2NPBuildRequestRecordElGamalEncrypted& record)
|
I2NPBuildRequestRecordElGamalEncrypted& record)
|
||||||
{
|
{
|
||||||
i2p::crypto::ElGamalEncrypt (router.GetRouterIdentity ().publicKey, (uint8_t *)&clearText, sizeof(clearText), record.encrypted);
|
i2p::crypto::ElGamalEncrypt (router.GetRouterIdentity ().publicKey, (uint8_t *)&clearText, sizeof(clearText), record.encrypted);
|
||||||
memcpy (record.toPeer, router.GetIdentHash (), 16);
|
memcpy (record.toPeer, (const uint8_t *)router.GetIdentHash (), 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len)
|
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len)
|
||||||
@ -233,7 +203,7 @@ namespace i2p
|
|||||||
I2NPBuildRequestRecordElGamalEncrypted * records = (I2NPBuildRequestRecordElGamalEncrypted *)(buf+1);
|
I2NPBuildRequestRecordElGamalEncrypted * records = (I2NPBuildRequestRecordElGamalEncrypted *)(buf+1);
|
||||||
for (int i = 0; i < num; i++)
|
for (int i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
if (!memcmp (records[i].toPeer, i2p::context.GetRouterInfo ().GetIdentHash (), 16))
|
if (!memcmp (records[i].toPeer, (const uint8_t *)i2p::context.GetRouterInfo ().GetIdentHash (), 16))
|
||||||
{
|
{
|
||||||
LogPrint ("Record ",i," is ours");
|
LogPrint ("Record ",i," is ours");
|
||||||
|
|
||||||
@ -241,7 +211,7 @@ namespace i2p
|
|||||||
i2p::crypto::ElGamalDecrypt (i2p::context.GetPrivateKey (), records[i].encrypted, (uint8_t *)&clearText);
|
i2p::crypto::ElGamalDecrypt (i2p::context.GetPrivateKey (), records[i].encrypted, (uint8_t *)&clearText);
|
||||||
|
|
||||||
i2p::tunnel::TransitTunnel * transitTunnel =
|
i2p::tunnel::TransitTunnel * transitTunnel =
|
||||||
new i2p::tunnel::TransitTunnel (
|
i2p::tunnel::CreateTransitTunnel (
|
||||||
be32toh (clearText.receiveTunnel),
|
be32toh (clearText.receiveTunnel),
|
||||||
clearText.nextIdent, be32toh (clearText.nextTunnel),
|
clearText.nextIdent, be32toh (clearText.nextTunnel),
|
||||||
clearText.layerKey, clearText.ivKey,
|
clearText.layerKey, clearText.ivKey,
|
||||||
@ -303,8 +273,8 @@ namespace i2p
|
|||||||
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf)
|
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage ();
|
I2NPMessage * msg = NewI2NPMessage ();
|
||||||
memcpy (msg->GetPayload (), buf, 1028);
|
memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
|
||||||
msg->len += 1028;
|
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
||||||
FillI2NPMessageHeader (msg, eI2NPTunnelData);
|
FillI2NPMessageHeader (msg, eI2NPTunnelData);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -312,9 +282,9 @@ namespace i2p
|
|||||||
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
|
||||||
{
|
{
|
||||||
I2NPMessage * msg = NewI2NPMessage ();
|
I2NPMessage * msg = NewI2NPMessage ();
|
||||||
memcpy (msg->GetPayload () + 4, payload, 1024);
|
memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
|
||||||
*(uint32_t *)(msg->GetPayload ()) = htobe32 (tunnelID);
|
*(uint32_t *)(msg->GetPayload ()) = htobe32 (tunnelID);
|
||||||
msg->len += 1028;
|
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
|
||||||
FillI2NPMessageHeader (msg, eI2NPTunnelData);
|
FillI2NPMessageHeader (msg, eI2NPTunnelData);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,6 @@ namespace i2p
|
|||||||
uint32_t replyTunnelID, bool exploratory = false);
|
uint32_t replyTunnelID, bool exploratory = false);
|
||||||
|
|
||||||
I2NPMessage * CreateDatabaseStoreMsg ();
|
I2NPMessage * CreateDatabaseStoreMsg ();
|
||||||
void HandleDatabaseStoreMsg (uint8_t * buf, size_t len);
|
|
||||||
|
|
||||||
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
|
||||||
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
const uint8_t * ourIdent, uint32_t receiveTunnelID,
|
||||||
|
@ -20,7 +20,7 @@ namespace i2p
|
|||||||
{
|
{
|
||||||
namespace ntcp
|
namespace ntcp
|
||||||
{
|
{
|
||||||
NTCPSession::NTCPSession (boost::asio::io_service& service, const i2p::data::RouterInfo * in_RemoteRouterInfo):
|
NTCPSession::NTCPSession (boost::asio::io_service& service, i2p::data::RouterInfo * in_RemoteRouterInfo):
|
||||||
m_Socket (service), m_TerminationTimer (service), m_IsEstablished (false),
|
m_Socket (service), m_TerminationTimer (service), m_IsEstablished (false),
|
||||||
m_ReceiveBufferOffset (0), m_NextMessage (nullptr)
|
m_ReceiveBufferOffset (0), m_NextMessage (nullptr)
|
||||||
{
|
{
|
||||||
@ -521,7 +521,7 @@ namespace ntcp
|
|||||||
|
|
||||||
|
|
||||||
NTCPClient::NTCPClient (boost::asio::io_service& service, const char * address,
|
NTCPClient::NTCPClient (boost::asio::io_service& service, const char * address,
|
||||||
int port, const i2p::data::RouterInfo& in_RouterInfo): NTCPSession (service, &in_RouterInfo),
|
int port, i2p::data::RouterInfo& in_RouterInfo): NTCPSession (service, &in_RouterInfo),
|
||||||
m_Endpoint (boost::asio::ip::address::from_string (address), port)
|
m_Endpoint (boost::asio::ip::address::from_string (address), port)
|
||||||
{
|
{
|
||||||
Connect ();
|
Connect ();
|
||||||
@ -539,6 +539,7 @@ namespace ntcp
|
|||||||
if (ecode)
|
if (ecode)
|
||||||
{
|
{
|
||||||
LogPrint ("Connect error: ", ecode.message ());
|
LogPrint ("Connect error: ", ecode.message ());
|
||||||
|
GetRemoteRouterInfo ().SetUnreachable (true);
|
||||||
Terminate ();
|
Terminate ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -319,7 +319,8 @@ namespace data
|
|||||||
RouterInfo * last = nullptr;
|
RouterInfo * last = nullptr;
|
||||||
for (auto it: m_RouterInfos)
|
for (auto it: m_RouterInfos)
|
||||||
{
|
{
|
||||||
if (it.second->IsNTCP () && (!floodfillOnly || it.second->IsFloodfill ()))
|
if (it.second->IsNTCP () && !it.second->IsUnreachable () &&
|
||||||
|
(!floodfillOnly || it.second->IsFloodfill ()))
|
||||||
last = it.second;
|
last = it.second;
|
||||||
if (i >= ind) break;
|
if (i >= ind) break;
|
||||||
else i++;
|
else i++;
|
||||||
|
@ -40,14 +40,27 @@ namespace i2p
|
|||||||
|
|
||||||
m_RouterInfo.AddNTCPAddress ("127.0.0.1", 17007); // TODO:
|
m_RouterInfo.AddNTCPAddress ("127.0.0.1", 17007); // TODO:
|
||||||
m_RouterInfo.SetProperty ("caps", "LR");
|
m_RouterInfo.SetProperty ("caps", "LR");
|
||||||
m_RouterInfo.SetProperty ("coreVersion", "0.9.7");
|
m_RouterInfo.SetProperty ("coreVersion", "0.9.8.1");
|
||||||
m_RouterInfo.SetProperty ("netId", "2");
|
m_RouterInfo.SetProperty ("netId", "2");
|
||||||
m_RouterInfo.SetProperty ("router.version", "0.9.7");
|
m_RouterInfo.SetProperty ("router.version", "0.9.8.1");
|
||||||
m_RouterInfo.SetProperty ("start_uptime", "90m");
|
m_RouterInfo.SetProperty ("start_uptime", "90m");
|
||||||
|
|
||||||
m_RouterInfo.CreateBuffer ();
|
m_RouterInfo.CreateBuffer ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RouterContext::OverrideNTCPAddress (const char * host, int port)
|
||||||
|
{
|
||||||
|
m_RouterInfo.CreateBuffer ();
|
||||||
|
auto address = m_RouterInfo.GetNTCPAddress ();
|
||||||
|
if (address)
|
||||||
|
{
|
||||||
|
address->host = host;
|
||||||
|
address->port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_RouterInfo.CreateBuffer ();
|
||||||
|
}
|
||||||
|
|
||||||
void RouterContext::Sign (uint8_t * buf, int len, uint8_t * signature)
|
void RouterContext::Sign (uint8_t * buf, int len, uint8_t * signature)
|
||||||
{
|
{
|
||||||
CryptoPP::DSA::Signer signer (m_SigningPrivateKey);
|
CryptoPP::DSA::Signer signer (m_SigningPrivateKey);
|
||||||
|
@ -24,6 +24,8 @@ namespace i2p
|
|||||||
CryptoPP::RandomNumberGenerator& GetRandomNumberGenerator () { return m_Rnd; };
|
CryptoPP::RandomNumberGenerator& GetRandomNumberGenerator () { return m_Rnd; };
|
||||||
|
|
||||||
void Sign (uint8_t * buf, int len, uint8_t * signature);
|
void Sign (uint8_t * buf, int len, uint8_t * signature);
|
||||||
|
|
||||||
|
void OverrideNTCPAddress (const char * host, int port); // temporary
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ namespace i2p
|
|||||||
namespace data
|
namespace data
|
||||||
{
|
{
|
||||||
RouterInfo::RouterInfo (const char * filename):
|
RouterInfo::RouterInfo (const char * filename):
|
||||||
m_IsUpdated (false)
|
m_IsUpdated (false), m_IsUnreachable (false)
|
||||||
{
|
{
|
||||||
ReadFromFile (filename);
|
ReadFromFile (filename);
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,8 @@ namespace data
|
|||||||
const char * GetProperty (const char * key) const;
|
const char * GetProperty (const char * key) const;
|
||||||
bool IsFloodfill () const;
|
bool IsFloodfill () const;
|
||||||
bool IsNTCP () const;
|
bool IsNTCP () const;
|
||||||
|
void SetUnreachable (bool unreachable) { m_IsUnreachable = unreachable; };
|
||||||
|
bool IsUnreachable () const { return m_IsUnreachable; };
|
||||||
|
|
||||||
void CreateBuffer ();
|
void CreateBuffer ();
|
||||||
const char * GetBuffer () const { return m_Buffer; };
|
const char * GetBuffer () const { return m_Buffer; };
|
||||||
@ -94,7 +96,7 @@ namespace data
|
|||||||
uint64_t m_Timestamp;
|
uint64_t m_Timestamp;
|
||||||
std::vector<Address> m_Addresses;
|
std::vector<Address> m_Addresses;
|
||||||
std::map<std::string, std::string> m_Properties;
|
std::map<std::string, std::string> m_Properties;
|
||||||
bool m_IsUpdated;
|
bool m_IsUpdated, m_IsUnreachable;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,12 @@ namespace util
|
|||||||
return std::chrono::duration_cast<std::chrono::hours>(
|
return std::chrono::duration_cast<std::chrono::hours>(
|
||||||
std::chrono::system_clock::now().time_since_epoch()).count ();
|
std::chrono::system_clock::now().time_since_epoch()).count ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline uint32_t GetSecondsSinceEpoch ()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::seconds>(
|
||||||
|
std::chrono::system_clock::now().time_since_epoch()).count ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,11 @@ namespace i2p
|
|||||||
boost::asio::ip::tcp::acceptor * m_NTCPAcceptor;
|
boost::asio::ip::tcp::acceptor * m_NTCPAcceptor;
|
||||||
|
|
||||||
std::map<i2p::data::IdentHash, i2p::ntcp::NTCPSession *> m_NTCPSessions;
|
std::map<i2p::data::IdentHash, i2p::ntcp::NTCPSession *> m_NTCPSessions;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// for HTTP only
|
||||||
|
const decltype(m_NTCPSessions)& GetNTCPSessions () const { return m_NTCPSessions; };
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Transports transports;
|
extern Transports transports;
|
||||||
|
52
Tunnel.cpp
52
Tunnel.cpp
@ -151,8 +151,8 @@ namespace tunnel
|
|||||||
|
|
||||||
Tunnels tunnels;
|
Tunnels tunnels;
|
||||||
|
|
||||||
Tunnels::Tunnels (): m_IsRunning (false), m_IsTunnelCreated (false), m_NextReplyMsgID (555),
|
Tunnels::Tunnels (): m_IsRunning (false), m_IsTunnelCreated (false),
|
||||||
m_ZeroHopsInboundTunnel (nullptr), m_ZeroHopsOutboundTunnel (nullptr), m_Thread (0)
|
m_NextReplyMsgID (555),m_Thread (0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,9 +173,6 @@ namespace tunnel
|
|||||||
for (auto& it : m_PendingTunnels)
|
for (auto& it : m_PendingTunnels)
|
||||||
delete it.second;
|
delete it.second;
|
||||||
m_PendingTunnels.clear ();
|
m_PendingTunnels.clear ();
|
||||||
|
|
||||||
delete m_ZeroHopsInboundTunnel;
|
|
||||||
delete m_ZeroHopsOutboundTunnel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InboundTunnel * Tunnels::GetInboundTunnel (uint32_t tunnelID)
|
InboundTunnel * Tunnels::GetInboundTunnel (uint32_t tunnelID)
|
||||||
@ -258,10 +255,6 @@ namespace tunnel
|
|||||||
void Tunnels::Run ()
|
void Tunnels::Run ()
|
||||||
{
|
{
|
||||||
sleep (1); // wait for other parts are ready
|
sleep (1); // wait for other parts are ready
|
||||||
|
|
||||||
// we must start with zero hops tunnels
|
|
||||||
CreateZeroHopsInboundTunnel ();
|
|
||||||
CreateZeroHopsOutboundTunnel ();
|
|
||||||
|
|
||||||
uint32_t lastTs = 0;
|
uint32_t lastTs = 0;
|
||||||
while (m_IsRunning)
|
while (m_IsRunning)
|
||||||
@ -314,8 +307,8 @@ namespace tunnel
|
|||||||
}
|
}
|
||||||
m_PendingTunnels.clear ();
|
m_PendingTunnels.clear ();
|
||||||
|
|
||||||
ManageOutboundTunnels ();
|
|
||||||
ManageInboundTunnels ();
|
ManageInboundTunnels ();
|
||||||
|
ManageOutboundTunnels ();
|
||||||
|
|
||||||
/* if (!m_IsTunnelCreated)
|
/* if (!m_IsTunnelCreated)
|
||||||
{
|
{
|
||||||
@ -347,10 +340,9 @@ namespace tunnel
|
|||||||
if (m_OutboundTunnels.size () < 10)
|
if (m_OutboundTunnels.size () < 10)
|
||||||
{
|
{
|
||||||
// trying to create one more oubound tunnel
|
// trying to create one more oubound tunnel
|
||||||
InboundTunnel * inboundTunnel = m_ZeroHopsInboundTunnel;
|
if (m_InboundTunnels.empty ()) return;
|
||||||
if (!m_InboundTunnels.empty ())
|
|
||||||
inboundTunnel = m_InboundTunnels.rbegin ()->second;
|
InboundTunnel * inboundTunnel = GetNextInboundTunnel ();
|
||||||
|
|
||||||
if (m_OutboundTunnels.empty () || m_OutboundTunnels.size () < 3)
|
if (m_OutboundTunnels.empty () || m_OutboundTunnels.size () < 3)
|
||||||
{
|
{
|
||||||
LogPrint ("Creating one hop outbound tunnel...");
|
LogPrint ("Creating one hop outbound tunnel...");
|
||||||
@ -360,10 +352,10 @@ namespace tunnel
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OutboundTunnel * outboundTunnel = *m_OutboundTunnels.begin ();
|
OutboundTunnel * outboundTunnel = GetNextOutboundTunnel ();
|
||||||
LogPrint ("Creating two hops outbound tunnel...");
|
LogPrint ("Creating two hops outbound tunnel...");
|
||||||
CreateTunnel<OutboundTunnel> (
|
CreateTunnel<OutboundTunnel> (
|
||||||
new TunnelConfig (inboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router,
|
new TunnelConfig (i2p::data::netdb.GetRandomNTCPRouter (),
|
||||||
i2p::data::netdb.GetRandomNTCPRouter (),
|
i2p::data::netdb.GetRandomNTCPRouter (),
|
||||||
inboundTunnel->GetTunnelConfig ()),
|
inboundTunnel->GetTunnelConfig ()),
|
||||||
outboundTunnel);
|
outboundTunnel);
|
||||||
@ -384,6 +376,13 @@ namespace tunnel
|
|||||||
else
|
else
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_InboundTunnels.empty ())
|
||||||
|
{
|
||||||
|
LogPrint ("Creating zero hops inbound tunnel...");
|
||||||
|
CreateZeroHopsInboundTunnel ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_InboundTunnels.size () < 10)
|
if (m_InboundTunnels.size () < 10)
|
||||||
{
|
{
|
||||||
@ -395,12 +394,11 @@ namespace tunnel
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OutboundTunnel * outboundTunnel = *m_OutboundTunnels.rbegin ();
|
OutboundTunnel * outboundTunnel = GetNextOutboundTunnel ();
|
||||||
InboundTunnel * inboundTunnel = m_InboundTunnels.rbegin ()->second;
|
|
||||||
LogPrint ("Creating two hops inbound tunnel...");
|
LogPrint ("Creating two hops inbound tunnel...");
|
||||||
CreateTunnel<InboundTunnel> (
|
CreateTunnel<InboundTunnel> (
|
||||||
new TunnelConfig (i2p::data::netdb.GetRandomNTCPRouter (),
|
new TunnelConfig (i2p::data::netdb.GetRandomNTCPRouter (),
|
||||||
inboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router),
|
outboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router),
|
||||||
outboundTunnel);
|
outboundTunnel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -423,26 +421,20 @@ namespace tunnel
|
|||||||
|
|
||||||
void Tunnels::AddOutboundTunnel (OutboundTunnel * newTunnel)
|
void Tunnels::AddOutboundTunnel (OutboundTunnel * newTunnel)
|
||||||
{
|
{
|
||||||
if (newTunnel != m_ZeroHopsOutboundTunnel)
|
m_OutboundTunnels.push_back (newTunnel);
|
||||||
m_OutboundTunnels.push_back (newTunnel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tunnels::AddInboundTunnel (InboundTunnel * newTunnel)
|
void Tunnels::AddInboundTunnel (InboundTunnel * newTunnel)
|
||||||
{
|
{
|
||||||
if (newTunnel != m_ZeroHopsInboundTunnel)
|
m_InboundTunnels[newTunnel->GetTunnelID ()] = newTunnel;
|
||||||
m_InboundTunnels[newTunnel->GetTunnelID ()] = newTunnel;
|
// build symmetric outbound tunnel
|
||||||
|
CreateTunnel<OutboundTunnel> (newTunnel->GetTunnelConfig ()->Invert (), GetNextOutboundTunnel ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tunnels::CreateZeroHopsOutboundTunnel ()
|
|
||||||
{
|
|
||||||
m_ZeroHopsOutboundTunnel = CreateTunnel<OutboundTunnel> (
|
|
||||||
new TunnelConfig (&i2p::context.GetRouterInfo (),
|
|
||||||
m_ZeroHopsInboundTunnel->GetTunnelConfig ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tunnels::CreateZeroHopsInboundTunnel ()
|
void Tunnels::CreateZeroHopsInboundTunnel ()
|
||||||
{
|
{
|
||||||
m_ZeroHopsInboundTunnel = CreateTunnel<InboundTunnel> (
|
CreateTunnel<InboundTunnel> (
|
||||||
new TunnelConfig (&i2p::context.GetRouterInfo ()));
|
new TunnelConfig (&i2p::context.GetRouterInfo ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
Tunnel.h
4
Tunnel.h
@ -129,7 +129,6 @@ namespace tunnel
|
|||||||
void ManageOutboundTunnels ();
|
void ManageOutboundTunnels ();
|
||||||
void ManageInboundTunnels ();
|
void ManageInboundTunnels ();
|
||||||
|
|
||||||
void CreateZeroHopsOutboundTunnel ();
|
|
||||||
void CreateZeroHopsInboundTunnel ();
|
void CreateZeroHopsInboundTunnel ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -137,8 +136,6 @@ namespace tunnel
|
|||||||
bool m_IsRunning;
|
bool m_IsRunning;
|
||||||
bool m_IsTunnelCreated; // TODO: temporary
|
bool m_IsTunnelCreated; // TODO: temporary
|
||||||
uint32_t m_NextReplyMsgID; // TODO: make it random later
|
uint32_t m_NextReplyMsgID; // TODO: make it random later
|
||||||
InboundTunnel * m_ZeroHopsInboundTunnel;
|
|
||||||
OutboundTunnel * m_ZeroHopsOutboundTunnel;
|
|
||||||
std::thread * m_Thread;
|
std::thread * m_Thread;
|
||||||
std::map<uint32_t, Tunnel *> m_PendingTunnels; // by replyMsgID
|
std::map<uint32_t, Tunnel *> m_PendingTunnels; // by replyMsgID
|
||||||
std::map<uint32_t, InboundTunnel *> m_InboundTunnels;
|
std::map<uint32_t, InboundTunnel *> m_InboundTunnels;
|
||||||
@ -151,6 +148,7 @@ namespace tunnel
|
|||||||
// for HTTP only
|
// for HTTP only
|
||||||
const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; };
|
const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; };
|
||||||
const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; };
|
const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; };
|
||||||
|
const decltype(m_TransitTunnels)& GetTransitTunnels () const { return m_TransitTunnels; };
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Tunnels tunnels;
|
extern Tunnels tunnels;
|
||||||
|
@ -9,6 +9,7 @@ namespace i2p
|
|||||||
namespace tunnel
|
namespace tunnel
|
||||||
{
|
{
|
||||||
const size_t TUNNEL_DATA_MSG_SIZE = 1028;
|
const size_t TUNNEL_DATA_MSG_SIZE = 1028;
|
||||||
|
const size_t TUNNEL_DATA_ENCRYPTED_SIZE = 1008;
|
||||||
const size_t TUNNEL_DATA_MAX_PAYLOAD_SIZE = 1003;
|
const size_t TUNNEL_DATA_MAX_PAYLOAD_SIZE = 1003;
|
||||||
|
|
||||||
enum TunnelDeliveryType
|
enum TunnelDeliveryType
|
||||||
@ -29,9 +30,11 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
virtual ~TunnelBase () {};
|
||||||
|
|
||||||
virtual void EncryptTunnelMsg (I2NPMessage * tunnelMsg) = 0;
|
virtual void EncryptTunnelMsg (I2NPMessage * tunnelMsg) = 0;
|
||||||
virtual uint32_t GetNextTunnelID () const = 0;
|
virtual uint32_t GetNextTunnelID () const = 0;
|
||||||
virtual const uint8_t * GetNextIdentHash () const = 0;
|
virtual const i2p::data::IdentHash& GetNextIdentHash () const = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,13 +10,15 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
void TunnelEndpoint::HandleDecryptedTunnelDataMsg (I2NPMessage * msg)
|
void TunnelEndpoint::HandleDecryptedTunnelDataMsg (I2NPMessage * msg)
|
||||||
{
|
{
|
||||||
|
m_NumReceivedBytes += TUNNEL_DATA_MSG_SIZE;
|
||||||
|
|
||||||
uint8_t * decrypted = msg->GetPayload () + 20; // 4 + 16
|
uint8_t * decrypted = msg->GetPayload () + 20; // 4 + 16
|
||||||
uint8_t * zero = (uint8_t *)memchr (decrypted + 4, 0, 1004); // witout checksum
|
uint8_t * zero = (uint8_t *)memchr (decrypted + 4, 0, TUNNEL_DATA_ENCRYPTED_SIZE - 4); // witout 4-byte checksum
|
||||||
if (zero)
|
if (zero)
|
||||||
{
|
{
|
||||||
LogPrint ("TunnelMessage: zero found at ", (int)(zero-decrypted));
|
LogPrint ("TunnelMessage: zero found at ", (int)(zero-decrypted));
|
||||||
uint8_t * fragment = zero + 1;
|
uint8_t * fragment = zero + 1;
|
||||||
while (fragment < decrypted + 1008)
|
while (fragment < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
|
||||||
{
|
{
|
||||||
uint8_t flag = fragment[0];
|
uint8_t flag = fragment[0];
|
||||||
fragment++;
|
fragment++;
|
||||||
@ -77,7 +79,7 @@ namespace tunnel
|
|||||||
msg->offset = fragment - msg->buf;
|
msg->offset = fragment - msg->buf;
|
||||||
msg->len = msg->offset + size;
|
msg->len = msg->offset + size;
|
||||||
bool isLastMessage = false;
|
bool isLastMessage = false;
|
||||||
if (fragment + size < decrypted + 1008)
|
if (fragment + size < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
|
||||||
{
|
{
|
||||||
// this is not last message. we have to copy it
|
// this is not last message. we have to copy it
|
||||||
m.data = NewI2NPMessage ();
|
m.data = NewI2NPMessage ();
|
||||||
@ -140,6 +142,7 @@ namespace tunnel
|
|||||||
|
|
||||||
void TunnelEndpoint::HandleNextMessage (const TunnelMessageBlock& msg)
|
void TunnelEndpoint::HandleNextMessage (const TunnelMessageBlock& msg)
|
||||||
{
|
{
|
||||||
|
LogPrint ("TunnelMessage: handle fragment of ", msg.data->GetLength ()," bytes");
|
||||||
switch (msg.deliveryType)
|
switch (msg.deliveryType)
|
||||||
{
|
{
|
||||||
case eDeliveryTypeLocal:
|
case eDeliveryTypeLocal:
|
||||||
@ -152,7 +155,7 @@ namespace tunnel
|
|||||||
i2p::transports.SendMessage (msg.hash, msg.data);
|
i2p::transports.SendMessage (msg.hash, msg.data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
;
|
LogPrint ("TunnelMessage: Unknown delivery type ", (int)msg.deliveryType);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,9 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
TunnelEndpoint (): m_NumReceivedBytes (0) {};
|
||||||
|
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
|
||||||
|
|
||||||
void HandleDecryptedTunnelDataMsg (I2NPMessage * msg);
|
void HandleDecryptedTunnelDataMsg (I2NPMessage * msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -24,6 +27,7 @@ namespace tunnel
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
std::map<uint32_t, TunnelMessageBlock> m_IncompleteMessages;
|
std::map<uint32_t, TunnelMessageBlock> m_IncompleteMessages;
|
||||||
|
size_t m_NumReceivedBytes;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user