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 =
// 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.
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
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);
}
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);
}
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";
"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",
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;
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.