]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Pass actual (optional) ecs instead of bool to asendto()
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 15 Jan 2025 11:21:07 +0000 (12:21 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 28 May 2025 13:53:52 +0000 (15:53 +0200)
pdns/recursordist/lwres.cc
pdns/recursordist/lwres.hh
pdns/recursordist/pdns_recursor.cc

index 3561d11cfdda5a392753818cef6c595150cd7019..3a230ec40c45405338526c839838676b6ab272be 100644 (file)
@@ -412,16 +412,13 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName&
 
   string ping;
   bool weWantEDNSSubnet = false;
-  uint8_t outgoingECSBits = 0;
-  ComboAddress outgoingECSAddr;
+  std::optional<EDNSSubnetOpts> subnetOpts = std::nullopt;
   if (EDNS0Level > 0) {
     DNSPacketWriter::optvect_t opts;
     if (srcmask) {
-      EDNSSubnetOpts eo;
-      eo.source = *srcmask;
-      outgoingECSBits = srcmask->getBits();
-      outgoingECSAddr = srcmask->getNetwork();
-      opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(eo));
+      subnetOpts = EDNSSubnetOpts{};
+      subnetOpts->source = *srcmask;
+      opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(*subnetOpts));
       weWantEDNSSubnet = true;
     }
 
@@ -467,7 +464,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName&
   if (!doTCP) {
     int queryfd;
 
-    ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, weWantEDNSSubnet, &queryfd);
+    ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, subnetOpts, &queryfd, *now);
 
     if (ret != LWResult::Result::Success) {
       return ret;
@@ -595,7 +592,8 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName&
                  IPv4 and IPv6. Still I'm pretty sure it doesn't matter in real life, so let's not duplicate
                  entries in our cache. */
               if (reso.scope.getBits()) {
-                uint8_t bits = std::min(reso.scope.getBits(), outgoingECSBits);
+                uint8_t bits = std::min(reso.scope.getBits(), subnetOpts->source.getBits());
+                auto outgoingECSAddr = subnetOpts->source.getNetwork();
                 outgoingECSAddr.truncate(bits);
                 srcmask = Netmask(outgoingECSAddr, bits);
               }
index 07a0185a4d3fa6ee876681363b92d5c86e88062c..6379291a029b547f82159687290c203d0088ac7f 100644 (file)
@@ -83,8 +83,10 @@ public:
   bool d_haveEDNS{false};
 };
 
+struct EDNSSubnetOpts;
+
 LWResult::Result asendto(const void* data, size_t len, int flags, const ComboAddress& toAddress, uint16_t qid,
-                         const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc);
+                         const DNSName& domain, uint16_t qtype, const std::optional<EDNSSubnetOpts>& ecs, int* fileDesc, timeval& now);
 LWResult::Result arecvfrom(PacketBuffer& packet, int flags, const ComboAddress& fromAddr, size_t& len, uint16_t qid,
                            const DNSName& domain, uint16_t qtype, int fileDesc, const struct timeval& now);
 
index d5fdf08248695188c468fc10411e73fe149cef4d..7c80fd3a75c754e965d92199eb835b07490914f2 100644 (file)
@@ -269,7 +269,7 @@ thread_local std::unique_ptr<UDPClientSocks> t_udpclientsocks;
 
 /* these two functions are used by LWRes */
 LWResult::Result asendto(const void* data, size_t len, int /* flags */,
-                         const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc)
+                         const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, const std::optional<EDNSSubnetOpts>& ecs, int* fileDesc, timeval& now)
 {
 
   auto pident = std::make_shared<PacketID>();