]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add FFI accessors for MAC, incoming protocol
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 21 Dec 2021 17:01:35 +0000 (18:01 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 14 Jan 2022 09:22:48 +0000 (10:22 +0100)
pdns/dnsdistdist/dnsdist-lua-ffi-interface.h
pdns/dnsdistdist/dnsdist-lua-ffi.cc

index 151804a65291795d4e24df255f0a1dcaace1a175..e4fbdd840d0e1181f5ce1c64e7d27b0ff024dfe9 100644 (file)
@@ -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")));
index 3717658885b37147bf2631854b71b4117de95aa3..54c51d0e203ecc3cc2ecb28ab3131d3f9e3f7f62 100644 (file)
@@ -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;