]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1710] Added lifetimes to v6 client classes
authorThomas Markwalder <tmark@isc.org>
Thu, 5 Aug 2021 18:05:32 +0000 (14:05 -0400)
committerThomas Markwalder <tmark@isc.org>
Fri, 20 Aug 2021 12:43:29 +0000 (08:43 -0400)
kea-dhcp6 client classes now support valid and preferred
lifetime triplets.  Need to update ARM and CB yet.

/doc/examples/kea6/all-keys.json
    Updated

/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll
    Added preferred and valid lifetime parameters to client class

/src/bin/dhcp6/dhcp6_parser.yy
    Added preferred and valid lifetime parameters to client class

src/bin/dhcp6/tests/config_parser_unittest.cc
    TEST_F(Dhcp6ParserTest, clientClassValidPreferredLifetime)  - new test

/src/bin/dhcp6/tests/parser_unittest.cc
    Added use of EXPECT_NO_THROW_LOG to ease finding JSON errors

/src/lib/dhcpsrv/alloc_engine.*
    AllocEngine::getLifetimes6() - new function
    Lease6Ptr AllocEngine::createLease6() - calls new function

/src/lib/dhcpsrv/client_class_def.*
/src/lib/dhcpsrv/parsers/client_class_def_parser.cc
    ClientClassDef - added support for preferred lifetime triplet

/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc
    TEST_F(AllocEngine6Test, getValidLifetime)
    TEST_F(AllocEngine6Test, getPreferredLifetime) - new tests

/src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc
    TEST_F(ClientClassDefParserTest, preferredLifetimeTests) - new test

/src/lib/dhcpsrv/tests/client_class_def_unittest.cc
    updated tests

17 files changed:
doc/examples/kea6/all-keys.json
src/bin/dhcp6/dhcp6_lexer.cc
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_parser.cc
src/bin/dhcp6/dhcp6_parser.h
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/location.hh
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/parser_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/alloc_engine.h
src/lib/dhcpsrv/client_class_def.cc
src/lib/dhcpsrv/client_class_def.h
src/lib/dhcpsrv/parsers/client_class_def_parser.cc
src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc
src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc
src/lib/dhcpsrv/tests/client_class_def_unittest.cc

index 9be4be0d72f75cd480b623b22fce446f90e2395f..1504d5f75ff6f4c6c501b0e83b6a8605a52aedca 100644 (file)
 
                 // Class selection expression. The DHCP packet is assigned to this
                 // class when the given expression evaluates to true.
-                "test": "member('HA_server1')"
+                "test": "member('HA_server1')",
+
+                // Class valid lifetime.
+                "valid-lifetime": 6000,
+
+                // Class min valid lifetime.
+                "min-valid-lifetime": 4000,
+
+                // Class max valid lifetime.
+                "max-valid-lifetime": 8000,
+
+                // Class preferred lifetime.
+                "preferred-lifetime": 7000,
+
+                // Class min preferred lifetime.
+                "min-preferred-lifetime": 5000,
+
+                // Class max preferred lifetime.
+                "max-preferred-lifetime": 9000
             },
             {
                 // Second class name.
index d51aafd919505f59bf50c457b7362d85daba015d..36da1ac651840096782885a3d51c6c2e3798d052 100644 (file)
@@ -1,6 +1,6 @@
-#line 1 "dhcp6_lexer.cc"
+#line 2 "dhcp6_lexer.cc"
 
-#line 3 "dhcp6_lexer.cc"
+#line 4 "dhcp6_lexer.cc"
 
 #define  YY_INT_ALIGNED short int
 
@@ -1996,23 +1996,23 @@ static const flex_int16_t yy_rule_linenum[219] =
       468,  477,  486,  495,  504,  513,  522,  531,  540,  549,
       558,  571,  580,  589,  598,  607,  618,  629,  640,  651,
       663,  674,  685,  696,  707,  718,  729,  740,  749,  758,
-      767,  778,  789,  800,  811,  822,  831,  842,  853,  864,
-      875,  886,  897,  908,  919,  928,  937,  946,  955,  966,
-      977,  988,  999, 1010, 1021, 1032, 1044, 1054, 1065, 1074,
-
-     1083, 1098, 1114, 1123, 1132, 1141, 1150, 1159, 1168, 1177,
-     1186, 1195, 1204, 1228, 1252, 1261, 1271, 1281, 1290, 1300,
-     1311, 1320, 1329, 1338, 1347, 1356, 1367, 1378, 1389, 1399,
-     1408, 1417, 1426, 1437, 1448, 1459, 1470, 1481, 1490, 1499,
-     1508, 1517, 1526, 1535, 1544, 1553, 1562, 1572, 1584, 1597,
-     1606, 1615, 1625, 1635, 1644, 1655, 1665, 1674, 1684, 1694,
-     1703, 1712, 1721, 1730, 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, 2001, 2010, 2019, 2028, 2037, 2046, 2055,
-
-     2156, 2172, 2221, 2229, 2244, 2245, 2246, 2247, 2248, 2249,
-     2251, 2269, 2282, 2287, 2291, 2293, 2295, 2297
+      767,  778,  789,  800,  811,  822,  831,  843,  855,  867,
+      879,  891,  903,  914,  925,  934,  943,  952,  961,  972,
+      983,  994, 1005, 1016, 1027, 1038, 1050, 1060, 1071, 1080,
+
+     1089, 1104, 1120, 1129, 1138, 1147, 1156, 1165, 1174, 1183,
+     1192, 1201, 1210, 1234, 1258, 1267, 1277, 1287, 1296, 1306,
+     1317, 1326, 1335, 1344, 1353, 1362, 1373, 1384, 1395, 1405,
+     1414, 1423, 1432, 1443, 1454, 1465, 1476, 1487, 1496, 1505,
+     1514, 1523, 1532, 1541, 1550, 1559, 1568, 1578, 1590, 1603,
+     1612, 1621, 1631, 1641, 1650, 1661, 1671, 1680, 1690, 1700,
+     1709, 1718, 1727, 1736, 1746, 1755, 1764, 1773, 1782, 1791,
+     1800, 1809, 1818, 1827, 1836, 1845, 1854, 1863, 1872, 1881,
+     1890, 1899, 1908, 1917, 1926, 1935, 1944, 1953, 1962, 1971,
+     1980, 1989, 1998, 2007, 2016, 2025, 2034, 2043, 2052, 2061,
+
+     2162, 2178, 2227, 2235, 2250, 2251, 2252, 2253, 2254, 2255,
+     2257, 2275, 2288, 2293, 2297, 2299, 2301, 2303
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -2066,7 +2066,7 @@ using namespace isc::dhcp;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg)
-#line 2069 "dhcp6_lexer.cc"
+#line 2070 "dhcp6_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -2092,8 +2092,8 @@ using namespace isc::dhcp;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 2095 "dhcp6_lexer.cc"
 #line 2096 "dhcp6_lexer.cc"
+#line 2097 "dhcp6_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -2423,7 +2423,7 @@ YY_DECL
     }
 
 
-#line 2426 "dhcp6_lexer.cc"
+#line 2427 "dhcp6_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -3429,6 +3429,7 @@ YY_RULE_SETUP
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_);
@@ -3437,12 +3438,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 842 "dhcp6_lexer.ll"
+#line 843 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MIN_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("min-preferred-lifetime", driver.loc_);
@@ -3451,12 +3453,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 853 "dhcp6_lexer.ll"
+#line 855 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MAX_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("max-preferred-lifetime", driver.loc_);
@@ -3465,12 +3468,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 864 "dhcp6_lexer.ll"
+#line 867 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_);
@@ -3479,12 +3483,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 875 "dhcp6_lexer.ll"
+#line 879 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MIN_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("min-valid-lifetime", driver.loc_);
@@ -3493,12 +3498,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 886 "dhcp6_lexer.ll"
+#line 891 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MAX_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("max-valid-lifetime", driver.loc_);
@@ -3507,7 +3513,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 897 "dhcp6_lexer.ll"
+#line 903 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3521,7 +3527,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 908 "dhcp6_lexer.ll"
+#line 914 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3535,7 +3541,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 919 "dhcp6_lexer.ll"
+#line 925 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3547,7 +3553,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 928 "dhcp6_lexer.ll"
+#line 934 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3559,7 +3565,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 937 "dhcp6_lexer.ll"
+#line 943 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3571,7 +3577,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 946 "dhcp6_lexer.ll"
+#line 952 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3583,7 +3589,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 955 "dhcp6_lexer.ll"
+#line 961 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3597,7 +3603,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 966 "dhcp6_lexer.ll"
+#line 972 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3611,7 +3617,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 977 "dhcp6_lexer.ll"
+#line 983 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3625,7 +3631,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 988 "dhcp6_lexer.ll"
+#line 994 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3639,7 +3645,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 999 "dhcp6_lexer.ll"
+#line 1005 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3653,7 +3659,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 1010 "dhcp6_lexer.ll"
+#line 1016 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3667,7 +3673,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 1021 "dhcp6_lexer.ll"
+#line 1027 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3681,7 +3687,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 1032 "dhcp6_lexer.ll"
+#line 1038 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3695,7 +3701,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 1044 "dhcp6_lexer.ll"
+#line 1050 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3708,7 +3714,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 1054 "dhcp6_lexer.ll"
+#line 1060 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3722,7 +3728,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 1065 "dhcp6_lexer.ll"
+#line 1071 "dhcp6_lexer.ll"
 {
     switch (driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3734,7 +3740,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 1074 "dhcp6_lexer.ll"
+#line 1080 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3746,7 +3752,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 1083 "dhcp6_lexer.ll"
+#line 1089 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3764,7 +3770,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 1098 "dhcp6_lexer.ll"
+#line 1104 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -3783,7 +3789,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 1114 "dhcp6_lexer.ll"
+#line 1120 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -3795,7 +3801,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 1123 "dhcp6_lexer.ll"
+#line 1129 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -3807,7 +3813,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 1132 "dhcp6_lexer.ll"
+#line 1138 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3819,7 +3825,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 1141 "dhcp6_lexer.ll"
+#line 1147 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3831,7 +3837,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 1150 "dhcp6_lexer.ll"
+#line 1156 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3843,7 +3849,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 1159 "dhcp6_lexer.ll"
+#line 1165 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3855,7 +3861,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 1168 "dhcp6_lexer.ll"
+#line 1174 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3867,7 +3873,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 1177 "dhcp6_lexer.ll"
+#line 1183 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3879,7 +3885,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 1186 "dhcp6_lexer.ll"
+#line 1192 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3891,7 +3897,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 1195 "dhcp6_lexer.ll"
+#line 1201 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::POOLS:
@@ -3903,7 +3909,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 1204 "dhcp6_lexer.ll"
+#line 1210 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3930,7 +3936,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 1228 "dhcp6_lexer.ll"
+#line 1234 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3957,7 +3963,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 1252 "dhcp6_lexer.ll"
+#line 1258 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3969,7 +3975,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 1261 "dhcp6_lexer.ll"
+#line 1267 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3982,7 +3988,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 1271 "dhcp6_lexer.ll"
+#line 1277 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3995,7 +4001,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 1281 "dhcp6_lexer.ll"
+#line 1287 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -4007,7 +4013,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 1290 "dhcp6_lexer.ll"
+#line 1296 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -4020,7 +4026,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 1300 "dhcp6_lexer.ll"
+#line 1306 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4034,7 +4040,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 1311 "dhcp6_lexer.ll"
+#line 1317 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -4046,7 +4052,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 1320 "dhcp6_lexer.ll"
+#line 1326 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -4058,7 +4064,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 1329 "dhcp6_lexer.ll"
+#line 1335 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -4070,7 +4076,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 1338 "dhcp6_lexer.ll"
+#line 1344 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -4082,7 +4088,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 1347 "dhcp6_lexer.ll"
+#line 1353 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -4094,7 +4100,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 1356 "dhcp6_lexer.ll"
+#line 1362 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4108,7 +4114,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 1367 "dhcp6_lexer.ll"
+#line 1373 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4122,7 +4128,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 1378 "dhcp6_lexer.ll"
+#line 1384 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4136,7 +4142,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 1389 "dhcp6_lexer.ll"
+#line 1395 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -4149,7 +4155,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 1399 "dhcp6_lexer.ll"
+#line 1405 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4161,7 +4167,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 1408 "dhcp6_lexer.ll"
+#line 1414 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4173,7 +4179,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 1417 "dhcp6_lexer.ll"
+#line 1423 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4185,7 +4191,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 1426 "dhcp6_lexer.ll"
+#line 1432 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4199,7 +4205,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 1437 "dhcp6_lexer.ll"
+#line 1443 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4213,7 +4219,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 1448 "dhcp6_lexer.ll"
+#line 1454 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4227,7 +4233,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 1459 "dhcp6_lexer.ll"
+#line 1465 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4241,7 +4247,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 1470 "dhcp6_lexer.ll"
+#line 1476 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4255,7 +4261,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 1481 "dhcp6_lexer.ll"
+#line 1487 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4267,7 +4273,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 1490 "dhcp6_lexer.ll"
+#line 1496 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -4279,7 +4285,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 1499 "dhcp6_lexer.ll"
+#line 1505 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -4291,7 +4297,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 1508 "dhcp6_lexer.ll"
+#line 1514 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -4303,7 +4309,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 1517 "dhcp6_lexer.ll"
+#line 1523 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -4315,7 +4321,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 1526 "dhcp6_lexer.ll"
+#line 1532 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -4327,7 +4333,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 1535 "dhcp6_lexer.ll"
+#line 1541 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -4339,7 +4345,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 1544 "dhcp6_lexer.ll"
+#line 1550 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -4351,7 +4357,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 1553 "dhcp6_lexer.ll"
+#line 1559 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -4363,7 +4369,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 1562 "dhcp6_lexer.ll"
+#line 1568 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4376,7 +4382,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 1572 "dhcp6_lexer.ll"
+#line 1578 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -4391,7 +4397,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 149:
 YY_RULE_SETUP
-#line 1584 "dhcp6_lexer.ll"
+#line 1590 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -4407,7 +4413,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 150:
 YY_RULE_SETUP
-#line 1597 "dhcp6_lexer.ll"
+#line 1603 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CLIENT_CLASSES:
@@ -4419,7 +4425,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 1606 "dhcp6_lexer.ll"
+#line 1612 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CLIENT_CLASSES:
@@ -4431,7 +4437,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 1615 "dhcp6_lexer.ll"
+#line 1621 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4444,7 +4450,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 1625 "dhcp6_lexer.ll"
+#line 1631 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -4457,7 +4463,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 154:
 YY_RULE_SETUP
-#line 1635 "dhcp6_lexer.ll"
+#line 1641 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -4469,7 +4475,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 155:
 YY_RULE_SETUP
-#line 1644 "dhcp6_lexer.ll"
+#line 1650 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::MAC_SOURCES:
@@ -4483,7 +4489,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 156:
 YY_RULE_SETUP
-#line 1655 "dhcp6_lexer.ll"
+#line 1661 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4496,7 +4502,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 157:
 YY_RULE_SETUP
-#line 1665 "dhcp6_lexer.ll"
+#line 1671 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -4508,7 +4514,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 158:
 YY_RULE_SETUP
-#line 1674 "dhcp6_lexer.ll"
+#line 1680 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4521,7 +4527,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 159:
 YY_RULE_SETUP
-#line 1684 "dhcp6_lexer.ll"
+#line 1690 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -4534,7 +4540,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 1694 "dhcp6_lexer.ll"
+#line 1700 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -4546,7 +4552,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 161:
 YY_RULE_SETUP
-#line 1703 "dhcp6_lexer.ll"
+#line 1709 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -4558,7 +4564,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 162:
 YY_RULE_SETUP
-#line 1712 "dhcp6_lexer.ll"
+#line 1718 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -4570,7 +4576,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 163:
 YY_RULE_SETUP
-#line 1721 "dhcp6_lexer.ll"
+#line 1727 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -4582,7 +4588,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 164:
 YY_RULE_SETUP
-#line 1730 "dhcp6_lexer.ll"
+#line 1736 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -4595,7 +4601,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 165:
 YY_RULE_SETUP
-#line 1740 "dhcp6_lexer.ll"
+#line 1746 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RELAY:
@@ -4607,7 +4613,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 166:
 YY_RULE_SETUP
-#line 1749 "dhcp6_lexer.ll"
+#line 1755 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4619,7 +4625,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 167:
 YY_RULE_SETUP
-#line 1758 "dhcp6_lexer.ll"
+#line 1764 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
@@ -4631,7 +4637,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 168:
 YY_RULE_SETUP
-#line 1767 "dhcp6_lexer.ll"
+#line 1773 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
@@ -4643,7 +4649,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 169:
 YY_RULE_SETUP
-#line 1776 "dhcp6_lexer.ll"
+#line 1782 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4655,7 +4661,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 170:
 YY_RULE_SETUP
-#line 1785 "dhcp6_lexer.ll"
+#line 1791 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -4667,7 +4673,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 171:
 YY_RULE_SETUP
-#line 1794 "dhcp6_lexer.ll"
+#line 1800 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -4679,7 +4685,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 172:
 YY_RULE_SETUP
-#line 1803 "dhcp6_lexer.ll"
+#line 1809 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -4691,7 +4697,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 1812 "dhcp6_lexer.ll"
+#line 1818 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4703,7 +4709,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 174:
 YY_RULE_SETUP
-#line 1821 "dhcp6_lexer.ll"
+#line 1827 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4715,7 +4721,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 175:
 YY_RULE_SETUP
-#line 1830 "dhcp6_lexer.ll"
+#line 1836 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4727,7 +4733,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 176:
 YY_RULE_SETUP
-#line 1839 "dhcp6_lexer.ll"
+#line 1845 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4739,7 +4745,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 177:
 YY_RULE_SETUP
-#line 1848 "dhcp6_lexer.ll"
+#line 1854 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4751,7 +4757,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 178:
 YY_RULE_SETUP
-#line 1857 "dhcp6_lexer.ll"
+#line 1863 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4763,7 +4769,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 179:
 YY_RULE_SETUP
-#line 1866 "dhcp6_lexer.ll"
+#line 1872 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4775,7 +4781,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 1875 "dhcp6_lexer.ll"
+#line 1881 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4787,7 +4793,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 1884 "dhcp6_lexer.ll"
+#line 1890 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4799,7 +4805,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 182:
 YY_RULE_SETUP
-#line 1893 "dhcp6_lexer.ll"
+#line 1899 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4811,7 +4817,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 183:
 YY_RULE_SETUP
-#line 1902 "dhcp6_lexer.ll"
+#line 1908 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4823,7 +4829,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 184:
 YY_RULE_SETUP
-#line 1911 "dhcp6_lexer.ll"
+#line 1917 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4835,7 +4841,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 185:
 YY_RULE_SETUP
-#line 1920 "dhcp6_lexer.ll"
+#line 1926 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4847,7 +4853,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 186:
 YY_RULE_SETUP
-#line 1929 "dhcp6_lexer.ll"
+#line 1935 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_MULTI_THREADING:
@@ -4859,7 +4865,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 187:
 YY_RULE_SETUP
-#line 1938 "dhcp6_lexer.ll"
+#line 1944 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_MULTI_THREADING:
@@ -4871,7 +4877,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 188:
 YY_RULE_SETUP
-#line 1947 "dhcp6_lexer.ll"
+#line 1953 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_MULTI_THREADING:
@@ -4883,7 +4889,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 1956 "dhcp6_lexer.ll"
+#line 1962 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4895,7 +4901,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 1965 "dhcp6_lexer.ll"
+#line 1971 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONTROL_SOCKET:
@@ -4907,7 +4913,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 1974 "dhcp6_lexer.ll"
+#line 1980 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONTROL_SOCKET:
@@ -4919,7 +4925,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 1983 "dhcp6_lexer.ll"
+#line 1989 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4931,7 +4937,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 1992 "dhcp6_lexer.ll"
+#line 1998 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_QUEUE_CONTROL:
@@ -4943,7 +4949,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 2001 "dhcp6_lexer.ll"
+#line 2007 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_QUEUE_CONTROL:
@@ -4955,7 +4961,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 195:
 YY_RULE_SETUP
-#line 2010 "dhcp6_lexer.ll"
+#line 2016 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP_QUEUE_CONTROL:
@@ -4967,7 +4973,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 196:
 YY_RULE_SETUP
-#line 2019 "dhcp6_lexer.ll"
+#line 2025 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4979,7 +4985,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 197:
 YY_RULE_SETUP
-#line 2028 "dhcp6_lexer.ll"
+#line 2034 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4991,7 +4997,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 198:
 YY_RULE_SETUP
-#line 2037 "dhcp6_lexer.ll"
+#line 2043 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -5003,7 +5009,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 199:
 YY_RULE_SETUP
-#line 2046 "dhcp6_lexer.ll"
+#line 2052 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::COMPATIBILITY:
@@ -5015,7 +5021,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 2055 "dhcp6_lexer.ll"
+#line 2061 "dhcp6_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.
@@ -5120,7 +5126,7 @@ YY_RULE_SETUP
 case 201:
 /* rule 201 can match eol */
 YY_RULE_SETUP
-#line 2156 "dhcp6_lexer.ll"
+#line 2162 "dhcp6_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     std::string raw(yytext+1);
@@ -5140,7 +5146,7 @@ YY_RULE_SETUP
 case 202:
 /* rule 202 can match eol */
 YY_RULE_SETUP
-#line 2172 "dhcp6_lexer.ll"
+#line 2178 "dhcp6_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     std::string raw(yytext+1);
@@ -5192,7 +5198,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 203:
 YY_RULE_SETUP
-#line 2221 "dhcp6_lexer.ll"
+#line 2227 "dhcp6_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     std::string raw(yytext+1);
@@ -5203,7 +5209,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 204:
 YY_RULE_SETUP
-#line 2229 "dhcp6_lexer.ll"
+#line 2235 "dhcp6_lexer.ll"
 {
     /* Bad string with an open unicode escape at the end */
     std::string raw(yytext+1);
@@ -5221,37 +5227,37 @@ YY_RULE_SETUP
        YY_BREAK
 case 205:
 YY_RULE_SETUP
-#line 2244 "dhcp6_lexer.ll"
+#line 2250 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 206:
 YY_RULE_SETUP
-#line 2245 "dhcp6_lexer.ll"
+#line 2251 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 207:
 YY_RULE_SETUP
-#line 2246 "dhcp6_lexer.ll"
+#line 2252 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 208:
 YY_RULE_SETUP
-#line 2247 "dhcp6_lexer.ll"
+#line 2253 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 209:
 YY_RULE_SETUP
-#line 2248 "dhcp6_lexer.ll"
+#line 2254 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); }
        YY_BREAK
 case 210:
 YY_RULE_SETUP
-#line 2249 "dhcp6_lexer.ll"
+#line 2255 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); }
        YY_BREAK
 case 211:
 YY_RULE_SETUP
-#line 2251 "dhcp6_lexer.ll"
+#line 2257 "dhcp6_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -5272,7 +5278,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 212:
 YY_RULE_SETUP
-#line 2269 "dhcp6_lexer.ll"
+#line 2275 "dhcp6_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -5288,7 +5294,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 213:
 YY_RULE_SETUP
-#line 2282 "dhcp6_lexer.ll"
+#line 2288 "dhcp6_lexer.ll"
 {
     string tmp(yytext);
     return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_);
@@ -5296,33 +5302,33 @@ YY_RULE_SETUP
        YY_BREAK
 case 214:
 YY_RULE_SETUP
-#line 2287 "dhcp6_lexer.ll"
+#line 2293 "dhcp6_lexer.ll"
 {
    return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
 case 215:
 YY_RULE_SETUP
-#line 2291 "dhcp6_lexer.ll"
+#line 2297 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
 case 216:
 YY_RULE_SETUP
-#line 2293 "dhcp6_lexer.ll"
+#line 2299 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
 case 217:
 YY_RULE_SETUP
-#line 2295 "dhcp6_lexer.ll"
+#line 2301 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
 case 218:
 YY_RULE_SETUP
-#line 2297 "dhcp6_lexer.ll"
+#line 2303 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 2299 "dhcp6_lexer.ll"
+#line 2305 "dhcp6_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::dhcp::Dhcp6Parser::make_END(driver.loc_);
@@ -5348,10 +5354,10 @@ case YY_STATE_EOF(INITIAL):
        YY_BREAK
 case 219:
 YY_RULE_SETUP
-#line 2322 "dhcp6_lexer.ll"
+#line 2328 "dhcp6_lexer.ll"
 ECHO;
        YY_BREAK
-#line 5354 "dhcp6_lexer.cc"
+#line 5361 "dhcp6_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -6456,7 +6462,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 2322 "dhcp6_lexer.ll"
+#line 2328 "dhcp6_lexer.ll"
 
 
 using namespace isc::dhcp;
index a7f933d30117a7a5e00a2c00968adf7d3885a2b8..3e801b95ade786854a594f2bfa51c352cf56a79c 100644 (file)
@@ -832,6 +832,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_);
@@ -843,6 +844,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MIN_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("min-preferred-lifetime", driver.loc_);
@@ -854,6 +856,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MAX_PREFERRED_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("max-preferred-lifetime", driver.loc_);
@@ -865,6 +868,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_);
@@ -876,6 +880,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MIN_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("min-valid-lifetime", driver.loc_);
@@ -887,6 +892,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser6Context::DHCP6:
     case isc::dhcp::Parser6Context::SUBNET6:
     case isc::dhcp::Parser6Context::SHARED_NETWORK:
+    case isc::dhcp::Parser6Context::CLIENT_CLASSES:
         return isc::dhcp::Dhcp6Parser::make_MAX_VALID_LIFETIME(driver.loc_);
     default:
         return isc::dhcp::Dhcp6Parser::make_STRING("max-valid-lifetime", driver.loc_);
index 192433f2e977e6219e4ba4c05d128501f347a615..5b3b64e7459ee84545b8b2de831537bcfda011e8 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.7.6.
+// A Bison parser, made by GNU Bison 3.7.2.
 
 // Skeleton implementation for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
 #else // !PARSER6_DEBUG
 
 # define YYCDEBUG if (false) std::cerr
-# define YY_SYMBOL_PRINT(Title, Symbol)  YY_USE (Symbol)
+# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE (Symbol)
 # define YY_REDUCE_PRINT(Rule)           static_cast<void> (0)
 # define YY_STACK_PRINT()                static_cast<void> (0)
 
@@ -386,7 +386,7 @@ namespace isc { namespace dhcp {
   Dhcp6Parser::yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const
   {
     std::ostream& yyoutput = yyo;
-    YY_USE (yyoutput);
+    YYUSE (yyoutput);
     if (yysym.empty ())
       yyo << "empty symbol";
     else
@@ -3504,8 +3504,8 @@ namespace isc { namespace dhcp {
 #line 3505 "dhcp6_parser.cc"
     break;
 
-  case 645: // $@105: %empty
-#line 2279 "dhcp6_parser.yy"
+  case 651: // $@105: %empty
+#line 2285 "dhcp6_parser.yy"
                         {
     ctx.unique("test", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3513,8 +3513,8 @@ namespace isc { namespace dhcp {
 #line 3514 "dhcp6_parser.cc"
     break;
 
-  case 646: // client_class_test: "test" $@105 ":" "constant string"
-#line 2282 "dhcp6_parser.yy"
+  case 652: // client_class_test: "test" $@105 ":" "constant string"
+#line 2288 "dhcp6_parser.yy"
                {
     ElementPtr test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("test", test);
@@ -3523,8 +3523,8 @@ namespace isc { namespace dhcp {
 #line 3524 "dhcp6_parser.cc"
     break;
 
-  case 647: // only_if_required: "only-if-required" ":" "boolean"
-#line 2288 "dhcp6_parser.yy"
+  case 653: // only_if_required: "only-if-required" ":" "boolean"
+#line 2294 "dhcp6_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)));
@@ -3533,8 +3533,8 @@ namespace isc { namespace dhcp {
 #line 3534 "dhcp6_parser.cc"
     break;
 
-  case 648: // $@106: %empty
-#line 2297 "dhcp6_parser.yy"
+  case 654: // $@106: %empty
+#line 2303 "dhcp6_parser.yy"
                      {
     ctx.unique("server-id", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3545,8 +3545,8 @@ namespace isc { namespace dhcp {
 #line 3546 "dhcp6_parser.cc"
     break;
 
-  case 649: // server_id: "server-id" $@106 ":" "{" server_id_params "}"
-#line 2303 "dhcp6_parser.yy"
+  case 655: // server_id: "server-id" $@106 ":" "{" server_id_params "}"
+#line 2309 "dhcp6_parser.yy"
                                                        {
     // The type parameter is required.
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -3556,8 +3556,8 @@ namespace isc { namespace dhcp {
 #line 3557 "dhcp6_parser.cc"
     break;
 
-  case 661: // $@107: %empty
-#line 2325 "dhcp6_parser.yy"
+  case 667: // $@107: %empty
+#line 2331 "dhcp6_parser.yy"
                      {
     ctx.unique("type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.DUID_TYPE);
@@ -3565,8 +3565,8 @@ namespace isc { namespace dhcp {
 #line 3566 "dhcp6_parser.cc"
     break;
 
-  case 662: // server_id_type: "type" $@107 ":" duid_type
-#line 2328 "dhcp6_parser.yy"
+  case 668: // server_id_type: "type" $@107 ":" duid_type
+#line 2334 "dhcp6_parser.yy"
                   {
     ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -3574,26 +3574,26 @@ namespace isc { namespace dhcp {
 #line 3575 "dhcp6_parser.cc"
     break;
 
-  case 663: // duid_type: "LLT"
-#line 2333 "dhcp6_parser.yy"
+  case 669: // duid_type: "LLT"
+#line 2339 "dhcp6_parser.yy"
                { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); }
 #line 3581 "dhcp6_parser.cc"
     break;
 
-  case 664: // duid_type: "EN"
-#line 2334 "dhcp6_parser.yy"
+  case 670: // duid_type: "EN"
+#line 2340 "dhcp6_parser.yy"
               { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); }
 #line 3587 "dhcp6_parser.cc"
     break;
 
-  case 665: // duid_type: "LL"
-#line 2335 "dhcp6_parser.yy"
+  case 671: // duid_type: "LL"
+#line 2341 "dhcp6_parser.yy"
               { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); }
 #line 3593 "dhcp6_parser.cc"
     break;
 
-  case 666: // htype: "htype" ":" "integer"
-#line 2338 "dhcp6_parser.yy"
+  case 672: // htype: "htype" ":" "integer"
+#line 2344 "dhcp6_parser.yy"
                            {
     ctx.unique("htype", ctx.loc2pos(yystack_[2].location));
     ElementPtr htype(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -3602,8 +3602,8 @@ namespace isc { namespace dhcp {
 #line 3603 "dhcp6_parser.cc"
     break;
 
-  case 667: // $@108: %empty
-#line 2344 "dhcp6_parser.yy"
+  case 673: // $@108: %empty
+#line 2350 "dhcp6_parser.yy"
                        {
     ctx.unique("identifier", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3611,8 +3611,8 @@ namespace isc { namespace dhcp {
 #line 3612 "dhcp6_parser.cc"
     break;
 
-  case 668: // identifier: "identifier" $@108 ":" "constant string"
-#line 2347 "dhcp6_parser.yy"
+  case 674: // identifier: "identifier" $@108 ":" "constant string"
+#line 2353 "dhcp6_parser.yy"
                {
     ElementPtr id(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("identifier", id);
@@ -3621,8 +3621,8 @@ namespace isc { namespace dhcp {
 #line 3622 "dhcp6_parser.cc"
     break;
 
-  case 669: // time: "time" ":" "integer"
-#line 2353 "dhcp6_parser.yy"
+  case 675: // time: "time" ":" "integer"
+#line 2359 "dhcp6_parser.yy"
                          {
     ctx.unique("time", ctx.loc2pos(yystack_[2].location));
     ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -3631,8 +3631,8 @@ namespace isc { namespace dhcp {
 #line 3632 "dhcp6_parser.cc"
     break;
 
-  case 670: // enterprise_id: "enterprise-id" ":" "integer"
-#line 2359 "dhcp6_parser.yy"
+  case 676: // enterprise_id: "enterprise-id" ":" "integer"
+#line 2365 "dhcp6_parser.yy"
                                            {
     ctx.unique("enterprise-id", ctx.loc2pos(yystack_[2].location));
     ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -3641,8 +3641,8 @@ namespace isc { namespace dhcp {
 #line 3642 "dhcp6_parser.cc"
     break;
 
-  case 671: // dhcp4o6_port: "dhcp4o6-port" ":" "integer"
-#line 2367 "dhcp6_parser.yy"
+  case 677: // dhcp4o6_port: "dhcp4o6-port" ":" "integer"
+#line 2373 "dhcp6_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)));
@@ -3651,8 +3651,8 @@ namespace isc { namespace dhcp {
 #line 3652 "dhcp6_parser.cc"
     break;
 
-  case 672: // $@109: %empty
-#line 2375 "dhcp6_parser.yy"
+  case 678: // $@109: %empty
+#line 2381 "dhcp6_parser.yy"
                                {
     ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3663,8 +3663,8 @@ namespace isc { namespace dhcp {
 #line 3664 "dhcp6_parser.cc"
     break;
 
-  case 673: // control_socket: "control-socket" $@109 ":" "{" control_socket_params "}"
-#line 2381 "dhcp6_parser.yy"
+  case 679: // control_socket: "control-socket" $@109 ":" "{" control_socket_params "}"
+#line 2387 "dhcp6_parser.yy"
                                                             {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3672,8 +3672,8 @@ namespace isc { namespace dhcp {
 #line 3673 "dhcp6_parser.cc"
     break;
 
-  case 681: // $@110: %empty
-#line 2397 "dhcp6_parser.yy"
+  case 687: // $@110: %empty
+#line 2403 "dhcp6_parser.yy"
                          {
     ctx.unique("socket-type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3681,8 +3681,8 @@ namespace isc { namespace dhcp {
 #line 3682 "dhcp6_parser.cc"
     break;
 
-  case 682: // socket_type: "socket-type" $@110 ":" "constant string"
-#line 2400 "dhcp6_parser.yy"
+  case 688: // socket_type: "socket-type" $@110 ":" "constant string"
+#line 2406 "dhcp6_parser.yy"
                {
     ElementPtr stype(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-type", stype);
@@ -3691,8 +3691,8 @@ namespace isc { namespace dhcp {
 #line 3692 "dhcp6_parser.cc"
     break;
 
-  case 683: // $@111: %empty
-#line 2406 "dhcp6_parser.yy"
+  case 689: // $@111: %empty
+#line 2412 "dhcp6_parser.yy"
                          {
     ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3700,8 +3700,8 @@ namespace isc { namespace dhcp {
 #line 3701 "dhcp6_parser.cc"
     break;
 
-  case 684: // socket_name: "socket-name" $@111 ":" "constant string"
-#line 2409 "dhcp6_parser.yy"
+  case 690: // socket_name: "socket-name" $@111 ":" "constant string"
+#line 2415 "dhcp6_parser.yy"
                {
     ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
@@ -3710,8 +3710,8 @@ namespace isc { namespace dhcp {
 #line 3711 "dhcp6_parser.cc"
     break;
 
-  case 685: // $@112: %empty
-#line 2418 "dhcp6_parser.yy"
+  case 691: // $@112: %empty
+#line 2424 "dhcp6_parser.yy"
                                        {
     ctx.unique("dhcp-queue-control", ctx.loc2pos(yystack_[0].location));
     ElementPtr qc(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3722,8 +3722,8 @@ namespace isc { namespace dhcp {
 #line 3723 "dhcp6_parser.cc"
     break;
 
-  case 686: // dhcp_queue_control: "dhcp-queue-control" $@112 ":" "{" queue_control_params "}"
-#line 2424 "dhcp6_parser.yy"
+  case 692: // dhcp_queue_control: "dhcp-queue-control" $@112 ":" "{" queue_control_params "}"
+#line 2430 "dhcp6_parser.yy"
                                                            {
     // The enable queue parameter is required.
     ctx.require("enable-queue", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -3733,8 +3733,8 @@ namespace isc { namespace dhcp {
 #line 3734 "dhcp6_parser.cc"
     break;
 
-  case 695: // enable_queue: "enable-queue" ":" "boolean"
-#line 2443 "dhcp6_parser.yy"
+  case 701: // enable_queue: "enable-queue" ":" "boolean"
+#line 2449 "dhcp6_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)));
@@ -3743,8 +3743,8 @@ namespace isc { namespace dhcp {
 #line 3744 "dhcp6_parser.cc"
     break;
 
-  case 696: // $@113: %empty
-#line 2449 "dhcp6_parser.yy"
+  case 702: // $@113: %empty
+#line 2455 "dhcp6_parser.yy"
                        {
     ctx.unique("queue-type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3752,8 +3752,8 @@ namespace isc { namespace dhcp {
 #line 3753 "dhcp6_parser.cc"
     break;
 
-  case 697: // queue_type: "queue-type" $@113 ":" "constant string"
-#line 2452 "dhcp6_parser.yy"
+  case 703: // queue_type: "queue-type" $@113 ":" "constant string"
+#line 2458 "dhcp6_parser.yy"
                {
     ElementPtr qt(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("queue-type", qt);
@@ -3762,8 +3762,8 @@ namespace isc { namespace dhcp {
 #line 3763 "dhcp6_parser.cc"
     break;
 
-  case 698: // capacity: "capacity" ":" "integer"
-#line 2458 "dhcp6_parser.yy"
+  case 704: // capacity: "capacity" ":" "integer"
+#line 2464 "dhcp6_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)));
@@ -3772,8 +3772,8 @@ namespace isc { namespace dhcp {
 #line 3773 "dhcp6_parser.cc"
     break;
 
-  case 699: // $@114: %empty
-#line 2464 "dhcp6_parser.yy"
+  case 705: // $@114: %empty
+#line 2470 "dhcp6_parser.yy"
                             {
     ctx.unique(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3781,8 +3781,8 @@ namespace isc { namespace dhcp {
 #line 3782 "dhcp6_parser.cc"
     break;
 
-  case 700: // arbitrary_map_entry: "constant string" $@114 ":" value
-#line 2467 "dhcp6_parser.yy"
+  case 706: // arbitrary_map_entry: "constant string" $@114 ":" value
+#line 2473 "dhcp6_parser.yy"
               {
     ctx.stack_.back()->set(yystack_[3].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -3790,8 +3790,8 @@ namespace isc { namespace dhcp {
 #line 3791 "dhcp6_parser.cc"
     break;
 
-  case 701: // $@115: %empty
-#line 2474 "dhcp6_parser.yy"
+  case 707: // $@115: %empty
+#line 2480 "dhcp6_parser.yy"
                      {
     ctx.unique("dhcp-ddns", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3802,8 +3802,8 @@ namespace isc { namespace dhcp {
 #line 3803 "dhcp6_parser.cc"
     break;
 
-  case 702: // dhcp_ddns: "dhcp-ddns" $@115 ":" "{" dhcp_ddns_params "}"
-#line 2480 "dhcp6_parser.yy"
+  case 708: // dhcp_ddns: "dhcp-ddns" $@115 ":" "{" dhcp_ddns_params "}"
+#line 2486 "dhcp6_parser.yy"
                                                        {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -3813,8 +3813,8 @@ namespace isc { namespace dhcp {
 #line 3814 "dhcp6_parser.cc"
     break;
 
-  case 703: // $@116: %empty
-#line 2487 "dhcp6_parser.yy"
+  case 709: // $@116: %empty
+#line 2493 "dhcp6_parser.yy"
                               {
     // Parse the dhcp-ddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3823,8 +3823,8 @@ namespace isc { namespace dhcp {
 #line 3824 "dhcp6_parser.cc"
     break;
 
-  case 704: // sub_dhcp_ddns: "{" $@116 dhcp_ddns_params "}"
-#line 2491 "dhcp6_parser.yy"
+  case 710: // sub_dhcp_ddns: "{" $@116 dhcp_ddns_params "}"
+#line 2497 "dhcp6_parser.yy"
                                   {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -3833,8 +3833,8 @@ namespace isc { namespace dhcp {
 #line 3834 "dhcp6_parser.cc"
     break;
 
-  case 725: // enable_updates: "enable-updates" ":" "boolean"
-#line 2521 "dhcp6_parser.yy"
+  case 731: // enable_updates: "enable-updates" ":" "boolean"
+#line 2527 "dhcp6_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)));
@@ -3843,8 +3843,8 @@ namespace isc { namespace dhcp {
 #line 3844 "dhcp6_parser.cc"
     break;
 
-  case 726: // $@117: %empty
-#line 2528 "dhcp6_parser.yy"
+  case 732: // $@117: %empty
+#line 2534 "dhcp6_parser.yy"
                                          {
     ctx.unique("qualifying-suffix", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3852,8 +3852,8 @@ namespace isc { namespace dhcp {
 #line 3853 "dhcp6_parser.cc"
     break;
 
-  case 727: // dep_qualifying_suffix: "qualifying-suffix" $@117 ":" "constant string"
-#line 2531 "dhcp6_parser.yy"
+  case 733: // dep_qualifying_suffix: "qualifying-suffix" $@117 ":" "constant string"
+#line 2537 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("qualifying-suffix", s);
@@ -3862,8 +3862,8 @@ namespace isc { namespace dhcp {
 #line 3863 "dhcp6_parser.cc"
     break;
 
-  case 728: // $@118: %empty
-#line 2537 "dhcp6_parser.yy"
+  case 734: // $@118: %empty
+#line 2543 "dhcp6_parser.yy"
                      {
     ctx.unique("server-ip", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3871,8 +3871,8 @@ namespace isc { namespace dhcp {
 #line 3872 "dhcp6_parser.cc"
     break;
 
-  case 729: // server_ip: "server-ip" $@118 ":" "constant string"
-#line 2540 "dhcp6_parser.yy"
+  case 735: // server_ip: "server-ip" $@118 ":" "constant string"
+#line 2546 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-ip", s);
@@ -3881,8 +3881,8 @@ namespace isc { namespace dhcp {
 #line 3882 "dhcp6_parser.cc"
     break;
 
-  case 730: // server_port: "server-port" ":" "integer"
-#line 2546 "dhcp6_parser.yy"
+  case 736: // server_port: "server-port" ":" "integer"
+#line 2552 "dhcp6_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)));
@@ -3891,8 +3891,8 @@ namespace isc { namespace dhcp {
 #line 3892 "dhcp6_parser.cc"
     break;
 
-  case 731: // $@119: %empty
-#line 2552 "dhcp6_parser.yy"
+  case 737: // $@119: %empty
+#line 2558 "dhcp6_parser.yy"
                      {
     ctx.unique("sender-ip", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3900,8 +3900,8 @@ namespace isc { namespace dhcp {
 #line 3901 "dhcp6_parser.cc"
     break;
 
-  case 732: // sender_ip: "sender-ip" $@119 ":" "constant string"
-#line 2555 "dhcp6_parser.yy"
+  case 738: // sender_ip: "sender-ip" $@119 ":" "constant string"
+#line 2561 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-ip", s);
@@ -3910,8 +3910,8 @@ namespace isc { namespace dhcp {
 #line 3911 "dhcp6_parser.cc"
     break;
 
-  case 733: // sender_port: "sender-port" ":" "integer"
-#line 2561 "dhcp6_parser.yy"
+  case 739: // sender_port: "sender-port" ":" "integer"
+#line 2567 "dhcp6_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)));
@@ -3920,8 +3920,8 @@ namespace isc { namespace dhcp {
 #line 3921 "dhcp6_parser.cc"
     break;
 
-  case 734: // max_queue_size: "max-queue-size" ":" "integer"
-#line 2567 "dhcp6_parser.yy"
+  case 740: // max_queue_size: "max-queue-size" ":" "integer"
+#line 2573 "dhcp6_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)));
@@ -3930,8 +3930,8 @@ namespace isc { namespace dhcp {
 #line 3931 "dhcp6_parser.cc"
     break;
 
-  case 735: // $@120: %empty
-#line 2573 "dhcp6_parser.yy"
+  case 741: // $@120: %empty
+#line 2579 "dhcp6_parser.yy"
                            {
     ctx.unique("ncr-protocol", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_PROTOCOL);
@@ -3939,8 +3939,8 @@ namespace isc { namespace dhcp {
 #line 3940 "dhcp6_parser.cc"
     break;
 
-  case 736: // ncr_protocol: "ncr-protocol" $@120 ":" ncr_protocol_value
-#line 2576 "dhcp6_parser.yy"
+  case 742: // ncr_protocol: "ncr-protocol" $@120 ":" ncr_protocol_value
+#line 2582 "dhcp6_parser.yy"
                            {
     ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -3948,20 +3948,20 @@ namespace isc { namespace dhcp {
 #line 3949 "dhcp6_parser.cc"
     break;
 
-  case 737: // ncr_protocol_value: "UDP"
-#line 2582 "dhcp6_parser.yy"
+  case 743: // ncr_protocol_value: "UDP"
+#line 2588 "dhcp6_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
 #line 3955 "dhcp6_parser.cc"
     break;
 
-  case 738: // ncr_protocol_value: "TCP"
-#line 2583 "dhcp6_parser.yy"
+  case 744: // ncr_protocol_value: "TCP"
+#line 2589 "dhcp6_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
 #line 3961 "dhcp6_parser.cc"
     break;
 
-  case 739: // $@121: %empty
-#line 2586 "dhcp6_parser.yy"
+  case 745: // $@121: %empty
+#line 2592 "dhcp6_parser.yy"
                        {
     ctx.unique("ncr-format", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_FORMAT);
@@ -3969,8 +3969,8 @@ namespace isc { namespace dhcp {
 #line 3970 "dhcp6_parser.cc"
     break;
 
-  case 740: // ncr_format: "ncr-format" $@121 ":" "JSON"
-#line 2589 "dhcp6_parser.yy"
+  case 746: // ncr_format: "ncr-format" $@121 ":" "JSON"
+#line 2595 "dhcp6_parser.yy"
              {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
@@ -3979,8 +3979,8 @@ namespace isc { namespace dhcp {
 #line 3980 "dhcp6_parser.cc"
     break;
 
-  case 741: // dep_override_no_update: "override-no-update" ":" "boolean"
-#line 2596 "dhcp6_parser.yy"
+  case 747: // dep_override_no_update: "override-no-update" ":" "boolean"
+#line 2602 "dhcp6_parser.yy"
                                                          {
     ctx.unique("override-no-update", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -3989,8 +3989,8 @@ namespace isc { namespace dhcp {
 #line 3990 "dhcp6_parser.cc"
     break;
 
-  case 742: // dep_override_client_update: "override-client-update" ":" "boolean"
-#line 2603 "dhcp6_parser.yy"
+  case 748: // dep_override_client_update: "override-client-update" ":" "boolean"
+#line 2609 "dhcp6_parser.yy"
                                                                  {
     ctx.unique("override-client-update", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -3999,8 +3999,8 @@ namespace isc { namespace dhcp {
 #line 4000 "dhcp6_parser.cc"
     break;
 
-  case 743: // $@122: %empty
-#line 2610 "dhcp6_parser.yy"
+  case 749: // $@122: %empty
+#line 2616 "dhcp6_parser.yy"
                                              {
     ctx.unique("replace-client-name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.REPLACE_CLIENT_NAME);
@@ -4008,8 +4008,8 @@ namespace isc { namespace dhcp {
 #line 4009 "dhcp6_parser.cc"
     break;
 
-  case 744: // dep_replace_client_name: "replace-client-name" $@122 ":" ddns_replace_client_name_value
-#line 2613 "dhcp6_parser.yy"
+  case 750: // dep_replace_client_name: "replace-client-name" $@122 ":" ddns_replace_client_name_value
+#line 2619 "dhcp6_parser.yy"
                                        {
     ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -4017,8 +4017,8 @@ namespace isc { namespace dhcp {
 #line 4018 "dhcp6_parser.cc"
     break;
 
-  case 745: // $@123: %empty
-#line 2619 "dhcp6_parser.yy"
+  case 751: // $@123: %empty
+#line 2625 "dhcp6_parser.yy"
                                        {
     ctx.unique("generated-prefix", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4026,8 +4026,8 @@ namespace isc { namespace dhcp {
 #line 4027 "dhcp6_parser.cc"
     break;
 
-  case 746: // dep_generated_prefix: "generated-prefix" $@123 ":" "constant string"
-#line 2622 "dhcp6_parser.yy"
+  case 752: // dep_generated_prefix: "generated-prefix" $@123 ":" "constant string"
+#line 2628 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("generated-prefix", s);
@@ -4036,8 +4036,8 @@ namespace isc { namespace dhcp {
 #line 4037 "dhcp6_parser.cc"
     break;
 
-  case 747: // $@124: %empty
-#line 2629 "dhcp6_parser.yy"
+  case 753: // $@124: %empty
+#line 2635 "dhcp6_parser.yy"
                                          {
     ctx.unique("hostname-char-set", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4045,8 +4045,8 @@ namespace isc { namespace dhcp {
 #line 4046 "dhcp6_parser.cc"
     break;
 
-  case 748: // dep_hostname_char_set: "hostname-char-set" $@124 ":" "constant string"
-#line 2632 "dhcp6_parser.yy"
+  case 754: // dep_hostname_char_set: "hostname-char-set" $@124 ":" "constant string"
+#line 2638 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-set", s);
@@ -4055,8 +4055,8 @@ namespace isc { namespace dhcp {
 #line 4056 "dhcp6_parser.cc"
     break;
 
-  case 749: // $@125: %empty
-#line 2639 "dhcp6_parser.yy"
+  case 755: // $@125: %empty
+#line 2645 "dhcp6_parser.yy"
                                                          {
     ctx.unique("hostname-char-replacement", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4064,8 +4064,8 @@ namespace isc { namespace dhcp {
 #line 4065 "dhcp6_parser.cc"
     break;
 
-  case 750: // dep_hostname_char_replacement: "hostname-char-replacement" $@125 ":" "constant string"
-#line 2642 "dhcp6_parser.yy"
+  case 756: // dep_hostname_char_replacement: "hostname-char-replacement" $@125 ":" "constant string"
+#line 2648 "dhcp6_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-replacement", s);
@@ -4074,8 +4074,8 @@ namespace isc { namespace dhcp {
 #line 4075 "dhcp6_parser.cc"
     break;
 
-  case 751: // $@126: %empty
-#line 2651 "dhcp6_parser.yy"
+  case 757: // $@126: %empty
+#line 2657 "dhcp6_parser.yy"
                                {
     ctx.unique("config-control", ctx.loc2pos(yystack_[0].location));
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4086,8 +4086,8 @@ namespace isc { namespace dhcp {
 #line 4087 "dhcp6_parser.cc"
     break;
 
-  case 752: // config_control: "config-control" $@126 ":" "{" config_control_params "}"
-#line 2657 "dhcp6_parser.yy"
+  case 758: // config_control: "config-control" $@126 ":" "{" config_control_params "}"
+#line 2663 "dhcp6_parser.yy"
                                                             {
     // No config control params are required
     ctx.stack_.pop_back();
@@ -4096,8 +4096,8 @@ namespace isc { namespace dhcp {
 #line 4097 "dhcp6_parser.cc"
     break;
 
-  case 753: // $@127: %empty
-#line 2663 "dhcp6_parser.yy"
+  case 759: // $@127: %empty
+#line 2669 "dhcp6_parser.yy"
                                    {
     // Parse the config-control map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4106,8 +4106,8 @@ namespace isc { namespace dhcp {
 #line 4107 "dhcp6_parser.cc"
     break;
 
-  case 754: // sub_config_control: "{" $@127 config_control_params "}"
-#line 2667 "dhcp6_parser.yy"
+  case 760: // sub_config_control: "{" $@127 config_control_params "}"
+#line 2673 "dhcp6_parser.yy"
                                        {
     // No config_control params are required
     // parsing completed
@@ -4115,8 +4115,8 @@ namespace isc { namespace dhcp {
 #line 4116 "dhcp6_parser.cc"
     break;
 
-  case 759: // $@128: %empty
-#line 2682 "dhcp6_parser.yy"
+  case 765: // $@128: %empty
+#line 2688 "dhcp6_parser.yy"
                                    {
     ctx.unique("config-databases", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4127,8 +4127,8 @@ namespace isc { namespace dhcp {
 #line 4128 "dhcp6_parser.cc"
     break;
 
-  case 760: // config_databases: "config-databases" $@128 ":" "[" database_list "]"
-#line 2688 "dhcp6_parser.yy"
+  case 766: // config_databases: "config-databases" $@128 ":" "[" database_list "]"
+#line 2694 "dhcp6_parser.yy"
                                                       {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4136,8 +4136,8 @@ namespace isc { namespace dhcp {
 #line 4137 "dhcp6_parser.cc"
     break;
 
-  case 761: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer"
-#line 2693 "dhcp6_parser.yy"
+  case 767: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer"
+#line 2699 "dhcp6_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)));
@@ -4146,8 +4146,8 @@ namespace isc { namespace dhcp {
 #line 4147 "dhcp6_parser.cc"
     break;
 
-  case 762: // $@129: %empty
-#line 2701 "dhcp6_parser.yy"
+  case 768: // $@129: %empty
+#line 2707 "dhcp6_parser.yy"
                  {
     ctx.unique("loggers", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4158,8 +4158,8 @@ namespace isc { namespace dhcp {
 #line 4159 "dhcp6_parser.cc"
     break;
 
-  case 763: // loggers: "loggers" $@129 ":" "[" loggers_entries "]"
-#line 2707 "dhcp6_parser.yy"
+  case 769: // loggers: "loggers" $@129 ":" "[" loggers_entries "]"
+#line 2713 "dhcp6_parser.yy"
                                                          {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4167,8 +4167,8 @@ namespace isc { namespace dhcp {
 #line 4168 "dhcp6_parser.cc"
     break;
 
-  case 766: // $@130: %empty
-#line 2719 "dhcp6_parser.yy"
+  case 772: // $@130: %empty
+#line 2725 "dhcp6_parser.yy"
                              {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
@@ -4177,16 +4177,16 @@ namespace isc { namespace dhcp {
 #line 4178 "dhcp6_parser.cc"
     break;
 
-  case 767: // logger_entry: "{" $@130 logger_params "}"
-#line 2723 "dhcp6_parser.yy"
+  case 773: // logger_entry: "{" $@130 logger_params "}"
+#line 2729 "dhcp6_parser.yy"
                                {
     ctx.stack_.pop_back();
 }
 #line 4186 "dhcp6_parser.cc"
     break;
 
-  case 777: // debuglevel: "debuglevel" ":" "integer"
-#line 2740 "dhcp6_parser.yy"
+  case 783: // debuglevel: "debuglevel" ":" "integer"
+#line 2746 "dhcp6_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)));
@@ -4195,8 +4195,8 @@ namespace isc { namespace dhcp {
 #line 4196 "dhcp6_parser.cc"
     break;
 
-  case 778: // $@131: %empty
-#line 2746 "dhcp6_parser.yy"
+  case 784: // $@131: %empty
+#line 2752 "dhcp6_parser.yy"
                    {
     ctx.unique("severity", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4204,8 +4204,8 @@ namespace isc { namespace dhcp {
 #line 4205 "dhcp6_parser.cc"
     break;
 
-  case 779: // severity: "severity" $@131 ":" "constant string"
-#line 2749 "dhcp6_parser.yy"
+  case 785: // severity: "severity" $@131 ":" "constant string"
+#line 2755 "dhcp6_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
@@ -4214,8 +4214,8 @@ namespace isc { namespace dhcp {
 #line 4215 "dhcp6_parser.cc"
     break;
 
-  case 780: // $@132: %empty
-#line 2755 "dhcp6_parser.yy"
+  case 786: // $@132: %empty
+#line 2761 "dhcp6_parser.yy"
                                     {
     ctx.unique("output_options", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4226,8 +4226,8 @@ namespace isc { namespace dhcp {
 #line 4227 "dhcp6_parser.cc"
     break;
 
-  case 781: // output_options_list: "output_options" $@132 ":" "[" output_options_list_content "]"
-#line 2761 "dhcp6_parser.yy"
+  case 787: // output_options_list: "output_options" $@132 ":" "[" output_options_list_content "]"
+#line 2767 "dhcp6_parser.yy"
                                                                     {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4235,8 +4235,8 @@ namespace isc { namespace dhcp {
 #line 4236 "dhcp6_parser.cc"
     break;
 
-  case 784: // $@133: %empty
-#line 2770 "dhcp6_parser.yy"
+  case 790: // $@133: %empty
+#line 2776 "dhcp6_parser.yy"
                              {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -4245,16 +4245,16 @@ namespace isc { namespace dhcp {
 #line 4246 "dhcp6_parser.cc"
     break;
 
-  case 785: // output_entry: "{" $@133 output_params_list "}"
-#line 2774 "dhcp6_parser.yy"
+  case 791: // output_entry: "{" $@133 output_params_list "}"
+#line 2780 "dhcp6_parser.yy"
                                     {
     ctx.stack_.pop_back();
 }
 #line 4254 "dhcp6_parser.cc"
     break;
 
-  case 793: // $@134: %empty
-#line 2789 "dhcp6_parser.yy"
+  case 799: // $@134: %empty
+#line 2795 "dhcp6_parser.yy"
                {
     ctx.unique("output", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4262,8 +4262,8 @@ namespace isc { namespace dhcp {
 #line 4263 "dhcp6_parser.cc"
     break;
 
-  case 794: // output: "output" $@134 ":" "constant string"
-#line 2792 "dhcp6_parser.yy"
+  case 800: // output: "output" $@134 ":" "constant string"
+#line 2798 "dhcp6_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
@@ -4272,8 +4272,8 @@ namespace isc { namespace dhcp {
 #line 4273 "dhcp6_parser.cc"
     break;
 
-  case 795: // flush: "flush" ":" "boolean"
-#line 2798 "dhcp6_parser.yy"
+  case 801: // flush: "flush" ":" "boolean"
+#line 2804 "dhcp6_parser.yy"
                            {
     ctx.unique("flush", ctx.loc2pos(yystack_[2].location));
     ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4282,8 +4282,8 @@ namespace isc { namespace dhcp {
 #line 4283 "dhcp6_parser.cc"
     break;
 
-  case 796: // maxsize: "maxsize" ":" "integer"
-#line 2804 "dhcp6_parser.yy"
+  case 802: // maxsize: "maxsize" ":" "integer"
+#line 2810 "dhcp6_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)));
@@ -4292,8 +4292,8 @@ namespace isc { namespace dhcp {
 #line 4293 "dhcp6_parser.cc"
     break;
 
-  case 797: // maxver: "maxver" ":" "integer"
-#line 2810 "dhcp6_parser.yy"
+  case 803: // maxver: "maxver" ":" "integer"
+#line 2816 "dhcp6_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)));
@@ -4302,8 +4302,8 @@ namespace isc { namespace dhcp {
 #line 4303 "dhcp6_parser.cc"
     break;
 
-  case 798: // $@135: %empty
-#line 2816 "dhcp6_parser.yy"
+  case 804: // $@135: %empty
+#line 2822 "dhcp6_parser.yy"
                  {
     ctx.unique("pattern", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4311,8 +4311,8 @@ namespace isc { namespace dhcp {
 #line 4312 "dhcp6_parser.cc"
     break;
 
-  case 799: // pattern: "pattern" $@135 ":" "constant string"
-#line 2819 "dhcp6_parser.yy"
+  case 805: // pattern: "pattern" $@135 ":" "constant string"
+#line 2825 "dhcp6_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pattern", sev);
@@ -4321,8 +4321,8 @@ namespace isc { namespace dhcp {
 #line 4322 "dhcp6_parser.cc"
     break;
 
-  case 800: // $@136: %empty
-#line 2825 "dhcp6_parser.yy"
+  case 806: // $@136: %empty
+#line 2831 "dhcp6_parser.yy"
                              {
     ctx.unique("compatibility", ctx.loc2pos(yystack_[0].location));
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4333,8 +4333,8 @@ namespace isc { namespace dhcp {
 #line 4334 "dhcp6_parser.cc"
     break;
 
-  case 801: // compatibility: "compatibility" $@136 ":" "{" compatibility_params "}"
-#line 2831 "dhcp6_parser.yy"
+  case 807: // compatibility: "compatibility" $@136 ":" "{" compatibility_params "}"
+#line 2837 "dhcp6_parser.yy"
                                                            {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4342,8 +4342,8 @@ namespace isc { namespace dhcp {
 #line 4343 "dhcp6_parser.cc"
     break;
 
-  case 806: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean"
-#line 2844 "dhcp6_parser.yy"
+  case 812: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean"
+#line 2850 "dhcp6_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)));
@@ -4702,144 +4702,145 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short Dhcp6Parser::yypact_ninf_ = -977;
+  const short Dhcp6Parser::yypact_ninf_ = -979;
 
   const signed char Dhcp6Parser::yytable_ninf_ = -1;
 
   const short
   Dhcp6Parser::yypact_[] =
   {
-     407,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,    48,    30,    31,    83,    97,
-     101,   107,   115,   117,   125,   137,   149,   159,   175,   220,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,    30,  -149,
-      60,   140,    66,   641,   187,   284,    24,   162,    88,   286,
-     -78,   419,   156,  -977,    59,   251,   252,   256,   264,  -977,
-     269,  -977,  -977,  -977,  -977,  -977,  -977,   274,   287,   297,
-     300,   310,   311,   320,   327,   342,   343,   357,   358,   369,
-     379,  -977,   380,   386,   398,   400,   401,  -977,  -977,  -977,
-     402,   413,   429,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-     437,   438,   439,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,   443,  -977,  -977,  -977,  -977,  -977,  -977,   445,
-    -977,  -977,   447,  -977,    91,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,   455,  -977,
-     113,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,   457,   459,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,   173,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   225,  -977,  -977,  -977,
-    -977,  -977,   461,  -977,   462,   463,  -977,  -977,  -977,  -977,
-    -977,  -977,   262,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-     282,   291,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-     305,  -977,  -977,   467,  -977,  -977,  -977,   468,  -977,  -977,
-     408,   423,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,   469,   473,  -977,  -977,  -977,
-    -977,   428,   480,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,   263,  -977,  -977,  -977,   483,
-    -977,  -977,   484,  -977,   487,   493,  -977,  -977,   494,   495,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,   265,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,   496,   277,  -977,  -977,  -977,
-    -977,    30,    30,  -977,   276,   498,  -977,   500,   502,   503,
-     506,   507,   513,   313,   317,   321,   323,   324,   326,   331,
-     332,   307,   334,   336,   337,   341,   344,   516,   345,   347,
-     340,   351,   353,   527,   530,   532,   354,   355,   359,   548,
-     554,   564,   565,   568,   569,   570,   364,   365,   366,   588,
-     589,   590,   591,   592,   593,   594,   611,   612,   409,   613,
-     615,   616,   617,   618,   619,   414,   620,   624,  -977,   140,
-    -977,   626,   425,    66,  -977,   627,   628,   629,   630,   631,
-     430,   426,   634,   636,   637,   641,  -977,   638,   187,  -977,
-     639,   435,   642,   440,   441,   284,  -977,   643,   644,   647,
-     648,   649,   650,   651,  -977,    24,  -977,   652,   653,   449,
-     655,   656,   657,   454,  -977,    88,   663,   458,   460,  -977,
-     286,   664,   668,    23,  -977,   464,   669,   670,   474,   672,
-     475,   476,   673,   683,   491,   492,   700,   701,   711,   712,
-     419,  -977,   714,   510,   156,  -977,  -977,  -977,   716,   719,
-     519,   722,   724,   725,   726,   729,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-     536,  -977,  -977,  -977,  -977,  -977,   -36,   537,   538,  -977,
-    -977,  -977,   730,   742,   746,   747,   748,   545,   266,  -977,
-    -977,  -977,   749,   751,   753,   752,   757,   758,   759,   760,
-     762,  -977,   763,   764,   765,   766,   557,   558,  -977,   769,
-     768,  -977,   771,  -977,  -977,   772,   773,   571,   572,   573,
-    -977,  -977,   771,   574,   776,  -977,   576,  -977,   577,  -977,
-     578,  -977,  -977,  -977,   771,   771,   771,   595,   606,   609,
-     610,  -977,   621,   622,  -977,   623,   625,   635,  -977,  -977,
-     645,  -977,  -977,  -977,   646,   748,  -977,  -977,   654,   659,
-    -977,   660,  -977,  -977,    12,   661,  -977,  -977,   -36,   662,
-     665,   666,  -977,   795,  -977,  -977,    30,   140,  -977,   156,
-      66,   308,   308,   794,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   812,   813,   816,   817,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,   -82,    30,    10,   688,   818,
-     819,   820,    87,   213,    68,   -51,   231,   419,  -977,  -977,
-     821,  -136,  -977,  -977,   825,   832,  -977,  -977,  -977,  -977,
-    -977,   -70,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,   794,  -977,   278,   281,   290,  -977,  -977,  -977,  -977,
-     838,   840,   841,   846,   847,  -977,   848,   852,  -977,  -977,
-    -977,  -977,   853,   855,   856,   857,  -977,   294,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-     302,  -977,   858,   860,  -977,  -977,   859,   866,  -977,  -977,
-     865,   869,  -977,  -977,   870,   872,  -977,  -977,   871,   875,
-    -977,  -977,  -977,    65,  -977,  -977,  -977,   873,  -977,  -977,
-    -977,    78,  -977,  -977,  -977,  -977,   309,  -977,  -977,  -977,
-      85,  -977,  -977,   874,   878,  -977,  -977,   876,   880,  -977,
-     881,   882,   883,   884,   885,   886,   322,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   887,   888,   889,  -977,
-    -977,  -977,  -977,   325,  -977,  -977,  -977,  -977,  -977,  -977,
-     890,   891,   892,  -977,   383,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   389,  -977,  -977,  -977,
-     893,  -977,   894,  -977,  -977,  -977,   390,  -977,  -977,  -977,
-    -977,  -977,   391,  -977,    95,  -977,   895,  -977,   393,  -977,
-    -977,   676,  -977,   896,   897,  -977,  -977,   898,   900,  -977,
-    -977,  -977,   899,  -977,   902,  -977,  -977,  -977,   901,   905,
-     906,   907,   692,   695,   703,   702,   705,   911,   707,   708,
-     914,   917,   918,   920,   718,   721,   717,   732,   308,  -977,
-    -977,   308,  -977,   794,   641,  -977,   812,    88,  -977,   813,
-     286,  -977,   816,   739,  -977,   817,   -82,  -977,  -977,    10,
-    -977,   921,   688,  -977,   -21,   818,  -977,    24,  -977,   819,
-     -78,  -977,   820,   741,   744,   745,   770,   780,   784,    87,
-    -977,   927,   929,   785,   792,   803,   213,  -977,   723,   806,
-     808,    68,  -977,   934,   952,   -51,  -977,   767,  1000,   811,
-    1026,   231,  -977,  -977,   223,   821,  -977,   834,  -136,  -977,
-    -977,  1054,  1059,   187,  -977,   825,   284,  -977,   832,  1060,
-    -977,  -977,   433,   861,   863,   864,  -977,  -977,  -977,  -977,
-    -977,   867,  -977,  -977,   191,   868,   877,   879,  -977,  -977,
-    -977,  -977,  -977,   405,  -977,   411,  -977,  1055,  -977,  1065,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,   412,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   903,  -977,  -977,  1064,
-    -977,  -977,  -977,  -977,  -977,  1066,  1074,  -977,  -977,  -977,
-    -977,  -977,  1070,  -977,   420,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   104,   904,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   908,   909,  -977,  -977,   910,  -977,    30,
-    -977,  -977,  1075,  -977,  -977,  -977,  -977,  -977,   421,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,   912,   422,  -977,
-     424,  -977,   913,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   739,  -977,  -977,  1076,   916,  -977,   -21,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  1077,   915,  1078,   223,  -977,  -977,  -977,  -977,  -977,
-    -977,   922,  -977,  -977,  1079,  -977,   923,  -977,  -977,  1081,
-    -977,  -977,   109,  -977,   -11,  1081,  -977,  -977,  1082,  1085,
-    1086,  -977,   432,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    1087,   924,   919,   925,  1088,   -11,  -977,   928,  -977,  -977,
-    -977,   930,  -977,  -977,  -977
+     452,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,    91,    30,   101,   102,   108,
+     111,   117,   119,   137,   139,   156,   166,   178,   210,   223,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,    30,   -68,
+     176,   140,    24,   641,   -44,   190,   251,   159,    17,    88,
+     -47,   431,    44,  -979,   231,   228,   255,   254,   268,  -979,
+     266,  -979,  -979,  -979,  -979,  -979,  -979,   274,   287,   312,
+     352,   353,   360,   366,   367,   380,   396,   397,   409,   412,
+     413,  -979,   416,   417,   425,   432,   437,  -979,  -979,  -979,
+     439,   443,   444,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+     445,   447,   448,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,   454,  -979,  -979,  -979,  -979,  -979,  -979,   457,
+    -979,  -979,   459,  -979,    68,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   461,  -979,
+      87,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,   462,   463,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,   130,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   133,  -979,  -979,  -979,
+    -979,  -979,   464,  -979,   467,   468,  -979,  -979,  -979,  -979,
+    -979,  -979,   168,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+     282,   321,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+     303,  -979,  -979,   478,  -979,  -979,  -979,   479,  -979,  -979,
+     427,   481,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,   482,   483,  -979,  -979,  -979,
+    -979,   480,   489,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,   169,  -979,  -979,  -979,   490,
+    -979,  -979,   493,  -979,   494,   495,  -979,  -979,   496,   497,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,   179,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,   498,   215,  -979,  -979,  -979,
+    -979,    30,    30,  -979,   296,   502,  -979,   503,   504,   506,
+     507,   510,   511,   311,   313,   324,   326,   327,   328,   331,
+     332,   319,   334,   335,   337,   340,   341,   527,   342,   343,
+     344,   345,   347,   528,   530,   549,   351,   354,   355,   559,
+     564,   565,   566,   568,   569,   572,   368,   369,   371,   574,
+     580,   581,   582,   583,   585,   600,   601,   602,   398,   604,
+     605,   606,   609,   610,   611,   405,   613,   614,  -979,   140,
+    -979,   615,   410,    24,  -979,   616,   618,   619,   620,   621,
+     418,   419,   624,   627,   628,   641,  -979,   629,   -44,  -979,
+     630,   426,   632,   428,   429,   190,  -979,   636,   637,   638,
+     639,   640,   656,   657,  -979,   251,  -979,   661,   663,   460,
+     664,   667,   668,   465,  -979,    17,   669,   466,   472,  -979,
+      88,   670,   671,   -49,  -979,   473,   681,   683,   509,   698,
+     517,   518,   699,   700,   505,   508,   701,   711,   716,   725,
+     431,  -979,   727,   523,    44,  -979,  -979,  -979,   730,   726,
+     536,   728,   738,   739,   740,   746,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+     544,  -979,  -979,  -979,  -979,  -979,    43,   545,   546,  -979,
+    -979,  -979,   750,   751,   753,   754,   755,   555,   320,  -979,
+    -979,  -979,   759,   760,   761,   762,   765,   766,   767,   768,
+     769,  -979,   783,   784,   785,   786,   596,   599,  -979,   803,
+     802,  -979,   805,  -979,  -979,   806,   807,   607,   608,   612,
+    -979,  -979,   805,   625,   810,  -979,   626,  -979,   631,  -979,
+     633,  -979,  -979,  -979,   805,   805,   805,   634,   635,   642,
+     643,  -979,   644,   645,  -979,   646,   647,   649,  -979,  -979,
+     650,  -979,  -979,  -979,   651,   755,  -979,  -979,   652,   653,
+    -979,   654,  -979,  -979,   -75,   592,  -979,  -979,    43,   655,
+     658,   659,  -979,   808,  -979,  -979,    30,   140,  -979,    44,
+      24,   308,   308,   811,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,   812,   816,   819,   822,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,   -87,    30,   316,   660,   825,
+     828,   833,   245,    35,   -46,    21,   161,   431,  -979,  -979,
+     837,  -140,  -979,  -979,   839,   840,  -979,  -979,  -979,  -979,
+    -979,   -73,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,   811,  -979,   225,   265,   267,  -979,  -979,  -979,  -979,
+     860,   861,   864,   865,   866,  -979,   867,   868,  -979,  -979,
+    -979,  -979,   869,   870,   871,   872,  -979,   286,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+     290,  -979,   873,   770,  -979,  -979,   874,   875,  -979,  -979,
+     876,   878,  -979,  -979,   877,   881,  -979,  -979,   879,   883,
+    -979,  -979,  -979,    67,  -979,  -979,  -979,   882,  -979,  -979,
+    -979,   131,  -979,  -979,  -979,  -979,   304,  -979,  -979,  -979,
+     150,  -979,  -979,   884,   886,  -979,  -979,   885,   889,  -979,
+     890,   891,   892,   893,   894,   895,   305,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   896,   897,   898,  -979,
+    -979,  -979,  -979,   307,  -979,  -979,  -979,  -979,  -979,  -979,
+     899,   900,   901,  -979,   322,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   323,  -979,  -979,  -979,
+     902,  -979,   903,  -979,  -979,  -979,   325,  -979,  -979,  -979,
+    -979,  -979,   385,  -979,   151,  -979,   904,  -979,   387,  -979,
+    -979,   679,  -979,   887,   908,  -979,  -979,   906,   910,  -979,
+    -979,  -979,   907,  -979,   911,  -979,  -979,  -979,   912,   914,
+     915,   916,   705,   603,   712,   666,   713,   920,   718,   719,
+     921,   926,   927,   934,   731,   732,   736,   741,   308,  -979,
+    -979,   308,  -979,   811,   641,  -979,   812,    17,  -979,   816,
+      88,  -979,   819,   729,  -979,   822,   -87,  -979,  -979,   316,
+    -979,   949,   660,  -979,   310,   825,  -979,   251,  -979,   828,
+     -47,  -979,   833,   745,   747,   748,   752,   775,   788,   245,
+    -979,   974,   975,   792,   794,   795,    35,  -979,   782,   829,
+     836,   -46,  -979,   990,  1008,    21,  -979,   809,  1012,   852,
+    1013,   161,  -979,  -979,   181,   837,  -979,   814,  -140,  -979,
+    -979,  1062,  1068,   -44,  -979,   839,   190,  -979,   840,  1070,
+    -979,  -979,   408,   880,   888,   905,  -979,  -979,  -979,  -979,
+    -979,   909,  -979,  -979,   206,   913,   917,   918,  -979,  -979,
+    -979,  -979,  -979,   388,  -979,   389,  -979,  1069,  -979,  1071,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,   391,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   919,  -979,  -979,  1076,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  1073,  1079,  -979,  -979,  -979,  -979,  -979,  1075,  -979,
+     399,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   315,
+     922,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   923,
+     924,  -979,  -979,   925,  -979,    30,  -979,  -979,  1080,  -979,
+    -979,  -979,  -979,  -979,   400,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,   929,   401,  -979,   407,  -979,   932,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   729,
+    -979,  -979,  1081,   931,  -979,   310,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  1082,   935,  1083,
+     181,  -979,  -979,  -979,  -979,  -979,  -979,   937,  -979,  -979,
+    1084,  -979,   938,  -979,  -979,  1085,  -979,  -979,   221,  -979,
+     112,  1085,  -979,  -979,  1086,  1087,  1089,  -979,   411,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  1090,   936,   939,   940,
+    1091,   112,  -979,   942,  -979,  -979,  -979,   943,  -979,  -979,
+    -979
   };
 
   const short
@@ -4851,16 +4852,16 @@ namespace isc { namespace dhcp {
        1,    45,    38,    34,    33,    30,    31,    32,    37,     3,
       35,    36,    58,     5,    62,     7,   172,     9,   340,    11,
      535,    13,   560,    15,   590,    17,   460,    19,   468,    21,
-     505,    23,   305,    25,   703,    27,   753,    29,    47,    41,
+     505,    23,   305,    25,   709,    27,   759,    29,    47,    41,
        0,     0,     0,     0,     0,     0,   592,     0,   470,   507,
        0,     0,     0,    49,     0,    48,     0,     0,    42,    60,
-       0,   128,   751,   170,   184,   186,   188,     0,     0,     0,
+       0,   128,   757,   170,   184,   186,   188,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,   167,     0,     0,     0,     0,     0,   147,   154,   156,
        0,     0,     0,   332,   458,   497,   408,   548,   550,   400,
        0,     0,     0,   265,   282,   273,   258,   627,   582,   297,
-     316,   648,     0,   284,   672,   685,   701,   160,   162,     0,
-     762,   800,     0,   127,     0,    64,    66,    67,    68,    69,
+     316,   654,     0,   284,   678,   691,   707,   160,   162,     0,
+     768,   806,     0,   127,     0,    64,    66,    67,    68,    69,
       70,    71,    72,    73,    74,   105,   106,   107,   108,   109,
       75,   113,   114,   115,   116,   117,   118,   119,   120,   111,
      112,   121,   122,   123,   100,   125,    78,    79,    80,    81,
@@ -4883,10 +4884,10 @@ namespace isc { namespace dhcp {
      479,   480,   481,   482,   521,     0,     0,   519,   520,   523,
      524,     0,   508,   509,   511,   512,   513,   514,   515,   516,
      517,   518,   312,   314,   309,     0,   307,   310,   311,     0,
-     726,   728,     0,   731,     0,     0,   735,   739,     0,     0,
-     743,   745,   747,   749,   724,   722,   723,     0,   705,   707,
-     719,   708,   709,   710,   711,   712,   713,   714,   715,   716,
-     717,   718,   720,   721,   759,     0,     0,   755,   757,   758,
+     732,   734,     0,   737,     0,     0,   741,   745,     0,     0,
+     749,   751,   753,   755,   730,   728,   729,     0,   711,   713,
+     725,   714,   715,   716,   717,   718,   719,   720,   721,   722,
+     723,   724,   726,   727,   765,     0,     0,   761,   763,   764,
       46,     0,     0,    39,     0,     0,    59,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -4901,20 +4902,20 @@ namespace isc { namespace dhcp {
        0,     0,     0,     0,   469,     0,     0,     0,     0,   506,
        0,     0,     0,     0,   306,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   704,     0,     0,     0,   754,    50,    43,     0,     0,
+       0,   710,     0,     0,     0,   760,    50,    43,     0,     0,
        0,     0,     0,     0,     0,     0,   130,   131,   132,   133,
      134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
        0,   165,   166,   144,   145,   146,     0,     0,     0,   158,
      159,   164,     0,     0,     0,     0,     0,     0,     0,   397,
      398,   399,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   671,     0,     0,     0,     0,     0,     0,   169,     0,
+       0,   677,     0,     0,     0,     0,     0,     0,   169,     0,
        0,    65,     0,   183,   175,     0,     0,     0,     0,     0,
      406,   407,     0,     0,     0,   343,     0,   538,     0,   577,
        0,   580,   581,   563,     0,     0,     0,     0,     0,     0,
        0,   595,     0,     0,   485,     0,     0,     0,   496,   473,
-       0,   525,   526,   510,     0,     0,   308,   725,     0,     0,
-     730,     0,   733,   734,     0,     0,   741,   742,     0,     0,
-       0,     0,   706,     0,   761,   756,     0,     0,   129,     0,
+       0,   525,   526,   510,     0,     0,   308,   731,     0,     0,
+     736,     0,   739,   740,     0,     0,   747,   748,     0,     0,
+       0,     0,   712,     0,   767,   762,     0,     0,   129,     0,
        0,     0,     0,   190,   168,   149,   150,   151,   152,   153,
      148,   155,   157,   334,   462,   499,   410,    40,   549,   551,
      402,   403,   404,   405,   401,     0,    47,     0,     0,     0,
@@ -4922,8 +4923,8 @@ namespace isc { namespace dhcp {
        0,     0,    51,   182,   529,   554,   388,   390,   392,   396,
      394,     0,   547,   576,   579,   620,   608,   610,   612,   614,
      616,   618,   488,   234,   492,   490,   495,   522,   313,   315,
-     727,   729,   732,   737,   738,   736,   740,   744,   746,   748,
-     750,   190,    44,     0,     0,     0,   220,   226,   228,   230,
+     733,   735,   738,   743,   744,   742,   746,   750,   752,   754,
+     756,   190,    44,     0,     0,     0,   220,   226,   228,   230,
        0,     0,     0,     0,     0,   249,     0,     0,   240,   252,
      254,   256,     0,     0,     0,     0,   219,     0,   196,   198,
      199,   200,   201,   202,   203,   204,   205,   206,   207,   210,
@@ -4934,103 +4935,104 @@ namespace isc { namespace dhcp {
      277,     0,   275,   278,   279,   263,     0,   260,   262,   631,
        0,   629,   588,     0,   585,   586,   303,     0,   300,   301,
        0,     0,     0,     0,     0,     0,     0,   318,   320,   321,
-     322,   323,   324,   325,   661,   667,     0,     0,     0,   660,
-     657,   658,   659,     0,   650,   652,   655,   653,   654,   656,
+     322,   323,   324,   325,   667,   673,     0,     0,     0,   666,
+     663,   664,   665,     0,   656,   658,   661,   659,   660,   662,
        0,     0,     0,   293,     0,   286,   288,   289,   290,   291,
-     292,   681,   683,   680,   678,   679,     0,   674,   676,   677,
-       0,   696,     0,   699,   692,   693,     0,   687,   689,   690,
-     691,   694,     0,   766,     0,   764,     0,   805,     0,   802,
-     804,    53,   533,     0,   530,   531,   558,     0,   555,   556,
-     625,   624,     0,   623,     0,    61,   752,   171,     0,     0,
+     292,   687,   689,   686,   684,   685,     0,   680,   682,   683,
+       0,   702,     0,   705,   698,   699,     0,   693,   695,   696,
+     697,   700,     0,   772,     0,   770,     0,   811,     0,   808,
+     810,    53,   533,     0,   530,   531,   558,     0,   555,   556,
+     625,   624,     0,   623,     0,    61,   758,   171,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   185,
      187,     0,   189,     0,     0,   333,     0,   470,   459,     0,
      507,   498,     0,     0,   409,     0,     0,   266,   283,     0,
      274,     0,     0,   259,   633,     0,   628,   592,   583,     0,
        0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
-     317,     0,     0,     0,     0,     0,     0,   649,     0,     0,
-       0,     0,   285,     0,     0,     0,   673,     0,     0,     0,
-       0,     0,   686,   702,     0,     0,   763,     0,     0,   801,
+     317,     0,     0,     0,     0,     0,     0,   655,     0,     0,
+       0,     0,   285,     0,     0,     0,   679,     0,     0,     0,
+       0,     0,   692,   708,     0,     0,   769,     0,     0,   807,
       55,     0,    54,     0,   528,     0,     0,   553,     0,     0,
-     622,   760,     0,     0,     0,     0,   232,   235,   236,   237,
+     622,   766,     0,     0,     0,     0,   232,   235,   236,   237,
      238,     0,   251,   239,     0,     0,     0,     0,   246,   247,
      248,   245,   197,     0,   193,     0,   337,     0,   465,     0,
      502,   457,   432,   433,   434,   436,   437,   438,   422,   423,
      441,   442,   443,   444,   445,   448,   449,   450,   451,   452,
      453,   454,   455,   446,   447,   456,   418,   419,   420,   421,
      430,   431,   427,   428,   429,   426,   435,     0,   416,   424,
-     439,   440,   425,   413,   268,   276,     0,   261,   645,     0,
-     643,   644,   640,   641,   642,     0,   634,   635,   637,   638,
-     639,   630,     0,   587,     0,   302,   326,   327,   328,   329,
-     330,   331,   319,     0,     0,   666,   669,   670,   651,   294,
-     295,   296,   287,     0,     0,   675,   695,     0,   698,     0,
-     688,   780,     0,   778,   776,   770,   774,   775,     0,   768,
-     772,   773,   771,   765,   806,   803,    52,     0,     0,   532,
-       0,   557,     0,   222,   223,   224,   225,   221,   227,   229,
-     231,   250,   242,   243,   244,   241,   253,   255,   257,   195,
-     339,   467,   504,     0,   415,   264,     0,     0,   632,     0,
-     589,   304,   663,   664,   665,   662,   668,   682,   684,   697,
-     700,     0,     0,     0,     0,   767,    56,   534,   559,   626,
-     417,     0,   647,   636,     0,   777,     0,   769,   646,     0,
-     779,   784,     0,   782,     0,     0,   781,   793,     0,     0,
-       0,   798,     0,   786,   788,   789,   790,   791,   792,   783,
-       0,     0,     0,     0,     0,     0,   785,     0,   795,   796,
-     797,     0,   787,   794,   799
+     439,   440,   425,   413,   268,   276,     0,   261,   651,     0,
+     649,   643,   644,   645,   646,   647,   648,   650,   640,   641,
+     642,     0,   634,   635,   637,   638,   639,   630,     0,   587,
+       0,   302,   326,   327,   328,   329,   330,   331,   319,     0,
+       0,   672,   675,   676,   657,   294,   295,   296,   287,     0,
+       0,   681,   701,     0,   704,     0,   694,   786,     0,   784,
+     782,   776,   780,   781,     0,   774,   778,   779,   777,   771,
+     812,   809,    52,     0,     0,   532,     0,   557,     0,   222,
+     223,   224,   225,   221,   227,   229,   231,   250,   242,   243,
+     244,   241,   253,   255,   257,   195,   339,   467,   504,     0,
+     415,   264,     0,     0,   632,     0,   589,   304,   669,   670,
+     671,   668,   674,   688,   690,   703,   706,     0,     0,     0,
+       0,   773,    56,   534,   559,   626,   417,     0,   653,   636,
+       0,   783,     0,   775,   652,     0,   785,   790,     0,   788,
+       0,     0,   787,   799,     0,     0,     0,   804,     0,   792,
+     794,   795,   796,   797,   798,   789,     0,     0,     0,     0,
+       0,     0,   791,     0,   801,   802,   803,     0,   793,   800,
+     805
   };
 
   const short
   Dhcp6Parser::yypgoto_[] =
   {
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   -10,  -977,  -557,  -977,
-     418,  -977,  -977,  -977,  -977,   368,  -977,  -569,  -977,  -977,
-    -977,   -71,  -977,  -977,  -977,  -977,  -977,  -977,   399,   608,
-    -977,  -977,   -59,   -43,   -37,   -31,   -30,   -27,   -26,   -23,
-     -19,     3,    16,    19,    20,  -977,    22,    32,    33,    34,
-    -977,   395,    37,  -977,    38,  -977,    40,    44,    50,  -977,
-      52,  -977,    54,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,   403,   602,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   318,  -977,   105,  -977,  -680,   112,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,   -45,
-    -977,  -720,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,    89,  -977,  -977,  -977,  -977,
-    -977,    96,  -702,  -977,  -977,  -977,  -977,    98,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,    64,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,    82,  -977,  -977,  -977,    86,   566,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,    79,  -977,  -977,  -977,
-    -977,  -977,  -977,  -976,  -977,  -977,  -977,   114,  -977,  -977,
-    -977,   119,   614,  -977,  -977,  -975,  -977,  -974,  -977,   -63,
-    -977,    63,  -977,    55,    56,    58,    62,  -977,  -977,  -977,
-    -972,  -977,  -977,  -977,  -977,   110,  -977,  -977,  -119,  1045,
-    -977,  -977,  -977,  -977,  -977,   124,  -977,  -977,  -977,   128,
-    -977,   597,  -977,   -64,  -977,  -977,  -977,  -977,  -977,   -39,
-    -977,  -977,  -977,  -977,  -977,     4,  -977,  -977,  -977,   131,
-    -977,  -977,  -977,   139,  -977,   600,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,    72,  -977,  -977,
-    -977,    80,   633,  -977,  -977,   -55,  -977,   -12,  -977,  -977,
-    -977,  -977,  -977,    74,  -977,  -977,  -977,    81,   640,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   -57,  -977,  -977,  -977,
-     126,  -977,  -977,  -977,   127,  -977,   632,   397,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -971,  -977,  -977,  -977,  -977,  -977,  -977,  -977,   134,
-    -977,  -977,  -977,   -93,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,   116,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,   106,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,    99,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,   416,   596,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,   465,   599,  -977,  -977,  -977,  -977,
-    -977,  -977,   103,  -977,  -977,  -100,  -977,  -977,  -977,  -977,
-    -977,  -977,  -116,  -977,  -977,  -135,  -977,  -977,  -977,  -977,
-    -977,  -977,  -977,  -977,  -977,  -977,   108,  -977
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   -10,  -979,  -552,  -979,
+     422,  -979,  -979,  -979,  -979,   372,  -979,  -568,  -979,  -979,
+    -979,   -71,  -979,  -979,  -979,  -979,  -979,  -979,   402,   617,
+    -979,  -979,   -43,   -14,    12,    16,    20,    33,   -59,   -31,
+     -30,   -28,   -27,   -26,    19,  -979,    34,    37,    38,    41,
+    -979,   414,    49,  -979,    52,  -979,    54,    55,    56,  -979,
+      59,  -979,    62,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,   403,   622,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,   329,  -979,   107,  -979,  -686,   113,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   -45,
+    -979,  -722,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,    92,  -979,  -979,  -979,  -979,
+    -979,    99,  -705,  -979,  -979,  -979,  -979,    98,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,    71,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,    86,  -979,  -979,  -979,    89,   571,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,    82,  -979,  -979,  -979,
+    -979,  -979,  -979,  -978,  -979,  -979,  -979,   120,  -979,  -979,
+    -979,   124,   623,  -979,  -979,  -976,  -979,  -975,  -979,    73,
+    -979,    75,  -979,    66,    69,    70,    72,  -979,  -979,  -979,
+    -974,  -979,  -979,  -979,  -979,   114,  -979,  -979,  -119,  1045,
+    -979,  -979,  -979,  -979,  -979,   125,  -979,  -979,  -979,   126,
+    -979,   594,  -979,   -67,  -979,  -979,  -979,  -979,  -979,   -64,
+    -979,  -979,  -979,  -979,  -979,     4,  -979,  -979,  -979,   132,
+    -979,  -979,  -979,   135,  -979,   648,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,    78,  -979,  -979,
+    -979,    90,   662,  -979,  -979,   -55,  -979,   -12,  -979,  -979,
+    -979,  -979,  -979,    84,  -979,  -979,  -979,    93,   672,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   -60,  -979,  -979,  -979,
+     136,  -979,  -979,  -979,   141,  -979,   673,   406,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -972,  -979,  -979,  -979,  -979,  -979,  -979,  -979,   145,
+    -979,  -979,  -979,   -91,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,   127,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,   116,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,   105,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,   430,   674,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,   470,   598,  -979,  -979,  -979,  -979,
+    -979,  -979,   109,  -979,  -979,   -95,  -979,  -979,  -979,  -979,
+    -979,  -979,  -115,  -979,  -979,  -130,  -979,  -979,  -979,  -979,
+    -979,  -979,  -979,  -979,  -979,  -979,   115,  -979
   };
 
   const short
   Dhcp6Parser::yydefgoto_[] =
   {
-       0,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    83,    39,    40,    69,
      718,    87,    88,    41,    68,    84,    85,   743,   951,  1061,
     1062,   806,    43,    70,    90,   425,    45,    71,   154,   155,
@@ -5040,8 +5042,8 @@ namespace isc { namespace dhcp {
      180,   484,   181,   182,   183,   184,   447,   185,   186,   429,
       47,    72,   220,   221,   222,   491,   223,   187,   430,   188,
      431,   189,   432,   832,   833,   834,   991,   807,   808,   809,
-     968,  1217,   810,   969,   811,   970,   812,   971,   813,   814,
-     528,   815,   816,   817,   818,   819,   820,   980,  1225,   821,
+     968,  1223,   810,   969,   811,   970,   812,   971,   813,   814,
+     528,   815,   816,   817,   818,   819,   820,   980,  1231,   821,
      822,   823,   824,   825,   977,   826,   827,   981,   828,   982,
      829,   983,   190,   472,   866,   867,   868,  1011,   191,   469,
      853,   854,   855,   856,   192,   471,   861,   862,   863,   864,
@@ -5063,287 +5065,291 @@ namespace isc { namespace dhcp {
      875,  1017,    55,    76,   320,   321,   322,   323,   518,   324,
      519,   325,   520,   326,   521,   327,   522,   328,   523,   329,
      517,   280,   504,   962,   963,  1069,   208,   473,   870,   871,
-    1014,  1155,  1156,  1157,  1158,  1159,  1236,  1160,   209,   477,
-     903,   904,   905,  1031,  1245,   906,   907,  1032,   908,   909,
+    1014,  1161,  1162,  1163,  1164,  1165,  1242,  1166,   209,   477,
+     903,   904,   905,  1031,  1251,   906,   907,  1032,   908,   909,
      210,   211,   480,   926,   927,   928,  1043,   929,  1044,   212,
      481,   936,   937,   938,   939,  1048,   940,   941,  1050,   213,
      482,    65,    81,   397,   398,   399,   400,   546,   401,   547,
      402,   403,   549,   404,   405,   406,   552,   775,   407,   553,
      408,   409,   410,   556,   411,   557,   412,   558,   413,   559,
      214,   428,    67,    82,   416,   417,   418,   562,   419,   215,
-     486,   944,   945,  1054,  1198,  1199,  1200,  1201,  1253,  1202,
-    1251,  1272,  1273,  1274,  1282,  1283,  1284,  1290,  1285,  1286,
-    1287,  1288,  1294,   216,   487,   948,   949,   950
+     486,   944,   945,  1054,  1204,  1205,  1206,  1207,  1259,  1208,
+    1257,  1278,  1279,  1280,  1288,  1289,  1290,  1296,  1291,  1292,
+    1293,  1294,  1300,   216,   487,   948,   949,   950
   };
 
   const short
   Dhcp6Parser::yytable_[] =
   {
      153,   219,   236,   282,   296,   316,    38,   338,   357,   374,
-     394,   283,   297,   900,   237,   359,   279,   224,   276,   289,
-     300,   318,   830,   352,   370,   860,   395,  1127,  1128,  1129,
-     238,  1136,  1142,   339,   358,    31,   239,    32,    42,    33,
-     360,   851,   240,   241,   127,   128,   242,   243,    30,   717,
-     244,   310,   372,   373,   245,   125,   332,   946,   960,    86,
-     225,   277,   290,   301,   319,   420,   353,   371,  1006,   396,
-      89,  1007,   152,   749,   127,   128,   246,   274,   285,   299,
-     317,  1009,   217,   218,  1010,   755,   756,   757,  1015,   247,
-      44,  1016,   248,   249,   489,   250,  1148,  1149,  1055,   490,
-     125,  1056,   921,   922,    46,   251,   252,   253,    48,   331,
-     254,   255,  1275,   256,    50,  1276,   493,   257,   717,   127,
-     128,   494,    52,   258,    54,   259,   852,   260,   268,   269,
-     152,   270,    56,   851,   858,   271,   859,   284,   298,   309,
-     705,   706,   707,   708,    58,   310,   311,   312,   313,   314,
-     315,    91,    92,   372,   373,    93,    60,   152,    94,    95,
-      96,   127,   128,   127,   128,   332,    62,   333,   334,   414,
-     415,   335,   336,   337,  1277,   709,   505,  1278,  1279,  1280,
-    1281,   506,    64,   127,   128,   773,   774,   152,    97,    98,
+     394,   900,   359,   279,   243,   360,   830,   224,   276,   289,
+     300,   318,   860,   352,   370,  1127,   395,  1128,  1129,  1136,
+     237,  1142,   125,   339,   358,    31,   851,    32,   331,    33,
+     217,   218,   244,   245,   281,   246,   247,   248,   310,   127,
+     128,   127,   128,   946,   717,   960,   894,   414,   415,   238,
+     225,   277,   290,   301,   319,   791,   353,   371,   152,   396,
+    1006,   489,   233,  1007,   749,   234,   490,   274,   285,   299,
+     317,   372,   373,   372,   373,   239,   755,   756,   757,   240,
+     493,    30,   249,   241,   332,   494,   333,   334,   773,   774,
+     335,   336,   337,   910,   911,   912,   242,   250,    42,    44,
+     251,   252,   127,   128,   253,    46,   127,   128,    48,   127,
+     128,   852,   254,   717,    50,   255,    52,   256,   257,   258,
+     127,   128,   259,   505,  1009,   260,   508,  1010,   506,   268,
+      86,   509,   269,   270,    54,   271,    56,   283,   297,   284,
+     298,    91,    92,  1015,  1055,    93,  1016,  1056,    94,    95,
+      96,   152,   152,    58,   152,   332,   354,   333,   334,   355,
+     356,   515,   543,    60,   921,   922,   516,   544,   895,   896,
+     897,   898,   560,   127,   128,    62,    89,   561,    97,    98,
       99,   100,   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,   910,   911,   912,
-     880,   881,   882,   883,   884,   885,   126,    66,   508,  1222,
-    1223,  1224,   152,   509,   894,   127,   128,   124,    34,    35,
-      36,    37,   129,   791,  1242,  1243,  1244,   130,   131,   132,
-     133,   134,   135,   136,   421,   137,   422,  1127,  1128,  1129,
-     138,  1136,  1142,   125,   423,   515,   543,   424,   560,   139,
-     516,   544,   140,   561,   152,   281,   152,   426,   433,   141,
-     564,   489,   127,   128,   564,   565,   965,   142,   143,   966,
-     524,   434,   144,   493,   525,   145,   152,   988,   967,   146,
-     332,   435,   989,   233,   436,   988,   234,   860,   127,   128,
-     990,  1093,  1012,   526,   437,   438,   900,  1013,   127,   128,
-     147,   148,   149,   150,   439,  1029,   127,   128,  1036,   786,
-    1030,   440,   151,  1037,   787,   788,   789,   790,   791,   792,
-     793,   794,   795,   796,   797,   798,   441,   442,   152,   799,
-     800,   801,   802,   803,   804,   805,   895,   896,   897,   898,
-     125,   443,   444,   332,   354,   333,   334,   355,   356,   720,
-     721,   722,   723,   445,   291,   292,   293,   294,   295,   127,
-     128,   127,   128,   446,   448,   332,  1041,   930,   931,   932,
-     449,  1042,  1045,  1051,   560,   152,  1058,  1046,  1052,  1053,
-     233,  1059,   450,   234,   451,   452,   456,  1191,   988,  1192,
-    1193,   566,   567,  1229,   505,  1233,   534,   457,   153,  1230,
-    1234,   152,   219,   543,  1254,   508,   535,   515,  1241,  1255,
-    1257,   152,  1258,   458,   236,  1295,   539,   282,   224,   933,
-    1296,   466,   467,   468,   296,   283,   237,   478,   279,   485,
-     276,   488,   297,   289,   316,  1213,  1214,  1215,  1216,   492,
-     300,   500,   238,   501,   338,   511,   513,   514,   239,   357,
-     318,   529,   533,   537,   240,   241,   359,   538,   242,   243,
-     352,   225,   244,   540,   568,   370,   245,   545,   548,   394,
-     339,   550,   152,   277,   152,   358,   290,   551,   554,   555,
-     563,   360,   569,   301,   570,   395,   571,   572,   246,   274,
-     573,   574,   285,   319,   127,   128,   152,   575,   584,   299,
-     590,   247,   576,   353,   248,   249,   577,   250,   371,   317,
-     578,   596,   579,   580,   597,   581,   598,   251,   252,   253,
-     582,   583,   254,   255,   585,   256,   586,   587,   396,   257,
-     588,   593,   602,   589,   591,   258,   592,   259,   603,   260,
-     268,   269,   594,   270,   595,   599,   600,   271,   604,   605,
-     601,   284,   606,   607,   608,   609,   610,   611,   298,   379,
-     380,   381,   382,   383,   384,   385,   386,   387,   388,   389,
-     390,   391,   612,   613,   614,   615,   616,   617,   618,   392,
-     393,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,   619,   620,   622,   621,   623,
-     624,   625,   626,   627,   629,   628,   153,   152,   630,   219,
-     632,   635,   636,   637,   638,   639,   633,   641,   642,   640,
-     643,   644,   646,   648,   649,   224,   650,   654,   655,   651,
-     652,   656,   657,   658,   659,   660,   662,   663,   664,   665,
-     666,   667,   899,   913,   923,   668,   394,   670,   674,   671,
-     947,   672,   675,   678,   679,   677,   681,   684,   901,   919,
-     924,   934,   395,   680,   682,   683,   782,   685,   225,    97,
+     119,   120,   121,   122,   123,   124,   125,    64,   564,   705,
+     706,   707,   708,   565,  1281,   152,   126,  1282,   489,   152,
+      66,   421,   152,   965,   124,   127,   128,   420,    34,    35,
+      36,    37,   129,   152,  1228,  1229,  1230,   130,   131,   132,
+     133,   134,   135,   136,   709,   137,   127,   128,   332,   422,
+     138,  1127,   423,  1128,  1129,  1136,   125,  1142,   564,   139,
+     493,   424,   140,   966,   426,   967,   127,   128,   433,   141,
+     291,   292,   293,   294,   295,   127,   128,   142,   143,   988,
+     524,   434,   144,   988,   989,   145,   152,  1283,   990,   146,
+    1284,  1285,  1286,  1287,   860,  1093,   233,  1012,  1029,   234,
+    1036,   526,  1013,  1030,   900,  1037,   435,   930,   931,   932,
+     147,   148,   149,   150,   525,  1041,  1045,   125,  1051,   786,
+    1042,  1046,   151,  1052,   787,   788,   789,   790,   791,   792,
+     793,   794,   795,   796,   797,   798,   127,   128,   152,   799,
+     800,   801,   802,   803,   804,   805,   436,   437,    97,    98,
+      99,   100,   101,   102,   438,  1197,   309,  1198,  1199,   933,
+     439,   440,   310,   311,   312,   313,   314,   315,   880,   881,
+     882,   883,   884,   885,   441,   332,   125,   332,   560,   152,
+    1058,   988,   505,  1053,  1239,  1059,  1235,  1236,   152,  1240,
+     442,   443,   543,  1260,   508,   127,   128,  1247,  1261,  1263,
+     515,   566,   567,   444,  1301,  1264,   445,   446,   153,  1302,
+     448,   449,   219,   720,   721,   722,   723,  1148,  1149,   450,
+    1219,  1220,  1221,  1222,   236,   534,   451,   282,   224,   851,
+     858,   452,   859,   456,   296,   279,   243,   457,   458,   466,
+     276,   467,   468,   289,   316,  1248,  1249,  1250,   478,   152,
+     300,   485,   237,   488,   338,   492,   500,   501,   511,   357,
+     318,   513,   514,   359,   244,   245,   360,   246,   247,   248,
+     352,   225,   529,   533,   535,   370,   537,   538,   539,   394,
+     339,   238,   540,   277,   545,   358,   290,   548,   550,   551,
+     554,   555,   563,   301,   568,   395,   569,   570,   571,   274,
+     572,   573,   285,   319,   574,   575,   152,   239,   152,   299,
+     576,   240,   577,   353,   249,   241,   127,   128,   371,   317,
+     584,   590,   596,   578,   597,   579,   580,   581,   242,   250,
+     582,   583,   251,   252,   585,   586,   253,   587,   396,   588,
+     589,   591,   592,   598,   254,   593,   594,   255,   595,   256,
+     257,   258,   599,   602,   259,   600,   601,   260,   603,   604,
+     605,   268,   606,   607,   269,   270,   608,   271,   612,   609,
+     610,   283,   611,   284,   613,   614,   615,   616,   297,   617,
+     298,   379,   380,   381,   382,   383,   384,   385,   386,   387,
+     388,   389,   390,   391,   618,   619,   620,   621,   622,   623,
+     624,   392,   393,   625,   626,   627,   628,   629,   630,   632,
+     635,   633,   636,   637,   638,   639,   153,   640,   642,   219,
+     641,   643,   644,   646,   648,   649,   650,   651,   652,   152,
+     654,   655,   656,   657,   658,   224,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+     659,   660,   899,   913,   923,   662,   394,   663,   665,   664,
+     947,   666,   667,   670,   674,   675,   668,   671,   901,   919,
+     924,   934,   395,   672,   677,   678,   782,   679,   225,    97,
       98,    99,   100,   101,   102,   103,   104,   105,   106,   107,
-     108,   109,   686,   687,   688,   689,   114,   115,   116,   117,
-     118,   119,   120,   121,   122,   690,   691,   125,   693,   694,
-     696,   902,   920,   925,   935,   396,   697,   698,   226,   699,
-     227,   700,   701,   702,   703,   713,   127,   128,   228,   229,
-     230,   231,   232,   129,   704,   711,   712,   714,   130,   131,
-     132,   715,   716,   719,   725,    32,   726,   233,   727,   728,
-     234,   138,   729,   730,   731,   738,   739,   732,   235,   733,
-     734,   735,   736,   737,   740,   741,   742,   744,   745,   746,
-     747,   748,   750,   751,   752,   753,   754,    97,    98,    99,
+     108,   109,   681,   684,   685,   688,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   689,   686,   125,   680,   687,
+     690,   902,   920,   925,   935,   396,   682,   683,   226,   691,
+     227,   693,   694,   697,   696,   699,   127,   128,   228,   229,
+     230,   231,   232,   129,   698,   700,   701,   702,   130,   131,
+     132,   703,   704,   711,   712,   713,   714,   233,   715,   716,
+     234,   138,    32,   719,   725,   726,   727,   776,   235,   728,
+     729,   730,   731,   993,   865,   732,   733,    97,    98,    99,
      100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
-     781,   831,   865,   758,   114,   115,   116,   117,   118,   119,
-     120,   121,   122,   123,   759,   125,   332,   760,   761,   835,
-     839,   147,   148,   843,   847,   869,   872,   876,   943,   762,
-     763,   764,   952,   765,   127,   128,   776,   229,   230,   956,
-     232,   129,   972,   766,   973,   974,   130,   131,   132,   152,
-     975,   976,   978,   767,   768,   233,   979,   984,   234,   985,
-     986,   987,   770,   993,   992,   995,   235,   771,   772,   996,
-     778,   998,   999,   779,   780,  1002,  1001,  1004,  1005,  1008,
-    1018,  1019,  1021,  1022,  1060,  1023,  1024,  1025,  1026,  1027,
-    1028,  1033,  1034,  1035,  1038,  1039,  1040,  1047,  1049,  1057,
-    1065,  1076,  1064,  1068,  1067,  1072,  1077,  1070,  1071,  1073,
-    1074,  1075,  1078,  1079,  1080,  1081,  1082,  1083,  1084,   147,
-     148,  1085,  1086,   236,  1087,  1146,   338,  1088,  1090,   357,
-    1089,  1173,  1101,  1174,  1179,   237,   359,   279,  1183,   276,
-    1130,  1091,   352,  1150,  1102,   370,   316,   152,  1140,   374,
-    1166,   238,   339,  1167,  1168,   358,  1184,   239,  1126,  1153,
-    1103,   360,   318,   240,   241,   899,  1104,   242,   243,  1151,
-     913,   244,  1105,  1106,   923,   245,  1107,  1108,  1186,  1169,
-    1109,   901,   277,  1194,  1110,   353,   919,   947,   371,  1170,
-     924,  1141,   282,  1171,  1175,   296,   934,   246,   274,  1196,
-     283,  1176,  1154,   297,  1187,   319,  1111,  1139,   289,  1195,
-     247,   300,  1177,   248,   249,  1180,   250,  1181,  1152,  1112,
-    1188,   317,  1113,  1114,   902,  1115,   251,   252,   253,   920,
-    1189,   254,   255,   925,   256,  1116,  1117,  1118,   257,   935,
-    1119,  1120,  1197,  1121,   258,  1204,   259,  1122,   260,   268,
-     269,   290,   270,  1123,   301,  1124,   271,  1125,  1132,  1133,
-    1206,  1134,  1207,  1231,  1212,  1135,  1131,   285,  1237,  1218,
-     299,  1219,  1220,  1232,  1238,  1221,  1226,  1239,  1240,  1252,
-    1261,  1264,  1266,   777,  1269,  1227,  1291,  1228,  1271,  1292,
-    1293,  1297,  1301,   769,   857,   634,   783,   631,  1094,   964,
-    1092,  1147,  1144,   785,  1165,  1182,  1164,  1145,  1172,   676,
-    1096,  1235,  1246,  1095,  1260,  1143,  1247,  1248,  1249,   645,
-    1256,  1259,   330,  1098,  1265,  1097,   284,  1262,  1299,   298,
-    1268,  1270,   669,  1100,  1300,  1298,  1303,  1209,  1304,  1099,
-     673,   647,  1211,  1208,  1162,  1163,  1263,  1210,   961,  1161,
-    1190,  1185,  1178,   942,  1267,   653,   692,   661,  1203,  1289,
-    1302,     0,  1101,   695,   784,     0,  1205,     0,  1150,     0,
-    1130,     0,     0,     0,  1102,     0,     0,     0,  1140,  1250,
-       0,     0,     0,  1194,  1153,     0,     0,     0,  1126,     0,
-    1103,     0,     0,     0,  1151,     0,  1104,     0,     0,  1196,
-       0,     0,  1105,  1106,     0,     0,  1107,  1108,     0,  1195,
-    1109,     0,     0,     0,  1110,     0,     0,     0,     0,     0,
-       0,  1141,     0,     0,     0,     0,     0,  1154,     0,     0,
-       0,     0,     0,     0,     0,     0,  1111,  1139,     0,     0,
-       0,     0,  1197,  1152,     0,     0,     0,     0,     0,  1112,
-       0,     0,  1113,  1114,     0,  1115,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1116,  1117,  1118,     0,     0,
-    1119,  1120,     0,  1121,     0,     0,     0,  1122,     0,     0,
-       0,     0,     0,  1123,     0,  1124,     0,  1125,  1132,  1133,
-       0,  1134,     0,     0,     0,  1135,  1131
+     734,   735,   736,   737,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   738,   125,   332,   739,   740,   741,
+     742,   744,   745,   781,  1077,   746,   747,   751,   831,   835,
+     748,   147,   148,   839,   127,   128,   843,   229,   230,   847,
+     232,   129,   869,   750,   752,   872,   130,   131,   132,   753,
+     876,   754,   758,   759,   943,   233,   952,   956,   234,   152,
+     760,   761,   762,   763,   764,   765,   235,   766,   767,   768,
+     770,   771,   772,   778,   972,   973,   779,   780,   974,   975,
+     976,   978,   979,   984,   985,   986,   987,  1079,   996,   992,
+     995,   999,   998,  1001,  1002,  1004,  1005,  1060,  1008,  1019,
+    1018,  1021,  1022,  1064,  1023,  1024,  1025,  1026,  1027,  1028,
+    1033,  1034,  1035,  1038,  1039,  1040,  1047,  1049,  1057,   147,
+     148,  1065,  1067,  1068,  1076,  1070,  1072,  1071,  1073,  1074,
+    1075,  1078,  1080,   236,  1081,  1084,   338,  1082,  1083,   357,
+    1085,  1086,  1101,   359,   279,   243,   360,   152,  1087,   276,
+    1088,  1089,   352,  1150,  1108,   370,   316,  1090,  1140,   374,
+    1091,   237,   339,  1146,  1172,   358,  1173,  1174,  1126,  1159,
+    1102,  1175,   318,   244,   245,   899,   246,   247,   248,  1157,
+     913,  1151,  1109,  1110,   923,  1111,  1112,  1113,  1179,  1180,
+     238,   901,   277,  1200,  1176,   353,   919,   947,   371,  1103,
+     924,  1141,   282,  1185,  1189,   296,   934,  1177,   274,  1202,
+    1152,  1181,  1160,  1182,  1183,   319,   239,  1139,   289,  1201,
+     240,   300,  1190,   249,   241,  1104,  1193,  1195,  1158,  1105,
+    1192,   317,  1114,  1106,   902,  1210,  1153,   242,   250,   920,
+    1154,   251,   252,   925,  1155,   253,  1107,  1115,  1186,   935,
+    1116,  1117,  1203,   254,  1118,  1187,   255,  1156,   256,   257,
+     258,   290,  1119,   259,   301,  1120,   260,  1121,  1122,  1123,
+     268,  1194,  1124,   269,   270,  1125,   271,   285,  1212,  1132,
+     299,  1213,  1133,  1134,  1218,  1135,  1130,  1237,  1131,  1238,
+    1243,  1244,  1245,  1246,  1258,  1267,  1270,  1272,  1224,  1275,
+    1297,  1298,  1277,  1299,  1303,  1307,  1225,   769,   857,   783,
+    1094,  1092,   777,   785,  1147,  1144,   631,  1145,  1171,  1170,
+     964,  1178,  1188,  1226,   676,   634,  1096,  1227,  1095,  1143,
+    1266,  1232,   330,  1097,  1098,  1233,  1234,  1241,   645,   669,
+    1252,  1253,  1254,  1255,  1100,  1099,   283,  1262,   284,   297,
+    1265,   298,  1268,  1215,  1271,  1274,  1276,  1304,  1305,  1306,
+    1309,  1310,  1217,  1214,  1269,  1169,  1196,   961,  1168,  1216,
+    1167,  1191,   695,  1184,  1209,  1273,  1295,   942,  1101,   784,
+     647,  1308,     0,  1211,  1150,     0,     0,     0,     0,     0,
+    1108,     0,     0,     0,  1140,  1256,     0,   653,   673,  1200,
+    1159,     0,     0,     0,  1126,     0,  1102,     0,   661,     0,
+    1157,     0,  1151,     0,     0,  1202,     0,     0,  1109,  1110,
+       0,  1111,  1112,  1113,     0,  1201,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1103,     0,  1141,     0,     0,
+       0,  1152,     0,  1160,   692,     0,     0,     0,     0,     0,
+       0,     0,     0,  1139,     0,     0,     0,     0,  1203,  1158,
+       0,  1104,     0,     0,     0,  1105,     0,  1153,  1114,  1106,
+       0,  1154,     0,     0,     0,  1155,     0,     0,     0,     0,
+       0,     0,  1107,  1115,     0,     0,  1116,  1117,  1156,     0,
+    1118,     0,     0,     0,     0,     0,     0,     0,  1119,     0,
+       0,  1120,     0,  1121,  1122,  1123,     0,     0,  1124,     0,
+       0,  1125,     0,     0,     0,  1132,     0,     0,  1133,  1134,
+       0,  1135,  1130,     0,  1131
   };
 
   const short
   Dhcp6Parser::yycheck_[] =
   {
       71,    72,    73,    74,    75,    76,    16,    78,    79,    80,
-      81,    74,    75,   733,    73,    79,    73,    72,    73,    74,
-      75,    76,   702,    78,    79,   727,    81,  1003,  1003,  1003,
-      73,  1003,  1003,    78,    79,     5,    73,     7,     7,     9,
-      79,   123,    73,    73,    95,    96,    73,    73,     0,   606,
-      73,   121,   130,   131,    73,    76,    77,   193,   128,   208,
-      72,    73,    74,    75,    76,     6,    78,    79,     3,    81,
-      10,     6,   208,   642,    95,    96,    73,    73,    74,    75,
-      76,     3,    16,    17,     6,   654,   655,   656,     3,    73,
-       7,     6,    73,    73,     3,    73,   117,   118,     3,     8,
-      76,     6,   153,   154,     7,    73,    73,    73,     7,    21,
-      73,    73,     3,    73,     7,     6,     3,    73,   675,    95,
-      96,     8,     7,    73,     7,    73,   208,    73,    73,    73,
-     208,    73,     7,   123,   124,    73,   126,    74,    75,   115,
-     176,   177,   178,   179,     7,   121,   122,   123,   124,   125,
-     126,    11,    12,   130,   131,    15,     7,   208,    18,    19,
-      20,    95,    96,    95,    96,    77,     7,    79,    80,    13,
-      14,    83,    84,    85,   185,   211,     3,   188,   189,   190,
-     191,     8,     7,    95,    96,   173,   174,   208,    48,    49,
+      81,   733,    79,    73,    73,    79,   702,    72,    73,    74,
+      75,    76,   727,    78,    79,  1003,    81,  1003,  1003,  1003,
+      73,  1003,    76,    78,    79,     5,   123,     7,    21,     9,
+      16,    17,    73,    73,    88,    73,    73,    73,   121,    95,
+      96,    95,    96,   193,   606,   128,    21,    13,    14,    73,
+      72,    73,    74,    75,    76,    30,    78,    79,   208,    81,
+       3,     3,   116,     6,   642,   119,     8,    73,    74,    75,
+      76,   130,   131,   130,   131,    73,   654,   655,   656,    73,
+       3,     0,    73,    73,    77,     8,    79,    80,   173,   174,
+      83,    84,    85,   149,   150,   151,    73,    73,     7,     7,
+      73,    73,    95,    96,    73,     7,    95,    96,     7,    95,
+      96,   208,    73,   675,     7,    73,     7,    73,    73,    73,
+      95,    96,    73,     3,     3,    73,     3,     6,     8,    73,
+     208,     8,    73,    73,     7,    73,     7,    74,    75,    74,
+      75,    11,    12,     3,     3,    15,     6,     6,    18,    19,
+      20,   208,   208,     7,   208,    77,    78,    79,    80,    81,
+      82,     3,     3,     7,   153,   154,     8,     8,   143,   144,
+     145,   146,     3,    95,    96,     7,    10,     8,    48,    49,
       50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,   149,   150,   151,
-     133,   134,   135,   136,   137,   138,    86,     7,     3,    38,
-      39,    40,   208,     8,    21,    95,    96,    75,   208,   209,
-     210,   211,   102,    30,   140,   141,   142,   107,   108,   109,
-     110,   111,   112,   113,     3,   115,     4,  1233,  1233,  1233,
-     120,  1233,  1233,    76,     8,     3,     3,     3,     3,   129,
-       8,     8,   132,     8,   208,    88,   208,     8,     4,   139,
-       3,     3,    95,    96,     3,     8,     8,   147,   148,     8,
-       8,     4,   152,     3,     3,   155,   208,     3,     8,   159,
-      77,     4,     8,   116,     4,     3,   119,  1009,    95,    96,
-       8,   991,     3,     8,     4,     4,  1036,     8,    95,    96,
-     180,   181,   182,   183,     4,     3,    95,    96,     3,    21,
-       8,     4,   192,     8,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,     4,     4,   208,    41,
-      42,    43,    44,    45,    46,    47,   143,   144,   145,   146,
-      76,     4,     4,    77,    78,    79,    80,    81,    82,   103,
-     104,   105,   106,     4,    90,    91,    92,    93,    94,    95,
-      96,    95,    96,     4,     4,    77,     3,   156,   157,   158,
-       4,     8,     3,     3,     3,   208,     3,     8,     8,     8,
-     116,     8,     4,   119,     4,     4,     4,   184,     3,   186,
-     187,   421,   422,     8,     3,     3,     8,     4,   489,     8,
-       8,   208,   493,     3,     3,     3,     3,     3,     8,     8,
-       8,   208,     8,     4,   505,     3,     8,   508,   493,   208,
-       8,     4,     4,     4,   515,   508,   505,     4,   505,     4,
-     505,     4,   515,   508,   525,    22,    23,    24,    25,     4,
-     515,     4,   505,     4,   535,     4,     4,     4,   505,   540,
-     525,     4,     4,     4,   505,   505,   540,     4,   505,   505,
-     535,   493,   505,     3,   208,   540,   505,     4,     4,   560,
-     535,     4,   208,   505,   208,   540,   508,     4,     4,     4,
-       4,   540,     4,   515,     4,   560,     4,     4,   505,   505,
-       4,     4,   508,   525,    95,    96,   208,     4,   211,   515,
-       4,   505,   209,   535,   505,   505,   209,   505,   540,   525,
-     209,     4,   209,   209,     4,   209,     4,   505,   505,   505,
-     209,   209,   505,   505,   210,   505,   210,   210,   560,   505,
-     209,   211,     4,   209,   209,   505,   209,   505,     4,   505,
-     505,   505,   211,   505,   211,   211,   211,   505,     4,     4,
-     211,   508,     4,     4,     4,   211,   211,   211,   515,   160,
-     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   172,     4,     4,     4,     4,     4,     4,     4,   180,
-     181,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,     4,     4,     4,   209,     4,
-       4,     4,     4,     4,     4,   211,   697,   208,     4,   700,
-       4,     4,     4,     4,     4,     4,   211,   211,     4,   209,
-       4,     4,     4,     4,   209,   700,     4,     4,     4,   209,
-     209,     4,     4,     4,     4,     4,     4,     4,   209,     4,
-       4,     4,   733,   734,   735,   211,   737,     4,     4,   211,
-     741,   211,     4,     4,     4,   211,     4,     4,   733,   734,
-     735,   736,   737,   209,   209,   209,   696,     4,   700,    48,
+      70,    71,    72,    73,    74,    75,    76,     7,     3,   176,
+     177,   178,   179,     8,     3,   208,    86,     6,     3,   208,
+       7,     3,   208,     8,    75,    95,    96,     6,   208,   209,
+     210,   211,   102,   208,    38,    39,    40,   107,   108,   109,
+     110,   111,   112,   113,   211,   115,    95,    96,    77,     4,
+     120,  1239,     8,  1239,  1239,  1239,    76,  1239,     3,   129,
+       3,     3,   132,     8,     8,     8,    95,    96,     4,   139,
+      90,    91,    92,    93,    94,    95,    96,   147,   148,     3,
+       8,     4,   152,     3,     8,   155,   208,   185,     8,   159,
+     188,   189,   190,   191,  1009,   991,   116,     3,     3,   119,
+       3,     8,     8,     8,  1036,     8,     4,   156,   157,   158,
+     180,   181,   182,   183,     3,     3,     3,    76,     3,    21,
+       8,     8,   192,     8,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    95,    96,   208,    41,
+      42,    43,    44,    45,    46,    47,     4,     4,    48,    49,
+      50,    51,    52,    53,     4,   184,   115,   186,   187,   208,
+       4,     4,   121,   122,   123,   124,   125,   126,   133,   134,
+     135,   136,   137,   138,     4,    77,    76,    77,     3,   208,
+       3,     3,     3,     8,     3,     8,     8,     8,   208,     8,
+       4,     4,     3,     3,     3,    95,    96,     8,     8,     8,
+       3,   421,   422,     4,     3,     8,     4,     4,   489,     8,
+       4,     4,   493,   103,   104,   105,   106,   117,   118,     4,
+      22,    23,    24,    25,   505,     8,     4,   508,   493,   123,
+     124,     4,   126,     4,   515,   505,   505,     4,     4,     4,
+     505,     4,     4,   508,   525,   140,   141,   142,     4,   208,
+     515,     4,   505,     4,   535,     4,     4,     4,     4,   540,
+     525,     4,     4,   540,   505,   505,   540,   505,   505,   505,
+     535,   493,     4,     4,     3,   540,     4,     4,     8,   560,
+     535,   505,     3,   505,     4,   540,   508,     4,     4,     4,
+       4,     4,     4,   515,   208,   560,     4,     4,     4,   505,
+       4,     4,   508,   525,     4,     4,   208,   505,   208,   515,
+     209,   505,   209,   535,   505,   505,    95,    96,   540,   525,
+     211,     4,     4,   209,     4,   209,   209,   209,   505,   505,
+     209,   209,   505,   505,   210,   210,   505,   210,   560,   209,
+     209,   209,   209,     4,   505,   211,   211,   505,   211,   505,
+     505,   505,   211,     4,   505,   211,   211,   505,     4,     4,
+       4,   505,     4,     4,   505,   505,     4,   505,     4,   211,
+     211,   508,   211,   508,     4,     4,     4,     4,   515,     4,
+     515,   160,   161,   162,   163,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,     4,     4,     4,   209,     4,     4,
+       4,   180,   181,     4,     4,     4,   211,     4,     4,     4,
+       4,   211,     4,     4,     4,     4,   697,   209,     4,   700,
+     211,     4,     4,     4,     4,   209,     4,   209,   209,   208,
+       4,     4,     4,     4,     4,   700,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+       4,     4,   733,   734,   735,     4,   737,     4,     4,   209,
+     741,     4,     4,     4,     4,     4,   211,   211,   733,   734,
+     735,   736,   737,   211,   211,     4,   696,     4,   700,    48,
       49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,   211,   211,     4,     4,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,     4,     4,    76,     4,   209,
-       4,   733,   734,   735,   736,   737,     7,   208,    87,     7,
-      89,     7,     7,     7,     5,     5,    95,    96,    97,    98,
-      99,   100,   101,   102,   208,   208,   208,     5,   107,   108,
-     109,     5,     5,   208,     5,     7,     5,   116,     5,     7,
-     119,   120,     5,     5,     5,   208,   208,     7,   127,     7,
-       7,     7,     7,     7,     5,     7,     5,     5,     5,   208,
-     208,   208,   208,     7,   208,   208,   208,    48,    49,    50,
+      59,    60,     4,     4,     4,     4,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,     4,   211,    76,   209,   211,
+       4,   733,   734,   735,   736,   737,   209,   209,    87,     4,
+      89,     4,   209,     7,     4,     7,    95,    96,    97,    98,
+      99,   100,   101,   102,   208,     7,     7,     7,   107,   108,
+     109,     5,   208,   208,   208,     5,     5,   116,     5,     5,
+     119,   120,     7,   208,     5,     5,     5,   175,   127,     7,
+       5,     5,     5,     3,   114,     7,     7,    48,    49,    50,
       51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-       5,     7,   114,   208,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,   208,    76,    77,   208,   208,     7,
-       7,   180,   181,     7,     7,     7,     7,     7,     7,   208,
-     208,   208,     7,   208,    95,    96,   175,    98,    99,     7,
-     101,   102,     4,   208,     4,     4,   107,   108,   109,   208,
-       4,     4,     4,   208,   208,   116,     4,     4,   119,     4,
-       4,     4,   208,     3,     6,     6,   127,   208,   208,     3,
-     208,     6,     3,   208,   208,     3,     6,     6,     3,     6,
-       6,     3,     6,     3,   208,     4,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       3,   209,     6,     3,     6,     4,   211,     8,     6,     4,
-       4,     4,   209,   211,   209,     4,   209,   209,     4,   180,
-     181,     4,     4,   994,     4,     4,   997,   209,   211,  1000,
-     209,     4,  1003,     4,   211,   994,  1000,   994,     4,   994,
-    1003,   209,   997,  1014,  1003,  1000,  1017,   208,  1003,  1020,
-     209,   994,   997,   209,   209,  1000,     4,   994,  1003,  1014,
-    1003,  1000,  1017,   994,   994,  1036,  1003,   994,   994,  1014,
-    1041,   994,  1003,  1003,  1045,   994,  1003,  1003,   211,   209,
-    1003,  1036,   994,  1054,  1003,   997,  1041,  1058,  1000,   209,
-    1045,  1003,  1063,   209,   209,  1066,  1051,   994,   994,  1054,
-    1063,   209,  1014,  1066,     4,  1017,  1003,  1003,  1063,  1054,
-     994,  1066,   209,   994,   994,   209,   994,   209,  1014,  1003,
-     209,  1017,  1003,  1003,  1036,  1003,   994,   994,   994,  1041,
-       4,   994,   994,  1045,   994,  1003,  1003,  1003,   994,  1051,
-    1003,  1003,  1054,  1003,   994,   211,   994,  1003,   994,   994,
-     994,  1063,   994,  1003,  1066,  1003,   994,  1003,  1003,  1003,
-       6,  1003,     3,     8,     4,  1003,  1003,  1063,     4,   208,
-    1066,   208,   208,     8,     8,   208,   208,     3,     8,     4,
-       4,     4,     4,   688,     5,   208,     4,   208,     7,     4,
-       4,     4,     4,   675,   726,   493,   697,   489,   993,   781,
-     988,  1012,  1006,   700,  1022,  1041,  1020,  1009,  1029,   543,
-     996,   208,   208,   994,  1233,  1005,   208,   208,   208,   505,
-     208,   208,    77,   999,   209,   997,  1063,   211,   209,  1066,
-     208,   208,   535,  1002,   209,   211,   208,  1065,   208,  1000,
-     540,   508,  1068,  1063,  1017,  1019,  1239,  1066,   751,  1015,
-    1051,  1045,  1036,   737,  1254,   515,   560,   525,  1055,  1275,
-    1295,    -1,  1233,   564,   699,    -1,  1058,    -1,  1239,    -1,
-    1233,    -1,    -1,    -1,  1233,    -1,    -1,    -1,  1233,  1189,
-      -1,    -1,    -1,  1254,  1239,    -1,    -1,    -1,  1233,    -1,
-    1233,    -1,    -1,    -1,  1239,    -1,  1233,    -1,    -1,  1254,
-      -1,    -1,  1233,  1233,    -1,    -1,  1233,  1233,    -1,  1254,
-    1233,    -1,    -1,    -1,  1233,    -1,    -1,    -1,    -1,    -1,
-      -1,  1233,    -1,    -1,    -1,    -1,    -1,  1239,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1233,  1233,    -1,    -1,
-      -1,    -1,  1254,  1239,    -1,    -1,    -1,    -1,    -1,  1233,
-      -1,    -1,  1233,  1233,    -1,  1233,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1233,  1233,  1233,    -1,    -1,
-    1233,  1233,    -1,  1233,    -1,    -1,    -1,  1233,    -1,    -1,
-      -1,    -1,    -1,  1233,    -1,  1233,    -1,  1233,  1233,  1233,
-      -1,  1233,    -1,    -1,    -1,  1233,  1233
+       7,     7,     7,     7,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,   208,    76,    77,   208,     5,     7,
+       5,     5,     5,     5,   211,   208,   208,     7,     7,     7,
+     208,   180,   181,     7,    95,    96,     7,    98,    99,     7,
+     101,   102,     7,   208,   208,     7,   107,   108,   109,   208,
+       7,   208,   208,   208,     7,   116,     7,     7,   119,   208,
+     208,   208,   208,   208,   208,   208,   127,   208,   208,   208,
+     208,   208,   208,   208,     4,     4,   208,   208,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,   211,     3,     6,
+       6,     3,     6,     6,     3,     6,     3,   208,     6,     3,
+       6,     6,     3,     6,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,     4,     4,   180,
+     181,     3,     6,     3,   209,     8,     4,     6,     4,     4,
+       4,   209,   209,   994,     4,     4,   997,   209,   209,  1000,
+       4,     4,  1003,  1000,   994,   994,  1000,   208,     4,   994,
+     209,   209,   997,  1014,  1003,  1000,  1017,   211,  1003,  1020,
+     209,   994,   997,     4,   209,  1000,   209,   209,  1003,  1014,
+    1003,   209,  1017,   994,   994,  1036,   994,   994,   994,  1014,
+    1041,  1014,  1003,  1003,  1045,  1003,  1003,  1003,     4,     4,
+     994,  1036,   994,  1054,   209,   997,  1041,  1058,  1000,  1003,
+    1045,  1003,  1063,   211,     4,  1066,  1051,   209,   994,  1054,
+    1014,   209,  1014,   209,   209,  1017,   994,  1003,  1063,  1054,
+     994,  1066,     4,   994,   994,  1003,     4,     4,  1014,  1003,
+     211,  1017,  1003,  1003,  1036,   211,  1014,   994,   994,  1041,
+    1014,   994,   994,  1045,  1014,   994,  1003,  1003,   209,  1051,
+    1003,  1003,  1054,   994,  1003,   209,   994,  1014,   994,   994,
+     994,  1063,  1003,   994,  1066,  1003,   994,  1003,  1003,  1003,
+     994,   209,  1003,   994,   994,  1003,   994,  1063,     6,  1003,
+    1066,     3,  1003,  1003,     4,  1003,  1003,     8,  1003,     8,
+       4,     8,     3,     8,     4,     4,     4,     4,   208,     5,
+       4,     4,     7,     4,     4,     4,   208,   675,   726,   697,
+     993,   988,   688,   700,  1012,  1006,   489,  1009,  1022,  1020,
+     781,  1029,  1041,   208,   543,   493,   996,   208,   994,  1005,
+    1239,   208,    77,   997,   999,   208,   208,   208,   505,   535,
+     208,   208,   208,   208,  1002,  1000,  1063,   208,  1063,  1066,
+     208,  1066,   211,  1065,   209,   208,   208,   211,   209,   209,
+     208,   208,  1068,  1063,  1245,  1019,  1051,   751,  1017,  1066,
+    1015,  1045,   564,  1036,  1055,  1260,  1281,   737,  1239,   699,
+     508,  1301,    -1,  1058,  1245,    -1,    -1,    -1,    -1,    -1,
+    1239,    -1,    -1,    -1,  1239,  1195,    -1,   515,   540,  1260,
+    1245,    -1,    -1,    -1,  1239,    -1,  1239,    -1,   525,    -1,
+    1245,    -1,  1245,    -1,    -1,  1260,    -1,    -1,  1239,  1239,
+      -1,  1239,  1239,  1239,    -1,  1260,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1239,    -1,  1239,    -1,    -1,
+      -1,  1245,    -1,  1245,   560,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1239,    -1,    -1,    -1,    -1,  1260,  1245,
+      -1,  1239,    -1,    -1,    -1,  1239,    -1,  1245,  1239,  1239,
+      -1,  1245,    -1,    -1,    -1,  1245,    -1,    -1,    -1,    -1,
+      -1,    -1,  1239,  1239,    -1,    -1,  1239,  1239,  1245,    -1,
+    1239,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1239,    -1,
+      -1,  1239,    -1,  1239,  1239,  1239,    -1,    -1,  1239,    -1,
+      -1,  1239,    -1,    -1,    -1,  1239,    -1,    -1,  1239,  1239,
+      -1,  1239,  1239,    -1,  1239
   };
 
   const short
@@ -5464,22 +5470,23 @@ namespace isc { namespace dhcp {
      276,   278,   279,   280,   282,   284,   321,   395,   407,   409,
      411,   413,   415,   416,   417,   418,   422,   429,   430,   457,
      487,   489,   533,   427,   353,   359,     4,   347,   117,   118,
-     243,   321,   457,   487,   489,   543,   544,   545,   546,   547,
-     549,   541,   516,   512,   379,   375,   209,   209,   209,   209,
-     209,   209,   388,     4,     4,   209,   209,   209,   553,   211,
-     209,   209,   367,     4,     4,   566,   211,     4,   209,     4,
-     574,   184,   186,   187,   243,   321,   487,   489,   626,   627,
-     628,   629,   631,   624,   211,   648,     6,     3,   483,   479,
-     499,   495,     4,    22,    23,    24,    25,   313,   208,   208,
-     208,   208,    38,    39,    40,   330,   208,   208,   208,     8,
-       8,     8,     8,     3,     8,   208,   548,     4,     8,     3,
-       8,     8,   140,   141,   142,   556,   208,   208,   208,   208,
-     228,   632,     4,   630,     3,     8,   208,     8,     8,   208,
-     430,     4,   211,   545,     4,   209,     4,   627,   208,     5,
-     208,     7,   633,   634,   635,     3,     6,   185,   188,   189,
-     190,   191,   636,   637,   638,   640,   641,   642,   643,   634,
-     639,     4,     4,     4,   644,     3,     8,     4,   211,   209,
-     209,     4,   637,   208,   208
+     243,   254,   255,   256,   257,   258,   259,   321,   457,   487,
+     489,   543,   544,   545,   546,   547,   549,   541,   516,   512,
+     379,   375,   209,   209,   209,   209,   209,   209,   388,     4,
+       4,   209,   209,   209,   553,   211,   209,   209,   367,     4,
+       4,   566,   211,     4,   209,     4,   574,   184,   186,   187,
+     243,   321,   487,   489,   626,   627,   628,   629,   631,   624,
+     211,   648,     6,     3,   483,   479,   499,   495,     4,    22,
+      23,    24,    25,   313,   208,   208,   208,   208,    38,    39,
+      40,   330,   208,   208,   208,     8,     8,     8,     8,     3,
+       8,   208,   548,     4,     8,     3,     8,     8,   140,   141,
+     142,   556,   208,   208,   208,   208,   228,   632,     4,   630,
+       3,     8,   208,     8,     8,   208,   430,     4,   211,   545,
+       4,   209,     4,   627,   208,     5,   208,     7,   633,   634,
+     635,     3,     6,   185,   188,   189,   190,   191,   636,   637,
+     638,   640,   641,   642,   643,   634,   639,     4,     4,     4,
+     644,     3,     8,     4,   211,   209,   209,     4,   637,   208,
+     208
   };
 
   const short
@@ -5549,23 +5556,24 @@ namespace isc { namespace dhcp {
      521,   524,   523,   526,   525,   528,   527,   530,   529,   532,
      531,   534,   533,   535,   535,   537,   536,   539,   538,   540,
      540,   542,   541,   543,   543,   544,   544,   545,   545,   545,
-     545,   545,   545,   545,   546,   548,   547,   549,   551,   550,
-     552,   552,   553,   553,   553,   553,   553,   553,   553,   553,
-     553,   555,   554,   556,   556,   556,   557,   559,   558,   560,
-     561,   562,   564,   563,   565,   565,   566,   566,   566,   566,
-     566,   568,   567,   570,   569,   572,   571,   573,   573,   574,
-     574,   574,   574,   574,   574,   575,   577,   576,   578,   580,
-     579,   582,   581,   584,   583,   585,   585,   586,   586,   586,
+     545,   545,   545,   545,   545,   545,   545,   545,   545,   545,
+     546,   548,   547,   549,   551,   550,   552,   552,   553,   553,
+     553,   553,   553,   553,   553,   553,   553,   555,   554,   556,
+     556,   556,   557,   559,   558,   560,   561,   562,   564,   563,
+     565,   565,   566,   566,   566,   566,   566,   568,   567,   570,
+     569,   572,   571,   573,   573,   574,   574,   574,   574,   574,
+     574,   575,   577,   576,   578,   580,   579,   582,   581,   584,
+     583,   585,   585,   586,   586,   586,   586,   586,   586,   586,
      586,   586,   586,   586,   586,   586,   586,   586,   586,   586,
-     586,   586,   586,   586,   586,   587,   589,   588,   591,   590,
-     592,   594,   593,   595,   596,   598,   597,   599,   599,   601,
-     600,   602,   603,   605,   604,   607,   606,   609,   608,   611,
-     610,   613,   612,   615,   614,   616,   616,   617,   617,   619,
-     618,   620,   622,   621,   623,   623,   625,   624,   626,   626,
-     627,   627,   627,   627,   627,   627,   627,   628,   630,   629,
-     632,   631,   633,   633,   635,   634,   636,   636,   637,   637,
-     637,   637,   637,   639,   638,   640,   641,   642,   644,   643,
-     646,   645,   647,   647,   648,   648,   649
+     586,   587,   589,   588,   591,   590,   592,   594,   593,   595,
+     596,   598,   597,   599,   599,   601,   600,   602,   603,   605,
+     604,   607,   606,   609,   608,   611,   610,   613,   612,   615,
+     614,   616,   616,   617,   617,   619,   618,   620,   622,   621,
+     623,   623,   625,   624,   626,   626,   627,   627,   627,   627,
+     627,   627,   627,   628,   630,   629,   632,   631,   633,   633,
+     635,   634,   636,   636,   637,   637,   637,   637,   637,   639,
+     638,   640,   641,   642,   644,   643,   646,   645,   647,   647,
+     648,   648,   649
   };
 
   const signed char
@@ -5635,23 +5643,24 @@ namespace isc { namespace dhcp {
        4,     0,     4,     0,     4,     0,     4,     0,     4,     0,
        4,     0,     6,     1,     1,     0,     4,     0,     6,     1,
        3,     0,     4,     0,     1,     1,     3,     1,     1,     1,
-       1,     1,     1,     1,     1,     0,     4,     3,     0,     6,
-       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     0,     4,     1,     1,     1,     3,     0,     4,     3,
-       3,     3,     0,     6,     1,     3,     1,     1,     1,     1,
-       1,     0,     4,     0,     4,     0,     6,     1,     3,     1,
-       1,     1,     1,     1,     1,     3,     0,     4,     3,     0,
-       4,     0,     6,     0,     4,     1,     3,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     3,     0,     4,     0,     4,
-       3,     0,     4,     3,     3,     0,     4,     1,     1,     0,
-       4,     3,     3,     0,     4,     0,     4,     0,     4,     0,
-       4,     0,     6,     0,     4,     1,     3,     1,     1,     0,
-       6,     3,     0,     6,     1,     3,     0,     4,     1,     3,
-       1,     1,     1,     1,     1,     1,     1,     3,     0,     4,
-       0,     6,     1,     3,     0,     4,     1,     3,     1,     1,
-       1,     1,     1,     0,     4,     3,     3,     3,     0,     4,
-       0,     6,     1,     3,     1,     1,     3
+       1,     0,     4,     3,     0,     6,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     0,     4,     1,
+       1,     1,     3,     0,     4,     3,     3,     3,     0,     6,
+       1,     3,     1,     1,     1,     1,     1,     0,     4,     0,
+       4,     0,     6,     1,     3,     1,     1,     1,     1,     1,
+       1,     3,     0,     4,     3,     0,     4,     0,     6,     0,
+       4,     1,     3,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     0,     4,     0,     4,     3,     0,     4,     3,
+       3,     0,     4,     1,     1,     0,     4,     3,     3,     0,
+       4,     0,     4,     0,     4,     0,     4,     0,     6,     0,
+       4,     1,     3,     1,     1,     0,     6,     3,     0,     6,
+       1,     3,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     3,     0,     4,     0,     6,     1,     3,
+       0,     4,     1,     3,     1,     1,     1,     1,     1,     0,
+       4,     3,     3,     3,     0,     4,     0,     6,     1,     3,
+       1,     1,     3
   };
 
 
@@ -5907,23 +5916,24 @@ namespace isc { namespace dhcp {
     2147,  2158,  2158,  2167,  2167,  2176,  2176,  2185,  2185,  2194,
     2194,  2208,  2208,  2219,  2220,  2223,  2223,  2235,  2235,  2246,
     2247,  2250,  2250,  2260,  2261,  2264,  2265,  2268,  2269,  2270,
-    2271,  2272,  2273,  2274,  2277,  2279,  2279,  2288,  2297,  2297,
-    2310,  2311,  2314,  2315,  2316,  2317,  2318,  2319,  2320,  2321,
-    2322,  2325,  2325,  2333,  2334,  2335,  2338,  2344,  2344,  2353,
-    2359,  2367,  2375,  2375,  2386,  2387,  2390,  2391,  2392,  2393,
-    2394,  2397,  2397,  2406,  2406,  2418,  2418,  2431,  2432,  2435,
-    2436,  2437,  2438,  2439,  2440,  2443,  2449,  2449,  2458,  2464,
-    2464,  2474,  2474,  2487,  2487,  2497,  2498,  2501,  2502,  2503,
-    2504,  2505,  2506,  2507,  2508,  2509,  2510,  2511,  2512,  2513,
-    2514,  2515,  2516,  2517,  2518,  2521,  2528,  2528,  2537,  2537,
-    2546,  2552,  2552,  2561,  2567,  2573,  2573,  2582,  2583,  2586,
-    2586,  2596,  2603,  2610,  2610,  2619,  2619,  2629,  2629,  2639,
-    2639,  2651,  2651,  2663,  2663,  2673,  2674,  2678,  2679,  2682,
-    2682,  2693,  2701,  2701,  2714,  2715,  2719,  2719,  2727,  2728,
-    2731,  2732,  2733,  2734,  2735,  2736,  2737,  2740,  2746,  2746,
-    2755,  2755,  2766,  2767,  2770,  2770,  2778,  2779,  2782,  2783,
-    2784,  2785,  2786,  2789,  2789,  2798,  2804,  2810,  2816,  2816,
-    2825,  2825,  2836,  2837,  2840,  2841,  2844
+    2271,  2272,  2273,  2274,  2275,  2276,  2277,  2278,  2279,  2280,
+    2283,  2285,  2285,  2294,  2303,  2303,  2316,  2317,  2320,  2321,
+    2322,  2323,  2324,  2325,  2326,  2327,  2328,  2331,  2331,  2339,
+    2340,  2341,  2344,  2350,  2350,  2359,  2365,  2373,  2381,  2381,
+    2392,  2393,  2396,  2397,  2398,  2399,  2400,  2403,  2403,  2412,
+    2412,  2424,  2424,  2437,  2438,  2441,  2442,  2443,  2444,  2445,
+    2446,  2449,  2455,  2455,  2464,  2470,  2470,  2480,  2480,  2493,
+    2493,  2503,  2504,  2507,  2508,  2509,  2510,  2511,  2512,  2513,
+    2514,  2515,  2516,  2517,  2518,  2519,  2520,  2521,  2522,  2523,
+    2524,  2527,  2534,  2534,  2543,  2543,  2552,  2558,  2558,  2567,
+    2573,  2579,  2579,  2588,  2589,  2592,  2592,  2602,  2609,  2616,
+    2616,  2625,  2625,  2635,  2635,  2645,  2645,  2657,  2657,  2669,
+    2669,  2679,  2680,  2684,  2685,  2688,  2688,  2699,  2707,  2707,
+    2720,  2721,  2725,  2725,  2733,  2734,  2737,  2738,  2739,  2740,
+    2741,  2742,  2743,  2746,  2752,  2752,  2761,  2761,  2772,  2773,
+    2776,  2776,  2784,  2785,  2788,  2789,  2790,  2791,  2792,  2795,
+    2795,  2804,  2810,  2816,  2822,  2822,  2831,  2831,  2842,  2843,
+    2846,  2847,  2850
   };
 
   void
@@ -5956,9 +5966,9 @@ namespace isc { namespace dhcp {
 
 #line 14 "dhcp6_parser.yy"
 } } // isc::dhcp
-#line 5960 "dhcp6_parser.cc"
+#line 5970 "dhcp6_parser.cc"
 
-#line 2850 "dhcp6_parser.yy"
+#line 2856 "dhcp6_parser.yy"
 
 
 void
index 76e9ace47bbf5746c819b4402d3e2fed31951e05..b486cccb56935321fb22878edabfb0e5cda492fe 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.7.6.
+// A Bison parser, made by GNU Bison 3.7.2.
 
 // Skeleton interface for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
@@ -104,9 +104,9 @@ using namespace std;
 #endif
 # include "location.hh"
 #include <typeinfo>
-#ifndef PARSER6__ASSERT
+#ifndef YY_ASSERT
 # include <cassert>
-# define PARSER6__ASSERT assert
+# define YY_ASSERT assert
 #endif
 
 
@@ -128,9 +128,9 @@ using namespace std;
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YY_USE(E) ((void) (E))
+# define YYUSE(E) ((void) (E))
 #else
-# define YY_USE(E) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
 #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
@@ -232,7 +232,7 @@ namespace isc { namespace dhcp {
     semantic_type (YY_RVREF (T) t)
       : yytypeid_ (&typeid (T))
     {
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (sizeof (T) <= size);
       new (yyas_<T> ()) T (YY_MOVE (t));
     }
 
@@ -246,7 +246,7 @@ namespace isc { namespace dhcp {
     /// Destruction, allowed only if empty.
     ~semantic_type () YY_NOEXCEPT
     {
-      PARSER6__ASSERT (!yytypeid_);
+      YY_ASSERT (!yytypeid_);
     }
 
 # if 201103L <= YY_CPLUSPLUS
@@ -255,8 +255,8 @@ namespace isc { namespace dhcp {
     T&
     emplace (U&&... u)
     {
-      PARSER6__ASSERT (!yytypeid_);
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (!yytypeid_);
+      YY_ASSERT (sizeof (T) <= size);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T (std::forward <U>(u)...);
     }
@@ -266,8 +266,8 @@ namespace isc { namespace dhcp {
     T&
     emplace ()
     {
-      PARSER6__ASSERT (!yytypeid_);
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (!yytypeid_);
+      YY_ASSERT (sizeof (T) <= size);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T ();
     }
@@ -277,8 +277,8 @@ namespace isc { namespace dhcp {
     T&
     emplace (const T& t)
     {
-      PARSER6__ASSERT (!yytypeid_);
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (!yytypeid_);
+      YY_ASSERT (sizeof (T) <= size);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T (t);
     }
@@ -307,9 +307,9 @@ namespace isc { namespace dhcp {
     T&
     as () YY_NOEXCEPT
     {
-      PARSER6__ASSERT (yytypeid_);
-      PARSER6__ASSERT (*yytypeid_ == typeid (T));
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (yytypeid_);
+      YY_ASSERT (*yytypeid_ == typeid (T));
+      YY_ASSERT (sizeof (T) <= size);
       return *yyas_<T> ();
     }
 
@@ -318,9 +318,9 @@ namespace isc { namespace dhcp {
     const T&
     as () const YY_NOEXCEPT
     {
-      PARSER6__ASSERT (yytypeid_);
-      PARSER6__ASSERT (*yytypeid_ == typeid (T));
-      PARSER6__ASSERT (sizeof (T) <= size);
+      YY_ASSERT (yytypeid_);
+      YY_ASSERT (*yytypeid_ == typeid (T));
+      YY_ASSERT (sizeof (T) <= size);
       return *yyas_<T> ();
     }
 
@@ -336,8 +336,8 @@ namespace isc { namespace dhcp {
     void
     swap (self_type& that) YY_NOEXCEPT
     {
-      PARSER6__ASSERT (yytypeid_);
-      PARSER6__ASSERT (*yytypeid_ == *that.yytypeid_);
+      YY_ASSERT (yytypeid_);
+      YY_ASSERT (*yytypeid_ == *that.yytypeid_);
       std::swap (as<T> (), that.as<T> ());
     }
 
@@ -1436,7 +1436,7 @@ namespace isc { namespace dhcp {
       /// Copy constructor.
       basic_symbol (const basic_symbol& that);
 
-      /// Constructors for typed symbols.
+      /// Constructor for valueless symbols, and symbols from each type.
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, location_type&& l)
         : Base (t)
@@ -1448,7 +1448,6 @@ namespace isc { namespace dhcp {
         , location (l)
       {}
 #endif
-
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, ElementPtr&& v, location_type&& l)
         : Base (t)
@@ -1462,7 +1461,6 @@ namespace isc { namespace dhcp {
         , location (l)
       {}
 #endif
-
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, bool&& v, location_type&& l)
         : Base (t)
@@ -1476,7 +1474,6 @@ namespace isc { namespace dhcp {
         , location (l)
       {}
 #endif
-
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, double&& v, location_type&& l)
         : Base (t)
@@ -1490,7 +1487,6 @@ namespace isc { namespace dhcp {
         , location (l)
       {}
 #endif
-
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, int64_t&& v, location_type&& l)
         : Base (t)
@@ -1504,7 +1500,6 @@ namespace isc { namespace dhcp {
         , location (l)
       {}
 #endif
-
 #if 201103L <= YY_CPLUSPLUS
       basic_symbol (typename Base::kind_type t, std::string&& v, location_type&& l)
         : Base (t)
@@ -1526,7 +1521,7 @@ namespace isc { namespace dhcp {
       }
 
       /// Destroy contents, and record that is empty.
-      void clear () YY_NOEXCEPT
+      void clear ()
       {
         // User destructor.
         symbol_kind_type yykind = this->kind ();
@@ -1624,7 +1619,7 @@ switch (yykind)
       by_kind (kind_type t);
 
       /// Record that this symbol is empty.
-      void clear () YY_NOEXCEPT;
+      void clear ();
 
       /// Steal the symbol kind from \a that.
       void move (by_kind& that);
@@ -1657,54 +1652,68 @@ switch (yykind)
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, location_type l)
         : super_type(token_type (tok), std::move (l))
+      {
+        YY_ASSERT (tok == token::TOKEN_END || tok == token::TOKEN_PARSER6_error || tok == token::TOKEN_PARSER6_UNDEF || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DATA_DIRECTORY || tok == token::TOKEN_CONFIG_CONTROL || tok == token::TOKEN_CONFIG_DATABASES || tok == token::TOKEN_CONFIG_FETCH_WAIT_TIME || tok == token::TOKEN_INTERFACES_CONFIG || tok == token::TOKEN_INTERFACES || tok == token::TOKEN_RE_DETECT || tok == token::TOKEN_LEASE_DATABASE || tok == token::TOKEN_HOSTS_DATABASE || tok == token::TOKEN_HOSTS_DATABASES || tok == token::TOKEN_TYPE || tok == token::TOKEN_MEMFILE || tok == token::TOKEN_MYSQL || tok == token::TOKEN_POSTGRESQL || tok == token::TOKEN_CQL || tok == token::TOKEN_USER || tok == token::TOKEN_PASSWORD || tok == token::TOKEN_HOST || tok == token::TOKEN_PORT || tok == token::TOKEN_PERSIST || tok == token::TOKEN_LFC_INTERVAL || tok == token::TOKEN_READONLY || tok == token::TOKEN_CONNECT_TIMEOUT || tok == token::TOKEN_CONTACT_POINTS || tok == token::TOKEN_MAX_RECONNECT_TRIES || tok == token::TOKEN_RECONNECT_WAIT_TIME || tok == token::TOKEN_ON_FAIL || tok == token::TOKEN_STOP_RETRY_EXIT || tok == token::TOKEN_SERVE_RETRY_EXIT || tok == token::TOKEN_SERVE_RETRY_CONTINUE || tok == token::TOKEN_KEYSPACE || tok == token::TOKEN_CONSISTENCY || tok == token::TOKEN_SERIAL_CONSISTENCY || tok == token::TOKEN_REQUEST_TIMEOUT || tok == token::TOKEN_TCP_KEEPALIVE || tok == token::TOKEN_TCP_NODELAY || tok == token::TOKEN_MAX_ROW_ERRORS || tok == token::TOKEN_PREFERRED_LIFETIME || tok == token::TOKEN_MIN_PREFERRED_LIFETIME || tok == token::TOKEN_MAX_PREFERRED_LIFETIME || tok == token::TOKEN_VALID_LIFETIME || tok == token::TOKEN_MIN_VALID_LIFETIME || tok == token::TOKEN_MAX_VALID_LIFETIME || tok == token::TOKEN_RENEW_TIMER || tok == token::TOKEN_REBIND_TIMER || tok == token::TOKEN_CALCULATE_TEE_TIMES || tok == token::TOKEN_T1_PERCENT || tok == token::TOKEN_T2_PERCENT || tok == token::TOKEN_CACHE_THRESHOLD || tok == token::TOKEN_CACHE_MAX_AGE || tok == token::TOKEN_DECLINE_PROBATION_PERIOD || tok == token::TOKEN_SERVER_TAG || tok == token::TOKEN_STATISTIC_DEFAULT_SAMPLE_COUNT || tok == token::TOKEN_STATISTIC_DEFAULT_SAMPLE_AGE || tok == token::TOKEN_DDNS_SEND_UPDATES || tok == token::TOKEN_DDNS_OVERRIDE_NO_UPDATE || tok == token::TOKEN_DDNS_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_DDNS_REPLACE_CLIENT_NAME || tok == token::TOKEN_DDNS_GENERATED_PREFIX || tok == token::TOKEN_DDNS_QUALIFYING_SUFFIX || tok == token::TOKEN_DDNS_UPDATE_ON_RENEW || tok == token::TOKEN_DDNS_USE_CONFLICT_RESOLUTION || tok == token::TOKEN_STORE_EXTENDED_INFO || tok == token::TOKEN_SUBNET6 || tok == token::TOKEN_OPTION_DEF || tok == token::TOKEN_OPTION_DATA || tok == token::TOKEN_NAME || tok == token::TOKEN_DATA || tok == token::TOKEN_CODE || tok == token::TOKEN_SPACE || tok == token::TOKEN_CSV_FORMAT || tok == token::TOKEN_ALWAYS_SEND || tok == token::TOKEN_RECORD_TYPES || tok == token::TOKEN_ENCAPSULATE || tok == token::TOKEN_ARRAY || tok == token::TOKEN_SHARED_NETWORKS || tok == token::TOKEN_POOLS || tok == token::TOKEN_POOL || tok == token::TOKEN_PD_POOLS || tok == token::TOKEN_PREFIX || tok == token::TOKEN_PREFIX_LEN || tok == token::TOKEN_EXCLUDED_PREFIX || tok == token::TOKEN_EXCLUDED_PREFIX_LEN || tok == token::TOKEN_DELEGATED_LEN || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_SUBNET || tok == token::TOKEN_INTERFACE || tok == token::TOKEN_INTERFACE_ID || tok == token::TOKEN_ID || tok == token::TOKEN_RAPID_COMMIT || tok == token::TOKEN_RESERVATION_MODE || tok == token::TOKEN_DISABLED || tok == token::TOKEN_OUT_OF_POOL || tok == token::TOKEN_GLOBAL || tok == token::TOKEN_ALL || tok == token::TOKEN_RESERVATIONS_GLOBAL || tok == token::TOKEN_RESERVATIONS_IN_SUBNET || tok == token::TOKEN_RESERVATIONS_OUT_OF_POOL || tok == token::TOKEN_MAC_SOURCES || tok == token::TOKEN_RELAY_SUPPLIED_OPTIONS || tok == token::TOKEN_HOST_RESERVATION_IDENTIFIERS || tok == token::TOKEN_SANITY_CHECKS || tok == token::TOKEN_LEASE_CHECKS || tok == token::TOKEN_CLIENT_CLASSES || tok == token::TOKEN_REQUIRE_CLIENT_CLASSES || tok == token::TOKEN_TEST || tok == token::TOKEN_ONLY_IF_REQUIRED || tok == token::TOKEN_CLIENT_CLASS || tok == token::TOKEN_RESERVATIONS || tok == token::TOKEN_IP_ADDRESSES || tok == token::TOKEN_PREFIXES || tok == token::TOKEN_DUID || tok == token::TOKEN_HW_ADDRESS || tok == token::TOKEN_HOSTNAME || tok == token::TOKEN_FLEX_ID || tok == token::TOKEN_RELAY || tok == token::TOKEN_IP_ADDRESS || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_EXPIRED_LEASES_PROCESSING || tok == token::TOKEN_RECLAIM_TIMER_WAIT_TIME || tok == token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME || tok == token::TOKEN_HOLD_RECLAIMED_TIME || tok == token::TOKEN_MAX_RECLAIM_LEASES || tok == token::TOKEN_MAX_RECLAIM_TIME || tok == token::TOKEN_UNWARNED_RECLAIM_CYCLES || tok == token::TOKEN_SERVER_ID || tok == token::TOKEN_LLT || tok == token::TOKEN_EN || tok == token::TOKEN_LL || tok == token::TOKEN_IDENTIFIER || tok == token::TOKEN_HTYPE || tok == token::TOKEN_TIME || tok == token::TOKEN_ENTERPRISE_ID || tok == token::TOKEN_DHCP4O6_PORT || tok == token::TOKEN_DHCP_MULTI_THREADING || tok == token::TOKEN_ENABLE_MULTI_THREADING || tok == token::TOKEN_THREAD_POOL_SIZE || tok == token::TOKEN_PACKET_QUEUE_SIZE || tok == token::TOKEN_CONTROL_SOCKET || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_DHCP_QUEUE_CONTROL || tok == token::TOKEN_ENABLE_QUEUE || tok == token::TOKEN_QUEUE_TYPE || tok == token::TOKEN_CAPACITY || tok == token::TOKEN_DHCP_DDNS || tok == token::TOKEN_ENABLE_UPDATES || tok == token::TOKEN_QUALIFYING_SUFFIX || tok == token::TOKEN_SERVER_IP || tok == token::TOKEN_SERVER_PORT || tok == token::TOKEN_SENDER_IP || tok == token::TOKEN_SENDER_PORT || tok == token::TOKEN_MAX_QUEUE_SIZE || tok == token::TOKEN_NCR_PROTOCOL || tok == token::TOKEN_NCR_FORMAT || tok == token::TOKEN_OVERRIDE_NO_UPDATE || tok == token::TOKEN_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_REPLACE_CLIENT_NAME || tok == token::TOKEN_GENERATED_PREFIX || tok == token::TOKEN_UDP || tok == token::TOKEN_TCP || tok == token::TOKEN_JSON || tok == token::TOKEN_WHEN_PRESENT || tok == token::TOKEN_NEVER || tok == token::TOKEN_ALWAYS || tok == token::TOKEN_WHEN_NOT_PRESENT || tok == token::TOKEN_HOSTNAME_CHAR_SET || tok == token::TOKEN_HOSTNAME_CHAR_REPLACEMENT || tok == token::TOKEN_IP_RESERVATIONS_UNIQUE || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_PATTERN || tok == token::TOKEN_COMPATIBILITY || tok == token::TOKEN_LENIENT_OPTION_PARSING || tok == token::TOKEN_TOPLEVEL_JSON || tok == token::TOKEN_TOPLEVEL_DHCP6 || tok == token::TOKEN_SUB_DHCP6 || tok == token::TOKEN_SUB_INTERFACES6 || tok == token::TOKEN_SUB_SUBNET6 || tok == token::TOKEN_SUB_POOL6 || tok == token::TOKEN_SUB_PD_POOL || tok == token::TOKEN_SUB_RESERVATION || tok == token::TOKEN_SUB_OPTION_DEFS || tok == token::TOKEN_SUB_OPTION_DEF || tok == token::TOKEN_SUB_OPTION_DATA || tok == token::TOKEN_SUB_HOOKS_LIBRARY || tok == token::TOKEN_SUB_DHCP_DDNS || tok == token::TOKEN_SUB_CONFIG_CONTROL);
+      }
 #else
       symbol_type (int tok, const location_type& l)
         : super_type(token_type (tok), l)
-#endif
       {
-        PARSER6__ASSERT (tok == token::TOKEN_END
-                   || (token::TOKEN_PARSER6_error <= tok && tok <= token::TOKEN_SUB_CONFIG_CONTROL));
+        YY_ASSERT (tok == token::TOKEN_END || tok == token::TOKEN_PARSER6_error || tok == token::TOKEN_PARSER6_UNDEF || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DATA_DIRECTORY || tok == token::TOKEN_CONFIG_CONTROL || tok == token::TOKEN_CONFIG_DATABASES || tok == token::TOKEN_CONFIG_FETCH_WAIT_TIME || tok == token::TOKEN_INTERFACES_CONFIG || tok == token::TOKEN_INTERFACES || tok == token::TOKEN_RE_DETECT || tok == token::TOKEN_LEASE_DATABASE || tok == token::TOKEN_HOSTS_DATABASE || tok == token::TOKEN_HOSTS_DATABASES || tok == token::TOKEN_TYPE || tok == token::TOKEN_MEMFILE || tok == token::TOKEN_MYSQL || tok == token::TOKEN_POSTGRESQL || tok == token::TOKEN_CQL || tok == token::TOKEN_USER || tok == token::TOKEN_PASSWORD || tok == token::TOKEN_HOST || tok == token::TOKEN_PORT || tok == token::TOKEN_PERSIST || tok == token::TOKEN_LFC_INTERVAL || tok == token::TOKEN_READONLY || tok == token::TOKEN_CONNECT_TIMEOUT || tok == token::TOKEN_CONTACT_POINTS || tok == token::TOKEN_MAX_RECONNECT_TRIES || tok == token::TOKEN_RECONNECT_WAIT_TIME || tok == token::TOKEN_ON_FAIL || tok == token::TOKEN_STOP_RETRY_EXIT || tok == token::TOKEN_SERVE_RETRY_EXIT || tok == token::TOKEN_SERVE_RETRY_CONTINUE || tok == token::TOKEN_KEYSPACE || tok == token::TOKEN_CONSISTENCY || tok == token::TOKEN_SERIAL_CONSISTENCY || tok == token::TOKEN_REQUEST_TIMEOUT || tok == token::TOKEN_TCP_KEEPALIVE || tok == token::TOKEN_TCP_NODELAY || tok == token::TOKEN_MAX_ROW_ERRORS || tok == token::TOKEN_PREFERRED_LIFETIME || tok == token::TOKEN_MIN_PREFERRED_LIFETIME || tok == token::TOKEN_MAX_PREFERRED_LIFETIME || tok == token::TOKEN_VALID_LIFETIME || tok == token::TOKEN_MIN_VALID_LIFETIME || tok == token::TOKEN_MAX_VALID_LIFETIME || tok == token::TOKEN_RENEW_TIMER || tok == token::TOKEN_REBIND_TIMER || tok == token::TOKEN_CALCULATE_TEE_TIMES || tok == token::TOKEN_T1_PERCENT || tok == token::TOKEN_T2_PERCENT || tok == token::TOKEN_CACHE_THRESHOLD || tok == token::TOKEN_CACHE_MAX_AGE || tok == token::TOKEN_DECLINE_PROBATION_PERIOD || tok == token::TOKEN_SERVER_TAG || tok == token::TOKEN_STATISTIC_DEFAULT_SAMPLE_COUNT || tok == token::TOKEN_STATISTIC_DEFAULT_SAMPLE_AGE || tok == token::TOKEN_DDNS_SEND_UPDATES || tok == token::TOKEN_DDNS_OVERRIDE_NO_UPDATE || tok == token::TOKEN_DDNS_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_DDNS_REPLACE_CLIENT_NAME || tok == token::TOKEN_DDNS_GENERATED_PREFIX || tok == token::TOKEN_DDNS_QUALIFYING_SUFFIX || tok == token::TOKEN_DDNS_UPDATE_ON_RENEW || tok == token::TOKEN_DDNS_USE_CONFLICT_RESOLUTION || tok == token::TOKEN_STORE_EXTENDED_INFO || tok == token::TOKEN_SUBNET6 || tok == token::TOKEN_OPTION_DEF || tok == token::TOKEN_OPTION_DATA || tok == token::TOKEN_NAME || tok == token::TOKEN_DATA || tok == token::TOKEN_CODE || tok == token::TOKEN_SPACE || tok == token::TOKEN_CSV_FORMAT || tok == token::TOKEN_ALWAYS_SEND || tok == token::TOKEN_RECORD_TYPES || tok == token::TOKEN_ENCAPSULATE || tok == token::TOKEN_ARRAY || tok == token::TOKEN_SHARED_NETWORKS || tok == token::TOKEN_POOLS || tok == token::TOKEN_POOL || tok == token::TOKEN_PD_POOLS || tok == token::TOKEN_PREFIX || tok == token::TOKEN_PREFIX_LEN || tok == token::TOKEN_EXCLUDED_PREFIX || tok == token::TOKEN_EXCLUDED_PREFIX_LEN || tok == token::TOKEN_DELEGATED_LEN || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_SUBNET || tok == token::TOKEN_INTERFACE || tok == token::TOKEN_INTERFACE_ID || tok == token::TOKEN_ID || tok == token::TOKEN_RAPID_COMMIT || tok == token::TOKEN_RESERVATION_MODE || tok == token::TOKEN_DISABLED || tok == token::TOKEN_OUT_OF_POOL || tok == token::TOKEN_GLOBAL || tok == token::TOKEN_ALL || tok == token::TOKEN_RESERVATIONS_GLOBAL || tok == token::TOKEN_RESERVATIONS_IN_SUBNET || tok == token::TOKEN_RESERVATIONS_OUT_OF_POOL || tok == token::TOKEN_MAC_SOURCES || tok == token::TOKEN_RELAY_SUPPLIED_OPTIONS || tok == token::TOKEN_HOST_RESERVATION_IDENTIFIERS || tok == token::TOKEN_SANITY_CHECKS || tok == token::TOKEN_LEASE_CHECKS || tok == token::TOKEN_CLIENT_CLASSES || tok == token::TOKEN_REQUIRE_CLIENT_CLASSES || tok == token::TOKEN_TEST || tok == token::TOKEN_ONLY_IF_REQUIRED || tok == token::TOKEN_CLIENT_CLASS || tok == token::TOKEN_RESERVATIONS || tok == token::TOKEN_IP_ADDRESSES || tok == token::TOKEN_PREFIXES || tok == token::TOKEN_DUID || tok == token::TOKEN_HW_ADDRESS || tok == token::TOKEN_HOSTNAME || tok == token::TOKEN_FLEX_ID || tok == token::TOKEN_RELAY || tok == token::TOKEN_IP_ADDRESS || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_EXPIRED_LEASES_PROCESSING || tok == token::TOKEN_RECLAIM_TIMER_WAIT_TIME || tok == token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME || tok == token::TOKEN_HOLD_RECLAIMED_TIME || tok == token::TOKEN_MAX_RECLAIM_LEASES || tok == token::TOKEN_MAX_RECLAIM_TIME || tok == token::TOKEN_UNWARNED_RECLAIM_CYCLES || tok == token::TOKEN_SERVER_ID || tok == token::TOKEN_LLT || tok == token::TOKEN_EN || tok == token::TOKEN_LL || tok == token::TOKEN_IDENTIFIER || tok == token::TOKEN_HTYPE || tok == token::TOKEN_TIME || tok == token::TOKEN_ENTERPRISE_ID || tok == token::TOKEN_DHCP4O6_PORT || tok == token::TOKEN_DHCP_MULTI_THREADING || tok == token::TOKEN_ENABLE_MULTI_THREADING || tok == token::TOKEN_THREAD_POOL_SIZE || tok == token::TOKEN_PACKET_QUEUE_SIZE || tok == token::TOKEN_CONTROL_SOCKET || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_DHCP_QUEUE_CONTROL || tok == token::TOKEN_ENABLE_QUEUE || tok == token::TOKEN_QUEUE_TYPE || tok == token::TOKEN_CAPACITY || tok == token::TOKEN_DHCP_DDNS || tok == token::TOKEN_ENABLE_UPDATES || tok == token::TOKEN_QUALIFYING_SUFFIX || tok == token::TOKEN_SERVER_IP || tok == token::TOKEN_SERVER_PORT || tok == token::TOKEN_SENDER_IP || tok == token::TOKEN_SENDER_PORT || tok == token::TOKEN_MAX_QUEUE_SIZE || tok == token::TOKEN_NCR_PROTOCOL || tok == token::TOKEN_NCR_FORMAT || tok == token::TOKEN_OVERRIDE_NO_UPDATE || tok == token::TOKEN_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_REPLACE_CLIENT_NAME || tok == token::TOKEN_GENERATED_PREFIX || tok == token::TOKEN_UDP || tok == token::TOKEN_TCP || tok == token::TOKEN_JSON || tok == token::TOKEN_WHEN_PRESENT || tok == token::TOKEN_NEVER || tok == token::TOKEN_ALWAYS || tok == token::TOKEN_WHEN_NOT_PRESENT || tok == token::TOKEN_HOSTNAME_CHAR_SET || tok == token::TOKEN_HOSTNAME_CHAR_REPLACEMENT || tok == token::TOKEN_IP_RESERVATIONS_UNIQUE || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_PATTERN || tok == token::TOKEN_COMPATIBILITY || tok == token::TOKEN_LENIENT_OPTION_PARSING || tok == token::TOKEN_TOPLEVEL_JSON || tok == token::TOKEN_TOPLEVEL_DHCP6 || tok == token::TOKEN_SUB_DHCP6 || tok == token::TOKEN_SUB_INTERFACES6 || tok == token::TOKEN_SUB_SUBNET6 || tok == token::TOKEN_SUB_POOL6 || tok == token::TOKEN_SUB_PD_POOL || tok == token::TOKEN_SUB_RESERVATION || tok == token::TOKEN_SUB_OPTION_DEFS || tok == token::TOKEN_SUB_OPTION_DEF || tok == token::TOKEN_SUB_OPTION_DATA || tok == token::TOKEN_SUB_HOOKS_LIBRARY || tok == token::TOKEN_SUB_DHCP_DDNS || tok == token::TOKEN_SUB_CONFIG_CONTROL);
       }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, bool v, location_type l)
         : super_type(token_type (tok), std::move (v), std::move (l))
+      {
+        YY_ASSERT (tok == token::TOKEN_BOOLEAN);
+      }
 #else
       symbol_type (int tok, const bool& v, const location_type& l)
         : super_type(token_type (tok), v, l)
-#endif
       {
-        PARSER6__ASSERT (tok == token::TOKEN_BOOLEAN);
+        YY_ASSERT (tok == token::TOKEN_BOOLEAN);
       }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, double v, location_type l)
         : super_type(token_type (tok), std::move (v), std::move (l))
+      {
+        YY_ASSERT (tok == token::TOKEN_FLOAT);
+      }
 #else
       symbol_type (int tok, const double& v, const location_type& l)
         : super_type(token_type (tok), v, l)
-#endif
       {
-        PARSER6__ASSERT (tok == token::TOKEN_FLOAT);
+        YY_ASSERT (tok == token::TOKEN_FLOAT);
       }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, int64_t v, location_type l)
         : super_type(token_type (tok), std::move (v), std::move (l))
+      {
+        YY_ASSERT (tok == token::TOKEN_INTEGER);
+      }
 #else
       symbol_type (int tok, const int64_t& v, const location_type& l)
         : super_type(token_type (tok), v, l)
-#endif
       {
-        PARSER6__ASSERT (tok == token::TOKEN_INTEGER);
+        YY_ASSERT (tok == token::TOKEN_INTEGER);
       }
+#endif
 #if 201103L <= YY_CPLUSPLUS
       symbol_type (int tok, std::string v, location_type l)
         : super_type(token_type (tok), std::move (v), std::move (l))
+      {
+        YY_ASSERT (tok == token::TOKEN_STRING);
+      }
 #else
       symbol_type (int tok, const std::string& v, const location_type& l)
         : super_type(token_type (tok), v, l)
-#endif
       {
-        PARSER6__ASSERT (tok == token::TOKEN_STRING);
+        YY_ASSERT (tok == token::TOKEN_STRING);
       }
+#endif
     };
 
     /// Build a parser object.
@@ -4939,9 +4948,9 @@ switch (yykind)
     {
     public:
       context (const Dhcp6Parser& yyparser, const symbol_type& yyla);
-      const symbol_type& lookahead () const YY_NOEXCEPT { return yyla_; }
-      symbol_kind_type token () const YY_NOEXCEPT { return yyla_.kind (); }
-      const location_type& location () const YY_NOEXCEPT { return yyla_.location; }
+      const symbol_type& lookahead () const { return yyla_; }
+      symbol_kind_type token () const { return yyla_.kind (); }
+      const location_type& location () const { return yyla_.location; }
 
       /// Put in YYARG at most YYARGN of the expected tokens, and return the
       /// number of tokens stored in YYARG.  If YYARG is null, return the
@@ -5263,7 +5272,7 @@ switch (yykind)
     /// Constants.
     enum
     {
-      yylast_ = 1296,     ///< Last index in yytable_.
+      yylast_ = 1314,     ///< Last index in yytable_.
       yynnts_ = 438,  ///< Number of nonterminal symbols.
       yyfinal_ = 30 ///< Termination state number.
     };
@@ -5469,7 +5478,7 @@ switch (yykind)
 
   inline
   void
-  Dhcp6Parser::by_kind::clear () YY_NOEXCEPT
+  Dhcp6Parser::by_kind::clear ()
   {
     kind_ = symbol_kind::S_YYEMPTY;
   }
@@ -5498,7 +5507,7 @@ switch (yykind)
 
 #line 14 "dhcp6_parser.yy"
 } } // isc::dhcp
-#line 5502 "dhcp6_parser.h"
+#line 5511 "dhcp6_parser.h"
 
 
 
index 0002e1dce624c4ce0c5a49dba66196dda3d92ac5..0c181b8a9f0503fbff644d464b7a490b63d0e157 100644 (file)
@@ -2271,6 +2271,12 @@ client_class_param: client_class_name
                   | option_data_list
                   | user_context
                   | comment
+                  | preferred_lifetime
+                  | min_preferred_lifetime
+                  | max_preferred_lifetime
+                  | valid_lifetime
+                  | min_valid_lifetime
+                  | max_valid_lifetime
                   | unknown_map_entry
                   ;
 
index e8036de559a089e89850e3f6830884b673a0ed56..a8d79e7bb09d5d3a97383540b235b207e31b125d 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.7.6.
+// A Bison parser, made by GNU Bison 3.7.2.
 
 // Locations for Bison parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 // GNU General Public License for more details.
 
 // You should have received a copy of the GNU General Public License
-// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // As a special exception, you may create a larger work that contains
 // part or all of the Bison parser skeleton and distribute that work
index be3895ac0c3571d4338b6defdaa46b6c73f5a7a1..4cb876c55d1407b7f99a2268595e8f5db3110321 100644 (file)
@@ -29,6 +29,7 @@
 #include <hooks/hooks_manager.h>
 #include <process/config_ctl_info.h>
 #include <stats/stats_mgr.h>
+#include <testutils/gtest_utils.h>
 #include <testutils/log_utils.h>
 #include <util/chrono_time_utils.h>
 
@@ -8090,4 +8091,66 @@ TEST_F(Dhcp6ParserTest, multiThreadingSettings) {
                 << "  actual: " << *(cfg) << std::endl;
 }
 
+// Verifies that client class definitions may specify
+// valid and preferred lifetime triplets.
+TEST_F(Dhcp6ParserTest, clientClassValidPreferredLifetime) {
+    string config = "{ " + genIfaceConfig() + "," +
+        "\"client-classes\" : [ \n"
+        "   { \n"
+        "       \"name\": \"one\", \n"
+        "       \"min-valid-lifetime\": 1000, \n"
+        "       \"valid-lifetime\": 2000, \n"
+        "       \"max-valid-lifetime\": 3000, \n"
+        "       \"min-preferred-lifetime\": 4000, \n"
+        "       \"preferred-lifetime\": 5000, \n"
+        "       \"max-preferred-lifetime\": 6000 \n"
+        "   }, \n"
+        "   { \n"
+        "       \"name\": \"two\" \n"
+        "   } \n"
+        "], \n"
+        "\"subnet6\": [ {  \n"
+        "    \"pools\": [ { \"pool\": \"2001:db8:1::1 - 2001:db8:1::ffff\" } ],"
+        "    \"subnet\": \"2001:db8:1::/64\""
+        " } ] \n"
+        "} \n";
+
+    ConstElementPtr json;
+    ASSERT_NO_THROW_LOG(json = parseDHCP6(config));
+    extractConfig(config);
+
+    ConstElementPtr status;
+    ASSERT_NO_THROW_LOG(status = configureDhcp6Server(srv_, json));
+    ASSERT_TRUE(status);
+    checkResult(status, 0);
+
+    // We check staging config because CfgMgr::commit hasn't been executed.
+    ClientClassDictionaryPtr dictionary;
+    dictionary = CfgMgr::instance().getStagingCfg()->getClientClassDictionary();
+    ASSERT_TRUE(dictionary);
+    EXPECT_EQ(2, dictionary->getClasses()->size());
+
+    // Execute the commit
+    ASSERT_NO_THROW(CfgMgr::instance().commit());
+
+    // Verify that after commit, the current config has the correct dictionary
+    dictionary = CfgMgr::instance().getCurrentCfg()->getClientClassDictionary();
+    ASSERT_TRUE(dictionary);
+    EXPECT_EQ(2, dictionary->getClasses()->size());
+
+    ClientClassDefPtr class_def = dictionary->findClass("one");
+    ASSERT_TRUE(class_def);
+    EXPECT_EQ(class_def->getValid().getMin(), 1000);
+    EXPECT_EQ(class_def->getValid().get(), 2000);
+    EXPECT_EQ(class_def->getValid().getMax(), 3000);
+
+    EXPECT_EQ(class_def->getPreferred().getMin(), 4000);
+    EXPECT_EQ(class_def->getPreferred().get(), 5000);
+    EXPECT_EQ(class_def->getPreferred().getMax(), 6000);
+
+    class_def = dictionary->findClass("two");
+    ASSERT_TRUE(class_def);
+    EXPECT_TRUE(class_def->getValid().unspecified());
+}
+
 }  // namespace
index b6a5bcfb24588a55a35921aea70032b25b2ac24a..b7f08f1b18c643af8ba629b3df237b59c0f4a568 100644 (file)
@@ -10,6 +10,7 @@
 #include <dhcpsrv/parsers/simple_parser6.h>
 #include <testutils/io_utils.h>
 #include <testutils/user_context_utils.h>
+#include <testutils/gtest_utils.h>
 #include <gtest/gtest.h>
 #include <fstream>
 #include <set>
@@ -245,7 +246,7 @@ void testFile(const std::string& fname) {
 
     cout << "Parsing file " << fname << "(" << decommented << ")" << endl;
 
-    EXPECT_NO_THROW(json = Element::fromJSONFile(decommented, true));
+    EXPECT_NO_THROW_LOG(json = Element::fromJSONFile(decommented, true));
     reference_json = moveComments(json);
 
     // remove the temporary file
index da354d88332dc64acda68b9cd86eddc811a4b0e9..be1cc40af322ffc2f49d88522807d66ae36363a5 100644 (file)
@@ -1906,6 +1906,64 @@ AllocEngine::reuseExpiredLease(Lease6Ptr& expired, ClientContext6& ctx,
     return (expired);
 }
 
+void
+AllocEngine::getLifetimes6(ClientContext6& ctx, uint32_t& preferred, uint32_t& valid) {
+    // If the triplets are specified in one of our classes use it.
+    // We use the first one we find for each lifetime.
+    Triplet<uint32_t> candidate_preferred;
+    Triplet<uint32_t> candidate_valid;
+    const ClientClasses classes = ctx.query_->getClasses();
+    if (!classes.empty()) {
+        // Let's get class definitions
+        const ClientClassDictionaryPtr& dict =
+            CfgMgr::instance().getCurrentCfg()->getClientClassDictionary();
+
+        // Iterate over the assigned class defintions.
+        int cnt = 0;
+        for (ClientClasses::const_iterator name = classes.cbegin();
+             name != classes.cend() && cnt < 2; ++name) {
+            ClientClassDefPtr cl = dict->findClass(*name);
+            if (candidate_preferred.unspecified() &&
+                (cl && (!cl->getPreferred().unspecified()))) {
+                candidate_preferred = cl->getPreferred();
+                ++cnt;
+            }
+
+            if (candidate_valid.unspecified() &&
+                (cl && (!cl->getValid().unspecified()))) {
+                candidate_valid = cl->getValid();
+                ++cnt;
+            }
+        }
+    }
+
+    // If no classes specified preferred lifetime, get it from the subnet.
+    if (!candidate_preferred) {
+        candidate_preferred = ctx.subnet_->getPreferred();
+    }
+
+    // If no classes specified valid lifetime, get it from the subnet.
+    if (!candidate_valid) {
+        candidate_valid = ctx.subnet_->getValid();
+    }
+
+    // Set the outbound parameters to the values we have so far.
+    preferred = candidate_preferred;
+    valid = candidate_valid;
+
+    // If client requested either value, use the requested value(s) bounded by
+    // the candidate triplet(s).
+    if (!ctx.currentIA().hints_.empty()) {
+        if (ctx.currentIA().hints_[0].getPreferred()) {
+            preferred = candidate_preferred.get(ctx.currentIA().hints_[0].getPreferred());
+        }
+
+        if (ctx.currentIA().hints_[0].getValid()) {
+            valid = candidate_valid.get(ctx.currentIA().hints_[0].getValid());
+        }
+    }
+}
+
 Lease6Ptr AllocEngine::createLease6(ClientContext6& ctx,
                                     const IOAddress& addr,
                                     uint8_t prefix_len,
@@ -1915,18 +1973,10 @@ Lease6Ptr AllocEngine::createLease6(ClientContext6& ctx,
         prefix_len = 128; // non-PD lease types must be always /128
     }
 
-    uint32_t preferred = ctx.subnet_->getPreferred();
-    if (!ctx.currentIA().hints_.empty() &&
-        ctx.currentIA().hints_[0].getPreferred()) {
-        preferred = ctx.currentIA().hints_[0].getPreferred();
-        preferred = ctx.subnet_->getPreferred().get(preferred);
-    }
-    uint32_t valid = ctx.subnet_->getValid();
-    if (!ctx.currentIA().hints_.empty() &&
-        ctx.currentIA().hints_[0].getValid()) {
-        valid = ctx.currentIA().hints_[0].getValid();
-        valid = ctx.subnet_->getValid().get(valid);
-    }
+    uint32_t preferred = 0;
+    uint32_t valid = 0;
+    getLifetimes6(ctx, preferred, valid);
+
     Lease6Ptr lease(new Lease6(ctx.currentIA().type_, addr, ctx.duid_,
                                ctx.currentIA().iaid_, preferred,
                                valid, ctx.subnet_->getID(),
index d0b7a06d93cbe0ce789dbe8124ea2365cad96cdd..7d3f90507a0559034574c605b630281e926e6b2a 100644 (file)
@@ -996,6 +996,25 @@ public:
         return (IPv6Resrv(IPv6Resrv::TYPE_PD, lease.addr_, lease.prefixlen_));
     }
 
+public:
+    /// @brief Determines the preferred and valid v6 lease lifetimes.
+    ///
+    /// A candidate triplet for both preferred and valid lifetimes will be 
+    /// selected from the first class matched to the query which defines the
+    /// value or from the subnet if none do. Classes are searched in the order 
+    /// they are assigned to the query.
+    ///
+    /// If the client requested a lifetime IA hint, then the
+    /// lifetime values returned will be the requested values bounded by
+    /// the candidate triplets.  If the client did not request a value, then
+    /// it simply returns the candidate triplet's default value.
+    ///
+    /// @param ctx client context that passes all necessary information. See
+    ///        @ref ClientContext6 for details.
+    /// @param [out] preferred set to the preferred lifetime that should be used.
+    /// @param [out] valid set to the valid lifetime that should be used.
+    static void getLifetimes6(ClientContext6& ctx, uint32_t& preferred,
+                              uint32_t& valid);
 private:
 
     /// @brief Creates a lease and inserts it in LeaseMgr if necessary
index 839e0a632693dc692d6496e500f65f29e5e72ac9..6a3b3c10cd093ebc97435cdb929384d4acf1d3e8 100644 (file)
@@ -24,7 +24,7 @@ ClientClassDef::ClientClassDef(const std::string& name,
     : UserContext(), CfgToElement(), StampedElement(), name_(name),
       match_expr_(match_expr), required_(false), depend_on_known_(false),
       cfg_option_(cfg_option), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()),
-      valid_() {
+      valid_(), preferred_() {
 
     // Name can't be blank
     if (name_.empty()) {
@@ -44,7 +44,7 @@ ClientClassDef::ClientClassDef(const ClientClassDef& rhs)
       match_expr_(ExpressionPtr()), test_(rhs.test_), required_(rhs.required_),
       depend_on_known_(rhs.depend_on_known_), cfg_option_(new CfgOption()),
       next_server_(rhs.next_server_), sname_(rhs.sname_),
-      filename_(rhs.filename_), valid_(rhs.valid_) {
+      filename_(rhs.filename_), valid_(rhs.valid_), preferred_(rhs.preferred_) {
 
     if (rhs.match_expr_) {
         match_expr_.reset(new Expression());
@@ -180,16 +180,33 @@ ClientClassDef:: toElement() const {
     }
     // Set option-data
     result->set("option-data", cfg_option_->toElement());
-    if (family != AF_INET) {
-        // Other parameters are DHCPv4 specific
-        return (result);
+
+    if (family == AF_INET) {
+        // V4 only
+        // Set next-server
+        result->set("next-server", Element::create(next_server_.toText()));
+        // Set server-hostname
+        result->set("server-hostname", Element::create(sname_));
+        // Set boot-file-name
+        result->set("boot-file-name", Element::create(filename_));
+    } else {
+        // V6 only
+        // Set preferred-lifetime
+        if (!preferred_.unspecified()) {
+            result->set("preferred-lifetime",
+                        Element::create(static_cast<long long>(preferred_.get())));
+        }
+
+        if (preferred_.getMin() < preferred_.get()) {
+            result->set("min-preferred-lifetime",
+                        Element::create(static_cast<long long>(preferred_.getMin())));
+        }
+
+        if (preferred_.getMax() > preferred_.get()) {
+            result->set("max-preferred-lifetime",
+                        Element::create(static_cast<long long>(preferred_.getMax())));
+        }
     }
-    // Set next-server
-    result->set("next-server", Element::create(next_server_.toText()));
-    // Set server-hostname
-    result->set("server-hostname", Element::create(sname_));
-    // Set boot-file-name
-    result->set("boot-file-name", Element::create(filename_));
 
     // Set valid-lifetime
     if (!valid_.unspecified()) {
@@ -244,7 +261,8 @@ ClientClassDictionary::addClass(const std::string& name,
                                 asiolink::IOAddress next_server,
                                 const std::string& sname,
                                 const std::string& filename,
-                                const Triplet<uint32_t>& valid) {
+                                const Triplet<uint32_t>& valid,
+                                const Triplet<uint32_t>& preferred) {
     ClientClassDefPtr cclass(new ClientClassDef(name, match_expr, cfg_option));
     cclass->setTest(test);
     cclass->setRequired(required);
@@ -255,6 +273,7 @@ ClientClassDictionary::addClass(const std::string& name,
     cclass->setSname(sname);
     cclass->setFilename(filename);
     cclass->setValid(valid);
+    cclass->setPreferred(preferred);
     addClass(cclass);
 }
 
index 8cb87b0d9d4a6d59e6d7be2854c89a012883a278..89542b02947c2ea33371966860b03c1532fc0e0f 100644 (file)
@@ -208,6 +208,20 @@ public:
         valid_ = valid;
     }
 
+    /// @brief Return preferred-lifetime value
+    ///
+    /// @return a triplet containing the preferred lifetime.
+    Triplet<uint32_t> getPreferred() const {
+        return (preferred_);
+    }
+
+    /// @brief Sets new preferred lifetime
+    ///
+    /// @param preferred New valid lifetime in seconds.
+    void setPreferred(const Triplet<uint32_t>& preferred) {
+        preferred_ = preferred;
+    }
+
     /// @brief Unparse a configuration object
     ///
     /// @return a pointer to unparsed configuration
@@ -266,6 +280,9 @@ private:
 
     /// @brief a Triplet (min/default/max) holding allowed valid lifetime values
     Triplet<uint32_t> valid_;
+
+    /// @brief a Triplet (min/default/max) holding allowed preferred lifetime values
+    Triplet<uint32_t> preferred_;
 };
 
 /// @brief a pointer to an ClientClassDef
@@ -309,6 +326,7 @@ public:
     /// @param sname server-name value for this class (optional)
     /// @param filename boot-file-name value for this class (optional)
     /// @param valid valid-lifetime triplet (optional)
+    /// @param preferred preferred-lifetime triplet (optional)
     ///
     /// @throw DuplicateClientClassDef if class already exists within the
     /// dictionary.  See @ref dhcp::ClientClassDef::ClientClassDef() for
@@ -321,7 +339,8 @@ public:
                   asiolink::IOAddress next_server = asiolink::IOAddress("0.0.0.0"),
                   const std::string& sname = std::string(),
                   const std::string& filename = std::string(),
-                  const Triplet<uint32_t>&valid = Triplet<uint32_t>());
+                  const Triplet<uint32_t>&valid = Triplet<uint32_t>(),
+                  const Triplet<uint32_t>&preferred = Triplet<uint32_t>());
 
     /// @brief Adds a new class to the list
     ///
index 75a71ca1b71d042dccf74d51bee94cf2be0b5294..348694195ad9247eef13c86507d663b99f796625 100644 (file)
@@ -205,6 +205,12 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary,
     // Parse valid lifetime triplet.
     Triplet<uint32_t> valid_lft = parseIntTriplet(class_def_cfg, "valid-lifetime");
 
+    Triplet<uint32_t> preferred_lft;
+    if (family != AF_INET) {
+        // Parse preferred lifetime triplet.
+        preferred_lft = parseIntTriplet(class_def_cfg, "preferred-lifetime");
+    }
+
     // Sanity checks on built-in classes
     for (auto bn : builtinNames) {
         if (name == bn) {
@@ -232,7 +238,8 @@ ClientClassDefParser::parse(ClientClassDictionaryPtr& class_dictionary,
     try {
         class_dictionary->addClass(name, match_expr, test, required,
                                    depend_on_known, options, defs,
-                                   user_context, next_server, sname, filename, valid_lft);
+                                   user_context, next_server, sname, filename,
+                                   valid_lft, preferred_lft);
     } catch (const std::exception& ex) {
         std::ostringstream s;
         s << "Can't add class: " << ex.what();
@@ -257,7 +264,11 @@ ClientClassDefParser::checkParametersSupported(const ConstElementPtr& class_def_
                                                       "test",
                                                       "option-data",
                                                       "user-context",
-                                                      "only-if-required" };
+                                                      "only-if-required",
+                                                      "valid-lifetime",
+                                                      "min-valid-lifetime",
+                                                      "max-valid-lifetime" };
+
 
     // The v4 client class supports additional parameters.
     static std::set<std::string> supported_params_v4 = { "option-def",
@@ -265,12 +276,17 @@ ClientClassDefParser::checkParametersSupported(const ConstElementPtr& class_def_
                                                          "server-hostname",
                                                          "boot-file-name" };
 
+    // The v6 client class supports additional parameters.
+    static std::set<std::string> supported_params_v6 = { "preferred-lifetime",
+                                                         "min-preferred-lifetime",
+                                                         "max-preferred-lifetime" };
+
     // Iterate over the specified parameters and check if they are all supported.
     for (auto name_value_pair : class_def_cfg->mapValue()) {
         if ((supported_params.count(name_value_pair.first) > 0) ||
-            ((family == AF_INET) && (supported_params_v4.count(name_value_pair.first) > 0))) {
+            ((family == AF_INET) && (supported_params_v4.count(name_value_pair.first) > 0)) ||
+            ((family != AF_INET) && (supported_params_v6.count(name_value_pair.first) > 0))) {
             continue;
-
         } else {
             isc_throw(DhcpConfigError, "unsupported client class parameter '"
                       << name_value_pair.first << "'");
index 4582df84c08c89ab5b0dd744e610ad3cac84a87b..825b74386ba22fa2185a86a035aa7e6574dabd13 100644 (file)
@@ -5238,6 +5238,262 @@ TEST_F(AllocEngine6Test, renewCacheHostname6) {
     detailCompareLease(lease, from_mgr);
 }
 
+// Verifies that AllocEngine::getLifetimes6() returns the appropriate
+// valid lifetime value based on the context content.
+TEST_F(AllocEngine6Test, getValidLifetime) {
+    boost::scoped_ptr<AllocEngine> engine;
+    ASSERT_NO_THROW(engine.reset(new AllocEngine(AllocEngine::ALLOC_ITERATIVE, 100)));
+    ASSERT_TRUE(engine);
+
+    // Let's make three classes, two with valid-lifetime and one without,
+    // and add them to the dictionary.
+    ClientClassDictionaryPtr dictionary = 
+        CfgMgr::instance().getStagingCfg()->getClientClassDictionary();
+
+    ClientClassDefPtr class_def(new ClientClassDef("valid_one", ExpressionPtr()));
+    Triplet<uint32_t> valid_one(50, 100, 150);
+    class_def->setValid(valid_one);
+    dictionary->addClass(class_def);
+
+    class_def.reset(new ClientClassDef("valid_two", ExpressionPtr()));
+    Triplet<uint32_t>valid_two(200, 250, 300);
+    class_def->setValid(valid_two);
+    dictionary->addClass(class_def);
+
+    class_def.reset(new ClientClassDef("valid_unspec", ExpressionPtr()));
+    dictionary->addClass(class_def);
+
+    // Commit our class changes.
+    CfgMgr::instance().commit();
+
+    // Update the subnet's triplet to something more useful.
+    subnet_->setValid(Triplet<uint32_t>(500, 1000, 1500));
+
+    // Describes a test scenario.
+    struct Scenario {
+        std::string desc_;                  // descriptive text for logging
+        std::vector<std::string> classes_;  // class list of assigned classes
+        uint32_t requested_lft_;            // use as option 51 is > 0
+        uint32_t exp_valid_;                // expected lifetime
+    };
+
+    // Scenarios to test.
+    std::vector<Scenario> scenarios = {
+        {
+            "no classes, no hint",
+            {},
+            0,
+            subnet_->getValid()
+        },
+        {
+            "no classes, hint",
+            {},
+            subnet_->getValid().getMin() + 50,
+            subnet_->getValid().getMin() + 50
+        },
+        {
+            "no classes, hint too small",
+            {},
+            subnet_->getValid().getMin() - 50,
+            subnet_->getValid().getMin()
+        },
+        {
+            "no classes, hint too big",
+            {},
+            subnet_->getValid().getMax() + 50,
+            subnet_->getValid().getMax()
+        },
+        {
+            "class unspecified, no hint",
+            { "valid_unspec" },
+            0,
+            subnet_->getValid()
+        },
+        {
+            "from last class, no hint",
+            { "valid_unspec", "valid_one" },
+            0,
+            valid_one.get()
+        },
+        {
+            "from first class, no hint",
+            { "valid_two", "valid_one" },
+            0,
+            valid_two.get()
+        },
+        {
+            "class plus hint",
+            { "valid_one" },
+            valid_one.getMin() + 25,
+            valid_one.getMin() + 25
+        },
+        {
+            "class plus hint too small",
+            { "valid_one" },
+            valid_one.getMin() - 25,
+            valid_one.getMin()
+        },
+        {
+            "class plus hint too big",
+            { "valid_one" },
+            valid_one.getMax() + 25,
+            valid_one.getMax()
+        }
+    };
+
+    // Iterate over the scenarios and verify the correct outcome.
+    for (auto scenario : scenarios) {
+        SCOPED_TRACE(scenario.desc_); {
+            // Create a context;
+            AllocEngine::ClientContext6 ctx(subnet_, duid_, false, false, "", true,
+                                            Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)));
+            // Add client classes (if any)
+            for (auto class_name : scenario.classes_) {
+                ctx.query_->addClass(class_name);
+            }
+
+            // Add hint
+            ctx.currentIA().iaid_ = iaid_;
+
+            // prefix,prefixlen, preferred, valid
+            ctx.currentIA().addHint(IOAddress("::"), 128, 0, scenario.requested_lft_);
+
+            Lease6Ptr lease;
+            ASSERT_NO_THROW(lease = expectOneLease(engine->allocateLeases6(ctx)));
+            ASSERT_TRUE(lease);
+            EXPECT_EQ(lease->valid_lft_, scenario.exp_valid_);
+        }
+    }
+}
+
+// Verifies that AllocEngine::getLifetimes6() returns the appropriate
+// preferred lifetime value based on the context content.
+TEST_F(AllocEngine6Test, getPreferredLifetime) {
+    boost::scoped_ptr<AllocEngine> engine;
+    ASSERT_NO_THROW(engine.reset(new AllocEngine(AllocEngine::ALLOC_ITERATIVE, 100)));
+    ASSERT_TRUE(engine);
+
+    // Let's make three classes, two with preferred-lifetime and one without,
+    // and add them to the dictionary.
+    ClientClassDictionaryPtr dictionary =
+        CfgMgr::instance().getStagingCfg()->getClientClassDictionary();
+
+    ClientClassDefPtr class_def(new ClientClassDef("preferred_one", ExpressionPtr()));
+    Triplet<uint32_t> preferred_one(50, 100, 150);
+    class_def->setPreferred(preferred_one);
+    dictionary->addClass(class_def);
+
+    class_def.reset(new ClientClassDef("preferred_two", ExpressionPtr()));
+    Triplet<uint32_t>preferred_two(200, 250, 300);
+    class_def->setPreferred(preferred_two);
+    dictionary->addClass(class_def);
+
+    class_def.reset(new ClientClassDef("preferred_unspec", ExpressionPtr()));
+    dictionary->addClass(class_def);
+
+    // Commit our class changes.
+    CfgMgr::instance().commit();
+
+    // Update the subnet's triplet to something more useful.
+    subnet_->setPreferred(Triplet<uint32_t>(500, 1000, 1500));
+
+    // Describes a test scenario.
+    struct Scenario {
+        std::string desc_;                  // descriptive text for logging
+        std::vector<std::string> classes_;  // class list of assigned classes
+        uint32_t requested_lft_;            // use as option 51 is > 0
+        uint32_t exp_preferred_;                // expected lifetime
+    };
+
+    // Scenarios to test.
+    std::vector<Scenario> scenarios = {
+        {
+            "no classes, no hint",
+            {},
+            0,
+            subnet_->getPreferred()
+        },
+        {
+            "no classes, hint",
+            {},
+            subnet_->getPreferred().getMin() + 50,
+            subnet_->getPreferred().getMin() + 50
+        },
+        {
+            "no classes, hint too small",
+            {},
+            subnet_->getPreferred().getMin() - 50,
+            subnet_->getPreferred().getMin()
+        },
+        {
+            "no classes, hint too big",
+            {},
+            subnet_->getPreferred().getMax() + 50,
+            subnet_->getPreferred().getMax()
+        },
+        {
+            "class unspecified, no hint",
+            { "preferred_unspec" },
+            0,
+            subnet_->getPreferred()
+        },
+        {
+            "from last class, no hint",
+            { "preferred_unspec", "preferred_one" },
+            0,
+            preferred_one.get()
+        },
+        {
+            "from first class, no hint",
+            { "preferred_two", "preferred_one" },
+            0,
+            preferred_two.get()
+        },
+        {
+            "class plus hint",
+            { "preferred_one" },
+            preferred_one.getMin() + 25,
+            preferred_one.getMin() + 25
+        },
+        {
+            "class plus hint too small",
+            { "preferred_one" },
+            preferred_one.getMin() - 25,
+            preferred_one.getMin()
+        },
+        {
+            "class plus hint too big",
+            { "preferred_one" },
+            preferred_one.getMax() + 25,
+            preferred_one.getMax()
+        }
+    };
+
+    // Iterate over the scenarios and verify the correct outcome.
+    for (auto scenario : scenarios) {
+        SCOPED_TRACE(scenario.desc_); {
+            // Create a context;
+            AllocEngine::ClientContext6 ctx(subnet_, duid_, false, false, "", true,
+                                            Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)));
+            // Add client classes (if any)
+            for (auto class_name : scenario.classes_) {
+                ctx.query_->addClass(class_name);
+            }
+
+            // Add hint
+            ctx.currentIA().iaid_ = iaid_;
+
+            // prefix,prefixlen, preferred, preferred
+            ctx.currentIA().addHint(IOAddress("::"), 128, scenario.requested_lft_, 0);
+
+            Lease6Ptr lease;
+            ASSERT_NO_THROW(lease = expectOneLease(engine->allocateLeases6(ctx)));
+            ASSERT_TRUE(lease);
+            EXPECT_EQ(lease->preferred_lft_, scenario.exp_preferred_);
+        }
+    }
+}
+
 }  // namespace test
 }  // namespace dhcp
 }  // namespace isc
index 2c6f90105967311918ca1583f6e1436271bf22a1..11601a82403de35d478aedac89d9730603b1e55f 100644 (file)
@@ -1313,7 +1313,7 @@ TEST_F(ClientClassDefListParserTest, dropCheckError) {
     EXPECT_NO_THROW(parseClientClassDefList(cfg_text, AF_INET6));
 }
 
-// Verify the ability to configure lease lifetime triplet.
+// Verify the ability to configure valid lifetime triplet.
 TEST_F(ClientClassDefParserTest, validLifetimeTests) {
 
     struct Scenario {
@@ -1374,4 +1374,68 @@ TEST_F(ClientClassDefParserTest, validLifetimeTests) {
     }
 }
 
+// Verify the ability to configure lease preferred lifetime triplet.
+TEST_F(ClientClassDefParserTest, preferredLifetimeTests) {
+
+    struct Scenario {
+        std::string desc_;
+        std::string cfg_txt_;
+        Triplet<uint32_t> exp_triplet_;
+    };
+
+    std::vector<Scenario> scenarios = {
+        {
+            "unspecified",
+            "",
+            Triplet<uint32_t>()
+        },
+        {
+            "preferred only",
+            "\"preferred-lifetime\": 100",
+            Triplet<uint32_t>(100)
+        },
+        {
+            "min only",
+            "\"min-preferred-lifetime\": 50",
+            Triplet<uint32_t>(50, 50, 50)
+        },
+        {
+            "max only",
+            "\"max-preferred-lifetime\": 75",
+            Triplet<uint32_t>(75, 75, 75)
+        },
+        {
+            "all three",
+            "\"min-preferred-lifetime\": 25,"
+            "\"preferred-lifetime\": 50,"
+            "\"max-preferred-lifetime\": 75",
+            Triplet<uint32_t>(25, 50, 75)
+        }
+    };
+
+    for (auto scenario : scenarios) {
+        SCOPED_TRACE(scenario.desc_); {
+            std::stringstream oss;
+            oss << "{ \"name\": \"foo\"";
+            if (!scenario.cfg_txt_.empty()) {
+                oss << ",\n" << scenario.cfg_txt_;
+            }
+            oss << "\n}\n";
+
+            ClientClassDefPtr class_def;
+            ASSERT_NO_THROW_LOG(class_def = parseClientClassDef(oss.str(), AF_INET6));
+            ASSERT_TRUE(class_def);
+            if (scenario.exp_triplet_.unspecified()) {
+                EXPECT_TRUE(class_def->getPreferred().unspecified());
+            } else {
+                EXPECT_EQ(class_def->getPreferred(), scenario.exp_triplet_);
+                EXPECT_EQ(class_def->getPreferred().getMin(), scenario.exp_triplet_.getMin());
+                EXPECT_EQ(class_def->getPreferred().get(), scenario.exp_triplet_.get());
+                EXPECT_EQ(class_def->getPreferred().getMax(), scenario.exp_triplet_.getMax());
+            }
+        }
+    }
+}
+
+
 } // end of anonymous namespace
index 8bd6be722cf44b0f2ad51abc4152f9ea4215179a..5532dd9050335fd62c78666d2ca4d3c47c3f6a47 100644 (file)
@@ -83,6 +83,7 @@ TEST(ClientClassDef, copyConstruction) {
     cclass->setSname("ufo");
     cclass->setFilename("ufo.efi");
     cclass->setValid(Triplet<uint32_t>(10, 20, 30));
+    cclass->setPreferred(Triplet<uint32_t>(11, 21, 31));
 
     // Copy the client class.
     boost::scoped_ptr<ClientClassDef> cclass_copy;
@@ -105,6 +106,9 @@ TEST(ClientClassDef, copyConstruction) {
     EXPECT_EQ(cclass->getValid().get(), cclass_copy->getValid().get());
     EXPECT_EQ(cclass->getValid().getMin(), cclass_copy->getValid().getMin());
     EXPECT_EQ(cclass->getValid().getMax(), cclass_copy->getValid().getMax());
+    EXPECT_EQ(cclass->getPreferred().get(), cclass_copy->getPreferred().get());
+    EXPECT_EQ(cclass->getPreferred().getMin(), cclass_copy->getPreferred().getMin());
+    EXPECT_EQ(cclass->getPreferred().getMax(), cclass_copy->getPreferred().getMax());
 
     // Ensure that the option was copied into a new structure.
     ASSERT_TRUE(cclass_copy->getCfgOption());