make TransitHop self-destruct if path is invalidated

pull/732/head
Thomas Winget 5 years ago
parent 38fd0552d3
commit 697ece64cc

@ -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();

@ -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

@ -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&

Loading…
Cancel
Save