]> 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 11:03:52 +0000 (13:03 +0200)
pdns/recursordist/lwres.cc
pdns/recursordist/lwres.hh
pdns/recursordist/pdns_recursor.cc

index 8cbf8a853fa1cba4a6ef8d90a3fe3ff42ed309ca..463f99644e07eadfbd0bb26ccf407d4e3200394a 100644 (file)
@@ -423,16 +423,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;
     }
 
@@ -478,7 +475,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, *now);
+    ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, subnetOpts, &queryfd, *now);
 
     if (ret != LWResult::Result::Success) {
       return ret;
@@ -612,7 +609,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 58d43535e32c5e9540a991731a31c12ce82ec653..807157309f3ab099b793a62e839dbb3e4e4452e1 100644 (file)
@@ -86,8 +86,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, timeval& now);
+                         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 3aed8c4fcdb86d8deb162ea1f1911db0fd6e464d..c5dd5cc90819612ba0e3ca620def7a393d8cebe8 100644 (file)
@@ -283,7 +283,7 @@ unsigned int authWaitTimeMSec(const std::unique_ptr<MT_t>& mtasker)
 
 /* 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, timeval& now)
+                         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>();