diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml
index 16456ce16d252548a9370d9f93587d206f95f719..6b9f4d47c50e7918954812abacf6b8aa57064e02 100644
--- a/doc/guide/dhcp4-srv.xml
+++ b/doc/guide/dhcp4-srv.xml
@@ -719,6 +719,23 @@ temporarily override a list of interface names and listen on all interfaces.
supported on the particular OS, the server will issue a warning and
fall back to use IP/UDP sockets.
+
+ Interfaces are re-detected at each reconfiguration. This behavior
+ can be disabled by setting re-detect value to
+ false, for instance:
+
+
+"Dhcp4": {
+ "interfaces-config": {
+ "interfaces": [ "eth1", "eth3" ],
+ "re-detect": false
+ },
+ ...
+}
+
+ Note interfaces are not re-detected during config-test.
+
+
diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc
index fafa485174a09a0cfd9f9b9e4040e71bee5810bc..35d3f416129ed757600c5988d62129bd56e09575 100644
--- a/src/bin/dhcp4/json_config_parser.cc
+++ b/src/bin/dhcp4/json_config_parser.cc
@@ -483,9 +483,18 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set,
}
if (config_pair.first == "interfaces-config") {
+ ElementPtr ifaces_cfg =
+ boost::const_pointer_cast(config_pair.second);
+ if (check_only) {
+ // No re-detection in check only mode
+ ifaces_cfg->set("re-detect", Element::create(false));
+ } else if (!ifaces_cfg->contains("re-detect")) {
+ // Else the default is to re-detect
+ ifaces_cfg->set("re-detect", Element::create(true));
+ }
IfacesConfigParser parser(AF_INET);
CfgIfacePtr cfg_iface = srv_cfg->getCfgIface();
- parser.parse(cfg_iface, config_pair.second);
+ parser.parse(cfg_iface, ifaces_cfg);
continue;
}
diff --git a/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc
index 7bad1859ab4c23a259d52eaef8b31a554bc63974..47239ca19d39c47e6f90510356ab0ae523be0df6 100644
--- a/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc
+++ b/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc
@@ -49,7 +49,9 @@ namespace {
class NakedControlledDhcpv4Srv: public ControlledDhcpv4Srv {
// "Naked" DHCPv4 server, exposes internal fields
public:
- NakedControlledDhcpv4Srv():ControlledDhcpv4Srv(0) { }
+ NakedControlledDhcpv4Srv():ControlledDhcpv4Srv(0) {
+ CfgMgr::instance().setFamily(AF_INET);
+ }
/// Expose internal methods for the sake of testing
using Dhcpv4Srv::receivePacket;
diff --git a/src/bin/dhcp4/tests/dhcp4_test_utils.cc b/src/bin/dhcp4/tests/dhcp4_test_utils.cc
index ca17ad2b3c4ee2d84be642fac118ebe641430554..0ac816e40bb9355526a401e6e6d889a562563274 100644
--- a/src/bin/dhcp4/tests/dhcp4_test_utils.cc
+++ b/src/bin/dhcp4/tests/dhcp4_test_utils.cc
@@ -608,6 +608,9 @@ Dhcpv4SrvTest::configure(const std::string& config, NakedDhcpv4Srv& srv,
ASSERT_NO_THROW(json = parseJSON(config));
ConstElementPtr status;
+ // Patch the re-detect flag
+ patchIfacesReDetect(json);
+
// Configure the server and make sure the config is accepted
EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
ASSERT_TRUE(status);
diff --git a/src/bin/dhcp4/tests/dhcp4_test_utils.h b/src/bin/dhcp4/tests/dhcp4_test_utils.h
index 2a994843ef53c66365f1a1e236629bdb90cfd408..5c9581a3fc9381f503ab3f3c669d3da78cb9c37f 100644
--- a/src/bin/dhcp4/tests/dhcp4_test_utils.h
+++ b/src/bin/dhcp4/tests/dhcp4_test_utils.h
@@ -479,6 +479,18 @@ public:
NakedDhcpv4Srv srv_;
};
+/// @brief Patch the server config to add interface-config/re-detect=false
+/// @param json the server config
+inline void
+patchIfacesReDetect(isc::data::ConstElementPtr json) {
+ isc::data::ConstElementPtr ifaces_cfg = json->get("interfaces-config");
+ if (ifaces_cfg) {
+ isc::data::ElementPtr mutable_cfg =
+ boost::const_pointer_cast(ifaces_cfg);
+ mutable_cfg->set("re-detect", isc::data::Element::create(false));
+ }
+}
+
/// @brief Runs parser in JSON mode, useful for parser testing
///
/// @param in string to be parsed
@@ -503,7 +515,10 @@ parseDHCP4(const std::string& in, bool verbose = false)
{
try {
isc::dhcp::Parser4Context ctx;
- return (ctx.parseString(in, isc::dhcp::Parser4Context::SUBPARSER_DHCP4));
+ isc::data::ElementPtr json;
+ json = ctx.parseString(in, isc::dhcp::Parser4Context::SUBPARSER_DHCP4);
+ patchIfacesReDetect(json);
+ return (json);
}
catch (const std::exception& ex) {
if (verbose) {
diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc
index 8705dcff5a13401b7ff3f038f4ef491cda4c5038..26893d2ce184d17beccc256da3ab69f4a5f8177d 100644
--- a/src/bin/dhcp4/tests/get_config_unittest.cc
+++ b/src/bin/dhcp4/tests/get_config_unittest.cc
@@ -1517,7 +1517,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1558,7 +1559,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1624,7 +1626,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1690,7 +1693,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1756,7 +1760,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1894,7 +1899,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2032,7 +2038,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2098,7 +2105,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2164,7 +2172,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2230,7 +2239,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2296,7 +2306,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2362,7 +2373,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2452,7 +2464,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2542,7 +2555,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2608,7 +2622,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2704,7 +2719,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2770,7 +2786,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2821,7 +2838,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2872,7 +2890,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2932,7 +2951,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2983,7 +3003,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3034,7 +3055,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3085,7 +3107,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3136,7 +3159,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3217,7 +3241,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3298,7 +3323,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3389,7 +3415,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3464,7 +3491,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3580,7 +3608,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3669,7 +3698,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3775,7 +3805,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3850,7 +3881,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3957,7 +3989,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4036,7 +4069,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4120,7 +4154,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"eth0\", \"eth1\" ]\n"
+" \"interfaces\": [ \"eth0\", \"eth1\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4161,7 +4196,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ]\n"
+" \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4202,7 +4238,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4268,7 +4305,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4334,7 +4372,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4545,7 +4584,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4640,7 +4680,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4778,7 +4819,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4819,7 +4861,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4860,7 +4903,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4901,7 +4945,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4942,7 +4987,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5008,7 +5054,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5074,7 +5121,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5140,7 +5188,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5206,7 +5255,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5295,7 +5345,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5361,7 +5412,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5427,7 +5479,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5494,7 +5547,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5565,7 +5619,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5873,6 +5928,6 @@ TEST_P(Dhcp4GetConfigTest, run) {
/// Define the parametrized test loop
INSTANTIATE_TEST_CASE_P(Dhcp4GetConfigTest, Dhcp4GetConfigTest,
- ::testing::Range(static_cast(0), max_config_counter));
+ ::testing::Range(0UL, max_config_counter));
};
diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc
index 7e11de03a6f7dee92462c0282fd79bb026268dc4..cb733389bc696335b9ee880c1c4fd5312e308911 100644
--- a/src/bin/dhcp6/json_config_parser.cc
+++ b/src/bin/dhcp6/json_config_parser.cc
@@ -694,9 +694,18 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set,
}
if (config_pair.first == "interfaces-config") {
+ ElementPtr ifaces_cfg =
+ boost::const_pointer_cast(config_pair.second);
+ if (check_only) {
+ // No re-detection in check only mode
+ ifaces_cfg->set("re-detect", Element::create(false));
+ } else if (!ifaces_cfg->contains("re-detect")) {
+ // Else the default is to re-detect
+ ifaces_cfg->set("re-detect", Element::create(true));
+ }
IfacesConfigParser parser(AF_INET6);
CfgIfacePtr cfg_iface = srv_config->getCfgIface();
- parser.parse(cfg_iface, config_pair.second);
+ parser.parse(cfg_iface, ifaces_cfg);
continue;
}
diff --git a/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc
index cbb1db96d84a5f2d8535cfe06cc962b107eb0b9a..d1b91aab8be2d0703be86896a60c8cc2a5d28f04 100644
--- a/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc
+++ b/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc
@@ -49,6 +49,7 @@ class NakedControlledDhcpv6Srv: public ControlledDhcpv6Srv {
// "Naked" DHCPv6 server, exposes internal fields
public:
NakedControlledDhcpv6Srv():ControlledDhcpv6Srv(DHCP6_SERVER_PORT + 10000) {
+ CfgMgr::instance().setFamily(AF_INET6);
}
/// Expose internal methods for the sake of testing
@@ -576,7 +577,7 @@ TEST_F(CtrlChannelDhcpv6SrvTest, set_config) {
typedef std::map ElementMap;
-// This test checks which commands are registered by the DHCPv4 server.
+// This test checks which commands are registered by the DHCPv6 server.
TEST_F(CtrlDhcpv6SrvTest, commandsRegistration) {
ConstElementPtr list_cmds = createCommand("list-commands");
diff --git a/src/bin/dhcp6/tests/dhcp6_test_utils.cc b/src/bin/dhcp6/tests/dhcp6_test_utils.cc
index 3aa93f599a8377f816ee3a901203eabd26d4eb41..70b64d418978669f0fb9b0d60e97e9aa02bff61a 100644
--- a/src/bin/dhcp6/tests/dhcp6_test_utils.cc
+++ b/src/bin/dhcp6/tests/dhcp6_test_utils.cc
@@ -702,6 +702,9 @@ Dhcpv6SrvTest::configure(const std::string& config, NakedDhcpv6Srv& srv) {
ASSERT_NO_THROW(json = parseJSON(config));
ConstElementPtr status;
+ // Patch the re-detect flag
+ patchIfacesReDetect(json);
+
// Configure the server and make sure the config is accepted
EXPECT_NO_THROW(status = configureDhcp6Server(srv, json));
ASSERT_TRUE(status);
diff --git a/src/bin/dhcp6/tests/dhcp6_test_utils.h b/src/bin/dhcp6/tests/dhcp6_test_utils.h
index d2a89911552b739031a735248bb05523ab42b3be..3846029b4afa77d21d186ac1178758a0543f9d6b 100644
--- a/src/bin/dhcp6/tests/dhcp6_test_utils.h
+++ b/src/bin/dhcp6/tests/dhcp6_test_utils.h
@@ -639,6 +639,18 @@ public:
NakedDhcpv6Srv srv_;
};
+/// @brief Patch the server config to add interface-config/re-detect=false
+/// @param json the server config
+inline void
+patchIfacesReDetect(isc::data::ConstElementPtr json) {
+ isc::data::ConstElementPtr ifaces_cfg = json->get("interfaces-config");
+ if (ifaces_cfg) {
+ isc::data::ElementPtr mutable_cfg =
+ boost::const_pointer_cast(ifaces_cfg);
+ mutable_cfg->set("re-detect", isc::data::Element::create(false));
+ }
+}
+
/// @brief Runs parser in JSON mode, useful for parser testing
///
/// @param in string to be parsed
@@ -663,7 +675,10 @@ parseDHCP6(const std::string& in, bool verbose = false)
{
try {
isc::dhcp::Parser6Context ctx;
- return (ctx.parseString(in, isc::dhcp::Parser6Context::SUBPARSER_DHCP6));
+ isc::data::ElementPtr json;
+ json = ctx.parseString(in, isc::dhcp::Parser6Context::SUBPARSER_DHCP6);
+ patchIfacesReDetect(json);
+ return (json);
}
catch (const std::exception& ex) {
if (verbose) {
diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc
index 82722dda08b81d34c41b4984b7d210f29499b1ca..a6e8955de6e164b8db011bcac30c2fff941c4925 100644
--- a/src/bin/dhcp6/tests/get_config_unittest.cc
+++ b/src/bin/dhcp6/tests/get_config_unittest.cc
@@ -1495,7 +1495,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1545,7 +1546,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1620,7 +1622,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1767,7 +1770,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -1914,7 +1918,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2061,7 +2066,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2136,7 +2142,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2211,7 +2218,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2286,7 +2294,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2393,7 +2402,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2468,7 +2478,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2547,7 +2558,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2626,7 +2638,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2726,7 +2739,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2805,7 +2819,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2865,7 +2880,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2925,7 +2941,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -2994,7 +3011,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3054,7 +3072,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3114,7 +3133,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3204,7 +3224,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3294,7 +3315,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3394,7 +3416,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3478,7 +3501,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3603,7 +3627,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3718,7 +3743,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3846,7 +3872,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -3934,7 +3961,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4027,7 +4055,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"eth0\" ]\n"
+" \"interfaces\": [ \"eth0\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4077,7 +4106,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ]\n"
+" \"interfaces\": [ \"*\", \"eth0\", \"eth1\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4127,7 +4157,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4202,7 +4233,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4352,7 +4384,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4427,7 +4460,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4619,7 +4653,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4716,7 +4751,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4766,7 +4802,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4816,7 +4853,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ ]\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -4963,7 +5001,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5013,7 +5052,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5063,7 +5103,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5113,7 +5154,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5163,7 +5205,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5227,7 +5270,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5302,7 +5346,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5377,7 +5422,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5453,7 +5499,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5534,7 +5581,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5615,7 +5663,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5694,7 +5743,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -5774,7 +5824,8 @@ const char* UNPARSED_CONFIGS[] = {
" \"hooks-libraries\": [ ],\n"
" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
" \"interfaces-config\": {\n"
-" \"interfaces\": [ \"*\" ]\n"
+" \"interfaces\": [ \"*\" ],\n"
+" \"re-detect\": false\n"
" },\n"
" \"lease-database\": {\n"
" \"type\": \"memfile\"\n"
@@ -6100,6 +6151,6 @@ TEST_P(Dhcp6GetConfigTest, run) {
/// Define the parametrized test loop
INSTANTIATE_TEST_CASE_P(Dhcp6GetConfigTest, Dhcp6GetConfigTest,
- ::testing::Range(static_cast(0), max_config_counter));
+ ::testing::Range(0UL, max_config_counter));
};
diff --git a/src/lib/dhcpsrv/cfg_iface.cc b/src/lib/dhcpsrv/cfg_iface.cc
index cf7a7ffbecea91b75f2f24dbb6ad323def72ffa4..c7482b1cc47e932265473a1908bbb5e15ec0e124 100644
--- a/src/lib/dhcpsrv/cfg_iface.cc
+++ b/src/lib/dhcpsrv/cfg_iface.cc
@@ -22,7 +22,7 @@ namespace dhcp {
const char* CfgIface::ALL_IFACES_KEYWORD = "*";
CfgIface::CfgIface()
- : wildcard_used_(false), socket_type_(SOCKET_RAW) {
+ : wildcard_used_(false), socket_type_(SOCKET_RAW), re_detect_(false) {
}
void
@@ -425,6 +425,9 @@ CfgIface::toElement() const {
result->set("dhcp-socket-type", Element::create(std::string("udp")));
}
+ // Set re-detect
+ result->set("re-detect", Element::create(re_detect_));
+
return (result);
}
diff --git a/src/lib/dhcpsrv/cfg_iface.h b/src/lib/dhcpsrv/cfg_iface.h
index df02baed3e3b2ec054b47336146ef4f2055f69f6..ce1e9fb1eb6ddb542ff28e5af625caef4749f72e 100644
--- a/src/lib/dhcpsrv/cfg_iface.h
+++ b/src/lib/dhcpsrv/cfg_iface.h
@@ -257,6 +257,13 @@ public:
/// @return a pointer to unparsed configuration
virtual isc::data::ElementPtr toElement() const;
+ /// @brief Set the re-detect flag
+ ///
+ /// @param re_detect the new value of the flag
+ void setReDetect(bool re_detect) {
+ re_detect_ = re_detect;
+ }
+
private:
/// @brief Checks if multiple IPv4 addresses has been activated on any
@@ -330,6 +337,9 @@ private:
/// @brief A type of the sockets used by the DHCP server.
SocketType socket_type_;
+
+ /// @brief A boolean value which reflects current re-detect setting
+ bool re_detect_;
};
/// @brief A pointer to the @c CfgIface .
diff --git a/src/lib/dhcpsrv/parsers/ifaces_config_parser.cc b/src/lib/dhcpsrv/parsers/ifaces_config_parser.cc
index 29fe7aabed0e08f49305520c05cc81525c054ff5..31e6064c4822284d5a02188e537b89cd3e4bd372 100644
--- a/src/lib/dhcpsrv/parsers/ifaces_config_parser.cc
+++ b/src/lib/dhcpsrv/parsers/ifaces_config_parser.cc
@@ -41,16 +41,18 @@ void
IfacesConfigParser::parse(const CfgIfacePtr& cfg,
const isc::data::ConstElementPtr& ifaces_config) {
- // Get the pointer to the interface configuration.
+ // Check for re-detect before calling parseInterfacesList()
+ bool re_detect = getBoolean(ifaces_config, "re-detect");
+ cfg->setReDetect(re_detect);
+ if (re_detect) {
+ IfaceMgr::instance().clearIfaces();
+ IfaceMgr::instance().detectIfaces();
+ }
+
bool socket_type_specified = false;
BOOST_FOREACH(ConfigPair element, ifaces_config->mapValue()) {
try {
- // Check for re-detect before calling parseInterfacesList()
if (element.first == "re-detect") {
- if (element.second->boolValue()) {
- IfaceMgr::instance().clearIfaces();
- IfaceMgr::instance().detectIfaces();
- }
continue;
}
diff --git a/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc b/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc
index 63951dd91113056447ce5c94f652f9c501d19760..efea58bedab6b408803591acd1f777512cff6ee0 100644
--- a/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc
+++ b/src/lib/dhcpsrv/tests/cfg_iface_unittest.cc
@@ -371,7 +371,8 @@ TEST_F(CfgIfaceTest, unparse) {
// Check unparse
std::string expected =
- "{ \"interfaces\": [ \"*\", \"eth0\", \"eth1/192.0.2.3\" ] }";
+ "{ \"interfaces\": [ \"*\", \"eth0\", \"eth1/192.0.2.3\" ], "
+ "\"re-detect\": false }";
runToElementTest(expected, cfg4);
// Now check IPv6
@@ -381,7 +382,8 @@ TEST_F(CfgIfaceTest, unparse) {
EXPECT_NO_THROW(cfg6.use(AF_INET6, "eth0/2001:db8:1::1"));
expected =
- "{ \"interfaces\": [ \"*\", \"eth1\", \"eth0/2001:db8:1::1\" ] }";
+ "{ \"interfaces\": [ \"*\", \"eth1\", \"eth0/2001:db8:1::1\" ], "
+ "\"re-detect\": false }";
runToElementTest(expected, cfg6);
}
@@ -402,7 +404,8 @@ TEST(CfgIfaceNoStubTest, useSocketType) {
// Check unparse
std::string expected = "{\n"
" \"interfaces\": [ ],\n"
- " \"dhcp-socket-type\": \"udp\" }";
+ " \"dhcp-socket-type\": \"udp\",\n"
+ " \"re-detect\": false }";
runToElementTest(expected, cfg);
// Select raw sockets.
diff --git a/src/lib/dhcpsrv/tests/ifaces_config_parser_unittest.cc b/src/lib/dhcpsrv/tests/ifaces_config_parser_unittest.cc
index 3854dc46dfc45e4744f6d116c48a6df201a28347..8cc6c4779e645e6b7c518d2fe14cdceec6b09c7a 100644
--- a/src/lib/dhcpsrv/tests/ifaces_config_parser_unittest.cc
+++ b/src/lib/dhcpsrv/tests/ifaces_config_parser_unittest.cc
@@ -53,7 +53,8 @@ TEST_F(IfacesConfigParserTest, interfaces) {
IfaceMgrTestConfig test_config(true);
// Configuration with one interface.
- std::string config = "{ ""\"interfaces\": [ \"eth0\" ] }";
+ std::string config =
+ "{ \"interfaces\": [ \"eth0\" ], \"re-detect\": false }";
ElementPtr config_element = Element::fromJSON(config);
@@ -81,7 +82,7 @@ TEST_F(IfacesConfigParserTest, interfaces) {
// Try similar configuration but this time add a wildcard interface
// to see if sockets will open on all interfaces.
- config = "{ \"interfaces\": [ \"eth0\", \"*\" ] }";
+ config = "{ \"interfaces\": [ \"eth0\", \"*\" ], \"re-detect\": false }";
config_element = Element::fromJSON(config);
cfg_iface = CfgMgr::instance().getStagingCfg()->getCfgIface();
@@ -106,7 +107,8 @@ TEST_F(IfacesConfigParserTest, socketTypeRaw) {
// Configuration with a raw socket selected.
std::string config = "{ ""\"interfaces\": [ ],"
- " \"dhcp-socket-type\": \"raw\" }";
+ " \"dhcp-socket-type\": \"raw\","
+ " \"re-detect\": false }";
ElementPtr config_element = Element::fromJSON(config);
@@ -132,7 +134,8 @@ TEST_F(IfacesConfigParserTest, socketTypeDatagram) {
// Configuration with a datagram socket selected.
std::string config = "{ \"interfaces\": [ ],"
- " \"dhcp-socket-type\": \"udp\" }";
+ " \"dhcp-socket-type\": \"udp\","
+ " \"re-detect\": false }";
ElementPtr config_element = Element::fromJSON(config);
@@ -160,14 +163,16 @@ TEST_F(IfacesConfigParserTest, socketTypeInvalid) {
IfacesConfigParser parser4(AF_INET);
CfgIfacePtr cfg_iface = CfgMgr::instance().getStagingCfg()->getCfgIface();
std::string config = "{ \"interfaces\": [ ],"
- "\"dhcp-socket-type\": \"default\" }";
+ "\"dhcp-socket-type\": \"default\","
+ " \"re-detect\": false }";
ElementPtr config_element = Element::fromJSON(config);
ASSERT_THROW(parser4.parse(cfg_iface, config_element), DhcpConfigError);
// For DHCPv6 we don't accept any socket type.
IfacesConfigParser parser6(AF_INET6);
config = "{ \"interfaces\": [ ],"
- " \"dhcp-socket-type\": \"udp\" }";
+ " \"dhcp-socket-type\": \"udp\","
+ " \"re-detect\": false }";
config_element = Element::fromJSON(config);
ASSERT_THROW(parser6.parse(cfg_iface, config_element), DhcpConfigError);
}
diff --git a/src/lib/dhcpsrv/tests/srv_config_unittest.cc b/src/lib/dhcpsrv/tests/srv_config_unittest.cc
index 533941fd737cf336bf5e60ca456458fd450b2f80..acd92910e362bf0b7d90b927848e65c1432fa56d 100644
--- a/src/lib/dhcpsrv/tests/srv_config_unittest.cc
+++ b/src/lib/dhcpsrv/tests/srv_config_unittest.cc
@@ -437,7 +437,8 @@ TEST_F(SrvConfigTest, unparse) {
std::string defaults = "\"decline-probation-period\": 0,\n";
defaults += "\"dhcp4o6-port\": 0,\n";
- defaults += "\"interfaces-config\": { \"interfaces\": [ ] },\n";
+ defaults += "\"interfaces-config\": { \"interfaces\": [ ],\n";
+ defaults += " \"re-detect\": false },\n";
defaults += "\"option-def\": [ ],\n";
defaults += "\"option-data\": [ ],\n";
defaults += "\"expired-leases-processing\": ";