]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5388] Corrected bug in allocation engine.
authorMarcin Siodelski <marcin@isc.org>
Fri, 13 Oct 2017 11:22:08 +0000 (13:22 +0200)
committerMarcin Siodelski <marcin@isc.org>
Fri, 13 Oct 2017 11:22:08 +0000 (13:22 +0200)
The bug was manifesting itself in inability to find an existing lease
within shared network when client performed DORA without a hint.

src/bin/dhcp4/tests/shared_network_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc

index 39901d86cdccf0a1634982772eeda7e5495e39ab..0326630015b1ab7090b988f55ee304acbb2658a9 100644 (file)
@@ -1062,6 +1062,31 @@ TEST_F(Dhcpv4SharedNetworkTest, poolInSharedNetworkShortage) {
     });
 }
 
+// Returning client sends 4-way exchange.
+TEST_F(Dhcpv4SharedNetworkTest, returningClientStartsOver) {
+    // Create client.
+    Dhcp4Client client(Dhcp4Client::SELECTING);
+    client.setIfaceName("eth1");
+    client.includeClientId("01:02:03:04");
+
+    // Configure the server with one shared network including two subnets and
+    // one subnet outside of the shared network.
+    configure(NETWORKS_CONFIG[0], *client.getServer());
+
+    // Client requests an address in first subnet within a shared network.
+    // We'll send a hint of 192.0.2.63 and expect to get it.
+    testAssigned([this, &client]() {
+        doDORA(client, "192.0.2.63", "192.0.2.63");
+    });
+
+
+    // The client reboots and performs 4-way exchange again without a hint.
+    // It should be assigned the same (existing) lease.
+    testAssigned([this, &client]() {
+        doDORA(client, "192.0.2.63");
+    });
+}
+
 // Shared network is selected based on giaddr value (relay specified
 // on shared network level)
 TEST_F(Dhcpv4SharedNetworkTest, sharedNetworkSelectedByRelay1) {
index f75f7954a8e7dc6cb686a990181899b744fb3687..55effd88a058be747dd06db92bc116cd2421ace7 100644 (file)
@@ -2443,6 +2443,10 @@ void findClientLease(AllocEngine::ClientContext4& ctx, Lease4Ptr& client_lease)
         // configured to ignore client identifier).
         if (client_id) {
             client_lease = lease_mgr.getLease4(*client_id, subnet->getID());
+            if (client_lease) {
+                ctx.subnet_ = subnet;
+                return;
+            }
         }
 
         // If no lease found using the client identifier, try the lookup using