[svn] commit: r1047 - in /trunk/src/lib/dns/cpp: message.cc message.h tests/message_unittest.cc tests/testdata/message_fromWire8 tests/testdata/message_fromWire9

BIND 10 source code commits bind10-changes at lists.isc.org
Sun Feb 28 22:25:34 UTC 2010


Author: jinmei
Date: Sun Feb 28 22:25:34 2010
New Revision: 1047

Log:
checkpoint: more support for incoming EDNS0 (unsupported version handling,
UDP buffer size)

Added:
    trunk/src/lib/dns/cpp/tests/testdata/message_fromWire8
    trunk/src/lib/dns/cpp/tests/testdata/message_fromWire9
Modified:
    trunk/src/lib/dns/cpp/message.cc
    trunk/src/lib/dns/cpp/message.h
    trunk/src/lib/dns/cpp/tests/message_unittest.cc

Modified: trunk/src/lib/dns/cpp/message.cc
==============================================================================
--- trunk/src/lib/dns/cpp/message.cc (original)
+++ trunk/src/lib/dns/cpp/message.cc Sun Feb 28 22:25:34 2010
@@ -179,6 +179,7 @@
     vector<QuestionPtr> questions_;
     vector<RRsetPtr> rrsets_[SECTION_MAX];
     RRsetPtr edns_;
+    uint16_t udpsize_;
 
 #ifdef notyet
     // tsig/sig0: TODO
@@ -191,12 +192,9 @@
                       InputBuffer& buffer);
 };
 
-MessageImpl::MessageImpl() :
-    qid_(0), rcode_(NULL), opcode_(NULL), flags_(0), dnssec_ok_(false)
-{
-    for (int i = 0; i < SECTION_MAX; i++) {
-        counts_[i] = 0;
-    }
+MessageImpl::MessageImpl()
+{
+    init();
 }
 
 void
@@ -208,6 +206,7 @@
     opcode_ = NULL;
     dnssec_ok_ = false;
     edns_ = RRsetPtr();
+    udpsize_ = Message::DEFAULT_MAX_UDPSIZE;
 
     for (int i = 0; i < SECTION_MAX; i++) {
         counts_[i] = 0;
@@ -251,6 +250,12 @@
 Message::isDNSSECSupported() const
 {
     return (impl_->dnssec_ok_);
+}
+
+uint16_t
+Message::getUDPSize() const
+{
+    return (impl_->udpsize_);
 }
 
 qid_t
@@ -479,16 +484,22 @@
             if (edns_ != NULL) {
                 dns_throw(DNSMessageFORMERR, "multiple EDNS OPT RR found");
             }
+            if (((ttl.getValue() & 0x00ff0000) >> 16) >
+                Message::EDNS0_SUPPORTED_VERSION) {
+                dns_throw(DNSMessageBADVERS, "unsupported EDNS version");
+            }
             if (name != Name::ROOT_NAME()) {
                 dns_throw(DNSMessageFORMERR,
-                          "invalid owner name for  EDNS OPT RR");
+                          "invalid owner name for EDNS OPT RR");
             }
 
             edns_ = RRsetPtr(new RRset(name, rrclass, rrtype, ttl));
             edns_->addRdata(rdata);
 
             dnssec_ok_ = (((ttl.getValue() & 0xffff) & EXTFLAG_DO) != 0);
-
+            if (rrclass.getCode() > Message::DEFAULT_MAX_UDPSIZE) {
+                udpsize_ = rrclass.getCode();
+            }
             continue;
         }
 

Modified: trunk/src/lib/dns/cpp/message.h
==============================================================================
--- trunk/src/lib/dns/cpp/message.h (original)
+++ trunk/src/lib/dns/cpp/message.h Sun Feb 28 22:25:34 2010
@@ -39,6 +39,12 @@
 class DNSMessageFORMERR : public DNSProtocolError {
 public:
     DNSMessageFORMERR(const char* file, size_t line, const char* what) :
+        DNSProtocolError(file, line, what) {}
+};
+
+class DNSMessageBADVERS : public DNSProtocolError {
+public:
+    DNSMessageBADVERS(const char* file, size_t line, const char* what) :
         DNSProtocolError(file, line, what) {}
 };
 
@@ -495,7 +501,8 @@
     void setHeaderFlag(const MessageFlag& flag);
     void clearHeaderFlag(const MessageFlag& flag);
     bool isDNSSECSupported() const;
-    void setDNSSECSupported(bool on);
+    void setDNSSECSupported(bool on); // not yet
+    uint16_t getUDPSize() const;
     qid_t getQid() const;
     void setQid(qid_t qid);
     const Rcode& getRcode() const;
@@ -540,6 +547,20 @@
     /// \brief Parse a DNS message.
     void fromWire(InputBuffer& buffer);
 
+    ///
+    /// \name Protocol constants
+    ///
+    //@{
+    /// \brief The default maximum size of UDP DNS messages that don't cause
+    /// truncation.
+    ///
+    /// With EDNS0 the maximum size can be increases per message.
+    static const uint16_t DEFAULT_MAX_UDPSIZE = 512;
+
+    /// \brief The highest EDNS0 version this implementation supports.
+    static const uint8_t EDNS0_SUPPORTED_VERSION = 0;
+    //@}
+
 private:
     MessageImpl* impl_;
 };

Modified: trunk/src/lib/dns/cpp/tests/message_unittest.cc
==============================================================================
--- trunk/src/lib/dns/cpp/tests/message_unittest.cc (original)
+++ trunk/src/lib/dns/cpp/tests/message_unittest.cc Sun Feb 28 22:25:34 2010
@@ -32,11 +32,12 @@
 using namespace isc::dns;
 using namespace isc::dns::rdata;
 
+const uint16_t Message::DEFAULT_MAX_UDPSIZE;
+
 namespace {
 class MessageTest : public ::testing::Test {
 protected:
-    MessageTest() : obuffer(0), renderer(obuffer)
-    {}
+    MessageTest() : obuffer(0), renderer(obuffer) {}
     static Question factoryFromFile(const char* datafile);
     OutputBuffer obuffer;
     MessageRenderer renderer;
@@ -92,16 +93,36 @@
 
 TEST_F(MessageTest, EDNS0DOBit)
 {
+    // Without EDNS0, DNSSEC is considered to be unsupported.
     factoryFromFile(message, "testdata/message_fromWire1");
     EXPECT_FALSE(message.isDNSSECSupported());
 
+    // If DO bit is on, DNSSEC is considered to be supported.
     message.clear();
     factoryFromFile(message, "testdata/message_fromWire2");
     EXPECT_TRUE(message.isDNSSECSupported());
 
+    // If DO bit is off, DNSSEC is considered to be unsupported.
     message.clear();
     factoryFromFile(message, "testdata/message_fromWire3");
     EXPECT_FALSE(message.isDNSSECSupported());
+}
+
+TEST_F(MessageTest, EDNS0UDPSize)
+{
+    // Without EDNS0, the default max UDP size is used.
+    factoryFromFile(message, "testdata/message_fromWire1");
+    EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message.getUDPSize());
+
+    // If the size specified in EDNS0 > default max, use it.
+    message.clear();
+    factoryFromFile(message, "testdata/message_fromWire2");
+    EXPECT_EQ(4096, message.getUDPSize());
+
+    // If the size specified in EDNS0 < default max, keep using the default.
+    message.clear();
+    factoryFromFile(message, "testdata/message_fromWire8");
+    EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message.getUDPSize());
 }
 
 TEST_F(MessageTest, BadEDNS0)
@@ -122,6 +143,10 @@
     // We accept it, but is it okay?
     message.clear();
     EXPECT_NO_THROW(factoryFromFile(message, "testdata/message_fromWire7"));
+    // Unsupported Version
+    message.clear();
+    EXPECT_THROW(factoryFromFile(message, "testdata/message_fromWire9"),
+                 DNSMessageBADVERS);
 }
 
 TEST_F(MessageTest, toWire)




More information about the bind10-changes mailing list