From: Remi Gacogne Date: Thu, 9 Dec 2021 14:07:42 +0000 (+0100) Subject: dnsdist: Add helper to generate a proxy protocol payload from dq X-Git-Tag: auth-4.7.0-alpha1~31^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8648001f8d48ede345e99bc1a890f242515fdfa;p=thirdparty%2Fpdns.git dnsdist: Add helper to generate a proxy protocol payload from dq --- diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index 6f23081ffe..151804a652 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -139,3 +139,4 @@ typedef struct dnsdist_ffi_proxy_protocol_value { } dnsdist_ffi_proxy_protocol_value_t; size_t dnsdist_ffi_generate_proxy_protocol_payload(size_t addrSize, const void* srcAddr, const void* dstAddr, uint16_t srcPort, uint16_t dstPort, bool tcp, size_t valuesCount, const dnsdist_ffi_proxy_protocol_value_t* values, void* out, size_t outSize) __attribute__ ((visibility ("default"))); +size_t dnsdist_ffi_dnsquestion_generate_proxy_protocol_payload(const dnsdist_ffi_dnsquestion_t* dq, const size_t valuesCount, const dnsdist_ffi_proxy_protocol_value_t* values, void* out, const size_t outSize); diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 0dfefb1ffd..3717658885 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -655,3 +655,23 @@ size_t dnsdist_ffi_generate_proxy_protocol_payload(const size_t addrSize, const return 0; } } + +size_t dnsdist_ffi_dnsquestion_generate_proxy_protocol_payload(const dnsdist_ffi_dnsquestion_t* dq, const size_t valuesCount, const dnsdist_ffi_proxy_protocol_value* values, void* out, const size_t outSize) +{ + std::vector valuesVect; + if (valuesCount > 0) { + valuesVect.reserve(valuesCount); + for (size_t idx = 0; idx < valuesCount; idx++) { + valuesVect.push_back({ std::string(values[idx].value, values[idx].size), values[idx].type }); + } + } + + std::string payload = makeProxyHeader(dq->dq->overTCP(), *dq->dq->remote, *dq->dq->local, valuesVect); + if (payload.size() > outSize) { + return 0; + } + + memcpy(out, payload.c_str(), payload.size()); + + return payload.size(); +}