From d996bf25a1703a7fb1c1b5500a41adf571466b90 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 16 Mar 2017 23:38:52 +0100 Subject: [PATCH] [3389a] Commit before regen --- doc/guide/dhcp4-srv.xml | 17 ++ doc/guide/dhcp6-srv.xml | 7 + src/bin/dhcp4/json_config_parser.cc | 11 +- .../dhcp4/tests/ctrl_dhcp4_srv_unittest.cc | 4 +- src/bin/dhcp4/tests/dhcp4_test_utils.cc | 3 + src/bin/dhcp4/tests/dhcp4_test_utils.h | 17 +- src/bin/dhcp4/tests/get_config_unittest.cc | 167 ++++++++++++------ src/bin/dhcp6/json_config_parser.cc | 11 +- .../dhcp6/tests/ctrl_dhcp6_srv_unittest.cc | 3 +- src/bin/dhcp6/tests/dhcp6_test_utils.cc | 3 + src/bin/dhcp6/tests/dhcp6_test_utils.h | 17 +- src/bin/dhcp6/tests/get_config_unittest.cc | 155 ++++++++++------ src/lib/dhcpsrv/cfg_iface.cc | 5 +- src/lib/dhcpsrv/cfg_iface.h | 10 ++ .../dhcpsrv/parsers/ifaces_config_parser.cc | 14 +- src/lib/dhcpsrv/tests/cfg_iface_unittest.cc | 9 +- .../tests/ifaces_config_parser_unittest.cc | 17 +- src/lib/dhcpsrv/tests/srv_config_unittest.cc | 3 +- 18 files changed, 342 insertions(+), 131 deletions(-) diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 16456ce16..6b9f4d47c 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/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index 0383fc90d..8a5200622 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -625,6 +625,13 @@ for MySQL and PostgreSQL databases. It is anticipated that this will form of usage only be used where it is desired to temporarily override a list of interface names and listen on all interfaces. + + As for the DHCPv4 server binding to specific addresses and + disabling re-detection of interfaces are supported. But + dhcp-socket-type is not because DHCPv6 uses + UDP/IPv6 sockets only. + +
diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index fafa48517..35d3f4161 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 7bad1859a..47239ca19 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 ca17ad2b3..0ac816e40 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 2a994843e..5c9581a3f 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 8705dcff5..26893d2ce 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 7e11de03a..cb733389b 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 cbb1db96d..d1b91aab8 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 3aa93f599..70b64d418 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 d2a899115..3846029b4 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 82722dda0..a6e8955de 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 cf7a7ffbe..c7482b1cc 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 df02baed3..ce1e9fb1e 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 29fe7aabe..31e6064c4 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 63951dd91..efea58bed 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 3854dc46d..8cc6c4779 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 533941fd7..acd92910e 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\": "; -- GitLab