}
Dhcpv4Srv::~Dhcpv4Srv() {
+ // Discard any cached packets or parked packets
+ dumpPackets();
+
try {
stopD2();
} catch(const std::exception& ex) {
return (Hooks.hook_index_lease4_decline_);
}
+void Dhcpv4Srv::dumpPackets() {
+ // Clear any packets held by the callhout handle store and
+ // all parked packets
+ isc::dhcp::Pkt4Ptr pkt4ptr_empty;
+ isc::dhcp::getCalloutHandle(pkt4ptr_empty);
+ HooksManager::clearParkingLots();
+}
+
} // namespace dhcp
} // namespace isc
virtual void d2ClientErrorHandler(const dhcp_ddns::
NameChangeSender::Result result,
dhcp_ddns::NameChangeRequestPtr& ncr);
+
+ /// @brief Discard all in-progress packets
+ void dumpPackets();
+
protected:
/// @name Functions filtering and sanity-checking received messages.
#include <cc/command_interpreter.h>
#include <dhcp4/dhcp4_log.h>
+#include <dhcp4/dhcp4_srv.h>
#include <dhcp/libdhcp++.h>
#include <dhcp/option_definition.h>
#include <dhcpsrv/cfg_option.h>
}
isc::data::ConstElementPtr
-configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set,
+configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
bool check_only) {
if (!config_set) {
ConstElementPtr answer = isc::config::createAnswer(1,
// Remove any existing timers.
if (!check_only) {
TimerMgr::instance()->unregisterTimers();
+ server.dumpPackets();
}
// Revert any runtime option definitions configured so far and not committed.
}
Dhcpv6Srv::~Dhcpv6Srv() {
+ dumpPackets();
try {
stopD2();
} catch(const std::exception& ex) {
return (false);
}
+void Dhcpv6Srv::dumpPackets() {
+ // Dump all of our current packets, anything that is mid-stream
+ isc::dhcp::Pkt6Ptr pkt6ptr_empty;
+ isc::dhcp::getCalloutHandle(pkt6ptr_empty);
+ ServerHooks::getServerHooks().getParkingLotsPtr()->clear();
+}
};
};
NameChangeSender::Result result,
dhcp_ddns::NameChangeRequestPtr& ncr);
+ /// @brief Dumps cached and parked packets
+ /// Clears the call_handle store and packet parking lots
+ /// of all packets. Called during reconfigure and shutdown.
+ void dumpPackets();
+
protected:
/// @brief Compare received server id with our server id
#include <dhcp/libdhcp++.h>
#include <dhcp6/json_config_parser.h>
#include <dhcp6/dhcp6_log.h>
+#include <dhcp6/dhcp6_srv.h>
#include <dhcp/iface_mgr.h>
#include <dhcpsrv/cfg_option.h>
#include <dhcpsrv/cfgmgr.h>
}
isc::data::ConstElementPtr
-configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set,
+configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
bool check_only) {
if (!config_set) {
// Remove any existing timers.
if (!check_only) {
TimerMgr::instance()->unregisterTimers();
+ server.dumpPackets();
}
// Revert any runtime option definitions configured so far and not committed.
getHooksManager().referenceInternal(hook_name, parked_object);
}
+ static void clearParkingLots() {
+ getHooksManager().clearParkingLotsInternal();
+ }
+
private:
/// @brief Constructor
getParkingLotPtr(hook_name)->reference(parked_object);
}
+ void clearParkingLotsInternal() {
+ ServerHooks::getServerHooks().getParkingLotsPtr()->clear();
+ }
+
//@{
/// The following methods correspond to similarly-named static methods,
/// but actually do the work on the singleton instance of the HooksManager.