#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>
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_;
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(),
(*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);
+
+ if(1 == param_flags) {
+ SyncUDPServerPtr syncUdpServer(new SyncUDPServer(io_service_.get_io_service(),
+ address, port, checkin_, lookup_, answer_));
+ (*syncUdpServer)();
+ servers_.push_back(syncUdpServer);
+ } else if(2 == param_flags) {
+ UDPServerPtr udpServer(new UDPServer(io_service_.get_io_service(),
+ address, port, checkin_, lookup_, answer_));
+ (*udpServer)();
+ servers_.push_back(udpServer);
+ } else {
+ // If nerther asyn UDPServer nor sync UDNServer, it throws.
+ isc_throw(IOError, "Bad UDPServer Version!");
+ }
}
catch (const asio::system_error& err) {
// We need to catch and convert any ASIO level exceptions.
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
isc_throw(IOError, "Invalid port number '" << &port << "': " <<
ex.what());
}
- addServer(portnum, address);
+ addServer(portnum, address,param_flags);
}
};
const asio::ip::address* const v6addr,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion para_flags):
io_service_(io_service),
checkin_(checkin),
lookup_(lookup),
{
if (v4addr) {
- addServer(port, *v4addr);
+ addServer(port, *v4addr,para_flags);
}
if (v6addr) {
- addServer(port, *v6addr);
+ addServer(port, *v6addr,para_flags);
}
}
const char& port, const char& address,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion para_flags) :
impl_(new DNSServiceImpl(io_service, port, NULL, NULL, checkin, lookup,
- answer)), io_service_(io_service)
+ answer,para_flags)), io_service_(io_service)
{
- addServer(port, &address);
+ addServer(port, &address,para_flags);
}
DNSService::DNSService(IOService& io_service,
const bool use_ipv4, const bool use_ipv6,
SimpleCallback* checkin,
DNSLookup* lookup,
- DNSAnswer* answer) :
+ DNSAnswer* answer,
+ const UDPVersion para_flags) :
impl_(NULL), io_service_(io_service)
{
const asio::ip::address v4addr_any =
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,para_flags);
}
DNSService::DNSService(IOService& io_service, SimpleCallback* checkin,
- DNSLookup* lookup, DNSAnswer *answer) :
+ DNSLookup* lookup, DNSAnswer *answer,const UDPVersion para_flags) :
impl_(new DNSServiceImpl(io_service, *"0", NULL, NULL, checkin, lookup,
- answer)), io_service_(io_service)
+ answer,para_flags)), io_service_(io_service)
{
}
}
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 para_flags) {
+ impl_->addServer(port, convertAddr(address),para_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 para_flags) {
+ impl_->addServer(port, convertAddr(address),para_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(1 == param_flags) {
+ impl_->addServerFromFD<DNSServiceImpl::SyncUDPServerPtr, SyncUDPServer>(fd, af);
+ } else if(2 == param_flags) {
+ impl_->addServerFromFD<DNSServiceImpl::UDPServerPtr, UDPServer>(fd, af);
+ }
}
void
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
/// \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.
///
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
/// \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();