mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-04 16:05:17 +00:00
[#969] Fixed PrefixRange constructor
This commit is contained in:
@@ -45,9 +45,7 @@ PrefixRange::PrefixRange(const asiolink::IOAddress& prefix, const uint8_t length
|
|||||||
<< " must not be greater than 128");
|
<< " must not be greater than 128");
|
||||||
}
|
}
|
||||||
// Now calculate the last prefix in the range.
|
// Now calculate the last prefix in the range.
|
||||||
auto prefixes_num = prefixesInRange(prefix_length_, delegated_length_);
|
end_ = lastAddrInPrefix(prefix, length);
|
||||||
uint64_t addrs_in_prefix = static_cast<uint64_t>(1) << (128 - delegated_length_);
|
|
||||||
end_ = offsetAddress(prefix, (prefixes_num - 1) * addrs_in_prefix);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PrefixRange::PrefixRange(const asiolink::IOAddress& start, const asiolink::IOAddress& end,
|
PrefixRange::PrefixRange(const asiolink::IOAddress& start, const asiolink::IOAddress& end,
|
||||||
@@ -62,6 +60,10 @@ PrefixRange::PrefixRange(const asiolink::IOAddress& start, const asiolink::IOAdd
|
|||||||
if (end_ < start_) {
|
if (end_ < start_) {
|
||||||
isc_throw(BadValue, "invalid address range boundaries " << start_ << ":" << end_);
|
isc_throw(BadValue, "invalid address range boundaries " << start_ << ":" << end_);
|
||||||
}
|
}
|
||||||
|
if (prefix_length_ > 128) {
|
||||||
|
isc_throw(BadValue, "the " << start_ << ":" << end_
|
||||||
|
<< " does not constitute a valid prefix delegation range");
|
||||||
|
}
|
||||||
if (delegated_length_ > 128) {
|
if (delegated_length_ > 128) {
|
||||||
isc_throw(BadValue, "delegated length " << static_cast<int>(delegated_length_)
|
isc_throw(BadValue, "delegated length " << static_cast<int>(delegated_length_)
|
||||||
<< " must not be greater than 128");
|
<< " must not be greater than 128");
|
||||||
|
@@ -34,15 +34,39 @@ TEST(PrefixRangeTest, constructor) {
|
|||||||
boost::scoped_ptr<PrefixRange> range;
|
boost::scoped_ptr<PrefixRange> range;
|
||||||
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1::"), 64, 96)));
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1::"), 64, 96)));
|
||||||
EXPECT_EQ("2001:db8:1::", range->start_.toText());
|
EXPECT_EQ("2001:db8:1::", range->start_.toText());
|
||||||
EXPECT_EQ("2001:db8:1:0:ffff:ffff::", range->end_.toText());
|
EXPECT_EQ("2001:db8:1:0:ffff:ffff:ffff:ffff", range->end_.toText());
|
||||||
|
EXPECT_EQ(64, range->prefix_length_);
|
||||||
|
EXPECT_EQ(96, range->delegated_length_);
|
||||||
|
|
||||||
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), 80, 120)));
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), 80, 120)));
|
||||||
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
||||||
EXPECT_EQ("2001:db8:1:2:0:ffff:ffff:ff00", range->end_.toText());
|
EXPECT_EQ("2001:db8:1:2:0:ffff:ffff:ffff", range->end_.toText());
|
||||||
|
EXPECT_EQ(80, range->prefix_length_);
|
||||||
|
EXPECT_EQ(120, range->delegated_length_);
|
||||||
|
|
||||||
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), 80, 127)));
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), 120, 127)));
|
||||||
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
||||||
EXPECT_EQ("2001:db8:1:2:0:ffff:ffff:fffe", range->end_.toText());
|
EXPECT_EQ("2001:db8:1:2::ff", range->end_.toText());
|
||||||
|
EXPECT_EQ(120, range->prefix_length_);
|
||||||
|
EXPECT_EQ(127, range->delegated_length_);
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1::"), IOAddress("2001:db8:1:0:ffff:ffff:ffff:ffff"), 96)));
|
||||||
|
EXPECT_EQ("2001:db8:1::", range->start_.toText());
|
||||||
|
EXPECT_EQ("2001:db8:1:0:ffff:ffff:ffff:ffff", range->end_.toText());
|
||||||
|
EXPECT_EQ(64, range->prefix_length_);
|
||||||
|
EXPECT_EQ(96, range->delegated_length_);
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), IOAddress("2001:db8:1:2:0:ffff:ffff:ffff"), 120)));
|
||||||
|
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
||||||
|
EXPECT_EQ("2001:db8:1:2:0:ffff:ffff:ffff", range->end_.toText());
|
||||||
|
EXPECT_EQ(80, range->prefix_length_);
|
||||||
|
EXPECT_EQ(120, range->delegated_length_);
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(range.reset(new PrefixRange(IOAddress("2001:db8:1:2::"), IOAddress("2001:db8:1:2::ff"), 127)));
|
||||||
|
EXPECT_EQ("2001:db8:1:2::", range->start_.toText());
|
||||||
|
EXPECT_EQ("2001:db8:1:2::ff", range->end_.toText());
|
||||||
|
EXPECT_EQ(120, range->prefix_length_);
|
||||||
|
EXPECT_EQ(127, range->delegated_length_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test verifies that exception is thrown upon an attempt to
|
// This test verifies that exception is thrown upon an attempt to
|
||||||
@@ -58,6 +82,13 @@ TEST(PrefixRangeTest, constructorWithInvalidValues) {
|
|||||||
// End must not be lower than start.
|
// End must not be lower than start.
|
||||||
EXPECT_THROW(PrefixRange(IOAddress("2001:db8:1:1::6:0"), IOAddress("2001:db8:1::5:0"), 112),
|
EXPECT_THROW(PrefixRange(IOAddress("2001:db8:1:1::6:0"), IOAddress("2001:db8:1::5:0"), 112),
|
||||||
BadValue);
|
BadValue);
|
||||||
|
// Length must not exceed 128.
|
||||||
|
EXPECT_THROW(PrefixRange(IOAddress("2001:db8:1:1::"), IOAddress("2001:db8:1:f::"), 200),
|
||||||
|
BadValue);
|
||||||
|
// The upper boundary of the prefix range must have non-significant
|
||||||
|
// bits set to 1.
|
||||||
|
EXPECT_THROW(PrefixRange(IOAddress("2001:db8:1:1::"), IOAddress("2001:db8:1:1::ff00"), 112),
|
||||||
|
BadValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end of anonymous namespace
|
} // end of anonymous namespace
|
||||||
|
Reference in New Issue
Block a user