2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-05 08:25:16 +00:00

[#3110] HA decline updates working

Updates are working, need clean up and UTs in HA.

src/bin/dhcp4/dhcp4_hooks.dox
    Updated hooks dev guide

src/bin/dhcp4/dhcp4_srv.cc
    Added callout lease4_server_decline

    Dhcpv4Srv::serverDecline() - added lease4_server_decline hook point

src/bin/dhcp4/tests/hooks_unittest.cc
    TEST_F(HooksDhcpv4SrvTest, lease4OfferDiscoverDecline) - new test

src/hooks/dhcp/high_availability/ha_callouts.cc
    lease4_server_decline()  - new callout function

src/hooks/dhcp/high_availability/ha_impl.*
    HAImpl::lease4ServerDecline() - new callout handler

src/hooks/dhcp/high_availability/ha_messages.mes
    HA_LEASE4_SERVER_DECLINE_FAILED - new log

src/hooks/dhcp/high_availability/ha_service.*
    HAService::asyncSendLeaseUpdate() - new function for a single lease update
    HAService::asyncSendLeaseUpdates() - check parking lot null
This commit is contained in:
Thomas Markwalder
2023-11-28 16:00:43 -05:00
parent 0c8e5fd690
commit f08a02278d
11 changed files with 327 additions and 53 deletions

View File

@@ -89,31 +89,33 @@ namespace {
/// Structure that holds registered hook indexes
struct Dhcp4Hooks {
int hook_index_buffer4_receive_; ///< index for "buffer4_receive" hook point
int hook_index_pkt4_receive_; ///< index for "pkt4_receive" hook point
int hook_index_subnet4_select_; ///< index for "subnet4_select" hook point
int hook_index_leases4_committed_; ///< index for "leases4_committed" hook point
int hook_index_lease4_release_; ///< index for "lease4_release" hook point
int hook_index_pkt4_send_; ///< index for "pkt4_send" hook point
int hook_index_buffer4_send_; ///< index for "buffer4_send" hook point
int hook_index_lease4_decline_; ///< index for "lease4_decline" hook point
int hook_index_host4_identifier_; ///< index for "host4_identifier" hook point
int hook_index_ddns4_update_; ///< index for "ddns4_update" hook point
int hook_index_lease4_offer_; ///< index for "lease4_offer" hook point
int hook_index_buffer4_receive_; ///< index for "buffer4_receive" hook point
int hook_index_pkt4_receive_; ///< index for "pkt4_receive" hook point
int hook_index_subnet4_select_; ///< index for "subnet4_select" hook point
int hook_index_leases4_committed_; ///< index for "leases4_committed" hook point
int hook_index_lease4_release_; ///< index for "lease4_release" hook point
int hook_index_pkt4_send_; ///< index for "pkt4_send" hook point
int hook_index_buffer4_send_; ///< index for "buffer4_send" hook point
int hook_index_lease4_decline_; ///< index for "lease4_decline" hook point
int hook_index_host4_identifier_; ///< index for "host4_identifier" hook point
int hook_index_ddns4_update_; ///< index for "ddns4_update" hook point
int hook_index_lease4_offer_; ///< index for "lease4_offer" hook point
int hook_index_lease4_server_decline_; ///< index for "lease4_server_decline" hook point
/// Constructor that registers hook points for DHCPv4 engine
Dhcp4Hooks() {
hook_index_buffer4_receive_ = HooksManager::registerHook("buffer4_receive");
hook_index_pkt4_receive_ = HooksManager::registerHook("pkt4_receive");
hook_index_subnet4_select_ = HooksManager::registerHook("subnet4_select");
hook_index_leases4_committed_ = HooksManager::registerHook("leases4_committed");
hook_index_lease4_release_ = HooksManager::registerHook("lease4_release");
hook_index_pkt4_send_ = HooksManager::registerHook("pkt4_send");
hook_index_buffer4_send_ = HooksManager::registerHook("buffer4_send");
hook_index_lease4_decline_ = HooksManager::registerHook("lease4_decline");
hook_index_host4_identifier_ = HooksManager::registerHook("host4_identifier");
hook_index_ddns4_update_ = HooksManager::registerHook("ddns4_update");
hook_index_lease4_offer_ = HooksManager::registerHook("lease4_offer");
hook_index_buffer4_receive_ = HooksManager::registerHook("buffer4_receive");
hook_index_pkt4_receive_ = HooksManager::registerHook("pkt4_receive");
hook_index_subnet4_select_ = HooksManager::registerHook("subnet4_select");
hook_index_leases4_committed_ = HooksManager::registerHook("leases4_committed");
hook_index_lease4_release_ = HooksManager::registerHook("lease4_release");
hook_index_pkt4_send_ = HooksManager::registerHook("pkt4_send");
hook_index_buffer4_send_ = HooksManager::registerHook("buffer4_send");
hook_index_lease4_decline_ = HooksManager::registerHook("lease4_decline");
hook_index_host4_identifier_ = HooksManager::registerHook("host4_identifier");
hook_index_ddns4_update_ = HooksManager::registerHook("ddns4_update");
hook_index_lease4_offer_ = HooksManager::registerHook("lease4_offer");
hook_index_lease4_server_decline_ = HooksManager::registerHook("lease4_server_decline");
}
};
@@ -3949,8 +3951,11 @@ Dhcpv4Srv::declineLease(const Lease4Ptr& lease, const Pkt4Ptr& decline,
}
void
Dhcpv4Srv::serverDecline(hooks::CalloutHandlePtr& /* callout_handle */, Pkt4Ptr& query,
Dhcpv4Srv::serverDecline(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr& query,
Lease4Ptr lease, bool lease_exists) {
LOG_INFO(lease4_logger, DHCP4_SERVER_INITIATED_DECLINE)
.arg(lease->addr_.toText())
.arg(lease->valid_lft_);
{
// Check if the resource is busy i.e. can be modified by another thread
@@ -4039,47 +4044,25 @@ Dhcpv4Srv::serverDecline(hooks::CalloutHandlePtr& /* callout_handle */, Pkt4Ptr&
StatsMgr::instance().addValue("assigned-addresses", static_cast<int64_t>(1));
}
/* (comment it out so picky tools don't flag this as dead code
//
/// @todo #3110, HA will implement a handler for this hook point to
/// propagate an update of the lease to peers.
//
// Let's check if there are hooks installed for server decline hook point.
// If they are, let's pass the lease and client's packet. Note this code
// has never been compiled, it is just an initial draft.
// If there are, let's pass the DHCPDISCOVER and the declined lease .
if (HooksManager::calloutsPresent(Hooks.hook_index_lease4_server_decline_)) {
CalloutHandlePtr callout_handle = getCalloutHandle(decline);
// Use the RAII wrapper to make sure that the callout handle state is
// reset when this object goes out of scope. All hook points must do
// it to prevent possible circular dependency between the callout
// handle and its arguments.
ScopedCalloutHandleState callout_handle_state(callout_handle);
// Pass the original packet
// Pass in the original DHCPDISCOVER
callout_handle->setArgument("query4", query);
// Pass the lease to be updated
// Pass in the declined lease.
callout_handle->setArgument("lease4", lease);
// Call callouts
HooksManager::callCallouts(Hooks.hook_index_lease4_server_decline_,
*callout_handle);
// Check if callouts decided to skip the next processing step.
// If any of them did, we will drop the packet.
if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) ||
(callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP)) {
LOG_DEBUG(hooks_logger, DBGLVL_PKT_HANDLING, DHCP4_HOOK_SERVER_DECLINE_SKIP)
.arg(query->getLabel()).arg(lease->addr_.toText());
return;
}
}
*/
LOG_INFO(lease4_logger, DHCP4_SERVER_INITIATED_DECLINE)
.arg(lease->addr_.toText())
.arg(lease->valid_lft_);
}
void
@@ -4092,7 +4075,6 @@ Dhcpv4Srv::serverDeclineNoThrow(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr
}
}
Pkt4Ptr
Dhcpv4Srv::processInform(Pkt4Ptr& inform, AllocEngine::ClientContext4Ptr& context) {
// server-id is supposed to be forbidden (as is requested address)