Parcourir la source

enable forward mode again

only do recursive if forward_addresses (variable upstream_ in the code)
is empty
Jelte Jansen il y a 14 ans
Parent
commit
ee96cc0479
2 fichiers modifiés avec 29 ajouts et 16 suppressions
  1. 4 8
      src/bin/resolver/resolver.cc
  2. 25 8
      src/lib/asiolink/asiolink.cc

+ 4 - 8
src/bin/resolver/resolver.cc

@@ -91,17 +91,16 @@ public:
         queryShutdown();
         upstream_ = upstream;
         if (dnss) {
-            if (upstream_.empty()) {
-                dlog("Asked to do full recursive, but not implemented yet. "
-                    "I'll do nothing.");
-            } else {
+            if (!upstream_.empty()) {
                 dlog("Setting forward addresses:");
                 BOOST_FOREACH(const addr_t& address, upstream) {
                     dlog(" " + address.first + ":" +
                         boost::lexical_cast<string>(address.second));
                 }
-                querySetup(*dnss);
+            } else {
+                dlog("No forward addresses, running in recursive mode");
             }
+            querySetup(*dnss);
         }
     }
 
@@ -237,15 +236,12 @@ public:
         const bool rd = query_message->getHeaderFlag(Message::HEADERFLAG_RD);
         const bool cd = query_message->getHeaderFlag(Message::HEADERFLAG_CD);
         const Opcode& opcode = query_message->getOpcode();
-        const Rcode& rcode = query_message->getRcode();
         vector<QuestionPtr> questions;
         questions.assign(query_message->beginQuestion(), query_message->endQuestion());
 
         // Fill in the final details of the answer message
-        //message->clear(Message::RENDER);
         answer_message->setQid(qid);
         answer_message->setOpcode(opcode);
-        answer_message->setRcode(rcode);
 
         answer_message->setHeaderFlag(Message::HEADERFLAG_QR);
         answer_message->setHeaderFlag(Message::HEADERFLAG_RA);

+ 25 - 8
src/lib/asiolink/asiolink.cc

@@ -375,10 +375,20 @@ private:
 
     // (re)send the query to the server.
     void send() {
-        const int uc = zone_servers_.size();
+        const int uc = upstream_->size();
+        const int zs = zone_servers_.size();
         if (uc > 0) {
             int serverIndex = rand() % uc;
             dlog("Sending upstream query (" + question_.toText() +
+                ") to " + upstream_->at(serverIndex).first);
+            UDPQuery query(io_, question_,
+                upstream_->at(serverIndex).first,
+                upstream_->at(serverIndex).second, buffer_, this,
+                timeout_);
+            io_.post(query);
+        } else if (zs > 0) {
+            int serverIndex = rand() % zs;
+            dlog("Sending query to zone server (" + question_.toText() +
                 ") to " + zone_servers_.at(serverIndex).first);
             UDPQuery query(io_, question_,
                 zone_servers_.at(serverIndex).first,
@@ -409,7 +419,9 @@ public:
 
         dlog("[XX] zone_servers size: " + zone_servers_.size());
         // hardcoded f.root-servers.net now, should use NSAS
-        zone_servers_.push_back(addr_t("192.5.5.241", 53));
+        if (upstream_->empty()) {
+            zone_servers_.push_back(addr_t("192.5.5.241", 53));
+        }
         send();
     }
 
@@ -417,11 +429,7 @@ public:
     virtual void operator()(UDPQuery::Result result) {
         dlog("[XX] RunningQuery operator() called with result: " + result);
         // XXX is this the place for TCP retry?
-        if (result == UDPQuery::TIME_OUT && retries_ --) {
-            dlog("Resending query");
-            // We timed out, but we have some retries, so send again
-            send();
-        } else {
+        if (result != UDPQuery::TIME_OUT) {
             // we got an answer
             std::cout << "[XX] for question: " << question_.toText() << std::endl;
             Message incoming(Message::PARSE);
@@ -429,7 +437,8 @@ public:
             incoming.fromWire(ibuf);
             std::cout << "[XX] received answer: " << incoming.toText() << std::endl;
 
-            if (incoming.getRcode() == Rcode::NOERROR()) {
+            if (upstream_->size() == 0 &&
+                incoming.getRcode() == Rcode::NOERROR()) {
                 if (incoming.getRRCount(Message::SECTION_ANSWER) > 0) {
                     dlog("[XX] this looks like the final result");
                     copyAnswerMessage(incoming, answer_message_);
@@ -491,6 +500,14 @@ public:
                 server_->resume(result == UDPQuery::SUCCESS);
                 delete this;
             }
+        } else if (retries_--) {
+            dlog("Resending query");
+            // We timed out, but we have some retries, so send again
+            send();
+        } else {
+            // out of retries, give up for now
+            server_->resume(false);
+            delete this;
         }
     }
 };