From 1ce44098b09528bd42655bef1f81941cc22f013f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Tue, 21 May 2019 11:04:19 -0400 Subject: [PATCH] dhtrunner: add pluggable transport --- include/opendht/dhtrunner.h | 3 +++ src/dhtrunner.cpp | 21 +++++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h index 97d57823..95e0bfa2 100644 --- a/include/opendht/dhtrunner.h +++ b/include/opendht/dhtrunner.h @@ -66,6 +66,7 @@ public: struct Context { std::unique_ptr<Logger> logger {}; + std::unique_ptr<net::DatagramSocket> sock; std::shared_ptr<PeerDiscovery> peerDiscovery {}; StatusCallback statusChangedCallback {}; CertificateStoreQuery certificateStore {}; @@ -400,6 +401,8 @@ public: */ void run(const char* ip4, const char* ip6, const char* service, const Config& config, Context&& context = {}); + void run(const Config& config, Context&& context); + void setOnStatusChanged(StatusCallback&& cb) { statusCb = std::move(cb); } diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp index 5fbd45e4..7465a156 100644 --- a/src/dhtrunner.cpp +++ b/src/dhtrunner.cpp @@ -77,7 +77,7 @@ DhtRunner::~DhtRunner() } void -DhtRunner::run(in_port_t port, const DhtRunner::Config& config, Context&& context) +DhtRunner::run(in_port_t port, const Config& config, Context&& context) { SockAddr sin4; sin4.setFamily(AF_INET); @@ -89,7 +89,7 @@ DhtRunner::run(in_port_t port, const DhtRunner::Config& config, Context&& contex } void -DhtRunner::run(const char* ip4, const char* ip6, const char* service, const DhtRunner::Config& config, Context&& context) +DhtRunner::run(const char* ip4, const char* ip6, const char* service, const Config& config, Context&& context) { auto res4 = SockAddr::resolve(ip4, service); auto res6 = SockAddr::resolve(ip6, service); @@ -98,13 +98,22 @@ DhtRunner::run(const char* ip4, const char* ip6, const char* service, const DhtR } void -DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::Config& config, Context&& context) +DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const Config& config, Context&& context) +{ + if (not running) { + if (not context.sock) + context.sock.reset(new net::UdpSocket(local4, local6)); + run(config, std::move(context)); + } +} + +void +DhtRunner::run(const Config& config, Context&& context) { if (running) return; - auto sock = std::unique_ptr<net::UdpSocket>(new net::UdpSocket(local4, local6)); - sock->setOnReceive([&] (std::unique_ptr<net::ReceivedPacket>&& pkt) { + context.sock->setOnReceive([&] (std::unique_ptr<net::ReceivedPacket>&& pkt) { { std::lock_guard<std::mutex> lck(sock_mtx); if (rcv.size() >= RX_QUEUE_MAX_SIZE) { @@ -116,7 +125,7 @@ DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner:: cv.notify_all(); }); - auto dht = std::unique_ptr<DhtInterface>(new Dht(std::move(sock), SecureDht::getConfig(config.dht_config))); + auto dht = std::unique_ptr<DhtInterface>(new Dht(std::move(context.sock), SecureDht::getConfig(config.dht_config))); dht_ = std::unique_ptr<SecureDht>(new SecureDht(std::move(dht), config.dht_config)); #ifdef OPENDHT_PROXY_CLIENT -- GitLab