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 {
}
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 {
}
}
+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)
{
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);