[svn] commit: r1195 - in /branches/jinmei-asio: ./ ext/boost/system/ src/bin/auth/ src/lib/dns/ src/lib/dns/tests/

BIND 10 source code commits bind10-changes at lists.isc.org
Mon Mar 8 07:58:25 UTC 2010


Author: jinmei
Date: Mon Mar  8 07:58:25 2010
New Revision: 1195

Log:
experimental UDP/TCP auth server using boost::asio

Added:
    branches/jinmei-asio/ext/boost/system/
    branches/jinmei-asio/ext/boost/system/config.hpp
    branches/jinmei-asio/ext/boost/system/cygwin_error.hpp
    branches/jinmei-asio/ext/boost/system/error_code.hpp
    branches/jinmei-asio/ext/boost/system/linux_error.hpp
    branches/jinmei-asio/ext/boost/system/system_error.hpp
    branches/jinmei-asio/ext/boost/system/windows_error.hpp
Modified:
    branches/jinmei-asio/configure.ac
    branches/jinmei-asio/src/bin/auth/Makefile.am
    branches/jinmei-asio/src/bin/auth/auth_srv.cc
    branches/jinmei-asio/src/bin/auth/auth_srv.h
    branches/jinmei-asio/src/bin/auth/main.cc
    branches/jinmei-asio/src/lib/dns/message.cc
    branches/jinmei-asio/src/lib/dns/message.h
    branches/jinmei-asio/src/lib/dns/tests/message_unittest.cc

Modified: branches/jinmei-asio/configure.ac
==============================================================================
--- branches/jinmei-asio/configure.ac (original)
+++ branches/jinmei-asio/configure.ac Mon Mar  8 07:58:25 2010
@@ -11,6 +11,10 @@
 AC_PROG_CXX
 AC_PROG_CC
 AC_PROG_LIBTOOL
+
+# Use C++ language
+AC_LANG_CPLUSPLUS
+AX_COMPILER_VENDOR
 
 m4_define([_AM_PYTHON_INTERPRETER_LIST], [python python3 python3.1])
 AM_PATH_PYTHON([3.1])
@@ -85,6 +89,46 @@
 	AC_SUBST(GENHTML)
 fi
 AC_SUBST(USE_LCOV)
+
+# Check availability of the Boost System library
+
+AC_MSG_CHECKING([for boost::system library])
+AC_ARG_WITH([boostlib],
+AC_HELP_STRING([--with-boostlib=PATH],
+  [specify a path to boost libraries if it is not automatically found]),
+  [boostlib_path="$withval"], [boostlib_path="no"])
+if test "$boostlib_path" != "no"; then
+	BOOST_LDFLAGS="-L$boostlib_path"
+fi
+
+LDFLAGS_SAVED="$LDFLAGS"
+LIBS_SAVED="$LIBS"
+CPPFLAGS_SAVED="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS -Iext"
+
+for BOOST_TRY_LIB in boost_system boost_system-mt; do
+	LDFLAGS="$LDFLAGS_SAVED ${BOOST_LDFLAGS}"
+	LIBS="$LIBS_SAVED -l${BOOST_TRY_LIB}"
+	AC_TRY_LINK([#include <boost/system/error_code.hpp>],
+		[ boost::system::error_code error_code;
+		  std::string message(error_code.message());
+		  return 0; ],
+	[ AC_MSG_RESULT(ok)
+	  BOOST_SYSTEM_LIB="-l${BOOST_TRY_LIB}"
+	  ],[])
+	if test "X${BOOST_SYSTEM_LIB}" != X; then
+        	break
+	fi
+done
+
+if test "X${BOOST_SYSTEM_LIB}" = X; then
+	AC_MSG_RESULT(not found)
+	AC_MSG_ERROR(Unable to link with the boost::system library)
+fi
+
+CPPFLAGS="$CPPFLAGS_SAVED"
+LIBS="$LIBS_SAVED"
+AC_SUBST(BOOST_SYSTEM_LIB)
 
 #
 # Check availability of gtest, which will be used for unit tests.

Modified: branches/jinmei-asio/src/bin/auth/Makefile.am
==============================================================================
--- branches/jinmei-asio/src/bin/auth/Makefile.am (original)
+++ branches/jinmei-asio/src/bin/auth/Makefile.am Mon Mar  8 07:58:25 2010
@@ -14,6 +14,7 @@
 b10_auth_LDADD += $(top_builddir)/src/lib/cc/libcc.a
 b10_auth_LDADD += $(top_builddir)/src/lib/exceptions/.libs/libexceptions.a
 b10_auth_LDADD += $(SQLITE_LIBS)
+b10_auth_LDADD += $(BOOST_SYSTEM_LIB)
 
 # TODO: config.h.in is wrong because doesn't honor pkgdatadir
 # and can't use @datadir@ because doesn't expand default ${prefix}

Modified: branches/jinmei-asio/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/jinmei-asio/src/bin/auth/auth_srv.cc (original)
+++ branches/jinmei-asio/src/bin/auth/auth_srv.cc Mon Mar  8 07:58:25 2010
@@ -84,52 +84,41 @@
     delete impl_;
 }
 
-void
-AuthSrv::processMessage(const int fd)
+int
+AuthSrv::processMessage(InputBuffer& request_buffer,
+                        Message& message,
+                        MessageRenderer& response_renderer)
 {
-    struct sockaddr_storage ss;
-    socklen_t sa_len = sizeof(ss);
-    struct sockaddr* sa = static_cast<struct sockaddr*>((void*)&ss);
-    char recvbuf[4096];
-    int cc;
+    try {
+            message.fromWire(request_buffer);
+    } catch (...) {
+        cerr << "[AuthSrv] parse failed" << endl;
+        return (-1);
+    }
 
-    if ((cc = recvfrom(fd, recvbuf, sizeof(recvbuf), 0, sa, &sa_len)) > 0) {
-        Message msg(Message::PARSE);
-        InputBuffer buffer(recvbuf, cc);
+    cout << "[AuthSrv] received a message:\n" << message.toText() << endl;
 
-        try {
-            msg.fromWire(buffer);
-        } catch (...) {
-            cerr << "[AuthSrv] parse failed" << endl;
-            return;
-        }
+    if (message.getRRCount(Section::QUESTION()) != 1) {
+        return (-1);
+    }
 
-        cout << "[AuthSrv] received a message:\n" << msg.toText() << endl;
+    bool dnssec_ok = message.isDNSSECSupported();
+    // unused for now.  should set this to renderer for truncation
+    uint16_t remote_bufsize = message.getUDPSize();
 
-        if (msg.getRRCount(Section::QUESTION()) != 1) {
-            return;
-        }
+    message.makeResponse();
+    message.setHeaderFlag(MessageFlag::AA());
+    message.setRcode(Rcode::NOERROR());
+    message.setDNSSECSupported(dnssec_ok);
+    message.setUDPSize(4096);   // XXX: hardcoding
 
-        bool dnssec_ok = msg.isDNSSECSupported();
-        uint16_t remote_bufsize = msg.getUDPSize();
+    Query query(message, dnssec_ok);
+    impl_->data_sources.doQuery(query);
 
-        msg.makeResponse();
-        msg.setHeaderFlag(MessageFlag::AA());
-        msg.setRcode(Rcode::NOERROR());
-        msg.setDNSSECSupported(dnssec_ok);
-        msg.setUDPSize(sizeof(recvbuf));
+    message.toWire(response_renderer);
+    cout << "sending a response:\n" << message.toText() << endl;
 
-        Query query(msg, dnssec_ok);
-        impl_->data_sources.doQuery(query);
-
-        OutputBuffer obuffer(remote_bufsize);
-        MessageRenderer renderer(obuffer);
-        msg.toWire(renderer);
-        cout << "sending a response (" <<
-            boost::lexical_cast<string>(obuffer.getLength())
-                  << " bytes):\n" << msg.toText() << endl;
-        sendto(fd, obuffer.getData(), obuffer.getLength(), 0, sa, sa_len);
-    }
+    return (0);
 }
 
 void

Modified: branches/jinmei-asio/src/bin/auth/auth_srv.h
==============================================================================
--- branches/jinmei-asio/src/bin/auth/auth_srv.h (original)
+++ branches/jinmei-asio/src/bin/auth/auth_srv.h Mon Mar  8 07:58:25 2010
@@ -21,6 +21,14 @@
 
 #include <cc/data.h>
 
+namespace isc {
+namespace dns {
+class InputBuffer;
+class Message;
+class MessageRenderer;
+}
+}
+
 class AuthSrvImpl;
 
 class AuthSrv {
@@ -37,7 +45,9 @@
     explicit AuthSrv();
     ~AuthSrv();
     //@}
-    void processMessage(int fd);
+    int processMessage(isc::dns::InputBuffer& request_buffer,
+                       isc::dns::Message& message,
+                       isc::dns::MessageRenderer& response_renderer);
     void serve(std::string zone_name);
     void setDbFile(const std::string& db_file);
     isc::data::ElementPtr updateConfig(isc::data::ElementPtr config);

Modified: branches/jinmei-asio/src/bin/auth/main.cc
==============================================================================
--- branches/jinmei-asio/src/bin/auth/main.cc (original)
+++ branches/jinmei-asio/src/bin/auth/main.cc Mon Mar  8 07:58:25 2010
@@ -18,18 +18,21 @@
 #include <sys/socket.h>
 #include <sys/select.h>
 #include <netdb.h>
-#include <netinet/in.h>  // IPPROTO_UDP
 #include <stdlib.h>
 
 #include <set>
 #include <iostream>
 
 #include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+#include <boost/asio.hpp>
 
 #include <dns/buffer.h>
 #include <dns/name.h>
+#include <dns/message.h>
 #include <dns/rrset.h>
 #include <dns/message.h>
+#include <dns/messagerenderer.h>
 
 #include <cc/session.h>
 #include <cc/data.h>
@@ -42,13 +45,19 @@
 #include <boost/foreach.hpp>
 
 using namespace std;
+
+using namespace boost::asio;
+using ip::udp;
+using ip::tcp;
+
 using namespace isc::data;
 using namespace isc::cc;
 using namespace isc::config;
+using namespace isc::dns;
 
 namespace {
 const string PROGRAM = "Auth";
-const char* DNSPORT = "5300";
+const short DNSPORT = 5300;
 }
 
 /* need global var for config/command handlers.
@@ -58,6 +67,213 @@
 AuthSrv *auth_server;
 }
 
+//
+// Helper classes for asynchronous I/O using boost::asio
+//
+namespace {
+class Completed {
+public:
+    Completed(size_t len) : len_(len) {}
+    bool operator()(const boost::system::error_code& error,
+                    size_t bytes_transferred) const
+    {
+        return (error != 0 || bytes_transferred >= len_);
+    }
+private:
+    size_t len_;
+};
+
+class TCPClient {
+public:
+    TCPClient(io_service& io_service) :
+        socket_(io_service),
+        response_buffer_(0),
+        responselen_buffer_(TCP_MESSAGE_LENGTHSIZE),
+        response_renderer_(response_buffer_),
+        dns_message_(Message::PARSE)
+    {}
+
+    void start() {
+        async_read(socket_, boost::asio::buffer(data_, TCP_MESSAGE_LENGTHSIZE),
+                   Completed(TCP_MESSAGE_LENGTHSIZE),
+                   boost::bind(&TCPClient::headerRead, this,
+                               placeholders::error,
+                               placeholders::bytes_transferred));
+    }
+
+    tcp::socket& getSocket() { return (socket_); }
+
+    void headerRead(const boost::system::error_code& error,
+                    size_t bytes_transferred)
+    {
+        if (!error) {
+            assert(bytes_transferred == TCP_MESSAGE_LENGTHSIZE);
+            InputBuffer dnsbuffer(data_, TCP_MESSAGE_LENGTHSIZE);
+
+            uint16_t msglen = dnsbuffer.readUint16();
+            async_read(socket_, boost::asio::buffer(data_, msglen),
+                       Completed(msglen),
+                       boost::bind(&TCPClient::requestRead, this,
+                                   placeholders::error,
+                                   placeholders::bytes_transferred));
+        } else {
+            delete this;
+        }
+    }
+
+    void requestRead(const boost::system::error_code& error,
+                     size_t bytes_transferred)
+    {
+        if (!error) {
+            InputBuffer dnsbuffer(data_, bytes_transferred);
+            if (auth_server->processMessage(dnsbuffer, dns_message_,
+                                            response_renderer_) == 0) {
+                responselen_buffer_.writeUint16(response_buffer_.getLength());
+                async_write(socket_,
+                            boost::asio::buffer(
+                                responselen_buffer_.getData(),
+                                responselen_buffer_.getLength()),
+                        boost::bind(&TCPClient::responseWrite, this,
+                                    placeholders::error));
+            } else {
+                delete this;
+            }
+        } else {
+            delete this;
+        }
+    }
+
+    void responseWrite(const boost::system::error_code& error)
+    {
+        if (!error) {
+                async_write(socket_,
+                            boost::asio::buffer(response_buffer_.getData(),
+                                                response_buffer_.getLength()),
+                        boost::bind(&TCPClient::handleWrite, this,
+                                    placeholders::error));
+        }
+    }
+
+    void handleWrite(const boost::system::error_code& error)
+    {
+        if (!error) {
+            start();            // handle next request, if any.
+      } else {
+            delete this;
+      }
+    }
+
+private:
+    tcp::socket socket_;
+    OutputBuffer response_buffer_;
+    OutputBuffer responselen_buffer_;
+    MessageRenderer response_renderer_;
+    Message dns_message_;
+    enum { MAX_LENGTH = 65535 };
+    static const size_t TCP_MESSAGE_LENGTHSIZE = 2;
+    char data_[MAX_LENGTH];
+};
+
+class TCPServer
+{
+public:
+    TCPServer(io_service& io_service, int af, short port) :
+        io_service_(io_service),
+        acceptor_(io_service,
+                  tcp::endpoint(af == AF_INET6 ? tcp::v6() : tcp::v4(), port))
+    {
+        TCPClient* new_client = new TCPClient(io_service_);
+        // XXX: isn't the following exception free?  Need to check it.
+        acceptor_.async_accept(new_client->getSocket(),
+                               boost::bind(&TCPServer::handleAccept, this,
+                                           new_client, placeholders::error));
+    }
+
+    void handleAccept(TCPClient* new_client,
+                      const boost::system::error_code& error)
+    {
+        if (!error) {
+            new_client->start();
+            new_client = new TCPClient(io_service_);
+            acceptor_.async_accept(new_client->getSocket(),
+                                   boost::bind(&TCPServer::handleAccept,
+                                               this, new_client,
+                                               placeholders::error));
+        } else {
+            delete new_client;
+        }
+    }
+
+private:
+    io_service& io_service_;
+    tcp::acceptor acceptor_;
+};
+
+class UDPServer {
+public:
+    UDPServer(io_service& io_service, int af, short port) :
+        io_service_(io_service),
+        socket_(io_service,
+                udp::endpoint(af == AF_INET6 ? udp::v6() : udp::v4(), port)),
+        response_buffer_(0),
+        response_renderer_(response_buffer_),
+        dns_message_(Message::PARSE)
+    {
+        startReceive();
+    }
+
+    void handleRequest(const boost::system::error_code& error,
+                       size_t bytes_recvd)
+    {
+        if (!error && bytes_recvd > 0) {
+            InputBuffer request_buffer(data_, bytes_recvd);
+
+            dns_message_.clear(Message::PARSE);
+            response_renderer_.clear();
+            if (auth_server->processMessage(request_buffer, dns_message_,
+                                            response_renderer_) == 0) {
+                socket_.async_send_to(
+                    boost::asio::buffer(response_buffer_.getData(),
+                                        response_buffer_.getLength()),
+                    sender_endpoint_,
+                    boost::bind(&UDPServer::sendCompleted,
+                                this,
+                                placeholders::error,
+                                placeholders::bytes_transferred));
+            } else {
+                startReceive();
+            }
+        } else {
+            startReceive();
+        }
+    }
+
+    void sendCompleted(const boost::system::error_code& error,
+                       size_t bytes_sent)
+    {
+        startReceive();
+    }
+private:
+    void startReceive() {
+        socket_.async_receive_from(
+            boost::asio::buffer(data_, MAX_LENGTH), sender_endpoint_,
+            boost::bind(&UDPServer::handleRequest, this,
+                        placeholders::error,
+                        placeholders::bytes_transferred));
+    }
+
+private:
+    io_service& io_service_;
+    udp::socket socket_;
+    OutputBuffer response_buffer_;
+    MessageRenderer response_renderer_;
+    Message dns_message_;
+    udp::endpoint sender_endpoint_;
+    enum { MAX_LENGTH = 4096 };
+    char data_[MAX_LENGTH];
+};
+}
+
 static void
 usage() {
     cerr << "Usage: b10-auth [-p port] [-4|-6]" << endl;
@@ -85,50 +301,16 @@
     return answer;
 }
 
-static int
-getSocket(int af, const char* port) {
-    struct addrinfo hints, *res;
-
-    memset(&hints, 0, sizeof(hints));
-    hints.ai_family = af;
-    hints.ai_socktype = SOCK_DGRAM;
-    hints.ai_flags = AI_PASSIVE;
-    hints.ai_protocol = IPPROTO_UDP;
-
-    int error = getaddrinfo(NULL, port, &hints, &res);
-    if (error != 0) {
-        cerr << "getaddrinfo failed: " << gai_strerror(error);
-        return (-1);
-    }
-
-    int s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-    if (s < 0) {
-        cerr << "failed to open socket" << endl;
-        return (-1);
-    }
-
-    if (af == AF_INET6) {
-        int on = 1;
-        if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) < 0) {
-            cerr << "couldn't set IPV6_V6ONLY socket option" << endl;
-        }
-    }
-
-    if (bind(s, res->ai_addr, res->ai_addrlen) < 0) {
-        cerr << "binding socket failure" << endl;
-        close(s);
-        return (-1);
-    }
-
-    return (s);
-}
-
 int
 main(int argc, char* argv[]) {
     int ch;
-    const char* port = DNSPORT;
+    short port = DNSPORT;
     bool ipv4_only = false, ipv6_only = false;
-    int ps4 = -1, ps6 = -1;
+    bool use_ipv4 = false, use_ipv6 = false;
+    UDPServer* udp4_server = NULL;
+    UDPServer* udp6_server = NULL;
+    TCPServer* tcp4_server = NULL;
+    TCPServer* tcp6_server = NULL;
 
     while ((ch = getopt(argc, argv, "46p:")) != -1) {
         switch (ch) {
@@ -139,7 +321,7 @@
             ipv6_only = true;
             break;
         case 'p':
-            port = optarg;
+            port = atoi(optarg);
             break;
         case '?':
         default:
@@ -156,19 +338,10 @@
         usage();
     }
     if (!ipv6_only) {
-        ps4 = getSocket(AF_INET, port);
-        if (ps4 < 0) {
-            exit(1);
-        }
+        use_ipv4 = true;
     }
     if (!ipv4_only) {
-        ps6 = getSocket(AF_INET6, port);
-        if (ps6 < 0) {
-            if (ps4 < 0) {
-                close(ps4);
-            }
-            exit(1);
-        }
+        use_ipv4 = true;
     }
 
     auth_server = new AuthSrv;
@@ -186,52 +359,39 @@
         ModuleCCSession cs = ModuleCCSession(specfile, my_config_handler,
                                              my_command_handler);
 
-        // main server loop
-        fd_set fds;
-        int ss = cs.getSocket();
-        int nfds = max(max(ps4, ps6), ss) + 1;
-        int counter = 0;
+        // XXX: in this prototype code we'll ignore any message on the command
+        // channel.
+
+        boost::asio::io_service io_service;
+        if (use_ipv4) {
+            udp4_server = new UDPServer(io_service, AF_INET, port);
+            tcp4_server = new TCPServer(io_service, AF_INET, port);
+        }
+        if (use_ipv6) {
+            udp6_server = new UDPServer(io_service, AF_INET6, port);
+            tcp6_server = new TCPServer(io_service, AF_INET6, port);
+        }
 
         cout << "Server started." << endl;
-        while (true) {
-            FD_ZERO(&fds);
-            if (ps4 >= 0) {
-                FD_SET(ps4, &fds);
-            }
-            if (ps6 >= 0) {
-                FD_SET(ps6, &fds);
-            }
-            FD_SET(ss, &fds);
-
-            int n = select(nfds, &fds, NULL, NULL, NULL);
-            if (n < 0) {
-                throw FatalError("select error");
-            }
-
-            if (ps4 >= 0 && FD_ISSET(ps4, &fds)) {
-                ++counter;
-                auth_server->processMessage(ps4);
-            }
-            if (ps6 >= 0 && FD_ISSET(ps6, &fds)) {
-                ++counter;
-                auth_server->processMessage(ps6);
-            }
-    
-            if (FD_ISSET(ss, &fds)) {
-                cs.check_command();
-            }
-        }
-    } catch (SessionError se) {
-        cout << se.what() << endl;
+        io_service.run();
+    } catch (const std::exception& ex) {
+        cerr << ex.what() << endl;
         ret = 1;
     }
 
-    if (ps4 >= 0) {
-        close(ps4);
-    }
-    if (ps6 >= 0) {
-        close(ps6);
-    }
+    if (udp4_server != NULL) {
+        delete udp4_server;
+    }
+    if (tcp4_server != NULL) {
+        delete tcp4_server;
+    }
+    if (udp6_server != NULL) {
+        delete udp6_server;
+    }
+    if (tcp6_server != NULL) {
+        delete tcp6_server;
+    }
+
     delete auth_server;
     return (ret);
 }

Modified: branches/jinmei-asio/src/lib/dns/message.cc
==============================================================================
--- branches/jinmei-asio/src/lib/dns/message.cc (original)
+++ branches/jinmei-asio/src/lib/dns/message.cc Mon Mar  8 07:58:25 2010
@@ -761,9 +761,10 @@
 }
 
 void
-Message::clear()
+Message::clear(Mode mode)
 {
     impl_->init();
+    impl_->mode_ = mode;
 }
 
 void

Modified: branches/jinmei-asio/src/lib/dns/message.h
==============================================================================
--- branches/jinmei-asio/src/lib/dns/message.h (original)
+++ branches/jinmei-asio/src/lib/dns/message.h Mon Mar  8 07:58:25 2010
@@ -563,7 +563,7 @@
     //void addRR(const Section& section, const RR& rr);
     //void removeRR(const Section& section, const RR& rr);
 
-    void clear();
+    void clear(Mode mode);
 
     // prepare for making a response from a request.  This will clear the
     // DNS header except those fields that should be kept for the response,

Modified: branches/jinmei-asio/src/lib/dns/tests/message_unittest.cc
==============================================================================
--- branches/jinmei-asio/src/lib/dns/tests/message_unittest.cc (original)
+++ branches/jinmei-asio/src/lib/dns/tests/message_unittest.cc Mon Mar  8 07:58:25 2010
@@ -124,12 +124,12 @@
     EXPECT_FALSE(message_parse.isDNSSECSupported());
 
     // If DO bit is on, DNSSEC is considered to be supported.
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     factoryFromFile(message_parse, "testdata/message_fromWire2");
     EXPECT_TRUE(message_parse.isDNSSECSupported());
 
     // If DO bit is off, DNSSEC is considered to be unsupported.
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     factoryFromFile(message_parse, "testdata/message_fromWire3");
     EXPECT_FALSE(message_parse.isDNSSECSupported());
 }
@@ -162,12 +162,12 @@
     EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message_parse.getUDPSize());
 
     // If the size specified in EDNS0 > default max, use it.
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     factoryFromFile(message_parse, "testdata/message_fromWire2");
     EXPECT_EQ(4096, message_parse.getUDPSize());
 
     // If the size specified in EDNS0 < default max, keep using the default.
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     factoryFromFile(message_parse, "testdata/message_fromWire8");
     EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message_parse.getUDPSize());
 }
@@ -203,7 +203,7 @@
     EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
 
     // Maximum extended Rcode
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     factoryFromFile(message_parse, "testdata/message_fromWire11");
     EXPECT_EQ(0xfff, message_parse.getRcode().getCode());
 }
@@ -214,21 +214,21 @@
     EXPECT_THROW(factoryFromFile(message_parse, "testdata/message_fromWire4"),
                  DNSMessageFORMERR);
     // multiple OPT RRs (in the additional section)
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     EXPECT_THROW(factoryFromFile(message_parse, "testdata/message_fromWire5"),
                  DNSMessageFORMERR);
     // OPT RR of a non root name
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     EXPECT_THROW(factoryFromFile(message_parse, "testdata/message_fromWire6"),
                  DNSMessageFORMERR);
     // Compressed owner name of OPT RR points to a root name.
     // Not necessarily bogus, but very unusual and mostly pathological.
     // We accept it, but is it okay?
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     EXPECT_NO_THROW(factoryFromFile(message_parse,
                                     "testdata/message_fromWire7"));
     // Unsupported Version
-    message_parse.clear();
+    message_parse.clear(Message::PARSE);
     EXPECT_THROW(factoryFromFile(message_parse, "testdata/message_fromWire9"),
                  DNSMessageBADVERS);
 }




More information about the bind10-changes mailing list