mirror of https://github.com/oxen-io/lokinet
make TransitHop self-destruct if path is invalidated
This commit is contained in:
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…
Reference in New Issue