]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3140] [4127] Added lease query hook
authorFrancis Dupont <fdupont@isc.org>
Wed, 15 Oct 2025 13:50:50 +0000 (15:50 +0200)
committerFrancis Dupont <fdupont@isc.org>
Wed, 5 Nov 2025 21:46:17 +0000 (22:46 +0100)
src/hooks/dhcp/lease_query/lease_query_callouts.cc
src/hooks/dhcp/lease_query/lease_query_impl4.cc
src/hooks/dhcp/lease_query/lease_query_impl6.cc
src/hooks/dhcp/lease_query/tests/lease_query_impl4_unittest.cc
src/hooks/dhcp/lease_query/tests/lease_query_impl6_unittest.cc

index 573082a7f085b31c981222d92ceda51b3010299f..d3361161515be5923524cb0529efd7d53b5128a0 100644 (file)
@@ -230,6 +230,11 @@ int buffer6_receive(CalloutHandle& handle) {
                   DHCP6_LEASE_QUERY_PROCESS_FAILED)
                   .arg(LeaseQueryImpl6::leaseQueryLabel(query))
                   .arg(ex.what());
+
+        StatsMgr::instance().addValue("pkt6-receive-drop",
+                                      static_cast<int64_t>(1));
+        handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
+        return (0);
     }
 
     // We always set status to DROP as the query has been handled.
index c901e0ef30f6b989f57e99f1e4a3a5b301f56cdc..02932311ba9ed2ea8a2f4f5ec0565ee7b3fd3280 100644 (file)
@@ -61,6 +61,8 @@ LeaseQueryImpl4::processQuery(PktPtr base_query) const {
     }
 
     if (!isRequester(requester_ip)) {
+        StatsMgr::instance().addValue("pkt4-admin-filtered",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue, "rejecting query from unauthorized requester: "
                   << requester_ip.toText());
     }
index 6d72f6e201458d7d10154813a37cd50e91f28437..5808c1306ece95e8156dd80bd32da44c99d21cca 100644 (file)
@@ -115,6 +115,8 @@ LeaseQueryImpl6::processQuery(PktPtr base_query) const {
 
     if (!isRequester(requester_ip)) {
         // RFC 5007 says we may discard or return STATUS_NotAllowed
+        StatsMgr::instance().addValue("pkt6-admin-filtered",
+                                      static_cast<int64_t>(1));
         isc_throw(BadValue,
                  "rejecting DHCPV6_LEASEQUERY from unauthorized requester: "
                   << requester_ip.toText());
index ab5645ac5999e5f971b58ed6ee8783df9586fece..50869ecda64ac8b3ec35f31e6c0a257dbfbf8115 100644 (file)
@@ -15,8 +15,9 @@
 #include <dhcp/testutils/iface_mgr_test_config.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/lease_mgr_factory.h>
-#include <lease_query_impl4.h>
+#include <stats/stats_mgr.h>
 #include <testutils/gtest_utils.h>
+#include <lease_query_impl4.h>
 
 #include <gtest/gtest.h>
 #include <sstream>
@@ -28,6 +29,7 @@ using namespace isc::data;
 using namespace isc::dhcp;
 using namespace isc::dhcp::test;
 using namespace isc::lease_query;
+using namespace isc::stats;
 using namespace isc::util;
 
 namespace {
@@ -643,11 +645,19 @@ TEST(LeaseQueryImpl4Test, processQueryInvalidQuery) {
     ASSERT_THROW_MSG(impl->processQuery(lq), BadValue,
                      "giaddr cannot be 0.0.0.0");
 
+    // Set the pkt4-admin-filtered stat to 0.
+    StatsMgr::instance().setValue("pkt4-admin-filtered", static_cast<int64_t>(0));
+
     // An unknown giaddr should fail.
     lq->setGiaddr(IOAddress("192.0.2.2"));
     ASSERT_THROW_MSG(impl->processQuery(lq), BadValue,
                      "rejecting query from unauthorized requester: 192.0.2.2");
 
+    // Check the stat which was bumped by one.
+    ObservationPtr stat = StatsMgr::instance().getObservation("pkt4-admin-filtered");
+    ASSERT_TRUE(stat);
+    EXPECT_EQ(1, stat->getInteger().first);
+
     // Now we'll iterate over all invalid combinations of ciaddr, HWAddr, client id.
     struct Scenario {
         const std::string description_;
index b78e77a8c546ad698333123a26eb7a5d861e4a5f..62a072ca1ba5579e61616894c6ee1a2855bce45b 100644 (file)
@@ -18,8 +18,9 @@
 #include <dhcp/testutils/iface_mgr_test_config.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/lease_mgr_factory.h>
-#include <lease_query_impl6.h>
+#include <stats/stats_mgr.h>
 #include <testutils/gtest_utils.h>
+#include <lease_query_impl6.h>
 #include <test_lease_mgr.h>
 
 #include <gtest/gtest.h>
@@ -33,6 +34,7 @@ using namespace isc::data;
 using namespace isc::dhcp;
 using namespace isc::dhcp::test;
 using namespace isc::lease_query;
+using namespace isc::stats;
 using namespace isc::test;
 using namespace isc::util;
 
@@ -704,6 +706,9 @@ TEST_F(MemfileLeaseQueryImpl6ProcessTest, processQueryInvalidQuery) {
     ASSERT_THROW_MSG(impl->processQuery(lq), BadValue,
                      "DHCPV6_LEASEQUERY source address cannot be ::");
 
+    // Set the pkt6-admin-filtered stat to 0.
+    StatsMgr::instance().setValue("pkt6-admin-filtered", static_cast<int64_t>(0));
+
     // Set source address to an unknown requester address.
     lq->setRemoteAddr(IOAddress("de:ad:be:ef::"));
 
@@ -711,6 +716,11 @@ TEST_F(MemfileLeaseQueryImpl6ProcessTest, processQueryInvalidQuery) {
     ASSERT_THROW_MSG(impl->processQuery(lq), BadValue,
                      "rejecting DHCPV6_LEASEQUERY from unauthorized requester: de:ad:be:ef::");
 
+    // Check the stat which was bumped by one.
+    ObservationPtr stat = StatsMgr::instance().getObservation("pkt6-admin-filtered");
+    ASSERT_TRUE(stat);
+    EXPECT_EQ(1, stat->getInteger().first);
+
     // Set source address to a known requester address.
     lq->setRemoteAddr(IOAddress("2001:db8:2::1"));