|
|
@ -22,21 +22,21 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
|
|
std::array<EncryptedFrame, 8> frames;
|
|
|
|
std::array<EncryptedFrame, 8> frames;
|
|
|
|
uint64_t status = 0;
|
|
|
|
uint64_t status = 0;
|
|
|
|
HopHandler_ptr path;
|
|
|
|
HopHandler_ptr hop;
|
|
|
|
AbstractRouter* router;
|
|
|
|
AbstractRouter* router;
|
|
|
|
PathID_t pathid;
|
|
|
|
PathID_t pathid;
|
|
|
|
|
|
|
|
|
|
|
|
LRSM_AsyncHandler(
|
|
|
|
LRSM_AsyncHandler(
|
|
|
|
std::array<EncryptedFrame, 8> _frames,
|
|
|
|
std::array<EncryptedFrame, 8> _frames,
|
|
|
|
uint64_t _status,
|
|
|
|
uint64_t _status,
|
|
|
|
HopHandler_ptr _path,
|
|
|
|
HopHandler_ptr _hop,
|
|
|
|
AbstractRouter* _router,
|
|
|
|
AbstractRouter* _router,
|
|
|
|
const PathID_t& pathid)
|
|
|
|
const PathID_t& pathid)
|
|
|
|
: frames(std::move(_frames))
|
|
|
|
: frames{std::move(_frames)}
|
|
|
|
, status(_status)
|
|
|
|
, status{_status}
|
|
|
|
, path(std::move(_path))
|
|
|
|
, hop{std::move(_hop)}
|
|
|
|
, router(_router)
|
|
|
|
, router{_router}
|
|
|
|
, pathid(pathid)
|
|
|
|
, pathid{pathid}
|
|
|
|
{}
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
~LRSM_AsyncHandler() = default;
|
|
|
|
~LRSM_AsyncHandler() = default;
|
|
|
@ -45,8 +45,7 @@ namespace llarp
|
|
|
|
handle()
|
|
|
|
handle()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
router->NotifyRouterEvent<tooling::PathStatusReceivedEvent>(router->pubkey(), pathid, status);
|
|
|
|
router->NotifyRouterEvent<tooling::PathStatusReceivedEvent>(router->pubkey(), pathid, status);
|
|
|
|
|
|
|
|
hop->HandleLRSM(status, frames, router);
|
|
|
|
path->HandleLRSM(status, frames, router);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
@ -133,16 +132,13 @@ namespace llarp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
auto path = router->pathContext().GetByUpstream(session->GetPubKey(), pathid);
|
|
|
|
auto path = router->pathContext().GetByUpstream(session->GetPubKey(), pathid);
|
|
|
|
if (!path)
|
|
|
|
if (not path)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp::LogWarn("unhandled LR_Status message: no associated path found pathid=", pathid);
|
|
|
|
llarp::LogWarn("unhandled LR_Status message: no associated path found pathid=", pathid);
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
auto handler = std::make_shared<LRSM_AsyncHandler>(frames, status, path, router, pathid);
|
|
|
|
auto handler = std::make_shared<LRSM_AsyncHandler>(frames, status, path, router, pathid);
|
|
|
|
|
|
|
|
|
|
|
|
handler->queue_handle();
|
|
|
|
handler->queue_handle();
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -157,6 +153,7 @@ namespace llarp
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
LR_StatusMessage::CreateAndSend(
|
|
|
|
LR_StatusMessage::CreateAndSend(
|
|
|
|
AbstractRouter* router,
|
|
|
|
AbstractRouter* router,
|
|
|
|
|
|
|
|
std::shared_ptr<path::TransitHop> hop,
|
|
|
|
const PathID_t pathid,
|
|
|
|
const PathID_t pathid,
|
|
|
|
const RouterID nextHop,
|
|
|
|
const RouterID nextHop,
|
|
|
|
const SharedSecret pathKey,
|
|
|
|
const SharedSecret pathKey,
|
|
|
@ -169,12 +166,9 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
|
|
message->SetDummyFrames();
|
|
|
|
message->SetDummyFrames();
|
|
|
|
|
|
|
|
|
|
|
|
if (!message->AddFrame(pathKey, status))
|
|
|
|
message->AddFrame(pathKey, status);
|
|
|
|
{
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QueueSendMessage(router, nextHop, message);
|
|
|
|
QueueSendMessage(router, nextHop, message, hop);
|
|
|
|
return true; // can't guarantee delivery here, as far as we know it's fine
|
|
|
|
return true; // can't guarantee delivery here, as far as we know it's fine
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -221,10 +215,19 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
LR_StatusMessage::QueueSendMessage(
|
|
|
|
LR_StatusMessage::QueueSendMessage(
|
|
|
|
AbstractRouter* router, const RouterID nextHop, std::shared_ptr<LR_StatusMessage> msg)
|
|
|
|
AbstractRouter* router,
|
|
|
|
|
|
|
|
const RouterID nextHop,
|
|
|
|
|
|
|
|
std::shared_ptr<LR_StatusMessage> msg,
|
|
|
|
|
|
|
|
std::shared_ptr<path::TransitHop> hop)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
router->loop()->call(
|
|
|
|
router->loop()->call([router, nextHop, msg = std::move(msg), hop = std::move(hop)] {
|
|
|
|
[router, nextHop, msg = std::move(msg)] { SendMessage(router, nextHop, msg); });
|
|
|
|
SendMessage(router, nextHop, msg);
|
|
|
|
|
|
|
|
// destroy hop as needed
|
|
|
|
|
|
|
|
if ((msg->status & LR_StatusRecord::SUCCESS) != LR_StatusRecord::SUCCESS)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
hop->QueueDestroySelf(router);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|