lokinet/llarp/dns/unbound_resolver.hpp

60 lines
1.2 KiB
C++
Raw Normal View History

#pragma once
#include <unbound.h>
#include <mutex>
#include <atomic>
#include <memory>
#include <queue>
#include <ev/ev.hpp>
#include <util/thread/logic.hpp>
#include <dns/message.hpp>
#ifdef _WIN32
#include <thread>
#endif
namespace llarp::dns
{
2020-06-15 18:22:52 +00:00
using ReplyFunction = std::function<void(SockAddr source, std::vector<byte_t> buf)>;
using FailFunction = std::function<void(SockAddr source, Message msg)>;
class UnboundResolver : public std::enable_shared_from_this<UnboundResolver>
{
2020-06-11 19:36:19 +00:00
private:
ub_ctx* unboundContext;
std::atomic<bool> started;
std::unique_ptr<std::thread> runner;
llarp_ev_loop_ptr eventLoop;
ReplyFunction replyFunc;
FailFunction failFunc;
2020-06-11 19:36:19 +00:00
void
Reset();
2020-06-11 19:36:19 +00:00
public:
UnboundResolver(llarp_ev_loop_ptr eventLoop, ReplyFunction replyFunc, FailFunction failFunc);
2020-06-11 19:36:19 +00:00
static void
Callback(void* data, int err, ub_result* result);
2020-10-29 14:19:45 +00:00
// stop resolver thread
void
Stop();
// upstream resolver IP can be IPv4 or IPv6
2020-06-11 19:36:19 +00:00
bool
Init();
2020-06-11 19:36:19 +00:00
bool
AddUpstreamResolver(const std::string& upstreamResolverIP);
2020-06-11 19:36:19 +00:00
void
Lookup(const SockAddr& source, Message msg);
};
2020-06-11 19:36:19 +00:00
} // namespace llarp::dns