|
@@ -19,12 +19,12 @@
|
|
#include <netinet/in.h>
|
|
#include <netinet/in.h>
|
|
|
|
|
|
#include <algorithm>
|
|
#include <algorithm>
|
|
-#include <iostream>
|
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
#include <asiolink/asiolink.h>
|
|
#include <asiolink/asiolink.h>
|
|
|
|
|
|
#include <boost/foreach.hpp>
|
|
#include <boost/foreach.hpp>
|
|
|
|
+#include <boost/lexical_cast.hpp>
|
|
|
|
|
|
#include <config/ccsession.h>
|
|
#include <config/ccsession.h>
|
|
|
|
|
|
@@ -39,6 +39,8 @@
|
|
#include <dns/message.h>
|
|
#include <dns/message.h>
|
|
#include <dns/messagerenderer.h>
|
|
#include <dns/messagerenderer.h>
|
|
|
|
|
|
|
|
+#include <log/dummylog.h>
|
|
|
|
+
|
|
#include <recurse/recursor.h>
|
|
#include <recurse/recursor.h>
|
|
|
|
|
|
using namespace std;
|
|
using namespace std;
|
|
@@ -47,6 +49,7 @@ using namespace isc;
|
|
using namespace isc::dns;
|
|
using namespace isc::dns;
|
|
using namespace isc::data;
|
|
using namespace isc::data;
|
|
using namespace isc::config;
|
|
using namespace isc::config;
|
|
|
|
+using isc::log::dlog;
|
|
using namespace asiolink;
|
|
using namespace asiolink;
|
|
|
|
|
|
class RecursorImpl {
|
|
class RecursorImpl {
|
|
@@ -56,7 +59,7 @@ private:
|
|
RecursorImpl& operator=(const RecursorImpl& source);
|
|
RecursorImpl& operator=(const RecursorImpl& source);
|
|
public:
|
|
public:
|
|
RecursorImpl(const char& forward) :
|
|
RecursorImpl(const char& forward) :
|
|
- config_session_(NULL), verbose_mode_(false),
|
|
|
|
|
|
+ config_session_(NULL),
|
|
forward_(forward), rec_query_()
|
|
forward_(forward), rec_query_()
|
|
{}
|
|
{}
|
|
|
|
|
|
@@ -65,10 +68,12 @@ public:
|
|
}
|
|
}
|
|
|
|
|
|
void querySetup(DNSService& dnss) {
|
|
void querySetup(DNSService& dnss) {
|
|
|
|
+ dlog("Query setup");
|
|
rec_query_ = new RecursiveQuery(dnss, forward_);
|
|
rec_query_ = new RecursiveQuery(dnss, forward_);
|
|
}
|
|
}
|
|
|
|
|
|
void queryShutdown() {
|
|
void queryShutdown() {
|
|
|
|
+ dlog("Query shutdown");
|
|
if (rec_query_) {
|
|
if (rec_query_) {
|
|
delete rec_query_;
|
|
delete rec_query_;
|
|
}
|
|
}
|
|
@@ -83,7 +88,6 @@ public:
|
|
|
|
|
|
/// These members are public because Recursor accesses them directly.
|
|
/// These members are public because Recursor accesses them directly.
|
|
ModuleCCSession* config_session_;
|
|
ModuleCCSession* config_session_;
|
|
- bool verbose_mode_;
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
/// Address of the forward nameserver
|
|
/// Address of the forward nameserver
|
|
@@ -97,6 +101,8 @@ class QuestionInserter {
|
|
public:
|
|
public:
|
|
QuestionInserter(MessagePtr message) : message_(message) {}
|
|
QuestionInserter(MessagePtr message) : message_(message) {}
|
|
void operator()(const QuestionPtr question) {
|
|
void operator()(const QuestionPtr question) {
|
|
|
|
+ dlog(string("Adding question ") + question->getName().toText() +
|
|
|
|
+ " to message");
|
|
message_->addQuestion(question);
|
|
message_->addQuestion(question);
|
|
}
|
|
}
|
|
MessagePtr message_;
|
|
MessagePtr message_;
|
|
@@ -108,6 +114,7 @@ public:
|
|
message_(message), section_(sect), sign_(sign)
|
|
message_(message), section_(sect), sign_(sign)
|
|
{}
|
|
{}
|
|
void operator()(const RRsetPtr rrset) {
|
|
void operator()(const RRsetPtr rrset) {
|
|
|
|
+ dlog("Adding RRSet to message");
|
|
message_->addRRset(section_, rrset, true);
|
|
message_->addRRset(section_, rrset, true);
|
|
}
|
|
}
|
|
MessagePtr message_;
|
|
MessagePtr message_;
|
|
@@ -117,7 +124,7 @@ public:
|
|
|
|
|
|
void
|
|
void
|
|
makeErrorMessage(MessagePtr message, OutputBufferPtr buffer,
|
|
makeErrorMessage(MessagePtr message, OutputBufferPtr buffer,
|
|
- const Rcode& rcode, const bool verbose_mode)
|
|
|
|
|
|
+ const Rcode& rcode)
|
|
{
|
|
{
|
|
// extract the parameters that should be kept.
|
|
// extract the parameters that should be kept.
|
|
// XXX: with the current implementation, it's not easy to set EDNS0
|
|
// XXX: with the current implementation, it's not easy to set EDNS0
|
|
@@ -150,10 +157,9 @@ makeErrorMessage(MessagePtr message, OutputBufferPtr buffer,
|
|
MessageRenderer renderer(*buffer);
|
|
MessageRenderer renderer(*buffer);
|
|
message->toWire(renderer);
|
|
message->toWire(renderer);
|
|
|
|
|
|
- if (verbose_mode) {
|
|
|
|
- cerr << "[b10-recurse] sending an error response (" <<
|
|
|
|
- renderer.getLength() << " bytes):\n" << message->toText() << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog(string("Sending an error response (") +
|
|
|
|
+ boost::lexical_cast<string>(renderer.getLength()) + " bytes):\n" +
|
|
|
|
+ message->toText());
|
|
}
|
|
}
|
|
|
|
|
|
// This is a derived class of \c DNSLookup, to serve as a
|
|
// This is a derived class of \c DNSLookup, to serve as a
|
|
@@ -247,11 +253,9 @@ public:
|
|
|
|
|
|
message->toWire(renderer);
|
|
message->toWire(renderer);
|
|
|
|
|
|
- if (server_->getVerbose()) {
|
|
|
|
- cerr << "[b10-recurse] sending a response ("
|
|
|
|
- << renderer.getLength() << " bytes):\n"
|
|
|
|
- << message->toText() << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog(string("sending a response (") +
|
|
|
|
+ boost::lexical_cast<string>(renderer.getLength()) + "bytes): \n" +
|
|
|
|
+ message->toText());
|
|
}
|
|
}
|
|
|
|
|
|
private:
|
|
private:
|
|
@@ -285,6 +289,7 @@ Recursor::~Recursor() {
|
|
delete checkin_;
|
|
delete checkin_;
|
|
delete dns_lookup_;
|
|
delete dns_lookup_;
|
|
delete dns_answer_;
|
|
delete dns_answer_;
|
|
|
|
+ dlog("Deleting the Recursor");
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
@@ -295,16 +300,6 @@ Recursor::setDNSService(asiolink::DNSService& dnss) {
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
-Recursor::setVerbose(const bool on) {
|
|
|
|
- impl_->verbose_mode_ = on;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-bool
|
|
|
|
-Recursor::getVerbose() const {
|
|
|
|
- return (impl_->verbose_mode_);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void
|
|
|
|
Recursor::setConfigSession(ModuleCCSession* config_session) {
|
|
Recursor::setConfigSession(ModuleCCSession* config_session) {
|
|
impl_->config_session_ = config_session;
|
|
impl_->config_session_ = config_session;
|
|
}
|
|
}
|
|
@@ -318,6 +313,7 @@ void
|
|
Recursor::processMessage(const IOMessage& io_message, MessagePtr message,
|
|
Recursor::processMessage(const IOMessage& io_message, MessagePtr message,
|
|
OutputBufferPtr buffer, DNSServer* server)
|
|
OutputBufferPtr buffer, DNSServer* server)
|
|
{
|
|
{
|
|
|
|
+ dlog("Got a DNS message");
|
|
InputBuffer request_buffer(io_message.getData(), io_message.getDataSize());
|
|
InputBuffer request_buffer(io_message.getData(), io_message.getDataSize());
|
|
// First, check the header part. If we fail even for the base header,
|
|
// First, check the header part. If we fail even for the base header,
|
|
// just drop the message.
|
|
// just drop the message.
|
|
@@ -326,17 +322,12 @@ Recursor::processMessage(const IOMessage& io_message, MessagePtr message,
|
|
|
|
|
|
// Ignore all responses.
|
|
// Ignore all responses.
|
|
if (message->getHeaderFlag(MessageFlag::QR())) {
|
|
if (message->getHeaderFlag(MessageFlag::QR())) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] received unexpected response, ignoring"
|
|
|
|
- << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog("Received unexpected response, ignoring");
|
|
server->resume(false);
|
|
server->resume(false);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
} catch (const Exception& ex) {
|
|
} catch (const Exception& ex) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] DNS packet exception: " << ex.what() << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog(string("DNS packet exception: ") + ex.what());
|
|
server->resume(false);
|
|
server->resume(false);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -345,57 +336,40 @@ Recursor::processMessage(const IOMessage& io_message, MessagePtr message,
|
|
try {
|
|
try {
|
|
message->fromWire(request_buffer);
|
|
message->fromWire(request_buffer);
|
|
} catch (const DNSProtocolError& error) {
|
|
} catch (const DNSProtocolError& error) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] returning " << error.getRcode().toText()
|
|
|
|
- << ": " << error.what() << endl;
|
|
|
|
- }
|
|
|
|
- makeErrorMessage(message, buffer, error.getRcode(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ dlog(string("returning ") + error.getRcode().toText() + ": " +
|
|
|
|
+ error.what());
|
|
|
|
+ makeErrorMessage(message, buffer, error.getRcode());
|
|
server->resume(true);
|
|
server->resume(true);
|
|
return;
|
|
return;
|
|
} catch (const Exception& ex) {
|
|
} catch (const Exception& ex) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] returning SERVFAIL: " << ex.what() << endl;
|
|
|
|
- }
|
|
|
|
- makeErrorMessage(message, buffer, Rcode::SERVFAIL(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ dlog(string("returning SERVFAIL: ") + ex.what());
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::SERVFAIL());
|
|
server->resume(true);
|
|
server->resume(true);
|
|
return;
|
|
return;
|
|
} // other exceptions will be handled at a higher layer.
|
|
} // other exceptions will be handled at a higher layer.
|
|
|
|
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] received a message:\n"
|
|
|
|
- << message->toText() << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog("received a message:\n" + message->toText());
|
|
|
|
|
|
// Perform further protocol-level validation.
|
|
// Perform further protocol-level validation.
|
|
bool sendAnswer = true;
|
|
bool sendAnswer = true;
|
|
if (message->getOpcode() == Opcode::NOTIFY()) {
|
|
if (message->getOpcode() == Opcode::NOTIFY()) {
|
|
- makeErrorMessage(message, buffer, Rcode::NOTAUTH(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::NOTAUTH());
|
|
} else if (message->getOpcode() != Opcode::QUERY()) {
|
|
} else if (message->getOpcode() != Opcode::QUERY()) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] unsupported opcode" << endl;
|
|
|
|
- }
|
|
|
|
- makeErrorMessage(message, buffer, Rcode::NOTIMP(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ dlog("unsupported opcode");
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::NOTIMP());
|
|
} else if (message->getRRCount(Section::QUESTION()) != 1) {
|
|
} else if (message->getRRCount(Section::QUESTION()) != 1) {
|
|
- makeErrorMessage(message, buffer, Rcode::FORMERR(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::FORMERR());
|
|
} else {
|
|
} else {
|
|
ConstQuestionPtr question = *message->beginQuestion();
|
|
ConstQuestionPtr question = *message->beginQuestion();
|
|
const RRType &qtype = question->getType();
|
|
const RRType &qtype = question->getType();
|
|
if (qtype == RRType::AXFR()) {
|
|
if (qtype == RRType::AXFR()) {
|
|
if (io_message.getSocket().getProtocol() == IPPROTO_UDP) {
|
|
if (io_message.getSocket().getProtocol() == IPPROTO_UDP) {
|
|
- makeErrorMessage(message, buffer, Rcode::FORMERR(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::FORMERR());
|
|
} else {
|
|
} else {
|
|
- makeErrorMessage(message, buffer, Rcode::NOTIMP(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::NOTIMP());
|
|
}
|
|
}
|
|
} else if (qtype == RRType::IXFR()) {
|
|
} else if (qtype == RRType::IXFR()) {
|
|
- makeErrorMessage(message, buffer, Rcode::NOTIMP(),
|
|
|
|
- impl_->verbose_mode_);
|
|
|
|
|
|
+ makeErrorMessage(message, buffer, Rcode::NOTIMP());
|
|
} else {
|
|
} else {
|
|
// The RecursiveQuery object will post the "resume" event to the
|
|
// The RecursiveQuery object will post the "resume" event to the
|
|
// DNSServer when an answer arrives, so we don't have to do it now.
|
|
// DNSServer when an answer arrives, so we don't have to do it now.
|
|
@@ -413,6 +387,7 @@ void
|
|
RecursorImpl::processNormalQuery(const Question& question, MessagePtr message,
|
|
RecursorImpl::processNormalQuery(const Question& question, MessagePtr message,
|
|
OutputBufferPtr buffer, DNSServer* server)
|
|
OutputBufferPtr buffer, DNSServer* server)
|
|
{
|
|
{
|
|
|
|
+ dlog("Processing normal query");
|
|
const bool dnssec_ok = message->isDNSSECSupported();
|
|
const bool dnssec_ok = message->isDNSSECSupported();
|
|
|
|
|
|
message->makeResponse();
|
|
message->makeResponse();
|
|
@@ -424,15 +399,14 @@ RecursorImpl::processNormalQuery(const Question& question, MessagePtr message,
|
|
}
|
|
}
|
|
|
|
|
|
ConstElementPtr
|
|
ConstElementPtr
|
|
-Recursor::updateConfig(ConstElementPtr new_config UNUSED_PARAM) {
|
|
|
|
|
|
+Recursor::updateConfig(ConstElementPtr new_config) {
|
|
|
|
+ dlog("New config comes: " + new_config->toWire());
|
|
try {
|
|
try {
|
|
// We will do configuration updates here. None are presently
|
|
// We will do configuration updates here. None are presently
|
|
// defined, so we just return an empty answer.
|
|
// defined, so we just return an empty answer.
|
|
return (isc::config::createAnswer());
|
|
return (isc::config::createAnswer());
|
|
} catch (const isc::Exception& error) {
|
|
} catch (const isc::Exception& error) {
|
|
- if (impl_->verbose_mode_) {
|
|
|
|
- cerr << "[b10-recurse] error: " << error.what() << endl;
|
|
|
|
- }
|
|
|
|
|
|
+ dlog(string("error in config: ") + error.what());
|
|
return (isc::config::createAnswer(1, error.what()));
|
|
return (isc::config::createAnswer(1, error.what()));
|
|
}
|
|
}
|
|
}
|
|
}
|