From: Remi Gacogne Date: Thu, 12 Sep 2024 15:42:08 +0000 (+0200) Subject: dnsdist: Add a FFI accessor to incoming proxy protocol values X-Git-Tag: rec-5.2.0-alpha1~55^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b546bc866551dfb1d0099b32d72826d76dc3a168;p=thirdparty%2Fpdns.git dnsdist: Add a FFI accessor to incoming proxy protocol values --- diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index da6197891c..5f49161466 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -180,6 +180,8 @@ typedef struct dnsdist_ffi_proxy_protocol_value { 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) __attribute__ ((visibility ("default"))); bool dnsdist_ffi_dnsquestion_add_proxy_protocol_values(dnsdist_ffi_dnsquestion_t* dnsQuestion, const size_t valuesCount, const dnsdist_ffi_proxy_protocol_value_t* values) __attribute__ ((visibility ("default"))); +// returns the length of the resulting 'out' array. 'out' is not set if the length is 0. Note that the return value will get invalidated as soon as a new value is added via dnsdist_ffi_dnsquestion_add_proxy_protocol_values(). +size_t dnsdist_ffi_dnsquestion_get_proxy_protocol_values(dnsdist_ffi_dnsquestion_t* dnsQuestion, const dnsdist_ffi_proxy_protocol_value_t** out) __attribute__((visibility("default"))); typedef struct dnsdist_ffi_domain_list_t dnsdist_ffi_domain_list_t; typedef struct dnsdist_ffi_address_list_t dnsdist_ffi_address_list_t; diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index b54a069010..49d7b47e55 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -1119,6 +1119,27 @@ bool dnsdist_ffi_dnsquestion_add_proxy_protocol_values(dnsdist_ffi_dnsquestion_t return true; } +size_t dnsdist_ffi_dnsquestion_get_proxy_protocol_values(dnsdist_ffi_dnsquestion_t* dnsQuestion, const dnsdist_ffi_proxy_protocol_value_t** out) +{ + size_t count = 0; + if (dnsQuestion == nullptr || dnsQuestion->dq == nullptr || out == nullptr || !dnsQuestion->dq->proxyProtocolValues) { + return count; + } + + dnsQuestion->proxyProtocolValuesVect = std::make_unique>(dnsQuestion->dq->proxyProtocolValues->size()); + for (size_t counter = 0; counter < dnsQuestion->dq->proxyProtocolValues->size(); ++counter) { + const auto& entry = dnsQuestion->dq->proxyProtocolValues->at(counter); + auto& targetEntry = dnsQuestion->proxyProtocolValuesVect->at(counter); + targetEntry.size = entry.content.size(); + targetEntry.value = entry.content.data(); + targetEntry.type = entry.type; + ++count; + } + + *out = dnsQuestion->proxyProtocolValuesVect->data(); + return count; +} + struct dnsdist_ffi_domain_list_t { std::vector d_domains; diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.hh b/pdns/dnsdistdist/dnsdist-lua-ffi.hh index d620c24554..1369c2a07c 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.hh +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.hh @@ -58,6 +58,7 @@ struct dnsdist_ffi_dnsquestion_t std::unique_ptr> ednsOptionsVect; std::unique_ptr> httpHeadersVect; std::unique_ptr> tagsVect; + std::unique_ptr> proxyProtocolValuesVect; std::unique_ptr> httpHeaders; };