summaryrefslogtreecommitdiffstats
path: root/src/bin/dhcp6/tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/dhcp6/tests')
-rw-r--r--src/bin/dhcp6/tests/config_parser_unittest.cc183
-rw-r--r--src/bin/dhcp6/tests/fqdn_unittest.cc128
-rw-r--r--src/bin/dhcp6/tests/get_config_unittest.cc592
3 files changed, 871 insertions, 32 deletions
diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc
index 015c697152..b534825560 100644
--- a/src/bin/dhcp6/tests/config_parser_unittest.cc
+++ b/src/bin/dhcp6/tests/config_parser_unittest.cc
@@ -9284,4 +9284,187 @@ TEST_F(Dhcp6ParserTest, deprecatedClientClassesCheck) {
" and 'client-classes'. Use only the latter.");
}
+// Verifies ddns-ttl-percent is supported at global,
+// shared-network, and subnet scopes.
+TEST_F(Dhcp6ParserTest, ddnsTtlPercent) {
+ string config = R"(
+ {
+ "ddns-ttl-percent": 0.75,
+ "valid-lifetime": 4000,
+ "shared-networks": [{
+ "name": "net",
+ "ddns-ttl-percent": 0.50,
+ "subnet6": [{
+ "id": 1,
+ "subnet": "2001:db8:1::/64",
+ "ddns-ttl-percent": 0.25
+ }],
+ }]
+ }
+ )";
+
+ ConstElementPtr json;
+ ASSERT_NO_THROW(json = parseDHCP6(config));
+ extractConfig(config);
+
+ ConstElementPtr status;
+ ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
+ // returned value should be 0 (success)
+ checkResult(status, 0);
+
+ // Commit it so global inheritance works.
+ CfgMgr::instance().commit();
+
+ ConstSubnet6Ptr subnet = CfgMgr::instance().getCurrentCfg()->
+ getCfgSubnets6()->selectSubnet(IOAddress("2001:db8:1::"));
+ ASSERT_TRUE(subnet);
+
+ EXPECT_FALSE(subnet->getDdnsTtlPercent(Network::Inheritance::NONE).unspecified());
+ EXPECT_EQ(0.25, subnet->getDdnsTtlPercent(Network::Inheritance::NONE).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlPercent(Network::Inheritance::PARENT_NETWORK).unspecified());
+ EXPECT_EQ(0.50, subnet->getDdnsTtlPercent(Network::Inheritance::PARENT_NETWORK).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlPercent(Network::Inheritance::GLOBAL).unspecified());
+ EXPECT_EQ(0.75, subnet->getDdnsTtlPercent(Network::Inheritance::GLOBAL).get());
+}
+
+// Verifies ddns-ttl is supported at global,
+// shared-network, and subnet scopes.
+TEST_F(Dhcp6ParserTest, ddnsTtl) {
+ string config = R"(
+ {
+ "ddns-ttl": 750,
+ "valid-lifetime": 4000,
+ "shared-networks": [{
+ "name": "net",
+ "ddns-ttl": 500,
+ "subnet6": [{
+ "id": 1,
+ "subnet": "2001:db8:1::/64",
+ "ddns-ttl": 250
+ }],
+ }]
+ }
+ )";
+
+ ConstElementPtr json;
+ ASSERT_NO_THROW(json = parseDHCP6(config));
+ extractConfig(config);
+
+ ConstElementPtr status;
+ ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
+
+ // returned value should be 0 (success)
+ checkResult(status, 0);
+
+ // Commit it so global inheritance works.
+ CfgMgr::instance().commit();
+
+ ConstSubnet6Ptr subnet = CfgMgr::instance().getCurrentCfg()->
+ getCfgSubnets6()->selectSubnet(IOAddress("2001:db8:1::"));
+ ASSERT_TRUE(subnet);
+
+ EXPECT_FALSE(subnet->getDdnsTtl(Network::Inheritance::NONE).unspecified());
+ EXPECT_EQ(250, subnet->getDdnsTtl(Network::Inheritance::NONE).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtl(Network::Inheritance::PARENT_NETWORK).unspecified());
+ EXPECT_EQ(500, subnet->getDdnsTtl(Network::Inheritance::PARENT_NETWORK).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtl(Network::Inheritance::GLOBAL).unspecified());
+ EXPECT_EQ(750, subnet->getDdnsTtl(Network::Inheritance::GLOBAL).get());
+}
+
+// Verifies ddns-ttl-min is supported at global,
+// shared-network, and subnet scopes.
+TEST_F(Dhcp6ParserTest, ddnsTtlMin) {
+ string config = R"(
+ {
+ "ddns-ttl-min": 750,
+ "valid-lifetime": 4000,
+ "shared-networks": [{
+ "name": "net",
+ "ddns-ttl-min": 500,
+ "subnet6": [{
+ "id": 1,
+ "subnet": "2001:db8:1::/64",
+ "ddns-ttl-min": 250
+ }],
+ }]
+ }
+ )";
+
+ ConstElementPtr json;
+ ASSERT_NO_THROW(json = parseDHCP6(config));
+ extractConfig(config);
+
+ ConstElementPtr status;
+ ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
+
+ // returned value should be 0 (success)
+ checkResult(status, 0);
+
+ // Commit it so global inheritance works.
+ CfgMgr::instance().commit();
+
+ ConstSubnet6Ptr subnet = CfgMgr::instance().getCurrentCfg()->
+ getCfgSubnets6()->selectSubnet(IOAddress("2001:db8:1::"));
+ ASSERT_TRUE(subnet);
+
+ EXPECT_FALSE(subnet->getDdnsTtlMin(Network::Inheritance::NONE).unspecified());
+ EXPECT_EQ(250, subnet->getDdnsTtlMin(Network::Inheritance::NONE).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlMin(Network::Inheritance::PARENT_NETWORK).unspecified());
+ EXPECT_EQ(500, subnet->getDdnsTtlMin(Network::Inheritance::PARENT_NETWORK).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlMin(Network::Inheritance::GLOBAL).unspecified());
+ EXPECT_EQ(750, subnet->getDdnsTtlMin(Network::Inheritance::GLOBAL).get());
+}
+
+// Verifies ddns-ttl-max is supported at global,
+// shared-network, and subnet scopes.
+TEST_F(Dhcp6ParserTest, ddnsTtlMax) {
+ string config = R"(
+ {
+ "ddns-ttl-max": 750,
+ "valid-lifetime": 4000,
+ "shared-networks": [{
+ "name": "net",
+ "ddns-ttl-max": 500,
+ "subnet6": [{
+ "id": 1,
+ "subnet": "2001:db8:1::/64",
+ "ddns-ttl-max": 250
+ }],
+ }]
+ }
+ )";
+
+ ConstElementPtr json;
+ ASSERT_NO_THROW(json = parseDHCP6(config));
+ extractConfig(config);
+
+ ConstElementPtr status;
+ ASSERT_NO_THROW(status = configureDhcp6Server(srv_, json));
+
+ // returned value should be 0 (success)
+ checkResult(status, 0);
+
+ // Commit it so global inheritance works.
+ CfgMgr::instance().commit();
+
+ ConstSubnet6Ptr subnet = CfgMgr::instance().getCurrentCfg()->
+ getCfgSubnets6()->selectSubnet(IOAddress("2001:db8:1::"));
+ ASSERT_TRUE(subnet);
+
+ EXPECT_FALSE(subnet->getDdnsTtlMax(Network::Inheritance::NONE).unspecified());
+ EXPECT_EQ(250, subnet->getDdnsTtlMax(Network::Inheritance::NONE).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlMax(Network::Inheritance::PARENT_NETWORK).unspecified());
+ EXPECT_EQ(500, subnet->getDdnsTtlMax(Network::Inheritance::PARENT_NETWORK).get());
+
+ EXPECT_FALSE(subnet->getDdnsTtlMax(Network::Inheritance::GLOBAL).unspecified());
+ EXPECT_EQ(750, subnet->getDdnsTtlMax(Network::Inheritance::GLOBAL).get());
+}
+
} // namespace
diff --git a/src/bin/dhcp6/tests/fqdn_unittest.cc b/src/bin/dhcp6/tests/fqdn_unittest.cc
index dfc977ba70..8634e79005 100644
--- a/src/bin/dhcp6/tests/fqdn_unittest.cc
+++ b/src/bin/dhcp6/tests/fqdn_unittest.cc
@@ -617,6 +617,9 @@ public:
/// @param exp_cr_mode expected value of NCR::conflict_resolution_mode_
/// @param ddns_ttl_percent expected value of ddns_ttl_percent used for
/// the NCR
+ /// @param exp_ddns_ttl expected configured value for ddns-ttl
+ /// @param exp_ddns_ttl_min expected configured value for ddns-ttl-min
+ /// @param exp_ddns_ttl_max expected configured value for ddns-ttl-max
void verifyNameChangeRequest(const isc::dhcp_ddns::NameChangeType type,
const bool reverse, const bool forward,
const std::string& addr,
@@ -626,7 +629,10 @@ public:
const std::string& fqdn = "",
const ConflictResolutionMode exp_cr_mode = CHECK_WITH_DHCID,
util::Optional<double> exp_ddns_ttl_percent
- = util::Optional<double>()) {
+ = util::Optional<double>(),
+ Optional<uint32_t> exp_ddns_ttl = Optional<uint32_t>(),
+ Optional<uint32_t> exp_ddns_ttl_min = Optional<uint32_t>(),
+ Optional<uint32_t> exp_ddns_ttl_max = Optional<uint32_t>()) {
NameChangeRequestPtr ncr;
ASSERT_NO_THROW(ncr = d2_mgr_.peekAt(0));
ASSERT_TRUE(ncr);
@@ -639,7 +645,8 @@ public:
EXPECT_EQ(dhcid, ncr->getDhcid().toStr());
}
- uint32_t ttl = calculateDdnsTtl(valid_lft, exp_ddns_ttl_percent);
+ uint32_t ttl = calculateDdnsTtl(valid_lft, exp_ddns_ttl_percent, exp_ddns_ttl,
+ exp_ddns_ttl_min, exp_ddns_ttl_max);
if (expires != 0) {
EXPECT_EQ(expires + ttl, ncr->getLeaseExpiresOn());
}
@@ -688,6 +695,66 @@ public:
ASSERT_TRUE(pool);
}
+ /// @brief Verifies that DDNS TTL parameters are used when specified.
+ ///
+ /// @param valid_flt lease life time
+ /// @param ddns_ttl_percent expected configured value for ddns-ttl-percent
+ /// @param ddns_ttl expected configured value for ddns-ttl
+ /// @param ddns_ttl_min expected configured value for ddns-ttl-min
+ /// @param ddns_ttl_max expected configured value for ddns-ttl-max
+ void testDdnsTtlParameters(uint32_t valid_lft,
+ Optional<double> ddns_ttl_percent = Optional<double>(),
+ Optional<uint32_t> ddns_ttl = Optional<uint32_t>(),
+ Optional<uint32_t> ddns_ttl_min = Optional<uint32_t>(),
+ Optional<uint32_t> ddns_ttl_max = Optional<uint32_t>()) {
+
+ // Create Reply message with Client Id and Server id.
+ Pkt6Ptr answer = generateMessageWithIds(DHCPV6_REPLY);
+
+ // Create NameChangeRequest for the first allocated address.
+ AllocEngine::ClientContext6 ctx;
+ subnet_->setDdnsConflictResolutionMode("no-check-with-dhcid");
+ subnet_->setDdnsTtlPercent(ddns_ttl_percent);
+ subnet_->setDdnsTtl(ddns_ttl);
+ subnet_->setDdnsTtlMin(ddns_ttl_min);
+ subnet_->setDdnsTtlMax(ddns_ttl_max);
+
+ ctx.subnet_ = subnet_;
+ ctx.fwd_dns_update_ = ctx.rev_dns_update_ = true;
+
+ // Create an IA.
+ Option6IAPtr opt_ia = generateIA(D6O_IA_NA, 1234, 1500, 3000);
+ Option6IAAddrPtr opt_iaaddr(new Option6IAAddr(D6O_IAADDR,
+ IOAddress("2001:db8:1::1"),
+ valid_lft, valid_lft));
+ opt_ia->addOption(opt_iaaddr);
+ answer->addOption(opt_ia);
+ ctx.createIAContext();
+ ctx.currentIA().ia_rsp_ = opt_ia;
+
+ // Use domain name in upper case. It should be converted to lower-case
+ // before DHCID is calculated. So, we should get the same result as if
+ // we typed domain name in lower-case.
+ Option6ClientFqdnPtr fqdn = createClientFqdn(Option6ClientFqdn::FLAG_S,
+ "MYHOST.EXAMPLE.COM",
+ Option6ClientFqdn::FULL);
+ answer->addOption(fqdn);
+
+ ASSERT_NO_THROW(srv_->createNameChangeRequests(answer, ctx));
+ ASSERT_EQ(1, d2_mgr_.getQueueSize());
+
+ // Verify that NameChangeRequest is correct.
+ verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true,
+ "2001:db8:1::1",
+ "000201415AA33D1187D148275136FA30300478"
+ "FAAAA3EBD29826B5C907B2C9268A6F52",
+ 0, valid_lft, "", NO_CHECK_WITH_DHCID,
+ ddns_ttl_percent,
+ ddns_ttl,
+ ddns_ttl_min,
+ ddns_ttl_max);
+ }
+
/// Pointer to Dhcpv6Srv that is used in tests
boost::scoped_ptr<NakedDhcpv6Srv> srv_;
@@ -2161,39 +2228,36 @@ TEST_F(FqdnDhcpv6SrvTest, processRequestRenew) {
}
}
-// Verify that when specified ddns-ttl-percent is used to calculate
-// the lease length in an NCR.
-TEST_F(FqdnDhcpv6SrvTest, ddnsTtlPercent) {
- // Create Reply message with Client Id and Server id.
- Pkt6Ptr answer = generateMessageWithIds(DHCPV6_REPLY);
-
- // Create NameChangeRequest for the first allocated address.
- AllocEngine::ClientContext6 ctx;
- subnet_->setDdnsConflictResolutionMode("no-check-with-dhcid");
- subnet_->setDdnsTtlPercent(Optional<double>(0.10));
- ctx.subnet_ = subnet_;
- ctx.fwd_dns_update_ = ctx.rev_dns_update_ = true;
-
- // Create an IA.
- addIA(1234, IOAddress("2001:db8:1::1"), answer, ctx);
+// Verify the ddns-ttl-percent is used when specified.
+TEST_F(FqdnDhcpv6SrvTest, ddnsTtlPercentTest) {
+ testDdnsTtlParameters(2100, 0.5);
+}
- // Use domain name in upper case. It should be converted to lower-case
- // before DHCID is calculated. So, we should get the same result as if
- // we typed domain name in lower-case.
- Option6ClientFqdnPtr fqdn = createClientFqdn(Option6ClientFqdn::FLAG_S,
- "MYHOST.EXAMPLE.COM",
- Option6ClientFqdn::FULL);
- answer->addOption(fqdn);
+// Verify the ddns-ttl is used when specified.
+TEST_F(FqdnDhcpv6SrvTest, ddnsTtlTest) {
+ testDdnsTtlParameters(2100, // valid lft
+ Optional<double>(), // percent
+ 999, // ttl
+ Optional<uint32_t>(), // min
+ Optional<uint32_t>()); // max
+}
- ASSERT_NO_THROW(srv_->createNameChangeRequests(answer, ctx));
- ASSERT_EQ(1, d2_mgr_.getQueueSize());
+// Verify the ddns-ttl-min is used when specified.
+TEST_F(FqdnDhcpv6SrvTest, ddnsTtlMinTest) {
+ testDdnsTtlParameters(2100, // valid lft
+ Optional<double>(), // percent
+ Optional<uint32_t>(), // ttl
+ 800, // ttl-min
+ Optional<uint32_t>()); // ttl-max
+}
- // Verify that NameChangeRequest is correct.
- verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true,
- "2001:db8:1::1",
- "000201415AA33D1187D148275136FA30300478"
- "FAAAA3EBD29826B5C907B2C9268A6F52",
- 0, 500, "", NO_CHECK_WITH_DHCID, subnet_->getDdnsTtlPercent());
+// Verify the ddns-ttl-max is used when specified.
+TEST_F(FqdnDhcpv6SrvTest, ddnsTtlMaxTest) {
+ testDdnsTtlParameters(2100, // valid lft
+ Optional<double>(), // percent
+ Optional<uint32_t>(), // ttl
+ Optional<uint32_t>(), // ttl-min
+ 500); // ttl-max
}
} // end of anonymous namespace
diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc
index e5d68b562d..f68e3464d0 100644
--- a/src/bin/dhcp6/tests/get_config_unittest.cc
+++ b/src/bin/dhcp6/tests/get_config_unittest.cc
@@ -2627,6 +2627,78 @@ const char* EXTRACTED_CONFIGS[] = {
" \"renew-timer\": 1000,\n"
" \"subnet6\": [ ],\n"
" \"valid-lifetime\": 400\n"
+" }\n",
+ // CONFIGURATION 80
+"{\n"
+" \"ddns-ttl-percent\": 0.75,\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"ddns-ttl-percent\": 0.5,\n"
+" \"name\": \"net\",\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"ddns-ttl-percent\": 0.25,\n"
+" \"id\": 1,\n"
+" \"subnet\": \"2001:db8:1::/64\"\n"
+" }\n"
+" ]\n"
+" }\n"
+" ],\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 81
+"{\n"
+" \"ddns-ttl\": 750,\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"ddns-ttl\": 500,\n"
+" \"name\": \"net\",\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"ddns-ttl\": 250,\n"
+" \"id\": 1,\n"
+" \"subnet\": \"2001:db8:1::/64\"\n"
+" }\n"
+" ]\n"
+" }\n"
+" ],\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 82
+"{\n"
+" \"ddns-ttl-min\": 750,\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"ddns-ttl-min\": 500,\n"
+" \"name\": \"net\",\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"ddns-ttl-min\": 250,\n"
+" \"id\": 1,\n"
+" \"subnet\": \"2001:db8:1::/64\"\n"
+" }\n"
+" ]\n"
+" }\n"
+" ],\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 83
+"{\n"
+" \"ddns-ttl-max\": 750,\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"ddns-ttl-max\": 500,\n"
+" \"name\": \"net\",\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"ddns-ttl-max\": 250,\n"
+" \"id\": 1,\n"
+" \"subnet\": \"2001:db8:1::/64\"\n"
+" }\n"
+" ]\n"
+" }\n"
+" ],\n"
+" \"valid-lifetime\": 4000\n"
" }\n"
};
@@ -13577,6 +13649,526 @@ const char* UNPARSED_CONFIGS[] = {
" \"t1-percent\": 0.5,\n"
" \"t2-percent\": 0.8,\n"
" \"valid-lifetime\": 400\n"
+" }\n",
+ // CONFIGURATION 80
+"{\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+" \"ddns-generated-prefix\": \"myhost\",\n"
+" \"ddns-override-client-update\": false,\n"
+" \"ddns-override-no-update\": false,\n"
+" \"ddns-qualifying-suffix\": \"\",\n"
+" \"ddns-replace-client-name\": \"never\",\n"
+" \"ddns-send-updates\": true,\n"
+" \"ddns-ttl-percent\": 0.75,\n"
+" \"ddns-update-on-renew\": false,\n"
+" \"decline-probation-period\": 86400,\n"
+" \"dhcp-ddns\": {\n"
+" \"enable-updates\": false,\n"
+" \"max-queue-size\": 1024,\n"
+" \"ncr-format\": \"JSON\",\n"
+" \"ncr-protocol\": \"UDP\",\n"
+" \"sender-ip\": \"0.0.0.0\",\n"
+" \"sender-port\": 0,\n"
+" \"server-ip\": \"127.0.0.1\",\n"
+" \"server-port\": 53001\n"
+" },\n"
+" \"dhcp-queue-control\": {\n"
+" \"capacity\": 64,\n"
+" \"enable-queue\": false,\n"
+" \"queue-type\": \"kea-ring6\"\n"
+" },\n"
+" \"dhcp4o6-port\": 0,\n"
+" \"early-global-reservations-lookup\": false,\n"
+" \"expired-leases-processing\": {\n"
+" \"flush-reclaimed-timer-wait-time\": 25,\n"
+" \"hold-reclaimed-time\": 3600,\n"
+" \"max-reclaim-leases\": 100,\n"
+" \"max-reclaim-time\": 250,\n"
+" \"reclaim-timer-wait-time\": 10,\n"
+" \"unwarned-reclaim-cycles\": 5\n"
+" },\n"
+" \"hooks-libraries\": [ ],\n"
+" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+" \"hostname-char-replacement\": \"\",\n"
+" \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+" \"interfaces-config\": {\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
+" },\n"
+" \"ip-reservations-unique\": true,\n"
+" \"lease-database\": {\n"
+" \"type\": \"memfile\"\n"
+" },\n"
+" \"mac-sources\": [ \"any\" ],\n"
+" \"multi-threading\": {\n"
+" \"enable-multi-threading\": true,\n"
+" \"packet-queue-size\": 64,\n"
+" \"thread-pool-size\": 0\n"
+" },\n"
+" \"option-data\": [ ],\n"
+" \"option-def\": [ ],\n"
+" \"parked-packet-limit\": 256,\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"relay-supplied-options\": [ \"65\" ],\n"
+" \"reservations-global\": false,\n"
+" \"reservations-in-subnet\": true,\n"
+" \"reservations-lookup-first\": false,\n"
+" \"reservations-out-of-pool\": false,\n"
+" \"sanity-checks\": {\n"
+" \"extended-info-checks\": \"fix\",\n"
+" \"lease-checks\": \"warn\"\n"
+" },\n"
+" \"server-id\": {\n"
+" \"enterprise-id\": 0,\n"
+" \"htype\": 0,\n"
+" \"identifier\": \"\",\n"
+" \"persist\": true,\n"
+" \"time\": 0,\n"
+" \"type\": \"LLT\"\n"
+" },\n"
+" \"server-tag\": \"\",\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-percent\": 0.5,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"name\": \"net\",\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"rapid-commit\": false,\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-percent\": 0.25,\n"
+" \"id\": 1,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"pd-pools\": [ ],\n"
+" \"pools\": [ ],\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"reservations\": [ ],\n"
+" \"store-extended-info\": false,\n"
+" \"subnet\": \"2001:db8:1::/64\",\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"statistic-default-sample-age\": 0,\n"
+" \"statistic-default-sample-count\": 20,\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [ ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 81
+"{\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+" \"ddns-generated-prefix\": \"myhost\",\n"
+" \"ddns-override-client-update\": false,\n"
+" \"ddns-override-no-update\": false,\n"
+" \"ddns-qualifying-suffix\": \"\",\n"
+" \"ddns-replace-client-name\": \"never\",\n"
+" \"ddns-send-updates\": true,\n"
+" \"ddns-ttl\": 750,\n"
+" \"ddns-update-on-renew\": false,\n"
+" \"decline-probation-period\": 86400,\n"
+" \"dhcp-ddns\": {\n"
+" \"enable-updates\": false,\n"
+" \"max-queue-size\": 1024,\n"
+" \"ncr-format\": \"JSON\",\n"
+" \"ncr-protocol\": \"UDP\",\n"
+" \"sender-ip\": \"0.0.0.0\",\n"
+" \"sender-port\": 0,\n"
+" \"server-ip\": \"127.0.0.1\",\n"
+" \"server-port\": 53001\n"
+" },\n"
+" \"dhcp-queue-control\": {\n"
+" \"capacity\": 64,\n"
+" \"enable-queue\": false,\n"
+" \"queue-type\": \"kea-ring6\"\n"
+" },\n"
+" \"dhcp4o6-port\": 0,\n"
+" \"early-global-reservations-lookup\": false,\n"
+" \"expired-leases-processing\": {\n"
+" \"flush-reclaimed-timer-wait-time\": 25,\n"
+" \"hold-reclaimed-time\": 3600,\n"
+" \"max-reclaim-leases\": 100,\n"
+" \"max-reclaim-time\": 250,\n"
+" \"reclaim-timer-wait-time\": 10,\n"
+" \"unwarned-reclaim-cycles\": 5\n"
+" },\n"
+" \"hooks-libraries\": [ ],\n"
+" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+" \"hostname-char-replacement\": \"\",\n"
+" \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+" \"interfaces-config\": {\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
+" },\n"
+" \"ip-reservations-unique\": true,\n"
+" \"lease-database\": {\n"
+" \"type\": \"memfile\"\n"
+" },\n"
+" \"mac-sources\": [ \"any\" ],\n"
+" \"multi-threading\": {\n"
+" \"enable-multi-threading\": true,\n"
+" \"packet-queue-size\": 64,\n"
+" \"thread-pool-size\": 0\n"
+" },\n"
+" \"option-data\": [ ],\n"
+" \"option-def\": [ ],\n"
+" \"parked-packet-limit\": 256,\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"relay-supplied-options\": [ \"65\" ],\n"
+" \"reservations-global\": false,\n"
+" \"reservations-in-subnet\": true,\n"
+" \"reservations-lookup-first\": false,\n"
+" \"reservations-out-of-pool\": false,\n"
+" \"sanity-checks\": {\n"
+" \"extended-info-checks\": \"fix\",\n"
+" \"lease-checks\": \"warn\"\n"
+" },\n"
+" \"server-id\": {\n"
+" \"enterprise-id\": 0,\n"
+" \"htype\": 0,\n"
+" \"identifier\": \"\",\n"
+" \"persist\": true,\n"
+" \"time\": 0,\n"
+" \"type\": \"LLT\"\n"
+" },\n"
+" \"server-tag\": \"\",\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl\": 500,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"name\": \"net\",\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"rapid-commit\": false,\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl\": 250,\n"
+" \"id\": 1,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"pd-pools\": [ ],\n"
+" \"pools\": [ ],\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"reservations\": [ ],\n"
+" \"store-extended-info\": false,\n"
+" \"subnet\": \"2001:db8:1::/64\",\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"statistic-default-sample-age\": 0,\n"
+" \"statistic-default-sample-count\": 20,\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [ ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 82
+"{\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+" \"ddns-generated-prefix\": \"myhost\",\n"
+" \"ddns-override-client-update\": false,\n"
+" \"ddns-override-no-update\": false,\n"
+" \"ddns-qualifying-suffix\": \"\",\n"
+" \"ddns-replace-client-name\": \"never\",\n"
+" \"ddns-send-updates\": true,\n"
+" \"ddns-ttl-min\": 750,\n"
+" \"ddns-update-on-renew\": false,\n"
+" \"decline-probation-period\": 86400,\n"
+" \"dhcp-ddns\": {\n"
+" \"enable-updates\": false,\n"
+" \"max-queue-size\": 1024,\n"
+" \"ncr-format\": \"JSON\",\n"
+" \"ncr-protocol\": \"UDP\",\n"
+" \"sender-ip\": \"0.0.0.0\",\n"
+" \"sender-port\": 0,\n"
+" \"server-ip\": \"127.0.0.1\",\n"
+" \"server-port\": 53001\n"
+" },\n"
+" \"dhcp-queue-control\": {\n"
+" \"capacity\": 64,\n"
+" \"enable-queue\": false,\n"
+" \"queue-type\": \"kea-ring6\"\n"
+" },\n"
+" \"dhcp4o6-port\": 0,\n"
+" \"early-global-reservations-lookup\": false,\n"
+" \"expired-leases-processing\": {\n"
+" \"flush-reclaimed-timer-wait-time\": 25,\n"
+" \"hold-reclaimed-time\": 3600,\n"
+" \"max-reclaim-leases\": 100,\n"
+" \"max-reclaim-time\": 250,\n"
+" \"reclaim-timer-wait-time\": 10,\n"
+" \"unwarned-reclaim-cycles\": 5\n"
+" },\n"
+" \"hooks-libraries\": [ ],\n"
+" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+" \"hostname-char-replacement\": \"\",\n"
+" \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+" \"interfaces-config\": {\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
+" },\n"
+" \"ip-reservations-unique\": true,\n"
+" \"lease-database\": {\n"
+" \"type\": \"memfile\"\n"
+" },\n"
+" \"mac-sources\": [ \"any\" ],\n"
+" \"multi-threading\": {\n"
+" \"enable-multi-threading\": true,\n"
+" \"packet-queue-size\": 64,\n"
+" \"thread-pool-size\": 0\n"
+" },\n"
+" \"option-data\": [ ],\n"
+" \"option-def\": [ ],\n"
+" \"parked-packet-limit\": 256,\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"relay-supplied-options\": [ \"65\" ],\n"
+" \"reservations-global\": false,\n"
+" \"reservations-in-subnet\": true,\n"
+" \"reservations-lookup-first\": false,\n"
+" \"reservations-out-of-pool\": false,\n"
+" \"sanity-checks\": {\n"
+" \"extended-info-checks\": \"fix\",\n"
+" \"lease-checks\": \"warn\"\n"
+" },\n"
+" \"server-id\": {\n"
+" \"enterprise-id\": 0,\n"
+" \"htype\": 0,\n"
+" \"identifier\": \"\",\n"
+" \"persist\": true,\n"
+" \"time\": 0,\n"
+" \"type\": \"LLT\"\n"
+" },\n"
+" \"server-tag\": \"\",\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-min\": 500,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"name\": \"net\",\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"rapid-commit\": false,\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-min\": 250,\n"
+" \"id\": 1,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"pd-pools\": [ ],\n"
+" \"pools\": [ ],\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"reservations\": [ ],\n"
+" \"store-extended-info\": false,\n"
+" \"subnet\": \"2001:db8:1::/64\",\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"statistic-default-sample-age\": 0,\n"
+" \"statistic-default-sample-count\": 20,\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [ ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n",
+ // CONFIGURATION 83
+"{\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+" \"ddns-generated-prefix\": \"myhost\",\n"
+" \"ddns-override-client-update\": false,\n"
+" \"ddns-override-no-update\": false,\n"
+" \"ddns-qualifying-suffix\": \"\",\n"
+" \"ddns-replace-client-name\": \"never\",\n"
+" \"ddns-send-updates\": true,\n"
+" \"ddns-ttl-max\": 750,\n"
+" \"ddns-update-on-renew\": false,\n"
+" \"decline-probation-period\": 86400,\n"
+" \"dhcp-ddns\": {\n"
+" \"enable-updates\": false,\n"
+" \"max-queue-size\": 1024,\n"
+" \"ncr-format\": \"JSON\",\n"
+" \"ncr-protocol\": \"UDP\",\n"
+" \"sender-ip\": \"0.0.0.0\",\n"
+" \"sender-port\": 0,\n"
+" \"server-ip\": \"127.0.0.1\",\n"
+" \"server-port\": 53001\n"
+" },\n"
+" \"dhcp-queue-control\": {\n"
+" \"capacity\": 64,\n"
+" \"enable-queue\": false,\n"
+" \"queue-type\": \"kea-ring6\"\n"
+" },\n"
+" \"dhcp4o6-port\": 0,\n"
+" \"early-global-reservations-lookup\": false,\n"
+" \"expired-leases-processing\": {\n"
+" \"flush-reclaimed-timer-wait-time\": 25,\n"
+" \"hold-reclaimed-time\": 3600,\n"
+" \"max-reclaim-leases\": 100,\n"
+" \"max-reclaim-time\": 250,\n"
+" \"reclaim-timer-wait-time\": 10,\n"
+" \"unwarned-reclaim-cycles\": 5\n"
+" },\n"
+" \"hooks-libraries\": [ ],\n"
+" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+" \"hostname-char-replacement\": \"\",\n"
+" \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+" \"interfaces-config\": {\n"
+" \"interfaces\": [ ],\n"
+" \"re-detect\": false\n"
+" },\n"
+" \"ip-reservations-unique\": true,\n"
+" \"lease-database\": {\n"
+" \"type\": \"memfile\"\n"
+" },\n"
+" \"mac-sources\": [ \"any\" ],\n"
+" \"multi-threading\": {\n"
+" \"enable-multi-threading\": true,\n"
+" \"packet-queue-size\": 64,\n"
+" \"thread-pool-size\": 0\n"
+" },\n"
+" \"option-data\": [ ],\n"
+" \"option-def\": [ ],\n"
+" \"parked-packet-limit\": 256,\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"relay-supplied-options\": [ \"65\" ],\n"
+" \"reservations-global\": false,\n"
+" \"reservations-in-subnet\": true,\n"
+" \"reservations-lookup-first\": false,\n"
+" \"reservations-out-of-pool\": false,\n"
+" \"sanity-checks\": {\n"
+" \"extended-info-checks\": \"fix\",\n"
+" \"lease-checks\": \"warn\"\n"
+" },\n"
+" \"server-id\": {\n"
+" \"enterprise-id\": 0,\n"
+" \"htype\": 0,\n"
+" \"identifier\": \"\",\n"
+" \"persist\": true,\n"
+" \"time\": 0,\n"
+" \"type\": \"LLT\"\n"
+" },\n"
+" \"server-tag\": \"\",\n"
+" \"shared-networks\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-max\": 500,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"name\": \"net\",\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"rapid-commit\": false,\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [\n"
+" {\n"
+" \"allocator\": \"iterative\",\n"
+" \"calculate-tee-times\": true,\n"
+" \"ddns-ttl-max\": 250,\n"
+" \"id\": 1,\n"
+" \"max-valid-lifetime\": 4000,\n"
+" \"min-valid-lifetime\": 4000,\n"
+" \"option-data\": [ ],\n"
+" \"pd-allocator\": \"iterative\",\n"
+" \"pd-pools\": [ ],\n"
+" \"pools\": [ ],\n"
+" \"relay\": {\n"
+" \"ip-addresses\": [ ]\n"
+" },\n"
+" \"reservations\": [ ],\n"
+" \"store-extended-info\": false,\n"
+" \"subnet\": \"2001:db8:1::/64\",\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
+" }\n"
+" ],\n"
+" \"statistic-default-sample-age\": 0,\n"
+" \"statistic-default-sample-count\": 20,\n"
+" \"store-extended-info\": false,\n"
+" \"subnet6\": [ ],\n"
+" \"t1-percent\": 0.5,\n"
+" \"t2-percent\": 0.8,\n"
+" \"valid-lifetime\": 4000\n"
" }\n"
};