From bfe892dfa2f33ce1ec56b0ec553f1492d3f80134 Mon Sep 17 00:00:00 2001 From: Thomas Markwalder Date: Tue, 7 Jan 2025 13:16:09 -0500 Subject: [PATCH] [#3049] kea-dhcp4 parsing and UTs Fully functional in kea-dhcp4 (excluding doc update and CB support) /doc/examples/kea4/all-keys.json Added entries to a pool /src/bin/dhcp4/dhcp4_lexer.ll /src/bin/dhcp4/dhcp4_parser.yy Added parameters to pools /src/bin/dhcp4/dhcp4_srv.cc Added comment /src/bin/dhcp4/tests/config_parser_unittest.cc TEST_F(Dhcp4ParserTest, poolDdnsParameters) - new test /src/bin/dhcp4/tests/fqdn_unittest.cc TEST_F(NameDhcpv4SrvTest, poolDdnsParametersTest) - new test /src/bin/dhcp4/tests/get_config_unittest.cc Updated /src/lib/dhcpsrv/parsers/base_network_parser.* Moved DDNS parameter parsing to a function template to allow use by any class type /src/lib/dhcpsrv/parsers/dhcp_parsers.cc Added DDNS parameter parsing to PoolParser /src/lib/dhcpsrv/parsers/simple_parser4.cc Added paramters to pool /src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc TEST_F(DhcpParserTest, validDdnsParmatersPool4) - new test --- doc/examples/kea4/all-keys.json | 46 +- doc/sphinx/debug-messages.rst | 3 +- doc/sphinx/kea-messages.rst | 24 +- src/bin/dhcp4/dhcp4_lexer.cc | 406 +-- src/bin/dhcp4/dhcp4_lexer.ll | 16 +- src/bin/dhcp4/dhcp4_parser.cc | 2406 +++++++++-------- src/bin/dhcp4/dhcp4_parser.h | 2 +- src/bin/dhcp4/dhcp4_parser.yy | 16 +- src/bin/dhcp4/dhcp4_srv.cc | 4 +- src/bin/dhcp4/tests/config_parser_unittest.cc | 123 +- src/bin/dhcp4/tests/fqdn_unittest.cc | 153 +- src/bin/dhcp4/tests/get_config_unittest.cc | 162 +- .../dhcpsrv/parsers/base_network_parser.cc | 105 +- src/lib/dhcpsrv/parsers/base_network_parser.h | 132 +- src/lib/dhcpsrv/parsers/dhcp_parsers.cc | 6 +- src/lib/dhcpsrv/parsers/simple_parser4.cc | 36 +- .../dhcpsrv/tests/dhcp_parsers_unittest.cc | 108 +- 17 files changed, 2223 insertions(+), 1525 deletions(-) diff --git a/doc/examples/kea4/all-keys.json b/doc/examples/kea4/all-keys.json index 4af0507cd5..3d28d78953 100644 --- a/doc/examples/kea4/all-keys.json +++ b/doc/examples/kea4/all-keys.json @@ -1153,7 +1153,51 @@ // List of client classes which must be evaluated when this pool // is selected for client assignments. - "evaluate-additional-classes": [ "late" ] + "evaluate-additional-classes": [ "late" ], + + // Pool-level value. See description at the global level. + "ddns-generated-prefix": "mypool", + + // Pool-level value. See description at the global level. + "ddns-override-client-update": false, + + // Pool-level value. See description at the global level. + "ddns-override-no-update": false, + + // Pool-level value. See description at the global level. + "ddns-qualifying-suffix": "pool.example.com.", + + // Pool-level value. See description at the global level. + "ddns-replace-client-name": "always", + + // Pool-level value. See description at the global level. + "ddns-send-updates": true, + + // Pool-level value. See description at the global level. + "ddns-update-on-renew": false, + + // Pool-level value. See description at the global level. + "ddns-conflict-resolution-mode": "check-with-dhcid", + + // Pool-level value. See description at the global level. + "ddns-ttl-percent": 0.55, + + // Pool-level value. See description at the global level. + // You cannot specify both ddns-ttl and any of ddns-ttl-percent, + // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive. + // "ddns-ttl": 500, + + // Pool-evel value. See description at the global level. + "ddns-ttl-min": 10000, + + // Pool-level value. See description at the global level. + "ddns-ttl-max": 20000, + + // Pool-level value. See description at the global level. + "hostname-char-replacement": "x", + + // Pool-level value. See description at the global level. + "hostname-char-set": "[^A-Za-z0-9.-]" }, { // Restricts this pool to allow only clients diff --git a/doc/sphinx/debug-messages.rst b/doc/sphinx/debug-messages.rst index 349b6ae469..2596a71356 100644 --- a/doc/sphinx/debug-messages.rst +++ b/doc/sphinx/debug-messages.rst @@ -1145,7 +1145,8 @@ Messages printed on debuglevel 55 - DHCP6_QUERY_DATA - DHCP6_RESPONSE_DATA - DHCP6_SUBNET_DATA -- DHCPSRV_DDNS_TTL_PERCENT_TOO_SMALL +- DHCPSRV_DDNS_TTL_TOO_LARGE +- DHCPSRV_DDNS_TTL_TOO_SMALL - DHCPSRV_MEMFILE_LEASE_LOAD - DHCPSRV_QUEUE_NCR - DHCP_DDNS_AT_MAX_TRANSACTIONS diff --git a/doc/sphinx/kea-messages.rst b/doc/sphinx/kea-messages.rst index 68cc7aceff..cb9e3d2508 100644 --- a/doc/sphinx/kea-messages.rst +++ b/doc/sphinx/kea-messages.rst @@ -8585,19 +8585,19 @@ the database access parameters are changed: in the latter case, the server closes the currently open database, and opens a database using the new parameters. -DHCPSRV_DDNS_TTL_PERCENT_TOO_SMALL -================================== +DHCPSRV_DDNS_TTL_TOO_SMALL +========================== .. code-block:: text - ddns-ttl-percent %1 of lease lifetime %2 is too small, ignoring it + %1 of lease life time %2 is %3, using minimum of %4 instead. Logged at debug log level 55. A debug message issued when the DDNS TTL value calculated using the -ddns-ttl-percent is zero. Kea will ignore the value and calculate -the DDNS TTL as though ddsn-ttl-percent were not specified. The -value of ddns-ttl-percent and the lease lifetime are shown in -the message details. +ddns-ttl-percent if specified or (0.33 if not) is too small. Kea will +ignore the value and use the minimum (ddns-ttl-min if specified or 600 +seconds if not). The message details include the percentage, the lease +life time, the calculated TTL, and the value actually used. DHCPSRV_DHCP4O6_RECEIVED_BAD_PACKET =================================== @@ -10012,6 +10012,16 @@ A debug message issued when one of the registered interval timers is unregistered from the Timer Manager. The name of the timer is included in the message. +DHCPSRV_UNKNOWN_DB +================== + +.. code-block:: text + + unknown database type: %1 + +The database access string specified a database type (given in the +message) that is unknown to the software. This is a configuration error. + **** DHCP **** diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 3e73a5846e..5206fffaa4 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -2203,27 +2203,27 @@ static const flex_int16_t yy_rule_linenum[242] = 361, 370, 379, 388, 397, 410, 422, 434, 445, 456, 467, 478, 489, 500, 511, 522, 533, 544, 553, 562, 571, 582, 593, 602, 614, 626, 638, 649, 661, 673, - 685, 696, 707, 716, 725, 734, 745, 754, 763, 774, - 785, 796, 807, 818, 829, 840, 851, 862, 871, 880, - 889, 898, 909, 920, 931, 942, 952, 963, 972, 982, - 996, 1013, 1022, 1031, 1040, 1049, 1058, 1067, 1092, 1117, + 685, 696, 707, 716, 725, 734, 745, 754, 763, 775, + 787, 799, 811, 823, 835, 847, 858, 870, 879, 888, + 897, 906, 918, 930, 942, 954, 964, 975, 984, 994, + 1008, 1025, 1034, 1043, 1052, 1061, 1070, 1079, 1104, 1129, - 1126, 1136, 1145, 1156, 1167, 1178, 1188, 1197, 1208, 1219, - 1230, 1241, 1252, 1261, 1270, 1279, 1288, 1297, 1306, 1315, - 1324, 1333, 1342, 1356, 1367, 1378, 1390, 1399, 1408, 1417, - 1426, 1436, 1446, 1456, 1466, 1476, 1486, 1495, 1505, 1514, - 1523, 1532, 1541, 1551, 1560, 1569, 1578, 1587, 1596, 1605, - 1614, 1623, 1632, 1641, 1650, 1659, 1668, 1677, 1686, 1695, - 1704, 1713, 1722, 1731, 1740, 1749, 1758, 1767, 1776, 1785, - 1794, 1803, 1812, 1821, 1830, 1839, 1848, 1857, 1866, 1875, - 1884, 1893, 1902, 1911, 1920, 1929, 1938, 1947, 1956, 1965, - 1974, 1983, 1992, 2003, 2014, 2024, 2034, 2044, 2054, 2064, + 1138, 1148, 1157, 1168, 1179, 1190, 1200, 1209, 1220, 1231, + 1242, 1253, 1264, 1273, 1282, 1291, 1300, 1309, 1318, 1327, + 1336, 1345, 1354, 1368, 1379, 1390, 1402, 1411, 1420, 1429, + 1438, 1448, 1458, 1468, 1478, 1488, 1498, 1507, 1517, 1526, + 1535, 1544, 1553, 1563, 1572, 1581, 1590, 1599, 1608, 1617, + 1626, 1635, 1644, 1653, 1662, 1671, 1680, 1689, 1698, 1707, + 1716, 1725, 1734, 1743, 1752, 1761, 1770, 1779, 1788, 1797, + 1806, 1815, 1824, 1833, 1842, 1851, 1860, 1869, 1878, 1887, + 1896, 1905, 1914, 1923, 1932, 1941, 1950, 1959, 1968, 1977, + 1986, 1995, 2004, 2016, 2028, 2038, 2048, 2058, 2068, 2078, - 2074, 2084, 2094, 2104, 2113, 2122, 2131, 2140, 2151, 2162, - 2175, 2188, 2201, 2210, 2219, 2228, 2237, 2246, 2255, 2264, - 2273, 2285, 2294, 2395, 2411, 2460, 2468, 2483, 2484, 2485, - 2486, 2487, 2488, 2490, 2508, 2521, 2526, 2530, 2532, 2534, - 2536 + 2088, 2098, 2108, 2118, 2127, 2136, 2145, 2154, 2165, 2176, + 2189, 2202, 2215, 2224, 2233, 2242, 2251, 2260, 2269, 2278, + 2287, 2299, 2308, 2409, 2425, 2474, 2482, 2497, 2498, 2499, + 2500, 2501, 2502, 2504, 2522, 2535, 2540, 2544, 2546, 2548, + 2550 } ; /* The intent behind this definition is that it'll catch @@ -2235,7 +2235,7 @@ static const flex_int16_t yy_rule_linenum[242] = #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "dhcp4_lexer.ll" -/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -3550,6 +3550,7 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_SEND_UPDATES(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-send-updates", driver.loc_); @@ -3558,12 +3559,13 @@ YY_RULE_SETUP YY_BREAK case 70: YY_RULE_SETUP -#line 774 "dhcp4_lexer.ll" +#line 775 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_NO_UPDATE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-no-update", driver.loc_); @@ -3572,12 +3574,13 @@ YY_RULE_SETUP YY_BREAK case 71: YY_RULE_SETUP -#line 785 "dhcp4_lexer.ll" +#line 787 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_CLIENT_UPDATE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-client-update", driver.loc_); @@ -3586,12 +3589,13 @@ YY_RULE_SETUP YY_BREAK case 72: YY_RULE_SETUP -#line 796 "dhcp4_lexer.ll" +#line 799 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_REPLACE_CLIENT_NAME(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-replace-client-name", driver.loc_); @@ -3600,12 +3604,13 @@ YY_RULE_SETUP YY_BREAK case 73: YY_RULE_SETUP -#line 807 "dhcp4_lexer.ll" +#line 811 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_GENERATED_PREFIX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-generated-prefix", driver.loc_); @@ -3614,12 +3619,13 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 818 "dhcp4_lexer.ll" +#line 823 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_QUALIFYING_SUFFIX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-qualifying-suffix", driver.loc_); @@ -3628,12 +3634,13 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 829 "dhcp4_lexer.ll" +#line 835 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_UPDATE_ON_RENEW(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-update-on-renew", driver.loc_); @@ -3642,7 +3649,7 @@ YY_RULE_SETUP YY_BREAK case 76: YY_RULE_SETUP -#line 840 "dhcp4_lexer.ll" +#line 847 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3656,12 +3663,13 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 851 "dhcp4_lexer.ll" +#line 858 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_CONFLICT_RESOLUTION_MODE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-conflict-resolution-mode", driver.loc_); @@ -3670,7 +3678,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 862 "dhcp4_lexer.ll" +#line 870 "dhcp4_lexer.ll" { if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) { return isc::dhcp::Dhcp4Parser::make_CHECK_WITH_DHCID(driver.loc_); @@ -3682,7 +3690,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 871 "dhcp4_lexer.ll" +#line 879 "dhcp4_lexer.ll" { if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) { return isc::dhcp::Dhcp4Parser::make_NO_CHECK_WITH_DHCID(driver.loc_); @@ -3694,7 +3702,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 880 "dhcp4_lexer.ll" +#line 888 "dhcp4_lexer.ll" { if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) { return isc::dhcp::Dhcp4Parser::make_CHECK_EXISTS_WITH_DHCID(driver.loc_); @@ -3706,7 +3714,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 889 "dhcp4_lexer.ll" +#line 897 "dhcp4_lexer.ll" { if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) { return isc::dhcp::Dhcp4Parser::make_NO_CHECK_WITHOUT_DHCID(driver.loc_); @@ -3718,12 +3726,13 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 898 "dhcp4_lexer.ll" +#line 906 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_PERCENT(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-percent", driver.loc_); @@ -3732,12 +3741,13 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 909 "dhcp4_lexer.ll" +#line 918 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl", driver.loc_); @@ -3746,12 +3756,13 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 920 "dhcp4_lexer.ll" +#line 930 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MIN(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-min", driver.loc_); @@ -3760,12 +3771,13 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 931 "dhcp4_lexer.ll" +#line 942 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MAX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-max", driver.loc_); @@ -3774,7 +3786,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 942 "dhcp4_lexer.ll" +#line 954 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3787,7 +3799,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 952 "dhcp4_lexer.ll" +#line 964 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3801,7 +3813,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 963 "dhcp4_lexer.ll" +#line 975 "dhcp4_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3813,7 +3825,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 972 "dhcp4_lexer.ll" +#line 984 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3826,7 +3838,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 982 "dhcp4_lexer.ll" +#line 994 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3843,7 +3855,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 996 "dhcp4_lexer.ll" +#line 1008 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -3863,7 +3875,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 1013 "dhcp4_lexer.ll" +#line 1025 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3875,7 +3887,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 1022 "dhcp4_lexer.ll" +#line 1034 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3887,7 +3899,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 1031 "dhcp4_lexer.ll" +#line 1043 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3899,7 +3911,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 1040 "dhcp4_lexer.ll" +#line 1052 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3911,7 +3923,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 1049 "dhcp4_lexer.ll" +#line 1061 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::POOLS: @@ -3923,7 +3935,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1058 "dhcp4_lexer.ll" +#line 1070 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::POOLS: @@ -3935,7 +3947,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1067 "dhcp4_lexer.ll" +#line 1079 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3963,7 +3975,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1092 "dhcp4_lexer.ll" +#line 1104 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3991,7 +4003,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1117 "dhcp4_lexer.ll" +#line 1129 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4003,7 +4015,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1126 "dhcp4_lexer.ll" +#line 1138 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4016,7 +4028,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1136 "dhcp4_lexer.ll" +#line 1148 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4028,7 +4040,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1145 "dhcp4_lexer.ll" +#line 1157 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4042,7 +4054,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1156 "dhcp4_lexer.ll" +#line 1168 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4056,7 +4068,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1167 "dhcp4_lexer.ll" +#line 1179 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4070,7 +4082,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1178 "dhcp4_lexer.ll" +#line 1190 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -4083,7 +4095,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1188 "dhcp4_lexer.ll" +#line 1200 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4095,7 +4107,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1197 "dhcp4_lexer.ll" +#line 1209 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4109,7 +4121,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1208 "dhcp4_lexer.ll" +#line 1220 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4123,7 +4135,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1219 "dhcp4_lexer.ll" +#line 1231 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4137,7 +4149,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1230 "dhcp4_lexer.ll" +#line 1242 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4151,7 +4163,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1241 "dhcp4_lexer.ll" +#line 1253 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4165,7 +4177,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1252 "dhcp4_lexer.ll" +#line 1264 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4177,7 +4189,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1261 "dhcp4_lexer.ll" +#line 1273 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -4189,7 +4201,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1270 "dhcp4_lexer.ll" +#line 1282 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -4201,7 +4213,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1279 "dhcp4_lexer.ll" +#line 1291 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -4213,7 +4225,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1288 "dhcp4_lexer.ll" +#line 1300 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -4225,7 +4237,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1297 "dhcp4_lexer.ll" +#line 1309 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -4237,7 +4249,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1306 "dhcp4_lexer.ll" +#line 1318 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -4249,7 +4261,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1315 "dhcp4_lexer.ll" +#line 1327 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -4261,7 +4273,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1324 "dhcp4_lexer.ll" +#line 1336 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -4273,7 +4285,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1333 "dhcp4_lexer.ll" +#line 1345 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -4285,7 +4297,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1342 "dhcp4_lexer.ll" +#line 1354 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4302,7 +4314,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1356 "dhcp4_lexer.ll" +#line 1368 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4316,7 +4328,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1367 "dhcp4_lexer.ll" +#line 1379 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4330,7 +4342,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1378 "dhcp4_lexer.ll" +#line 1390 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4345,7 +4357,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1390 "dhcp4_lexer.ll" +#line 1402 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -4357,7 +4369,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1399 "dhcp4_lexer.ll" +#line 1411 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -4369,7 +4381,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1408 "dhcp4_lexer.ll" +#line 1420 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -4381,7 +4393,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1417 "dhcp4_lexer.ll" +#line 1429 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -4393,7 +4405,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1426 "dhcp4_lexer.ll" +#line 1438 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4406,7 +4418,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1436 "dhcp4_lexer.ll" +#line 1448 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -4419,7 +4431,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1446 "dhcp4_lexer.ll" +#line 1458 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -4432,7 +4444,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1456 "dhcp4_lexer.ll" +#line 1468 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -4445,7 +4457,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1466 "dhcp4_lexer.ll" +#line 1478 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -4458,7 +4470,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1476 "dhcp4_lexer.ll" +#line 1488 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -4471,7 +4483,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1486 "dhcp4_lexer.ll" +#line 1498 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -4483,7 +4495,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1495 "dhcp4_lexer.ll" +#line 1507 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -4496,7 +4508,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1505 "dhcp4_lexer.ll" +#line 1517 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -4508,7 +4520,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1514 "dhcp4_lexer.ll" +#line 1526 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -4520,7 +4532,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1523 "dhcp4_lexer.ll" +#line 1535 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -4532,7 +4544,7 @@ YY_RULE_SETUP YY_BREAK case 142: YY_RULE_SETUP -#line 1532 "dhcp4_lexer.ll" +#line 1544 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -4544,7 +4556,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1541 "dhcp4_lexer.ll" +#line 1553 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -4557,7 +4569,7 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1551 "dhcp4_lexer.ll" +#line 1563 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -4569,7 +4581,7 @@ YY_RULE_SETUP YY_BREAK case 145: YY_RULE_SETUP -#line 1560 "dhcp4_lexer.ll" +#line 1572 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -4581,7 +4593,7 @@ YY_RULE_SETUP YY_BREAK case 146: YY_RULE_SETUP -#line 1569 "dhcp4_lexer.ll" +#line 1581 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4593,7 +4605,7 @@ YY_RULE_SETUP YY_BREAK case 147: YY_RULE_SETUP -#line 1578 "dhcp4_lexer.ll" +#line 1590 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -4605,7 +4617,7 @@ YY_RULE_SETUP YY_BREAK case 148: YY_RULE_SETUP -#line 1587 "dhcp4_lexer.ll" +#line 1599 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -4617,7 +4629,7 @@ YY_RULE_SETUP YY_BREAK case 149: YY_RULE_SETUP -#line 1596 "dhcp4_lexer.ll" +#line 1608 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4629,7 +4641,7 @@ YY_RULE_SETUP YY_BREAK case 150: YY_RULE_SETUP -#line 1605 "dhcp4_lexer.ll" +#line 1617 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4641,7 +4653,7 @@ YY_RULE_SETUP YY_BREAK case 151: YY_RULE_SETUP -#line 1614 "dhcp4_lexer.ll" +#line 1626 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4653,7 +4665,7 @@ YY_RULE_SETUP YY_BREAK case 152: YY_RULE_SETUP -#line 1623 "dhcp4_lexer.ll" +#line 1635 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4665,7 +4677,7 @@ YY_RULE_SETUP YY_BREAK case 153: YY_RULE_SETUP -#line 1632 "dhcp4_lexer.ll" +#line 1644 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4677,7 +4689,7 @@ YY_RULE_SETUP YY_BREAK case 154: YY_RULE_SETUP -#line 1641 "dhcp4_lexer.ll" +#line 1653 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4689,7 +4701,7 @@ YY_RULE_SETUP YY_BREAK case 155: YY_RULE_SETUP -#line 1650 "dhcp4_lexer.ll" +#line 1662 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -4701,7 +4713,7 @@ YY_RULE_SETUP YY_BREAK case 156: YY_RULE_SETUP -#line 1659 "dhcp4_lexer.ll" +#line 1671 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4713,7 +4725,7 @@ YY_RULE_SETUP YY_BREAK case 157: YY_RULE_SETUP -#line 1668 "dhcp4_lexer.ll" +#line 1680 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4725,7 +4737,7 @@ YY_RULE_SETUP YY_BREAK case 158: YY_RULE_SETUP -#line 1677 "dhcp4_lexer.ll" +#line 1689 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING: @@ -4737,7 +4749,7 @@ YY_RULE_SETUP YY_BREAK case 159: YY_RULE_SETUP -#line 1686 "dhcp4_lexer.ll" +#line 1698 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING: @@ -4749,7 +4761,7 @@ YY_RULE_SETUP YY_BREAK case 160: YY_RULE_SETUP -#line 1695 "dhcp4_lexer.ll" +#line 1707 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING: @@ -4761,7 +4773,7 @@ YY_RULE_SETUP YY_BREAK case 161: YY_RULE_SETUP -#line 1704 "dhcp4_lexer.ll" +#line 1716 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4773,7 +4785,7 @@ YY_RULE_SETUP YY_BREAK case 162: YY_RULE_SETUP -#line 1713 "dhcp4_lexer.ll" +#line 1725 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -4785,7 +4797,7 @@ YY_RULE_SETUP YY_BREAK case 163: YY_RULE_SETUP -#line 1722 "dhcp4_lexer.ll" +#line 1734 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4797,7 +4809,7 @@ YY_RULE_SETUP YY_BREAK case 164: YY_RULE_SETUP -#line 1731 "dhcp4_lexer.ll" +#line 1743 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE: @@ -4809,7 +4821,7 @@ YY_RULE_SETUP YY_BREAK case 165: YY_RULE_SETUP -#line 1740 "dhcp4_lexer.ll" +#line 1752 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE: @@ -4821,7 +4833,7 @@ YY_RULE_SETUP YY_BREAK case 166: YY_RULE_SETUP -#line 1749 "dhcp4_lexer.ll" +#line 1761 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE: @@ -4833,7 +4845,7 @@ YY_RULE_SETUP YY_BREAK case 167: YY_RULE_SETUP -#line 1758 "dhcp4_lexer.ll" +#line 1770 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4845,7 +4857,7 @@ YY_RULE_SETUP YY_BREAK case 168: YY_RULE_SETUP -#line 1767 "dhcp4_lexer.ll" +#line 1779 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4857,7 +4869,7 @@ YY_RULE_SETUP YY_BREAK case 169: YY_RULE_SETUP -#line 1776 "dhcp4_lexer.ll" +#line 1788 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4869,7 +4881,7 @@ YY_RULE_SETUP YY_BREAK case 170: YY_RULE_SETUP -#line 1785 "dhcp4_lexer.ll" +#line 1797 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4881,7 +4893,7 @@ YY_RULE_SETUP YY_BREAK case 171: YY_RULE_SETUP -#line 1794 "dhcp4_lexer.ll" +#line 1806 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::AUTH_TYPE: @@ -4893,7 +4905,7 @@ YY_RULE_SETUP YY_BREAK case 172: YY_RULE_SETUP -#line 1803 "dhcp4_lexer.ll" +#line 1815 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::AUTHENTICATION: @@ -4905,7 +4917,7 @@ YY_RULE_SETUP YY_BREAK case 173: YY_RULE_SETUP -#line 1812 "dhcp4_lexer.ll" +#line 1824 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::AUTHENTICATION: @@ -4917,7 +4929,7 @@ YY_RULE_SETUP YY_BREAK case 174: YY_RULE_SETUP -#line 1821 "dhcp4_lexer.ll" +#line 1833 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::AUTHENTICATION: @@ -4929,7 +4941,7 @@ YY_RULE_SETUP YY_BREAK case 175: YY_RULE_SETUP -#line 1830 "dhcp4_lexer.ll" +#line 1842 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENTS: @@ -4941,7 +4953,7 @@ YY_RULE_SETUP YY_BREAK case 176: YY_RULE_SETUP -#line 1839 "dhcp4_lexer.ll" +#line 1851 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENTS: @@ -4953,7 +4965,7 @@ YY_RULE_SETUP YY_BREAK case 177: YY_RULE_SETUP -#line 1848 "dhcp4_lexer.ll" +#line 1860 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4965,7 +4977,7 @@ YY_RULE_SETUP YY_BREAK case 178: YY_RULE_SETUP -#line 1857 "dhcp4_lexer.ll" +#line 1869 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -4977,7 +4989,7 @@ YY_RULE_SETUP YY_BREAK case 179: YY_RULE_SETUP -#line 1866 "dhcp4_lexer.ll" +#line 1878 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HTTP_HEADERS: @@ -4989,7 +5001,7 @@ YY_RULE_SETUP YY_BREAK case 180: YY_RULE_SETUP -#line 1875 "dhcp4_lexer.ll" +#line 1887 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5001,7 +5013,7 @@ YY_RULE_SETUP YY_BREAK case 181: YY_RULE_SETUP -#line 1884 "dhcp4_lexer.ll" +#line 1896 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL: @@ -5013,7 +5025,7 @@ YY_RULE_SETUP YY_BREAK case 182: YY_RULE_SETUP -#line 1893 "dhcp4_lexer.ll" +#line 1905 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL: @@ -5025,7 +5037,7 @@ YY_RULE_SETUP YY_BREAK case 183: YY_RULE_SETUP -#line 1902 "dhcp4_lexer.ll" +#line 1914 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL: @@ -5037,7 +5049,7 @@ YY_RULE_SETUP YY_BREAK case 184: YY_RULE_SETUP -#line 1911 "dhcp4_lexer.ll" +#line 1923 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5049,7 +5061,7 @@ YY_RULE_SETUP YY_BREAK case 185: YY_RULE_SETUP -#line 1920 "dhcp4_lexer.ll" +#line 1932 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5061,7 +5073,7 @@ YY_RULE_SETUP YY_BREAK case 186: YY_RULE_SETUP -#line 1929 "dhcp4_lexer.ll" +#line 1941 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5073,7 +5085,7 @@ YY_RULE_SETUP YY_BREAK case 187: YY_RULE_SETUP -#line 1938 "dhcp4_lexer.ll" +#line 1950 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5085,7 +5097,7 @@ YY_RULE_SETUP YY_BREAK case 188: YY_RULE_SETUP -#line 1947 "dhcp4_lexer.ll" +#line 1959 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5097,7 +5109,7 @@ YY_RULE_SETUP YY_BREAK case 189: YY_RULE_SETUP -#line 1956 "dhcp4_lexer.ll" +#line 1968 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5109,7 +5121,7 @@ YY_RULE_SETUP YY_BREAK case 190: YY_RULE_SETUP -#line 1965 "dhcp4_lexer.ll" +#line 1977 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5121,7 +5133,7 @@ YY_RULE_SETUP YY_BREAK case 191: YY_RULE_SETUP -#line 1974 "dhcp4_lexer.ll" +#line 1986 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5133,7 +5145,7 @@ YY_RULE_SETUP YY_BREAK case 192: YY_RULE_SETUP -#line 1983 "dhcp4_lexer.ll" +#line 1995 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -5145,12 +5157,13 @@ YY_RULE_SETUP YY_BREAK case 193: YY_RULE_SETUP -#line 1992 "dhcp4_lexer.ll" +#line 2004 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_SET(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-set", driver.loc_); @@ -5159,12 +5172,13 @@ YY_RULE_SETUP YY_BREAK case 194: YY_RULE_SETUP -#line 2003 "dhcp4_lexer.ll" +#line 2016 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-replacement", driver.loc_); @@ -5173,7 +5187,7 @@ YY_RULE_SETUP YY_BREAK case 195: YY_RULE_SETUP -#line 2014 "dhcp4_lexer.ll" +#line 2028 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -5186,7 +5200,7 @@ YY_RULE_SETUP YY_BREAK case 196: YY_RULE_SETUP -#line 2024 "dhcp4_lexer.ll" +#line 2038 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -5199,7 +5213,7 @@ YY_RULE_SETUP YY_BREAK case 197: YY_RULE_SETUP -#line 2034 "dhcp4_lexer.ll" +#line 2048 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -5212,7 +5226,7 @@ YY_RULE_SETUP YY_BREAK case 198: YY_RULE_SETUP -#line 2044 "dhcp4_lexer.ll" +#line 2058 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5225,7 +5239,7 @@ YY_RULE_SETUP YY_BREAK case 199: YY_RULE_SETUP -#line 2054 "dhcp4_lexer.ll" +#line 2068 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5238,7 +5252,7 @@ YY_RULE_SETUP YY_BREAK case 200: YY_RULE_SETUP -#line 2064 "dhcp4_lexer.ll" +#line 2078 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5251,7 +5265,7 @@ YY_RULE_SETUP YY_BREAK case 201: YY_RULE_SETUP -#line 2074 "dhcp4_lexer.ll" +#line 2088 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5264,7 +5278,7 @@ YY_RULE_SETUP YY_BREAK case 202: YY_RULE_SETUP -#line 2084 "dhcp4_lexer.ll" +#line 2098 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5277,7 +5291,7 @@ YY_RULE_SETUP YY_BREAK case 203: YY_RULE_SETUP -#line 2094 "dhcp4_lexer.ll" +#line 2108 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -5290,7 +5304,7 @@ YY_RULE_SETUP YY_BREAK case 204: YY_RULE_SETUP -#line 2104 "dhcp4_lexer.ll" +#line 2118 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -5302,7 +5316,7 @@ YY_RULE_SETUP YY_BREAK case 205: YY_RULE_SETUP -#line 2113 "dhcp4_lexer.ll" +#line 2127 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -5314,7 +5328,7 @@ YY_RULE_SETUP YY_BREAK case 206: YY_RULE_SETUP -#line 2122 "dhcp4_lexer.ll" +#line 2136 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -5326,7 +5340,7 @@ YY_RULE_SETUP YY_BREAK case 207: YY_RULE_SETUP -#line 2131 "dhcp4_lexer.ll" +#line 2145 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5338,7 +5352,7 @@ YY_RULE_SETUP YY_BREAK case 208: YY_RULE_SETUP -#line 2140 "dhcp4_lexer.ll" +#line 2154 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5352,7 +5366,7 @@ YY_RULE_SETUP YY_BREAK case 209: YY_RULE_SETUP -#line 2151 "dhcp4_lexer.ll" +#line 2165 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5366,7 +5380,7 @@ YY_RULE_SETUP YY_BREAK case 210: YY_RULE_SETUP -#line 2162 "dhcp4_lexer.ll" +#line 2176 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5382,7 +5396,7 @@ YY_RULE_SETUP YY_BREAK case 211: YY_RULE_SETUP -#line 2175 "dhcp4_lexer.ll" +#line 2189 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5398,7 +5412,7 @@ YY_RULE_SETUP YY_BREAK case 212: YY_RULE_SETUP -#line 2188 "dhcp4_lexer.ll" +#line 2202 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5414,7 +5428,7 @@ YY_RULE_SETUP YY_BREAK case 213: YY_RULE_SETUP -#line 2201 "dhcp4_lexer.ll" +#line 2215 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5426,7 +5440,7 @@ YY_RULE_SETUP YY_BREAK case 214: YY_RULE_SETUP -#line 2210 "dhcp4_lexer.ll" +#line 2224 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5438,7 +5452,7 @@ YY_RULE_SETUP YY_BREAK case 215: YY_RULE_SETUP -#line 2219 "dhcp4_lexer.ll" +#line 2233 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5450,7 +5464,7 @@ YY_RULE_SETUP YY_BREAK case 216: YY_RULE_SETUP -#line 2228 "dhcp4_lexer.ll" +#line 2242 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5462,7 +5476,7 @@ YY_RULE_SETUP YY_BREAK case 217: YY_RULE_SETUP -#line 2237 "dhcp4_lexer.ll" +#line 2251 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::COMPATIBILITY: @@ -5474,7 +5488,7 @@ YY_RULE_SETUP YY_BREAK case 218: YY_RULE_SETUP -#line 2246 "dhcp4_lexer.ll" +#line 2260 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::COMPATIBILITY: @@ -5486,7 +5500,7 @@ YY_RULE_SETUP YY_BREAK case 219: YY_RULE_SETUP -#line 2255 "dhcp4_lexer.ll" +#line 2269 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::COMPATIBILITY: @@ -5498,7 +5512,7 @@ YY_RULE_SETUP YY_BREAK case 220: YY_RULE_SETUP -#line 2264 "dhcp4_lexer.ll" +#line 2278 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::COMPATIBILITY: @@ -5510,7 +5524,7 @@ YY_RULE_SETUP YY_BREAK case 221: YY_RULE_SETUP -#line 2273 "dhcp4_lexer.ll" +#line 2287 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5525,7 +5539,7 @@ YY_RULE_SETUP YY_BREAK case 222: YY_RULE_SETUP -#line 2285 "dhcp4_lexer.ll" +#line 2299 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -5537,7 +5551,7 @@ YY_RULE_SETUP YY_BREAK case 223: YY_RULE_SETUP -#line 2294 "dhcp4_lexer.ll" +#line 2308 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -5642,7 +5656,7 @@ YY_RULE_SETUP case 224: /* rule 224 can match eol */ YY_RULE_SETUP -#line 2395 "dhcp4_lexer.ll" +#line 2409 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ std::string raw(yytext+1); @@ -5662,7 +5676,7 @@ YY_RULE_SETUP case 225: /* rule 225 can match eol */ YY_RULE_SETUP -#line 2411 "dhcp4_lexer.ll" +#line 2425 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ std::string raw(yytext+1); @@ -5714,7 +5728,7 @@ YY_RULE_SETUP YY_BREAK case 226: YY_RULE_SETUP -#line 2460 "dhcp4_lexer.ll" +#line 2474 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ std::string raw(yytext+1); @@ -5725,7 +5739,7 @@ YY_RULE_SETUP YY_BREAK case 227: YY_RULE_SETUP -#line 2468 "dhcp4_lexer.ll" +#line 2482 "dhcp4_lexer.ll" { /* Bad string with an open unicode escape at the end */ std::string raw(yytext+1); @@ -5743,37 +5757,37 @@ YY_RULE_SETUP YY_BREAK case 228: YY_RULE_SETUP -#line 2483 "dhcp4_lexer.ll" +#line 2497 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 229: YY_RULE_SETUP -#line 2484 "dhcp4_lexer.ll" +#line 2498 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 230: YY_RULE_SETUP -#line 2485 "dhcp4_lexer.ll" +#line 2499 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 231: YY_RULE_SETUP -#line 2486 "dhcp4_lexer.ll" +#line 2500 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 232: YY_RULE_SETUP -#line 2487 "dhcp4_lexer.ll" +#line 2501 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 233: YY_RULE_SETUP -#line 2488 "dhcp4_lexer.ll" +#line 2502 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } YY_BREAK case 234: YY_RULE_SETUP -#line 2490 "dhcp4_lexer.ll" +#line 2504 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -5794,7 +5808,7 @@ YY_RULE_SETUP YY_BREAK case 235: YY_RULE_SETUP -#line 2508 "dhcp4_lexer.ll" +#line 2522 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -5810,7 +5824,7 @@ YY_RULE_SETUP YY_BREAK case 236: YY_RULE_SETUP -#line 2521 "dhcp4_lexer.ll" +#line 2535 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -5818,33 +5832,33 @@ YY_RULE_SETUP YY_BREAK case 237: YY_RULE_SETUP -#line 2526 "dhcp4_lexer.ll" +#line 2540 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 238: YY_RULE_SETUP -#line 2530 "dhcp4_lexer.ll" +#line 2544 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 239: YY_RULE_SETUP -#line 2532 "dhcp4_lexer.ll" +#line 2546 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 240: YY_RULE_SETUP -#line 2534 "dhcp4_lexer.ll" +#line 2548 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 241: YY_RULE_SETUP -#line 2536 "dhcp4_lexer.ll" +#line 2550 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 2538 "dhcp4_lexer.ll" +#line 2552 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -5870,10 +5884,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 242: YY_RULE_SETUP -#line 2561 "dhcp4_lexer.ll" +#line 2575 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 5877 "dhcp4_lexer.cc" +#line 5891 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -6978,7 +6992,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 2561 "dhcp4_lexer.ll" +#line 2575 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 6173394989..e07adae61f 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -764,6 +764,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_SEND_UPDATES(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-send-updates", driver.loc_); @@ -775,6 +776,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_NO_UPDATE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-no-update", driver.loc_); @@ -786,6 +788,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_CLIENT_UPDATE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-client-update", driver.loc_); @@ -797,6 +800,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_REPLACE_CLIENT_NAME(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-replace-client-name", driver.loc_); @@ -808,6 +812,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_GENERATED_PREFIX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-generated-prefix", driver.loc_); @@ -819,6 +824,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_QUALIFYING_SUFFIX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-qualifying-suffix", driver.loc_); @@ -830,6 +836,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_UPDATE_ON_RENEW(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-update-on-renew", driver.loc_); @@ -852,6 +859,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_CONFLICT_RESOLUTION_MODE(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-conflict-resolution-mode", driver.loc_); @@ -899,6 +907,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_PERCENT(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-percent", driver.loc_); @@ -910,6 +919,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl", driver.loc_); @@ -921,6 +931,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MIN(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-min", driver.loc_); @@ -932,6 +943,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MAX(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-max", driver.loc_); @@ -1993,6 +2005,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_SET(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-set", driver.loc_); @@ -2004,6 +2017,7 @@ ControlCharacterFill [^"\\]|\\["\\/bfnrtu] case isc::dhcp::Parser4Context::DHCP4: case isc::dhcp::Parser4Context::SUBNET4: case isc::dhcp::Parser4Context::SHARED_NETWORK: + case isc::dhcp::Parser4Context::POOLS: return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT(driver.loc_); default: return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-replacement", driver.loc_); diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index 62a38af100..ab3f3063fb 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -3493,8 +3493,8 @@ namespace isc { namespace dhcp { #line 3494 "dhcp4_parser.cc" break; - case 633: // $@88: %empty -#line 2218 "dhcp4_parser.yy" + case 647: // $@88: %empty +#line 2232 "dhcp4_parser.yy" { ctx.unique("pool", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3502,8 +3502,8 @@ namespace isc { namespace dhcp { #line 3503 "dhcp4_parser.cc" break; - case 634: // pool_entry: "pool" $@88 ":" "constant string" -#line 2221 "dhcp4_parser.yy" + case 648: // pool_entry: "pool" $@88 ":" "constant string" +#line 2235 "dhcp4_parser.yy" { ElementPtr pool(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); @@ -3512,8 +3512,8 @@ namespace isc { namespace dhcp { #line 3513 "dhcp4_parser.cc" break; - case 635: // pool_id: "pool-id" ":" "integer" -#line 2227 "dhcp4_parser.yy" + case 649: // pool_id: "pool-id" ":" "integer" +#line 2241 "dhcp4_parser.yy" { ctx.unique("pool-id", ctx.loc2pos(yystack_[2].location)); ElementPtr id(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -3522,16 +3522,16 @@ namespace isc { namespace dhcp { #line 3523 "dhcp4_parser.cc" break; - case 636: // $@89: %empty -#line 2233 "dhcp4_parser.yy" + case 650: // $@89: %empty +#line 2247 "dhcp4_parser.yy" { ctx.enter(ctx.NO_KEYWORD); } #line 3531 "dhcp4_parser.cc" break; - case 637: // user_context: "user-context" $@89 ":" map_value -#line 2235 "dhcp4_parser.yy" + case 651: // user_context: "user-context" $@89 ":" map_value +#line 2249 "dhcp4_parser.yy" { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as < ElementPtr > (); @@ -3557,16 +3557,16 @@ namespace isc { namespace dhcp { #line 3558 "dhcp4_parser.cc" break; - case 638: // $@90: %empty -#line 2258 "dhcp4_parser.yy" + case 652: // $@90: %empty +#line 2272 "dhcp4_parser.yy" { ctx.enter(ctx.NO_KEYWORD); } #line 3566 "dhcp4_parser.cc" break; - case 639: // comment: "comment" $@90 ":" "constant string" -#line 2260 "dhcp4_parser.yy" + case 653: // comment: "comment" $@90 ":" "constant string" +#line 2274 "dhcp4_parser.yy" { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -3594,8 +3594,8 @@ namespace isc { namespace dhcp { #line 3595 "dhcp4_parser.cc" break; - case 640: // $@91: %empty -#line 2288 "dhcp4_parser.yy" + case 654: // $@91: %empty +#line 2302 "dhcp4_parser.yy" { ctx.unique("reservations", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -3606,8 +3606,8 @@ namespace isc { namespace dhcp { #line 3607 "dhcp4_parser.cc" break; - case 641: // reservations: "reservations" $@91 ":" "[" reservations_list "]" -#line 2294 "dhcp4_parser.yy" + case 655: // reservations: "reservations" $@91 ":" "[" reservations_list "]" +#line 2308 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -3615,16 +3615,16 @@ namespace isc { namespace dhcp { #line 3616 "dhcp4_parser.cc" break; - case 646: // not_empty_reservations_list: not_empty_reservations_list "," -#line 2305 "dhcp4_parser.yy" + case 660: // not_empty_reservations_list: not_empty_reservations_list "," +#line 2319 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 3624 "dhcp4_parser.cc" break; - case 647: // $@92: %empty -#line 2310 "dhcp4_parser.yy" + case 661: // $@92: %empty +#line 2324 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3633,8 +3633,8 @@ namespace isc { namespace dhcp { #line 3634 "dhcp4_parser.cc" break; - case 648: // reservation: "{" $@92 reservation_params "}" -#line 2314 "dhcp4_parser.yy" + case 662: // reservation: "{" $@92 reservation_params "}" +#line 2328 "dhcp4_parser.yy" { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); @@ -3642,8 +3642,8 @@ namespace isc { namespace dhcp { #line 3643 "dhcp4_parser.cc" break; - case 649: // $@93: %empty -#line 2319 "dhcp4_parser.yy" + case 663: // $@93: %empty +#line 2333 "dhcp4_parser.yy" { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -3652,8 +3652,8 @@ namespace isc { namespace dhcp { #line 3653 "dhcp4_parser.cc" break; - case 650: // sub_reservation: "{" $@93 reservation_params "}" -#line 2323 "dhcp4_parser.yy" + case 664: // sub_reservation: "{" $@93 reservation_params "}" +#line 2337 "dhcp4_parser.yy" { /// @todo: an identifier parameter is required. // parsing completed @@ -3661,16 +3661,16 @@ namespace isc { namespace dhcp { #line 3662 "dhcp4_parser.cc" break; - case 655: // not_empty_reservation_params: not_empty_reservation_params "," -#line 2334 "dhcp4_parser.yy" + case 669: // not_empty_reservation_params: not_empty_reservation_params "," +#line 2348 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 3670 "dhcp4_parser.cc" break; - case 671: // $@94: %empty -#line 2357 "dhcp4_parser.yy" + case 685: // $@94: %empty +#line 2371 "dhcp4_parser.yy" { ctx.unique("next-server", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3678,8 +3678,8 @@ namespace isc { namespace dhcp { #line 3679 "dhcp4_parser.cc" break; - case 672: // next_server: "next-server" $@94 ":" "constant string" -#line 2360 "dhcp4_parser.yy" + case 686: // next_server: "next-server" $@94 ":" "constant string" +#line 2374 "dhcp4_parser.yy" { ElementPtr next_server(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); @@ -3688,8 +3688,8 @@ namespace isc { namespace dhcp { #line 3689 "dhcp4_parser.cc" break; - case 673: // $@95: %empty -#line 2366 "dhcp4_parser.yy" + case 687: // $@95: %empty +#line 2380 "dhcp4_parser.yy" { ctx.unique("server-hostname", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3697,8 +3697,8 @@ namespace isc { namespace dhcp { #line 3698 "dhcp4_parser.cc" break; - case 674: // server_hostname: "server-hostname" $@95 ":" "constant string" -#line 2369 "dhcp4_parser.yy" + case 688: // server_hostname: "server-hostname" $@95 ":" "constant string" +#line 2383 "dhcp4_parser.yy" { ElementPtr srv(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); @@ -3707,8 +3707,8 @@ namespace isc { namespace dhcp { #line 3708 "dhcp4_parser.cc" break; - case 675: // $@96: %empty -#line 2375 "dhcp4_parser.yy" + case 689: // $@96: %empty +#line 2389 "dhcp4_parser.yy" { ctx.unique("boot-file-name", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3716,8 +3716,8 @@ namespace isc { namespace dhcp { #line 3717 "dhcp4_parser.cc" break; - case 676: // boot_file_name: "boot-file-name" $@96 ":" "constant string" -#line 2378 "dhcp4_parser.yy" + case 690: // boot_file_name: "boot-file-name" $@96 ":" "constant string" +#line 2392 "dhcp4_parser.yy" { ElementPtr bootfile(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); @@ -3726,8 +3726,8 @@ namespace isc { namespace dhcp { #line 3727 "dhcp4_parser.cc" break; - case 677: // $@97: %empty -#line 2384 "dhcp4_parser.yy" + case 691: // $@97: %empty +#line 2398 "dhcp4_parser.yy" { ctx.unique("ip-address", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3735,8 +3735,8 @@ namespace isc { namespace dhcp { #line 3736 "dhcp4_parser.cc" break; - case 678: // ip_address: "ip-address" $@97 ":" "constant string" -#line 2387 "dhcp4_parser.yy" + case 692: // ip_address: "ip-address" $@97 ":" "constant string" +#line 2401 "dhcp4_parser.yy" { ElementPtr addr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); @@ -3745,8 +3745,8 @@ namespace isc { namespace dhcp { #line 3746 "dhcp4_parser.cc" break; - case 679: // $@98: %empty -#line 2393 "dhcp4_parser.yy" + case 693: // $@98: %empty +#line 2407 "dhcp4_parser.yy" { ctx.unique("duid", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3754,8 +3754,8 @@ namespace isc { namespace dhcp { #line 3755 "dhcp4_parser.cc" break; - case 680: // duid: "duid" $@98 ":" "constant string" -#line 2396 "dhcp4_parser.yy" + case 694: // duid: "duid" $@98 ":" "constant string" +#line 2410 "dhcp4_parser.yy" { ElementPtr d(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); @@ -3764,8 +3764,8 @@ namespace isc { namespace dhcp { #line 3765 "dhcp4_parser.cc" break; - case 681: // $@99: %empty -#line 2402 "dhcp4_parser.yy" + case 695: // $@99: %empty +#line 2416 "dhcp4_parser.yy" { ctx.unique("hw-address", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3773,8 +3773,8 @@ namespace isc { namespace dhcp { #line 3774 "dhcp4_parser.cc" break; - case 682: // hw_address: "hw-address" $@99 ":" "constant string" -#line 2405 "dhcp4_parser.yy" + case 696: // hw_address: "hw-address" $@99 ":" "constant string" +#line 2419 "dhcp4_parser.yy" { ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); @@ -3783,8 +3783,8 @@ namespace isc { namespace dhcp { #line 3784 "dhcp4_parser.cc" break; - case 683: // $@100: %empty -#line 2411 "dhcp4_parser.yy" + case 697: // $@100: %empty +#line 2425 "dhcp4_parser.yy" { ctx.unique("client-id", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3792,8 +3792,8 @@ namespace isc { namespace dhcp { #line 3793 "dhcp4_parser.cc" break; - case 684: // client_id_value: "client-id" $@100 ":" "constant string" -#line 2414 "dhcp4_parser.yy" + case 698: // client_id_value: "client-id" $@100 ":" "constant string" +#line 2428 "dhcp4_parser.yy" { ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); @@ -3802,8 +3802,8 @@ namespace isc { namespace dhcp { #line 3803 "dhcp4_parser.cc" break; - case 685: // $@101: %empty -#line 2420 "dhcp4_parser.yy" + case 699: // $@101: %empty +#line 2434 "dhcp4_parser.yy" { ctx.unique("circuit-id", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3811,8 +3811,8 @@ namespace isc { namespace dhcp { #line 3812 "dhcp4_parser.cc" break; - case 686: // circuit_id_value: "circuit-id" $@101 ":" "constant string" -#line 2423 "dhcp4_parser.yy" + case 700: // circuit_id_value: "circuit-id" $@101 ":" "constant string" +#line 2437 "dhcp4_parser.yy" { ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); @@ -3821,8 +3821,8 @@ namespace isc { namespace dhcp { #line 3822 "dhcp4_parser.cc" break; - case 687: // $@102: %empty -#line 2429 "dhcp4_parser.yy" + case 701: // $@102: %empty +#line 2443 "dhcp4_parser.yy" { ctx.unique("flex-id", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3830,8 +3830,8 @@ namespace isc { namespace dhcp { #line 3831 "dhcp4_parser.cc" break; - case 688: // flex_id_value: "flex-id" $@102 ":" "constant string" -#line 2432 "dhcp4_parser.yy" + case 702: // flex_id_value: "flex-id" $@102 ":" "constant string" +#line 2446 "dhcp4_parser.yy" { ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); @@ -3840,8 +3840,8 @@ namespace isc { namespace dhcp { #line 3841 "dhcp4_parser.cc" break; - case 689: // $@103: %empty -#line 2438 "dhcp4_parser.yy" + case 703: // $@103: %empty +#line 2452 "dhcp4_parser.yy" { ctx.unique("hostname", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3849,8 +3849,8 @@ namespace isc { namespace dhcp { #line 3850 "dhcp4_parser.cc" break; - case 690: // hostname: "hostname" $@103 ":" "constant string" -#line 2441 "dhcp4_parser.yy" + case 704: // hostname: "hostname" $@103 ":" "constant string" +#line 2455 "dhcp4_parser.yy" { ElementPtr host(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); @@ -3859,8 +3859,8 @@ namespace isc { namespace dhcp { #line 3860 "dhcp4_parser.cc" break; - case 691: // $@104: %empty -#line 2447 "dhcp4_parser.yy" + case 705: // $@104: %empty +#line 2461 "dhcp4_parser.yy" { ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location)); ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -3871,8 +3871,8 @@ namespace isc { namespace dhcp { #line 3872 "dhcp4_parser.cc" break; - case 692: // reservation_client_classes: "client-classes" $@104 ":" list_strings -#line 2453 "dhcp4_parser.yy" + case 706: // reservation_client_classes: "client-classes" $@104 ":" list_strings +#line 2467 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -3880,8 +3880,8 @@ namespace isc { namespace dhcp { #line 3881 "dhcp4_parser.cc" break; - case 693: // $@105: %empty -#line 2461 "dhcp4_parser.yy" + case 707: // $@105: %empty +#line 2475 "dhcp4_parser.yy" { ctx.unique("relay", ctx.loc2pos(yystack_[0].location)); ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -3892,8 +3892,8 @@ namespace isc { namespace dhcp { #line 3893 "dhcp4_parser.cc" break; - case 694: // relay: "relay" $@105 ":" "{" relay_map "}" -#line 2467 "dhcp4_parser.yy" + case 708: // relay: "relay" $@105 ":" "{" relay_map "}" +#line 2481 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -3901,8 +3901,8 @@ namespace isc { namespace dhcp { #line 3902 "dhcp4_parser.cc" break; - case 696: // $@106: %empty -#line 2475 "dhcp4_parser.yy" + case 710: // $@106: %empty +#line 2489 "dhcp4_parser.yy" { ctx.unique("ip-addresses", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -3913,8 +3913,8 @@ namespace isc { namespace dhcp { #line 3914 "dhcp4_parser.cc" break; - case 697: // ip_addresses: "ip-addresses" $@106 ":" list_strings -#line 2481 "dhcp4_parser.yy" + case 711: // ip_addresses: "ip-addresses" $@106 ":" list_strings +#line 2495 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -3922,8 +3922,8 @@ namespace isc { namespace dhcp { #line 3923 "dhcp4_parser.cc" break; - case 698: // $@107: %empty -#line 2489 "dhcp4_parser.yy" + case 712: // $@107: %empty +#line 2503 "dhcp4_parser.yy" { ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -3934,8 +3934,8 @@ namespace isc { namespace dhcp { #line 3935 "dhcp4_parser.cc" break; - case 699: // client_classes: "client-classes" $@107 ":" "[" client_classes_list "]" -#line 2495 "dhcp4_parser.yy" + case 713: // client_classes: "client-classes" $@107 ":" "[" client_classes_list "]" +#line 2509 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -3943,16 +3943,16 @@ namespace isc { namespace dhcp { #line 3944 "dhcp4_parser.cc" break; - case 702: // client_classes_list: client_classes_list "," -#line 2502 "dhcp4_parser.yy" + case 716: // client_classes_list: client_classes_list "," +#line 2516 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 3952 "dhcp4_parser.cc" break; - case 703: // $@108: %empty -#line 2507 "dhcp4_parser.yy" + case 717: // $@108: %empty +#line 2521 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3961,8 +3961,8 @@ namespace isc { namespace dhcp { #line 3962 "dhcp4_parser.cc" break; - case 704: // client_class_entry: "{" $@108 client_class_params "}" -#line 2511 "dhcp4_parser.yy" + case 718: // client_class_entry: "{" $@108 client_class_params "}" +#line 2525 "dhcp4_parser.yy" { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -3971,16 +3971,16 @@ namespace isc { namespace dhcp { #line 3972 "dhcp4_parser.cc" break; - case 709: // not_empty_client_class_params: not_empty_client_class_params "," -#line 2523 "dhcp4_parser.yy" + case 723: // not_empty_client_class_params: not_empty_client_class_params "," +#line 2537 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 3980 "dhcp4_parser.cc" break; - case 728: // $@109: %empty -#line 2549 "dhcp4_parser.yy" + case 742: // $@109: %empty +#line 2563 "dhcp4_parser.yy" { ctx.unique("test", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -3988,8 +3988,8 @@ namespace isc { namespace dhcp { #line 3989 "dhcp4_parser.cc" break; - case 729: // client_class_test: "test" $@109 ":" "constant string" -#line 2552 "dhcp4_parser.yy" + case 743: // client_class_test: "test" $@109 ":" "constant string" +#line 2566 "dhcp4_parser.yy" { ElementPtr test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); @@ -3998,8 +3998,8 @@ namespace isc { namespace dhcp { #line 3999 "dhcp4_parser.cc" break; - case 730: // $@110: %empty -#line 2558 "dhcp4_parser.yy" + case 744: // $@110: %empty +#line 2572 "dhcp4_parser.yy" { ctx.unique("template-test", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4007,8 +4007,8 @@ namespace isc { namespace dhcp { #line 4008 "dhcp4_parser.cc" break; - case 731: // client_class_template_test: "template-test" $@110 ":" "constant string" -#line 2561 "dhcp4_parser.yy" + case 745: // client_class_template_test: "template-test" $@110 ":" "constant string" +#line 2575 "dhcp4_parser.yy" { ElementPtr template_test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("template-test", template_test); @@ -4017,8 +4017,8 @@ namespace isc { namespace dhcp { #line 4018 "dhcp4_parser.cc" break; - case 732: // only_if_required: "only-if-required" ":" "boolean" -#line 2568 "dhcp4_parser.yy" + case 746: // only_if_required: "only-if-required" ":" "boolean" +#line 2582 "dhcp4_parser.yy" { ctx.unique("only-if-required", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4027,8 +4027,8 @@ namespace isc { namespace dhcp { #line 4028 "dhcp4_parser.cc" break; - case 733: // only_in_additional_list: "only-in-additional-list" ":" "boolean" -#line 2574 "dhcp4_parser.yy" + case 747: // only_in_additional_list: "only-in-additional-list" ":" "boolean" +#line 2588 "dhcp4_parser.yy" { ctx.unique("only-in-additional-list", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4037,8 +4037,8 @@ namespace isc { namespace dhcp { #line 4038 "dhcp4_parser.cc" break; - case 734: // dhcp4o6_port: "dhcp4o6-port" ":" "integer" -#line 2582 "dhcp4_parser.yy" + case 748: // dhcp4o6_port: "dhcp4o6-port" ":" "integer" +#line 2596 "dhcp4_parser.yy" { ctx.unique("dhcp4o6-port", ctx.loc2pos(yystack_[2].location)); ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4047,8 +4047,8 @@ namespace isc { namespace dhcp { #line 4048 "dhcp4_parser.cc" break; - case 735: // $@111: %empty -#line 2590 "dhcp4_parser.yy" + case 749: // $@111: %empty +#line 2604 "dhcp4_parser.yy" { ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location)); ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location)); @@ -4060,8 +4060,8 @@ namespace isc { namespace dhcp { #line 4061 "dhcp4_parser.cc" break; - case 736: // control_socket: "control-socket" $@111 ":" "{" control_socket_params "}" -#line 2597 "dhcp4_parser.yy" + case 750: // control_socket: "control-socket" $@111 ":" "{" control_socket_params "}" +#line 2611 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4069,8 +4069,8 @@ namespace isc { namespace dhcp { #line 4070 "dhcp4_parser.cc" break; - case 737: // $@112: %empty -#line 2602 "dhcp4_parser.yy" + case 751: // $@112: %empty +#line 2616 "dhcp4_parser.yy" { ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location)); ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location)); @@ -4082,8 +4082,8 @@ namespace isc { namespace dhcp { #line 4083 "dhcp4_parser.cc" break; - case 738: // control_sockets: "control-sockets" $@112 ":" "[" control_socket_list "]" -#line 2609 "dhcp4_parser.yy" + case 752: // control_sockets: "control-sockets" $@112 ":" "[" control_socket_list "]" +#line 2623 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4091,16 +4091,16 @@ namespace isc { namespace dhcp { #line 4092 "dhcp4_parser.cc" break; - case 743: // not_empty_control_socket_list: not_empty_control_socket_list "," -#line 2620 "dhcp4_parser.yy" + case 757: // not_empty_control_socket_list: not_empty_control_socket_list "," +#line 2634 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4100 "dhcp4_parser.cc" break; - case 744: // $@113: %empty -#line 2625 "dhcp4_parser.yy" + case 758: // $@113: %empty +#line 2639 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -4109,24 +4109,24 @@ namespace isc { namespace dhcp { #line 4110 "dhcp4_parser.cc" break; - case 745: // control_socket_entry: "{" $@113 control_socket_params "}" -#line 2629 "dhcp4_parser.yy" + case 759: // control_socket_entry: "{" $@113 control_socket_params "}" +#line 2643 "dhcp4_parser.yy" { ctx.stack_.pop_back(); } #line 4118 "dhcp4_parser.cc" break; - case 748: // control_socket_params: control_socket_params "," -#line 2635 "dhcp4_parser.yy" + case 762: // control_socket_params: control_socket_params "," +#line 2649 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4126 "dhcp4_parser.cc" break; - case 762: // $@114: %empty -#line 2655 "dhcp4_parser.yy" + case 776: // $@114: %empty +#line 2669 "dhcp4_parser.yy" { ctx.unique("socket-type", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.CONTROL_SOCKET_TYPE); @@ -4134,8 +4134,8 @@ namespace isc { namespace dhcp { #line 4135 "dhcp4_parser.cc" break; - case 763: // control_socket_type: "socket-type" $@114 ":" control_socket_type_value -#line 2658 "dhcp4_parser.yy" + case 777: // control_socket_type: "socket-type" $@114 ":" control_socket_type_value +#line 2672 "dhcp4_parser.yy" { ctx.stack_.back()->set("socket-type", yystack_[0].value.as < ElementPtr > ()); ctx.leave(); @@ -4143,26 +4143,26 @@ namespace isc { namespace dhcp { #line 4144 "dhcp4_parser.cc" break; - case 764: // control_socket_type_value: "unix" -#line 2664 "dhcp4_parser.yy" + case 778: // control_socket_type_value: "unix" +#line 2678 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); } #line 4150 "dhcp4_parser.cc" break; - case 765: // control_socket_type_value: "http" -#line 2665 "dhcp4_parser.yy" + case 779: // control_socket_type_value: "http" +#line 2679 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("http", ctx.loc2pos(yystack_[0].location))); } #line 4156 "dhcp4_parser.cc" break; - case 766: // control_socket_type_value: "https" -#line 2666 "dhcp4_parser.yy" + case 780: // control_socket_type_value: "https" +#line 2680 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("https", ctx.loc2pos(yystack_[0].location))); } #line 4162 "dhcp4_parser.cc" break; - case 767: // $@115: %empty -#line 2669 "dhcp4_parser.yy" + case 781: // $@115: %empty +#line 2683 "dhcp4_parser.yy" { ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location)); ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location)); @@ -4171,8 +4171,8 @@ namespace isc { namespace dhcp { #line 4172 "dhcp4_parser.cc" break; - case 768: // control_socket_name: "socket-name" $@115 ":" "constant string" -#line 2673 "dhcp4_parser.yy" + case 782: // control_socket_name: "socket-name" $@115 ":" "constant string" +#line 2687 "dhcp4_parser.yy" { ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); @@ -4181,8 +4181,8 @@ namespace isc { namespace dhcp { #line 4182 "dhcp4_parser.cc" break; - case 769: // $@116: %empty -#line 2679 "dhcp4_parser.yy" + case 783: // $@116: %empty +#line 2693 "dhcp4_parser.yy" { ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location)); ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location)); @@ -4191,8 +4191,8 @@ namespace isc { namespace dhcp { #line 4192 "dhcp4_parser.cc" break; - case 770: // control_socket_address: "socket-address" $@116 ":" "constant string" -#line 2683 "dhcp4_parser.yy" + case 784: // control_socket_address: "socket-address" $@116 ":" "constant string" +#line 2697 "dhcp4_parser.yy" { ElementPtr address(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-address", address); @@ -4201,8 +4201,8 @@ namespace isc { namespace dhcp { #line 4202 "dhcp4_parser.cc" break; - case 771: // control_socket_port: "socket-port" ":" "integer" -#line 2689 "dhcp4_parser.yy" + case 785: // control_socket_port: "socket-port" ":" "integer" +#line 2703 "dhcp4_parser.yy" { ctx.unique("socket-port", ctx.loc2pos(yystack_[2].location)); ElementPtr port(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4211,8 +4211,8 @@ namespace isc { namespace dhcp { #line 4212 "dhcp4_parser.cc" break; - case 772: // cert_required: "cert-required" ":" "boolean" -#line 2695 "dhcp4_parser.yy" + case 786: // cert_required: "cert-required" ":" "boolean" +#line 2709 "dhcp4_parser.yy" { ctx.unique("cert-required", ctx.loc2pos(yystack_[2].location)); ElementPtr req(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4221,8 +4221,8 @@ namespace isc { namespace dhcp { #line 4222 "dhcp4_parser.cc" break; - case 773: // $@117: %empty -#line 2701 "dhcp4_parser.yy" + case 787: // $@117: %empty +#line 2715 "dhcp4_parser.yy" { ctx.unique("http-headers", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -4233,8 +4233,8 @@ namespace isc { namespace dhcp { #line 4234 "dhcp4_parser.cc" break; - case 774: // http_headers: "http-headers" $@117 ":" "[" http_header_list "]" -#line 2707 "dhcp4_parser.yy" + case 788: // http_headers: "http-headers" $@117 ":" "[" http_header_list "]" +#line 2721 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4242,16 +4242,16 @@ namespace isc { namespace dhcp { #line 4243 "dhcp4_parser.cc" break; - case 779: // not_empty_http_header_list: not_empty_http_header_list "," -#line 2718 "dhcp4_parser.yy" + case 793: // not_empty_http_header_list: not_empty_http_header_list "," +#line 2732 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4251 "dhcp4_parser.cc" break; - case 780: // $@118: %empty -#line 2723 "dhcp4_parser.yy" + case 794: // $@118: %empty +#line 2737 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -4260,24 +4260,24 @@ namespace isc { namespace dhcp { #line 4261 "dhcp4_parser.cc" break; - case 781: // http_header: "{" $@118 http_header_params "}" -#line 2727 "dhcp4_parser.yy" + case 795: // http_header: "{" $@118 http_header_params "}" +#line 2741 "dhcp4_parser.yy" { ctx.stack_.pop_back(); } #line 4269 "dhcp4_parser.cc" break; - case 784: // http_header_params: http_header_params "," -#line 2733 "dhcp4_parser.yy" + case 798: // http_header_params: http_header_params "," +#line 2747 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4277 "dhcp4_parser.cc" break; - case 790: // $@119: %empty -#line 2745 "dhcp4_parser.yy" + case 804: // $@119: %empty +#line 2759 "dhcp4_parser.yy" { ctx.unique("value", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4285,8 +4285,8 @@ namespace isc { namespace dhcp { #line 4286 "dhcp4_parser.cc" break; - case 791: // header_value: "value" $@119 ":" "constant string" -#line 2748 "dhcp4_parser.yy" + case 805: // header_value: "value" $@119 ":" "constant string" +#line 2762 "dhcp4_parser.yy" { ElementPtr value(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("value", value); @@ -4295,8 +4295,8 @@ namespace isc { namespace dhcp { #line 4296 "dhcp4_parser.cc" break; - case 792: // $@120: %empty -#line 2756 "dhcp4_parser.yy" + case 806: // $@120: %empty +#line 2770 "dhcp4_parser.yy" { ctx.unique("authentication", ctx.loc2pos(yystack_[0].location)); ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4307,8 +4307,8 @@ namespace isc { namespace dhcp { #line 4308 "dhcp4_parser.cc" break; - case 793: // authentication: "authentication" $@120 ":" "{" auth_params "}" -#line 2762 "dhcp4_parser.yy" + case 807: // authentication: "authentication" $@120 ":" "{" auth_params "}" +#line 2776 "dhcp4_parser.yy" { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -4318,16 +4318,16 @@ namespace isc { namespace dhcp { #line 4319 "dhcp4_parser.cc" break; - case 796: // auth_params: auth_params "," -#line 2771 "dhcp4_parser.yy" + case 810: // auth_params: auth_params "," +#line 2785 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4327 "dhcp4_parser.cc" break; - case 804: // $@121: %empty -#line 2785 "dhcp4_parser.yy" + case 818: // $@121: %empty +#line 2799 "dhcp4_parser.yy" { ctx.unique("type", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.AUTH_TYPE); @@ -4335,8 +4335,8 @@ namespace isc { namespace dhcp { #line 4336 "dhcp4_parser.cc" break; - case 805: // auth_type: "type" $@121 ":" auth_type_value -#line 2788 "dhcp4_parser.yy" + case 819: // auth_type: "type" $@121 ":" auth_type_value +#line 2802 "dhcp4_parser.yy" { ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ()); ctx.leave(); @@ -4344,14 +4344,14 @@ namespace isc { namespace dhcp { #line 4345 "dhcp4_parser.cc" break; - case 806: // auth_type_value: "basic" -#line 2793 "dhcp4_parser.yy" + case 820: // auth_type_value: "basic" +#line 2807 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("basic", ctx.loc2pos(yystack_[0].location))); } #line 4351 "dhcp4_parser.cc" break; - case 807: // $@122: %empty -#line 2796 "dhcp4_parser.yy" + case 821: // $@122: %empty +#line 2810 "dhcp4_parser.yy" { ctx.unique("realm", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4359,8 +4359,8 @@ namespace isc { namespace dhcp { #line 4360 "dhcp4_parser.cc" break; - case 808: // realm: "realm" $@122 ":" "constant string" -#line 2799 "dhcp4_parser.yy" + case 822: // realm: "realm" $@122 ":" "constant string" +#line 2813 "dhcp4_parser.yy" { ElementPtr realm(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("realm", realm); @@ -4369,8 +4369,8 @@ namespace isc { namespace dhcp { #line 4370 "dhcp4_parser.cc" break; - case 809: // $@123: %empty -#line 2805 "dhcp4_parser.yy" + case 823: // $@123: %empty +#line 2819 "dhcp4_parser.yy" { ctx.unique("directory", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4378,8 +4378,8 @@ namespace isc { namespace dhcp { #line 4379 "dhcp4_parser.cc" break; - case 810: // directory: "directory" $@123 ":" "constant string" -#line 2808 "dhcp4_parser.yy" + case 824: // directory: "directory" $@123 ":" "constant string" +#line 2822 "dhcp4_parser.yy" { ElementPtr directory(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("directory", directory); @@ -4388,8 +4388,8 @@ namespace isc { namespace dhcp { #line 4389 "dhcp4_parser.cc" break; - case 811: // $@124: %empty -#line 2814 "dhcp4_parser.yy" + case 825: // $@124: %empty +#line 2828 "dhcp4_parser.yy" { ctx.unique("clients", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -4400,8 +4400,8 @@ namespace isc { namespace dhcp { #line 4401 "dhcp4_parser.cc" break; - case 812: // clients: "clients" $@124 ":" "[" clients_list "]" -#line 2820 "dhcp4_parser.yy" + case 826: // clients: "clients" $@124 ":" "[" clients_list "]" +#line 2834 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4409,16 +4409,16 @@ namespace isc { namespace dhcp { #line 4410 "dhcp4_parser.cc" break; - case 817: // not_empty_clients_list: not_empty_clients_list "," -#line 2831 "dhcp4_parser.yy" + case 831: // not_empty_clients_list: not_empty_clients_list "," +#line 2845 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4418 "dhcp4_parser.cc" break; - case 818: // $@125: %empty -#line 2836 "dhcp4_parser.yy" + case 832: // $@125: %empty +#line 2850 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -4427,24 +4427,24 @@ namespace isc { namespace dhcp { #line 4428 "dhcp4_parser.cc" break; - case 819: // basic_auth: "{" $@125 clients_params "}" -#line 2840 "dhcp4_parser.yy" + case 833: // basic_auth: "{" $@125 clients_params "}" +#line 2854 "dhcp4_parser.yy" { ctx.stack_.pop_back(); } #line 4436 "dhcp4_parser.cc" break; - case 822: // clients_params: clients_params "," -#line 2846 "dhcp4_parser.yy" + case 836: // clients_params: clients_params "," +#line 2860 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4444 "dhcp4_parser.cc" break; - case 830: // $@126: %empty -#line 2860 "dhcp4_parser.yy" + case 844: // $@126: %empty +#line 2874 "dhcp4_parser.yy" { ctx.unique("user-file", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4452,8 +4452,8 @@ namespace isc { namespace dhcp { #line 4453 "dhcp4_parser.cc" break; - case 831: // user_file: "user-file" $@126 ":" "constant string" -#line 2863 "dhcp4_parser.yy" + case 845: // user_file: "user-file" $@126 ":" "constant string" +#line 2877 "dhcp4_parser.yy" { ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user-file", user); @@ -4462,8 +4462,8 @@ namespace isc { namespace dhcp { #line 4463 "dhcp4_parser.cc" break; - case 832: // $@127: %empty -#line 2869 "dhcp4_parser.yy" + case 846: // $@127: %empty +#line 2883 "dhcp4_parser.yy" { ctx.unique("password-file", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4471,8 +4471,8 @@ namespace isc { namespace dhcp { #line 4472 "dhcp4_parser.cc" break; - case 833: // password_file: "password-file" $@127 ":" "constant string" -#line 2872 "dhcp4_parser.yy" + case 847: // password_file: "password-file" $@127 ":" "constant string" +#line 2886 "dhcp4_parser.yy" { ElementPtr password(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password-file", password); @@ -4481,8 +4481,8 @@ namespace isc { namespace dhcp { #line 4482 "dhcp4_parser.cc" break; - case 834: // $@128: %empty -#line 2880 "dhcp4_parser.yy" + case 848: // $@128: %empty +#line 2894 "dhcp4_parser.yy" { ctx.unique("dhcp-queue-control", ctx.loc2pos(yystack_[0].location)); ElementPtr qc(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4493,8 +4493,8 @@ namespace isc { namespace dhcp { #line 4494 "dhcp4_parser.cc" break; - case 835: // dhcp_queue_control: "dhcp-queue-control" $@128 ":" "{" queue_control_params "}" -#line 2886 "dhcp4_parser.yy" + case 849: // dhcp_queue_control: "dhcp-queue-control" $@128 ":" "{" queue_control_params "}" +#line 2900 "dhcp4_parser.yy" { // The enable queue parameter is required. ctx.require("enable-queue", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -4504,16 +4504,16 @@ namespace isc { namespace dhcp { #line 4505 "dhcp4_parser.cc" break; - case 838: // queue_control_params: queue_control_params "," -#line 2895 "dhcp4_parser.yy" + case 852: // queue_control_params: queue_control_params "," +#line 2909 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4513 "dhcp4_parser.cc" break; - case 845: // enable_queue: "enable-queue" ":" "boolean" -#line 2908 "dhcp4_parser.yy" + case 859: // enable_queue: "enable-queue" ":" "boolean" +#line 2922 "dhcp4_parser.yy" { ctx.unique("enable-queue", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4522,8 +4522,8 @@ namespace isc { namespace dhcp { #line 4523 "dhcp4_parser.cc" break; - case 846: // $@129: %empty -#line 2914 "dhcp4_parser.yy" + case 860: // $@129: %empty +#line 2928 "dhcp4_parser.yy" { ctx.unique("queue-type", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4531,8 +4531,8 @@ namespace isc { namespace dhcp { #line 4532 "dhcp4_parser.cc" break; - case 847: // queue_type: "queue-type" $@129 ":" "constant string" -#line 2917 "dhcp4_parser.yy" + case 861: // queue_type: "queue-type" $@129 ":" "constant string" +#line 2931 "dhcp4_parser.yy" { ElementPtr qt(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("queue-type", qt); @@ -4541,8 +4541,8 @@ namespace isc { namespace dhcp { #line 4542 "dhcp4_parser.cc" break; - case 848: // capacity: "capacity" ":" "integer" -#line 2923 "dhcp4_parser.yy" + case 862: // capacity: "capacity" ":" "integer" +#line 2937 "dhcp4_parser.yy" { ctx.unique("capacity", ctx.loc2pos(yystack_[2].location)); ElementPtr c(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4551,8 +4551,8 @@ namespace isc { namespace dhcp { #line 4552 "dhcp4_parser.cc" break; - case 849: // $@130: %empty -#line 2929 "dhcp4_parser.yy" + case 863: // $@130: %empty +#line 2943 "dhcp4_parser.yy" { ctx.unique(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4560,8 +4560,8 @@ namespace isc { namespace dhcp { #line 4561 "dhcp4_parser.cc" break; - case 850: // arbitrary_map_entry: "constant string" $@130 ":" value -#line 2932 "dhcp4_parser.yy" + case 864: // arbitrary_map_entry: "constant string" $@130 ":" value +#line 2946 "dhcp4_parser.yy" { ctx.stack_.back()->set(yystack_[3].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ()); ctx.leave(); @@ -4569,8 +4569,8 @@ namespace isc { namespace dhcp { #line 4570 "dhcp4_parser.cc" break; - case 851: // $@131: %empty -#line 2939 "dhcp4_parser.yy" + case 865: // $@131: %empty +#line 2953 "dhcp4_parser.yy" { ctx.unique("dhcp-ddns", ctx.loc2pos(yystack_[0].location)); ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4581,8 +4581,8 @@ namespace isc { namespace dhcp { #line 4582 "dhcp4_parser.cc" break; - case 852: // dhcp_ddns: "dhcp-ddns" $@131 ":" "{" dhcp_ddns_params "}" -#line 2945 "dhcp4_parser.yy" + case 866: // dhcp_ddns: "dhcp-ddns" $@131 ":" "{" dhcp_ddns_params "}" +#line 2959 "dhcp4_parser.yy" { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -4592,8 +4592,8 @@ namespace isc { namespace dhcp { #line 4593 "dhcp4_parser.cc" break; - case 853: // $@132: %empty -#line 2952 "dhcp4_parser.yy" + case 867: // $@132: %empty +#line 2966 "dhcp4_parser.yy" { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4602,8 +4602,8 @@ namespace isc { namespace dhcp { #line 4603 "dhcp4_parser.cc" break; - case 854: // sub_dhcp_ddns: "{" $@132 dhcp_ddns_params "}" -#line 2956 "dhcp4_parser.yy" + case 868: // sub_dhcp_ddns: "{" $@132 dhcp_ddns_params "}" +#line 2970 "dhcp4_parser.yy" { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -4612,16 +4612,16 @@ namespace isc { namespace dhcp { #line 4613 "dhcp4_parser.cc" break; - case 857: // dhcp_ddns_params: dhcp_ddns_params "," -#line 2964 "dhcp4_parser.yy" + case 871: // dhcp_ddns_params: dhcp_ddns_params "," +#line 2978 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4621 "dhcp4_parser.cc" break; - case 869: // enable_updates: "enable-updates" ":" "boolean" -#line 2982 "dhcp4_parser.yy" + case 883: // enable_updates: "enable-updates" ":" "boolean" +#line 2996 "dhcp4_parser.yy" { ctx.unique("enable-updates", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4630,8 +4630,8 @@ namespace isc { namespace dhcp { #line 4631 "dhcp4_parser.cc" break; - case 870: // $@133: %empty -#line 2988 "dhcp4_parser.yy" + case 884: // $@133: %empty +#line 3002 "dhcp4_parser.yy" { ctx.unique("server-ip", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4639,8 +4639,8 @@ namespace isc { namespace dhcp { #line 4640 "dhcp4_parser.cc" break; - case 871: // server_ip: "server-ip" $@133 ":" "constant string" -#line 2991 "dhcp4_parser.yy" + case 885: // server_ip: "server-ip" $@133 ":" "constant string" +#line 3005 "dhcp4_parser.yy" { ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); @@ -4649,8 +4649,8 @@ namespace isc { namespace dhcp { #line 4650 "dhcp4_parser.cc" break; - case 872: // server_port: "server-port" ":" "integer" -#line 2997 "dhcp4_parser.yy" + case 886: // server_port: "server-port" ":" "integer" +#line 3011 "dhcp4_parser.yy" { ctx.unique("server-port", ctx.loc2pos(yystack_[2].location)); ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4659,8 +4659,8 @@ namespace isc { namespace dhcp { #line 4660 "dhcp4_parser.cc" break; - case 873: // $@134: %empty -#line 3003 "dhcp4_parser.yy" + case 887: // $@134: %empty +#line 3017 "dhcp4_parser.yy" { ctx.unique("sender-ip", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4668,8 +4668,8 @@ namespace isc { namespace dhcp { #line 4669 "dhcp4_parser.cc" break; - case 874: // sender_ip: "sender-ip" $@134 ":" "constant string" -#line 3006 "dhcp4_parser.yy" + case 888: // sender_ip: "sender-ip" $@134 ":" "constant string" +#line 3020 "dhcp4_parser.yy" { ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); @@ -4678,8 +4678,8 @@ namespace isc { namespace dhcp { #line 4679 "dhcp4_parser.cc" break; - case 875: // sender_port: "sender-port" ":" "integer" -#line 3012 "dhcp4_parser.yy" + case 889: // sender_port: "sender-port" ":" "integer" +#line 3026 "dhcp4_parser.yy" { ctx.unique("sender-port", ctx.loc2pos(yystack_[2].location)); ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4688,8 +4688,8 @@ namespace isc { namespace dhcp { #line 4689 "dhcp4_parser.cc" break; - case 876: // max_queue_size: "max-queue-size" ":" "integer" -#line 3018 "dhcp4_parser.yy" + case 890: // max_queue_size: "max-queue-size" ":" "integer" +#line 3032 "dhcp4_parser.yy" { ctx.unique("max-queue-size", ctx.loc2pos(yystack_[2].location)); ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4698,8 +4698,8 @@ namespace isc { namespace dhcp { #line 4699 "dhcp4_parser.cc" break; - case 877: // $@135: %empty -#line 3024 "dhcp4_parser.yy" + case 891: // $@135: %empty +#line 3038 "dhcp4_parser.yy" { ctx.unique("ncr-protocol", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NCR_PROTOCOL); @@ -4707,8 +4707,8 @@ namespace isc { namespace dhcp { #line 4708 "dhcp4_parser.cc" break; - case 878: // ncr_protocol: "ncr-protocol" $@135 ":" ncr_protocol_value -#line 3027 "dhcp4_parser.yy" + case 892: // ncr_protocol: "ncr-protocol" $@135 ":" ncr_protocol_value +#line 3041 "dhcp4_parser.yy" { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ()); ctx.leave(); @@ -4716,20 +4716,20 @@ namespace isc { namespace dhcp { #line 4717 "dhcp4_parser.cc" break; - case 879: // ncr_protocol_value: "udp" -#line 3033 "dhcp4_parser.yy" + case 893: // ncr_protocol_value: "udp" +#line 3047 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } #line 4723 "dhcp4_parser.cc" break; - case 880: // ncr_protocol_value: "tcp" -#line 3034 "dhcp4_parser.yy" + case 894: // ncr_protocol_value: "tcp" +#line 3048 "dhcp4_parser.yy" { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 4729 "dhcp4_parser.cc" break; - case 881: // $@136: %empty -#line 3037 "dhcp4_parser.yy" + case 895: // $@136: %empty +#line 3051 "dhcp4_parser.yy" { ctx.unique("ncr-format", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NCR_FORMAT); @@ -4737,8 +4737,8 @@ namespace isc { namespace dhcp { #line 4738 "dhcp4_parser.cc" break; - case 882: // ncr_format: "ncr-format" $@136 ":" "JSON" -#line 3040 "dhcp4_parser.yy" + case 896: // ncr_format: "ncr-format" $@136 ":" "JSON" +#line 3054 "dhcp4_parser.yy" { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); @@ -4747,8 +4747,8 @@ namespace isc { namespace dhcp { #line 4748 "dhcp4_parser.cc" break; - case 883: // $@137: %empty -#line 3048 "dhcp4_parser.yy" + case 897: // $@137: %empty +#line 3062 "dhcp4_parser.yy" { ctx.unique("config-control", ctx.loc2pos(yystack_[0].location)); ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4759,8 +4759,8 @@ namespace isc { namespace dhcp { #line 4760 "dhcp4_parser.cc" break; - case 884: // config_control: "config-control" $@137 ":" "{" config_control_params "}" -#line 3054 "dhcp4_parser.yy" + case 898: // config_control: "config-control" $@137 ":" "{" config_control_params "}" +#line 3068 "dhcp4_parser.yy" { // No config control params are required ctx.stack_.pop_back(); @@ -4769,8 +4769,8 @@ namespace isc { namespace dhcp { #line 4770 "dhcp4_parser.cc" break; - case 885: // $@138: %empty -#line 3060 "dhcp4_parser.yy" + case 899: // $@138: %empty +#line 3074 "dhcp4_parser.yy" { // Parse the config-control map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -4779,8 +4779,8 @@ namespace isc { namespace dhcp { #line 4780 "dhcp4_parser.cc" break; - case 886: // sub_config_control: "{" $@138 config_control_params "}" -#line 3064 "dhcp4_parser.yy" + case 900: // sub_config_control: "{" $@138 config_control_params "}" +#line 3078 "dhcp4_parser.yy" { // No config_control params are required // parsing completed @@ -4788,16 +4788,16 @@ namespace isc { namespace dhcp { #line 4789 "dhcp4_parser.cc" break; - case 889: // config_control_params: config_control_params "," -#line 3072 "dhcp4_parser.yy" + case 903: // config_control_params: config_control_params "," +#line 3086 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4797 "dhcp4_parser.cc" break; - case 892: // $@139: %empty -#line 3082 "dhcp4_parser.yy" + case 906: // $@139: %empty +#line 3096 "dhcp4_parser.yy" { ctx.unique("config-databases", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -4808,8 +4808,8 @@ namespace isc { namespace dhcp { #line 4809 "dhcp4_parser.cc" break; - case 893: // config_databases: "config-databases" $@139 ":" "[" database_list "]" -#line 3088 "dhcp4_parser.yy" + case 907: // config_databases: "config-databases" $@139 ":" "[" database_list "]" +#line 3102 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4817,8 +4817,8 @@ namespace isc { namespace dhcp { #line 4818 "dhcp4_parser.cc" break; - case 894: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer" -#line 3093 "dhcp4_parser.yy" + case 908: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer" +#line 3107 "dhcp4_parser.yy" { ctx.unique("config-fetch-wait-time", ctx.loc2pos(yystack_[2].location)); ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4827,8 +4827,8 @@ namespace isc { namespace dhcp { #line 4828 "dhcp4_parser.cc" break; - case 895: // $@140: %empty -#line 3101 "dhcp4_parser.yy" + case 909: // $@140: %empty +#line 3115 "dhcp4_parser.yy" { ctx.unique("loggers", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -4839,8 +4839,8 @@ namespace isc { namespace dhcp { #line 4840 "dhcp4_parser.cc" break; - case 896: // loggers: "loggers" $@140 ":" "[" loggers_entries "]" -#line 3107 "dhcp4_parser.yy" + case 910: // loggers: "loggers" $@140 ":" "[" loggers_entries "]" +#line 3121 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4848,16 +4848,16 @@ namespace isc { namespace dhcp { #line 4849 "dhcp4_parser.cc" break; - case 899: // loggers_entries: loggers_entries "," -#line 3116 "dhcp4_parser.yy" + case 913: // loggers_entries: loggers_entries "," +#line 3130 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4857 "dhcp4_parser.cc" break; - case 900: // $@141: %empty -#line 3122 "dhcp4_parser.yy" + case 914: // $@141: %empty +#line 3136 "dhcp4_parser.yy" { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); @@ -4866,24 +4866,24 @@ namespace isc { namespace dhcp { #line 4867 "dhcp4_parser.cc" break; - case 901: // logger_entry: "{" $@141 logger_params "}" -#line 3126 "dhcp4_parser.yy" + case 915: // logger_entry: "{" $@141 logger_params "}" +#line 3140 "dhcp4_parser.yy" { ctx.stack_.pop_back(); } #line 4875 "dhcp4_parser.cc" break; - case 904: // logger_params: logger_params "," -#line 3132 "dhcp4_parser.yy" + case 918: // logger_params: logger_params "," +#line 3146 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4883 "dhcp4_parser.cc" break; - case 912: // debuglevel: "debuglevel" ":" "integer" -#line 3146 "dhcp4_parser.yy" + case 926: // debuglevel: "debuglevel" ":" "integer" +#line 3160 "dhcp4_parser.yy" { ctx.unique("debuglevel", ctx.loc2pos(yystack_[2].location)); ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -4892,8 +4892,8 @@ namespace isc { namespace dhcp { #line 4893 "dhcp4_parser.cc" break; - case 913: // $@142: %empty -#line 3152 "dhcp4_parser.yy" + case 927: // $@142: %empty +#line 3166 "dhcp4_parser.yy" { ctx.unique("severity", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4901,8 +4901,8 @@ namespace isc { namespace dhcp { #line 4902 "dhcp4_parser.cc" break; - case 914: // severity: "severity" $@142 ":" "constant string" -#line 3155 "dhcp4_parser.yy" + case 928: // severity: "severity" $@142 ":" "constant string" +#line 3169 "dhcp4_parser.yy" { ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); @@ -4911,8 +4911,8 @@ namespace isc { namespace dhcp { #line 4912 "dhcp4_parser.cc" break; - case 915: // $@143: %empty -#line 3161 "dhcp4_parser.yy" + case 929: // $@143: %empty +#line 3175 "dhcp4_parser.yy" { ctx.unique("output-options", ctx.loc2pos(yystack_[0].location)); ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); @@ -4923,8 +4923,8 @@ namespace isc { namespace dhcp { #line 4924 "dhcp4_parser.cc" break; - case 916: // output_options_list: "output-options" $@143 ":" "[" output_options_list_content "]" -#line 3167 "dhcp4_parser.yy" + case 930: // output_options_list: "output-options" $@143 ":" "[" output_options_list_content "]" +#line 3181 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -4932,16 +4932,16 @@ namespace isc { namespace dhcp { #line 4933 "dhcp4_parser.cc" break; - case 919: // output_options_list_content: output_options_list_content "," -#line 3174 "dhcp4_parser.yy" + case 933: // output_options_list_content: output_options_list_content "," +#line 3188 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4941 "dhcp4_parser.cc" break; - case 920: // $@144: %empty -#line 3179 "dhcp4_parser.yy" + case 934: // $@144: %empty +#line 3193 "dhcp4_parser.yy" { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -4950,24 +4950,24 @@ namespace isc { namespace dhcp { #line 4951 "dhcp4_parser.cc" break; - case 921: // output_entry: "{" $@144 output_params_list "}" -#line 3183 "dhcp4_parser.yy" + case 935: // output_entry: "{" $@144 output_params_list "}" +#line 3197 "dhcp4_parser.yy" { ctx.stack_.pop_back(); } #line 4959 "dhcp4_parser.cc" break; - case 924: // output_params_list: output_params_list "," -#line 3189 "dhcp4_parser.yy" + case 938: // output_params_list: output_params_list "," +#line 3203 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 4967 "dhcp4_parser.cc" break; - case 930: // $@145: %empty -#line 3201 "dhcp4_parser.yy" + case 944: // $@145: %empty +#line 3215 "dhcp4_parser.yy" { ctx.unique("output", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -4975,8 +4975,8 @@ namespace isc { namespace dhcp { #line 4976 "dhcp4_parser.cc" break; - case 931: // output: "output" $@145 ":" "constant string" -#line 3204 "dhcp4_parser.yy" + case 945: // output: "output" $@145 ":" "constant string" +#line 3218 "dhcp4_parser.yy" { ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); @@ -4985,8 +4985,8 @@ namespace isc { namespace dhcp { #line 4986 "dhcp4_parser.cc" break; - case 932: // flush: "flush" ":" "boolean" -#line 3210 "dhcp4_parser.yy" + case 946: // flush: "flush" ":" "boolean" +#line 3224 "dhcp4_parser.yy" { ctx.unique("flush", ctx.loc2pos(yystack_[2].location)); ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -4995,8 +4995,8 @@ namespace isc { namespace dhcp { #line 4996 "dhcp4_parser.cc" break; - case 933: // maxsize: "maxsize" ":" "integer" -#line 3216 "dhcp4_parser.yy" + case 947: // maxsize: "maxsize" ":" "integer" +#line 3230 "dhcp4_parser.yy" { ctx.unique("maxsize", ctx.loc2pos(yystack_[2].location)); ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -5005,8 +5005,8 @@ namespace isc { namespace dhcp { #line 5006 "dhcp4_parser.cc" break; - case 934: // maxver: "maxver" ":" "integer" -#line 3222 "dhcp4_parser.yy" + case 948: // maxver: "maxver" ":" "integer" +#line 3236 "dhcp4_parser.yy" { ctx.unique("maxver", ctx.loc2pos(yystack_[2].location)); ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); @@ -5015,8 +5015,8 @@ namespace isc { namespace dhcp { #line 5016 "dhcp4_parser.cc" break; - case 935: // $@146: %empty -#line 3228 "dhcp4_parser.yy" + case 949: // $@146: %empty +#line 3242 "dhcp4_parser.yy" { ctx.unique("pattern", ctx.loc2pos(yystack_[0].location)); ctx.enter(ctx.NO_KEYWORD); @@ -5024,8 +5024,8 @@ namespace isc { namespace dhcp { #line 5025 "dhcp4_parser.cc" break; - case 936: // pattern: "pattern" $@146 ":" "constant string" -#line 3231 "dhcp4_parser.yy" + case 950: // pattern: "pattern" $@146 ":" "constant string" +#line 3245 "dhcp4_parser.yy" { ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pattern", sev); @@ -5034,8 +5034,8 @@ namespace isc { namespace dhcp { #line 5035 "dhcp4_parser.cc" break; - case 937: // $@147: %empty -#line 3237 "dhcp4_parser.yy" + case 951: // $@147: %empty +#line 3251 "dhcp4_parser.yy" { ctx.unique("compatibility", ctx.loc2pos(yystack_[0].location)); ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -5046,8 +5046,8 @@ namespace isc { namespace dhcp { #line 5047 "dhcp4_parser.cc" break; - case 938: // compatibility: "compatibility" $@147 ":" "{" compatibility_params "}" -#line 3243 "dhcp4_parser.yy" + case 952: // compatibility: "compatibility" $@147 ":" "{" compatibility_params "}" +#line 3257 "dhcp4_parser.yy" { ctx.stack_.pop_back(); ctx.leave(); @@ -5055,16 +5055,16 @@ namespace isc { namespace dhcp { #line 5056 "dhcp4_parser.cc" break; - case 941: // compatibility_params: compatibility_params "," -#line 3250 "dhcp4_parser.yy" + case 955: // compatibility_params: compatibility_params "," +#line 3264 "dhcp4_parser.yy" { ctx.warnAboutExtraCommas(yystack_[0].location); } #line 5064 "dhcp4_parser.cc" break; - case 947: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean" -#line 3262 "dhcp4_parser.yy" + case 961: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean" +#line 3276 "dhcp4_parser.yy" { ctx.unique("lenient-option-parsing", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -5073,8 +5073,8 @@ namespace isc { namespace dhcp { #line 5074 "dhcp4_parser.cc" break; - case 948: // ignore_dhcp_server_identifier: "ignore-dhcp-server-identifier" ":" "boolean" -#line 3268 "dhcp4_parser.yy" + case 962: // ignore_dhcp_server_identifier: "ignore-dhcp-server-identifier" ":" "boolean" +#line 3282 "dhcp4_parser.yy" { ctx.unique("ignore-dhcp-server-identifier", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -5083,8 +5083,8 @@ namespace isc { namespace dhcp { #line 5084 "dhcp4_parser.cc" break; - case 949: // ignore_rai_link_selection: "ignore-rai-link-selection" ":" "boolean" -#line 3274 "dhcp4_parser.yy" + case 963: // ignore_rai_link_selection: "ignore-rai-link-selection" ":" "boolean" +#line 3288 "dhcp4_parser.yy" { ctx.unique("ignore-rai-link-selection", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -5093,8 +5093,8 @@ namespace isc { namespace dhcp { #line 5094 "dhcp4_parser.cc" break; - case 950: // exclude_first_last_24: "exclude-first-last-24" ":" "boolean" -#line 3280 "dhcp4_parser.yy" + case 964: // exclude_first_last_24: "exclude-first-last-24" ":" "boolean" +#line 3294 "dhcp4_parser.yy" { ctx.unique("exclude-first-last-24", ctx.loc2pos(yystack_[2].location)); ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); @@ -5456,159 +5456,160 @@ namespace isc { namespace dhcp { } - const short Dhcp4Parser::yypact_ninf_ = -1393; + const short Dhcp4Parser::yypact_ninf_ = -1401; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short Dhcp4Parser::yypact_[] = { - 664, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 57, 39, 83, 123, 129, 133, - 140, 142, 153, 169, 175, 199, 201, 211, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 39, -147, 95, 166, 72, 713, - 536, 581, -2, 238, 558, -96, 574, 68, -1393, 105, - 190, 225, 252, 255, -1393, 46, -1393, -1393, -1393, -1393, - 308, 309, 321, -1393, -1393, -1393, 325, 342, -1393, -1393, - -1393, 359, 369, 376, 379, 390, 413, 424, 425, 427, - 442, 443, -1393, 465, 466, 469, 479, 481, -1393, -1393, - -1393, 484, 485, 487, 488, 489, 491, 492, -1393, -1393, - -1393, 495, -1393, -1393, -1393, -1393, -1393, 497, 499, 502, - -1393, -1393, -1393, -1393, -1393, 504, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, 508, 511, 514, -1393, -1393, 515, -1393, - 52, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 517, 518, 520, 522, - -1393, 111, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 523, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, 118, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 528, -1393, -1393, -1393, -1393, -1393, -1393, 119, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, 271, 388, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 525, - -1393, -1393, 530, -1393, -1393, -1393, 532, -1393, -1393, 529, - 535, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 537, 538, 540, -1393, -1393, -1393, - -1393, -1393, 531, 543, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 121, -1393, - -1393, -1393, 544, -1393, 550, -1393, 552, 555, -1393, -1393, - -1393, -1393, -1393, 134, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 557, 136, -1393, -1393, -1393, -1393, - 39, 39, -1393, 132, 559, -1393, -1393, 560, 561, 562, - 329, 334, 335, 565, 567, 570, 347, 343, 575, 576, - 577, 351, 356, 357, 360, 361, 362, 365, 367, 368, - 363, 371, 585, 372, 374, 377, 389, 392, 603, 605, - 608, 394, 397, 401, 404, 406, 407, 410, 616, 636, - 641, 416, 644, 645, 646, 647, 662, 435, 438, 440, - 670, 674, 675, 676, 677, 451, 679, 681, 682, 683, - 684, 685, 689, 461, 462, 463, 693, 696, -1393, 166, - -1393, 697, 700, 701, 475, 476, 480, 482, 72, -1393, - 708, 710, 711, 712, 720, 723, 500, 726, 728, 729, - 730, 731, 713, -1393, 732, 507, 536, -1393, 735, 736, - 737, 738, 745, 746, 747, 748, -1393, 581, -1393, 749, - 750, 524, 752, 753, 763, 541, -1393, 238, 764, 554, - 556, 579, 765, -1393, 558, 766, 767, 139, -1393, 580, - 786, 583, 804, 584, 586, 806, 812, 574, -1393, 814, - 588, 68, -1393, -1393, -1393, 816, 818, 819, 820, 822, - -1393, -1393, -1393, 593, 594, 612, -1393, -1393, 831, 836, - 839, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 615, -1393, -1393, -1393, -1393, -1393, -127, 617, - 619, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 845, 846, - 847, -1393, 623, 345, 849, 848, 642, -1393, -1393, -1393, - 868, 869, 889, 890, 891, -1393, 892, 893, 896, 895, - 897, 666, 667, -1393, -1393, -1393, 898, 899, -1393, 900, - 250, 285, -1393, -1393, -1393, -1393, -1393, 678, 680, 686, - 902, 687, 688, -1393, 900, 900, 900, 690, 906, -1393, - 691, -1393, -1393, 900, 692, 694, 695, 698, 699, 702, - 703, -1393, 704, 705, -1393, 706, 707, 709, -1393, -1393, - 714, -1393, -1393, -1393, 900, -1393, 715, 848, -1393, -1393, - 716, -1393, 717, -1393, -1393, 18, 722, -1393, 904, -1393, - -1393, 39, 166, 68, 72, 326, -1393, -1393, -1393, 817, - 817, 912, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, 916, 919, 920, -1393, -1393, -1393, -1393, -1393, -1393, - 923, -1393, -1393, -1393, 237, 924, 931, 933, 248, 200, - 47, 934, 230, 574, -1393, -1393, 935, -98, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 941, - -1393, -1393, -1393, -1393, -1393, -1393, 805, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, 912, -1393, 154, 164, 167, -1393, -1393, 171, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 946, 947, 948, 949, - 950, 951, 952, 953, 954, 955, -1393, 956, 957, -1393, - -1393, -1393, -1393, -1393, 180, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 204, -1393, - 958, 959, -1393, -1393, 960, 962, -1393, -1393, 961, 965, - -1393, -1393, 963, 967, -1393, -1393, 966, 968, -1393, -1393, - -1393, -1393, -1393, -1393, 55, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 86, -1393, -1393, 969, 970, -1393, -1393, 971, - 975, -1393, 976, 977, 980, 984, 987, 988, 214, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 994, 996, 997, -1393, - 217, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 999, -1393, 1002, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 218, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 1001, 1011, -1393, 1014, -1393, 1020, -1393, -1393, -1393, 256, - -1393, -1393, -1393, -1393, -1393, 273, -1393, 98, -1393, 1023, - 1025, 1028, 1033, -1393, 279, -1393, -1393, -1393, -1393, -1393, - 733, -1393, 1034, 1038, -1393, -1393, 1040, -1393, 1055, -1393, - -1393, -1393, 1058, 1060, 326, -1393, 1065, 1066, 1067, 1073, - 743, 871, 851, 877, 907, 917, 922, 926, 927, 928, - 1075, 929, 930, 1146, 1151, 1156, 1159, 817, -1393, -1393, - 817, -1393, 912, 713, -1393, 916, 238, -1393, 919, 558, - -1393, 920, 354, -1393, 923, 237, -1393, 275, 924, -1393, - 581, -1393, 931, -96, -1393, 933, 936, 937, 938, 939, - 940, 942, 248, -1393, 932, 943, 944, 200, -1393, 1160, - 1162, 1168, 945, 1173, 964, 1174, 47, -1393, 47, -1393, - 934, 972, 1175, 973, 1176, 230, -1393, -1393, -52, 935, - -1393, 974, 978, 979, 981, -98, -1393, -1393, 1177, 1179, - 536, -1393, 941, 1180, -1393, -1393, 983, 985, -1393, 986, - 989, 990, 991, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, 358, -1393, -1393, 992, 993, 995, 998, - -1393, 290, -1393, 291, -1393, 1178, -1393, 1181, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 292, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, 1183, 1184, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 1182, 1188, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, 1185, -1393, 312, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 302, 1000, 1003, -1393, 1187, -1393, 1190, -1393, - 316, -1393, -1393, 1004, -1393, 39, -1393, -1393, 1194, -1393, - -1393, -1393, -1393, -1393, 320, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 1006, 387, -1393, 900, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 354, -1393, - 1195, 1196, 1007, 1008, -1393, 275, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 179, 1199, -1393, -1393, -1393, 1197, - 1012, 1198, -52, -1393, -1393, -1393, -1393, -1393, 1009, 1016, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - 400, -1393, -1393, -1393, -1393, -1393, -1393, 1186, 1200, -1393, - 1203, -1393, 1018, -1393, -1393, -1393, 1205, 1206, 1213, 1214, - 179, -1393, -19, -1393, 1199, 1217, -1393, 1015, 1019, 1021, - 1221, -1393, -1393, -1393, -1393, -1393, -1393, 445, -1393, -1393, - -1393, -1393, 188, -1393, -1393, -1393, -1393, -1393, 1220, 1225, - -19, -1393, -24, 1217, -1393, -1393, 1226, 1234, -1393, 1022, - -1393, -1393, 1240, 1249, 1252, -1393, 446, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 186, -1393, 1220, -1393, 1254, 1027, - 1031, 1032, 1260, -24, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 456, -1393, -1393, -1393, -1393, 1035, -1393, -1393, - -1393, 1037, -1393, 1264, 1267, 186, -1393, -1393, -1393, 1044, - 1045, -1393, -1393, -1393 + 508, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 22, 39, 44, 48, 54, 133, + 157, 209, 224, 235, 252, 260, 277, 306, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 39, -181, 184, 727, 72, 168, + 368, 211, 123, 78, 305, -93, 485, 80, -1401, 63, + 114, 293, 304, 318, -1401, 42, -1401, -1401, -1401, -1401, + 350, 351, 364, -1401, -1401, -1401, 365, 380, -1401, -1401, + -1401, 389, 393, 395, 407, 409, 413, 426, 432, 440, + 449, 469, -1401, 470, 472, 474, 479, 483, -1401, -1401, + -1401, 484, 488, 493, 495, 499, 505, 506, -1401, -1401, + -1401, 507, -1401, -1401, -1401, -1401, -1401, 509, 511, 513, + -1401, -1401, -1401, -1401, -1401, 515, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, 516, 522, 525, -1401, -1401, 528, -1401, + 62, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 529, 532, 534, 536, + -1401, 98, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 537, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, 116, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + 542, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, 124, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 378, + 466, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, 540, -1401, -1401, 546, -1401, -1401, -1401, + 547, -1401, -1401, 544, 550, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 551, 554, + 556, -1401, -1401, -1401, -1401, -1401, 560, 559, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 139, -1401, -1401, -1401, 566, -1401, 571, -1401, + 572, 573, -1401, -1401, -1401, -1401, -1401, 151, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 574, 154, + -1401, -1401, -1401, -1401, 39, 39, -1401, 349, 576, -1401, + -1401, 577, 578, 579, 352, 355, 357, 588, 589, 590, + 374, 362, 592, 596, 602, 377, 379, 383, 386, 387, + 388, 391, 399, 401, 396, 415, 634, 420, 423, 411, + 416, 419, 651, 652, 653, 429, 444, 427, 433, 436, + 447, 450, 661, 676, 678, 453, 681, 698, 699, 707, + 708, 480, 481, 486, 714, 717, 718, 719, 741, 517, + 742, 743, 745, 746, 748, 750, 751, 535, 538, 539, + 763, 765, -1401, 727, -1401, 766, 769, 770, 543, 545, + 548, 549, 72, -1401, 771, 773, 777, 778, 779, 780, + 557, 781, 815, 816, 817, 820, 168, -1401, 821, 595, + 368, -1401, 823, 824, 825, 826, 827, 828, 829, 833, + -1401, 211, -1401, 834, 835, 609, 838, 839, 842, 614, + -1401, 78, 844, 621, 622, 623, 853, -1401, 305, 857, + 859, -42, -1401, 631, 861, 635, 863, 637, 638, 866, + 867, 485, -1401, 869, 643, 80, -1401, -1401, -1401, 872, + 871, 873, 874, 877, -1401, -1401, -1401, 649, 655, 656, + -1401, -1401, 882, 883, 886, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 662, -1401, -1401, -1401, + -1401, -1401, -81, 663, 664, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 890, 891, 892, -1401, 668, 369, 894, 893, + 671, -1401, -1401, -1401, 897, 898, 899, 900, 901, -1401, + 902, 904, 907, 906, 910, 677, 684, -1401, -1401, -1401, + 913, 912, -1401, 915, 113, 187, -1401, -1401, -1401, -1401, + -1401, 691, 692, 693, 919, 701, 702, -1401, 915, 915, + 915, 703, 927, -1401, 705, -1401, -1401, 915, 706, 710, + 711, 712, 713, 715, 716, -1401, 720, 721, -1401, 722, + 723, 724, -1401, -1401, 725, -1401, -1401, -1401, 915, -1401, + 726, 893, -1401, -1401, 728, -1401, 729, -1401, -1401, 18, + 744, -1401, 933, -1401, -1401, 39, 727, 80, 72, 247, + -1401, -1401, -1401, 647, 647, 937, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, 940, 941, 942, -1401, -1401, + -1401, -1401, -1401, -1401, 954, -1401, -1401, -1401, 88, 955, + 956, 961, 309, -50, 798, 962, 161, 485, -1401, -1401, + 963, -1, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, 964, -1401, -1401, -1401, -1401, -1401, -1401, + 832, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, 937, -1401, 162, 183, 189, + -1401, -1401, 201, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + 968, 969, 973, 974, 975, 976, 977, 978, 979, 980, + -1401, 981, 982, -1401, -1401, -1401, -1401, -1401, 216, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 265, -1401, 983, 984, -1401, -1401, 985, 989, + -1401, -1401, 988, 992, -1401, -1401, 996, 995, -1401, -1401, + 999, 1003, -1401, -1401, -1401, -1401, -1401, -1401, 166, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 214, -1401, -1401, 1006, + 1011, -1401, -1401, 1009, 1014, -1401, 1016, 1017, 1028, 1034, + 1037, 1039, 290, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + 1042, 1047, 1050, -1401, 296, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 1051, -1401, 1057, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 297, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 1069, 1073, -1401, 1074, -1401, 1079, + -1401, -1401, -1401, 307, -1401, -1401, -1401, -1401, -1401, 332, + -1401, 303, -1401, 1080, 1081, 1087, 1089, -1401, 382, -1401, + -1401, -1401, -1401, -1401, 758, -1401, 1090, 1098, -1401, -1401, + 1110, -1401, 1118, -1401, -1401, -1401, 1124, 1130, 247, -1401, + 1135, 1152, 1162, 1168, 943, 946, 950, 949, 953, 958, + 960, 965, 966, 970, 1181, 959, 971, 1182, 1183, 1190, + 1191, 647, -1401, -1401, 647, -1401, 937, 168, -1401, 940, + 78, -1401, 941, 305, -1401, 942, 292, -1401, 954, 88, + -1401, 1378, 955, -1401, 211, -1401, 956, -93, -1401, 961, + 986, 987, 990, 991, 993, 994, 309, -1401, 997, 998, + 1000, -50, -1401, 1195, 1200, 1202, 1001, 1203, 1002, 1204, + 798, -1401, 798, -1401, 962, 1004, 1205, 1005, 1207, 161, + -1401, -1401, -19, 963, -1401, 1007, 1008, 1010, 1013, -1, + -1401, -1401, 1206, 1210, 368, -1401, 964, 1211, -1401, -1401, + 1012, 1018, -1401, 1020, 1021, 1023, 1024, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, 289, -1401, -1401, + 1025, 1027, 1030, 1032, -1401, 384, -1401, 418, -1401, 1208, + -1401, 1212, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 421, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, 1215, 1219, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 1218, 1224, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, 1220, -1401, 424, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 342, 1033, 1035, -1401, + 1226, -1401, 1209, -1401, 425, -1401, -1401, 1036, -1401, 39, + -1401, -1401, 1230, -1401, -1401, -1401, -1401, -1401, 431, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + 1040, 434, -1401, 915, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 292, -1401, 1234, 1235, 1041, 1043, -1401, 1378, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 50, 1237, + -1401, -1401, -1401, 1243, 1046, 1254, -19, -1401, -1401, -1401, + -1401, -1401, 1048, 1049, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 435, -1401, -1401, -1401, -1401, -1401, + -1401, 1261, 1269, -1401, 1276, -1401, 1052, -1401, -1401, -1401, + 1281, 1284, 1285, 1286, 50, -1401, -37, -1401, 1237, 1288, + -1401, 1121, 1063, 1066, 1292, -1401, -1401, -1401, -1401, -1401, + -1401, 437, -1401, -1401, -1401, -1401, 465, -1401, -1401, -1401, + -1401, -1401, 1291, 1296, -37, -1401, 109, 1288, -1401, -1401, + 1295, 1299, -1401, 1076, -1401, -1401, 1300, 1306, 1307, -1401, + 462, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 164, -1401, + 1291, -1401, 1310, 1070, 1085, 1088, 1314, 109, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 464, -1401, -1401, -1401, + -1401, 1091, -1401, -1401, -1401, 1093, -1401, 1316, 1320, 164, + -1401, -1401, -1401, 1096, 1099, -1401, -1401, -1401 }; const short @@ -5619,17 +5620,17 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 1, 44, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, 59, 5, 65, 7, 214, 9, 391, 11, 618, 13, - 649, 15, 533, 17, 542, 19, 581, 21, 353, 23, - 853, 25, 885, 27, 46, 39, 0, 0, 0, 0, - 0, 651, 0, 544, 583, 0, 0, 0, 48, 0, - 47, 0, 0, 40, 61, 0, 63, 883, 199, 232, - 0, 0, 0, 671, 673, 675, 0, 0, 230, 243, + 663, 15, 533, 17, 542, 19, 581, 21, 353, 23, + 867, 25, 899, 27, 46, 39, 0, 0, 0, 0, + 0, 665, 0, 544, 583, 0, 0, 0, 48, 0, + 47, 0, 0, 40, 61, 0, 63, 897, 199, 232, + 0, 0, 0, 685, 687, 689, 0, 0, 230, 243, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 164, 171, 173, 0, 0, 0, 0, 0, 0, 0, 382, 531, - 572, 0, 156, 177, 471, 636, 638, 0, 0, 0, - 315, 698, 640, 344, 365, 0, 330, 735, 737, 834, - 851, 187, 189, 0, 0, 0, 895, 937, 0, 141, + 572, 0, 156, 177, 471, 650, 652, 0, 0, 0, + 315, 712, 654, 344, 365, 0, 330, 749, 751, 848, + 865, 187, 189, 0, 0, 0, 909, 951, 0, 141, 0, 67, 70, 71, 72, 73, 74, 108, 109, 110, 111, 112, 75, 104, 137, 138, 93, 94, 95, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, @@ -5640,534 +5641,567 @@ namespace isc { namespace dhcp { 103, 113, 136, 216, 218, 222, 0, 0, 0, 0, 213, 0, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 451, 453, 455, 609, 449, 457, 0, 461, - 463, 465, 459, 693, 448, 396, 397, 398, 399, 400, + 463, 465, 459, 707, 448, 396, 397, 398, 399, 400, 425, 426, 427, 428, 429, 446, 415, 416, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 447, 0, 393, 403, 420, 421, 422, 404, 406, 407, 408, 409, 411, 412, 413, 405, - 401, 402, 423, 424, 410, 417, 418, 419, 414, 633, - 0, 632, 626, 627, 628, 629, 625, 0, 620, 623, - 624, 630, 631, 691, 677, 679, 681, 685, 683, 689, - 687, 670, 664, 668, 669, 0, 652, 653, 665, 666, - 667, 661, 656, 662, 658, 659, 660, 663, 657, 0, - 562, 289, 0, 566, 564, 569, 0, 558, 559, 0, - 545, 546, 549, 561, 550, 551, 552, 568, 553, 554, - 555, 556, 557, 600, 0, 0, 0, 607, 598, 599, - 602, 603, 0, 584, 585, 588, 589, 590, 591, 592, - 593, 594, 597, 595, 596, 361, 363, 358, 0, 355, - 359, 360, 0, 870, 0, 873, 0, 0, 877, 881, - 868, 866, 867, 0, 855, 858, 859, 860, 861, 862, - 863, 864, 865, 892, 0, 0, 887, 890, 891, 45, - 50, 0, 37, 43, 0, 64, 60, 0, 0, 0, + 401, 402, 423, 424, 410, 417, 418, 419, 414, 647, + 0, 646, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 626, 627, 628, 629, + 625, 0, 620, 623, 624, 644, 645, 705, 691, 693, + 695, 699, 697, 703, 701, 684, 678, 682, 683, 0, + 666, 667, 679, 680, 681, 675, 670, 676, 672, 673, + 674, 677, 671, 0, 562, 289, 0, 566, 564, 569, + 0, 558, 559, 0, 545, 546, 549, 561, 550, 551, + 552, 568, 553, 554, 555, 556, 557, 600, 0, 0, + 0, 607, 598, 599, 602, 603, 0, 584, 585, 588, + 589, 590, 591, 592, 593, 594, 597, 595, 596, 361, + 363, 358, 0, 355, 359, 360, 0, 884, 0, 887, + 0, 0, 891, 895, 882, 880, 881, 0, 869, 872, + 873, 874, 875, 876, 877, 878, 879, 906, 0, 0, + 901, 904, 905, 45, 50, 0, 37, 43, 0, 64, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 58, 69, - 66, 0, 0, 0, 0, 0, 0, 0, 203, 215, + 0, 0, 58, 69, 66, 0, 0, 0, 0, 0, + 0, 0, 203, 215, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 395, 392, 0, 0, + 622, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 664, 669, 534, 0, 0, 0, 0, 0, 0, 0, + 543, 548, 0, 0, 0, 0, 0, 582, 587, 0, + 0, 357, 354, 0, 0, 0, 0, 0, 0, 0, + 0, 871, 868, 0, 0, 903, 900, 49, 41, 0, + 0, 0, 0, 0, 158, 159, 160, 0, 0, 0, + 197, 198, 0, 0, 0, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 0, 192, 193, 161, + 162, 163, 0, 0, 0, 175, 176, 183, 184, 185, + 186, 191, 0, 0, 0, 155, 0, 0, 0, 0, + 0, 467, 468, 469, 0, 0, 0, 0, 0, 748, + 0, 0, 0, 0, 0, 0, 0, 194, 195, 196, + 0, 0, 68, 0, 0, 0, 226, 227, 228, 229, + 202, 0, 0, 0, 0, 0, 0, 470, 0, 0, + 0, 0, 0, 394, 0, 649, 621, 0, 0, 0, + 0, 0, 0, 0, 0, 668, 0, 0, 560, 0, + 0, 0, 571, 547, 0, 604, 605, 606, 0, 586, + 0, 0, 356, 883, 0, 886, 0, 889, 890, 0, + 0, 870, 0, 908, 902, 0, 0, 0, 0, 0, + 686, 688, 690, 0, 0, 247, 154, 166, 167, 168, + 169, 170, 165, 172, 174, 384, 535, 574, 157, 179, + 180, 181, 182, 178, 473, 38, 651, 653, 0, 0, + 656, 346, 0, 0, 0, 753, 0, 0, 188, 190, + 0, 0, 51, 217, 220, 221, 219, 224, 225, 223, + 452, 454, 456, 611, 450, 458, 462, 464, 466, 460, + 0, 648, 706, 692, 694, 696, 700, 698, 704, 702, + 563, 290, 567, 565, 570, 601, 608, 362, 364, 885, + 888, 893, 894, 892, 896, 247, 42, 0, 0, 0, + 239, 241, 0, 234, 237, 238, 280, 282, 284, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 395, 392, 0, 0, 622, 619, 0, 0, - 0, 0, 0, 0, 0, 0, 650, 655, 534, 0, - 0, 0, 0, 0, 0, 0, 543, 548, 0, 0, - 0, 0, 0, 582, 587, 0, 0, 357, 354, 0, - 0, 0, 0, 0, 0, 0, 0, 857, 854, 0, - 0, 889, 886, 49, 41, 0, 0, 0, 0, 0, - 158, 159, 160, 0, 0, 0, 197, 198, 0, 0, - 0, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 0, 192, 193, 161, 162, 163, 0, 0, - 0, 175, 176, 183, 184, 185, 186, 191, 0, 0, - 0, 155, 0, 0, 0, 0, 0, 467, 468, 469, - 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, - 0, 0, 0, 194, 195, 196, 0, 0, 68, 0, - 0, 0, 226, 227, 228, 229, 202, 0, 0, 0, - 0, 0, 0, 470, 0, 0, 0, 0, 0, 394, - 0, 635, 621, 0, 0, 0, 0, 0, 0, 0, - 0, 654, 0, 0, 560, 0, 0, 0, 571, 547, - 0, 604, 605, 606, 0, 586, 0, 0, 356, 869, - 0, 872, 0, 875, 876, 0, 0, 856, 0, 894, - 888, 0, 0, 0, 0, 0, 672, 674, 676, 0, - 0, 247, 154, 166, 167, 168, 169, 170, 165, 172, - 174, 384, 535, 574, 157, 179, 180, 181, 182, 178, - 473, 38, 637, 639, 0, 0, 642, 346, 0, 0, - 0, 739, 0, 0, 188, 190, 0, 0, 51, 217, - 220, 221, 219, 224, 225, 223, 452, 454, 456, 611, - 450, 458, 462, 464, 466, 460, 0, 634, 692, 678, - 680, 682, 686, 684, 690, 688, 563, 290, 567, 565, - 570, 601, 608, 362, 364, 871, 874, 879, 880, 878, - 882, 247, 42, 0, 0, 0, 239, 241, 0, 234, - 237, 238, 280, 282, 284, 286, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 300, 0, 0, 307, - 309, 311, 313, 279, 0, 254, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 0, 252, - 0, 248, 249, 389, 0, 385, 386, 540, 0, 536, - 537, 579, 0, 575, 576, 478, 0, 474, 475, 325, - 326, 327, 328, 329, 0, 317, 320, 321, 322, 323, - 324, 703, 0, 700, 647, 0, 643, 644, 351, 0, - 347, 348, 0, 0, 0, 0, 0, 0, 0, 367, - 370, 371, 372, 373, 374, 375, 0, 0, 0, 340, - 0, 332, 335, 336, 337, 338, 339, 762, 767, 769, - 0, 792, 0, 773, 761, 754, 755, 756, 759, 760, - 0, 746, 749, 750, 751, 752, 757, 758, 753, 744, - 0, 740, 741, 0, 846, 0, 849, 842, 843, 0, - 836, 839, 840, 841, 844, 0, 900, 0, 897, 0, - 0, 0, 0, 946, 0, 939, 942, 943, 944, 945, - 53, 616, 0, 612, 613, 696, 0, 695, 0, 62, - 884, 200, 0, 0, 236, 233, 0, 0, 0, 0, + 300, 0, 0, 307, 309, 311, 313, 279, 0, 254, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 0, 252, 0, 248, 249, 389, 0, 385, + 386, 540, 0, 536, 537, 579, 0, 575, 576, 478, + 0, 474, 475, 325, 326, 327, 328, 329, 0, 317, + 320, 321, 322, 323, 324, 717, 0, 714, 661, 0, + 657, 658, 351, 0, 347, 348, 0, 0, 0, 0, + 0, 0, 0, 367, 370, 371, 372, 373, 374, 375, + 0, 0, 0, 340, 0, 332, 335, 336, 337, 338, + 339, 776, 781, 783, 0, 806, 0, 787, 775, 768, + 769, 770, 773, 774, 0, 760, 763, 764, 765, 766, + 771, 772, 767, 758, 0, 754, 755, 0, 860, 0, + 863, 856, 857, 0, 850, 853, 854, 855, 858, 0, + 914, 0, 911, 0, 0, 0, 0, 960, 0, 953, + 956, 957, 958, 959, 53, 616, 0, 612, 613, 710, + 0, 709, 0, 62, 898, 200, 0, 0, 236, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 256, 231, 244, - 0, 246, 251, 0, 383, 388, 544, 532, 539, 583, - 573, 578, 0, 472, 477, 319, 316, 705, 702, 699, - 651, 641, 646, 0, 345, 350, 0, 0, 0, 0, - 0, 0, 369, 366, 0, 0, 0, 334, 331, 0, - 0, 0, 0, 0, 0, 0, 748, 736, 0, 738, - 743, 0, 0, 0, 0, 838, 835, 852, 0, 899, - 896, 0, 0, 0, 0, 941, 938, 55, 0, 54, - 0, 610, 615, 0, 694, 893, 0, 0, 235, 0, - 0, 0, 0, 288, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 0, 305, 306, 0, 0, 0, 0, - 255, 0, 250, 0, 387, 0, 538, 0, 577, 530, - 502, 503, 504, 486, 487, 507, 508, 509, 510, 511, - 528, 489, 490, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 529, - 483, 484, 485, 498, 499, 500, 501, 495, 496, 497, - 0, 480, 488, 505, 506, 491, 492, 493, 494, 476, - 318, 728, 730, 0, 0, 722, 723, 724, 725, 726, - 727, 715, 716, 720, 721, 717, 718, 719, 0, 706, - 707, 710, 711, 712, 713, 714, 701, 0, 645, 0, - 349, 376, 377, 378, 379, 380, 381, 368, 341, 342, - 343, 333, 0, 0, 0, 771, 0, 772, 0, 747, - 0, 742, 845, 0, 848, 0, 837, 915, 0, 913, - 911, 905, 909, 910, 0, 902, 907, 908, 906, 898, - 947, 948, 949, 950, 940, 52, 57, 0, 614, 0, - 240, 242, 281, 283, 285, 287, 302, 303, 304, 301, - 308, 310, 312, 314, 253, 390, 541, 580, 482, 479, - 0, 0, 0, 0, 704, 709, 648, 352, 764, 765, - 766, 763, 768, 770, 0, 775, 745, 847, 850, 0, - 0, 0, 904, 901, 56, 617, 697, 481, 0, 0, - 732, 733, 708, 804, 807, 809, 811, 803, 802, 801, - 0, 794, 797, 798, 799, 800, 780, 0, 776, 777, - 0, 912, 0, 903, 729, 731, 0, 0, 0, 0, - 796, 793, 0, 774, 779, 0, 914, 0, 0, 0, - 0, 795, 790, 789, 785, 787, 788, 0, 782, 786, - 778, 920, 0, 917, 806, 805, 808, 810, 813, 0, - 784, 781, 0, 919, 916, 818, 0, 814, 815, 0, - 783, 930, 0, 0, 0, 935, 0, 922, 925, 926, - 927, 928, 929, 918, 0, 812, 817, 791, 0, 0, - 0, 0, 0, 924, 921, 830, 832, 829, 823, 825, - 827, 828, 0, 820, 824, 826, 816, 0, 932, 933, - 934, 0, 923, 0, 0, 822, 819, 931, 936, 0, - 0, 821, 831, 833 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 256, 231, 244, 0, 246, 251, 0, 383, 388, + 544, 532, 539, 583, 573, 578, 0, 472, 477, 319, + 316, 719, 716, 713, 665, 655, 660, 0, 345, 350, + 0, 0, 0, 0, 0, 0, 369, 366, 0, 0, + 0, 334, 331, 0, 0, 0, 0, 0, 0, 0, + 762, 750, 0, 752, 757, 0, 0, 0, 0, 852, + 849, 866, 0, 913, 910, 0, 0, 0, 0, 955, + 952, 55, 0, 54, 0, 610, 615, 0, 708, 907, + 0, 0, 235, 0, 0, 0, 0, 288, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 0, 305, 306, + 0, 0, 0, 0, 255, 0, 250, 0, 387, 0, + 538, 0, 577, 530, 502, 503, 504, 486, 487, 507, + 508, 509, 510, 511, 528, 489, 490, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 529, 483, 484, 485, 498, 499, 500, + 501, 495, 496, 497, 0, 480, 488, 505, 506, 491, + 492, 493, 494, 476, 318, 742, 744, 0, 0, 736, + 737, 738, 739, 740, 741, 729, 730, 734, 735, 731, + 732, 733, 0, 720, 721, 724, 725, 726, 727, 728, + 715, 0, 659, 0, 349, 376, 377, 378, 379, 380, + 381, 368, 341, 342, 343, 333, 0, 0, 0, 785, + 0, 786, 0, 761, 0, 756, 859, 0, 862, 0, + 851, 929, 0, 927, 925, 919, 923, 924, 0, 916, + 921, 922, 920, 912, 961, 962, 963, 964, 954, 52, + 57, 0, 614, 0, 240, 242, 281, 283, 285, 287, + 302, 303, 304, 301, 308, 310, 312, 314, 253, 390, + 541, 580, 482, 479, 0, 0, 0, 0, 718, 723, + 662, 352, 778, 779, 780, 777, 782, 784, 0, 789, + 759, 861, 864, 0, 0, 0, 918, 915, 56, 617, + 711, 481, 0, 0, 746, 747, 722, 818, 821, 823, + 825, 817, 816, 815, 0, 808, 811, 812, 813, 814, + 794, 0, 790, 791, 0, 926, 0, 917, 743, 745, + 0, 0, 0, 0, 810, 807, 0, 788, 793, 0, + 928, 0, 0, 0, 0, 809, 804, 803, 799, 801, + 802, 0, 796, 800, 792, 934, 0, 931, 820, 819, + 822, 824, 827, 0, 798, 795, 0, 933, 930, 832, + 0, 828, 829, 0, 797, 944, 0, 0, 0, 949, + 0, 936, 939, 940, 941, 942, 943, 932, 0, 826, + 831, 805, 0, 0, 0, 0, 0, 938, 935, 844, + 846, 843, 837, 839, 841, 842, 0, 834, 838, 840, + 830, 0, 946, 947, 948, 0, 937, 0, 0, 836, + 833, 945, 950, 0, 0, 835, 845, 847 }; const short Dhcp4Parser::yypgoto_[] = { - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -59, -1393, -614, -1393, 564, - -1393, -1393, -1393, -1393, -1393, -1393, -651, -1393, -1393, -1393, - -67, -1393, -1393, -1393, -1393, -1393, -1393, -1393, 545, 757, - 16, 31, 33, -26, -13, 13, 41, 44, 51, 54, - -1393, -1393, -1393, -1393, 56, -1393, -1393, 59, 62, 64, - 66, 69, 74, -1393, -1393, 76, -1393, 77, -1393, 79, - 81, 82, -1393, -1393, 84, 87, 89, 92, 94, -1393, - 97, -1393, 99, -1393, -1393, -1393, -1393, -1393, 43, -1393, - -1393, -1393, 548, 751, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, 269, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 467, -1393, 242, -1393, -724, 249, -1393, -1393, - -1392, -1393, -1386, -1393, -1393, -1393, -1393, -63, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -756, -1393, -755, -1393, -752, -1393, -1393, - -1393, -1393, -1393, -1393, 232, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, 212, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, 227, -1393, -1393, -1393, 231, 719, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 228, -1393, -1393, -1393, -1393, -1393, - -1393, -1035, -1393, -1393, -1393, 245, -1393, -1393, -1393, 254, - 760, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1033, - -1393, -29, -1393, -18, -1393, 5, -1393, 71, -1393, 100, - 102, 104, -1393, -1393, -1393, -1393, -1393, 251, -1393, -1393, - 6, -60, -1393, -1393, -1393, -1393, -1393, 258, -1393, -1393, - -1393, 261, -1393, 742, -1393, -34, -1393, -1393, -1393, -1393, - -1393, -27, -1393, -1393, -1393, -1393, -1393, -32, -1393, -1393, - -1393, 259, -1393, -1393, -1393, 263, -1393, 741, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, 207, -1393, -1393, -1393, 216, 776, -1393, -1393, - -1393, -44, -1393, 3, -1393, -56, -1393, -1393, -1393, 262, - -1393, -1393, -1393, 268, -1393, 773, -48, -1393, -7, -1393, - 15, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1032, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 274, -1393, -1393, -1393, - 28, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, 244, -1393, 247, 257, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -20, -1393, -1393, -53, -1393, -1393, -1393, -1393, - -1393, -15, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -76, -1393, -1393, -95, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 260, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, 578, 769, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, 620, 768, -1393, -1393, -1393, -1393, - -1393, -1393, 267, -1393, -1393, 36, -1393, -1393, -1393, -1393, - -1393, -1393, -25, -1393, -1393, -62, -1393, -1393, -1393, -1393, - -1393, -1393, -1393, -1393, -1393, -1393, 266, -1393, -1393, -1393, - -1393 + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -59, -1401, -628, -1401, 605, + -1401, -1401, -1401, -1401, -1401, -1401, -665, -1401, -1401, -1401, + -67, -1401, -1401, -1401, -1401, -1401, -1401, -1401, 587, 805, + 16, 31, 33, -26, 84, 86, 87, 89, 91, 92, + -1401, -1401, -1401, -1401, 94, -1401, -1401, 97, 102, -13, + 13, 41, 51, -1401, -1401, 53, -1401, 56, -1401, 59, + 104, 64, -1401, -1401, 66, 69, 74, 76, 79, -1401, + 81, -1401, 105, -1401, -1401, -1401, -1401, -1401, 43, -1401, + -1401, -1401, 594, 802, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, 312, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 512, -1401, 295, -1401, -738, 298, -1401, -1401, + -1400, -1401, -1370, -1401, -1401, -1401, -1401, -63, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -770, -1401, -769, -1401, -766, -1401, -1401, + -1401, -1401, -1401, -1401, 279, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, 255, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, 275, -1401, -1401, -1401, 280, 767, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 270, -1401, -1401, -1401, -1401, -1401, + -1401, -1049, -1401, -1401, -1401, 300, -1401, -1401, -1401, 310, + 808, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1047, + -1401, -29, -1401, -18, -1401, -4, -1401, 5, -1401, 107, + 110, 112, -1401, -1401, -1401, -1401, -1401, 301, -1401, -1401, + 58, -60, -1401, -1401, -1401, -1401, -1401, 311, -1401, -1401, + -1401, 314, -1401, 785, -1401, -34, -1401, -1401, -1401, -1401, + -1401, -27, -1401, -1401, -1401, -1401, -1401, -32, -1401, -1401, + -1401, 315, -1401, -1401, -1401, 319, -1401, 784, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 249, -1401, -1401, -1401, 259, 830, -1401, -1401, + -1401, -44, -1401, 3, -1401, -56, -1401, -1401, -1401, 313, + -1401, -1401, -1401, 320, -1401, 814, -48, -1401, -7, -1401, + 15, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1046, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 323, -1401, -1401, -1401, + 68, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, 316, -1401, 321, 302, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, 19, -1401, -1401, 1, -1401, -1401, -1401, -1401, + -1401, 26, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -22, -1401, -1401, -41, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 317, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, 640, 831, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, 674, 836, -1401, -1401, -1401, -1401, + -1401, -1401, 322, -1401, -1401, 93, -1401, -1401, -1401, -1401, + -1401, -1401, 21, -1401, -1401, -12, -1401, -1401, -1401, -1401, + -1401, -1401, -1401, -1401, -1401, -1401, 326, -1401, -1401, -1401, + -1401 }; const short Dhcp4Parser::yydefgoto_[] = { 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 36, 37, 38, 65, 762, - 82, 83, 39, 64, 79, 80, 779, 1000, 1108, 1109, - 853, 41, 66, 85, 444, 86, 43, 67, 160, 161, + 23, 24, 25, 26, 27, 36, 37, 38, 65, 776, + 82, 83, 39, 64, 79, 80, 793, 1014, 1122, 1123, + 867, 41, 66, 85, 458, 86, 43, 67, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 472, 174, 175, 492, 176, 177, 178, 179, - 180, 181, 182, 478, 748, 183, 479, 184, 480, 185, - 186, 187, 493, 759, 188, 189, 190, 191, 192, 511, - 193, 512, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 448, 241, 242, 45, 68, 243, 521, 244, 522, - 782, 245, 523, 785, 246, 247, 248, 249, 203, 458, - 204, 449, 828, 829, 830, 1012, 831, 1013, 205, 459, - 206, 460, 880, 881, 882, 1040, 854, 855, 856, 1016, - 857, 1017, 858, 1018, 859, 1019, 860, 861, 560, 862, - 863, 864, 865, 866, 867, 868, 869, 870, 871, 1030, - 1289, 872, 873, 874, 1033, 875, 1034, 876, 1035, 877, - 1036, 207, 500, 904, 905, 906, 907, 908, 909, 910, - 208, 506, 940, 941, 942, 943, 944, 209, 503, 919, - 920, 921, 1063, 59, 75, 408, 409, 410, 575, 411, - 576, 210, 504, 928, 929, 930, 931, 932, 933, 934, - 935, 211, 488, 884, 885, 886, 1043, 47, 69, 295, - 296, 297, 534, 298, 530, 299, 531, 300, 532, 301, - 535, 302, 540, 303, 537, 304, 538, 305, 539, 212, - 213, 214, 309, 215, 494, 896, 897, 898, 1052, 1190, - 1191, 216, 489, 53, 72, 888, 889, 890, 1046, 55, - 73, 369, 370, 371, 372, 373, 374, 375, 559, 376, - 563, 377, 562, 378, 379, 564, 380, 217, 490, 892, - 893, 894, 1049, 57, 74, 392, 393, 394, 395, 396, - 568, 397, 398, 399, 400, 401, 402, 572, 311, 533, - 1002, 1003, 1004, 1110, 49, 70, 327, 328, 329, 544, - 330, 218, 495, 219, 496, 220, 502, 915, 916, 917, - 1060, 51, 71, 345, 346, 347, 221, 453, 222, 454, - 223, 455, 351, 549, 352, 550, 353, 551, 354, 553, - 355, 552, 356, 555, 357, 554, 358, 548, 318, 541, - 1006, 1007, 1113, 224, 501, 912, 913, 1057, 1218, 1219, - 1220, 1221, 1222, 1300, 1223, 1301, 1224, 1225, 225, 226, - 507, 227, 508, 970, 971, 972, 1088, 960, 961, 962, - 1079, 1311, 963, 1080, 964, 1081, 965, 966, 967, 1085, - 1347, 1348, 1349, 1362, 1377, 1378, 1379, 1389, 968, 1083, - 1340, 1341, 1342, 1356, 1385, 1343, 1357, 1344, 1358, 1345, - 1359, 1396, 1397, 1398, 1414, 1432, 1433, 1434, 1443, 1435, - 1444, 228, 509, 979, 980, 981, 982, 1092, 983, 984, - 1094, 229, 510, 61, 76, 423, 424, 425, 426, 580, - 427, 428, 582, 429, 430, 431, 585, 819, 432, 586, - 230, 447, 63, 77, 435, 436, 437, 589, 438, 231, - 516, 987, 988, 1098, 1264, 1265, 1266, 1267, 1321, 1268, - 1319, 1382, 1383, 1392, 1406, 1407, 1408, 1418, 1409, 1410, - 1411, 1412, 1422, 232, 517, 994, 995, 996, 997, 998, - 999 + 172, 173, 486, 174, 175, 506, 176, 177, 178, 179, + 180, 181, 182, 492, 762, 183, 493, 184, 494, 185, + 186, 187, 507, 773, 188, 189, 190, 191, 192, 525, + 193, 526, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 462, 241, 242, 45, 68, 243, 535, 244, 536, + 796, 245, 537, 799, 246, 247, 248, 249, 203, 472, + 204, 463, 842, 843, 844, 1026, 845, 1027, 205, 473, + 206, 474, 894, 895, 896, 1054, 868, 869, 870, 1030, + 871, 1031, 872, 1032, 873, 1033, 874, 875, 574, 876, + 877, 878, 879, 880, 881, 882, 883, 884, 885, 1044, + 1303, 886, 887, 888, 1047, 889, 1048, 890, 1049, 891, + 1050, 207, 514, 918, 919, 920, 921, 922, 923, 924, + 208, 520, 954, 955, 956, 957, 958, 209, 517, 933, + 934, 935, 1077, 59, 75, 422, 423, 424, 589, 425, + 590, 210, 518, 942, 943, 944, 945, 946, 947, 948, + 949, 211, 502, 898, 899, 900, 1057, 47, 69, 295, + 296, 297, 548, 298, 544, 299, 545, 300, 546, 301, + 549, 302, 554, 303, 551, 304, 552, 305, 553, 212, + 213, 214, 309, 215, 508, 910, 911, 912, 1066, 1204, + 1205, 216, 503, 53, 72, 902, 903, 904, 1060, 55, + 73, 383, 384, 385, 386, 387, 388, 389, 573, 390, + 577, 391, 576, 392, 393, 578, 394, 217, 504, 906, + 907, 908, 1063, 57, 74, 406, 407, 408, 409, 410, + 582, 411, 412, 413, 414, 415, 416, 586, 311, 547, + 1016, 1017, 1018, 1124, 49, 70, 341, 342, 343, 558, + 344, 218, 509, 219, 510, 220, 516, 929, 930, 931, + 1074, 51, 71, 359, 360, 361, 221, 467, 222, 468, + 223, 469, 365, 563, 366, 564, 367, 565, 368, 567, + 369, 566, 370, 569, 371, 568, 372, 562, 318, 555, + 1020, 1021, 1127, 224, 515, 926, 927, 1071, 1232, 1233, + 1234, 1235, 1236, 1314, 1237, 1315, 1238, 1239, 225, 226, + 521, 227, 522, 984, 985, 986, 1102, 974, 975, 976, + 1093, 1325, 977, 1094, 978, 1095, 979, 980, 981, 1099, + 1361, 1362, 1363, 1376, 1391, 1392, 1393, 1403, 982, 1097, + 1354, 1355, 1356, 1370, 1399, 1357, 1371, 1358, 1372, 1359, + 1373, 1410, 1411, 1412, 1428, 1446, 1447, 1448, 1457, 1449, + 1458, 228, 523, 993, 994, 995, 996, 1106, 997, 998, + 1108, 229, 524, 61, 76, 437, 438, 439, 440, 594, + 441, 442, 596, 443, 444, 445, 599, 833, 446, 600, + 230, 461, 63, 77, 449, 450, 451, 603, 452, 231, + 530, 1001, 1002, 1112, 1278, 1279, 1280, 1281, 1335, 1282, + 1333, 1396, 1397, 1406, 1420, 1421, 1422, 1432, 1423, 1424, + 1425, 1426, 1436, 232, 531, 1008, 1009, 1010, 1011, 1012, + 1013 }; const short Dhcp4Parser::yytable_[] = { - 159, 240, 264, 321, 341, 78, 367, 388, 407, 420, - 368, 389, 359, 314, 955, 956, 878, 1181, 957, 1182, - 1198, 315, 1428, 348, 250, 312, 331, 343, 1429, 381, - 403, 761, 421, 792, 793, 794, 817, 310, 326, 342, - 390, 322, 798, 268, 29, 361, 30, 391, 31, 445, - 405, 406, 323, 1428, 446, 519, 269, 28, 1055, 1429, - 520, 1056, 316, 812, 349, 135, 136, 743, 744, 745, - 746, 251, 313, 332, 344, 324, 382, 404, 361, 422, - 433, 434, 270, 81, 317, 265, 350, 233, 234, 1058, - 40, 235, 1059, 129, 236, 237, 238, 239, 135, 136, - 266, 1099, 267, 761, 1100, 84, 747, 849, 850, 851, - 271, 439, 294, 272, 528, 989, 990, 991, 992, 529, - 273, 542, 546, 274, 577, 275, 543, 547, 276, 578, - 42, 277, 158, 278, 158, 279, 44, 587, 280, 591, - 46, 325, 588, 281, 592, 282, 283, 48, 284, 50, - 285, 286, 1257, 287, 1258, 1259, 288, 519, 289, 1372, - 52, 290, 1009, 291, 135, 136, 292, 591, 293, 306, - 528, 307, 1010, 308, 1014, 1011, 54, 87, 158, 1015, - 88, 1401, 56, 1037, 1402, 1403, 1404, 1405, 1038, 135, - 136, 1393, 89, 440, 1394, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 58, 1037, 60, 947, - 818, 158, 1039, 948, 949, 950, 951, 1072, 62, 1333, - 1077, 1086, 1073, 952, 953, 1078, 1087, 833, 834, 441, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 443, 1095, - 442, 129, 130, 1181, 1096, 1182, 1198, 780, 781, 32, - 33, 34, 35, 131, 132, 133, 587, 158, 360, 556, - 134, 1097, 1105, 135, 136, 405, 406, 1106, 137, 138, - 139, 140, 141, 1037, 542, 1298, 135, 136, 1294, 1295, - 1299, 142, 158, 135, 136, 783, 784, 93, 94, 95, - 96, 143, 450, 451, 144, 577, 1141, 135, 136, 1086, - 1307, 145, 146, 1322, 1316, 452, 147, 148, 1323, 456, - 955, 956, 955, 956, 957, 361, 957, 362, 363, 101, - 102, 103, 364, 365, 366, 149, 457, 135, 136, 150, - 1334, 1335, 1336, 826, 827, 135, 136, 936, 937, 938, - 1425, 1426, 595, 461, 151, 152, 153, 154, 155, 156, - 129, 130, 361, 462, 899, 900, 901, 902, 157, 903, - 463, 593, 594, 464, 91, 92, 93, 94, 95, 96, - 546, 557, 135, 136, 465, 1325, 158, 922, 923, 924, - 925, 926, 927, 1360, 1201, 1202, 1203, 1204, 1361, 158, - 973, 974, 975, 1286, 1287, 1288, 158, 466, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 467, 468, - 158, 469, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 470, 471, 1390, 1423, - 130, 361, 159, 1391, 1424, 755, 756, 757, 758, 1445, - 976, 240, 132, 133, 1446, 1308, 1309, 1310, 158, 473, - 474, 135, 136, 475, 257, 264, 137, 138, 139, 321, - 259, 260, 261, 476, 250, 477, 314, 262, 481, 482, - 341, 483, 484, 485, 315, 486, 487, 263, 312, 491, - 367, 497, 331, 498, 368, 158, 499, 388, 505, 348, - 310, 389, 513, 343, 326, 514, 268, 322, 515, 518, - 420, 524, 525, 381, 526, 342, 527, 536, 323, 269, - 403, 251, 545, 558, 561, 316, 565, 566, 567, 573, - 390, 569, 570, 421, 571, 313, 574, 391, 579, 332, - 349, 324, 151, 152, 581, 270, 583, 317, 265, 584, - 344, 590, 600, 596, 597, 598, 599, 601, 602, 603, - 382, 604, 350, 266, 605, 267, 607, 404, 606, 608, - 609, 610, 611, 271, 158, 294, 272, 612, 613, 622, - 422, 614, 615, 273, 620, 616, 274, 617, 275, 618, - 619, 276, 621, 623, 277, 624, 278, 628, 279, 629, - 625, 280, 630, 93, 94, 95, 281, 325, 282, 283, - 638, 284, 626, 285, 286, 627, 287, 631, 1326, 288, - 632, 289, 130, 633, 290, 634, 291, 635, 636, 292, - 639, 293, 306, 637, 307, 640, 308, 641, 642, 643, - 644, 645, 319, 135, 136, 361, 383, 362, 363, 384, - 385, 386, 259, 260, 261, 159, 646, 240, 647, 262, - 320, 648, 822, 649, 650, 135, 136, 130, 651, 652, - 653, 654, 655, 656, 387, 657, 658, 659, 660, 661, - 250, 135, 136, 662, 663, 664, 665, 666, 135, 136, - 667, 669, 939, 954, 670, 671, 420, 333, 672, 673, - 993, 674, 677, 675, 678, 679, 680, 334, 335, 336, - 337, 338, 339, 340, 681, 945, 958, 682, 977, 421, - 684, 683, 685, 686, 687, 688, 690, 251, 691, 693, - 694, 695, 696, 91, 92, 93, 94, 95, 96, 697, - 698, 699, 700, 702, 703, 704, 705, 706, 412, 413, - 414, 415, 416, 417, 418, 419, 158, 707, 710, 714, - 716, 717, 946, 959, 708, 978, 422, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 711, 158, 712, - 720, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 158, 252, 253, 254, 722, 130, - 725, 158, 713, 719, 721, 723, 726, 724, 728, 729, - 731, 132, 133, 736, 737, 732, 733, 734, 255, 735, - 135, 136, 256, 257, 258, 137, 138, 139, 739, 259, - 260, 261, 738, 740, 741, 742, 262, 749, 142, 750, - 751, 752, 753, 754, 760, 30, 263, 832, 833, 834, - 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, - 845, 846, 763, 764, 765, 847, 848, 849, 850, 851, - 852, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 766, 767, 774, 775, 768, 769, - 770, 771, 772, 776, 773, 778, 777, 789, 786, 821, - 787, 151, 152, 796, 361, 820, 788, 790, 791, 879, - 795, 797, 799, 883, 800, 801, 887, 891, 802, 803, - 895, 911, 804, 805, 806, 807, 808, 809, 914, 810, - 918, 969, 986, 158, 811, 813, 815, 816, 1001, 1005, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, - 1031, 1032, 1042, 1107, 1041, 1045, 1044, 1047, 1048, 1050, - 1051, 1054, 1053, 1062, 1123, 1061, 264, 1064, 1065, 367, - 1066, 1067, 388, 368, 1068, 1149, 389, 314, 1069, 1180, - 1205, 1070, 1071, 341, 1210, 315, 407, 1211, 1074, 312, - 1075, 1076, 381, 1082, 1195, 403, 1084, 1089, 1193, 1215, - 939, 310, 348, 1213, 1090, 390, 343, 268, 1091, 954, - 1192, 954, 391, 1183, 1093, 1212, 1153, 1101, 342, 1102, - 269, 1260, 1103, 945, 1184, 1261, 316, 1104, 993, 1154, - 1111, 1112, 958, 321, 958, 1196, 313, 158, 1114, 382, - 1216, 977, 404, 349, 1262, 1194, 270, 1185, 317, 265, - 1214, 1115, 1116, 344, 1117, 1155, 331, 1197, 1150, 1119, - 1120, 1121, 1217, 1206, 266, 350, 267, 1122, 326, 1133, - 946, 322, 1125, 1151, 271, 1152, 294, 272, 1207, 959, - 1208, 959, 323, 1156, 273, 1179, 1157, 274, 978, 275, - 1209, 1263, 276, 1158, 1124, 277, 1159, 278, 1160, 279, - 1126, 1161, 280, 332, 1162, 324, 1163, 281, 1164, 282, - 283, 1165, 284, 1186, 285, 286, 1166, 287, 1167, 1168, - 288, 1169, 289, 1170, 1171, 290, 1172, 291, 1127, 1173, - 292, 1174, 293, 306, 1175, 307, 1176, 308, 1128, 1177, - 1136, 1178, 1187, 1129, 1188, 1137, 1189, 1130, 1131, 1132, - 1138, 1135, 1134, 1139, 1242, 1238, 1243, 1231, 1232, 1233, - 1234, 1235, 1244, 1236, 1239, 1240, 1245, 1246, 1248, 1253, - 1255, 325, 1276, 1275, 1279, 1384, 1296, 1302, 1303, 1297, - 1304, 1305, 1363, 1306, 1314, 1315, 1318, 1247, 1320, 1328, - 1329, 1350, 1352, 1364, 1254, 1252, 1346, 1270, 1365, 1367, - 1368, 1271, 1272, 1280, 1273, 1281, 1282, 1369, 1370, 1283, - 1284, 1285, 1290, 1291, 1381, 1292, 1388, 1395, 1293, 1399, - 1312, 1149, 1415, 1313, 1317, 1180, 1324, 1416, 1205, 1354, - 1330, 1331, 1210, 1351, 1419, 1211, 1355, 1337, 1366, 1386, - 1195, 1387, 1417, 1420, 1193, 1260, 1421, 1215, 1437, 1261, - 1438, 1213, 1439, 1440, 1441, 1447, 1192, 1448, 1449, 1183, - 1338, 1450, 1153, 1212, 1452, 1453, 668, 823, 1262, 676, - 1184, 814, 825, 1118, 1142, 1154, 1140, 1200, 1008, 1241, - 1144, 1196, 1230, 1337, 1229, 1373, 718, 1143, 1216, 1374, - 1237, 1194, 689, 1185, 1327, 1199, 1146, 1145, 1214, 709, - 1148, 1155, 1147, 1197, 1150, 715, 1338, 1339, 1375, 1278, - 1217, 1206, 692, 1373, 1228, 1263, 1277, 1374, 1227, 1151, - 701, 1152, 1226, 1332, 1251, 1250, 1207, 1400, 1208, 1156, - 1436, 1179, 1157, 1249, 1380, 1371, 1375, 1427, 1209, 1158, - 1451, 985, 1159, 824, 1160, 1256, 727, 1161, 1353, 730, - 1162, 1442, 1163, 1339, 1164, 1376, 1269, 1165, 1413, 1186, - 1430, 1274, 1166, 0, 1167, 1168, 0, 1169, 1427, 1170, - 1171, 0, 1172, 0, 0, 1173, 0, 1174, 0, 0, - 1175, 0, 1176, 1376, 0, 1177, 0, 1178, 1187, 0, - 1188, 1430, 1189, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1431, 0, 0, + 159, 240, 264, 321, 355, 78, 381, 402, 421, 434, + 382, 403, 373, 314, 969, 970, 892, 1195, 971, 1196, + 1212, 315, 28, 362, 250, 312, 345, 357, 1442, 395, + 417, 775, 435, 806, 807, 808, 831, 310, 340, 356, + 404, 336, 812, 268, 29, 459, 30, 405, 31, 81, + 460, 40, 337, 419, 420, 42, 278, 322, 1443, 1442, + 375, 44, 316, 826, 363, 533, 338, 135, 136, 453, + 534, 251, 313, 346, 358, 339, 396, 418, 375, 436, + 135, 136, 279, 323, 317, 265, 364, 233, 234, 1443, + 1347, 235, 447, 448, 236, 237, 238, 239, 135, 136, + 266, 542, 267, 775, 419, 420, 543, 950, 951, 952, + 280, 324, 294, 757, 758, 759, 760, 454, 374, 556, + 281, 325, 282, 326, 557, 283, 327, 560, 284, 328, + 794, 795, 561, 286, 329, 287, 330, 158, 288, 331, + 46, 1386, 591, 289, 332, 290, 333, 592, 291, 334, + 292, 335, 761, 269, 601, 270, 271, 605, 272, 602, + 273, 274, 606, 275, 48, 533, 276, 135, 136, 1069, + 1023, 277, 1070, 285, 293, 375, 306, 376, 377, 307, + 158, 308, 378, 379, 380, 1271, 605, 1272, 1273, 135, + 136, 1024, 542, 158, 84, 135, 136, 1025, 91, 92, + 93, 94, 95, 96, 1028, 847, 848, 797, 798, 1029, + 832, 158, 1003, 1004, 1005, 1006, 50, 1072, 129, 1051, + 1073, 1348, 1349, 1350, 1052, 913, 914, 915, 916, 158, + 917, 52, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 54, 93, 94, 95, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 56, + 252, 253, 254, 1195, 130, 1196, 1212, 58, 1051, 32, + 33, 34, 35, 1053, 840, 841, 132, 133, 135, 136, + 158, 135, 136, 255, 60, 135, 136, 256, 257, 258, + 137, 138, 139, 1086, 259, 260, 261, 455, 1087, 1091, + 1100, 262, 158, 142, 1092, 1101, 1113, 130, 158, 1114, + 1109, 263, 456, 62, 1415, 1110, 1155, 1416, 1417, 1418, + 1419, 457, 91, 92, 93, 94, 95, 96, 135, 136, + 969, 970, 969, 970, 971, 601, 971, 347, 1439, 1440, + 1111, 987, 988, 989, 1300, 1301, 1302, 348, 349, 350, + 351, 352, 353, 354, 464, 465, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 151, 152, 466, 470, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 471, 1119, 570, 1051, 130, 375, + 1120, 990, 1308, 475, 158, 607, 608, 476, 158, 477, + 132, 133, 375, 397, 376, 377, 398, 399, 400, 135, + 136, 478, 257, 479, 137, 138, 139, 480, 259, 260, + 261, 556, 135, 136, 1312, 262, 1309, 591, 1100, 1313, + 481, 401, 1321, 1330, 1336, 263, 482, 560, 1374, 1337, + 1404, 158, 1339, 1375, 483, 1405, 115, 116, 117, 118, + 119, 120, 121, 484, 123, 124, 125, 126, 936, 937, + 938, 939, 940, 941, 130, 1437, 159, 1459, 1407, 571, + 1438, 1408, 1460, 485, 487, 240, 488, 133, 489, 769, + 770, 771, 772, 490, 319, 135, 136, 491, 495, 264, + 151, 152, 496, 321, 259, 260, 261, 497, 250, 498, + 314, 262, 320, 499, 355, 1322, 1323, 1324, 315, 500, + 501, 505, 312, 511, 381, 512, 345, 513, 382, 519, + 527, 402, 158, 362, 310, 403, 528, 357, 340, 529, + 268, 336, 532, 538, 434, 158, 539, 395, 540, 356, + 541, 550, 337, 278, 417, 251, 559, 322, 572, 316, + 575, 579, 580, 581, 404, 583, 338, 435, 584, 313, + 585, 405, 588, 346, 363, 339, 151, 152, 587, 279, + 593, 317, 265, 323, 358, 595, 597, 598, 604, 609, + 610, 611, 612, 613, 396, 614, 364, 266, 615, 267, + 616, 418, 617, 618, 619, 621, 622, 280, 158, 294, + 623, 324, 135, 136, 436, 620, 624, 281, 625, 282, + 626, 325, 283, 326, 627, 284, 327, 628, 629, 328, + 286, 630, 287, 631, 329, 288, 330, 634, 1340, 331, + 289, 632, 290, 633, 332, 291, 333, 292, 636, 334, + 269, 335, 270, 271, 639, 272, 635, 273, 274, 640, + 275, 637, 641, 276, 638, 642, 643, 644, 277, 647, + 285, 293, 645, 306, 648, 652, 307, 649, 308, 426, + 427, 428, 429, 430, 431, 432, 433, 646, 650, 159, + 653, 240, 654, 651, 655, 656, 836, 846, 847, 848, + 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 657, 658, 250, 861, 862, 863, 864, 865, + 866, 659, 660, 661, 662, 158, 953, 968, 664, 663, + 434, 665, 666, 667, 1007, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 87, 959, + 972, 88, 991, 435, 375, 668, 670, 671, 669, 672, + 673, 251, 674, 89, 675, 676, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 680, 677, 681, + 683, 678, 679, 684, 685, 691, 686, 692, 687, 688, + 689, 693, 694, 695, 696, 698, 960, 973, 697, 992, + 436, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 699, + 700, 701, 129, 130, 702, 704, 705, 707, 708, 709, + 710, 711, 712, 713, 131, 132, 133, 714, 716, 717, + 718, 134, 719, 720, 135, 136, 721, 722, 724, 137, + 138, 139, 140, 141, 725, 726, 727, 728, 863, 864, + 865, 730, 142, 731, 733, 734, 735, 736, 737, 738, + 739, 740, 143, 742, 743, 144, 745, 158, 746, 750, + 747, 748, 145, 146, 749, 751, 752, 147, 148, 753, + 754, 755, 756, 763, 764, 765, 766, 767, 768, 774, + 30, 777, 778, 779, 780, 781, 149, 788, 782, 783, + 150, 784, 785, 786, 789, 135, 136, 787, 790, 791, + 792, 800, 801, 802, 803, 151, 152, 153, 154, 155, + 156, 804, 805, 809, 810, 811, 813, 834, 835, 157, + 814, 815, 816, 817, 893, 818, 819, 897, 901, 905, + 820, 821, 822, 823, 824, 825, 827, 158, 829, 830, + 961, 909, 925, 928, 962, 963, 964, 965, 932, 983, + 1000, 1015, 1034, 1035, 966, 967, 1019, 1036, 1037, 1038, + 1039, 1040, 1041, 1042, 1043, 1045, 1046, 1056, 1121, 1055, + 264, 1058, 1059, 381, 1061, 1062, 402, 382, 1065, 1163, + 403, 314, 1064, 1194, 1219, 1067, 1068, 355, 1224, 315, + 421, 1225, 1075, 312, 1076, 1078, 395, 1079, 1209, 417, + 1080, 1081, 1207, 1229, 953, 310, 362, 1227, 158, 404, + 357, 268, 1082, 968, 1206, 968, 405, 1197, 1083, 1226, + 1167, 1084, 356, 1085, 278, 1274, 1088, 959, 1198, 1275, + 316, 1089, 1007, 1177, 1090, 1096, 972, 321, 972, 1210, + 313, 1098, 1199, 396, 1230, 991, 418, 363, 1276, 1208, + 279, 1200, 317, 265, 1228, 1103, 1104, 358, 1105, 1178, + 345, 1211, 1164, 1107, 1115, 1116, 1231, 1220, 266, 364, + 267, 1117, 340, 1118, 960, 336, 1125, 1165, 280, 1166, + 294, 1126, 1221, 973, 1222, 973, 337, 1179, 281, 1193, + 282, 322, 992, 283, 1223, 1277, 284, 1180, 1128, 1181, + 338, 286, 1182, 287, 1129, 1183, 288, 346, 1130, 339, + 1185, 289, 1186, 290, 1131, 1187, 291, 323, 292, 1133, + 1188, 269, 1189, 270, 271, 1190, 272, 1191, 273, 274, + 1168, 275, 1169, 1170, 276, 1171, 1134, 1172, 1173, 277, + 1174, 285, 293, 1175, 306, 324, 1135, 307, 1176, 308, + 1184, 1192, 1136, 1201, 1137, 325, 1202, 326, 1203, 1138, + 327, 1139, 1140, 328, 1141, 1147, 1150, 1151, 329, 1142, + 330, 1143, 1148, 331, 1152, 1153, 1144, 1145, 332, 1256, + 333, 1146, 1149, 334, 1257, 335, 1258, 1260, 1262, 1267, + 1332, 1269, 1289, 1290, 1329, 1293, 1310, 1245, 1246, 1316, + 1311, 1247, 1248, 1317, 1249, 1250, 1318, 1319, 1320, 1253, + 1252, 1254, 1259, 1328, 1334, 1261, 1268, 1266, 1342, 1343, + 1284, 1285, 1294, 1286, 1360, 1163, 1287, 1364, 1295, 1194, + 1296, 1297, 1219, 1298, 1299, 1304, 1224, 1305, 1366, 1225, + 1306, 1351, 1307, 1326, 1209, 1327, 1331, 1377, 1207, 1274, + 1338, 1229, 1378, 1275, 1344, 1227, 1345, 1365, 1368, 1369, + 1206, 1379, 1380, 1197, 1352, 1381, 1167, 1226, 1382, 1383, + 1384, 1398, 1276, 1400, 1198, 1395, 1401, 1402, 1409, 1177, + 1413, 1429, 1430, 1452, 1433, 1210, 1431, 1351, 1199, 1387, + 1434, 1435, 1230, 1388, 1451, 1208, 1453, 1200, 1455, 1454, + 1463, 1461, 1228, 1462, 1464, 1178, 1466, 1211, 1164, 1467, + 1352, 1353, 1389, 837, 1231, 1220, 828, 1387, 682, 1277, + 1132, 1388, 839, 1165, 690, 1166, 1255, 1022, 1214, 1154, + 1221, 1156, 1222, 1179, 1244, 1193, 1251, 1243, 732, 1158, + 1389, 1441, 1223, 1180, 703, 1181, 723, 1157, 1182, 1213, + 1341, 1183, 729, 1160, 1159, 1292, 1185, 1353, 1186, 1390, + 1162, 1187, 1161, 1291, 1444, 715, 1188, 1346, 1189, 1242, + 706, 1190, 1441, 1191, 1241, 1240, 1168, 1394, 1169, 1170, + 1385, 1171, 1263, 1172, 1173, 1414, 1174, 1390, 1450, 1175, + 93, 94, 95, 96, 1176, 1444, 1184, 1192, 1465, 1201, + 1265, 838, 1202, 1264, 1203, 1456, 1270, 999, 1427, 1367, + 0, 1445, 741, 0, 0, 1283, 0, 0, 0, 0, + 0, 744, 101, 102, 103, 1288, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1445, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 129, 130, 375, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 136, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1215, 1216, 1217, + 1218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1431 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 158 }; const short Dhcp4Parser::yycheck_[] = { 67, 68, 69, 70, 71, 64, 73, 74, 75, 76, - 73, 74, 72, 69, 770, 770, 740, 1052, 770, 1052, - 1052, 69, 1414, 71, 68, 69, 70, 71, 1414, 73, - 74, 645, 76, 684, 685, 686, 18, 69, 70, 71, - 74, 70, 693, 69, 5, 97, 7, 74, 9, 3, - 146, 147, 70, 1445, 8, 3, 69, 0, 3, 1445, - 8, 6, 69, 714, 71, 117, 118, 194, 195, 196, - 197, 68, 69, 70, 71, 70, 73, 74, 97, 76, - 12, 13, 69, 230, 69, 69, 71, 15, 16, 3, - 7, 19, 6, 95, 22, 23, 24, 25, 117, 118, - 69, 3, 69, 717, 6, 10, 233, 60, 61, 62, - 69, 6, 69, 69, 3, 213, 214, 215, 216, 8, - 69, 3, 3, 69, 3, 69, 8, 8, 69, 8, - 7, 69, 230, 69, 230, 69, 7, 3, 69, 3, - 7, 70, 8, 69, 8, 69, 69, 7, 69, 7, - 69, 69, 204, 69, 206, 207, 69, 3, 69, 178, - 7, 69, 8, 69, 117, 118, 69, 3, 69, 69, - 3, 69, 8, 69, 3, 8, 7, 11, 230, 8, - 14, 205, 7, 3, 208, 209, 210, 211, 8, 117, - 118, 3, 26, 3, 6, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 7, 3, 7, 162, - 192, 230, 8, 166, 167, 168, 169, 3, 7, 40, - 3, 3, 8, 176, 177, 8, 8, 41, 42, 4, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 3, 3, - 8, 95, 96, 1298, 8, 1298, 1298, 17, 18, 230, - 231, 232, 233, 107, 108, 109, 3, 230, 40, 8, - 114, 8, 3, 117, 118, 146, 147, 8, 122, 123, - 124, 125, 126, 3, 3, 3, 117, 118, 8, 8, - 8, 135, 230, 117, 118, 20, 21, 32, 33, 34, - 35, 145, 4, 4, 148, 3, 1040, 117, 118, 3, - 8, 155, 156, 3, 8, 4, 160, 161, 8, 4, - 1086, 1086, 1088, 1088, 1086, 97, 1088, 99, 100, 64, - 65, 66, 104, 105, 106, 179, 4, 117, 118, 183, - 171, 172, 173, 27, 28, 117, 118, 157, 158, 159, - 174, 175, 230, 4, 198, 199, 200, 201, 202, 203, - 95, 96, 97, 4, 137, 138, 139, 140, 212, 142, - 4, 440, 441, 4, 30, 31, 32, 33, 34, 35, - 3, 3, 117, 118, 4, 8, 230, 149, 150, 151, - 152, 153, 154, 3, 129, 130, 131, 132, 8, 230, - 180, 181, 182, 55, 56, 57, 230, 4, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 4, 4, - 230, 4, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 4, 4, 3, 3, - 96, 97, 519, 8, 8, 110, 111, 112, 113, 3, - 230, 528, 108, 109, 8, 163, 164, 165, 230, 4, - 4, 117, 118, 4, 120, 542, 122, 123, 124, 546, - 126, 127, 128, 4, 528, 4, 542, 133, 4, 4, - 557, 4, 4, 4, 542, 4, 4, 143, 542, 4, - 567, 4, 546, 4, 567, 230, 4, 574, 4, 557, - 542, 574, 4, 557, 546, 4, 542, 546, 4, 4, - 587, 4, 4, 567, 4, 557, 4, 4, 546, 542, - 574, 528, 4, 8, 4, 542, 4, 8, 3, 8, - 574, 4, 4, 587, 4, 542, 3, 574, 4, 546, - 557, 546, 198, 199, 4, 542, 4, 542, 542, 4, - 557, 4, 233, 4, 4, 4, 4, 233, 233, 4, - 567, 4, 557, 542, 4, 542, 233, 574, 231, 4, - 4, 4, 231, 542, 230, 542, 542, 231, 231, 4, - 587, 231, 231, 542, 231, 233, 542, 232, 542, 232, - 232, 542, 231, 231, 542, 231, 542, 4, 542, 4, - 233, 542, 4, 32, 33, 34, 542, 546, 542, 542, - 4, 542, 233, 542, 542, 233, 542, 233, 1279, 542, - 233, 542, 96, 232, 542, 231, 542, 231, 231, 542, - 4, 542, 542, 233, 542, 4, 542, 231, 4, 4, - 4, 4, 116, 117, 118, 97, 98, 99, 100, 101, - 102, 103, 126, 127, 128, 732, 4, 734, 233, 133, - 134, 233, 731, 233, 4, 117, 118, 96, 4, 4, - 4, 4, 231, 4, 126, 4, 4, 4, 4, 4, - 734, 117, 118, 4, 233, 233, 233, 4, 117, 118, - 4, 4, 769, 770, 4, 4, 773, 126, 233, 233, - 777, 231, 4, 231, 4, 4, 4, 136, 137, 138, - 139, 140, 141, 142, 4, 769, 770, 4, 772, 773, - 4, 231, 4, 4, 4, 4, 4, 734, 231, 4, - 4, 4, 4, 30, 31, 32, 33, 34, 35, 4, - 4, 4, 4, 4, 4, 231, 4, 4, 184, 185, - 186, 187, 188, 189, 190, 191, 230, 4, 4, 4, - 4, 4, 769, 770, 233, 772, 773, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 233, 230, 233, - 4, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 230, 92, 93, 94, 4, 96, - 4, 230, 233, 233, 231, 231, 4, 231, 4, 231, - 4, 108, 109, 230, 230, 7, 7, 7, 115, 7, - 117, 118, 119, 120, 121, 122, 123, 124, 7, 126, - 127, 128, 230, 7, 5, 230, 133, 230, 135, 230, - 5, 5, 5, 230, 5, 7, 143, 40, 41, 42, + 73, 74, 72, 69, 784, 784, 754, 1066, 784, 1066, + 1066, 69, 0, 71, 68, 69, 70, 71, 1428, 73, + 74, 659, 76, 698, 699, 700, 18, 69, 70, 71, + 74, 70, 707, 69, 5, 3, 7, 74, 9, 230, + 8, 7, 70, 146, 147, 7, 69, 70, 1428, 1459, + 97, 7, 69, 728, 71, 3, 70, 117, 118, 6, + 8, 68, 69, 70, 71, 70, 73, 74, 97, 76, + 117, 118, 69, 70, 69, 69, 71, 15, 16, 1459, + 40, 19, 12, 13, 22, 23, 24, 25, 117, 118, + 69, 3, 69, 731, 146, 147, 8, 157, 158, 159, + 69, 70, 69, 194, 195, 196, 197, 3, 40, 3, + 69, 70, 69, 70, 8, 69, 70, 3, 69, 70, + 17, 18, 8, 69, 70, 69, 70, 230, 69, 70, + 7, 178, 3, 69, 70, 69, 70, 8, 69, 70, + 69, 70, 233, 69, 3, 69, 69, 3, 69, 8, + 69, 69, 8, 69, 7, 3, 69, 117, 118, 3, + 8, 69, 6, 69, 69, 97, 69, 99, 100, 69, + 230, 69, 104, 105, 106, 204, 3, 206, 207, 117, + 118, 8, 3, 230, 10, 117, 118, 8, 30, 31, + 32, 33, 34, 35, 3, 41, 42, 20, 21, 8, + 192, 230, 213, 214, 215, 216, 7, 3, 95, 3, + 6, 171, 172, 173, 8, 137, 138, 139, 140, 230, + 142, 7, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 7, 32, 33, 34, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 7, + 92, 93, 94, 1312, 96, 1312, 1312, 7, 3, 230, + 231, 232, 233, 8, 27, 28, 108, 109, 117, 118, + 230, 117, 118, 115, 7, 117, 118, 119, 120, 121, + 122, 123, 124, 3, 126, 127, 128, 4, 8, 3, + 3, 133, 230, 135, 8, 8, 3, 96, 230, 6, + 3, 143, 8, 7, 205, 8, 1054, 208, 209, 210, + 211, 3, 30, 31, 32, 33, 34, 35, 117, 118, + 1100, 1100, 1102, 1102, 1100, 3, 1102, 126, 174, 175, + 8, 180, 181, 182, 55, 56, 57, 136, 137, 138, + 139, 140, 141, 142, 4, 4, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 198, 199, 4, 4, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 4, 3, 8, 3, 96, 97, + 8, 230, 8, 4, 230, 454, 455, 4, 230, 4, + 108, 109, 97, 98, 99, 100, 101, 102, 103, 117, + 118, 4, 120, 4, 122, 123, 124, 4, 126, 127, + 128, 3, 117, 118, 3, 133, 8, 3, 3, 8, + 4, 126, 8, 8, 3, 143, 4, 3, 3, 8, + 3, 230, 8, 8, 4, 8, 78, 79, 80, 81, + 82, 83, 84, 4, 86, 87, 88, 89, 149, 150, + 151, 152, 153, 154, 96, 3, 533, 3, 3, 3, + 8, 6, 8, 4, 4, 542, 4, 109, 4, 110, + 111, 112, 113, 4, 116, 117, 118, 4, 4, 556, + 198, 199, 4, 560, 126, 127, 128, 4, 542, 4, + 556, 133, 134, 4, 571, 163, 164, 165, 556, 4, + 4, 4, 556, 4, 581, 4, 560, 4, 581, 4, + 4, 588, 230, 571, 556, 588, 4, 571, 560, 4, + 556, 560, 4, 4, 601, 230, 4, 581, 4, 571, + 4, 4, 560, 556, 588, 542, 4, 560, 8, 556, + 4, 4, 8, 3, 588, 4, 560, 601, 4, 556, + 4, 588, 3, 560, 571, 560, 198, 199, 8, 556, + 4, 556, 556, 560, 571, 4, 4, 4, 4, 230, + 4, 4, 4, 4, 581, 233, 571, 556, 233, 556, + 233, 588, 4, 4, 4, 233, 4, 556, 230, 556, + 4, 560, 117, 118, 601, 231, 4, 556, 231, 556, + 231, 560, 556, 560, 231, 556, 560, 231, 231, 560, + 556, 233, 556, 232, 560, 556, 560, 231, 1293, 560, + 556, 232, 556, 232, 560, 556, 560, 556, 4, 560, + 556, 560, 556, 556, 233, 556, 231, 556, 556, 233, + 556, 231, 233, 556, 231, 4, 4, 4, 556, 232, + 556, 556, 233, 556, 231, 4, 556, 231, 556, 184, + 185, 186, 187, 188, 189, 190, 191, 233, 231, 746, + 4, 748, 4, 233, 231, 4, 745, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 230, 5, 5, 58, 59, 60, 61, 62, - 63, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 5, 5, 230, 230, 7, 7, - 7, 5, 7, 5, 7, 5, 7, 5, 230, 5, - 230, 198, 199, 7, 97, 193, 230, 230, 230, 7, - 230, 230, 230, 7, 230, 230, 7, 7, 230, 230, - 7, 7, 230, 230, 230, 230, 230, 230, 7, 230, - 7, 7, 7, 230, 230, 230, 230, 230, 7, 144, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 3, 230, 6, 3, 6, 6, 3, 6, - 3, 3, 6, 3, 231, 6, 1043, 6, 3, 1046, - 4, 4, 1049, 1046, 4, 1052, 1049, 1043, 4, 1052, - 1057, 4, 4, 1060, 1057, 1043, 1063, 1057, 4, 1043, - 4, 4, 1046, 4, 1052, 1049, 4, 6, 1052, 1057, - 1077, 1043, 1060, 1057, 3, 1049, 1060, 1043, 4, 1086, - 1052, 1088, 1049, 1052, 4, 1057, 1052, 4, 1060, 4, - 1043, 1098, 4, 1077, 1052, 1098, 1043, 4, 1105, 1052, - 6, 3, 1086, 1110, 1088, 1052, 1043, 230, 8, 1046, - 1057, 1095, 1049, 1060, 1098, 1052, 1043, 1052, 1043, 1043, - 1057, 6, 4, 1060, 4, 1052, 1110, 1052, 1052, 4, - 4, 4, 1057, 1057, 1043, 1060, 1043, 4, 1110, 4, - 1077, 1110, 231, 1052, 1043, 1052, 1043, 1043, 1057, 1086, - 1057, 1088, 1110, 1052, 1043, 1052, 1052, 1043, 1095, 1043, - 1057, 1098, 1043, 1052, 233, 1043, 1052, 1043, 1052, 1043, - 233, 1052, 1043, 1110, 1052, 1110, 1052, 1043, 1052, 1043, - 1043, 1052, 1043, 1052, 1043, 1043, 1052, 1043, 1052, 1052, - 1043, 1052, 1043, 1052, 1052, 1043, 1052, 1043, 231, 1052, - 1043, 1052, 1043, 1043, 1052, 1043, 1052, 1043, 231, 1052, - 4, 1052, 1052, 231, 1052, 4, 1052, 231, 231, 231, - 4, 231, 233, 4, 4, 233, 4, 231, 231, 231, - 231, 231, 4, 231, 231, 231, 231, 4, 4, 4, - 4, 1110, 3, 6, 4, 170, 8, 4, 4, 8, - 8, 3, 6, 8, 7, 5, 1255, 233, 4, 4, - 4, 4, 4, 3, 231, 233, 7, 233, 5, 4, - 4, 233, 233, 230, 233, 230, 230, 4, 4, 230, - 230, 230, 230, 230, 7, 230, 5, 7, 230, 4, - 230, 1298, 6, 230, 230, 1298, 230, 3, 1305, 230, - 233, 233, 1305, 231, 4, 1305, 230, 1314, 230, 230, - 1298, 230, 230, 4, 1298, 1322, 4, 1305, 4, 1322, - 233, 1305, 231, 231, 4, 230, 1298, 230, 4, 1298, - 1314, 4, 1298, 1305, 230, 230, 519, 732, 1322, 528, - 1298, 717, 734, 1014, 1042, 1298, 1037, 1055, 821, 1077, - 1045, 1298, 1065, 1360, 1063, 1362, 577, 1043, 1305, 1362, - 1072, 1298, 542, 1298, 1298, 1054, 1048, 1046, 1305, 567, - 1051, 1298, 1049, 1298, 1298, 574, 1360, 1314, 1362, 1112, - 1305, 1305, 546, 1390, 1062, 1322, 1110, 1390, 1060, 1298, - 557, 1298, 1058, 1305, 1090, 1088, 1305, 1390, 1305, 1298, - 1416, 1298, 1298, 1086, 1364, 1360, 1390, 1414, 1305, 1298, - 1445, 773, 1298, 733, 1298, 1095, 587, 1298, 1322, 591, - 1298, 1423, 1298, 1360, 1298, 1362, 1099, 1298, 1393, 1298, - 1414, 1105, 1298, -1, 1298, 1298, -1, 1298, 1445, 1298, - 1298, -1, 1298, -1, -1, 1298, -1, 1298, -1, -1, - 1298, -1, 1298, 1390, -1, 1298, -1, 1298, 1298, -1, - 1298, 1445, 1298, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1414, -1, -1, + 53, 54, 4, 4, 748, 58, 59, 60, 61, 62, + 63, 4, 4, 233, 233, 230, 783, 784, 4, 233, + 787, 4, 4, 4, 791, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 11, 783, + 784, 14, 786, 787, 97, 4, 4, 4, 231, 4, + 4, 748, 4, 26, 4, 4, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 4, 233, 4, + 4, 233, 233, 4, 4, 4, 233, 4, 233, 231, + 231, 4, 4, 4, 4, 4, 783, 784, 231, 786, + 787, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 4, + 4, 4, 95, 96, 4, 4, 231, 4, 4, 4, + 4, 4, 4, 4, 107, 108, 109, 4, 4, 4, + 231, 114, 4, 4, 117, 118, 4, 233, 4, 122, + 123, 124, 125, 126, 233, 233, 233, 4, 60, 61, + 62, 4, 135, 4, 233, 4, 231, 4, 231, 231, + 4, 4, 145, 4, 231, 148, 4, 230, 7, 230, + 7, 7, 155, 156, 7, 230, 230, 160, 161, 7, + 7, 5, 230, 230, 230, 5, 5, 5, 230, 5, + 7, 230, 5, 5, 5, 5, 179, 230, 7, 7, + 183, 7, 5, 7, 230, 117, 118, 7, 5, 7, + 5, 230, 230, 230, 5, 198, 199, 200, 201, 202, + 203, 230, 230, 230, 7, 230, 230, 193, 5, 212, + 230, 230, 230, 230, 7, 230, 230, 7, 7, 7, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 162, 7, 7, 7, 166, 167, 168, 169, 7, 7, + 7, 7, 4, 4, 176, 177, 144, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 3, 230, 6, + 1057, 6, 3, 1060, 6, 3, 1063, 1060, 3, 1066, + 1063, 1057, 6, 1066, 1071, 6, 3, 1074, 1071, 1057, + 1077, 1071, 6, 1057, 3, 6, 1060, 3, 1066, 1063, + 4, 4, 1066, 1071, 1091, 1057, 1074, 1071, 230, 1063, + 1074, 1057, 4, 1100, 1066, 1102, 1063, 1066, 4, 1071, + 1066, 4, 1074, 4, 1057, 1112, 4, 1091, 1066, 1112, + 1057, 4, 1119, 1066, 4, 4, 1100, 1124, 1102, 1066, + 1057, 4, 1066, 1060, 1071, 1109, 1063, 1074, 1112, 1066, + 1057, 1066, 1057, 1057, 1071, 6, 3, 1074, 4, 1066, + 1124, 1066, 1066, 4, 4, 4, 1071, 1071, 1057, 1074, + 1057, 4, 1124, 4, 1091, 1124, 6, 1066, 1057, 1066, + 1057, 3, 1071, 1100, 1071, 1102, 1124, 1066, 1057, 1066, + 1057, 1124, 1109, 1057, 1071, 1112, 1057, 1066, 8, 1066, + 1124, 1057, 1066, 1057, 6, 1066, 1057, 1124, 4, 1124, + 1066, 1057, 1066, 1057, 4, 1066, 1057, 1124, 1057, 4, + 1066, 1057, 1066, 1057, 1057, 1066, 1057, 1066, 1057, 1057, + 1066, 1057, 1066, 1066, 1057, 1066, 4, 1066, 1066, 1057, + 1066, 1057, 1057, 1066, 1057, 1124, 4, 1057, 1066, 1057, + 1066, 1066, 4, 1066, 231, 1124, 1066, 1124, 1066, 233, + 1124, 231, 233, 1124, 231, 4, 4, 4, 1124, 231, + 1124, 231, 233, 1124, 4, 4, 231, 231, 1124, 4, + 1124, 231, 231, 1124, 4, 1124, 4, 4, 4, 4, + 1269, 4, 6, 3, 5, 4, 8, 231, 231, 4, + 8, 231, 231, 4, 231, 231, 8, 3, 8, 231, + 233, 231, 231, 7, 4, 233, 231, 233, 4, 4, + 233, 233, 230, 233, 7, 1312, 233, 4, 230, 1312, + 230, 230, 1319, 230, 230, 230, 1319, 230, 4, 1319, + 230, 1328, 230, 230, 1312, 230, 230, 6, 1312, 1336, + 230, 1319, 3, 1336, 233, 1319, 233, 231, 230, 230, + 1312, 5, 230, 1312, 1328, 4, 1312, 1319, 4, 4, + 4, 170, 1336, 230, 1312, 7, 230, 5, 7, 1312, + 4, 6, 3, 233, 4, 1312, 230, 1374, 1312, 1376, + 4, 4, 1319, 1376, 4, 1312, 231, 1312, 4, 231, + 4, 230, 1319, 230, 4, 1312, 230, 1312, 1312, 230, + 1374, 1328, 1376, 746, 1319, 1319, 731, 1404, 533, 1336, + 1028, 1404, 748, 1312, 542, 1312, 1091, 835, 1069, 1051, + 1319, 1056, 1319, 1312, 1079, 1312, 1086, 1077, 591, 1059, + 1404, 1428, 1319, 1312, 556, 1312, 581, 1057, 1312, 1068, + 1312, 1312, 588, 1062, 1060, 1126, 1312, 1374, 1312, 1376, + 1065, 1312, 1063, 1124, 1428, 571, 1312, 1319, 1312, 1076, + 560, 1312, 1459, 1312, 1074, 1072, 1312, 1378, 1312, 1312, + 1374, 1312, 1100, 1312, 1312, 1404, 1312, 1404, 1430, 1312, + 32, 33, 34, 35, 1312, 1459, 1312, 1312, 1459, 1312, + 1104, 747, 1312, 1102, 1312, 1437, 1109, 787, 1407, 1336, + -1, 1428, 601, -1, -1, 1113, -1, -1, -1, -1, + -1, 605, 64, 65, 66, 1119, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1459, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 95, 96, 97, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 129, 130, 131, + 132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1445 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 230 }; const short @@ -6205,120 +6239,121 @@ namespace isc { namespace dhcp { 311, 312, 314, 316, 322, 443, 444, 445, 447, 449, 451, 453, 455, 457, 459, 461, 463, 464, 465, 466, 501, 522, 535, 537, 539, 550, 552, 554, 572, 116, - 134, 264, 455, 457, 459, 461, 501, 530, 531, 532, - 534, 535, 537, 126, 136, 137, 138, 139, 140, 141, - 142, 264, 501, 535, 537, 547, 548, 549, 550, 552, - 554, 556, 558, 560, 562, 564, 566, 568, 570, 475, - 40, 97, 99, 100, 104, 105, 106, 264, 371, 485, - 486, 487, 488, 489, 490, 491, 493, 495, 497, 498, - 500, 535, 537, 98, 101, 102, 103, 126, 264, 371, - 489, 495, 509, 510, 511, 512, 513, 515, 516, 517, - 518, 519, 520, 535, 537, 146, 147, 264, 419, 420, - 421, 423, 184, 185, 186, 187, 188, 189, 190, 191, - 264, 535, 537, 659, 660, 661, 662, 664, 665, 667, - 668, 669, 672, 12, 13, 678, 679, 680, 682, 6, - 3, 4, 8, 3, 268, 3, 8, 675, 325, 345, - 4, 4, 4, 551, 553, 555, 4, 4, 343, 353, - 355, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 286, 4, 4, 4, 4, 4, 297, 300, - 302, 4, 4, 4, 4, 4, 4, 4, 436, 476, - 502, 4, 289, 306, 468, 536, 538, 4, 4, 4, - 396, 578, 540, 412, 426, 4, 405, 594, 596, 646, - 656, 313, 315, 4, 4, 4, 684, 708, 4, 3, - 8, 331, 333, 336, 4, 4, 4, 4, 3, 8, - 448, 450, 452, 523, 446, 454, 4, 458, 460, 462, - 456, 573, 3, 8, 533, 4, 3, 8, 571, 557, - 559, 561, 565, 563, 569, 567, 8, 3, 8, 492, - 372, 4, 496, 494, 499, 4, 8, 3, 514, 4, - 4, 4, 521, 8, 3, 422, 424, 3, 8, 4, - 663, 4, 666, 4, 4, 670, 673, 3, 8, 681, - 4, 3, 8, 249, 249, 230, 4, 4, 4, 4, - 233, 233, 233, 4, 4, 4, 231, 233, 4, 4, - 4, 231, 231, 231, 231, 231, 233, 232, 232, 232, - 231, 231, 4, 231, 231, 233, 233, 233, 4, 4, - 4, 233, 233, 232, 231, 231, 231, 233, 4, 4, - 4, 231, 4, 4, 4, 4, 4, 233, 233, 233, - 4, 4, 4, 4, 4, 231, 4, 4, 4, 4, - 4, 4, 4, 233, 233, 233, 4, 4, 273, 4, - 4, 4, 233, 233, 231, 231, 327, 4, 4, 4, - 4, 4, 4, 231, 4, 4, 4, 4, 4, 444, - 4, 231, 531, 4, 4, 4, 4, 4, 4, 4, - 4, 549, 4, 4, 231, 4, 4, 4, 233, 487, - 4, 233, 233, 233, 4, 511, 4, 4, 420, 233, - 4, 231, 4, 231, 231, 4, 4, 660, 4, 231, - 679, 4, 7, 7, 7, 7, 230, 230, 230, 7, - 7, 5, 230, 194, 195, 196, 197, 233, 298, 230, - 230, 5, 5, 5, 230, 110, 111, 112, 113, 307, - 5, 251, 253, 230, 5, 5, 5, 5, 7, 7, - 7, 5, 7, 7, 230, 230, 5, 7, 5, 260, - 17, 18, 334, 20, 21, 337, 230, 230, 230, 5, - 230, 230, 260, 260, 260, 230, 7, 230, 260, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 260, 230, 253, 230, 230, 18, 192, 671, - 193, 5, 249, 272, 678, 326, 27, 28, 346, 347, - 348, 350, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 58, 59, 60, - 61, 62, 63, 264, 360, 361, 362, 364, 366, 368, - 370, 371, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 385, 386, 387, 389, 391, 393, 360, 7, - 356, 357, 358, 7, 437, 438, 439, 7, 479, 480, - 481, 7, 503, 504, 505, 7, 469, 470, 471, 137, - 138, 139, 140, 142, 397, 398, 399, 400, 401, 402, - 403, 7, 579, 580, 7, 541, 542, 543, 7, 413, - 414, 415, 149, 150, 151, 152, 153, 154, 427, 428, - 429, 430, 431, 432, 433, 434, 157, 158, 159, 264, - 406, 407, 408, 409, 410, 535, 537, 162, 166, 167, - 168, 169, 176, 177, 264, 387, 389, 391, 535, 537, - 601, 602, 603, 606, 608, 610, 611, 612, 622, 7, - 597, 598, 599, 180, 181, 182, 230, 535, 537, 647, - 648, 649, 650, 652, 653, 659, 7, 685, 686, 213, - 214, 215, 216, 264, 709, 710, 711, 712, 713, 714, - 261, 7, 524, 525, 526, 144, 574, 575, 356, 8, - 8, 8, 349, 351, 3, 8, 363, 365, 367, 369, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 383, 4, 4, 388, 390, 392, 394, 3, 8, 8, - 359, 6, 3, 440, 6, 3, 482, 6, 3, 506, - 6, 3, 472, 6, 3, 3, 6, 581, 3, 6, - 544, 6, 3, 416, 6, 3, 4, 4, 4, 4, - 4, 4, 3, 8, 4, 4, 4, 3, 8, 604, - 607, 609, 4, 623, 4, 613, 3, 8, 600, 6, - 3, 4, 651, 4, 654, 3, 8, 8, 687, 3, - 6, 4, 4, 4, 4, 3, 8, 230, 262, 263, - 527, 6, 3, 576, 8, 6, 4, 4, 347, 4, - 4, 4, 4, 231, 233, 231, 233, 231, 231, 231, - 231, 231, 231, 4, 233, 231, 4, 4, 4, 4, - 361, 360, 358, 443, 439, 485, 481, 509, 505, 264, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 288, 291, 292, 293, 294, 295, 296, 299, 301, 303, - 304, 305, 308, 309, 310, 311, 312, 314, 316, 322, - 371, 435, 453, 455, 457, 459, 461, 463, 464, 465, - 473, 474, 501, 535, 537, 550, 552, 554, 572, 471, - 398, 129, 130, 131, 132, 264, 274, 275, 276, 322, - 371, 475, 501, 535, 537, 550, 552, 554, 582, 583, - 584, 585, 586, 588, 590, 591, 580, 547, 543, 419, - 415, 231, 231, 231, 231, 231, 231, 428, 233, 231, - 231, 407, 4, 4, 4, 231, 4, 233, 4, 602, - 601, 599, 233, 4, 231, 4, 648, 204, 206, 207, - 264, 371, 535, 537, 688, 689, 690, 691, 693, 686, - 233, 233, 233, 233, 710, 6, 3, 530, 526, 4, - 230, 230, 230, 230, 230, 230, 55, 56, 57, 384, - 230, 230, 230, 230, 8, 8, 8, 8, 3, 8, - 587, 589, 4, 4, 8, 3, 8, 8, 163, 164, - 165, 605, 230, 230, 7, 5, 8, 230, 249, 694, - 4, 692, 3, 8, 230, 8, 260, 474, 4, 4, - 233, 233, 584, 40, 171, 172, 173, 264, 535, 537, - 624, 625, 626, 629, 631, 633, 7, 614, 615, 616, - 4, 231, 4, 689, 230, 230, 627, 630, 632, 634, - 3, 8, 617, 6, 3, 5, 230, 4, 4, 4, - 4, 625, 178, 264, 371, 535, 537, 618, 619, 620, - 616, 7, 695, 696, 170, 628, 230, 230, 5, 621, - 3, 8, 697, 3, 6, 7, 635, 636, 637, 4, - 619, 205, 208, 209, 210, 211, 698, 699, 700, 702, - 703, 704, 705, 696, 638, 6, 3, 230, 701, 4, - 4, 4, 706, 3, 8, 174, 175, 264, 364, 366, - 535, 537, 639, 640, 641, 643, 637, 4, 233, 231, - 231, 4, 699, 642, 644, 3, 8, 230, 230, 4, - 4, 640, 230, 230 + 134, 264, 293, 294, 295, 296, 299, 301, 303, 305, + 308, 309, 310, 311, 312, 314, 455, 457, 459, 461, + 501, 530, 531, 532, 534, 535, 537, 126, 136, 137, + 138, 139, 140, 141, 142, 264, 501, 535, 537, 547, + 548, 549, 550, 552, 554, 556, 558, 560, 562, 564, + 566, 568, 570, 475, 40, 97, 99, 100, 104, 105, + 106, 264, 371, 485, 486, 487, 488, 489, 490, 491, + 493, 495, 497, 498, 500, 535, 537, 98, 101, 102, + 103, 126, 264, 371, 489, 495, 509, 510, 511, 512, + 513, 515, 516, 517, 518, 519, 520, 535, 537, 146, + 147, 264, 419, 420, 421, 423, 184, 185, 186, 187, + 188, 189, 190, 191, 264, 535, 537, 659, 660, 661, + 662, 664, 665, 667, 668, 669, 672, 12, 13, 678, + 679, 680, 682, 6, 3, 4, 8, 3, 268, 3, + 8, 675, 325, 345, 4, 4, 4, 551, 553, 555, + 4, 4, 343, 353, 355, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 286, 4, 4, 4, + 4, 4, 297, 300, 302, 4, 4, 4, 4, 4, + 4, 4, 436, 476, 502, 4, 289, 306, 468, 536, + 538, 4, 4, 4, 396, 578, 540, 412, 426, 4, + 405, 594, 596, 646, 656, 313, 315, 4, 4, 4, + 684, 708, 4, 3, 8, 331, 333, 336, 4, 4, + 4, 4, 3, 8, 448, 450, 452, 523, 446, 454, + 4, 458, 460, 462, 456, 573, 3, 8, 533, 4, + 3, 8, 571, 557, 559, 561, 565, 563, 569, 567, + 8, 3, 8, 492, 372, 4, 496, 494, 499, 4, + 8, 3, 514, 4, 4, 4, 521, 8, 3, 422, + 424, 3, 8, 4, 663, 4, 666, 4, 4, 670, + 673, 3, 8, 681, 4, 3, 8, 249, 249, 230, + 4, 4, 4, 4, 233, 233, 233, 4, 4, 4, + 231, 233, 4, 4, 4, 231, 231, 231, 231, 231, + 233, 232, 232, 232, 231, 231, 4, 231, 231, 233, + 233, 233, 4, 4, 4, 233, 233, 232, 231, 231, + 231, 233, 4, 4, 4, 231, 4, 4, 4, 4, + 4, 233, 233, 233, 4, 4, 4, 4, 4, 231, + 4, 4, 4, 4, 4, 4, 4, 233, 233, 233, + 4, 4, 273, 4, 4, 4, 233, 233, 231, 231, + 327, 4, 4, 4, 4, 4, 4, 231, 4, 4, + 4, 4, 4, 444, 4, 231, 531, 4, 4, 4, + 4, 4, 4, 4, 4, 549, 4, 4, 231, 4, + 4, 4, 233, 487, 4, 233, 233, 233, 4, 511, + 4, 4, 420, 233, 4, 231, 4, 231, 231, 4, + 4, 660, 4, 231, 679, 4, 7, 7, 7, 7, + 230, 230, 230, 7, 7, 5, 230, 194, 195, 196, + 197, 233, 298, 230, 230, 5, 5, 5, 230, 110, + 111, 112, 113, 307, 5, 251, 253, 230, 5, 5, + 5, 5, 7, 7, 7, 5, 7, 7, 230, 230, + 5, 7, 5, 260, 17, 18, 334, 20, 21, 337, + 230, 230, 230, 5, 230, 230, 260, 260, 260, 230, + 7, 230, 260, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 260, 230, 253, 230, + 230, 18, 192, 671, 193, 5, 249, 272, 678, 326, + 27, 28, 346, 347, 348, 350, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 58, 59, 60, 61, 62, 63, 264, 360, 361, + 362, 364, 366, 368, 370, 371, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 385, 386, 387, 389, + 391, 393, 360, 7, 356, 357, 358, 7, 437, 438, + 439, 7, 479, 480, 481, 7, 503, 504, 505, 7, + 469, 470, 471, 137, 138, 139, 140, 142, 397, 398, + 399, 400, 401, 402, 403, 7, 579, 580, 7, 541, + 542, 543, 7, 413, 414, 415, 149, 150, 151, 152, + 153, 154, 427, 428, 429, 430, 431, 432, 433, 434, + 157, 158, 159, 264, 406, 407, 408, 409, 410, 535, + 537, 162, 166, 167, 168, 169, 176, 177, 264, 387, + 389, 391, 535, 537, 601, 602, 603, 606, 608, 610, + 611, 612, 622, 7, 597, 598, 599, 180, 181, 182, + 230, 535, 537, 647, 648, 649, 650, 652, 653, 659, + 7, 685, 686, 213, 214, 215, 216, 264, 709, 710, + 711, 712, 713, 714, 261, 7, 524, 525, 526, 144, + 574, 575, 356, 8, 8, 8, 349, 351, 3, 8, + 363, 365, 367, 369, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 383, 4, 4, 388, 390, 392, + 394, 3, 8, 8, 359, 6, 3, 440, 6, 3, + 482, 6, 3, 506, 6, 3, 472, 6, 3, 3, + 6, 581, 3, 6, 544, 6, 3, 416, 6, 3, + 4, 4, 4, 4, 4, 4, 3, 8, 4, 4, + 4, 3, 8, 604, 607, 609, 4, 623, 4, 613, + 3, 8, 600, 6, 3, 4, 651, 4, 654, 3, + 8, 8, 687, 3, 6, 4, 4, 4, 4, 3, + 8, 230, 262, 263, 527, 6, 3, 576, 8, 6, + 4, 4, 347, 4, 4, 4, 4, 231, 233, 231, + 233, 231, 231, 231, 231, 231, 231, 4, 233, 231, + 4, 4, 4, 4, 361, 360, 358, 443, 439, 485, + 481, 509, 505, 264, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 288, 291, 292, 293, 294, 295, + 296, 299, 301, 303, 304, 305, 308, 309, 310, 311, + 312, 314, 316, 322, 371, 435, 453, 455, 457, 459, + 461, 463, 464, 465, 473, 474, 501, 535, 537, 550, + 552, 554, 572, 471, 398, 129, 130, 131, 132, 264, + 274, 275, 276, 322, 371, 475, 501, 535, 537, 550, + 552, 554, 582, 583, 584, 585, 586, 588, 590, 591, + 580, 547, 543, 419, 415, 231, 231, 231, 231, 231, + 231, 428, 233, 231, 231, 407, 4, 4, 4, 231, + 4, 233, 4, 602, 601, 599, 233, 4, 231, 4, + 648, 204, 206, 207, 264, 371, 535, 537, 688, 689, + 690, 691, 693, 686, 233, 233, 233, 233, 710, 6, + 3, 530, 526, 4, 230, 230, 230, 230, 230, 230, + 55, 56, 57, 384, 230, 230, 230, 230, 8, 8, + 8, 8, 3, 8, 587, 589, 4, 4, 8, 3, + 8, 8, 163, 164, 165, 605, 230, 230, 7, 5, + 8, 230, 249, 694, 4, 692, 3, 8, 230, 8, + 260, 474, 4, 4, 233, 233, 584, 40, 171, 172, + 173, 264, 535, 537, 624, 625, 626, 629, 631, 633, + 7, 614, 615, 616, 4, 231, 4, 689, 230, 230, + 627, 630, 632, 634, 3, 8, 617, 6, 3, 5, + 230, 4, 4, 4, 4, 625, 178, 264, 371, 535, + 537, 618, 619, 620, 616, 7, 695, 696, 170, 628, + 230, 230, 5, 621, 3, 8, 697, 3, 6, 7, + 635, 636, 637, 4, 619, 205, 208, 209, 210, 211, + 698, 699, 700, 702, 703, 704, 705, 696, 638, 6, + 3, 230, 701, 4, 4, 4, 706, 3, 8, 174, + 175, 264, 364, 366, 535, 537, 639, 640, 641, 643, + 637, 4, 233, 231, 231, 4, 699, 642, 644, 3, + 8, 230, 230, 4, 4, 640, 230, 230 }; const short @@ -6387,39 +6422,40 @@ namespace isc { namespace dhcp { 514, 513, 515, 516, 517, 518, 519, 521, 520, 523, 522, 524, 524, 525, 525, 525, 527, 526, 529, 528, 530, 530, 530, 531, 531, 531, 531, 531, 531, 531, - 531, 531, 531, 533, 532, 534, 536, 535, 538, 537, - 540, 539, 541, 541, 542, 542, 542, 544, 543, 546, - 545, 547, 547, 548, 548, 548, 549, 549, 549, 549, + 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 531, 533, 532, 534, + 536, 535, 538, 537, 540, 539, 541, 541, 542, 542, + 542, 544, 543, 546, 545, 547, 547, 548, 548, 548, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, - 549, 551, 550, 553, 552, 555, 554, 557, 556, 559, - 558, 561, 560, 563, 562, 565, 564, 567, 566, 569, - 568, 571, 570, 573, 572, 574, 576, 575, 578, 577, - 579, 579, 579, 581, 580, 582, 582, 583, 583, 583, + 549, 549, 549, 549, 549, 551, 550, 553, 552, 555, + 554, 557, 556, 559, 558, 561, 560, 563, 562, 565, + 564, 567, 566, 569, 568, 571, 570, 573, 572, 574, + 576, 575, 578, 577, 579, 579, 579, 581, 580, 582, + 582, 583, 583, 583, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, - 584, 584, 584, 584, 584, 584, 584, 585, 587, 586, - 589, 588, 590, 591, 592, 594, 593, 596, 595, 597, - 597, 598, 598, 598, 600, 599, 601, 601, 601, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 602, 604, 603, 605, 605, 605, 607, 606, 609, - 608, 610, 611, 613, 612, 614, 614, 615, 615, 615, - 617, 616, 618, 618, 618, 619, 619, 619, 619, 619, - 621, 620, 623, 622, 624, 624, 624, 625, 625, 625, - 625, 625, 625, 625, 627, 626, 628, 630, 629, 632, - 631, 634, 633, 635, 635, 636, 636, 636, 638, 637, - 639, 639, 639, 640, 640, 640, 640, 640, 640, 640, - 642, 641, 644, 643, 646, 645, 647, 647, 647, 648, - 648, 648, 648, 648, 648, 649, 651, 650, 652, 654, - 653, 656, 655, 658, 657, 659, 659, 659, 660, 660, - 660, 660, 660, 660, 660, 660, 660, 660, 660, 661, - 663, 662, 664, 666, 665, 667, 668, 670, 669, 671, - 671, 673, 672, 675, 674, 677, 676, 678, 678, 678, - 679, 679, 681, 680, 682, 684, 683, 685, 685, 685, - 687, 686, 688, 688, 688, 689, 689, 689, 689, 689, - 689, 689, 690, 692, 691, 694, 693, 695, 695, 695, - 697, 696, 698, 698, 698, 699, 699, 699, 699, 699, - 701, 700, 702, 703, 704, 706, 705, 708, 707, 709, - 709, 709, 710, 710, 710, 710, 710, 711, 712, 713, - 714 + 584, 585, 587, 586, 589, 588, 590, 591, 592, 594, + 593, 596, 595, 597, 597, 598, 598, 598, 600, 599, + 601, 601, 601, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 604, 603, 605, 605, + 605, 607, 606, 609, 608, 610, 611, 613, 612, 614, + 614, 615, 615, 615, 617, 616, 618, 618, 618, 619, + 619, 619, 619, 619, 621, 620, 623, 622, 624, 624, + 624, 625, 625, 625, 625, 625, 625, 625, 627, 626, + 628, 630, 629, 632, 631, 634, 633, 635, 635, 636, + 636, 636, 638, 637, 639, 639, 639, 640, 640, 640, + 640, 640, 640, 640, 642, 641, 644, 643, 646, 645, + 647, 647, 647, 648, 648, 648, 648, 648, 648, 649, + 651, 650, 652, 654, 653, 656, 655, 658, 657, 659, + 659, 659, 660, 660, 660, 660, 660, 660, 660, 660, + 660, 660, 660, 661, 663, 662, 664, 666, 665, 667, + 668, 670, 669, 671, 671, 673, 672, 675, 674, 677, + 676, 678, 678, 678, 679, 679, 681, 680, 682, 684, + 683, 685, 685, 685, 687, 686, 688, 688, 688, 689, + 689, 689, 689, 689, 689, 689, 690, 692, 691, 694, + 693, 695, 695, 695, 697, 696, 698, 698, 698, 699, + 699, 699, 699, 699, 701, 700, 702, 703, 704, 706, + 705, 708, 707, 709, 709, 709, 710, 710, 710, 710, + 710, 711, 712, 713, 714 }; const signed char @@ -6488,39 +6524,40 @@ namespace isc { namespace dhcp { 0, 4, 1, 1, 3, 3, 3, 0, 4, 0, 6, 0, 1, 1, 3, 2, 0, 4, 0, 4, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 4, 3, 0, 4, 0, 4, - 0, 6, 0, 1, 1, 3, 2, 0, 4, 0, - 4, 0, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 3, + 0, 4, 0, 4, 0, 6, 0, 1, 1, 3, + 2, 0, 4, 0, 4, 0, 1, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 6, 1, 0, 4, 0, 6, - 1, 3, 2, 0, 4, 0, 1, 1, 3, 2, + 4, 0, 4, 0, 4, 0, 4, 0, 6, 1, + 0, 4, 0, 6, 1, 3, 2, 0, 4, 0, + 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, - 0, 4, 3, 3, 3, 0, 6, 0, 6, 0, - 1, 1, 3, 2, 0, 4, 1, 3, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 4, 1, 1, 1, 0, 4, 0, - 4, 3, 3, 0, 6, 0, 1, 1, 3, 2, - 0, 4, 1, 3, 2, 1, 1, 1, 1, 1, - 0, 4, 0, 6, 1, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 4, 1, 0, 4, 0, - 4, 0, 6, 0, 1, 1, 3, 2, 0, 4, + 1, 1, 0, 4, 0, 4, 3, 3, 3, 0, + 6, 0, 6, 0, 1, 1, 3, 2, 0, 4, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, - 0, 4, 0, 4, 0, 6, 1, 3, 2, 1, - 1, 1, 1, 1, 1, 3, 0, 4, 3, 0, - 4, 0, 6, 0, 4, 1, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 4, 3, 0, 4, 3, 3, 0, 4, 1, - 1, 0, 4, 0, 6, 0, 4, 1, 3, 2, - 1, 1, 0, 6, 3, 0, 6, 1, 3, 2, - 0, 4, 1, 3, 2, 1, 1, 1, 1, 1, - 1, 1, 3, 0, 4, 0, 6, 1, 3, 2, - 0, 4, 1, 3, 2, 1, 1, 1, 1, 1, - 0, 4, 3, 3, 3, 0, 4, 0, 6, 1, - 3, 2, 1, 1, 1, 1, 1, 3, 3, 3, - 3 + 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, + 1, 0, 4, 0, 4, 3, 3, 0, 6, 0, + 1, 1, 3, 2, 0, 4, 1, 3, 2, 1, + 1, 1, 1, 1, 0, 4, 0, 6, 1, 3, + 2, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 1, 0, 4, 0, 4, 0, 6, 0, 1, 1, + 3, 2, 0, 4, 1, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 6, + 1, 3, 2, 1, 1, 1, 1, 1, 1, 3, + 0, 4, 3, 0, 4, 0, 6, 0, 4, 1, + 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 0, 4, 3, 0, 4, 3, + 3, 0, 4, 1, 1, 0, 4, 0, 6, 0, + 4, 1, 3, 2, 1, 1, 0, 6, 3, 0, + 6, 1, 3, 2, 0, 4, 1, 3, 2, 1, + 1, 1, 1, 1, 1, 1, 3, 0, 4, 0, + 6, 1, 3, 2, 0, 4, 1, 3, 2, 1, + 1, 1, 1, 1, 0, 4, 3, 3, 3, 0, + 4, 0, 6, 1, 3, 2, 1, 1, 1, 1, + 1, 3, 3, 3, 3 }; @@ -6800,39 +6837,40 @@ namespace isc { namespace dhcp { 2110, 2110, 2119, 2121, 2123, 2129, 2135, 2141, 2141, 2155, 2155, 2168, 2169, 2172, 2173, 2174, 2179, 2179, 2189, 2189, 2199, 2200, 2201, 2206, 2207, 2208, 2209, 2210, 2211, 2212, - 2213, 2214, 2215, 2218, 2218, 2227, 2233, 2233, 2258, 2258, - 2288, 2288, 2299, 2300, 2303, 2304, 2305, 2310, 2310, 2319, - 2319, 2328, 2329, 2332, 2333, 2334, 2340, 2341, 2342, 2343, - 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, - 2354, 2357, 2357, 2366, 2366, 2375, 2375, 2384, 2384, 2393, - 2393, 2402, 2402, 2411, 2411, 2420, 2420, 2429, 2429, 2438, - 2438, 2447, 2447, 2461, 2461, 2472, 2475, 2475, 2489, 2489, - 2500, 2501, 2502, 2507, 2507, 2517, 2518, 2521, 2522, 2523, - 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, - 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2547, 2549, 2549, - 2558, 2558, 2568, 2574, 2582, 2590, 2590, 2602, 2602, 2614, - 2615, 2618, 2619, 2620, 2625, 2625, 2633, 2634, 2635, 2640, - 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, - 2651, 2652, 2655, 2655, 2664, 2665, 2666, 2669, 2669, 2679, - 2679, 2689, 2695, 2701, 2701, 2712, 2713, 2716, 2717, 2718, - 2723, 2723, 2731, 2732, 2733, 2738, 2739, 2740, 2741, 2742, - 2745, 2745, 2756, 2756, 2769, 2770, 2771, 2776, 2777, 2778, - 2779, 2780, 2781, 2782, 2785, 2785, 2793, 2796, 2796, 2805, - 2805, 2814, 2814, 2825, 2826, 2829, 2830, 2831, 2836, 2836, - 2844, 2845, 2846, 2851, 2852, 2853, 2854, 2855, 2856, 2857, - 2860, 2860, 2869, 2869, 2880, 2880, 2893, 2894, 2895, 2900, - 2901, 2902, 2903, 2904, 2905, 2908, 2914, 2914, 2923, 2929, - 2929, 2939, 2939, 2952, 2952, 2962, 2963, 2964, 2969, 2970, - 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2982, - 2988, 2988, 2997, 3003, 3003, 3012, 3018, 3024, 3024, 3033, - 3034, 3037, 3037, 3048, 3048, 3060, 3060, 3070, 3071, 3072, - 3078, 3079, 3082, 3082, 3093, 3101, 3101, 3114, 3115, 3116, - 3122, 3122, 3130, 3131, 3132, 3137, 3138, 3139, 3140, 3141, - 3142, 3143, 3146, 3152, 3152, 3161, 3161, 3172, 3173, 3174, - 3179, 3179, 3187, 3188, 3189, 3194, 3195, 3196, 3197, 3198, - 3201, 3201, 3210, 3216, 3222, 3228, 3228, 3237, 3237, 3248, - 3249, 3250, 3255, 3256, 3257, 3258, 3259, 3262, 3268, 3274, - 3280 + 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, + 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2232, 2232, 2241, + 2247, 2247, 2272, 2272, 2302, 2302, 2313, 2314, 2317, 2318, + 2319, 2324, 2324, 2333, 2333, 2342, 2343, 2346, 2347, 2348, + 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, + 2364, 2365, 2366, 2367, 2368, 2371, 2371, 2380, 2380, 2389, + 2389, 2398, 2398, 2407, 2407, 2416, 2416, 2425, 2425, 2434, + 2434, 2443, 2443, 2452, 2452, 2461, 2461, 2475, 2475, 2486, + 2489, 2489, 2503, 2503, 2514, 2515, 2516, 2521, 2521, 2531, + 2532, 2535, 2536, 2537, 2542, 2543, 2544, 2545, 2546, 2547, + 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, + 2558, 2561, 2563, 2563, 2572, 2572, 2582, 2588, 2596, 2604, + 2604, 2616, 2616, 2628, 2629, 2632, 2633, 2634, 2639, 2639, + 2647, 2648, 2649, 2654, 2655, 2656, 2657, 2658, 2659, 2660, + 2661, 2662, 2663, 2664, 2665, 2666, 2669, 2669, 2678, 2679, + 2680, 2683, 2683, 2693, 2693, 2703, 2709, 2715, 2715, 2726, + 2727, 2730, 2731, 2732, 2737, 2737, 2745, 2746, 2747, 2752, + 2753, 2754, 2755, 2756, 2759, 2759, 2770, 2770, 2783, 2784, + 2785, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2799, 2799, + 2807, 2810, 2810, 2819, 2819, 2828, 2828, 2839, 2840, 2843, + 2844, 2845, 2850, 2850, 2858, 2859, 2860, 2865, 2866, 2867, + 2868, 2869, 2870, 2871, 2874, 2874, 2883, 2883, 2894, 2894, + 2907, 2908, 2909, 2914, 2915, 2916, 2917, 2918, 2919, 2922, + 2928, 2928, 2937, 2943, 2943, 2953, 2953, 2966, 2966, 2976, + 2977, 2978, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, + 2991, 2992, 2993, 2996, 3002, 3002, 3011, 3017, 3017, 3026, + 3032, 3038, 3038, 3047, 3048, 3051, 3051, 3062, 3062, 3074, + 3074, 3084, 3085, 3086, 3092, 3093, 3096, 3096, 3107, 3115, + 3115, 3128, 3129, 3130, 3136, 3136, 3144, 3145, 3146, 3151, + 3152, 3153, 3154, 3155, 3156, 3157, 3160, 3166, 3166, 3175, + 3175, 3186, 3187, 3188, 3193, 3193, 3201, 3202, 3203, 3208, + 3209, 3210, 3211, 3212, 3215, 3215, 3224, 3230, 3236, 3242, + 3242, 3251, 3251, 3262, 3263, 3264, 3269, 3270, 3271, 3272, + 3273, 3276, 3282, 3288, 3294 }; void @@ -6865,9 +6903,9 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" } } // isc::dhcp -#line 6869 "dhcp4_parser.cc" +#line 6907 "dhcp4_parser.cc" -#line 3286 "dhcp4_parser.yy" +#line 3300 "dhcp4_parser.yy" void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index 97ecea2e63..45ad5d8869 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -5712,7 +5712,7 @@ switch (yykind) /// Constants. enum { - yylast_ = 1448, ///< Last index in yytable_. + yylast_ = 1608, ///< Last index in yytable_. yynnts_ = 481, ///< Number of nonterminal symbols. yyfinal_ = 28 ///< Termination state number. }; diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 26c2df08f2..d2b505ad44 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2210,6 +2210,20 @@ pool_param: pool_entry | network_client_classes | require_client_classes | evaluate_additional_classes + | ddns_send_updates + | ddns_override_no_update + | ddns_override_client_update + | ddns_replace_client_name + | ddns_generated_prefix + | ddns_qualifying_suffix + | ddns_update_on_renew + | ddns_conflict_resolution_mode + | ddns_ttl_percent + | ddns_ttl + | ddns_ttl_min + | ddns_ttl_max + | hostname_char_set + | hostname_char_replacement | user_context | comment | unknown_map_entry diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 435407d225..86c6bdf7e1 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -3179,6 +3179,8 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) { bool reprocess_client_name = false; if (lease) { + // Since we have a lease check for pool-level DDNS parameters. + // If there are any we need to call processClientName() again. auto ddns_params = ex.getContext()->getDdnsParams(); auto pool = ddns_params->setPoolFromAddress(lease->addr_); if (pool) { diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index dd1f183f1d..37d19732b1 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8450,4 +8450,125 @@ TEST_F(Dhcp4ParserTest, ddnsTtlMax) { EXPECT_EQ(750, subnet->getDdnsTtlMax(Network::Inheritance::GLOBAL).get()); } +TEST_F(Dhcp4ParserTest, poolDdnsParameters) { + string config = R"( + { + "valid-lifetime": 4000, + "subnet4": [{ + "id": 1, + "subnet": "192.0.0.0/16", + "pools": [{ + "pool": "192.0.1.0/24", + "ddns-send-updates": true, + "ddns-override-no-update": true, + "ddns-override-client-update": true, + "ddns-replace-client-name": "always", + "ddns-generated-prefix": "prefix", + "ddns-qualifying-suffix": "suffix", + "hostname-char-set": "[a-z]", + "hostname-char-replacement": "X", + "ddns-update-on-renew": true, + "ddns-ttl-percent": 0.5, + "ddns-conflict-resolution-mode": "check-with-dhcid", + "ddns-ttl-min": 200, + "ddns-ttl-max": 500 + }, + { + "pool": "192.0.2.0/24", + "ddns-ttl": 300 + }] + }] + } + )"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config)); + extractConfig(config); + + ConstElementPtr status; + EXPECT_NO_THROW(status = Dhcpv4SrvTest::configure(*srv_, json)); + + // returned value should be 0 (success) + checkResult(status, 0); + + // Commit it so global inheritance works. + CfgMgr::instance().commit(); + + ConstSubnet4Ptr subnet = CfgMgr::instance().getCurrentCfg()-> + getCfgSubnets4()->selectSubnet(IOAddress("192.0.0.0")); + ASSERT_TRUE(subnet); + + const PoolCollection pools = subnet->getPools(Lease::TYPE_V4); + ASSERT_GE(pools.size(), 2); + + // First pool specifies all but ddns-ttl. + PoolPtr pool = pools.at(0); + ASSERT_TRUE(pool); + + ASSERT_FALSE(pool->getDdnsSendUpdates().unspecified()); + EXPECT_TRUE(pool->getDdnsSendUpdates().get()); + + ASSERT_FALSE(pool->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_TRUE(pool->getDdnsOverrideNoUpdate().get()); + + ASSERT_FALSE(pool->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_TRUE(pool->getDdnsOverrideClientUpdate().get()); + + ASSERT_FALSE(pool->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(pool->getDdnsReplaceClientNameMode().get(), + D2ClientConfig::RCM_ALWAYS); + + ASSERT_FALSE(pool->getDdnsGeneratedPrefix().unspecified()); + EXPECT_EQ(pool->getDdnsGeneratedPrefix().get(), "prefix"); + + ASSERT_FALSE(pool->getDdnsQualifyingSuffix().unspecified()); + EXPECT_EQ(pool->getDdnsQualifyingSuffix().get(), "suffix"); + + ASSERT_FALSE(pool->getHostnameCharSet().unspecified()); + EXPECT_EQ(pool->getHostnameCharSet().get(), "[a-z]"); + + ASSERT_FALSE(pool->getHostnameCharReplacement().unspecified()); + EXPECT_EQ(pool->getHostnameCharReplacement().get(), "X"); + + ASSERT_FALSE(pool->getDdnsUpdateOnRenew().unspecified()); + EXPECT_TRUE(pool->getDdnsUpdateOnRenew().get()); + + ASSERT_FALSE(pool->getDdnsTtlPercent().unspecified()); + EXPECT_EQ(pool->getDdnsTtlPercent().get(), 0.5); + + ASSERT_FALSE(pool->getDdnsConflictResolutionMode().unspecified()); + EXPECT_EQ(pool->getDdnsConflictResolutionMode().get(), "check-with-dhcid"); + + ASSERT_TRUE(pool->getDdnsTtl().unspecified()); + + ASSERT_FALSE(pool->getDdnsTtlMin().unspecified()); + EXPECT_EQ(pool->getDdnsTtlMin().get(), 200); + + ASSERT_FALSE(pool->getDdnsTtlMax().unspecified()); + EXPECT_EQ(pool->getDdnsTtlMax().get(), 500); + + // Second pool only specifies ddns-ttl. + pool = pools.at(1); + ASSERT_TRUE(pool); + + ASSERT_TRUE(pool->getDdnsSendUpdates().unspecified()); + ASSERT_TRUE(pool->getDdnsOverrideNoUpdate().unspecified()); + ASSERT_TRUE(pool->getDdnsOverrideClientUpdate().unspecified()); + ASSERT_TRUE(pool->getDdnsReplaceClientNameMode().unspecified()); + ASSERT_TRUE(pool->getDdnsGeneratedPrefix().unspecified()); + ASSERT_TRUE(pool->getDdnsQualifyingSuffix().unspecified()); + ASSERT_TRUE(pool->getHostnameCharSet().unspecified()); + ASSERT_TRUE(pool->getHostnameCharReplacement().unspecified()); + ASSERT_TRUE(pool->getDdnsUpdateOnRenew().unspecified()); + ASSERT_TRUE(pool->getDdnsTtlPercent().unspecified()); + ASSERT_TRUE(pool->getDdnsConflictResolutionMode().unspecified()); + ASSERT_TRUE(pool->getDdnsTtlMin().unspecified()); + + ASSERT_FALSE(pool->getDdnsTtl().unspecified()); + EXPECT_EQ(pool->getDdnsTtl().get(), 300); + + ASSERT_TRUE(pool->getDdnsTtlMax().unspecified()); +} + + } // namespace diff --git a/src/bin/dhcp4/tests/fqdn_unittest.cc b/src/bin/dhcp4/tests/fqdn_unittest.cc index 8c3c6b4416..586cad25e9 100644 --- a/src/bin/dhcp4/tests/fqdn_unittest.cc +++ b/src/bin/dhcp4/tests/fqdn_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -772,7 +772,7 @@ public: } - /// @brief Verifies that DDNS TTL parameters are used when specified. + /// @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 @@ -786,10 +786,10 @@ public: Optional ddns_ttl_max = Optional()) { std::string config_header = R"( - { + { "interfaces-config": { "interfaces": [ "*" ] }, "subnet4": [ { - "subnet": "10.0.0.0/24", + "subnet": "10.0.0.0/24", "interface": "eth1", "id": 1, "pools": [ { "pool": "10.0.0.10-10.0.0.10" } ] @@ -859,13 +859,135 @@ public: resp->getYiaddr().toText(), "client1.example.com.", "", time(NULL), lease->valid_lft_, true, - CHECK_WITH_DHCID, - ddns_ttl_percent, - ddns_ttl, - ddns_ttl_min, + CHECK_WITH_DHCID, + ddns_ttl_percent, + ddns_ttl, + ddns_ttl_min, ddns_ttl_max); } + /// @brief Verifies that DDNS parameters specified at the pool level + /// are used when specified. We don't verify all of them, just enough + /// enough to ensure proper scoping of values. + void testPoolDdnsParameters() { + std::string config = R"( + { + "interfaces-config": { "interfaces": [ "*" ] }, + "dhcp-ddns": { "enable-updates": true }, + "subnet4": [{ + "subnet": "10.0.0.0/24", + "interface": "eth1", + "id": 1, + "ddns-qualifying-suffix": "subfix.com", + "pools": [{ + "pool": "10.0.0.10-10.0.0.10", + "ddns-qualifying-suffix": "poolfix.com", + }, + { + "pool": "10.0.0.11-10.0.0.11" + }, + { + "pool": "10.0.0.12-10.0.0.12", + "ddns-send-updates": false + }] + }], + "valid-lifetime": 400 + })"; + + // Load theconfiguration with D2 enabled. + ASSERT_NO_FATAL_FAILURE(configure(config, *srv_)); + ASSERT_TRUE(CfgMgr::instance().ddnsEnabled()); + + // Create a client and get a lease. + Dhcp4Client client1(srv_, Dhcp4Client::SELECTING); + client1.setIfaceName("eth1"); + client1.setIfaceIndex(ETH1_INDEX); + ASSERT_NO_THROW(client1.includeHostname("client1")); + + // Do the DORA. + ASSERT_NO_THROW(client1.doDORA()); + Pkt4Ptr resp = client1.getContext().response_; + ASSERT_TRUE(resp); + ASSERT_EQ(DHCPACK, static_cast(resp->getType())); + + // Make sure the lease is in the database and hostname uses the + // first pool's qualifying suffix. + Lease4Ptr lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.10")); + ASSERT_TRUE(lease); + EXPECT_EQ("client1.poolfix.com", lease->hostname_); + + // Verify the hostname option sent in the response. + OptionStringPtr hostname; + hostname = boost::dynamic_pointer_cast(resp->getOption(DHO_HOST_NAME)); + ASSERT_TRUE(hostname); + EXPECT_EQ("client1.poolfix.com", hostname->getValue()); + + // Verify that an NCR was generated correctly. + ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize()); + verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, + resp->getYiaddr().toText(), + "client1.poolfix.com.", "", + time(NULL), lease->valid_lft_, true, + CHECK_WITH_DHCID); + + // Create another client and get a lease. + Dhcp4Client client2(srv_, Dhcp4Client::SELECTING); + client2.setIfaceName("eth1"); + client2.setIfaceIndex(ETH1_INDEX); + ASSERT_NO_THROW(client2.includeHostname("client2")); + + // Do the DORA. + ASSERT_NO_THROW(client2.doDORA()); + resp = client2.getContext().response_; + ASSERT_TRUE(resp); + ASSERT_EQ(DHCPACK, static_cast(resp->getType())); + + // Make sure the lease is in the database and hostname uses the subnet's + // qualifying suffix. + lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.11")); + ASSERT_TRUE(lease); + EXPECT_EQ("client2.subfix.com", lease->hostname_); + + // Verify the hostname option sent in the response. + hostname = boost::dynamic_pointer_cast(resp->getOption(DHO_HOST_NAME)); + ASSERT_TRUE(hostname); + EXPECT_EQ("client2.subfix.com", hostname->getValue()); + + // Verify that an NCR was generated correctly. + ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize()); + verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, + resp->getYiaddr().toText(), + "client2.subfix.com.", "", + time(NULL), lease->valid_lft_, true, + CHECK_WITH_DHCID); + + // Create another third client and get a lease. + Dhcp4Client client3(srv_, Dhcp4Client::SELECTING); + client3.setIfaceName("eth1"); + client3.setIfaceIndex(ETH1_INDEX); + ASSERT_NO_THROW(client3.includeHostname("client3")); + + // Do the DORA. + ASSERT_NO_THROW(client3.doDORA()); + resp = client3.getContext().response_; + ASSERT_TRUE(resp); + ASSERT_EQ(DHCPACK, static_cast(resp->getType())); + + // Make sure the lease is in the database and hostname uses the subnet suffix. + lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.12")); + ASSERT_TRUE(lease); + EXPECT_EQ("client3.subfix.com", lease->hostname_); + + // Verify the hostname option sent in the response. + hostname = boost::dynamic_pointer_cast(resp->getOption(DHO_HOST_NAME)); + ASSERT_TRUE(hostname); + EXPECT_EQ("client3.subfix.com", hostname->getValue()); + + // There should not be an NCR in the queue since the third pool + // disables DDNS updates. + ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize()); + } + ///@brief Verify that NameChangeRequest holds valid values. /// /// Pulls the NCR from the top of the send queue and checks its content @@ -927,7 +1049,7 @@ public: // time for equality but rather check that the lease expiration time // is not greater than the current time + lease lifetime. - uint32_t ttl = calculateDdnsTtl(valid_lft, ddns_ttl_percent, + uint32_t ttl = calculateDdnsTtl(valid_lft, ddns_ttl_percent, ddns_ttl, ddns_ttl_min, ddns_ttl_max); if (not_strict_expire_check) { @@ -3072,7 +3194,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlTest) { testDdnsTtlParameters(2100, // valid lft Optional(), // percent 999, // ttl - Optional(), // min + Optional(), // min Optional()); // max } @@ -3080,7 +3202,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlTest) { TEST_F(NameDhcpv4SrvTest, ddnsTtlMinTest) { testDdnsTtlParameters(2100, // valid lft Optional(), // percent - Optional(), // ttl + Optional(), // ttl 800, // ttl-min Optional()); // ttl-max } @@ -3089,9 +3211,14 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlMinTest) { TEST_F(NameDhcpv4SrvTest, ddnsTtlMaxTest) { testDdnsTtlParameters(2100, // valid lft Optional(), // percent - Optional(), // ttl + Optional(), // ttl Optional(), // ttl-min - 500); // ttl-max + 500); // ttl-max +} + +// Verify pool-level DDNS pararmeters are used. +TEST_F(NameDhcpv4SrvTest, poolDdnsParametersTest) { + testPoolDdnsParameters(); } } // end of anonymous namespace diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index ee35d08283..3bb0907616 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2017-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2724,6 +2724,38 @@ const char* EXTRACTED_CONFIGS[] = { " }\n" " ],\n" " \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 87 +"{\n" +" \"subnet4\": [\n" +" {\n" +" \"id\": 1,\n" +" \"pools\": [\n" +" {\n" +" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n" +" \"ddns-generated-prefix\": \"prefix\",\n" +" \"ddns-override-client-update\": true,\n" +" \"ddns-override-no-update\": true,\n" +" \"ddns-qualifying-suffix\": \"suffix\",\n" +" \"ddns-replace-client-name\": \"always\",\n" +" \"ddns-send-updates\": true,\n" +" \"ddns-ttl-max\": 500,\n" +" \"ddns-ttl-min\": 200,\n" +" \"ddns-ttl-percent\": 0.5,\n" +" \"ddns-update-on-renew\": true,\n" +" \"hostname-char-replacement\": \"X\",\n" +" \"hostname-char-set\": \"[a-z]\",\n" +" \"pool\": \"192.0.1.0/24\"\n" +" },\n" +" {\n" +" \"ddns-ttl\": 300,\n" +" \"pool\": \"192.0.2.0/24\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.0.0/16\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" " }\n" }; @@ -14119,6 +14151,134 @@ const char* UNPARSED_CONFIGS[] = { " \"t1-percent\": 0.5,\n" " \"t2-percent\": 0.875,\n" " \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 87 +"{\n" +" \"allocator\": \"iterative\",\n" +" \"authoritative\": false,\n" +" \"boot-file-name\": \"\",\n" +" \"calculate-tee-times\": false,\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-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-ring4\"\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"early-global-reservations-lookup\": false,\n" +" \"echo-client-id\": true,\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\", \"circuit-id\", \"client-id\" ],\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" +" \"match-client-id\": true,\n" +" \"multi-threading\": {\n" +" \"enable-multi-threading\": true,\n" +" \"packet-queue-size\": 64,\n" +" \"thread-pool-size\": 0\n" +" },\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"parked-packet-limit\": 256,\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-hostname\": \"\",\n" +" \"server-tag\": \"\",\n" +" \"shared-networks\": [ ],\n" +" \"stash-agent-options\": false,\n" +" \"statistic-default-sample-age\": 0,\n" +" \"statistic-default-sample-count\": 20,\n" +" \"store-extended-info\": false,\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"allocator\": \"iterative\",\n" +" \"calculate-tee-times\": false,\n" +" \"id\": 1,\n" +" \"max-valid-lifetime\": 4000,\n" +" \"min-valid-lifetime\": 4000,\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n" +" \"ddns-generated-prefix\": \"prefix\",\n" +" \"ddns-override-client-update\": true,\n" +" \"ddns-override-no-update\": true,\n" +" \"ddns-qualifying-suffix\": \"suffix\",\n" +" \"ddns-replace-client-name\": \"always\",\n" +" \"ddns-send-updates\": true,\n" +" \"ddns-ttl-max\": 500,\n" +" \"ddns-ttl-min\": 200,\n" +" \"ddns-ttl-percent\": 0.5,\n" +" \"ddns-update-on-renew\": true,\n" +" \"hostname-char-replacement\": \"X\",\n" +" \"hostname-char-set\": \"[a-z]\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.1.0/24\"\n" +" },\n" +" {\n" +" \"ddns-ttl\": 300,\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.0/24\"\n" +" }\n" +" ],\n" +" \"relay\": {\n" +" \"ip-addresses\": [ ]\n" +" },\n" +" \"reservations\": [ ],\n" +" \"store-extended-info\": false,\n" +" \"subnet\": \"192.0.0.0/16\",\n" +" \"t1-percent\": 0.5,\n" +" \"t2-percent\": 0.875,\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ],\n" +" \"t1-percent\": 0.5,\n" +" \"t2-percent\": 0.875,\n" +" \"valid-lifetime\": 4000\n" " }\n" }; diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.cc b/src/lib/dhcpsrv/parsers/base_network_parser.cc index 4929a5ad36..e409cc252b 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/base_network_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2019-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -140,108 +140,7 @@ BaseNetworkParser::parseCacheParams(const ConstElementPtr& network_data, void BaseNetworkParser::parseDdnsParams(const data::ConstElementPtr& network_data, NetworkPtr& network) { - - if (network_data->contains("ddns-send-updates")) { - network->setDdnsSendUpdates(getBoolean(network_data, "ddns-send-updates")); - } - - if (network_data->contains("ddns-override-no-update")) { - network->setDdnsOverrideNoUpdate(getBoolean(network_data, "ddns-override-no-update")); - } - - if (network_data->contains("ddns-override-client-update")) { - network->setDdnsOverrideClientUpdate(getBoolean(network_data, "ddns-override-client-update")); - } - - if (network_data->contains("ddns-replace-client-name")) { - network->setDdnsReplaceClientNameMode(getAndConvert - (network_data, "ddns-replace-client-name", - "ReplaceClientName mode")); - } - - if (network_data->contains("ddns-generated-prefix")) { - network->setDdnsGeneratedPrefix(getString(network_data, "ddns-generated-prefix")); - } - - if (network_data->contains("ddns-qualifying-suffix")) { - network->setDdnsQualifyingSuffix(getString(network_data, "ddns-qualifying-suffix")); - } - - std::string hostname_char_set; - if (network_data->contains("hostname-char-set")) { - hostname_char_set = getString(network_data, "hostname-char-set"); - network->setHostnameCharSet(hostname_char_set); - } - - std::string hostname_char_replacement; - if (network_data->contains("hostname-char-replacement")) { - hostname_char_replacement = getString(network_data, "hostname-char-replacement"); - network->setHostnameCharReplacement(hostname_char_replacement); - } - - // We need to validate sanitizer values here so we can detect problems and - // cause a configuration. We don't retain the compilation because it's not - // something we can inherit. - if (!hostname_char_set.empty()) { - try { - str::StringSanitizerPtr sanitizer(new str::StringSanitizer(hostname_char_set, - hostname_char_replacement)); - } catch (const std::exception& ex) { - isc_throw(BadValue, "hostname-char-set '" << hostname_char_set - << "' is not a valid regular expression"); - } - } - - if (network_data->contains("ddns-update-on-renew")) { - network->setDdnsUpdateOnRenew(getBoolean(network_data, "ddns-update-on-renew")); - } - - bool has_ddns_ttl = false; - uint32_t ddns_ttl = 0; - if (network_data->contains("ddns-ttl")) { - ddns_ttl = getInteger(network_data, "ddns-ttl"); - network->setDdnsTtl(ddns_ttl); - has_ddns_ttl = true; - } - - if (network_data->contains("ddns-ttl-percent")) { - if (has_ddns_ttl) { - isc_throw(BadValue, "cannot specify both ddns-ttl-percent and ddns-ttl"); - } - - network->setDdnsTtlPercent(getDouble(network_data, "ddns-ttl-percent")); - } - - uint32_t ddns_ttl_min = 0; - if (network_data->contains("ddns-ttl-min")) { - if (has_ddns_ttl) { - isc_throw(BadValue, "cannot specify both ddns-ttl-min and ddns-ttl"); - } - - ddns_ttl_min = getInteger(network_data, "ddns-ttl-min"); - network->setDdnsTtlMin(ddns_ttl_min); - } - - if (network_data->contains("ddns-ttl-max")) { - if (has_ddns_ttl) { - isc_throw(BadValue, "cannot specify both ddns-ttl-max and ddns-ttl"); - } - - uint32_t ddns_ttl_max = getInteger(network_data, "ddns-ttl-max"); - if (ddns_ttl_max < ddns_ttl_min) { - isc_throw(BadValue, "ddns-ttl-max: " << ddns_ttl_max - << " must be greater than ddns-ttl-min: " << ddns_ttl_min); - } - - network->setDdnsTtlMax(ddns_ttl_max); - } - - // For backward compatibility, ddns-conflict-resolution-mode is optional. - if (network_data->contains("ddns-conflict-resolution-mode")) { - network->setDdnsConflictResolutionMode(getString(network_data, - "ddns-conflict-resolution-mode")); - } + parseDdnsParameters(network_data, network); } void diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.h b/src/lib/dhcpsrv/parsers/base_network_parser.h index 73af4b9a12..4b071a1b84 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.h +++ b/src/lib/dhcpsrv/parsers/base_network_parser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2019-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -146,6 +146,136 @@ public: /// @throw DhcpConfigError if both entries are present. static void getClientClassesElem(data::ConstElementPtr params, ClassAdderFunc adder_func); + + /// @brief Parses parameters pertaining to DDNS behavior. + /// + /// The parsed parameters are: + /// - ddns-send-updates + /// - ddns-override-no-update + /// - ddns-override-client-update + /// - ddns-replace-client-name + /// - ddns-generated-prefix + /// - ddns-qualifying-suffix + /// - ddns-use-conflict-resolution (retained for backward compatibility) + /// - ddns-update-on-renew + /// - ddns-ttl-percent + /// - ddns-conflict-resolution-mode + /// + /// Owner types are expected to have public setters for each of these + /// paramters. + /// + /// @tparam DdnsOwnerPtr pointer to the class type that owns the DDNS parameters + /// @param config configuration element holding the DDNS paramters to parse. + /// @param owner Pointer to the DDNS parameter owner object into which parsed values + /// should be stored. + /// @throw BadValue for various invalid values. + template + void parseDdnsParameters(const data::ConstElementPtr& config, + DdnsOwnerTypePtr owner) { + + if (config->contains("ddns-send-updates")) { + owner->setDdnsSendUpdates(getBoolean(config, "ddns-send-updates")); + } + + if (config->contains("ddns-override-no-update")) { + owner->setDdnsOverrideNoUpdate(getBoolean(config, "ddns-override-no-update")); + } + + if (config->contains("ddns-override-client-update")) { + owner->setDdnsOverrideClientUpdate(getBoolean(config, "ddns-override-client-update")); + } + + if (config->contains("ddns-replace-client-name")) { + owner->setDdnsReplaceClientNameMode(getAndConvert + (config, "ddns-replace-client-name", + "ReplaceClientName mode")); + } + + if (config->contains("ddns-generated-prefix")) { + owner->setDdnsGeneratedPrefix(getString(config, "ddns-generated-prefix")); + } + + if (config->contains("ddns-qualifying-suffix")) { + owner->setDdnsQualifyingSuffix(getString(config, "ddns-qualifying-suffix")); + } + + std::string hostname_char_set; + if (config->contains("hostname-char-set")) { + hostname_char_set = getString(config, "hostname-char-set"); + owner->setHostnameCharSet(hostname_char_set); + } + + std::string hostname_char_replacement; + if (config->contains("hostname-char-replacement")) { + hostname_char_replacement = getString(config, "hostname-char-replacement"); + owner->setHostnameCharReplacement(hostname_char_replacement); + } + + // We need to validate sanitizer values here so we can detect problems and + // cause a configuration. We don't retain the compilation because it's not + // something we can inherit. + if (!hostname_char_set.empty()) { + try { + util::str::StringSanitizerPtr sanitizer( + new util::str::StringSanitizer(hostname_char_set, + hostname_char_replacement)); + } catch (const std::exception& ex) { + isc_throw(BadValue, "hostname-char-set '" << hostname_char_set + << "' is not a valid regular expression"); + } + } + + if (config->contains("ddns-update-on-renew")) { + owner->setDdnsUpdateOnRenew(getBoolean(config, "ddns-update-on-renew")); + } + + bool has_ddns_ttl = false; + uint32_t ddns_ttl = 0; + if (config->contains("ddns-ttl")) { + ddns_ttl = getInteger(config, "ddns-ttl"); + owner->setDdnsTtl(ddns_ttl); + has_ddns_ttl = true; + } + + if (config->contains("ddns-ttl-percent")) { + if (has_ddns_ttl) { + isc_throw(BadValue, "cannot specify both ddns-ttl-percent and ddns-ttl"); + } + + owner->setDdnsTtlPercent(getDouble(config, "ddns-ttl-percent")); + } + + uint32_t ddns_ttl_min = 0; + if (config->contains("ddns-ttl-min")) { + if (has_ddns_ttl) { + isc_throw(BadValue, "cannot specify both ddns-ttl-min and ddns-ttl"); + } + + ddns_ttl_min = getInteger(config, "ddns-ttl-min"); + owner->setDdnsTtlMin(ddns_ttl_min); + } + + if (config->contains("ddns-ttl-max")) { + if (has_ddns_ttl) { + isc_throw(BadValue, "cannot specify both ddns-ttl-max and ddns-ttl"); + } + + uint32_t ddns_ttl_max = getInteger(config, "ddns-ttl-max"); + if (ddns_ttl_max < ddns_ttl_min) { + isc_throw(BadValue, "ddns-ttl-max: " << ddns_ttl_max + << " must be greater than ddns-ttl-min: " << ddns_ttl_min); + } + + owner->setDdnsTtlMax(ddns_ttl_max); + } + + // For backward compatibility, ddns-conflict-resolution-mode is optional. + if (config->contains("ddns-conflict-resolution-mode")) { + owner->setDdnsConflictResolutionMode(getString(config, + "ddns-conflict-resolution-mode")); + } + } }; } // end of namespace isc::dhcp diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 005377533f..a0902fecfa 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -537,6 +537,10 @@ PoolParser::parse(PoolStoragePtr pools, BaseNetworkParser::getAdditionalClassesElem(pool_structure, std::bind(&Pool::addAdditionalClass, pool, ph::_1)); + + // Parse DDNS behavioral parameters. + BaseNetworkParser parser; + parser.parseDdnsParameters(pool_structure, pool); } boost::shared_ptr diff --git a/src/lib/dhcpsrv/parsers/simple_parser4.cc b/src/lib/dhcpsrv/parsers/simple_parser4.cc index bf0b003289..151ea5e6bd 100644 --- a/src/lib/dhcpsrv/parsers/simple_parser4.cc +++ b/src/lib/dhcpsrv/parsers/simple_parser4.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -332,16 +332,30 @@ const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = { /// list and map types for entries. /// Order follows pool_param rules in bison grammar. const SimpleKeywords SimpleParser4::POOL4_PARAMETERS = { - { "pool", Element::string }, - { "pool-id", Element::integer }, - { "option-data", Element::list }, - { "client-class", Element::string }, - { "client-classes", Element::list }, - { "require-client-classes", Element::list }, - { "evaluate-additional-classes", Element::list }, - { "user-context", Element::map }, - { "comment", Element::string }, - { "metadata", Element::map } + { "pool", Element::string }, + { "pool-id", Element::integer }, + { "option-data", Element::list }, + { "client-class", Element::string }, + { "client-classes", Element::list }, + { "require-client-classes", Element::list }, + { "evaluate-additional-classes", Element::list }, + { "user-context", Element::map }, + { "comment", Element::string }, + { "metadata", Element::map }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string }, + { "hostname-char-set", Element::string }, + { "hostname-char-replacement", Element::string }, + { "ddns-update-on-renew", Element::boolean }, + { "ddns-ttl-percent", Element::real }, + { "ddns-conflict-resolution-mode", Element::string }, + { "ddns-ttl", Element::integer }, + { "ddns-ttl-min", Element::integer }, + { "ddns-ttl-max", Element::integer } }; /// @brief This table defines all shared network parameters for DHCPv4. diff --git a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc index af1ef3daca..5ddbc0175e 100644 --- a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc +++ b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2025 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -4337,4 +4337,110 @@ TEST_F(DhcpParserTest, invalidDdnsTtlParmatersSubnet6) { invalidDdnsTtlParmatersSubnet(AF_INET6); } +// Verifies valid DDNS parameters in v4 pools. As this uses the +// same parser as Network derivatives we skip retesting all the +// invalid permuations. This test ensures all supported +// parameters can be set. +TEST_F(DhcpParserTest, validDdnsParmatersPool4) { + + std::string config = + R"^([{ + "pool": "192.0.1.0/24", + "ddns-send-updates": true, + "ddns-override-no-update": true, + "ddns-override-client-update": true, + "ddns-replace-client-name": "always", + "ddns-generated-prefix": "prefix", + "ddns-qualifying-suffix": "suffix", + "hostname-char-set": "[a-z]", + "hostname-char-replacement": "X", + "ddns-update-on-renew": true, + "ddns-ttl-percent": 0.5, + "ddns-conflict-resolution-mode": "check-with-dhcid", + "ddns-ttl-min": 200, + "ddns-ttl-max": 500 + }, + { + "pool": "192.0.2.0/24", + "ddns-ttl": 300 + }])^"; + + ElementPtr config_element = Element::fromJSON(config); + + PoolStoragePtr pools(new PoolStorage()); + Pools4ListParser parser; + ASSERT_NO_THROW_LOG(parser.parse(pools, config_element)); + + // Should have two pools. + ASSERT_EQ(pools->size(), 2); + + // First pool specifies all but ddns-ttl. + PoolPtr pool = (*pools)[0]; + ASSERT_TRUE(pool); + + ASSERT_FALSE(pool->getDdnsSendUpdates().unspecified()); + EXPECT_TRUE(pool->getDdnsSendUpdates().get()); + + ASSERT_FALSE(pool->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_TRUE(pool->getDdnsOverrideNoUpdate().get()); + + ASSERT_FALSE(pool->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_TRUE(pool->getDdnsOverrideClientUpdate().get()); + + ASSERT_FALSE(pool->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(pool->getDdnsReplaceClientNameMode().get(), + D2ClientConfig::RCM_ALWAYS); + + ASSERT_FALSE(pool->getDdnsGeneratedPrefix().unspecified()); + EXPECT_EQ(pool->getDdnsGeneratedPrefix().get(), "prefix"); + + ASSERT_FALSE(pool->getDdnsQualifyingSuffix().unspecified()); + EXPECT_EQ(pool->getDdnsQualifyingSuffix().get(), "suffix"); + + ASSERT_FALSE(pool->getHostnameCharSet().unspecified()); + EXPECT_EQ(pool->getHostnameCharSet().get(), "[a-z]"); + + ASSERT_FALSE(pool->getHostnameCharReplacement().unspecified()); + EXPECT_EQ(pool->getHostnameCharReplacement().get(), "X"); + + ASSERT_FALSE(pool->getDdnsUpdateOnRenew().unspecified()); + EXPECT_TRUE(pool->getDdnsUpdateOnRenew().get()); + + ASSERT_FALSE(pool->getDdnsTtlPercent().unspecified()); + EXPECT_EQ(pool->getDdnsTtlPercent().get(), 0.5); + + ASSERT_FALSE(pool->getDdnsConflictResolutionMode().unspecified()); + EXPECT_EQ(pool->getDdnsConflictResolutionMode().get(), "check-with-dhcid"); + + ASSERT_TRUE(pool->getDdnsTtl().unspecified()); + + ASSERT_FALSE(pool->getDdnsTtlMin().unspecified()); + EXPECT_EQ(pool->getDdnsTtlMin().get(), 200); + + ASSERT_FALSE(pool->getDdnsTtlMax().unspecified()); + EXPECT_EQ(pool->getDdnsTtlMax().get(), 500); + + // Second pool only specifies ddns-ttl. + pool = (*pools)[1]; + ASSERT_TRUE(pool); + + ASSERT_TRUE(pool->getDdnsSendUpdates().unspecified()); + ASSERT_TRUE(pool->getDdnsOverrideNoUpdate().unspecified()); + ASSERT_TRUE(pool->getDdnsOverrideClientUpdate().unspecified()); + ASSERT_TRUE(pool->getDdnsReplaceClientNameMode().unspecified()); + ASSERT_TRUE(pool->getDdnsGeneratedPrefix().unspecified()); + ASSERT_TRUE(pool->getDdnsQualifyingSuffix().unspecified()); + ASSERT_TRUE(pool->getHostnameCharSet().unspecified()); + ASSERT_TRUE(pool->getHostnameCharReplacement().unspecified()); + ASSERT_TRUE(pool->getDdnsUpdateOnRenew().unspecified()); + ASSERT_TRUE(pool->getDdnsTtlPercent().unspecified()); + ASSERT_TRUE(pool->getDdnsConflictResolutionMode().unspecified()); + ASSERT_TRUE(pool->getDdnsTtlMin().unspecified()); + + ASSERT_FALSE(pool->getDdnsTtl().unspecified()); + EXPECT_EQ(pool->getDdnsTtl().get(), 300); + + ASSERT_TRUE(pool->getDdnsTtlMax().unspecified()); +} + } // Anonymous namespace