]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3297] pktX_send now calls processPktEventStack
authorThomas Markwalder <tmark@isc.org>
Tue, 2 Apr 2024 14:50:44 +0000 (10:50 -0400)
committerRazvan Becheriu <razvan@isc.org>
Wed, 3 Apr 2024 12:14:35 +0000 (15:14 +0300)
src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc
    TEST_F(PerfMonLibLoadTest, verifyCallouts4)
    TEST_F(PerfMonLibLoadTest, verifyCallouts6) - new tests

src/hooks/dhcp/perfmon/perfmon_callouts.cc
    pkt5_send(CalloutHandle& handle)
    pkt6_send(CalloutHandle& handle) - added logic to try-catch
    call processPktEventStack()

src/hooks/dhcp/perfmon/perfmon_messages.mes
    PERFMON_DHCP4_PKT_PROCESS_ERROR

    PERFMON_DHCP6_PKT_PROCESS_ERROR - new debug messages

src/hooks/dhcp/perfmon/libloadtests/load_unload_unittests.cc
src/hooks/dhcp/perfmon/perfmon_callouts.cc
src/hooks/dhcp/perfmon/perfmon_messages.cc
src/hooks/dhcp/perfmon/perfmon_messages.h
src/hooks/dhcp/perfmon/perfmon_messages.mes

index e2996d245e1d8c76eb1cd79157e98cdd07986e85..9a3f30c5ad125ab8695a8fc13738046b634c2deb 100644 (file)
@@ -43,6 +43,27 @@ public:
         unloadLibraries();
     }
 
+    /// @brief Registers hooks in the hook manager.
+    /// Normally this is done by the server core code.
+    void registerHooks() {
+        if (isc::dhcp::CfgMgr::instance().getFamily() == AF_INET) {
+            hook_index_dhcpx_srv_configured_ = HooksManager::registerHook("dhcp4_srv_configured");
+            hook_index_pktx_send_ =  HooksManager::registerHook("pkt4_send");
+        } else {
+            hook_index_dhcpx_srv_configured_ = HooksManager::registerHook("dhcp6_srv_configured");
+            hook_index_pktx_send_ =  HooksManager::registerHook("pkt6_send");
+        }
+    }
+
+    /// @brief  Checks that expected callouts are present.
+    void calloutsPresent() {
+        bool result;
+        ASSERT_NO_THROW_LOG(result = HooksManager::calloutsPresent(hook_index_dhcpx_srv_configured_));
+        EXPECT_TRUE(result);
+        ASSERT_NO_THROW_LOG(result = HooksManager::calloutsPresent(hook_index_pktx_send_));
+        EXPECT_TRUE(result);
+    }
+
     /// @brief Creates a valid set configuration parameters valid for the library.
     virtual isc::data::ElementPtr validConfigParams() {
         std::string valid_config =
@@ -68,6 +89,10 @@ public:
         // Convert JSON texts to Element map.
         return (Element::fromJSON(valid_config));
     }
+
+    /// @brief Hook index values.
+    int hook_index_pktx_send_;
+    int hook_index_dhcpx_srv_configured_;
 };
 
 // Simple V4 test that checks the library can be loaded and unloaded several times.
@@ -87,4 +112,40 @@ TEST_F(PerfMonLibLoadTest, invalidDaemonLoad) {
     invalidDaemonTest("bogus");
 }
 
+// Verifies that callout functions exist after loading the library.
+TEST_F(PerfMonLibLoadTest, verifyCallouts4) {
+    // Set family and daemon's proc name and register hook points.
+    isc::dhcp::CfgMgr::instance().setFamily(AF_INET);
+    isc::process::Daemon::setProcName("kea-dhcp4");
+    registerHooks();
+
+    // Add library to config and load it.
+    ASSERT_NO_THROW_LOG(addLibrary(lib_so_name_, valid_params_));
+    ASSERT_NO_THROW_LOG(loadLibraries());
+
+    // Verify that expected callouts are present.
+    calloutsPresent();
+
+    // Unload the library.
+    ASSERT_NO_THROW_LOG(unloadLibraries());
+}
+
+// Verifies that callout functions exist after loading the library.
+TEST_F(PerfMonLibLoadTest, verifyCallouts6) {
+    // Set family and daemon's proc name and register hook points.
+    isc::dhcp::CfgMgr::instance().setFamily(AF_INET6);
+    isc::process::Daemon::setProcName("kea-dhcp6");
+    registerHooks();
+
+    // Add library to config and load it.
+    ASSERT_NO_THROW_LOG(addLibrary(lib_so_name_, valid_params_));
+    ASSERT_NO_THROW_LOG(loadLibraries());
+
+    // Verify that expected callouts are present.
+    calloutsPresent();
+
+    // Unload the library.
+    ASSERT_NO_THROW_LOG(unloadLibraries());
+}
+
 } // end of anonymous namespace
index 49c2452d4e8c55996e7c1e771c4a8c8f6c4cb27e..99bdbb77fe002c87753bdc03974e8b0f490c0f86 100644 (file)
@@ -67,9 +67,28 @@ int pkt4_send(CalloutHandle& handle) {
 
     Pkt4Ptr query;
     handle.getArgument("query4", query);
+
+    Pkt4Ptr response;
+    handle.getArgument("response4", response);
+
+    Subnet4Ptr subnet;
+    handle.getArgument("subnet4", subnet);
+
+    if (!query) {
+        /// @todo this needs to be logged
+        return (0);
+    }
+
     LOG_DEBUG(perfmon_logger, DBGLVL_TRACE_DETAIL, PERFMON_DHCP4_PKT_EVENTS)
               .arg(query->getLabel())
               .arg(query->dumpPktEvents());
+    try {
+        mgr->processPktEventStack(query, response, subnet->getID());
+    } catch (const std::exception& ex) {
+        LOG_DEBUG(perfmon_logger, DBGLVL_TRACE_DETAIL, PERFMON_DHCP4_PKT_PROCESS_ERROR)
+                  .arg(query->getLabel())
+                  .arg(ex.what());
+    }
 
     return (0);
 }
@@ -88,10 +107,30 @@ int pkt6_send(CalloutHandle& handle) {
 
     Pkt6Ptr query;
     handle.getArgument("query6", query);
+
+    Pkt6Ptr response;
+    handle.getArgument("response6", response);
+
+    Subnet6Ptr subnet;
+    handle.getArgument("subnet6", subnet);
+
+    if (!query) {
+        /// @todo this needs to be logged
+        return (0);
+    }
+
     LOG_DEBUG(perfmon_logger, DBGLVL_TRACE_DETAIL, PERFMON_DHCP6_PKT_EVENTS)
               .arg(query->getLabel())
               .arg(query->dumpPktEvents());
 
+    try {
+        mgr->processPktEventStack(query, response, subnet->getID());
+    } catch (const std::exception& ex) {
+        LOG_DEBUG(perfmon_logger, DBGLVL_TRACE_DETAIL, PERFMON_DHCP6_PKT_PROCESS_ERROR)
+                  .arg(query->getLabel())
+                  .arg(ex.what());
+    }
+
     return (0);
 }
 
index f3c1bdadb0bef220c6628d8c0ac054c853596fdb..32edeff45a5cda40953a34da002bc793d6c5f0c0 100644 (file)
@@ -9,8 +9,10 @@ extern const isc::log::MessageID PERFMON_ALARM_TRIGGERED = "PERFMON_ALARM_TRIGGE
 extern const isc::log::MessageID PERFMON_DEINIT_FAILED = "PERFMON_DEINIT_FAILED";
 extern const isc::log::MessageID PERFMON_DEINIT_OK = "PERFMON_DEINIT_OK";
 extern const isc::log::MessageID PERFMON_DHCP4_PKT_EVENTS = "PERFMON_DHCP4_PKT_EVENTS";
+extern const isc::log::MessageID PERFMON_DHCP4_PKT_PROCESS_ERROR = "PERFMON_DHCP4_PKT_PROCESS_ERROR";
 extern const isc::log::MessageID PERFMON_DHCP4_SOCKET_RECEIVED_TIME_SUPPORT = "PERFMON_DHCP4_SOCKET_RECEIVED_TIME_SUPPORT";
 extern const isc::log::MessageID PERFMON_DHCP6_PKT_EVENTS = "PERFMON_DHCP6_PKT_EVENTS";
+extern const isc::log::MessageID PERFMON_DHCP6_PKT_PROCESS_ERROR = "PERFMON_DHCP6_PKT_PROCESS_ERROR";
 extern const isc::log::MessageID PERFMON_DHCP6_SOCKET_RECEIVED_TIME_SUPPORT = "PERFMON_DHCP6_SOCKET_RECEIVED_TIME_SUPPORT";
 extern const isc::log::MessageID PERFMON_INIT_FAILED = "PERFMON_INIT_FAILED";
 extern const isc::log::MessageID PERFMON_INIT_OK = "PERFMON_INIT_OK";
@@ -23,8 +25,10 @@ const char* values[] = {
     "PERFMON_DEINIT_FAILED", "unloading PerfMon hooks library failed: %1",
     "PERFMON_DEINIT_OK", "unloading PerfMon hooks library successful",
     "PERFMON_DHCP4_PKT_EVENTS", "query: %1 events=[%2]",
+    "PERFMON_DHCP4_PKT_PROCESS_ERROR", "Packet event stack was not processed for query %1, reason %2",
     "PERFMON_DHCP4_SOCKET_RECEIVED_TIME_SUPPORT", "Kernel supports socket received time? %1",
     "PERFMON_DHCP6_PKT_EVENTS", "query: %1 events=[%2]",
+    "PERFMON_DHCP6_PKT_PROCESS_ERROR", "Packet event stack was not processed for query %1, reason %2",
     "PERFMON_DHCP6_SOCKET_RECEIVED_TIME_SUPPORT", "Kernel supports socket received time? %1",
     "PERFMON_INIT_FAILED", "loading PerfMon hooks library failed: %1",
     "PERFMON_INIT_OK", "loading PerfMon hooks library successful",
index d87d8b722c40708e0932ff9f377df8d40a7df86a..494bbc9dc303a8be7ace5fed94f510b3ce761e26 100644 (file)
@@ -10,8 +10,10 @@ extern const isc::log::MessageID PERFMON_ALARM_TRIGGERED;
 extern const isc::log::MessageID PERFMON_DEINIT_FAILED;
 extern const isc::log::MessageID PERFMON_DEINIT_OK;
 extern const isc::log::MessageID PERFMON_DHCP4_PKT_EVENTS;
+extern const isc::log::MessageID PERFMON_DHCP4_PKT_PROCESS_ERROR;
 extern const isc::log::MessageID PERFMON_DHCP4_SOCKET_RECEIVED_TIME_SUPPORT;
 extern const isc::log::MessageID PERFMON_DHCP6_PKT_EVENTS;
+extern const isc::log::MessageID PERFMON_DHCP6_PKT_PROCESS_ERROR;
 extern const isc::log::MessageID PERFMON_DHCP6_SOCKET_RECEIVED_TIME_SUPPORT;
 extern const isc::log::MessageID PERFMON_INIT_FAILED;
 extern const isc::log::MessageID PERFMON_INIT_OK;
index 78cf358d83c6c276aceb4d1babf2c5b966e42ec9..85d893611b68ca354082c00cb699f8acc916b381 100644 (file)
@@ -56,3 +56,17 @@ triggered and this message will be repeated every alarm-report-secs.
 Arguments detail the alarm's key, the time the alarm was first
 triggered, the most recent reported average, and the high-watr-ms
 value.
+
+% PERFMON_DHCP4_PKT_PROCESS_ERROR Packet event stack was not processed for query %1, reason %2
+This debug message is emitted when the a query's event stack could not
+be processed. This is most likely a programmatic error and should be
+reported.  The arguments identify the query and the reason it could
+not be processed.  These errors should not affect server's normal
+operations.
+
+% PERFMON_DHCP6_PKT_PROCESS_ERROR Packet event stack was not processed for query %1, reason %2
+This debug message is emitted when the a query's event stack could not
+be processed. This is most likely a programmatic error and should be
+reported.  The arguments identify the query and the reason it could
+not be processed.  These errors should not affect server's normal
+operations.