mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-17 15:25:35 +00:00
baf8019fe5
This commit refactors functionality from the Router class into separate, dedicated classes. There are a few behavior changes that came as a result of discussion on what the correct behavior should be. In addition, many things Router was previously doing can now be provided callback functions to alert the calling point when the asynchronous action completes, successfully or otherwise.
113 lines
2.9 KiB
C++
113 lines
2.9 KiB
C++
#ifndef LLARP_RC_LOOKUP_HANDLER_HPP
|
|
#define LLARP_RC_LOOKUP_HANDLER_HPP
|
|
|
|
#include <router/i_rc_lookup_handler.hpp>
|
|
|
|
#include <util/threading.hpp>
|
|
#include <util/thread_pool.hpp>
|
|
|
|
#include <unordered_map>
|
|
#include <set>
|
|
#include <list>
|
|
|
|
struct llarp_nodedb;
|
|
struct llarp_dht_context;
|
|
|
|
namespace llarp
|
|
{
|
|
namespace service
|
|
{
|
|
struct Context;
|
|
|
|
} // namespace service
|
|
|
|
struct ILinkManager;
|
|
|
|
struct RCLookupHandler final : public I_RCLookupHandler
|
|
{
|
|
public:
|
|
using CallbacksQueue = std::list< RCRequestCallback >;
|
|
|
|
~RCLookupHandler() = default;
|
|
|
|
void
|
|
AddValidRouter(const RouterID &router) override;
|
|
|
|
void
|
|
RemoveValidRouter(const RouterID &router) override;
|
|
|
|
void
|
|
SetRouterWhitelist(const std::vector< RouterID > &routers) override;
|
|
|
|
void
|
|
GetRC(const RouterID &router, RCRequestCallback callback) override;
|
|
|
|
bool
|
|
RemoteIsAllowed(const RouterID &remote) const override;
|
|
|
|
bool
|
|
CheckRC(const RouterContact &rc) const override;
|
|
|
|
bool
|
|
GetRandomWhitelistRouter(RouterID &router) const override;
|
|
|
|
bool
|
|
CheckRenegotiateValid(RouterContact newrc, RouterContact oldrc) override;
|
|
|
|
void
|
|
PeriodicUpdate(llarp_time_t now) override;
|
|
|
|
void
|
|
ExploreNetwork() override;
|
|
|
|
void
|
|
Init(llarp_dht_context *dht, llarp_nodedb *nodedb,
|
|
std::shared_ptr< llarp::thread::ThreadPool > threadpool,
|
|
ILinkManager *linkManager, service::Context *hiddenServiceContext,
|
|
const std::set< RouterID > &strictConnectPubkeys,
|
|
const std::set< RouterContact > &bootstrapRCList,
|
|
bool useWhitelist_arg, bool isServiceNode_arg);
|
|
|
|
private:
|
|
void
|
|
HandleDHTLookupResult(RouterID remote,
|
|
const std::vector< RouterContact > &results);
|
|
|
|
bool
|
|
HavePendingLookup(RouterID remote) const;
|
|
|
|
bool
|
|
RemoteInBootstrap(const RouterID &remote) const;
|
|
|
|
void
|
|
FinalizeRequest(const RouterID &router, const RouterContact *const rc,
|
|
RCRequestResult result);
|
|
|
|
mutable util::Mutex _mutex; // protects pendingCallbacks, whitelistRouters
|
|
|
|
llarp_dht_context *_dht = nullptr;
|
|
llarp_nodedb *_nodedb = nullptr;
|
|
std::shared_ptr< llarp::thread::ThreadPool > _threadpool = nullptr;
|
|
service::Context *_hiddenServiceContext = nullptr;
|
|
ILinkManager *_linkManager = nullptr;
|
|
|
|
/// explicit whitelist of routers we will connect to directly (not for
|
|
/// service nodes)
|
|
std::set< RouterID > _strictConnectPubkeys;
|
|
|
|
std::set< RouterContact > _bootstrapRCList;
|
|
std::set< RouterID > _bootstrapRouterIDList;
|
|
|
|
std::unordered_map< RouterID, CallbacksQueue, RouterID::Hash >
|
|
pendingCallbacks GUARDED_BY(_mutex);
|
|
|
|
bool useWhitelist = false;
|
|
bool isServiceNode = false;
|
|
|
|
std::set< RouterID > whitelistRouters GUARDED_BY(_mutex);
|
|
};
|
|
|
|
} // namespace llarp
|
|
|
|
#endif // LLARP_RC_LOOKUP_HANDLER_HPP
|