From: Bert Hubert Date: Sun, 10 Feb 2008 20:09:25 +0000 (+0000) Subject: make us use magic 'ADDR' queries if configured to do IPv6 outgoing queries. ADDR... X-Git-Tag: rec-3.1.7.1~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae4d8cf1af033aab4893ce6e3433ab27c7ea2d02;p=thirdparty%2Fpdns.git make us use magic 'ADDR' queries if configured to do IPv6 outgoing queries. ADDR queries ultimately get turned into ANY queries! git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1139 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/syncres.cc b/pdns/syncres.cc index bfdd27559a..6d55ca38c2 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -1,6 +1,6 @@ /* PowerDNS Versatile Database Driven Nameserver - Copyright (C) 2003 - 2007 PowerDNS.COM BV + Copyright (C) 2003 - 2008 PowerDNS.COM BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published @@ -267,35 +267,24 @@ vector SyncRes::getAs(const string &qname, int depth, set ret_t; ret_t ret; - if(!doResolve(qname,QType(QType::A), res,depth+1,beenthere) && !res.empty()) { + if(!doResolve(qname, s_doIPv6 ? QType(QType::ADDR) : QType(QType::A), res,depth+1,beenthere) && !res.empty()) { // this consults cache, OR goes out for(res_t::const_iterator i=res.begin(); i!= res.end(); ++i) { - if(i->qtype.getCode()==QType::A) { + if(i->qtype.getCode()==QType::A || i->qtype.getCode()==QType::AAAA) { ret.push_back(ComboAddress(i->content, 53)); } } } - - if(s_doIPv6) { - typedef set ipv6_t; - ipv6_t ipv6; - if(RC.get(d_now.tv_sec, qname, QType(QType::AAAA), &ipv6) > 0) { - for(ipv6_t::const_iterator i=ipv6.begin(); i != ipv6.end(); ++i) - ret.push_back(ComboAddress(i->content, 53)); - } - } if(ret.size() > 1) { random_shuffle(ret.begin(), ret.end()); - // move 'best' address up front - nsspeeds_t::iterator best=s_nsSpeeds.find(qname); + // move 'best' address for this nameserver name up front + nsspeeds_t::iterator best = s_nsSpeeds.find(qname); if(best != s_nsSpeeds.end()) - for(ret_t::iterator i=ret.begin(); i != ret.end(); ++i) { - // cerr<<"Is "<toString()<<" equal to "<second.d_best.toString()<<"?\n"; - if(*i==best->second.d_best) { + for(ret_t::iterator i=ret.begin(); i != ret.end(); ++i) { + if(*i==best->second.d_best) { // got the fastest one if(i!=ret.begin()) { - // cerr<<"Moving "<second.d_best.toString()<<" up front!\n"; *i=*ret.begin(); *ret.begin()=best->second.d_best; } @@ -323,17 +312,18 @@ void SyncRes::getBestNSFromCache(const string &qname, set&bes if(RC.get(d_now.tv_sec, subdomain, QType(QType::NS), &ns) > 0) { for(set::const_iterator k=ns.begin();k!=ns.end();++k) { if(k->ttl > (unsigned int)d_now.tv_sec ) { - setaset; + set aset; DNSResourceRecord rr=*k; rr.content=k->content; - if(!dottedEndsOn(rr.content, subdomain) || RC.get(d_now.tv_sec, rr.content, QType(QType::A), s_log ? &aset : 0) > 5) { + if(!dottedEndsOn(rr.content, subdomain) || RC.get(d_now.tv_sec, rr.content, s_doIPv6 ? QType(QType::ADDR) : QType(QType::A), + s_log ? &aset : 0) > 5) { bestns.insert(rr); LOG< '"< nameservers, string auth, s_tcpoutqueries++; d_tcpoutqueries++; } - resolveret=asyncresolve(*remoteIP, qname, qtype.getCode(), doTCP, d_doEDNS0, &d_now, &lwr); // <- we go out on the wire! + resolveret=asyncresolve(*remoteIP, qname, + (qtype.getCode() == QType::ADDR ? QType::ANY : qtype.getCode()), + doTCP, d_doEDNS0, &d_now, &lwr); // <- we go out on the wire! if(resolveret != 1) { if(resolveret==0) { LOG< nameservers, string auth, s_outgoingtimeouts++; } else if(resolveret==-2) { - LOG< nameservers, string auth, } // for ANY answers we *must* have an authoritive answer else if(i->d_place==DNSResourceRecord::ANSWER && !Utility::strcasecmp(i->qname.c_str(),qname.c_str()) && - ( (i->qtype==qtype) || - ( qtype==QType(QType::ANY) && lwr.d_aabit))) { - + (i->qtype==qtype || + ( + lwr.d_aabit && + ( qtype == QType(QType::ADDR) && (i->qtype.getCode()==QType::A || i->qtype.getCode()==QType::AAAA) ) || qtype==QType(QType::ANY) + ) + ) + ) { + LOG<content<<"|"<qtype.getName()<<"'"<& ret) host=string(k->content.c_str() + fields[3].first, fields[3].second - fields[3].first); else continue; - doResolve(host, QType(QType::A), addit, 1, beenthere); - if(*l_doIPv6AP) - doResolve(host, QType(QType::AAAA), addit, 1, beenthere); + doResolve(host, *l_doIPv6AP ? QType(QType::ADDR) : QType(QType::A), addit, 1, beenthere); } sort(addit.begin(), addit.end());