diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index d9bc01fc52..34559552fa 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -269,6 +269,7 @@ Dhcpv4Srv::~Dhcpv4Srv() { // Highly unlikely, but lets Report it but go on LOG_ERROR(dhcp4_logger, DHCP4_SRV_D2STOP_ERROR).arg(ex.what()); } + IfaceMgr::instance().closeSockets(); } diff --git a/src/bin/dhcp6/dhcp6_messages.mes b/src/bin/dhcp6/dhcp6_messages.mes index 5b62bb73bc..64076fab6c 100644 --- a/src/bin/dhcp6/dhcp6_messages.mes +++ b/src/bin/dhcp6/dhcp6_messages.mes @@ -676,6 +676,12 @@ core component within the IPv6 DHCP server (the Dhcpv6 server object) has failed. As a result, the server will exit. The reason for the failure is given within the message. +% DHCP6_SRV_D2STOP_ERROR error stopping IO with DHCP_DDNS during shutdown: %1 +This error message indicates that during shutdown, an erro occurred while +stopping IO between the DHCPv6 server and the DHCP_DDNS server. This is +probably due to a programmatic error is not likely to impact either server +upon restart. The reason for the failure is given within the message. + % DHCP6_STANDALONE skipping message queue, running standalone This is a debug message indicating that the IPv6 server is running in standalone mode, not connected to the message queue. Standalone mode diff --git a/src/bin/dhcp6/dhcp6_srv.cc b/src/bin/dhcp6/dhcp6_srv.cc index 9f29e9d03f..ba14b2196b 100644 --- a/src/bin/dhcp6/dhcp6_srv.cc +++ b/src/bin/dhcp6/dhcp6_srv.cc @@ -229,6 +229,13 @@ Dhcpv6Srv::Dhcpv6Srv(uint16_t port) } Dhcpv6Srv::~Dhcpv6Srv() { + try { + stopD2(); + } catch(const std::exception& ex) { + // Highly unlikely, but lets Report it but go on + LOG_ERROR(dhcp6_logger, DHCP6_SRV_D2STOP_ERROR).arg(ex.what()); + } + IfaceMgr::instance().closeSockets(); LeaseMgrFactory::destroy(); @@ -2872,6 +2879,15 @@ Dhcpv6Srv::startD2() { } } +void +Dhcpv6Srv::stopD2() { + D2ClientMgr& d2_mgr = CfgMgr::instance().getD2ClientMgr(); + if (d2_mgr.ddnsEnabled()) { + // Updates are enabled, so lets stop the sender + d2_mgr.stopSender(); + } +} + void Dhcpv6Srv::d2ClientErrorHandler(const dhcp_ddns::NameChangeSender::Result result, diff --git a/src/bin/dhcp6/dhcp6_srv.h b/src/bin/dhcp6/dhcp6_srv.h index 422eff5847..8705caf2ea 100644 --- a/src/bin/dhcp6/dhcp6_srv.h +++ b/src/bin/dhcp6/dhcp6_srv.h @@ -124,6 +124,13 @@ public: /// D2ClientErrors. This method does not catch exceptions. void startD2(); + /// @brief Stops DHCP_DDNS client IO if DDNS updates are enabled. + /// + /// If updates are enabled, it instructs the D2ClientMgr singleton to + /// leave send mode. If D2ClientMgr encounters errors it may throw + /// D2ClientErrors. This method does not catch exceptions. + void stopD2(); + /// @brief Implements the error handler for DHCP_DDNS IO errors /// /// Invoked when a NameChangeRequest send to kea-dhcp-ddns completes with diff --git a/src/bin/dhcp6/tests/dhcp6_process_tests.sh.in b/src/bin/dhcp6/tests/dhcp6_process_tests.sh.in index e9748b8419..62ceda2965 100755 --- a/src/bin/dhcp6/tests/dhcp6_process_tests.sh.in +++ b/src/bin/dhcp6/tests/dhcp6_process_tests.sh.in @@ -37,7 +37,11 @@ CONFIG="{ { \"subnet\": \"2001:db8:1::/64\", \"pools\": [ { \"pool\": \"2001:db8:1::10-2001:db8:1::100\" } ] - } ] + } ], + \"dhcp-ddns\": { + \"enable-updates\": true, + \"qualifying-suffix\": \"\" + } }, \"Logging\":