From: Remi Gacogne Date: Tue, 21 Dec 2021 17:01:35 +0000 (+0100) Subject: dnsdist: Add FFI accessors for MAC, incoming protocol X-Git-Tag: auth-4.7.0-alpha1~31^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7aef06492a015c7d53169c8dbf3d52198c83454;p=thirdparty%2Fpdns.git dnsdist: Add FFI accessors for MAC, incoming protocol --- diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index 151804a652..e4fbdd840d 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -49,6 +49,15 @@ typedef struct dnsdist_ffi_raw_value { uint16_t size; } dnsdist_ffi_raw_value_t; +typedef enum { + dnsdist_ffi_protocol_type_doudp = 0, + dnsdist_ffi_protocol_type_dotcp = 1, + dnsdist_ffi_protocol_type_dnscryptudp = 2, + dnsdist_ffi_protocol_type_dnscrypttcp = 3, + dnsdist_ffi_protocol_type_dot = 4, + dnsdist_ffi_protocol_type_doh = 5, +} dnsdist_ffi_protocol_type; + void dnsdist_ffi_dnsquestion_get_localaddr(const dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize) __attribute__ ((visibility ("default"))); uint16_t dnsdist_ffi_dnsquestion_get_local_port(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); void dnsdist_ffi_dnsquestion_get_remoteaddr(const dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize) __attribute__ ((visibility ("default"))); @@ -65,6 +74,7 @@ size_t dnsdist_ffi_dnsquestion_get_size(const dnsdist_ffi_dnsquestion_t* dq) __a bool dnsdist_ffi_dnsquestion_set_size(dnsdist_ffi_dnsquestion_t* dq, size_t newSize) __attribute__ ((visibility ("default"))); uint8_t dnsdist_ffi_dnsquestion_get_opcode(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); bool dnsdist_ffi_dnsquestion_get_tcp(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); +dnsdist_ffi_protocol_type dnsdist_ffi_dnsquestion_get_protocol(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); bool dnsdist_ffi_dnsquestion_get_skip_cache(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); bool dnsdist_ffi_dnsquestion_get_use_ecs(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); bool dnsdist_ffi_dnsquestion_get_add_xpf(const dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); @@ -79,6 +89,7 @@ const char* dnsdist_ffi_dnsquestion_get_http_path(dnsdist_ffi_dnsquestion_t* dq) const char* dnsdist_ffi_dnsquestion_get_http_query_string(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); const char* dnsdist_ffi_dnsquestion_get_http_host(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); const char* dnsdist_ffi_dnsquestion_get_http_scheme(dnsdist_ffi_dnsquestion_t* dq) __attribute__ ((visibility ("default"))); +size_t dnsdist_ffi_dnsquestion_get_mac_addr(const dnsdist_ffi_dnsquestion_t* dq, void* buffer, size_t bufferSize) __attribute__ ((visibility ("default"))); // returns the length of the resulting 'out' array. 'out' is not set if the length is 0 size_t dnsdist_ffi_dnsquestion_get_edns_options(dnsdist_ffi_dnsquestion_t* ref, const dnsdist_ffi_ednsoption_t** out) __attribute__ ((visibility ("default"))); diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 3717658885..54c51d0e20 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -57,6 +57,22 @@ void dnsdist_ffi_dnsquestion_get_remoteaddr(const dnsdist_ffi_dnsquestion_t* dq, dnsdist_ffi_comboaddress_to_raw(*dq->dq->remote, addr, addrSize); } +size_t dnsdist_ffi_dnsquestion_get_mac_addr(const dnsdist_ffi_dnsquestion_t* dq, void* buffer, size_t bufferSize) +{ + if (dq == nullptr) { + return 0; + } + std::string mac = getMACAddress(*dq->dq->remote); + if (mac.empty()) { + return 0; + } + if (mac.size() > bufferSize) { + return bufferSize; + } + memcpy(buffer, mac.data(), mac.size()); + return mac.size(); +} + void dnsdist_ffi_dnsquestion_get_masked_remoteaddr(dnsdist_ffi_dnsquestion_t* dq, const void** addr, size_t* addrSize, uint8_t bits) { dq->maskedRemote = Netmask(*dq->dq->remote, bits).getMaskedNetwork(); @@ -126,6 +142,32 @@ bool dnsdist_ffi_dnsquestion_get_tcp(const dnsdist_ffi_dnsquestion_t* dq) return dq->dq->overTCP(); } +dnsdist_ffi_protocol_type dnsdist_ffi_dnsquestion_get_protocol(const dnsdist_ffi_dnsquestion_t* dq) +{ + if (dq != nullptr) { + auto proto = dq->dq->getProtocol(); + if (proto == dnsdist::Protocol::DoUDP) { + return dnsdist_ffi_protocol_type_doudp; + } + else if (proto == dnsdist::Protocol::DoTCP) { + return dnsdist_ffi_protocol_type_dotcp; + } + else if (proto == dnsdist::Protocol::DNSCryptUDP) { + return dnsdist_ffi_protocol_type_dnscryptudp; + } + else if (proto == dnsdist::Protocol::DNSCryptTCP) { + return dnsdist_ffi_protocol_type_dnscrypttcp; + } + else if (proto == dnsdist::Protocol::DoT) { + return dnsdist_ffi_protocol_type_dot; + } + else if (proto == dnsdist::Protocol::DoH) { + return dnsdist_ffi_protocol_type_doh; + } + } + return dnsdist_ffi_protocol_type_doudp; +} + bool dnsdist_ffi_dnsquestion_get_skip_cache(const dnsdist_ffi_dnsquestion_t* dq) { return dq->dq->skipCache;