]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5425] Checkpoint: alloc done, new tests todo
authorFrancis Dupont <fdupont@isc.org>
Mon, 20 Nov 2017 14:46:58 +0000 (15:46 +0100)
committerFrancis Dupont <fdupont@isc.org>
Mon, 20 Nov 2017 14:46:58 +0000 (15:46 +0100)
13 files changed:
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/alloc_engine.h
src/lib/dhcpsrv/pool.cc
src/lib/dhcpsrv/pool.h
src/lib/dhcpsrv/subnet.cc
src/lib/dhcpsrv/subnet.h
src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc
src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc
src/lib/dhcpsrv/tests/alloc_engine_utils.h
src/lib/dhcpsrv/tests/pool_unittest.cc
src/lib/dhcpsrv/tests/subnet_unittest.cc

index dcc3bf2377df500a97ba467c09b6eeaa2cc3895f..c2cdcbbe5cd9bbbbce0b146408f4d13d50b31199 100644 (file)
@@ -4144,47 +4144,47 @@ TEST_F(Dhcp4ParserTest, classifyPools) {
     // everyone).
     ClientClasses classes;
     classes.insert("alpha");
-    EXPECT_TRUE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(3)->clientSupported(classes));
+    EXPECT_TRUE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to beta class is supported in pool[1]
     // and not supported in any other pool  (except pools[3], which allows
     // everyone).
     classes.clear();
     classes.insert("beta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to gamma class is supported in pool[2]
     // and not supported in any other pool  (except pool[3], which allows
     // everyone).
     classes.clear();
     classes.insert("gamma");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to some other class (not mentioned in
     // the config) is supported only in pool[3], which allows everyone.
     classes.clear();
     classes.insert("delta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(3)->clientSupported(classes, false));
 
     // Finally, let's check class-less client. He should be allowed only in
     // the last pool, which does not have any class restrictions.
     classes.clear();
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE(pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE(pools.at(3)->clientSupported(classes, false));
 }
 
 // This test verifies that the host reservations can be specified for
index b29fd5840fb0a603c91adef1331d0b7294a37417..27f4edc1296b61d0fe71e0e7b5aa59d5242d37dd 100644 (file)
@@ -4181,47 +4181,47 @@ TEST_F(Dhcp6ParserTest, classifyPools) {
     // everyone).
     ClientClasses classes;
     classes.insert("alpha");
-    EXPECT_TRUE (pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_TRUE (pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to beta class is supported in pool[1]
     // and not supported in any other pool  (except pool[3], which allows
     // everyone).
     classes.clear();
     classes.insert("beta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to gamma class is supported in pool[2]
     // and not supported in any other pool  (except pool[3], which allows
     // everyone).
     classes.clear();
     classes.insert("gamma");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to some other class (not mentioned in
     // the config) is supported only in pool[3], which allows everyone.
     classes.clear();
     classes.insert("delta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Finally, let's check class-less client. He should be allowed only in
     // the last pool, which does not have any class restrictions.
     classes.clear();
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 }
 
 // Goal of this test is to verify that multiple pdpools can be configured
@@ -4279,47 +4279,47 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) {
     // everyone).
     ClientClasses classes;
     classes.insert("alpha");
-    EXPECT_TRUE (pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_TRUE (pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to beta class is supported in pool[1]
     // and not supported in any other pool  (except pool[3], which allows
     // everyone).
     classes.clear();
     classes.insert("beta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to gamma class is supported in pool[2]
     // and not supported in any other pool  (except pool[3], which allows
     // everyone).
     classes.clear();
     classes.insert("gamma");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Let's check if client belonging to some other class (not mentioned in
     // the config) is supported only in pool[3], which allows everyone.
     classes.clear();
     classes.insert("delta");
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 
     // Finally, let's check class-less client. He should be allowed only in
     // the last pool, which does not have any class restrictions.
     classes.clear();
-    EXPECT_FALSE(pools.at(0)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(1)->clientSupported(classes));
-    EXPECT_FALSE(pools.at(2)->clientSupported(classes));
-    EXPECT_TRUE (pools.at(3)->clientSupported(classes));
+    EXPECT_FALSE(pools.at(0)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(1)->clientSupported(classes, false));
+    EXPECT_FALSE(pools.at(2)->clientSupported(classes, false));
+    EXPECT_TRUE (pools.at(3)->clientSupported(classes, false));
 }
 
 // This test checks the ability of the server to parse a configuration
index d608de1b28e6be6f9742fc7c3623a0d11de75db8..7e8015fc1c3c6d54bc9eabe050824840c74fdcac 100644 (file)
@@ -158,6 +158,7 @@ AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress&
 isc::asiolink::IOAddress
 AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet,
                                              const ClientClasses& client_classes,
+                                             bool known_client,
                                              const DuidPtr&,
                                              const IOAddress&) {
 
@@ -183,7 +184,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet,
     PoolCollection::const_iterator first = pools.end();
     PoolPtr first_pool;
     for (it = pools.begin(); it != pools.end(); ++it) {
-        if (!(*it)->clientSupported(client_classes)) {
+        if (!(*it)->clientSupported(client_classes, known_client)) {
             continue;
         }
         if (first == pools.end()) {
@@ -212,7 +213,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet,
         // Trying next pool
         if (retrying) {
             for (; it != pools.end(); ++it) {
-                if ((*it)->clientSupported(client_classes)) {
+                if ((*it)->clientSupported(client_classes, known_client)) {
                     break;
                 }
             }
@@ -271,7 +272,7 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet,
 
     // Let's rewind to the beginning.
     for (it = first; it != pools.end(); ++it) {
-        if ((*it)->clientSupported(client_classes)) {
+        if ((*it)->clientSupported(client_classes, known_client)) {
             (*it)->setLastAllocated((*it)->getFirstAddress());
             (*it)->resetLastAllocated();
         }
@@ -293,6 +294,7 @@ AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type)
 isc::asiolink::IOAddress
 AllocEngine::HashedAllocator::pickAddress(const SubnetPtr&,
                                           const ClientClasses&,
+                                          bool known_client,
                                           const DuidPtr&,
                                           const IOAddress&) {
     isc_throw(NotImplemented, "Hashed allocator is not implemented");
@@ -307,6 +309,7 @@ AllocEngine::RandomAllocator::RandomAllocator(Lease::Type lease_type)
 isc::asiolink::IOAddress
 AllocEngine::RandomAllocator::pickAddress(const SubnetPtr&,
                                           const ClientClasses&,
+                                          bool known_client,
                                           const DuidPtr&,
                                           const IOAddress&) {
     isc_throw(NotImplemented, "Random allocator is not implemented");
@@ -447,7 +450,8 @@ inAllowedPool(AllocEngine::ClientContext6& ctx, const Lease::Type& lease_type,
                 }
             } else {
                 if (current_subnet->inPool(lease_type, address,
-                                           ctx.query_->getClasses())) {
+                                           ctx.query_->getClasses(),
+                                           !ctx.hosts_.empty())) {
                     return (true);
                 }
             }
@@ -752,10 +756,12 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
         // check if the hint is in pool and is available
         // This is equivalent of subnet->inPool(hint), but returns the pool
         pool = boost::dynamic_pointer_cast<Pool6>
-            (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), hint));
+            (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(),
+                             !ctx.hosts_.empty(), hint));
 
         // check if the pool is allowed
-        if (pool && !pool->clientSupported(ctx.query_->getClasses())) {
+        if (pool && !pool->clientSupported(ctx.query_->getClasses(),
+                                           !ctx.hosts_.empty())) {
             pool.reset();
         }
 
@@ -857,7 +863,8 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
         // - we exhaust number of tries
         uint64_t possible_attempts =
             subnet->getPoolCapacity(ctx.currentIA().type_,
-                                    ctx.query_->getClasses());
+                                    ctx.query_->getClasses(),
+                                    !ctx.hosts_.empty());
         // Try next subnet if there is no chance to get something
         if (possible_attempts == 0) {
             subnet = subnet->getNextSubnet(original_subnet);
@@ -871,6 +878,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
 
             IOAddress candidate = allocator->pickAddress(subnet,
                                                          ctx.query_->getClasses(),
+                                                         !ctx.hosts_.empty(),
                                                          ctx.duid_,
                                                          hint);
 
@@ -889,7 +897,10 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
             uint8_t prefix_len = 128;
             if (ctx.currentIA().type_ == Lease::TYPE_PD) {
                 pool = boost::dynamic_pointer_cast<Pool6>(
-                        subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), candidate));
+                        subnet->getPool(ctx.currentIA().type_,
+                                        ctx.query_->getClasses(),
+                                        !ctx.hosts_.empty(),
+                                        candidate));
                 if (pool) {
                     prefix_len = pool->getLength();
                 }
@@ -2626,7 +2637,8 @@ inAllowedPool(AllocEngine::ClientContext4& ctx, const IOAddress& address) {
     while (current_subnet) {
 
         if (current_subnet->inPool(Lease::TYPE_V4, address,
-                                   ctx.query_->getClasses())) {
+                                   ctx.query_->getClasses(),
+                                   !ctx.hosts_.empty())) {
             // We found a subnet that this address belongs to, so it
             // seems that this subnet is the good candidate for allocation.
             // Let's update the selected subnet.
@@ -3354,7 +3366,8 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) {
 
         uint64_t possible_attempts =
             subnet->getPoolCapacity(Lease::TYPE_V4,
-                                    ctx.query_->getClasses());
+                                    ctx.query_->getClasses(),
+                                    !ctx.hosts_.empty());
         uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts);
         // Skip trying if there is no chance to get something
         if (possible_attempts == 0) {
@@ -3364,6 +3377,7 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) {
         for (uint64_t i = 0; i < max_attempts; ++i) {
             IOAddress candidate = allocator->pickAddress(subnet,
                                                          ctx.query_->getClasses(),
+                                                         !ctx.hosts_.empty(),
                                                          client_id,
                                                          ctx.requested_address_);
             // If address is not reserved for another client, try to allocate it.
index af5c44da217b2d0b8b5c49ee5d8b0d06e512043f..251db83e3b96176f0158dc5b640733ef532fcdcc 100644 (file)
@@ -83,7 +83,7 @@ protected:
         ///
         /// @param subnet next address will be returned from pool of that subnet
         /// @param client_classes list of classes client belongs to
-
+        /// @param known_client client has a reservation
         /// @param duid Client's DUID
         /// @param hint client's hint
         ///
@@ -91,6 +91,7 @@ protected:
         virtual isc::asiolink::IOAddress
         pickAddress(const SubnetPtr& subnet,
                     const ClientClasses& client_classes,
+                    bool known_client,
                     const DuidPtr& duid,
                     const isc::asiolink::IOAddress& hint) = 0;
 
@@ -133,12 +134,14 @@ protected:
         ///
         /// @param subnet next address will be returned from pool of that subnet
         /// @param client_classes list of classes client belongs to
+        /// @param known_client client has a reservation
         /// @param duid Client's DUID (ignored)
         /// @param hint client's hint (ignored)
         /// @return the next address
         virtual isc::asiolink::IOAddress
             pickAddress(const SubnetPtr& subnet,
                         const ClientClasses& client_classes,
+                        bool known_client,
                         const DuidPtr& duid,
                         const isc::asiolink::IOAddress& hint);
     protected:
@@ -188,12 +191,14 @@ protected:
         ///
         /// @param subnet an address will be picked from pool of that subnet
         /// @param client_classes list of classes client belongs to
+        /// @param known_client client has a reservation
         /// @param duid Client's DUID
         /// @param hint a hint (last address that was picked)
         /// @return selected address
         virtual isc::asiolink::IOAddress
             pickAddress(const SubnetPtr& subnet,
                         const ClientClasses& client_classes,
+                        bool known_client,
                         const DuidPtr& duid,
                         const isc::asiolink::IOAddress& hint);
     };
@@ -219,6 +224,7 @@ protected:
         virtual isc::asiolink::IOAddress
         pickAddress(const SubnetPtr& subnet,
                     const ClientClasses& client_classes,
+                    bool known_client,
                     const DuidPtr& duid,
                     const isc::asiolink::IOAddress& hint);
     };
index da3258f2b9c7f87fc4790f12304aee5d481546c0..9e6aca638963a5979a268d0db23b6436da830ff6 100644 (file)
@@ -27,21 +27,39 @@ bool Pool::inRange(const isc::asiolink::IOAddress& addr) const {
     return (first_.smallerEqual(addr) && addr.smallerEqual(last_));
 }
 
-bool Pool::clientSupported(const ClientClasses& classes) const {
+bool Pool::clientSupported(const ClientClasses& classes,
+                           bool known_client) const {
+    bool match = false;
     if (white_list_.empty()) {
         // There is no class defined for this pool, so we do
         // support everyone.
-        return (true);
+        match = true;
+    } else {
+
+        for (ClientClasses::const_iterator it = white_list_.begin();
+             it != white_list_.end(); ++it) {
+            if (classes.contains(*it)) {
+                match = true;
+                break;
+            }
+        }
     }
 
-    for (ClientClasses::const_iterator it = white_list_.begin();
-         it != white_list_.end(); ++it) {
-        if (classes.contains(*it)) {
-            return (true);
-        }
+    if (!match) {
+        return (false);
     }
 
-    return (false);
+    switch (known_clients_) {
+    case SERVE_BOTH:
+        return (true);
+    case SERVE_KNOWN:
+        return (known_client);
+    case SERVE_UNKNOWN:
+        return (!known_client);
+    default:
+        // Saninity check for an impossible condition
+        isc_throw(BadValue, "Invalid value of known clients");
+    }
 }
 
 void Pool::allowClientClass(const ClientClass& class_name) {
index d74022ac331712cd46d5984fd42512dcaebf0d41..d4fb980364bd0566b4266f312be2174e14fafaf6 100644 (file)
@@ -121,8 +121,11 @@ public:
     /// is known to be improved.
     ///
     /// @param client_classes list of all classes the client belongs to
+    /// @param known_client true if the client is known, i.e. has a
+    /// reservation
     /// @return true if client can be supported, false otherwise
-    bool clientSupported(const ClientClasses& client_classes) const;
+    bool clientSupported(const ClientClasses& client_classes,
+                         bool known_client) const;
 
     /// @brief Adds class class_name to the list of supported classes
     ///
index 8585264aa9f2060e05a33403a4d74498cbb3d107..31d285c7edb393698b13260789335b3cfa5e8847 100644 (file)
@@ -136,15 +136,16 @@ Subnet::getPoolCapacity(Lease::Type type) const {
 
 uint64_t
 Subnet::getPoolCapacity(Lease::Type type,
-                        const ClientClasses& client_classes) const {
+                        const ClientClasses& client_classes,
+                        bool known_client) const {
     switch (type) {
     case Lease::TYPE_V4:
     case Lease::TYPE_NA:
-        return sumPoolCapacity(pools_, client_classes);
+        return sumPoolCapacity(pools_, client_classes, known_client);
     case Lease::TYPE_TA:
-        return sumPoolCapacity(pools_ta_, client_classes);
+        return sumPoolCapacity(pools_ta_, client_classes, known_client);
     case Lease::TYPE_PD:
-        return sumPoolCapacity(pools_pd_, client_classes);
+        return sumPoolCapacity(pools_pd_, client_classes, known_client);
     default:
         isc_throw(BadValue, "Unsupported pool type: "
                   << static_cast<int>(type));
@@ -171,10 +172,11 @@ Subnet::sumPoolCapacity(const PoolCollection& pools) const {
 
 uint64_t
 Subnet::sumPoolCapacity(const PoolCollection& pools,
-                        const ClientClasses& client_classes) const {
+                        const ClientClasses& client_classes,
+                        bool known_client) const {
     uint64_t sum = 0;
     for (PoolCollection::const_iterator p = pools.begin(); p != pools.end(); ++p) {
-        if (!(*p)->clientSupported(client_classes)) {
+        if (!(*p)->clientSupported(client_classes, known_client)) {
             continue;
         }
         uint64_t x = (*p)->getCapacity();
@@ -370,6 +372,7 @@ const PoolPtr Subnet::getPool(Lease::Type type, const isc::asiolink::IOAddress&
 
 const PoolPtr Subnet::getPool(Lease::Type type,
                               const ClientClasses& client_classes,
+                              bool known_client,
                               const isc::asiolink::IOAddress& hint) const {
     // check if the type is valid (and throw if it isn't)
     checkType(type);
@@ -385,7 +388,8 @@ const PoolPtr Subnet::getPool(Lease::Type type,
 
         if (ub != pools.begin()) {
             --ub;
-            if ((*ub)->inRange(hint) && (*ub)->clientSupported(client_classes)) {
+            if ((*ub)->inRange(hint) &&
+                (*ub)->clientSupported(client_classes, known_client)) {
                 candidate = *ub;
             }
         }
@@ -478,7 +482,8 @@ Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const {
 bool
 Subnet::inPool(Lease::Type type,
                const isc::asiolink::IOAddress& addr,
-               const ClientClasses& client_classes) const {
+               const ClientClasses& client_classes,
+               bool known_client) const {
 
     // Let's start with checking if it even belongs to that subnet.
     if ((type != Lease::TYPE_PD) && !inRange(addr)) {
@@ -489,7 +494,7 @@ Subnet::inPool(Lease::Type type,
 
     for (PoolCollection::const_iterator pool = pools.begin();
          pool != pools.end(); ++pool) {
-        if (!(*pool)->clientSupported(client_classes)) {
+        if (!(*pool)->clientSupported(client_classes, known_client)) {
             continue;
         }
         if ((*pool)->inRange(addr)) {
index dacdad8d0565884c39b98ab0ad0bfcaf72baa471..5aa3640b7ba7966b065ad56fc1ef79b1ef5b0b6d 100644 (file)
@@ -56,16 +56,18 @@ public:
 
     /// @brief checks if the specified address is in allowed pools
     ///
-    /// This takes also into account client classes
+    /// This takes also into account client classes and known client
     ///
     /// @param type type of pools to iterate over
     /// @param addr this address will be checked if it belongs to any pools in
     ///        that subnet
     /// @param client_classes client class list which must be allowed
+    /// @param known_client true if the client is known, i.e. has a reservation
     /// @return true if the address is in any of the allowed pools
     bool inPool(Lease::Type type,
                 const isc::asiolink::IOAddress& addr,
-                const ClientClasses& client_classes) const;
+                const ClientClasses& client_classes,
+                bool known_client) const;
 
     /// @brief returns the last address that was tried from this subnet
     ///
@@ -157,13 +159,15 @@ public:
 
     /// @brief Returns a pool that specified address belongs to with classes
     ///
-    /// Variant using only pools allowing given classes
+    /// Variant using only pools allowing given classes and known clients
     ///
     /// @param type pool type that the pool is looked for
     /// @param client_classes client class list which must be allowed
+    /// @param known_client true if the client is known, i.e. has a reservation
     /// @param addr address that the returned pool should cover (optional)
     const PoolPtr getPool(Lease::Type type,
                           const ClientClasses& client_classes,
+                          bool known_client,
                           const isc::asiolink::IOAddress& addr) const;
 
     /// @brief Returns a pool without any address specified
@@ -194,12 +198,15 @@ public:
     uint64_t getPoolCapacity(Lease::Type type) const;
 
     /// @brief Returns the number of possible leases for specified lease type
-    /// allowed for a client which belongs to classes.
+    /// allowed for a client which belongs to classes and matches known
+    /// clients constraint.
     ///
     /// @param type type of the lease
     /// @param client_classes List of classes the client belongs to.
+    /// @param known_client true if the client is known, i.e. has a reservation
     uint64_t getPoolCapacity(Lease::Type type,
-                             const ClientClasses& client_classes) const;
+                             const ClientClasses& client_classes,
+                             bool known_client) const;
 
     /// @brief Returns textual representation of the subnet (e.g.
     /// "2001:db8::/64")
@@ -335,9 +342,11 @@ protected:
     /// @brief returns a sum of possible leases in all pools allowing classes
     /// @param pools list of pools
     /// @param client_classes list of classes
+    /// @param known_client true if the client is known, i.e. has a reservation
     /// @return sum of possible/allowed leases
     uint64_t sumPoolCapacity(const PoolCollection& pools,
-                             const ClientClasses& client_classes) const;
+                             const ClientClasses& client_classes,
+                             bool known_client) const;
 
     /// @brief Checks if the specified pool overlaps with an existing pool.
     ///
index 3e1a37058056cfd6407e393ee4c7d9fe56c1f9c5..66329452a23cb1f3f214a30dd216b6b8f1c7e532 100644 (file)
@@ -326,7 +326,8 @@ TEST_F(AllocEngine4Test, IterativeAllocator) {
         alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4));
 
     for (int i = 0; i < 1000; ++i) {
-        IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_,
+        IOAddress candidate = alloc->pickAddress(subnet_, cc_,
+                                                 known_client_, clientid_,
                                                  IOAddress("0.0.0.0"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate));
     }
@@ -349,10 +350,11 @@ TEST_F(AllocEngine4Test, IterativeAllocator_class) {
     cc_.insert("bar");
 
     for (int i = 0; i < 1000; ++i) {
-        IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_,
+        IOAddress candidate = alloc->pickAddress(subnet_, cc_,
+                                                 known_client_, clientid_,
                                                  IOAddress("0.0.0.0"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate));
-        EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_));
+        EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_, known_client_));
     }
 }
 
@@ -382,7 +384,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator_manyPools4) {
     std::set<IOAddress> generated_addrs;
     int cnt = 0;
     while (++cnt) {
-        IOAddress candidate = alloc.pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0"));
+        IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_, clientid_, IOAddress("0.0.0.0"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate));
 
         // One way to easily verify that the iterative allocator really works is
index e96ebbd37bbe276c9465c5846554d03179e4b9c5..09dd38f7cf97a51930f40ebd10daae919f848b34 100644 (file)
@@ -189,7 +189,8 @@ TEST_F(AllocEngine6Test, IterativeAllocator) {
         alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA));
 
     for (int i = 0; i < 1000; ++i) {
-        IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::"));
+        IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_,
+                                                 duid_, IOAddress("::"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate));
     }
 }
@@ -211,9 +212,10 @@ TEST_F(AllocEngine6Test, IterativeAllocator_class) {
     cc_.insert("bar");
 
     for (int i = 0; i < 1000; ++i) {
-        IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::"));
+        IOAddress candidate = alloc->pickAddress(subnet_, cc_, known_client_,
+                                                 duid_, IOAddress("::"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate));
-        EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_));
+        EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_, known_client_));
     }
 }
 
@@ -233,23 +235,43 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) {
     subnet_->addPool(pool3);
 
     // Let's check the first pool (5 addresses here)
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::3",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::4",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::5",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // The second pool is easy - only one address here
-    EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::100",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // This is the third and last pool, with 2 addresses in it
-    EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::105",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::106",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // We iterated over all addresses and reached to the end of the last pool.
     // Let's wrap around and start from the beginning
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) {
@@ -274,23 +296,43 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) {
     cc_.insert("foo");
 
     // Let's check the first pool (5 addresses here)
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::3",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::4",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::5",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // The second pool is easy - only one address here
-    EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::100",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // This is the third and last pool, with 2 addresses in it
-    EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::105",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::106",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // We iterated over all addresses and reached to the end of the last pool.
     // Let's wrap around and start from the beginning
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) {
@@ -311,22 +353,40 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) {
     subnet_->addPool(pool3);
 
     // Let's check the first pool (5 addresses here)
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::3",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::4",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::5",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // The second pool is skipped
 
     // This is the third and last pool, with 2 addresses in it
-    EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::105",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::106",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // We iterated over all addresses and reached to the end of the last pool.
     // Let's wrap around and start from the beginning
-    EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::1",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::2",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) {
@@ -347,41 +407,85 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) {
     // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::)
 
     // First pool check (Let's check over all 16 leases)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:20::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:30::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:40::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:50::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:60::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:70::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:80::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:90::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:a0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:b0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:c0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:d0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:e0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:f0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Second pool (just one lease here)
-    EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Third pool (256 leases, let's check first and last explicitly and the
     // rest over in a pool
-    EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
     for (int i = 1; i < 255; i++) {
         stringstream exp;
         exp << "2001:db8:2:" << hex << i << dec << "::";
-        EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+        EXPECT_EQ(exp.str(),
+                  alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                    IOAddress("::")).toText());
 
     }
-    EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2:ff::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Ok, we've iterated over all prefixes in all pools. We now wrap around.
     // We're looping over now (iterating over first pool again)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) {
@@ -408,41 +512,85 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) {
     // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::)
 
     // First pool check (Let's check over all 16 leases)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:20::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:30::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:40::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:50::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:60::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:70::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:80::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:90::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:a0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:b0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:c0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:d0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:e0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:f0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Second pool (just one lease here)
-    EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:1::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Third pool (256 leases, let's check first and last explicitly and the
     // rest over in a pool
-    EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
     for (int i = 1; i < 255; i++) {
         stringstream exp;
         exp << "2001:db8:2:" << hex << i << dec << "::";
-        EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+        EXPECT_EQ(exp.str(),
+                  alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                    IOAddress("::")).toText());
 
     }
-    EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2:ff::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Ok, we've iterated over all prefixes in all pools. We now wrap around.
     // We're looping over now (iterating over first pool again)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) {
@@ -465,40 +613,82 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) {
     // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::)
 
     // First pool check (Let's check over all 16 leases)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:20::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:30::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:40::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:50::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:60::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:70::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:80::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:90::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:a0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:b0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:c0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:d0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:e0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:f0::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // The second pool is skipped
 
     // Third pool (256 leases, let's check first and last explicitly and the
     // rest over in a pool
-    EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
     for (int i = 1; i < 255; i++) {
         stringstream exp;
         exp << "2001:db8:2:" << hex << i << dec << "::";
-        EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+        EXPECT_EQ(exp.str(),
+                  alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                    IOAddress("::")).toText());
 
     }
-    EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:2:ff::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 
     // Ok, we've iterated over all prefixes in all pools. We now wrap around.
     // We're looping over now (iterating over first pool again)
-    EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
-    EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
+    EXPECT_EQ("2001:db8:0:10::",
+              alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                IOAddress("::")).toText());
 }
 
 // This test verifies that the iterative allocator can step over addresses
@@ -506,7 +696,8 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) {
     NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA);
 
     // Let's pick the first address
-    IOAddress addr1 = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("2001:db8:1::10"));
+    IOAddress addr1 = alloc.pickAddress(subnet_, cc_, known_client_, duid_,
+                                        IOAddress("2001:db8:1::10"));
 
     // Check that we can indeed pick the first address from the pool
     EXPECT_EQ("2001:db8:1::10", addr1.toText());
@@ -596,7 +787,8 @@ TEST_F(AllocEngine6Test, IterativeAllocator_manyPools6) {
     std::set<IOAddress> generated_addrs;
     int cnt = 0;
     while (++cnt) {
-        IOAddress candidate = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::"));
+        IOAddress candidate = alloc.pickAddress(subnet_, cc_, known_client_,
+                                                duid_, IOAddress("::"));
         EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate));
 
         // One way to easily verify that the iterative allocator really works is
@@ -634,8 +826,9 @@ TEST_F(AllocEngine6Test, smallPool6) {
     IOAddress addr("2001:db8:1::ad");
 
     // Create a subnet with a pool that has one address.
-    initSubnet(IOAddress("2001:db8:1::"), addr, addr);
-
+    initSubnet(IOAddress("2001:db8:1::"),
+               addr, addr);
+    
     // Initialize FQDN for a lease.
     initFqdn("myhost.example.com", true, true);
 
index eeed469755caeab813b2f9ebce8438b5fa4b37cd..1d20f0fc69b840027831d174c9dc2c2e93de4cb8 100644 (file)
@@ -411,6 +411,7 @@ public:
     bool fqdn_rev_;           ///< Perform reverse update for a lease.
     LeaseMgrFactory factory_; ///< pointer to LeaseMgr factory
     ClientClasses cc_;        ///< client classes
+    bool known_client_;       ///< client has a reservation
 };
 
 /// @brief Used in Allocation Engine tests for IPv4
@@ -513,6 +514,7 @@ public:
     LeaseMgrFactory factory_;   ///< Pointer to LeaseMgr factory
     AllocEngine::ClientContext4 ctx_; ///< Context information passed to various
     ClientClasses cc_;          ///< Client classes
+    bool known_client_;         ///< client has a reservation
                                      ///< allocation engine functions.
 };
 
index d720c2b023e21f0f79d44b7d59f5db2e09093a3a..bc54a7ed0b25276af205c8cba524004daf1669e6 100644 (file)
@@ -215,19 +215,19 @@ TEST(Pool4Test, clientClass) {
 
     // No class restrictions defined, any client should be supported
     EXPECT_EQ(0, pool->getClientClasses().size());
-    EXPECT_TRUE(pool->clientSupported(no_class));
-    EXPECT_TRUE(pool->clientSupported(foo_class));
-    EXPECT_TRUE(pool->clientSupported(bar_class));
-    EXPECT_TRUE(pool->clientSupported(three_classes));
+    EXPECT_TRUE(pool->clientSupported(no_class, false));
+    EXPECT_TRUE(pool->clientSupported(foo_class, false));
+    EXPECT_TRUE(pool->clientSupported(bar_class, false));
+    EXPECT_TRUE(pool->clientSupported(three_classes, false));
 
     // Let's allow only clients belonging to "bar" class.
     pool->allowClientClass("bar");
     EXPECT_EQ(1, pool->getClientClasses().size());
 
-    EXPECT_FALSE(pool->clientSupported(no_class));
-    EXPECT_FALSE(pool->clientSupported(foo_class));
-    EXPECT_TRUE(pool->clientSupported(bar_class));
-    EXPECT_TRUE(pool->clientSupported(three_classes));
+    EXPECT_FALSE(pool->clientSupported(no_class, false));
+    EXPECT_FALSE(pool->clientSupported(foo_class, false));
+    EXPECT_TRUE(pool->clientSupported(bar_class, false));
+    EXPECT_TRUE(pool->clientSupported(three_classes, false));
 }
 
 // This test checks that handling for multiple client-classes is valid.
@@ -249,9 +249,9 @@ TEST(Pool4Test, clientClasses) {
 
     // No class restrictions defined, any client should be supported
     EXPECT_EQ(0, pool->getClientClasses().size());
-    EXPECT_TRUE(pool->clientSupported(no_class));
-    EXPECT_TRUE(pool->clientSupported(foo_class));
-    EXPECT_TRUE(pool->clientSupported(bar_class));
+    EXPECT_TRUE(pool->clientSupported(no_class, false));
+    EXPECT_TRUE(pool->clientSupported(foo_class, false));
+    EXPECT_TRUE(pool->clientSupported(bar_class, false));
 
     // Let's allow clients belonging to "bar" or "foo" class.
     pool->allowClientClass("bar");
@@ -259,13 +259,13 @@ TEST(Pool4Test, clientClasses) {
     EXPECT_EQ(2, pool->getClientClasses().size());
 
     // Class-less clients are to be rejected.
-    EXPECT_FALSE(pool->clientSupported(no_class));
+    EXPECT_FALSE(pool->clientSupported(no_class, false));
 
     // Clients in foo class should be accepted.
-    EXPECT_TRUE(pool->clientSupported(foo_class));
+    EXPECT_TRUE(pool->clientSupported(foo_class, false));
 
     // Clients in bar class should be accepted as well.
-    EXPECT_TRUE(pool->clientSupported(bar_class));
+    EXPECT_TRUE(pool->clientSupported(bar_class, false));
 }
 
 // This test checks that handling for known-clients is valid.
@@ -633,19 +633,19 @@ TEST(Pool6Test, clientClass) {
 
     // No class restrictions defined, any client should be supported
     EXPECT_EQ(0, pool.getClientClasses().size());
-    EXPECT_TRUE(pool.clientSupported(no_class));
-    EXPECT_TRUE(pool.clientSupported(foo_class));
-    EXPECT_TRUE(pool.clientSupported(bar_class));
-    EXPECT_TRUE(pool.clientSupported(three_classes));
+    EXPECT_TRUE(pool.clientSupported(no_class, false));
+    EXPECT_TRUE(pool.clientSupported(foo_class, false));
+    EXPECT_TRUE(pool.clientSupported(bar_class, false));
+    EXPECT_TRUE(pool.clientSupported(three_classes, false));
 
     // Let's allow only clients belonging to "bar" class.
     pool.allowClientClass("bar");
     EXPECT_EQ(1, pool.getClientClasses().size());
 
-    EXPECT_FALSE(pool.clientSupported(no_class));
-    EXPECT_FALSE(pool.clientSupported(foo_class));
-    EXPECT_TRUE(pool.clientSupported(bar_class));
-    EXPECT_TRUE(pool.clientSupported(three_classes));
+    EXPECT_FALSE(pool.clientSupported(no_class, false));
+    EXPECT_FALSE(pool.clientSupported(foo_class, false));
+    EXPECT_TRUE(pool.clientSupported(bar_class, false));
+    EXPECT_TRUE(pool.clientSupported(three_classes, false));
 }
 
 // This test checks that handling for multiple client-classes is valid.
@@ -667,9 +667,9 @@ TEST(Pool6Test, clientClasses) {
 
     // No class restrictions defined, any client should be supported
     EXPECT_EQ(0, pool.getClientClasses().size());
-    EXPECT_TRUE(pool.clientSupported(no_class));
-    EXPECT_TRUE(pool.clientSupported(foo_class));
-    EXPECT_TRUE(pool.clientSupported(bar_class));
+    EXPECT_TRUE(pool.clientSupported(no_class, false));
+    EXPECT_TRUE(pool.clientSupported(foo_class, false));
+    EXPECT_TRUE(pool.clientSupported(bar_class, false));
 
     // Let's allow clients belonging to "bar" or "foo" class.
     pool.allowClientClass("bar");
@@ -677,13 +677,13 @@ TEST(Pool6Test, clientClasses) {
     EXPECT_EQ(2, pool.getClientClasses().size());
 
     // Class-less clients are to be rejected.
-    EXPECT_FALSE(pool.clientSupported(no_class));
+    EXPECT_FALSE(pool.clientSupported(no_class, false));
 
     // Clients in foo class should be accepted.
-    EXPECT_TRUE(pool.clientSupported(foo_class));
+    EXPECT_TRUE(pool.clientSupported(foo_class, false));
 
     // Clients in bar class should be accepted as well.
-    EXPECT_TRUE(pool.clientSupported(bar_class));
+    EXPECT_TRUE(pool.clientSupported(bar_class, false));
 }
 
 // This test checks that handling for known-clients is valid.
index 4226bc2eeac4f9ac77a5370eb097cfbddab337ea..8da02897ae44ad5350c3549dd9b2717e3ca1a6f7 100644 (file)
@@ -235,34 +235,34 @@ TEST(Subnet4Test, pool4InSubnet4) {
     three_classes.insert("baz");
 
     // If we provide a hint, we should get a pool that this hint belongs to
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false,
                                              IOAddress("192.1.2.201")));
     EXPECT_EQ(mypool, pool4);
 
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false,
                                              IOAddress("192.1.2.129")));
     EXPECT_EQ(mypool, pool2);
 
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false,
                                              IOAddress("192.1.2.64")));
     EXPECT_EQ(mypool, pool1);
 
     // Specify addresses which don't belong to any existing pools.
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false,
                                              IOAddress("192.1.2.210")));
     EXPECT_FALSE(mypool);
 
     // Pool3 requires a member of bar
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, false,
                                              IOAddress("192.1.2.195")));
     EXPECT_FALSE(mypool);
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, false,
                                              IOAddress("192.1.2.195")));
     EXPECT_FALSE(mypool);
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, false,
                                              IOAddress("192.1.2.195")));
     EXPECT_EQ(mypool, pool3);
-    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes,
+    ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, false,
                                              IOAddress("192.1.2.195")));
     EXPECT_EQ(mypool, pool3);
 }
@@ -319,10 +319,10 @@ TEST(Subnet4Test, getCapacity) {
     pool3->allowClientClass("bar");
 
     // Pool3 requires a member of bar
-    EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class));
-    EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class));
-    EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class));
-    EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes));
+    EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class, false));
+    EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class, false));
+    EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class, false));
+    EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes, false));
 }
 
 // Checks that it is not allowed to add invalid pools.
@@ -541,24 +541,24 @@ TEST(Subnet4Test, inRangeinPool) {
 
     // This client does not belong to any class.
     isc::dhcp::ClientClasses no_class;
-    EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class));
+    EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class, false));
 
     // This client belongs to foo only
     isc::dhcp::ClientClasses foo_class;
     foo_class.insert("foo");
-    EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class));
+    EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class, false));
 
     // This client belongs to bar only. I like that client.
     isc::dhcp::ClientClasses bar_class;
     bar_class.insert("bar");
-    EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class));
+    EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class, false));
 
     // This client belongs to foo, bar and baz classes.
     isc::dhcp::ClientClasses three_classes;
     three_classes.insert("foo");
     three_classes.insert("bar");
     three_classes.insert("baz");
-    EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes));
+    EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes, false));
 }
 
 // This test checks if the toText() method returns text representation
@@ -781,13 +781,13 @@ TEST(Subnet6Test, Pool6getCapacity) {
 
     // Pool3 requires a member of bar
     EXPECT_EQ(uint64_t(4294967296ull + 65536),
-              subnet->getPoolCapacity(Lease::TYPE_NA, no_class));
+              subnet->getPoolCapacity(Lease::TYPE_NA, no_class, false));
     EXPECT_EQ(uint64_t(4294967296ull + 65536),
-              subnet->getPoolCapacity(Lease::TYPE_NA, foo_class));
+              subnet->getPoolCapacity(Lease::TYPE_NA, foo_class, false));
     EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536),
-              subnet->getPoolCapacity(Lease::TYPE_NA, bar_class));
+              subnet->getPoolCapacity(Lease::TYPE_NA, bar_class, false));
     EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536),
-              subnet->getPoolCapacity(Lease::TYPE_NA, three_classes));
+              subnet->getPoolCapacity(Lease::TYPE_NA, three_classes, false));
 
     // This is 2^64 prefixes. We're overflown uint64_t.
     PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64));
@@ -891,16 +891,16 @@ TEST(Subnet6Test, Pool6InSubnet6) {
     pool3->allowClientClass("bar");
 
     // Pool3 requires a member of bar
-    mypool = subnet->getPool(Lease::TYPE_NA, no_class,
+    mypool = subnet->getPool(Lease::TYPE_NA, no_class, false,
                              IOAddress("2001:db8:1:3::dead:beef"));    
     EXPECT_FALSE(mypool);
-    mypool = subnet->getPool(Lease::TYPE_NA, foo_class,
+    mypool = subnet->getPool(Lease::TYPE_NA, foo_class, false,
                              IOAddress("2001:db8:1:3::dead:beef"));    
     EXPECT_FALSE(mypool);
-    mypool = subnet->getPool(Lease::TYPE_NA, bar_class,
+    mypool = subnet->getPool(Lease::TYPE_NA, bar_class, false,
                              IOAddress("2001:db8:1:3::dead:beef"));    
     EXPECT_EQ(mypool, pool3);
-    mypool = subnet->getPool(Lease::TYPE_NA, three_classes,
+    mypool = subnet->getPool(Lease::TYPE_NA, three_classes, false,
                              IOAddress("2001:db8:1:3::dead:beef"));    
     EXPECT_EQ(mypool, pool3);
 }
@@ -1396,24 +1396,24 @@ TEST(Subnet6Test, inRangeinPool) {
 
     // This client does not belong to any class.
     isc::dhcp::ClientClasses no_class;
-    EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class));
+    EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class, false));
 
     // This client belongs to foo only
     isc::dhcp::ClientClasses foo_class;
     foo_class.insert("foo");
-    EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class));
+    EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class, false));
 
     // This client belongs to bar only. I like that client.
     isc::dhcp::ClientClasses bar_class;
     bar_class.insert("bar");
-    EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class));
+    EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class, false));
 
     // This client belongs to foo, bar and baz classes.
     isc::dhcp::ClientClasses three_classes;
     three_classes.insert("foo");
     three_classes.insert("bar");
     three_classes.insert("baz");
-    EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes));
+    EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes, false));
 }
 
 // This test verifies that inRange() and inPool() methods work properly