]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2931] Fixed getting host by IPv6 address
authorMarcin Siodelski <marcin@isc.org>
Mon, 19 Jun 2023 12:22:46 +0000 (14:22 +0200)
committerMarcin Siodelski <marcin@isc.org>
Wed, 21 Jun 2023 07:59:41 +0000 (09:59 +0200)
Modified the query fetching host by IPv6 address to include all addresses
and options associated with the host.

src/lib/dhcpsrv/mysql_host_data_source.cc
src/lib/dhcpsrv/pgsql_host_data_source.cc
src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc
src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h

index 5d7114d64471aaf220a845fe7219259d5496619e..cf4d5ceff872a85906baabadab4bc24799c20a19 100644 (file)
@@ -2477,7 +2477,9 @@ TaggedStatementArray tagged_statements = { {
                 "ON h.host_id = o.host_id "
             "LEFT JOIN ipv6_reservations AS r "
                 "ON h.host_id = r.host_id "
-            "WHERE h.dhcp6_subnet_id = ? AND r.address = ? "
+            "WHERE h.dhcp6_subnet_id = ? AND h.host_id = "
+                "( SELECT host_id FROM ipv6_reservations "
+                    "WHERE address = ? ) "
             "ORDER BY h.host_id, o.option_id, r.reservation_id"},
 
     // Retrieves host information along with the DHCPv4 options associated with
index 60b58beaa36476305042788051a305c5dd65c210..77d1e3f3a4f5b1bcef57dc2536a8dcbe6399526a 100644 (file)
@@ -1807,7 +1807,9 @@ TaggedStatementArray tagged_statements = { {
      "FROM hosts AS h "
      "LEFT JOIN dhcp6_options AS o ON h.host_id = o.host_id "
      "LEFT JOIN ipv6_reservations AS r ON h.host_id = r.host_id "
-     "WHERE h.dhcp6_subnet_id = $1 AND r.address = $2 "
+     "WHERE h.dhcp6_subnet_id = $1 AND h.host_id = "
+     "  (SELECT host_id FROM ipv6_reservations "
+     "   WHERE address = $2) "
      "ORDER BY h.host_id, o.option_id, r.reservation_id"
     },
 
index b2112a34719f08b5803a2b874905b277ec94c09a..441d2882b511fd8449f041abbb92fd0b54b1bcac 100644 (file)
@@ -183,6 +183,11 @@ GenericHostDataSourceTest::addTestOptions(const HostPtr& host,
     LibDHCP::setRuntimeOptionDefs(defs);
 }
 
+void
+GenericHostDataSourceTest::addIPv6Address(const HostPtr& host, const std::string& address) const {
+    host->addReservation(IPv6Resrv(IPv6Resrv::TYPE_NA, IOAddress(address)));
+}
+
 void
 GenericHostDataSourceTest::testReadOnlyDatabase(const char* valid_db_type) {
     ASSERT_TRUE(hdsptr_);
@@ -1721,9 +1726,13 @@ GenericHostDataSourceTest::testGetBySubnetIPv6() {
 
     // Let's create a couple of hosts...
     HostPtr host1 = HostDataSourceUtils::initializeHost6("2001:db8:1::", Host::IDENT_DUID, true);
+    addIPv6Address(host1, "2001:db8:1::10");
     HostPtr host2 = HostDataSourceUtils::initializeHost6("2001:db8:2::", Host::IDENT_DUID, true);
+    addIPv6Address(host2, "2001:db8:1::20");
     HostPtr host3 = HostDataSourceUtils::initializeHost6("2001:db8:3::", Host::IDENT_DUID, true);
+    addIPv6Address(host3, "2001:db8:1::30");
     HostPtr host4 = HostDataSourceUtils::initializeHost6("2001:db8:4::", Host::IDENT_DUID, true);
+    addIPv6Address(host4, "2001:db8:1::40");
 
     // ... and add them to the data source.
     ASSERT_NO_THROW(hdsptr_->add(host1));
index 2a995ada2cb9c789623ed87327ba821f75572c3f..d5f1cf5352b999c62fa3ddcd369e339767394da3 100644 (file)
@@ -142,6 +142,12 @@ public:
                         isc::data::ConstElementPtr user_context =
                         isc::data::ConstElementPtr()) const;
 
+    /// @brief Adds an IPv6 address to the host.
+    ///
+    /// @param host pointer to the host instance.
+    /// @param address an IPv6 address to be added as a string.
+    void addIPv6Address(const HostPtr& host, const std::string& address) const;
+
     /// @brief Pointer to the host data source
     HostDataSourcePtr hdsptr_;