]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
chore(dnsdist): move handleResponseTC4UDPClient to dnsdist::udp
authorPieter Lexis <pieter.lexis@powerdns.com>
Thu, 23 Oct 2025 08:22:23 +0000 (10:22 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 1 Jun 2026 10:52:27 +0000 (12:52 +0200)
pdns/dnsdistdist/dnsdist-udp.cc
pdns/dnsdistdist/dnsdist-udp.hh
pdns/dnsdistdist/dnsdist.cc

index 02dc7d13c8a8047f78abc37898f63a96cc10f002..e119033a96f690777be5267a93f1452018d59371 100644 (file)
@@ -152,4 +152,21 @@ void truncateTC(PacketBuffer& packet, size_t maximumSize, unsigned int qnameWire
     ++dnsdist::metrics::g_stats.truncFail;
   }
 }
+
+void handleResponseTC4UDPClient(DNSQuestion& dnsQuestion, uint16_t udpPayloadSize, PacketBuffer& response)
+{
+  if (udpPayloadSize != 0 && response.size() > udpPayloadSize) {
+    VERBOSESLOG(infolog("Got a response of size %d while the initial UDP payload size was %d, truncating", response.size(), udpPayloadSize),
+                dnsQuestion.getLogger()->withName("udp-response")->info(Logr::Info, "Got a UDP response larger than the initial UDP payload size, truncating", "dns.response.size", Logging::Loggable(response.size()), "dns.query.udp_payload_size", Logging::Loggable(udpPayloadSize)));
+
+    truncateTC(dnsQuestion.getMutableData(), dnsQuestion.getMaximumSize(), dnsQuestion.ids.qname.wirelength(), dnsdist::configuration::getCurrentRuntimeConfiguration().d_addEDNSToSelfGeneratedResponses);
+    dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [](dnsheader& header) {
+      header.tc = true;
+      return true;
+    });
+  }
+  else if (dnsdist::configuration::getCurrentRuntimeConfiguration().d_truncateTC && dnsQuestion.getHeader()->tc) {
+    truncateTC(response, dnsQuestion.getMaximumSize(), dnsQuestion.ids.qname.wirelength(), dnsdist::configuration::getCurrentRuntimeConfiguration().d_addEDNSToSelfGeneratedResponses);
+  }
+}
 } // namespace dnsdist::udp
index 0c856f83c1d491591857535de42eaf84f237b305..eb108ce927b3c1db24cbdb74cd4fe2233feb9541 100644 (file)
@@ -29,6 +29,7 @@
 #include "noinitvector.hh"
 #include "iputils.hh"
 #include "dnscrypt.hh"
+#include "dnsdist.hh"
 
 #include "dnsdist-logging.hh"
 
@@ -49,4 +50,5 @@ static_assert(s_initialUDPPacketBufferSize <= std::numeric_limits<uint16_t>::max
 
 void sendfromto(int sock, const PacketBuffer& buffer, const ComboAddress& from, const ComboAddress& dest);
 void truncateTC(PacketBuffer& packet, size_t maximumSize, unsigned int qnameWireLength, bool addEDNSToSelfGeneratedResponses);
+void handleResponseTC4UDPClient(DNSQuestion& dnsQuestion, uint16_t udpPayloadSize, PacketBuffer& response);
 } // namespace dnsdist::udp
index 8ccf74639c789d50023a0950670aa9090e634ae6..b628cf21c57d2281b9811a9d0e3812b435f3a91e 100644 (file)
@@ -551,28 +551,11 @@ void handleResponseSent(DNSName&& qname, const QType& qtype, double latencyUs, c
   dnsdist::metrics::doLatencyStats(incomingProtocol, latencyUs);
 }
 
-static void handleResponseTC4UDPClient(DNSQuestion& dnsQuestion, uint16_t udpPayloadSize, PacketBuffer& response)
-{
-  if (udpPayloadSize != 0 && response.size() > udpPayloadSize) {
-    VERBOSESLOG(infolog("Got a response of size %d while the initial UDP payload size was %d, truncating", response.size(), udpPayloadSize),
-                dnsQuestion.getLogger()->withName("udp-response")->info(Logr::Info, "Got a UDP response larger than the initial UDP payload size, truncating", "dns.response.size", Logging::Loggable(response.size()), "dns.query.udp_payload_size", Logging::Loggable(udpPayloadSize)));
-
-    dnsdist::udp::truncateTC(dnsQuestion.getMutableData(), dnsQuestion.getMaximumSize(), dnsQuestion.ids.qname.wirelength(), dnsdist::configuration::getCurrentRuntimeConfiguration().d_addEDNSToSelfGeneratedResponses);
-    dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [](dnsheader& header) {
-      header.tc = true;
-      return true;
-    });
-  }
-  else if (dnsdist::configuration::getCurrentRuntimeConfiguration().d_truncateTC && dnsQuestion.getHeader()->tc) {
-    dnsdist::udp::truncateTC(response, dnsQuestion.getMaximumSize(), dnsQuestion.ids.qname.wirelength(), dnsdist::configuration::getCurrentRuntimeConfiguration().d_addEDNSToSelfGeneratedResponses);
-  }
-}
-
 static void handleResponseForUDPClient(InternalQueryState& ids, PacketBuffer& response, const std::shared_ptr<DownstreamState>& backend, bool isAsync, bool selfGenerated)
 {
   DNSResponse dnsResponse(ids, response, backend);
 
-  handleResponseTC4UDPClient(dnsResponse, ids.udpPayloadSize, response);
+  dnsdist::udp::handleResponseTC4UDPClient(dnsResponse, ids.udpPayloadSize, response);
 
   /* when the answer is encrypted in place, we need to get a copy
      of the original header before encryption to fill the ring buffer */
@@ -1937,7 +1920,7 @@ static void processUDPQuery(ClientState& clientState, const struct msghdr* msgh,
     const auto dnsHeader = dnsQuestion.getHeader();
     if (result == ProcessQueryResult::SendAnswer) {
       /* ensure payload size is not exceeded */
-      handleResponseTC4UDPClient(dnsQuestion, udpPayloadSize, query);
+      dnsdist::udp::handleResponseTC4UDPClient(dnsQuestion, udpPayloadSize, query);
 #ifndef DISABLE_RECVMMSG
 #if defined(HAVE_RECVMMSG) && defined(HAVE_SENDMMSG) && defined(MSG_WAITFORONE)
       if (dnsQuestion.ids.delayMsec == 0 && responsesVect != nullptr) {