]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
SVCB: make autohints more generic
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 22 Mar 2021 18:44:21 +0000 (19:44 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 29 Mar 2021 17:10:32 +0000 (19:10 +0200)
pdns/packethandler.cc
pdns/packethandler.hh

index 00f8900b1c50210886831a10bc10a6be245b748b..4ab8b8c0f21a7b768ea74bab9d6a884d46def9e9 100644 (file)
@@ -528,13 +528,7 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPack
     auto rrc = getRR<SVCBBaseRecordContent>(rec->dr);
     DNSName target = rrc->getTarget().isRoot() ? rec->dr.d_name : rrc->getTarget();
     if (rrc->autoHint(SvcParam::ipv4hint)) {
-      B.lookup(QType::A, target, d_sd.domain_id);
-      vector<ComboAddress> hints;
-      DNSZoneRecord rr;
-      while (B.get(rr)) {
-        auto arrc = getRR<ARecordContent>(rr.dr);
-        hints.push_back(arrc->getCA());
-      }
+      auto hints = getIPAddressFor(target, QType::A);
       if (hints.size() == 0) {
         rrc->removeParam(SvcParam::ipv4hint);
       } else {
@@ -543,13 +537,7 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPack
     }
 
     if (rrc->autoHint(SvcParam::ipv6hint)) {
-      B.lookup(QType::AAAA, target, d_sd.domain_id);
-      vector<ComboAddress> hints;
-      DNSZoneRecord rr;
-      while (B.get(rr)) {
-        auto arrc = getRR<AAAARecordContent>(rr.dr);
-        hints.push_back(arrc->getCA());
-      }
+      auto hints = getIPAddressFor(target, QType::AAAA);
       if (hints.size() == 0) {
         rrc->removeParam(SvcParam::ipv6hint);
       } else {
@@ -570,6 +558,24 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPack
   }
 }
 
+vector<ComboAddress> PacketHandler::getIPAddressFor(const DNSName &target, const uint16_t qtype) {
+  vector<ComboAddress> ret;
+  if (qtype != QType::A && qtype != QType::AAAA) {
+    return ret;
+  }
+  B.lookup(qtype, target, d_sd.domain_id);
+  DNSZoneRecord rr;
+  while (B.get(rr)) {
+    if (qtype == QType::AAAA) {
+      auto aaaarrc = getRR<AAAARecordContent>(rr.dr);
+      ret.push_back(aaaarrc->getCA());
+    } else if (qtype == QType::A) {
+      auto arrc = getRR<ARecordContent>(rr.dr);
+      ret.push_back(arrc->getCA());
+    }
+  }
+  return ret;
+}
 
 void PacketHandler::emitNSEC(std::unique_ptr<DNSPacket>& r, const DNSName& name, const DNSName& next, int mode)
 {
index f4911b8f58c0883c74ec75f7745cc12bd0bd665e..1df16962e03023fd987ffa9624838e643b8f855e 100644 (file)
@@ -77,6 +77,8 @@ private:
   bool addNSEC3PARAM(const DNSPacket& p, std::unique_ptr<DNSPacket>& r);
   void doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPacket>& r);
   DNSName doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr<DNSPacket>& r);
+  //! Get all IPv4 or IPv6 addresses (based on |qtype|) for |target|.
+  vector<ComboAddress> getIPAddressFor(const DNSName &target, const uint16_t qtype);
   void addNSECX(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const DNSName &target, const DNSName &wildcard, int mode);
   void addNSEC(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const DNSName &target, const DNSName &wildcard, int mode);
   bool getNSEC3Hashes(bool narrow, const std::string& hashed, bool decrement, DNSName& unhashed, std::string& before, std::string& after, int mode=0);