diff --git a/src/lib/dhcpsrv/ip_range.cc b/src/lib/dhcpsrv/ip_range.cc index 271d553089..bd0c1ee417 100644 --- a/src/lib/dhcpsrv/ip_range.cc +++ b/src/lib/dhcpsrv/ip_range.cc @@ -45,9 +45,7 @@ PrefixRange::PrefixRange(const asiolink::IOAddress& prefix, const uint8_t length << " must not be greater than 128"); } // Now calculate the last prefix in the range. - auto prefixes_num = prefixesInRange(prefix_length_, delegated_length_); - uint64_t addrs_in_prefix = static_cast(1) << (128 - delegated_length_); - end_ = offsetAddress(prefix, (prefixes_num - 1) * addrs_in_prefix); + end_ = lastAddrInPrefix(prefix, length); } 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_) { 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) { isc_throw(BadValue, "delegated length " << static_cast(delegated_length_) << " must not be greater than 128"); diff --git a/src/lib/dhcpsrv/tests/ip_range_unittest.cc b/src/lib/dhcpsrv/tests/ip_range_unittest.cc index 754ab6f3c3..5ff4dd850c 100644 --- a/src/lib/dhcpsrv/tests/ip_range_unittest.cc +++ b/src/lib/dhcpsrv/tests/ip_range_unittest.cc @@ -34,15 +34,39 @@ TEST(PrefixRangeTest, constructor) { boost::scoped_ptr range; 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: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))); 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: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 @@ -58,6 +82,13 @@ TEST(PrefixRangeTest, constructorWithInvalidValues) { // End must not be lower than start. EXPECT_THROW(PrefixRange(IOAddress("2001:db8:1:1::6:0"), IOAddress("2001:db8:1::5:0"), 112), 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