]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3140] [4157] Added RADIUS pending request
authorFrancis Dupont <fdupont@isc.org>
Wed, 15 Oct 2025 15:15:14 +0000 (17:15 +0200)
committerFrancis Dupont <fdupont@isc.org>
Wed, 5 Nov 2025 21:46:17 +0000 (22:46 +0100)
src/hooks/dhcp/radius/radius_callout.cc
src/hooks/dhcp/radius/tests/access_unittests.cc

index 32e6a7a4d7150dcdc922824a20c4a2875dbff6cf..39b3b5209bfc0c4f43e5c7cb5dbbd78cbc7d6d03 100644 (file)
@@ -22,6 +22,7 @@
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/host_mgr.h>
 #include <process/daemon.h>
+#include <stats/stats_mgr.h>
 #include <radius_log.h>
 #include <radius_parsers.h>
 #include <radius_access.h>
@@ -40,6 +41,7 @@ using namespace isc::dhcp;
 using namespace isc::hooks;
 using namespace isc::process;
 using namespace isc::radius;
+using namespace isc::stats;
 using namespace isc::util;
 using namespace std;
 
@@ -181,6 +183,10 @@ RadiusAuthHandlerPtr subnet4Select(CalloutHandle& handle,
         LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCESS_CONFLICT)
           .arg(query->getLabel())
           .arg(text);
+        StatsMgr::instance().addValue("pkt4-queue-full",
+                                      static_cast<int64_t>(1));
+        StatsMgr::instance().addValue("pkt4-receive-drop",
+                                      static_cast<int64_t>(1));
         handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
         return (handler);
     }
@@ -192,6 +198,10 @@ RadiusAuthHandlerPtr subnet4Select(CalloutHandle& handle,
                   RADIUS_ACCESS_MAX_PENDING_REQUESTS)
             .arg(query->getLabel())
             .arg(text);
+        StatsMgr::instance().addValue("pkt4-queue-full",
+                                      static_cast<int64_t>(1));
+        StatsMgr::instance().addValue("pkt4-receive-drop",
+                                      static_cast<int64_t>(1));
         handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
         return (handler);
     }
@@ -326,6 +336,10 @@ RadiusAuthHandlerPtr subnet6Select(CalloutHandle& handle,
         LOG_DEBUG(radius_logger, RADIUS_DBG_TRACE, RADIUS_ACCESS_CONFLICT)
           .arg(query->getLabel())
           .arg(text);
+        StatsMgr::instance().addValue("pkt6-queue-full",
+                                      static_cast<int64_t>(1));
+        StatsMgr::instance().addValue("pkt6-receive-drop",
+                                      static_cast<int64_t>(1));
         handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
         return (handler);
     }
@@ -337,6 +351,10 @@ RadiusAuthHandlerPtr subnet6Select(CalloutHandle& handle,
                   RADIUS_ACCESS_MAX_PENDING_REQUESTS)
             .arg(query->getLabel())
             .arg(text);
+        StatsMgr::instance().addValue("pkt6-queue-full",
+                                      static_cast<int64_t>(1));
+        StatsMgr::instance().addValue("pkt6-receive-drop",
+                                      static_cast<int64_t>(1));
         handle.setStatus(CalloutHandle::NEXT_STEP_DROP);
         return (handler);
     }
index 17980fbf3eb249b6483ae49c46ff45a655a5f3cb..97adc8bb7070034345b4821be09e3c2baf47c017 100644 (file)
@@ -35,6 +35,7 @@
 #include <hooks/callout_handle.h>
 #include <hooks/callout_manager.h>
 #include <hooks/hooks_manager.h>
+#include <stats/stats_mgr.h>
 #include <testutils/gtest_utils.h>
 #include <testutils/multi_threading_utils.h>
 
@@ -54,6 +55,7 @@ using namespace isc::dhcp;
 using namespace isc::dhcp::test;
 using namespace isc::hooks;
 using namespace isc::radius;
+using namespace isc::stats;
 using namespace isc::test;
 using namespace isc::util;
 
@@ -3398,6 +3400,12 @@ TEST_F(AccessTest, twoQueries4) {
     Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 24, 1, 2, 3, 1));
     CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->add(subnet);
 
+    // Initialize stats.
+    StatsMgr::instance().setValue("pkt4-queue-full",
+                                  static_cast<int64_t>(0));
+    StatsMgr::instance().setValue("pkt4-receive-drop",
+                                  static_cast<int64_t>(0));
+
     // Start not servicing server.
     thread_.reset(new thread(bind(&AccessTest::dummyServer, this)));
     system_clock::time_point start(system_clock::now());
@@ -3416,12 +3424,28 @@ TEST_F(AccessTest, twoQueries4) {
         this_thread::sleep_for(1ms);
     }
     EXPECT_TRUE(finished_);
+
+    // Check stats.
+    ObservationPtr qf_stat =
+        StatsMgr::instance().getObservation("pkt4-queue-full");
+    ObservationPtr rd_stat =
+        StatsMgr::instance().getObservation("pkt4-receive-drop");
+    ASSERT_TRUE(qf_stat);
+    ASSERT_TRUE(rd_stat);
+    EXPECT_EQ(1, qf_stat->getInteger().first);
+    EXPECT_EQ(1, rd_stat->getInteger().first);
 }
 
 TEST_F(AccessTest, twoQueries6) {
     Subnet6Ptr subnet(new Subnet6(IOAddress("2001:db8::"), 64, 1, 2, 3, 4, 1));
     CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->add(subnet);
 
+    // Initialize stats.
+    StatsMgr::instance().setValue("pkt6-queue-full",
+                                  static_cast<int64_t>(0));
+    StatsMgr::instance().setValue("pkt6-receive-drop",
+                                  static_cast<int64_t>(0));
+
     // Start not servicing server.
     thread_.reset(new thread(bind(&AccessTest::dummyServer, this)));
     system_clock::time_point start(system_clock::now());
@@ -3440,6 +3464,16 @@ TEST_F(AccessTest, twoQueries6) {
         this_thread::sleep_for(1ms);
     }
     EXPECT_TRUE(finished_);
+
+    // Check stats.
+    ObservationPtr qf_stat =
+        StatsMgr::instance().getObservation("pkt6-queue-full");
+    ObservationPtr rd_stat =
+        StatsMgr::instance().getObservation("pkt6-receive-drop");
+    ASSERT_TRUE(qf_stat);
+    ASSERT_TRUE(rd_stat);
+    EXPECT_EQ(1, qf_stat->getInteger().first);
+    EXPECT_EQ(1, rd_stat->getInteger().first);
 }
 
 TEST_F(AccessTest, maxPendingRequest4) {
@@ -3449,6 +3483,12 @@ TEST_F(AccessTest, maxPendingRequest4) {
     Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 24, 1, 2, 3, 1));
     CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->add(subnet);
 
+    // Initialize stats.
+    StatsMgr::instance().setValue("pkt4-queue-full",
+                                  static_cast<int64_t>(0));
+    StatsMgr::instance().setValue("pkt4-receive-drop",
+                                  static_cast<int64_t>(0));
+
     // Start not servicing server.
     thread_.reset(new thread(bind(&AccessTest::dummyServer, this)));
     system_clock::time_point start(system_clock::now());
@@ -3467,6 +3507,16 @@ TEST_F(AccessTest, maxPendingRequest4) {
         this_thread::sleep_for(1ms);
     }
     EXPECT_TRUE(finished_);
+
+    // Check stats.
+    ObservationPtr qf_stat =
+        StatsMgr::instance().getObservation("pkt4-queue-full");
+    ObservationPtr rd_stat =
+        StatsMgr::instance().getObservation("pkt4-receive-drop");
+    ASSERT_TRUE(qf_stat);
+    ASSERT_TRUE(rd_stat);
+    EXPECT_EQ(1, qf_stat->getInteger().first);
+    EXPECT_EQ(1, rd_stat->getInteger().first);
 }
 
 TEST_F(AccessTest, maxPendingRequest6) {
@@ -3476,6 +3526,12 @@ TEST_F(AccessTest, maxPendingRequest6) {
     Subnet6Ptr subnet(new Subnet6(IOAddress("2001:db8::"), 64, 1, 2, 3, 4, 1));
     CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->add(subnet);
 
+    // Initialize stats.
+    StatsMgr::instance().setValue("pkt6-queue-full",
+                                  static_cast<int64_t>(0));
+    StatsMgr::instance().setValue("pkt6-receive-drop",
+                                  static_cast<int64_t>(0));
+
     // Start not servicing server.
     thread_.reset(new thread(bind(&AccessTest::dummyServer, this)));
     system_clock::time_point start(system_clock::now());
@@ -3494,6 +3550,16 @@ TEST_F(AccessTest, maxPendingRequest6) {
         this_thread::sleep_for(1ms);
     }
     EXPECT_TRUE(finished_);
+
+    // Check stats.
+    ObservationPtr qf_stat =
+        StatsMgr::instance().getObservation("pkt6-queue-full");
+    ObservationPtr rd_stat =
+        StatsMgr::instance().getObservation("pkt6-receive-drop");
+    ASSERT_TRUE(qf_stat);
+    ASSERT_TRUE(rd_stat);
+    EXPECT_EQ(1, qf_stat->getInteger().first);
+    EXPECT_EQ(1, rd_stat->getInteger().first);
 }
 
 TEST_F(AccessTest, noHost4) {