diff --git a/llarp/CMakeLists.txt b/llarp/CMakeLists.txt index 0517b1c0f..36c3031f3 100644 --- a/llarp/CMakeLists.txt +++ b/llarp/CMakeLists.txt @@ -175,6 +175,7 @@ add_library(liblokinet routing/path_transfer_message.cpp routing/transfer_traffic_message.cpp rpc/lokid_rpc_client.cpp + rpc/rpc_server.cpp service/address.cpp service/async_key_exchange.cpp service/context.cpp diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 315dc5c33..d0810430c 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -64,6 +64,7 @@ namespace llarp #else , _randomStartDelay(std::chrono::seconds((llarp::randint() % 30) + 10)) #endif + , m_RPCServer(new rpc::RpcServer(m_lmq, this)) , m_lokidRpcClient(std::make_shared(m_lmq, this)) { m_keyManager = std::make_shared(); @@ -850,8 +851,16 @@ namespace llarp { rpcBindAddr = DefaultRPCBindAddr; } - // TODO: set up rpc server - // LogInfo("Bound RPC server to ", rpcBindAddr); + // older configs just specify an ip/port tuple so check for that and prepend tcp:// in that + // case + if (rpcBindAddr.find("tcp://") == std::string::npos + and rpcBindAddr.find("ipc://") == std::string::npos) + { + LogWarn("RPC Server protocol not specified, defaulting to tcp"); + rpcBindAddr = "tcp://" + rpcBindAddr; + } + m_RPCServer->AsyncServeRPC(rpcBindAddr); + LogInfo("Bound RPC server to ", rpcBindAddr); } return true; diff --git a/llarp/router/router.hpp b/llarp/router/router.hpp index c1e8f8c61..628bbab54 100644 --- a/llarp/router/router.hpp +++ b/llarp/router/router.hpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -256,9 +257,11 @@ namespace llarp NetworkConfig networkConfig; DnsConfig dnsConfig; - const std::string DefaultRPCBindAddr = "127.0.0.1:1190"; + const std::string DefaultRPCBindAddr = "tcp://127.0.0.1:1190"; bool enableRPCServer = false; std::string rpcBindAddr = DefaultRPCBindAddr; + std::unique_ptr m_RPCServer; + const llarp_time_t _randomStartDelay; std::shared_ptr m_lokidRpcClient; diff --git a/llarp/rpc/lokid_rpc_client.hpp b/llarp/rpc/lokid_rpc_client.hpp index f5c4daaa5..30a30f1e1 100644 --- a/llarp/rpc/lokid_rpc_client.hpp +++ b/llarp/rpc/lokid_rpc_client.hpp @@ -15,6 +15,7 @@ namespace llarp /// The LokidRpcClient uses loki-mq to talk to make API requests to lokid. struct LokidRpcClient : public std::enable_shared_from_this + { LokidRpcClient(LMQ_ptr lmq, AbstractRouter* r); /// Connect to lokid async diff --git a/llarp/rpc/rpc_server.cpp b/llarp/rpc/rpc_server.cpp new file mode 100644 index 000000000..5beeb8f03 --- /dev/null +++ b/llarp/rpc/rpc_server.cpp @@ -0,0 +1,14 @@ +#include "rpc_server.hpp" + +namespace llarp::rpc +{ + RpcServer::RpcServer(LMQ_ptr lmq, AbstractRouter* r) : m_LMQ(std::move(lmq)), m_Router(r) + { + } + + void RpcServer::AsyncServeRPC(std::string_view) + { + throw std::runtime_error("FIXME: implement llarp::rpc::RpcServer::AsyncServeRPC"); + } + +} // namespace llarp::rpc diff --git a/llarp/rpc/rpc_server.hpp b/llarp/rpc/rpc_server.hpp new file mode 100644 index 000000000..75ce00a98 --- /dev/null +++ b/llarp/rpc/rpc_server.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +namespace llarp +{ + struct AbstractRouter; +} + +namespace llarp::rpc +{ + using LMQ_ptr = std::shared_ptr; + + struct RpcServer + { + explicit RpcServer(LMQ_ptr, AbstractRouter*); + ~RpcServer() = default; + void + AsyncServeRPC(const std::string_view addr); + + private: + LMQ_ptr m_LMQ; + AbstractRouter* const m_Router; + }; +} // namespace llarp::rpc