BIND 10 master, updated. 1e62bf975ba54ebee2e5ddc2a2cc26ca5c254f44 Merge branch 'master' of ssh://git.bind10.isc.org/var/bind10/git/bind10
BIND 10 source code commits
bind10-changes at lists.isc.org
Thu Mar 15 01:35:51 UTC 2012
The branch, master has been updated
via 1e62bf975ba54ebee2e5ddc2a2cc26ca5c254f44 (commit)
via 1ddc5eccbe9fc1784a3447c38f708a389a45d83f (commit)
via 8173e046080fe51963a37ba89107a8871a0b5353 (commit)
via 8b2c30923f169c6b747158740a85be6d68a1d05c (commit)
via 699068ef1467867fbbb86cfebc20e823c5128100 (commit)
via ede52d8098375352ae87a124619ad78f01fa2e28 (commit)
via d5ec40dace9fddaaec9873cfca2d670e8d35650a (commit)
via 56824afc873d66a300f2dbde46e906c163e2d492 (commit)
via 95af6c2e54fb45fa5af1a2d3650376ccadd32c7b (commit)
from 5845ab9615b27fe8efa38b38622fd12a42350e04 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 1e62bf975ba54ebee2e5ddc2a2cc26ca5c254f44
Merge: 1ddc5eccbe9fc1784a3447c38f708a389a45d83f 5845ab9615b27fe8efa38b38622fd12a42350e04
Author: Xie Jiagui <xiejiagui at cnnic.cn>
Date: Thu Mar 15 09:35:37 2012 +0800
Merge branch 'master' of ssh://git.bind10.isc.org/var/bind10/git/bind10
-----------------------------------------------------------------------
Summary of changes:
src/bin/auth/auth_srv.cc | 28 +++++-----
src/bin/auth/tests/auth_srv_unittest.cc | 27 +++++++++
src/lib/asiodns/dns_service.cc | 78 +++++++++++++++++--------
src/lib/asiodns/dns_service.h | 26 +++++++--
src/lib/asiodns/tests/io_service_unittest.cc | 5 ++
5 files changed, 119 insertions(+), 45 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc
index 524d581..ff618a7 100644
--- a/src/bin/auth/auth_srv.cc
+++ b/src/bin/auth/auth_srv.cc
@@ -99,6 +99,7 @@ public:
IOService io_service_;
+ MessageRenderer renderer_;
/// Currently non-configurable, but will be.
static const uint16_t DEFAULT_LOCAL_UDPSIZE = 4096;
@@ -304,8 +305,9 @@ makeErrorMessage(Message& message, OutputBuffer& buffer,
message.setHeaderFlag(Message::HEADERFLAG_CD);
}
for_each(questions.begin(), questions.end(), QuestionInserter(message));
- message.setRcode(rcode);
+ message.setRcode(rcode);
+
MessageRenderer renderer;
renderer.setBuffer(&buffer);
if (tsig_context.get() != NULL) {
@@ -563,20 +565,19 @@ AuthSrvImpl::processNormalQuery(const IOMessage& io_message, Message& message,
return (true);
}
- MessageRenderer renderer;
- renderer.setBuffer(&buffer);
+ renderer_.clear();
+ renderer_.setBuffer(buffer.get());
+
const bool udp_buffer =
(io_message.getSocket().getProtocol() == IPPROTO_UDP);
- renderer.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
+ renderer_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
if (tsig_context.get() != NULL) {
- message.toWire(renderer, *tsig_context);
+ message->toWire(renderer_, *tsig_context);
} else {
- message.toWire(renderer);
+ message->toWire(renderer_);
}
- renderer.setBuffer(NULL);
LOG_DEBUG(auth_logger, DBG_AUTH_MESSAGES, AUTH_SEND_NORMAL_RESPONSE)
- .arg(renderer.getLength()).arg(message);
-
+ .arg(renderer_.getLength()).arg(message->toText());
return (true);
}
@@ -694,14 +695,13 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
message.setHeaderFlag(Message::HEADERFLAG_AA);
message.setRcode(Rcode::NOERROR());
- MessageRenderer renderer;
- renderer.setBuffer(&buffer);
+ renderer_.clear();
+ renderer_.setBuffer(buffer.get());
if (tsig_context.get() != NULL) {
- message.toWire(renderer, *tsig_context);
+ message->toWire(renderer_, *tsig_context);
} else {
- message.toWire(renderer);
+ message->toWire(renderer_);
}
- renderer.setBuffer(NULL);
return (true);
}
diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc
index 4823ad7..0790a87 100644
--- a/src/bin/auth/tests/auth_srv_unittest.cc
+++ b/src/bin/auth/tests/auth_srv_unittest.cc
@@ -125,6 +125,8 @@ protected:
}
}
+<<<<<<< HEAD
+=======
// Convenience method for tests that expect to return SERVFAIL
// It calls processMessage, checks if there is an answer, and
// check the header for default SERVFAIL data
@@ -135,6 +137,7 @@ protected:
opcode.getCode(), QR_FLAG, 1, 0, 0, 0);
}
+>>>>>>> master
IOService ios_;
DNSService dnss_;
MockSession statistics_session;
@@ -1075,6 +1078,29 @@ TEST_F(AuthSrvTest, listenAddresses) {
"Released tokens");
}
+<<<<<<< HEAD
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer1) {
+ UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+ default_qid, Name("example.com"),
+ RRClass::IN(), RRType::NS());
+
+ request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+ createRequestPacket(request_message, IPPROTO_UDP);
+ server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+ EXPECT_NE(request_message.getRcode(), parse_message->getRcode());
+}
+
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer2) {
+ UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+ default_qid, Name("example.com"),
+ RRClass::IN(), RRType::SOA());
+
+ request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+ createRequestPacket(request_message, IPPROTO_UDP);
+ server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+ ConstQuestionPtr question = *parse_message->beginQuestion();
+ EXPECT_STRNE(question->getType().toText().c_str(),RRType::NS().toText().c_str());
+=======
//
// Tests for catching exceptions in various stages of the query processing
//
@@ -1300,6 +1326,7 @@ TEST_F(AuthSrvTest, queryWithInMemoryClientProxyGetClass) {
EXPECT_TRUE(dnsserv.hasAnswer());
headerCheck(*parse_message, default_qid, Rcode::NOERROR(),
opcode.getCode(), QR_FLAG | AA_FLAG, 1, 1, 2, 1);
+>>>>>>> master
}
}
diff --git a/src/lib/asiodns/dns_service.cc b/src/lib/asiodns/dns_service.cc
index 967ce15..0e68d7b 100644
--- a/src/lib/asiodns/dns_service.cc
+++ b/src/lib/asiodns/dns_service.cc
@@ -25,9 +25,9 @@
#include <asio.hpp>
#include <dns_service.h>
#include <asiolink/io_service.h>
-#include <asiolink/io_service.h>
#include <tcp_server.h>
#include <udp_server.h>
+#include <sync_udp_server.h>
#include <log/dummylog.h>
@@ -66,11 +66,13 @@ public:
const asio::ip::address* v4addr,
const asio::ip::address* v6addr,
SimpleCallback* checkin, DNSLookup* lookup,
- DNSAnswer* answer);
+ DNSAnswer* answer,
+ const UDPVersion param_flags);
IOService& io_service_;
typedef boost::shared_ptr<UDPServer> UDPServerPtr;
+ typedef boost::shared_ptr<SyncUDPServer> SyncUDPServerPtr;
typedef boost::shared_ptr<TCPServer> TCPServerPtr;
typedef boost::shared_ptr<DNSServer> DNSServerPtr;
std::vector<DNSServerPtr> servers_;
@@ -85,7 +87,8 @@ public:
servers_.push_back(server);
}
- void addServer(uint16_t port, const asio::ip::address& address) {
+ void addServer(uint16_t port, const asio::ip::address& address,
+ const UDPVersion param_flags) {
try {
dlog(std::string("Initialize TCP server at ") + address.to_string() + ":" + boost::lexical_cast<std::string>(port));
TCPServerPtr tcpServer(new TCPServer(io_service_.get_io_service(),
@@ -93,10 +96,27 @@ public:
(*tcpServer)();
servers_.push_back(tcpServer);
dlog(std::string("Initialize UDP server at ") + address.to_string() + ":" + boost::lexical_cast<std::string>(port));
- UDPServerPtr udpServer(new UDPServer(io_service_.get_io_service(),
- address, port, checkin_, lookup_, answer_));
- (*udpServer)();
- servers_.push_back(udpServer);
+ // Use param_flags to generate diff UDPServers.
+ switch(param_flags) {
+ case SYNC_: {
+ SyncUDPServerPtr syncUdpServer(new SyncUDPServer(io_service_.get_io_service(),
+ address, port, checkin_, lookup_, answer_));
+ (*syncUdpServer)();
+ servers_.push_back(syncUdpServer);
+ break;
+ }
+ case ASYNC_: {
+ UDPServerPtr udpServer(new UDPServer(io_service_.get_io_service(),
+ address, port, checkin_, lookup_, answer_));
+ (*udpServer)();
+ servers_.push_back(udpServer);
+ break;
+ }
+ default:
+ // If nerther asyn UDPServer nor sync UDNServer, it throws.
+ isc_throw(IOError, "Bad UDPServer Version!");
+ break;
+ }
}
catch (const asio::system_error& err) {
// We need to catch and convert any ASIO level exceptions.
@@ -106,7 +126,8 @@ public:
err.what());
}
}
- void addServer(const char& port, const asio::ip::address& address) {
+ void addServer(const char& port, const asio::ip::address& address,
+ const UDPVersion param_flags) {
uint16_t portnum;
try {
// XXX: SunStudio with stlport4 doesn't reject some invalid
@@ -122,7 +143,7 @@ public:
isc_throw(IOError, "Invalid port number '" << &port << "': " <<
ex.what());
}
- addServer(portnum, address);
+ addServer(portnum, address,param_flags);
}
};
@@ -132,7 +153,8 @@ DNSServiceImpl::DNSServiceImpl(IOService& io_service,
const asio::ip::address* const v6addr,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion param_flags):
io_service_(io_service),
checkin_(checkin),
lookup_(lookup),
@@ -140,10 +162,10 @@ DNSServiceImpl::DNSServiceImpl(IOService& io_service,
{
if (v4addr) {
- addServer(port, *v4addr);
+ addServer(port, *v4addr,param_flags);
}
if (v6addr) {
- addServer(port, *v6addr);
+ addServer(port, *v6addr,param_flags);
}
}
@@ -151,11 +173,12 @@ DNSService::DNSService(IOService& io_service,
const char& port, const char& address,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion param_flags) :
impl_(new DNSServiceImpl(io_service, port, NULL, NULL, checkin, lookup,
- answer)), io_service_(io_service)
+ answer,param_flags)), io_service_(io_service)
{
- addServer(port, &address);
+ addServer(port, &address,param_flags);
}
DNSService::DNSService(IOService& io_service,
@@ -163,7 +186,8 @@ DNSService::DNSService(IOService& io_service,
const bool use_ipv4, const bool use_ipv6,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion param_flags) :
impl_(NULL), io_service_(io_service)
{
const asio::ip::address v4addr_any =
@@ -172,13 +196,13 @@ DNSService::DNSService(IOService& io_service,
const asio::ip::address v6addr_any =
asio::ip::address(asio::ip::address_v6::any());
const asio::ip::address* const v6addrp = use_ipv6 ? &v6addr_any : NULL;
- impl_ = new DNSServiceImpl(io_service, port, v4addrp, v6addrp, checkin, lookup, answer);
+ impl_ = new DNSServiceImpl(io_service, port, v4addrp, v6addrp, checkin, lookup, answer,param_flags);
}
DNSService::DNSService(IOService& io_service, SimpleCallback* checkin,
- DNSLookup* lookup, DNSAnswer *answer) :
+ DNSLookup* lookup, DNSAnswer *answer,const UDPVersion param_flags) :
impl_(new DNSServiceImpl(io_service, *"0", NULL, NULL, checkin, lookup,
- answer)), io_service_(io_service)
+ answer,param_flags)), io_service_(io_service)
{
}
@@ -187,21 +211,25 @@ DNSService::~DNSService() {
}
void
-DNSService::addServer(const char& port, const std::string& address) {
- impl_->addServer(port, convertAddr(address));
+DNSService::addServer(const char& port, const std::string& address,UDPVersion param_flags) {
+ impl_->addServer(port, convertAddr(address),param_flags);
}
void
-DNSService::addServer(uint16_t port, const std::string& address) {
- impl_->addServer(port, convertAddr(address));
+DNSService::addServer(uint16_t port, const std::string& address,UDPVersion param_flags) {
+ impl_->addServer(port, convertAddr(address),param_flags);
}
void DNSService::addServerTCPFromFD(int fd, int af) {
impl_->addServerFromFD<DNSServiceImpl::TCPServerPtr, TCPServer>(fd, af);
}
-void DNSService::addServerUDPFromFD(int fd, int af) {
- impl_->addServerFromFD<DNSServiceImpl::UDPServerPtr, UDPServer>(fd, af);
+void DNSService::addServerUDPFromFD(int fd, int af,const UDPVersion param_flags) {
+ if(SYNC_ == param_flags) {
+ impl_->addServerFromFD<DNSServiceImpl::SyncUDPServerPtr, SyncUDPServer>(fd, af);
+ } else if(ASYNC_ == param_flags) {
+ impl_->addServerFromFD<DNSServiceImpl::UDPServerPtr, UDPServer>(fd, af);
+ }
}
void
diff --git a/src/lib/asiodns/dns_service.h b/src/lib/asiodns/dns_service.h
index 66f8d33..66e0a11 100644
--- a/src/lib/asiodns/dns_service.h
+++ b/src/lib/asiodns/dns_service.h
@@ -27,6 +27,15 @@ class DNSLookup;
class DNSAnswer;
class DNSServiceImpl;
+
+/// Codes for UDPServers used in addServer()method.
+///
+/// Note: the codes only used in how to create the UDPServers.
+enum UDPVersion {
+ SYNC_ = 1, ///< used synchronous UDPServer
+ ASYNC_ = 2 ///< used asynchronous UDPServer
+};
+
/// \brief Handle DNS Queries
///
/// DNSService is the service that handles DNS queries and answers with
@@ -57,7 +66,8 @@ public:
/// \param answer The answer provider (see \c DNSAnswer)
DNSService(asiolink::IOService& io_service, const char& port,
const char& address, isc::asiolink::SimpleCallback* checkin,
- DNSLookup* lookup, DNSAnswer* answer);
+ DNSLookup* lookup, DNSAnswer* answer,
+ const UDPVersion param_flags = SYNC_);
/// \brief The constructor with a specific port on which the services
/// listen on.
///
@@ -75,19 +85,23 @@ public:
DNSService(asiolink::IOService& io_service, const char& port,
const bool use_ipv4, const bool use_ipv6,
isc::asiolink::SimpleCallback* checkin, DNSLookup* lookup,
- DNSAnswer* answer);
+ DNSAnswer* answer,
+ const UDPVersion param_flags = SYNC_);
/// \brief The constructor without any servers.
///
/// Use addServer() to add some servers.
DNSService(asiolink::IOService& io_service, isc::asiolink::SimpleCallback* checkin,
- DNSLookup* lookup, DNSAnswer* answer);
+ DNSLookup* lookup, DNSAnswer* answer,
+ const UDPVersion param_flags = SYNC_);
/// \brief The destructor.
~DNSService();
//@}
/// \brief Add another server to the service
- void addServer(uint16_t port, const std::string &address);
- void addServer(const char &port, const std::string &address);
+ void addServer(uint16_t port, const std::string &address,
+ const UDPVersion param_flags = SYNC_);
+ void addServer(const char &port, const std::string &address,
+ const UDPVersion param_flags = SYNC_);
/// \brief Add another TCP server/listener to the service from already
/// opened file descriptor
@@ -122,7 +136,7 @@ public:
/// \throw isc::InvalidParameter if af is neither AF_INET nor AF_INET6.
/// \throw isc::asiolink::IOError when a low-level error happens, like the
/// fd is not a valid descriptor or it can't be listened on.
- void addServerUDPFromFD(int fd, int af);
+ void addServerUDPFromFD(int fd, int af,const UDPVersion param_flags = SYNC_);
/// \brief Remove all servers from the service
void clearServers();
diff --git a/src/lib/asiodns/tests/io_service_unittest.cc b/src/lib/asiodns/tests/io_service_unittest.cc
index cc64022..9161fb3 100644
--- a/src/lib/asiodns/tests/io_service_unittest.cc
+++ b/src/lib/asiodns/tests/io_service_unittest.cc
@@ -116,3 +116,8 @@ TEST(IOServiceTest, DISABLED_IPv4MappedDuplicateBind) {
delete dns_service;
}
+TEST(IOServiceTest, BadUdpServerVersion) {
+ IOService io_service;
+ DNSService* dns_service = new DNSService(io_service, NULL, NULL, NULL);
+ EXPECT_THROW(dns_service->addServer(*TEST_SERVER_PORT, "127.0.0.1", UDPVersion(3)), IOError);
+}
More information about the bind10-changes
mailing list