]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#969] Fixed PrefixRange constructor
authorMarcin Siodelski <marcin@isc.org>
Thu, 5 Jan 2023 20:39:10 +0000 (21:39 +0100)
committerMarcin Siodelski <marcin@isc.org>
Sat, 7 Jan 2023 10:49:30 +0000 (11:49 +0100)
src/lib/dhcpsrv/ip_range.cc
src/lib/dhcpsrv/tests/ip_range_unittest.cc

index 271d55308931221303a458496a63bcf84cf5dd3b..bd0c1ee41757339c678b14592150def75ac08c6a 100644 (file)
@@ -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<uint64_t>(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<int>(delegated_length_)
                   << " must not be greater than 128");
index 754ab6f3c340e845d4b99e2921cdf0387da9ad8c..5ff4dd850c6e5f516d0101c9053975e8a438c17e 100644 (file)
@@ -34,15 +34,39 @@ TEST(PrefixRangeTest, constructor) {
     boost::scoped_ptr<PrefixRange> 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