From: Remi Gacogne Date: Thu, 23 Jun 2022 16:08:38 +0000 (+0200) Subject: dnsdist: FFI interface for the Lua network endpoint X-Git-Tag: dnsdist-1.8.0-rc1~86^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce5e6db489117f3911ec7ce681f4fdc78d5123aa;p=thirdparty%2Fpdns.git dnsdist: FFI interface for the Lua network endpoint --- diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc index e66a13986a..62dce3ba11 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc @@ -22,6 +22,7 @@ #include "dnsdist.hh" #include "dnsdist-async.hh" #include "dnsdist-lua.hh" +#include "dnsdist-lua-ffi.hh" #include "dnsdist-lua-network.hh" #include "dolog.hh" @@ -75,6 +76,22 @@ void setupLuaBindingsNetwork(LuaContext& luaCtx, bool client) }); }); + // if you make the dnsdist_ffi_network_message_t* in the function prototype const, LuaWrapper will stop treating it like a lightuserdata, messing everything up!! + luaCtx.registerFunction::*)(const std::string&, uint16_t, std::function)>("addUnixListeningEndpointFFI", [client](std::shared_ptr& listener, const std::string& path, uint16_t endpointID, std::function cb) { + if (client) { + return false; + } + + return listener->addUnixListeningEndpoint(path, endpointID, [cb](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) { + { + auto lock = g_lua.lock(); + dnsdist_ffi_network_message_t msg(dgram, from, endpoint); + cb(&msg); + } + dnsdist::handleQueuedAsynchronousEvents(); + }); + }); + luaCtx.registerFunction::*)()>("start", [client](std::shared_ptr& listener) { if (client) { return; diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index 533fc5ea3f..01e6400557 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -225,3 +225,10 @@ void dnsdist_ffi_metric_inc(const char* metricName, size_t metricNameLen) __attr void dnsdist_ffi_metric_dec(const char* metricName, size_t metricNameLen) __attribute__ ((visibility ("default"))); void dnsdist_ffi_metric_set(const char* metricName, size_t metricNameLen, double value) __attribute__ ((visibility ("default"))); double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool isCounter) __attribute__ ((visibility ("default"))); + +typedef struct dnsdist_ffi_network_message_t dnsdist_ffi_network_message_t; + +const char* dnsdist_ffi_network_message_get_payload(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default"))); +size_t dnsdist_ffi_network_message_get_payload_size(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default"))); +uint16_t dnsdist_ffi_network_message_get_endpoint_id(const dnsdist_ffi_network_message_t* msg) __attribute__ ((visibility ("default"))); + diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 8bfb877ca6..78b83efeb2 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -1498,3 +1498,27 @@ double dnsdist_ffi_metric_get(const char* metricName, size_t metricNameLen, bool } return 0.; } + +const char* dnsdist_ffi_network_message_get_payload(const dnsdist_ffi_network_message_t* msg) +{ + if (msg != nullptr) { + return msg->payload.c_str(); + } + return nullptr; +} + +size_t dnsdist_ffi_network_message_get_payload_size(const dnsdist_ffi_network_message_t* msg) +{ + if (msg != nullptr) { + return msg->payload.size(); + } + return 0; +} + +uint16_t dnsdist_ffi_network_message_get_endpoint_id(const dnsdist_ffi_network_message_t* msg) +{ + if (msg != nullptr) { + return msg->endpointID; + } + return 0; +} diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.hh b/pdns/dnsdistdist/dnsdist-lua-ffi.hh index b60589de77..d0ed83341d 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.hh +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.hh @@ -128,5 +128,28 @@ struct dnsdist_ffi_servers_list_t const ServerPolicy::NumberedServerVector& servers; }; +// dnsdist_ffi_network_message_t is a lightuserdata +template<> +struct LuaContext::Pusher { + static const int minSize = 1; + static const int maxSize = 1; + + static PushedObject push(lua_State* state, dnsdist_ffi_network_message_t* ptr) noexcept { + lua_pushlightuserdata(state, ptr); + return PushedObject{state, 1}; + } +}; + +struct dnsdist_ffi_network_message_t +{ + dnsdist_ffi_network_message_t(const std::string& payload_ ,const std::string& from_, uint16_t endpointID_): payload(payload_), from(from_), endpointID(endpointID_) + { + } + + const std::string& payload; + const std::string& from; + uint16_t endpointID; +}; + const char* getLuaFFIWrappers(); void setupLuaFFIPerThreadContext(LuaContext& luaCtx);