]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[992-include-the-client-supplied-ciaddr-when-acking-dhcpinform] Copy ciaddr to inform...
authorFrancis Dupont <fdupont@isc.org>
Tue, 19 Nov 2019 06:01:12 +0000 (07:01 +0100)
committerTomek Mrugalski <tomasz@isc.org>
Mon, 9 Dec 2019 10:47:06 +0000 (11:47 +0100)
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/tests/inform_unittest.cc

index 1b4b155561d14d32cae10713275cc01dd46a37db..8d9691c13406583ccd0cb6cf79cbcc4aa3be673d 100644 (file)
@@ -264,9 +264,13 @@ Dhcpv4Exchange::copyDefaultFields() {
 
     // explicitly set this to 0
     resp_->setSiaddr(IOAddress::IPV4_ZERO_ADDRESS());
-    // ciaddr is always 0, except for the Renew/Rebind state when it may
-    // be set to the ciaddr sent by the client.
-    resp_->setCiaddr(IOAddress::IPV4_ZERO_ADDRESS());
+    // ciaddr is always 0, except for the Renew/Rebind state and for
+    // Inform when it may be set to the ciaddr sent by the client.
+    if (query_->getType() == DHCPINFORM) {
+        resp_->setCiaddr(query_->getCiaddr());
+    } else {
+        resp_->setCiaddr(IOAddress::IPV4_ZERO_ADDRESS());
+    }
     resp_->setHops(query_->getHops());
 
     // copy MAC address
index 42a5cfe31bcb73b05af6d6dd22781bb69c95ecfc..1be526b4c3e18fed6c4e324390695f7e51ac729b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -175,6 +175,8 @@ TEST_F(InformTest, directClientBroadcast) {
     ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
     // Response should have been unicast to the ciaddr.
     EXPECT_EQ(IOAddress("10.0.0.56"), resp->getLocalAddr());
+    // The ciaddr should have been copied.
+    EXPECT_EQ(IOAddress("10.0.0.56"), resp->getCiaddr());
     // Response must not be relayed.
     EXPECT_FALSE(resp->isRelayed());
     // Make sure that the server id is present.
@@ -214,6 +216,8 @@ TEST_F(InformTest, directClientBroadcast) {
     ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
     // Response should have been unicast to the ciaddr.
     EXPECT_EQ(IOAddress("10.0.0.12"), resp->getLocalAddr());
+    // The ciaddr should have been copied.
+    EXPECT_EQ(IOAddress("10.0.0.12"), resp->getCiaddr());
     // Response must not be relayed.
     EXPECT_FALSE(resp->isRelayed());
 
@@ -265,6 +269,8 @@ TEST_F(InformTest, directClientUnicast) {
     ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
     // Response should have been unicast to the ciaddr.
     EXPECT_EQ(IOAddress("10.0.0.56"), resp->getLocalAddr());
+    // The ciaddr should have been copied.
+    EXPECT_EQ(IOAddress("10.0.0.56"), resp->getCiaddr());
     // Response must not be relayed.
     EXPECT_FALSE(resp->isRelayed());
     // Make sure that the server id is present.
@@ -295,8 +301,10 @@ TEST_F(InformTest, directClientNoCiaddr) {
     Pkt4Ptr resp = client.getContext().response_;
     // Make sure that the server has responded with DHCPACK.
     ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
-    // Response should have been unicast to the ciaddr.
+    // Response should have been unicast to the client address.
     EXPECT_EQ(IOAddress("10.0.0.56"), resp->getLocalAddr());
+    // The ciaddr should be 0.
+    EXPECT_EQ(IOAddress("0.0.0.0"), resp->getCiaddr());
     // Response must not be relayed.
     EXPECT_FALSE(resp->isRelayed());
     EXPECT_EQ(DHCP4_CLIENT_PORT, resp->getLocalPort());
@@ -334,6 +342,8 @@ TEST_F(InformTest, relayedClient) {
     ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
     // Response should have been unicast to the ciaddr.
     EXPECT_EQ(IOAddress("192.0.2.56"), resp->getLocalAddr());
+    // The ciaddr should have been copied.
+    EXPECT_EQ(IOAddress("192.0.2.56"), resp->getCiaddr());
     // Response is unicast to the client, so it must not be relayed.
     EXPECT_FALSE(resp->isRelayed());
     EXPECT_EQ(DHCP4_CLIENT_PORT, resp->getLocalPort());