From 697ece64cccbb8e154a4a3fa1796e2fbf0c33b08 Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Thu, 25 Jul 2019 19:54:10 -0400 Subject: [PATCH] make TransitHop self-destruct if path is invalidated --- llarp/messages/relay_status.cpp | 16 +++++----------- llarp/path/transit_hop.cpp | 26 ++++++++++++++++++++++++-- llarp/path/transit_hop.hpp | 9 +++++++++ 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/llarp/messages/relay_status.cpp b/llarp/messages/relay_status.cpp index 813523394..68aa51380 100644 --- a/llarp/messages/relay_status.cpp +++ b/llarp/messages/relay_status.cpp @@ -21,19 +21,14 @@ namespace llarp using HopHandler_ptr = std::shared_ptr< llarp::path::IHopHandler >; std::array< EncryptedFrame, 8 > frames; - PathID_t pathid; uint64_t status = 0; HopHandler_ptr path; AbstractRouter* router; LRSM_AsyncHandler(const std::array< EncryptedFrame, 8 >& _frames, - const PathID_t& _pathid, uint64_t _status, - HopHandler_ptr _path, AbstractRouter* _router) - : frames(_frames) - , pathid(_pathid) - , status(_status) - , path(_path) - , router(_router) + uint64_t _status, HopHandler_ptr _path, + AbstractRouter* _router) + : frames(_frames), status(_status), path(_path), router(_router) { } @@ -139,9 +134,8 @@ namespace llarp return false; } - const uint64_t ourStatus = LR_StatusRecord::SUCCESS; - auto handler = std::make_shared< LRSM_AsyncHandler >( - frames, pathid, ourStatus, path, router); + auto handler = + std::make_shared< LRSM_AsyncHandler >(frames, status, path, router); handler->queue_handle(); diff --git a/llarp/path/transit_hop.cpp b/llarp/path/transit_hop.cpp index f8f96e579..f2a1d3bc3 100644 --- a/llarp/path/transit_hop.cpp +++ b/llarp/path/transit_hop.cpp @@ -38,7 +38,7 @@ namespace llarp bool TransitHop::Expired(llarp_time_t now) const { - return now >= ExpireTime(); + return destroy || (now >= ExpireTime()); } llarp_time_t @@ -58,13 +58,22 @@ namespace llarp // TODO: add to IHopHandler some notion of "path status" - if(!msg->AddFrame(pathKey, status)) + const uint64_t ourStatus = LR_StatusRecord::SUCCESS; + if(!msg->AddFrame(pathKey, ourStatus)) { return false; } LR_StatusMessage::QueueSendMessage(r, info.downstream, msg); + if((status & LR_StatusRecord::SUCCESS) == 0) + { + LogDebug( + "TransitHop received non-successful LR_StatusMessage, queueing " + "self-destruct"); + QueueDestroySelf(r); + } + return true; } @@ -347,5 +356,18 @@ namespace llarp return stream; } + + void + TransitHop::SetSelfDestruct() + { + destroy = true; + } + + void + TransitHop::QueueDestroySelf(AbstractRouter* r) + { + auto func = std::bind(&TransitHop::SetSelfDestruct, this); + r->logic()->queue_func(func); + } } // namespace path } // namespace llarp diff --git a/llarp/path/transit_hop.hpp b/llarp/path/transit_hop.hpp index cd75aa95f..eb958eb50 100644 --- a/llarp/path/transit_hop.hpp +++ b/llarp/path/transit_hop.hpp @@ -92,6 +92,8 @@ namespace llarp llarp_proto_version_t version; llarp_time_t m_LastActivity = 0; + bool destroy = false; + bool IsEndpoint(const RouterID& us) const { @@ -200,6 +202,13 @@ namespace llarp bool HandleDownstream(const llarp_buffer_t& X, const TunnelNonce& Y, AbstractRouter* r) override; + + private: + void + SetSelfDestruct(); + + void + QueueDestroySelf(AbstractRouter* r); }; inline std::ostream&