[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