From: Marcin Siodelski Date: Mon, 19 Jun 2023 12:22:46 +0000 (+0200) Subject: [#2931] Fixed getting host by IPv6 address X-Git-Tag: Kea-2.4.0~170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=704655fa8eb2c89ed94011f54cefb2dbbe1fbfd8;p=thirdparty%2Fkea.git [#2931] Fixed getting host by IPv6 address Modified the query fetching host by IPv6 address to include all addresses and options associated with the host. --- diff --git a/src/lib/dhcpsrv/mysql_host_data_source.cc b/src/lib/dhcpsrv/mysql_host_data_source.cc index 5d7114d644..cf4d5ceff8 100644 --- a/src/lib/dhcpsrv/mysql_host_data_source.cc +++ b/src/lib/dhcpsrv/mysql_host_data_source.cc @@ -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 diff --git a/src/lib/dhcpsrv/pgsql_host_data_source.cc b/src/lib/dhcpsrv/pgsql_host_data_source.cc index 60b58beaa3..77d1e3f3a4 100644 --- a/src/lib/dhcpsrv/pgsql_host_data_source.cc +++ b/src/lib/dhcpsrv/pgsql_host_data_source.cc @@ -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" }, diff --git a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc index b2112a3471..441d2882b5 100644 --- a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc @@ -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)); diff --git a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h index 2a995ada2c..d5f1cf5352 100644 --- a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h +++ b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h @@ -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_;