lokinet/llarp/router/rc_lookup_handler.hpp
Thomas Winget baf8019fe5 Refactor Router code into more classes
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.
2019-07-25 14:11:02 -04:00

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