BIND 10 trac595, updated. 7de2a6f3f96d466ed24f7d8b24708a30ee679729 [trac595] commit the forgot change
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri Feb 25 02:12:59 UTC 2011
The branch, trac595 has been updated
via 7de2a6f3f96d466ed24f7d8b24708a30ee679729 (commit)
from 2e46317ec615067947983aa9ebcce371a6a8fd2f (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 7de2a6f3f96d466ed24f7d8b24708a30ee679729
Author: zhanglikun <zhanglikun at cnnic.cn>
Date: Fri Feb 25 10:10:11 2011 +0800
[trac595] commit the forgot change
-----------------------------------------------------------------------
Summary of changes:
src/lib/cache/message_entry.cc | 92 +++++++++++++++----------
src/lib/cache/tests/message_entry_unittest.cc | 67 +++++++++++++++---
2 files changed, 111 insertions(+), 48 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/cache/message_entry.cc b/src/lib/cache/message_entry.cc
index d4de11f..e296ed2 100644
--- a/src/lib/cache/message_entry.cc
+++ b/src/lib/cache/message_entry.cc
@@ -111,6 +111,42 @@ MessageEntry::genMessage(const time_t& time_now,
}
}
+// Get the deepest owner name of DNAME record for the given query name.
+static Name
+getDeepestDNAMEOwner(const Message& message, const Name& query_name) {
+ Name dname = query_name;
+ RRsetIterator rrset_iter = message.beginSection(Message::SECTION_ANSWER);
+ while(rrset_iter != message.endSection(Message::SECTION_ANSWER)) {
+ if ((*rrset_iter)->getType() == RRType::DNAME()) {
+ const Name& rrname = (*rrset_iter)->getName();
+ if (NameComparisonResult::SUBDOMAIN ==
+ dname.compare(rrname).getRelation()) {
+ dname = rrname;
+ }
+ }
+ ++rrset_iter;
+ }
+
+ return dname;
+}
+
+// Check whether answer section in given message has non-authoritative rrsets.
+static bool
+answerHasNonAuthRecord(const Message& message, const Name& query_name) {
+ RRsetIterator rrset_iter = message.beginSection(Message::SECTION_ANSWER);
+ while(rrset_iter != message.endSection(Message::SECTION_ANSWER)) {
+ // Here, only check CNAME is enough. If there is
+ // cname record whose ower name is same with query name, answer
+ // section may has non-authoritative rrsets.
+ if ((*rrset_iter)->getType() == RRType::CNAME() &&
+ (*rrset_iter)->getName() == query_name) {
+ return true;
+ }
+ ++rrset_iter;
+ }
+ return false;
+}
+
RRsetTrustLevel
MessageEntry::getRRsetTrustLevel(const Message& message,
const isc::dns::RRsetPtr& rrset,
@@ -120,48 +156,30 @@ MessageEntry::getRRsetTrustLevel(const Message& message,
switch(section) {
case Message::SECTION_ANSWER: {
if (aa) {
- RRsetIterator rrset_iter = message.beginSection(section);
-
- // Make sure we are inspecting the right RRset
- while((*rrset_iter)->getName() != rrset->getName() &&
- (*rrset_iter)->getType() != rrset->getType() &&
- rrset_iter != message.endSection(section)) {
- ++rrset_iter;
- }
- assert(rrset_iter != message.endSection(section));
-
// According RFC2181 section 5.4.1, only the record
// describing that ailas is necessarily authoritative.
- // If there is one or more CNAME records in answer section.
- // CNAME records is assumed as the first rrset.
- if ((*rrset_iter)->getType() == RRType::CNAME()) {
- // TODO: real equals for RRsets?
- if ((*rrset_iter).get() == rrset.get()) {
- return (RRSET_TRUST_ANSWER_AA);
- } else {
- return (RRSET_TRUST_ANSWER_NONAA);
- }
- }
-
- // Here, if the first rrset is DNAME, then assume the
- // second rrset is synchronized CNAME record, except
- // these two records, any other records in answer section
- // should be treated as non-authoritative.
- // TODO, this part logic should be revisited later,
- // since it's not mentioned by RFC2181.
- if ((*rrset_iter)->getType() == RRType::DNAME()) {
- // TODO: real equals for RRsets?
- if ((*rrset_iter).get() == rrset.get() ||
- ((++rrset_iter) != message.endSection(section) &&
- (*rrset_iter).get() == rrset.get())) {
- return (RRSET_TRUST_ANSWER_AA);
- } else {
- return (RRSET_TRUST_ANSWER_NONAA);
- }
+ // If there are CNAME(Not synchronized from DNAME)
+ // records in answer section, only the CNAME record
+ // whose owner name is same with qname is assumed as
+ // authoritative, all the left records are not authoritative.
+ //
+ // If there are DNAME records in answer section,
+ // Only the start DNAME and the synchronized CNAME record
+ // from it are authoritative, any other records in answer
+ // section are non-authoritative.
+ QuestionIterator quest_iter = message.beginQuestion();
+ const Name& query_name = (*quest_iter)->getName();
+ const RRType& type = rrset->getType();
+ const Name& name = rrset->getName();
+ if ((type == RRType::CNAME() && name == query_name) ||
+ (type == RRType::DNAME() &&
+ name == getDeepestDNAMEOwner(message, query_name))) {
+ return RRSET_TRUST_ANSWER_AA;
+ } else if (answerHasNonAuthRecord(message, query_name)) {
+ return RRSET_TRUST_ANSWER_NONAA;
}
return (RRSET_TRUST_ANSWER_AA);
-
} else {
return (RRSET_TRUST_ANSWER_NONAA);
}
diff --git a/src/lib/cache/tests/message_entry_unittest.cc b/src/lib/cache/tests/message_entry_unittest.cc
index 3b2711a..a96c441 100644
--- a/src/lib/cache/tests/message_entry_unittest.cc
+++ b/src/lib/cache/tests/message_entry_unittest.cc
@@ -29,7 +29,7 @@ using namespace isc;
using namespace isc::dns;
using namespace std;
-static uint32_t MAX_UINT32 = numeric_limits<uint32_t>::max();
+static uint32_t MAX_UINT32 = numeric_limits<uint32_t>::max();
namespace {
@@ -74,7 +74,6 @@ public:
message_parse(Message::PARSE),
message_render(Message::RENDER)
{
-
rrset_cache_.reset(new RRsetCache(RRSET_CACHE_DEFAULT_SIZE, class_));
}
@@ -108,7 +107,6 @@ TEST_F(MessageEntryTest, testParseRRset) {
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_AA) {
messageFromFile(message_parse, "message_fromWire3");
DerivedMessageEntry message_entry(message_parse, rrset_cache_);
-
RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
@@ -164,7 +162,54 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_CNAME) {
level = message_entry.getRRsetTrustLevelForTest(message_parse,
*rrset_iter,
Message::SECTION_ANSWER);
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_NONAA);
+}
+
+TEST_F(MessageEntryTest, testGetRRsetTrustLevel_CNAME_and_DNAME) {
+ messageFromFile(message_parse, "message_fromWire7");
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
+ RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
+ *rrset_iter,
+ Message::SECTION_ANSWER);
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_AA);
+ // All the left rrset are non-authoritative
+ ++rrset_iter;
+ while (rrset_iter != message_parse.endSection(Message::SECTION_ANSWER)) {
+ level = message_entry.getRRsetTrustLevelForTest(message_parse,
+ *rrset_iter,
+ Message::SECTION_ANSWER);
+ ++rrset_iter;
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_NONAA);
+ }
+}
+
+TEST_F(MessageEntryTest, testGetRRsetTrustLevel_DNAME_and_CNAME) {
+ messageFromFile(message_parse, "message_fromWire8");
+ DerivedMessageEntry message_entry(message_parse, rrset_cache_);
+ RRsetIterator rrset_iter = message_parse.beginSection(Message::SECTION_ANSWER);
+ RRsetTrustLevel level = message_entry.getRRsetTrustLevelForTest(message_parse,
+ *rrset_iter,
+ Message::SECTION_ANSWER);
+ // Test the deepest DNAME
EXPECT_EQ(level, RRSET_TRUST_ANSWER_AA);
+ ++rrset_iter;
+ // Test the synchronized CNAME
+ level = message_entry.getRRsetTrustLevelForTest(message_parse,
+ *rrset_iter,
+ Message::SECTION_ANSWER);
+ ++rrset_iter;
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_AA);
+
+ ++rrset_iter;
+ // All the left rrset are non-authoritative
+ while (rrset_iter != message_parse.endSection(Message::SECTION_ANSWER)) {
+ level = message_entry.getRRsetTrustLevelForTest(message_parse,
+ *rrset_iter,
+ Message::SECTION_ANSWER);
+ ++rrset_iter;
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_NONAA);
+ }
}
TEST_F(MessageEntryTest, testGetRRsetTrustLevel_DNAME) {
@@ -186,7 +231,7 @@ TEST_F(MessageEntryTest, testGetRRsetTrustLevel_DNAME) {
level = message_entry.getRRsetTrustLevelForTest(message_parse,
*rrset_iter,
Message::SECTION_ANSWER);
- EXPECT_EQ(level, RRSET_TRUST_ANSWER_AA);
+ EXPECT_EQ(level, RRSET_TRUST_ANSWER_NONAA);
}
// We only test the expire_time of the message entry.
@@ -204,8 +249,8 @@ TEST_F(MessageEntryTest, testGetRRsetEntries) {
messageFromFile(message_parse, "message_fromWire3");
DerivedMessageEntry message_entry(message_parse, rrset_cache_);
vector<RRsetEntryPtr> vec;
-
- // the time is bigger than the smallest expire time of
+
+ // the time is bigger than the smallest expire time of
// the rrset in message.
time_t expire_time = time(NULL) + 10802;
EXPECT_FALSE(message_entry.getRRsetEntriesForTest(vec, expire_time));
@@ -215,17 +260,17 @@ TEST_F(MessageEntryTest, testGenMessage) {
messageFromFile(message_parse, "message_fromWire3");
DerivedMessageEntry message_entry(message_parse, rrset_cache_);
time_t expire_time = message_entry.getExpireTime();
-
+
Message msg(Message::RENDER);
EXPECT_FALSE(message_entry.genMessage(expire_time + 2, msg));
message_entry.genMessage(time(NULL), msg);
// Check whether the generated message is same with cached one.
-
+
EXPECT_TRUE(msg.getHeaderFlag(Message::HEADERFLAG_AA));
EXPECT_FALSE(msg.getHeaderFlag(Message::HEADERFLAG_TC));
- EXPECT_EQ(1, sectionRRsetCount(msg, Message::SECTION_ANSWER));
- EXPECT_EQ(1, sectionRRsetCount(msg, Message::SECTION_AUTHORITY));
- EXPECT_EQ(5, sectionRRsetCount(msg, Message::SECTION_ADDITIONAL));
+ EXPECT_EQ(1, sectionRRsetCount(msg, Message::SECTION_ANSWER));
+ EXPECT_EQ(1, sectionRRsetCount(msg, Message::SECTION_AUTHORITY));
+ EXPECT_EQ(5, sectionRRsetCount(msg, Message::SECTION_ADDITIONAL));
// Check the rrset in answer section.
EXPECT_EQ(1, msg.getRRCount(Message::SECTION_ANSWER));
More information about the bind10-changes
mailing list