From: Pieter Lexis Date: Mon, 22 Mar 2021 18:44:21 +0000 (+0100) Subject: SVCB: make autohints more generic X-Git-Tag: dnsdist-1.6.0-rc1~33^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a1b8d0871e92c826f4abbd01b0b2009e59bd22a;p=thirdparty%2Fpdns.git SVCB: make autohints more generic --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 00f8900b1c..4ab8b8c0f2 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -528,13 +528,7 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr(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 hints; - DNSZoneRecord rr; - while (B.get(rr)) { - auto arrc = getRR(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_ptrautoHint(SvcParam::ipv6hint)) { - B.lookup(QType::AAAA, target, d_sd.domain_id); - vector hints; - DNSZoneRecord rr; - while (B.get(rr)) { - auto arrc = getRR(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 PacketHandler::getIPAddressFor(const DNSName &target, const uint16_t qtype) { + vector 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(rr.dr); + ret.push_back(aaaarrc->getCA()); + } else if (qtype == QType::A) { + auto arrc = getRR(rr.dr); + ret.push_back(arrc->getCA()); + } + } + return ret; +} void PacketHandler::emitNSEC(std::unique_ptr& r, const DNSName& name, const DNSName& next, int mode) { diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh index f4911b8f58..1df16962e0 100644 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -77,6 +77,8 @@ private: bool addNSEC3PARAM(const DNSPacket& p, std::unique_ptr& r); void doAdditionalProcessing(DNSPacket& p, std::unique_ptr& r); DNSName doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr& r); + //! Get all IPv4 or IPv6 addresses (based on |qtype|) for |target|. + vector getIPAddressFor(const DNSName &target, const uint16_t qtype); void addNSECX(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, int mode); void addNSEC(DNSPacket& p, std::unique_ptr& 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);