]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5564] Servers dump cached and parked packets on reconfig and shutdown
authorThomas Markwalder <tmark@isc.org>
Tue, 15 May 2018 19:56:18 +0000 (15:56 -0400)
committerThomas Markwalder <tmark@isc.org>
Tue, 15 May 2018 20:00:22 +0000 (16:00 -0400)
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

src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.h
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp6/dhcp6_srv.cc
src/bin/dhcp6/dhcp6_srv.h
src/bin/dhcp6/json_config_parser.cc
src/lib/hooks/hooks_manager.h

index ddd6043370c678c6b98cfabe8de891339d52de54..bfe50702f77156efc30003a42a50f8cf48574988 100644 (file)
@@ -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
index 3d8c46440d37816522dbfb87fe9b02999c0afba0..a1ce6c7d8a171e3f626cda88c2cf7320a17b6d05 100644 (file)
@@ -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.
index 43c0758ddf1c9b9ea5a5714fb47c15d85a0f43be..d9139d2025ab3ff86cdf8e43183ecdd484c8a184 100644 (file)
@@ -8,6 +8,7 @@
 
 #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>
@@ -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.
index 03bb5a51dba5339d31f8caef71a499a6079f3ce7..6204c7dda25f7dd60efa772e935e97555faacb56 100644 (file)
@@ -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();
+}
 
 };
 };
index 71b7e2bd6ec115fd1066f01d841be2b6ea657eb8..db9ec846c77fedbbe3afc679f100dad82233e850 100644 (file)
@@ -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
index 531a6588a20198297333c156eafc369eccb33aa4..35575fd1125cb3dedc9967b3590c7443f4a1c120 100644 (file)
@@ -13,6 +13,7 @@
 #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>
@@ -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.
index 38ff028989deff498bd102e0128c472060a100dc..b31bce34e895f09c64122bc57073a905a306c41f 100644 (file)
@@ -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.