Introduce abstract class for dht::Context

pull/247/head
Michael 5 years ago
parent 40449df0f1
commit 3f320009d7
No known key found for this signature in database
GPG Key ID: 2D51757B47E2434C

@ -23,6 +23,8 @@ namespace llarp
{
namespace dht
{
AbstractContext::~AbstractContext() {}
Context::Context() : router(nullptr), allowTransit(false)
{
randombytes((byte_t *)&ids, sizeof(uint64_t));
@ -413,13 +415,13 @@ namespace llarp
}
llarp::Crypto *
Context::Crypto()
Context::Crypto() const
{
return &router->crypto;
}
llarp_time_t
Context::Now()
Context::Now() const
{
return llarp_ev_loop_time_now_ms(router->netloop);
}

@ -21,12 +21,61 @@ namespace llarp
namespace dht
{
struct Context
struct AbstractContext
{
virtual ~AbstractContext() = 0;
virtual bool
LookupRouter(const RouterID& target, RouterLookupHandler result) = 0;
/// on behalf of whoasked request introset for target from dht router with
/// key askpeer
virtual void
LookupIntroSetRecursive(const service::Address& target,
const Key_t& whoasked, uint64_t whoaskedTX,
const Key_t& askpeer, uint64_t R,
service::IntroSetLookupHandler result = nullptr) = 0;
virtual void
LookupIntroSetIterative(const service::Address& target,
const Key_t& whoasked, uint64_t whoaskedTX,
const Key_t& askpeer,
service::IntroSetLookupHandler result = nullptr) = 0;
virtual std::set< service::IntroSet >
FindRandomIntroSetsWithTagExcluding(
const service::Tag& tag, size_t max = 2,
const std::set< service::IntroSet >& excludes = {}) = 0;
virtual void
DHTSendTo(const RouterID& peer, IMessage* msg, bool keepalive = true) = 0;
virtual llarp_time_t
Now() const = 0;
virtual llarp::Crypto*
Crypto() const = 0;
virtual llarp::Router*
GetRouter() const = 0;
virtual const Key_t&
OurKey() const = 0;
virtual Bucket< RCNode >* Nodes() const = 0;
};
struct Context final : public AbstractContext
{
Context();
~Context()
{
}
llarp::Crypto*
Crypto();
Crypto() const override;
/// on behalf of whoasked request introset for target from dht router with
/// key askpeer
@ -34,13 +83,13 @@ namespace llarp
LookupIntroSetRecursive(const service::Address& target,
const Key_t& whoasked, uint64_t whoaskedTX,
const Key_t& askpeer, uint64_t R,
service::IntroSetLookupHandler result = nullptr);
service::IntroSetLookupHandler result = nullptr) override;
void
LookupIntroSetIterative(const service::Address& target,
const Key_t& whoasked, uint64_t whoaskedTX,
const Key_t& askpeer,
service::IntroSetLookupHandler result = nullptr);
service::IntroSetLookupHandler result = nullptr) override;
/// on behalf of whoasked request router with public key target from dht
/// router with key askpeer
@ -50,7 +99,7 @@ namespace llarp
RouterLookupHandler result = nullptr);
bool
LookupRouter(const RouterID& target, RouterLookupHandler result)
LookupRouter(const RouterID& target, RouterLookupHandler result) override
{
Key_t askpeer;
if(!nodes->FindClosest(Key_t(target), askpeer))
@ -92,7 +141,7 @@ namespace llarp
/// send a dht message to peer, if keepalive is true then keep the session
/// with that peer alive for 10 seconds
void
DHTSendTo(const RouterID& peer, IMessage* msg, bool keepalive = true);
DHTSendTo(const RouterID& peer, IMessage* msg, bool keepalive = true) override;
/// get routers closest to target excluding requester
bool
@ -103,7 +152,7 @@ namespace llarp
std::set< service::IntroSet >
FindRandomIntroSetsWithTagExcluding(
const service::Tag& tag, size_t max = 2,
const std::set< service::IntroSet >& excludes = {});
const std::set< service::IntroSet >& excludes = {}) override;
/// handle rc lookup from requester for target
void
@ -149,12 +198,17 @@ namespace llarp
std::unique_ptr< Bucket< ISNode > > services;
bool allowTransit;
Bucket< RCNode >* Nodes() const override { return nodes.get(); }
const Key_t&
OurKey() const
OurKey() const override
{
return ourKey;
}
llarp::Router*
GetRouter() const override { return router; }
TXHolder< service::Address, service::IntroSet, service::Address::Hash >
pendingIntrosetLookups;
@ -172,7 +226,7 @@ namespace llarp
}
llarp_time_t
Now();
Now() const override;
void
ExploreNetworkVia(const Key_t& peer);

@ -23,7 +23,7 @@ namespace llarp
// lookup router
parent->LookupRouter(
pk,
std::bind(&Router::HandleDHTLookupForExplore, parent->router, pk,
std::bind(&Router::HandleDHTLookupForExplore, parent->GetRouter(), pk,
std::placeholders::_1));
}
}

@ -10,7 +10,7 @@ namespace llarp
{
struct ExploreNetworkJob : public TX< RouterID, RouterID >
{
ExploreNetworkJob(const RouterID &peer, Context *ctx)
ExploreNetworkJob(const RouterID &peer, AbstractContext *ctx)
: TX< RouterID, RouterID >(TXOwner{}, peer, ctx)
{
}

@ -11,7 +11,7 @@ namespace llarp
namespace dht
{
LocalRouterLookup::LocalRouterLookup(const PathID_t &path, uint64_t txid,
const RouterID &target, Context *ctx)
const RouterID &target, AbstractContext *ctx)
: RecursiveRouterLookup(TXOwner{ctx->OurKey(), txid}, target, ctx,
nullptr)
, localPath(path)
@ -21,7 +21,7 @@ namespace llarp
void
LocalRouterLookup::SendReply()
{
auto path = parent->router->paths.GetByUpstream(
auto path = parent->GetRouter()->paths.GetByUpstream(
parent->OurKey().as_array(), localPath);
if(!path)
{
@ -34,7 +34,7 @@ namespace llarp
routing::DHTMessage msg;
msg.M.emplace_back(new GotRouterMessage(parent->OurKey(), whoasked.txid,
valuesFound, true));
if(!path->SendRoutingMessage(&msg, parent->router))
if(!path->SendRoutingMessage(&msg, parent->GetRouter()))
{
llarp::LogWarn(
"failed to send routing message when informing result of dht "

@ -16,7 +16,7 @@ namespace llarp
PathID_t localPath;
LocalRouterLookup(const PathID_t &path, uint64_t txid,
const RouterID &target, Context *ctx);
const RouterID &target, AbstractContext *ctx);
void
SendReply() override;

@ -11,7 +11,7 @@ namespace llarp
{
LocalServiceAddressLookup::LocalServiceAddressLookup(
const PathID_t &pathid, uint64_t txid, const service::Address &addr,
Context *ctx, __attribute__((unused)) const Key_t &askpeer)
AbstractContext *ctx, __attribute__((unused)) const Key_t &askpeer)
: ServiceAddressLookup(TXOwner{ctx->OurKey(), txid}, addr, ctx, 5,
nullptr)
, localPath(pathid)
@ -21,7 +21,7 @@ namespace llarp
void
LocalServiceAddressLookup::SendReply()
{
auto path = parent->router->paths.GetByUpstream(
auto path = parent->GetRouter()->paths.GetByUpstream(
parent->OurKey().as_array(), localPath);
if(!path)
{
@ -33,7 +33,7 @@ namespace llarp
}
routing::DHTMessage msg;
msg.M.emplace_back(new GotIntroMessage(valuesFound, whoasked.txid));
if(!path->SendRoutingMessage(&msg, parent->router))
if(!path->SendRoutingMessage(&msg, parent->GetRouter()))
{
llarp::LogWarn(
"failed to send routing message when informing result of dht "

@ -14,7 +14,7 @@ namespace llarp
PathID_t localPath;
LocalServiceAddressLookup(const PathID_t &pathid, uint64_t txid,
const service::Address &addr, Context *ctx,
const service::Address &addr, AbstractContext *ctx,
__attribute__((unused)) const Key_t &askpeer);
void

@ -10,7 +10,7 @@ namespace llarp
namespace dht
{
LocalTagLookup::LocalTagLookup(const PathID_t &path, uint64_t txid,
const service::Tag &target, Context *ctx)
const service::Tag &target, AbstractContext *ctx)
: TagLookup(TXOwner{ctx->OurKey(), txid}, target, ctx, 0)
, localPath(path)
{
@ -19,7 +19,7 @@ namespace llarp
void
LocalTagLookup::SendReply()
{
auto path = parent->router->paths.GetByUpstream(
auto path = parent->GetRouter()->paths.GetByUpstream(
parent->OurKey().as_array(), localPath);
if(!path)
{
@ -31,7 +31,7 @@ namespace llarp
}
routing::DHTMessage msg;
msg.M.emplace_back(new GotIntroMessage(valuesFound, whoasked.txid));
if(!path->SendRoutingMessage(&msg, parent->router))
if(!path->SendRoutingMessage(&msg, parent->GetRouter()))
{
llarp::LogWarn(
"failed to send routing message when informing result of dht "

@ -12,7 +12,7 @@ namespace llarp
PathID_t localPath;
LocalTagLookup(const PathID_t &path, uint64_t txid,
const service::Tag &target, Context *ctx);
const service::Tag &target, AbstractContext *ctx);
void
SendReply() override;

@ -9,7 +9,7 @@ namespace llarp
{
PublishServiceJob::PublishServiceJob(const TXOwner &asker,
const service::IntroSet &introset,
Context *ctx, uint64_t s,
AbstractContext *ctx, uint64_t s,
const std::set< Key_t > &exclude)
: TX< service::Address, service::IntroSet >(asker, introset.A.Addr(),
ctx)

@ -19,7 +19,7 @@ namespace llarp
service::IntroSet I;
PublishServiceJob(const TXOwner &asker, const service::IntroSet &introset,
Context *ctx, uint64_t s,
AbstractContext *ctx, uint64_t s,
const std::set< Key_t > &exclude);
bool

@ -10,7 +10,7 @@ namespace llarp
{
RecursiveRouterLookup::RecursiveRouterLookup(const TXOwner &whoasked,
const RouterID &target,
Context *ctx,
AbstractContext *ctx,
RouterLookupHandler result)
: TX< RouterID, RouterContact >(whoasked, target, ctx)
, resultHandler(result)

@ -14,7 +14,7 @@ namespace llarp
{
RouterLookupHandler resultHandler;
RecursiveRouterLookup(const TXOwner &whoasked, const RouterID &target,
Context *ctx, RouterLookupHandler result);
AbstractContext *ctx, RouterLookupHandler result);
bool
Validate(const RouterContact &rc) const override;

@ -9,7 +9,7 @@ namespace llarp
namespace dht
{
ServiceAddressLookup::ServiceAddressLookup(
const TXOwner &asker, const service::Address &addr, Context *ctx,
const TXOwner &asker, const service::Address &addr, AbstractContext *ctx,
uint64_t r, service::IntroSetLookupHandler handler)
: TX< service::Address, service::IntroSet >(asker, addr, ctx)
, handleResult(handler)
@ -39,7 +39,7 @@ namespace llarp
const std::set< Key_t > &exclude)
{
Key_t k = target.ToKey();
return parent->nodes->FindCloseExcluding(k, next, exclude);
return parent->Nodes()->FindCloseExcluding(k, next, exclude);
}
void

@ -19,7 +19,7 @@ namespace llarp
uint64_t R;
ServiceAddressLookup(const TXOwner &asker, const service::Address &addr,
Context *ctx, uint64_t r,
AbstractContext *ctx, uint64_t r,
service::IntroSetLookupHandler handler);
bool

@ -12,7 +12,7 @@ namespace llarp
struct TagLookup : public TX< service::Tag, service::IntroSet >
{
uint64_t R;
TagLookup(const TXOwner &asker, const service::Tag &tag, Context *ctx,
TagLookup(const TXOwner &asker, const service::Tag &tag, AbstractContext *ctx,
uint64_t r)
: TX< service::Tag, service::IntroSet >(asker, tag, ctx), R(r)
{

@ -14,21 +14,20 @@ namespace llarp
namespace dht
{
struct Context;
struct AbstractContext;
template < typename K, typename V >
struct TX
{
K target;
Context* parent;
AbstractContext* parent;
std::set< Key_t > peersAsked;
std::vector< V > valuesFound;
TXOwner whoasked;
TX(const TXOwner& asker, const K& k, Context* p)
: target(k), whoasked(asker)
TX(const TXOwner& asker, const K& k, AbstractContext* p)
: target(k), parent(p), whoasked(asker)
{
parent = p;
}
virtual ~TX(){};
@ -82,7 +81,7 @@ namespace llarp
else if(!GetNextPeer(peer, peersAsked))
{
// no more peers
llarp::LogInfo("no more peers for request asking for", target);
llarp::LogInfo("no more peers for request asking for ", target);
return false;
}

Loading…
Cancel
Save