From 5575b981c85a6bab605cd4ed63b73c1c5eeff76b Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 13 Jul 2018 15:59:28 -0400 Subject: [PATCH] enable NTCP2 as transport --- libi2pd/NTCP2.cpp | 10 ++++++++++ libi2pd/NTCP2.h | 2 ++ libi2pd/Transports.cpp | 24 +++++++++++++++++++++++- libi2pd/Transports.h | 3 +++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/libi2pd/NTCP2.cpp b/libi2pd/NTCP2.cpp index 36ebc0ca..a5e70c24 100644 --- a/libi2pd/NTCP2.cpp +++ b/libi2pd/NTCP2.cpp @@ -9,6 +9,7 @@ #include "Ed25519.h" #include "Siphash.h" #include "RouterContext.h" +#include "Transports.h" #include "NTCP2.h" namespace i2p @@ -162,6 +163,13 @@ namespace transport m_Server.GetService ().post (std::bind (&NTCP2Session::Terminate, shared_from_this ())); } + void NTCP2Session::Established () + { + m_IsEstablished = true; + m_Establisher.reset (nullptr); + transports.PeerConnected (shared_from_this ()); + } + void NTCP2Session::CreateNonce (uint64_t seqn, uint8_t * nonce) { memset (nonce, 0, 4); @@ -443,6 +451,7 @@ namespace transport m_ReceiveSipKey = m_Sipkeysba; memcpy (m_ReceiveIV, m_Sipkeysba + 16, 8); memcpy (m_SendIV, m_Sipkeysab + 16, 8); + Established (); ReceiveLength (); // TODO: remove @@ -520,6 +529,7 @@ namespace transport m_ReceiveSipKey = m_Sipkeysab; memcpy (m_ReceiveIV, m_Sipkeysab + 16, 8); memcpy (m_SendIV, m_Sipkeysba + 16, 8); + Established (); ReceiveLength (); } } diff --git a/libi2pd/NTCP2.h b/libi2pd/NTCP2.h index 0576d3c2..167b0528 100644 --- a/libi2pd/NTCP2.h +++ b/libi2pd/NTCP2.h @@ -62,6 +62,8 @@ namespace transport private: + void Established (); + void CreateNonce (uint64_t seqn, uint8_t * nonce); void KeyDerivationFunctionDataPhase (); diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index 9914c75e..32f1dc30 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -117,7 +117,8 @@ namespace transport Transports::Transports (): m_IsOnline (true), m_IsRunning (false), m_IsNAT (true), m_Thread (nullptr), m_Service (nullptr), m_Work (nullptr), m_PeerCleanupTimer (nullptr), m_PeerTestTimer (nullptr), - m_NTCPServer (nullptr), m_SSUServer (nullptr), m_DHKeysPairSupplier (5), // 5 pre-generated keys + m_NTCPServer (nullptr), m_SSUServer (nullptr), m_NTCP2Server (nullptr), + m_DHKeysPairSupplier (5), // 5 pre-generated keys m_TotalSentBytes(0), m_TotalReceivedBytes(0), m_TotalTransitTransmittedBytes (0), m_InBandwidth (0), m_OutBandwidth (0), m_TransitBandwidth(0), m_LastInBandwidthUpdateBytes (0), m_LastOutBandwidthUpdateBytes (0), @@ -191,6 +192,13 @@ namespace transport LogPrint(eLogError, "Transports: invalid NTCP proxy url ", ntcpproxy); return; } + // create NTCP2. TODO: move to acceptor + bool ntcp2; i2p::config::GetOption("ntcp2", ntcp2); + if (ntcp2) + { + m_NTCP2Server = new NTCP2Server (); + m_NTCP2Server->Start (); + } // create acceptors auto& addresses = context.GetRouterInfo ().GetAddresses (); @@ -262,6 +270,13 @@ namespace transport m_NTCPServer = nullptr; } + if (m_NTCP2Server) + { + m_NTCP2Server->Stop (); + delete m_NTCP2Server; + m_NTCP2Server = nullptr; + } + m_DHKeysPairSupplier.Stop (); m_IsRunning = false; if (m_Service) m_Service->stop (); @@ -390,6 +405,13 @@ namespace transport { peer.numAttempts++; auto address = peer.router->GetNTCPAddress (!context.SupportsV6 ()); + if (address && address->IsNTCP2 () && m_NTCP2Server) // NTCP2 have priority over NTCP if enabled + { + auto s = std::make_shared (*m_NTCP2Server, peer.router); + m_NTCP2Server->Connect (address->host, address->port, s); + return true; + } + if (address && m_NTCPServer) { #if BOOST_VERSION >= 104900 diff --git a/libi2pd/Transports.h b/libi2pd/Transports.h index d4410cb3..47944fff 100644 --- a/libi2pd/Transports.h +++ b/libi2pd/Transports.h @@ -15,6 +15,7 @@ #include "TransportSession.h" #include "NTCPSession.h" #include "SSU.h" +#include "NTCP2.h" #include "RouterInfo.h" #include "I2NPProtocol.h" #include "Identity.h" @@ -154,6 +155,7 @@ namespace transport NTCPServer * m_NTCPServer; SSUServer * m_SSUServer; + NTCP2Server * m_NTCP2Server; mutable std::mutex m_PeersMutex; std::map m_Peers; @@ -179,6 +181,7 @@ namespace transport // for HTTP only const NTCPServer * GetNTCPServer () const { return m_NTCPServer; }; const SSUServer * GetSSUServer () const { return m_SSUServer; }; + const NTCP2Server * GetNTCP2Server () const { return m_NTCP2Server; }; const decltype(m_Peers)& GetPeers () const { return m_Peers; }; };