]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a Lua FFI helper to generate proxy protocol payloads
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 5 Nov 2021 08:45:42 +0000 (09:45 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 15 Dec 2021 14:10:30 +0000 (15:10 +0100)
pdns/dnsdistdist/dnsdist-lua-ffi-interface.h
pdns/dnsdistdist/dnsdist-lua-ffi.cc

index 1dcdfab9e8f857923fe25ee4b5f695ebab10aff4..7e7dec45b1aadfbfd7b89db1748bd2d398a5fde8 100644 (file)
@@ -128,3 +128,11 @@ double dnsdist_ffi_server_get_latency(const dnsdist_ffi_server_t* server) __attr
 void dnsdist_ffi_dnsresponse_set_min_ttl(dnsdist_ffi_dnsresponse_t* dr, uint32_t min) __attribute__ ((visibility ("default")));
 void dnsdist_ffi_dnsresponse_set_max_ttl(dnsdist_ffi_dnsresponse_t* dr, uint32_t max) __attribute__ ((visibility ("default")));
 void dnsdist_ffi_dnsresponse_limit_ttl(dnsdist_ffi_dnsresponse_t* dr, uint32_t min, uint32_t max) __attribute__ ((visibility ("default")));
+
+typedef struct dnsdist_ffi_proxy_protocol_value {
+  char* value;
+  uint16_t size;
+  uint8_t type;
+} 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")));
index ac6676c586a28bc1ffd0ec412e6c42bf98bc58ab..3e455b3baae0462e811a5b5b74502581627b9d09 100644 (file)
@@ -598,3 +598,33 @@ void setupLuaFFIPerThreadContext(LuaContext& luaCtx)
   luaCtx.executeCode(getLuaFFIWrappers());
 #endif
 }
+
+size_t dnsdist_ffi_generate_proxy_protocol_payload(const size_t addrSize, const void* srcAddr, const void* dstAddr, const uint16_t srcPort, const uint16_t dstPort, const bool tcp, const size_t valuesCount, const dnsdist_ffi_proxy_protocol_value* values, void* out, const size_t outSize)
+{
+  ComboAddress src, dst;
+  if (addrSize != sizeof(src.sin4.sin_addr) && addrSize != sizeof(src.sin6.sin6_addr.s6_addr)) {
+    return 0;
+  }
+
+  src = makeComboAddressFromRaw(addrSize == sizeof(src.sin4.sin_addr) ? 4 : 6, reinterpret_cast<const char*>(srcAddr), addrSize);
+  src.sin4.sin_port = htons(srcPort);
+  dst = makeComboAddressFromRaw(addrSize == sizeof(dst.sin4.sin_addr) ? 4 : 6, reinterpret_cast<const char*>(dstAddr), addrSize);
+  dst.sin4.sin_port = htons(dstPort);
+
+  std::vector<ProxyProtocolValue> 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(tcp, src, dst, valuesVect);
+  if (payload.size() > outSize) {
+    return 0;
+  }
+
+  memcpy(out, payload.c_str(), payload.size());
+
+  return payload.size();
+}