From 7019b6d68f1f5b8812c63442ee83ebbd6e560d2f Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 17 Sep 2014 11:13:25 -0400 Subject: [PATCH] reuse DH keys pairs from failed NTCP sessions --- NTCPSession.cpp | 9 +++++++++ Transports.cpp | 11 +++++++++++ Transports.h | 4 +++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 3c08832f..a083359d 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -100,6 +100,9 @@ namespace ntcp delete m_Establisher; m_Establisher = nullptr; + delete m_DHKeysPair; + m_DHKeysPair = nullptr; + SendTimeSyncMessage (); SendI2NPMessage (CreateDatabaseStoreMsg ()); // we tell immediately who we are @@ -154,6 +157,8 @@ namespace ntcp if (ecode) { LogPrint ("Phase 1 read error: ", ecode.message ()); + i2p::transports.ReuseDHKeysPair (m_DHKeysPair); + m_DHKeysPair = nullptr; Terminate (); } else @@ -168,6 +173,8 @@ namespace ntcp if ((m_Establisher->phase1.HXxorHI[i] ^ ident[i]) != digest[i]) { LogPrint ("Wrong ident"); + i2p::transports.ReuseDHKeysPair (m_DHKeysPair); + m_DHKeysPair = nullptr; Terminate (); return; } @@ -224,6 +231,8 @@ namespace ntcp { LogPrint ("Phase 2 read error: ", ecode.message (), ". Wrong ident assumed"); GetRemoteRouterInfo ().SetUnreachable (true); // this RouterInfo is not valid + i2p::transports.ReuseDHKeysPair (m_DHKeysPair); + m_DHKeysPair = nullptr; Terminate (); } else diff --git a/Transports.cpp b/Transports.cpp index 136e4a07..b36d266a 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -76,6 +76,12 @@ namespace i2p } } + void DHKeysPairSupplier::Return (i2p::data::DHKeysPair * pair) + { + std::unique_lock l(m_AcquiredMutex); + m_Queue.push (pair); + } + Transports transports; Transports::Transports (): @@ -315,4 +321,9 @@ namespace i2p { return m_DHKeysPairSupplier.Acquire (); } + + void Transports::ReuseDHKeysPair (i2p::data::DHKeysPair * pair) + { + m_DHKeysPairSupplier.Return (pair); + } } diff --git a/Transports.h b/Transports.h index 20052a15..88f43b26 100644 --- a/Transports.h +++ b/Transports.h @@ -26,6 +26,7 @@ namespace i2p void Start (); void Stop (); i2p::data::DHKeysPair * Acquire (); + void Return (i2p::data::DHKeysPair * pair); private: @@ -34,7 +35,7 @@ namespace i2p private: - int m_QueueSize; + const int m_QueueSize; std::queue m_Queue; bool m_IsRunning; @@ -55,6 +56,7 @@ namespace i2p boost::asio::io_service& GetService () { return m_Service; }; i2p::data::DHKeysPair * GetNextDHKeysPair (); + void ReuseDHKeysPair (i2p::data::DHKeysPair * pair); void AddNTCPSession (i2p::ntcp::NTCPSession * session); void RemoveNTCPSession (i2p::ntcp::NTCPSession * session);