From: Thomas Markwalder Date: Tue, 15 May 2018 19:56:18 +0000 (-0400) Subject: [5564] Servers dump cached and parked packets on reconfig and shutdown X-Git-Tag: trac5549a_base~14^2~1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b9b5e26f0508473bb8f726ee0a4d93e8f6fc07b;p=thirdparty%2Fkea.git [5564] Servers dump cached and parked packets on reconfig and shutdown src/bin/dhcp4/dhcp4_srv.* - dumpPackets() - new function that frees all cached and parked packets - Dhcpv4Srv::~Dhcpv4Srv() - added call to dumpPackets() for cleanliness src/bin/dhcp4/json_config_parser.cc configureDhcp4Server() - added a call Dhcpv4Srv::dumpPackets() src/bin/dhcp6/dhcp6_srv.* - dumpPackets() - new function that frees all cached and parked packets - Dhcpv6Srv::~Dhcpv6Srv() - added call to dumpPackets() for cleanliness src/bin/dhcp6/json_config_parser.cc configureDhcp6Server() - added a call Dhcpv6Srv::dumpPackets() src/lib/hooks/hooks_manager.h - clearParkingLots() - new convenience function for clearing all parking lots - clearParkingLotsInternal() - private impl of the above --- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index ddd6043370..bfe50702f7 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -459,6 +459,9 @@ Dhcpv4Srv::Dhcpv4Srv(uint16_t port, const bool use_bcast, } Dhcpv4Srv::~Dhcpv4Srv() { + // Discard any cached packets or parked packets + dumpPackets(); + try { stopD2(); } catch(const std::exception& ex) { @@ -3586,5 +3589,13 @@ int Dhcpv4Srv::getHookIndexLease4Decline() { 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 diff --git a/src/bin/dhcp4/dhcp4_srv.h b/src/bin/dhcp4/dhcp4_srv.h index 3d8c46440d..a1ce6c7d8a 100644 --- a/src/bin/dhcp4/dhcp4_srv.h +++ b/src/bin/dhcp4/dhcp4_srv.h @@ -329,6 +329,10 @@ public: 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. diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index 43c0758ddf..d9139d2025 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -272,7 +273,7 @@ void configureCommandChannel() { } 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, @@ -290,6 +291,7 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr 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. diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 03bb5a51db..6204c7dda2 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -218,6 +218,7 @@ Dhcpv6Srv::Dhcpv6Srv(uint16_t port) } Dhcpv6Srv::~Dhcpv6Srv() { + dumpPackets(); try { stopD2(); } catch(const std::exception& ex) { @@ -3761,6 +3762,12 @@ Dhcpv6Srv::requestedInORO(const Pkt6Ptr& query, const uint16_t code) const { 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(); +} }; }; diff --git a/src/bin/dhcp6/dhcp6_srv.h b/src/bin/dhcp6/dhcp6_srv.h index 71b7e2bd6e..db9ec846c7 100644 --- a/src/bin/dhcp6/dhcp6_srv.h +++ b/src/bin/dhcp6/dhcp6_srv.h @@ -174,6 +174,11 @@ public: 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 diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index 531a6588a2..35575fd112 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -369,7 +370,7 @@ void configureCommandChannel() { } isc::data::ConstElementPtr -configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set, +configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set, bool check_only) { if (!config_set) { @@ -388,6 +389,7 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr 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. diff --git a/src/lib/hooks/hooks_manager.h b/src/lib/hooks/hooks_manager.h index 38ff028989..b31bce34e8 100644 --- a/src/lib/hooks/hooks_manager.h +++ b/src/lib/hooks/hooks_manager.h @@ -310,6 +310,10 @@ public: getHooksManager().referenceInternal(hook_name, parked_object); } + static void clearParkingLots() { + getHooksManager().clearParkingLotsInternal(); + } + private: /// @brief Constructor @@ -367,6 +371,10 @@ private: 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.