diff --git a/doc/examples/kea4/classify.json b/doc/examples/kea4/classify.json index 6964960e22..a44b030455 100644 --- a/doc/examples/kea4/classify.json +++ b/doc/examples/kea4/classify.json @@ -76,18 +76,19 @@ // everyone is allowed. When a class is specified, only packets belonging // to that class are allowed for that subnet. "subnet4": [ + // This one is for VoIP devices only. { -// This one is for VoIP devices only. "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ], "subnet": "192.0.2.0/24", "client-class": "VoIP", "interface": "ethX" }, -// This one doesn't have any client-class specified, so everyone -// is allowed in. The normal subnet selection rules still apply, -// though. There is also a static class reservation for a client -// using MAC address 1a:1b:1c:1d:1e:1f. This client will always -// be assigned to this class. + + // This one doesn't have any client-class specified, so everyone + // is allowed in. The normal subnet selection rules still apply, + // though. There is also a static class reservation for a client + // using MAC address 1a:1b:1c:1d:1e:1f. This client will always + // be assigned to this class. { "pools": [ { "pool": "192.0.3.1 - 192.0.3.200" } ], "subnet": "192.0.3.0/24", @@ -97,6 +98,28 @@ "client-classes": [ "VoIP" ] } ], "interface": "ethX" + }, + + // The following list defines a subnet with pools. For some pools + // we defined a class that is allowed in that pool. If not specified + // everyone is allowed. When a class is specified, only packets belonging + // to that class are allowed for that pool. + { + "pools": [ + // This one is for VoIP devices only. + { + "pool": "192.0.4.1 - 192.0.4.200", + "client-class": "VoIP" + }, + + // This one doesn't have any client-class specified, + // so everyone is allowed in. + { + "pool": "192.0.5.1 - 192.0.5.200" + } ], + + "subnet": "192.0.4.0/23", + "interface": "ethY" } ] }, diff --git a/doc/examples/kea6/classify.json b/doc/examples/kea6/classify.json index eaa37beec4..151392e845 100644 --- a/doc/examples/kea6/classify.json +++ b/doc/examples/kea6/classify.json @@ -61,9 +61,10 @@ "client-class": "cable-modems", "interface": "ethX" }, -// The following subnet contains a class reservation for a client using -// DUID 01:02:03:04:05:0A:0B:0C:0D:0E. This client will always be assigned -// to this class. + + // The following subnet contains a class reservation for a client using + // DUID 01:02:03:04:05:0A:0B:0C:0D:0E. This client will always be assigned + // to this class. { "pools": [ { "pool": "2001:db8:2::/80" } ], "subnet": "2001:db8:2::/64", @@ -73,7 +74,20 @@ "client-classes": [ "cable-modems" ] } ], "interface": "ethX" + }, + + // The following subnet contains a pool with a class constraint: only + // clients which belong to the class are allowed to use this pool. + { + "pools": [ + { + "pool": "2001:db8:3::/80", + "client-class": "cable-modems" + } ], + "subnet": "2001:db8:4::/64", + "interface": "ethY" } + ] }, diff --git a/doc/guide/classify.xml b/doc/guide/classify.xml index cfc515f9a1..23009e98f5 100644 --- a/doc/guide/classify.xml +++ b/doc/guide/classify.xml @@ -801,6 +801,96 @@ concatenation of the strings +
+ Configuring Pools With Class Information + + Similar to the subnets, it is possible to restrict access to the certain address + or prefix pools to the clients belonging to a specific class, using + the "client-class" parameter when defining the pool. + + + + Let's assume that the server is connected to a network segment using + the 192.0.2.0/24 prefix. The Administrator of that network has decided + that addresses from the range of 192.0.2.10 to 192.0.2.20 are going to be + managed by the DHCP4 server. Only the clients belonging to the client class + Client_foo are allowed to use this pool. Such a configuration can be + achieved in the following way: + +"Dhcp4": { + "client-classes": [ + { + "name": "Client_foo", + "test": "substring(option[61].hex,0,3) == 'foo'", + "option-data": [ + { + "name": "domain-name-servers", + "code": 6, + "space": "dhcp4", + "csv-format": true, + "data": "192.0.2.1, 192.0.2.2" + } + ] + }, + ... + ], + "subnet4": [ + { + "subnet": "192.0.2.0/24", + + "pools": [ + { + "pool": "192.0.2.10 - 192.0.2.20", + "client-class": "Client_foo" + } + ] + }, + ... + ], + ... +} + + + + The following example shows restricting access to an address pool. + This configuration will restrict use of the addresses 2001:db8:1::1 + to 2001:db8:1::FFFF to members of the "Client_enterprise" class. + +"Dhcp6": { + "client-classes": [ + { + "name": "Client_enterprise_", + "test": "substring(option[1].hex,0,6) == 0x0002AABBCCDD'", + "option-data": [ + { + "name": "dns-servers", + "code": 23, + "space": "dhcp6", + "csv-format": true, + "data": "2001:db8:0::1, 2001:db8:2::1" + } + ] + }, + ... + ], + "subnet6": [ + { + "subnet": "2001:db8:1::/64", + + "pools": [ + { + "pool": "2001:db8:1::-2001:db8:1::ffff", + "client-class": "Client_foo" + } + ] + }, + ... + ], + ... +} + +
+
Using Classes diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 1f7a1eaf37..4ede2df9e8 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -2068,16 +2068,13 @@ It is merely echoed by the server discussion of the classification process see . - - In certain cases it is useful to differentiate between different types of - clients and treat them accordingly. It is envisaged that client - classification will be used for changing the behavior of almost any part of - the DHCP message processing, including the assignment of leases from different - pools, the assignment of different options (or different values of the same - options) etc. In the current release of the software however, there are - only three mechanisms that take advantage of client classification: - subnet selection, assignment of different options, and, for cable modems, there - are specific options for use with the TFTP server address and the boot file field. + In certain cases it is useful to configure the server to differentiate between + DHCP clients types and treat them accordingly. It is envisaged that client + classification will be used for modifying the behavior of almost any part of + the DHCP message processing. In the current release of Kea, there are four + mechanisms that take advantage of the client classification in DHCPv4: subnet + selection, address pool selection, DHCP options assignment, and, for cable modems, + there are specific options for use with the TFTP server address and boot file field. @@ -2092,6 +2089,12 @@ It is merely echoed by the server class restrictions on subnets, see . + + Client classification can also be used to restrict access to specific + pools within a subnet. This is useful when to segregate clients belonging + to the same subnet into different address ranges. + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index f0b96148c7..ad10322ffc 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -1927,6 +1927,14 @@ should include options from the isc option space: discussion of the classification process see . + In certain cases it is useful to configure the server to differentiate between + DHCP clients types and treat them accordingly. It is envisaged that client + classification will be used for modifying the behavior of almost any part of + the DHCP message processing. In the current release of Kea, there are three + mechanisms that take advantage of the client classification in DHCPv6: subnet + selection, address pool selection and DHCP options assignment. + + In certain cases it is useful to differentiate between different types of clients and treat them accordingly. It is envisaged that client @@ -1950,6 +1958,12 @@ should include options from the isc option space: class restrictions on subnets, see . + + Client classification can also be used to restrict access to specific + pools within a subnet. This is useful when to segregate clients belonging + to the same subnet into different address or prefix ranges. + + The process of doing classification is conducted in three steps. The first step is to assess an incoming packet and assign it to zero or more classes. The diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 7946f91a86..25f15adda8 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -1590,16 +1590,16 @@ static const flex_int16_t yy_rule_linenum[159] = 466, 477, 486, 496, 505, 515, 530, 546, 555, 564, 573, 582, 602, 622, 631, 641, 650, 659, 668, 678, 687, 696, 705, 714, 724, 733, 742, 751, 760, 769, - 778, 787, 796, 805, 814, 824, 835, 845, 854, 864, - 874, 884, 894, 904, 913, 923, 932, 941, 950, 959, - 969, 979, 989, 998, 1007, 1016, 1025, 1034, 1043, 1052, + 778, 787, 796, 805, 814, 824, 836, 846, 855, 865, + 875, 885, 895, 905, 914, 924, 933, 942, 951, 960, + 970, 980, 990, 999, 1008, 1017, 1026, 1035, 1044, 1053, - 1061, 1070, 1079, 1088, 1097, 1106, 1115, 1124, 1133, 1142, - 1151, 1160, 1169, 1178, 1187, 1196, 1205, 1214, 1223, 1232, - 1241, 1251, 1261, 1271, 1281, 1291, 1301, 1311, 1321, 1331, - 1340, 1349, 1358, 1367, 1376, 1385, 1394, 1405, 1418, 1431, - 1446, 1545, 1550, 1555, 1560, 1561, 1562, 1563, 1564, 1565, - 1567, 1585, 1598, 1603, 1607, 1609, 1611, 1613 + 1062, 1071, 1080, 1089, 1098, 1107, 1116, 1125, 1134, 1143, + 1152, 1161, 1170, 1179, 1188, 1197, 1206, 1215, 1224, 1233, + 1242, 1252, 1262, 1272, 1282, 1292, 1302, 1312, 1322, 1332, + 1341, 1350, 1359, 1368, 1377, 1386, 1395, 1406, 1419, 1432, + 1447, 1546, 1551, 1556, 1561, 1562, 1563, 1564, 1565, 1566, + 1568, 1586, 1599, 1604, 1608, 1610, 1612, 1614 } ; /* The intent behind this definition is that it'll catch @@ -3004,6 +3004,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::CLIENT_CLASSES: return isc::dhcp::Dhcp4Parser::make_CLIENT_CLASS(driver.loc_); @@ -3014,7 +3015,7 @@ YY_RULE_SETUP YY_BREAK case 77: YY_RULE_SETUP -#line 835 "dhcp4_lexer.ll" +#line 836 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -3027,7 +3028,7 @@ YY_RULE_SETUP YY_BREAK case 78: YY_RULE_SETUP -#line 845 "dhcp4_lexer.ll" +#line 846 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3039,7 +3040,7 @@ YY_RULE_SETUP YY_BREAK case 79: YY_RULE_SETUP -#line 854 "dhcp4_lexer.ll" +#line 855 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3052,7 +3053,7 @@ YY_RULE_SETUP YY_BREAK case 80: YY_RULE_SETUP -#line 864 "dhcp4_lexer.ll" +#line 865 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3065,7 +3066,7 @@ YY_RULE_SETUP YY_BREAK case 81: YY_RULE_SETUP -#line 874 "dhcp4_lexer.ll" +#line 875 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3078,7 +3079,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 884 "dhcp4_lexer.ll" +#line 885 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3091,7 +3092,7 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 894 "dhcp4_lexer.ll" +#line 895 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3104,7 +3105,7 @@ YY_RULE_SETUP YY_BREAK case 84: YY_RULE_SETUP -#line 904 "dhcp4_lexer.ll" +#line 905 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3116,7 +3117,7 @@ YY_RULE_SETUP YY_BREAK case 85: YY_RULE_SETUP -#line 913 "dhcp4_lexer.ll" +#line 914 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3129,7 +3130,7 @@ YY_RULE_SETUP YY_BREAK case 86: YY_RULE_SETUP -#line 923 "dhcp4_lexer.ll" +#line 924 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3141,7 +3142,7 @@ YY_RULE_SETUP YY_BREAK case 87: YY_RULE_SETUP -#line 932 "dhcp4_lexer.ll" +#line 933 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3153,7 +3154,7 @@ YY_RULE_SETUP YY_BREAK case 88: YY_RULE_SETUP -#line 941 "dhcp4_lexer.ll" +#line 942 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3165,7 +3166,7 @@ YY_RULE_SETUP YY_BREAK case 89: YY_RULE_SETUP -#line 950 "dhcp4_lexer.ll" +#line 951 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3177,7 +3178,7 @@ YY_RULE_SETUP YY_BREAK case 90: YY_RULE_SETUP -#line 959 "dhcp4_lexer.ll" +#line 960 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3190,7 +3191,7 @@ YY_RULE_SETUP YY_BREAK case 91: YY_RULE_SETUP -#line 969 "dhcp4_lexer.ll" +#line 970 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3203,7 +3204,7 @@ YY_RULE_SETUP YY_BREAK case 92: YY_RULE_SETUP -#line 979 "dhcp4_lexer.ll" +#line 980 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3215,7 +3216,7 @@ YY_RULE_SETUP YY_BREAK case 93: YY_RULE_SETUP -#line 989 "dhcp4_lexer.ll" +#line 990 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3227,7 +3228,7 @@ YY_RULE_SETUP YY_BREAK case 94: YY_RULE_SETUP -#line 998 "dhcp4_lexer.ll" +#line 999 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3239,7 +3240,7 @@ YY_RULE_SETUP YY_BREAK case 95: YY_RULE_SETUP -#line 1007 "dhcp4_lexer.ll" +#line 1008 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3251,7 +3252,7 @@ YY_RULE_SETUP YY_BREAK case 96: YY_RULE_SETUP -#line 1016 "dhcp4_lexer.ll" +#line 1017 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3263,7 +3264,7 @@ YY_RULE_SETUP YY_BREAK case 97: YY_RULE_SETUP -#line 1025 "dhcp4_lexer.ll" +#line 1026 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3275,7 +3276,7 @@ YY_RULE_SETUP YY_BREAK case 98: YY_RULE_SETUP -#line 1034 "dhcp4_lexer.ll" +#line 1035 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3287,7 +3288,7 @@ YY_RULE_SETUP YY_BREAK case 99: YY_RULE_SETUP -#line 1043 "dhcp4_lexer.ll" +#line 1044 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3299,7 +3300,7 @@ YY_RULE_SETUP YY_BREAK case 100: YY_RULE_SETUP -#line 1052 "dhcp4_lexer.ll" +#line 1053 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3311,7 +3312,7 @@ YY_RULE_SETUP YY_BREAK case 101: YY_RULE_SETUP -#line 1061 "dhcp4_lexer.ll" +#line 1062 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3323,7 +3324,7 @@ YY_RULE_SETUP YY_BREAK case 102: YY_RULE_SETUP -#line 1070 "dhcp4_lexer.ll" +#line 1071 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3335,7 +3336,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1079 "dhcp4_lexer.ll" +#line 1080 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3347,7 +3348,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1088 "dhcp4_lexer.ll" +#line 1089 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3359,7 +3360,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1097 "dhcp4_lexer.ll" +#line 1098 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3371,7 +3372,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1106 "dhcp4_lexer.ll" +#line 1107 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3383,7 +3384,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1115 "dhcp4_lexer.ll" +#line 1116 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3395,7 +3396,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1124 "dhcp4_lexer.ll" +#line 1125 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3407,7 +3408,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1133 "dhcp4_lexer.ll" +#line 1134 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3419,7 +3420,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1142 "dhcp4_lexer.ll" +#line 1143 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3431,7 +3432,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1151 "dhcp4_lexer.ll" +#line 1152 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3443,7 +3444,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1160 "dhcp4_lexer.ll" +#line 1161 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3455,7 +3456,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1169 "dhcp4_lexer.ll" +#line 1170 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3467,7 +3468,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1178 "dhcp4_lexer.ll" +#line 1179 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3479,7 +3480,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1187 "dhcp4_lexer.ll" +#line 1188 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3491,7 +3492,7 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1196 "dhcp4_lexer.ll" +#line 1197 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3503,7 +3504,7 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1205 "dhcp4_lexer.ll" +#line 1206 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3515,7 +3516,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1214 "dhcp4_lexer.ll" +#line 1215 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3527,7 +3528,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1223 "dhcp4_lexer.ll" +#line 1224 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3539,7 +3540,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1232 "dhcp4_lexer.ll" +#line 1233 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3551,7 +3552,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1241 "dhcp4_lexer.ll" +#line 1242 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3564,7 +3565,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1251 "dhcp4_lexer.ll" +#line 1252 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3577,7 +3578,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1261 "dhcp4_lexer.ll" +#line 1262 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3590,7 +3591,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1271 "dhcp4_lexer.ll" +#line 1272 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3603,7 +3604,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1281 "dhcp4_lexer.ll" +#line 1282 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3616,7 +3617,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1291 "dhcp4_lexer.ll" +#line 1292 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3629,7 +3630,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1301 "dhcp4_lexer.ll" +#line 1302 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3642,7 +3643,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1311 "dhcp4_lexer.ll" +#line 1312 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3655,7 +3656,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1321 "dhcp4_lexer.ll" +#line 1322 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3668,7 +3669,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1331 "dhcp4_lexer.ll" +#line 1332 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3680,7 +3681,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1340 "dhcp4_lexer.ll" +#line 1341 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3692,7 +3693,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1349 "dhcp4_lexer.ll" +#line 1350 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3704,7 +3705,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1358 "dhcp4_lexer.ll" +#line 1359 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3716,7 +3717,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1367 "dhcp4_lexer.ll" +#line 1368 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3728,7 +3729,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1376 "dhcp4_lexer.ll" +#line 1377 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3740,7 +3741,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1385 "dhcp4_lexer.ll" +#line 1386 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3752,7 +3753,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1394 "dhcp4_lexer.ll" +#line 1395 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3766,7 +3767,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1405 "dhcp4_lexer.ll" +#line 1406 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3782,7 +3783,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1418 "dhcp4_lexer.ll" +#line 1419 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3798,7 +3799,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1431 "dhcp4_lexer.ll" +#line 1432 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3814,7 +3815,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1446 "dhcp4_lexer.ll" +#line 1447 "dhcp4_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3917,7 +3918,7 @@ YY_RULE_SETUP case 142: /* rule 142 can match eol */ YY_RULE_SETUP -#line 1545 "dhcp4_lexer.ll" +#line 1546 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3926,7 +3927,7 @@ YY_RULE_SETUP case 143: /* rule 143 can match eol */ YY_RULE_SETUP -#line 1550 "dhcp4_lexer.ll" +#line 1551 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3934,7 +3935,7 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1555 "dhcp4_lexer.ll" +#line 1556 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3942,37 +3943,37 @@ YY_RULE_SETUP YY_BREAK case 145: YY_RULE_SETUP -#line 1560 "dhcp4_lexer.ll" +#line 1561 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 146: YY_RULE_SETUP -#line 1561 "dhcp4_lexer.ll" +#line 1562 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 147: YY_RULE_SETUP -#line 1562 "dhcp4_lexer.ll" +#line 1563 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1563 "dhcp4_lexer.ll" +#line 1564 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1564 "dhcp4_lexer.ll" +#line 1565 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1565 "dhcp4_lexer.ll" +#line 1566 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1567 "dhcp4_lexer.ll" +#line 1568 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3993,7 +3994,7 @@ YY_RULE_SETUP YY_BREAK case 152: YY_RULE_SETUP -#line 1585 "dhcp4_lexer.ll" +#line 1586 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4009,7 +4010,7 @@ YY_RULE_SETUP YY_BREAK case 153: YY_RULE_SETUP -#line 1598 "dhcp4_lexer.ll" +#line 1599 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -4017,33 +4018,33 @@ YY_RULE_SETUP YY_BREAK case 154: YY_RULE_SETUP -#line 1603 "dhcp4_lexer.ll" +#line 1604 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 155: YY_RULE_SETUP -#line 1607 "dhcp4_lexer.ll" +#line 1608 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 156: YY_RULE_SETUP -#line 1609 "dhcp4_lexer.ll" +#line 1610 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 157: YY_RULE_SETUP -#line 1611 "dhcp4_lexer.ll" +#line 1612 "dhcp4_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 158: YY_RULE_SETUP -#line 1613 "dhcp4_lexer.ll" +#line 1614 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1615 "dhcp4_lexer.ll" +#line 1616 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4069,10 +4070,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 159: YY_RULE_SETUP -#line 1638 "dhcp4_lexer.ll" +#line 1639 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4075 "dhcp4_lexer.cc" +#line 4076 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -5177,7 +5178,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1638 "dhcp4_lexer.ll" +#line 1639 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index d2b4b59153..d5d88ff41a 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -823,6 +823,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: + case isc::dhcp::Parser4Context::POOLS: case isc::dhcp::Parser4Context::SHARED_NETWORK: case isc::dhcp::Parser4Context::CLIENT_CLASSES: return isc::dhcp::Dhcp4Parser::make_CLIENT_CLASS(driver.loc_); diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index 223aa7b2f2..698791d27c 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -259,8 +259,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (that.value); break; @@ -301,8 +301,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (that.value); break; @@ -428,14 +428,14 @@ namespace isc { namespace dhcp { #line 429 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 444: // ncr_protocol_value + case 445: // ncr_protocol_value #line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 436 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 452: // replace_client_name_value + case 453: // replace_client_name_value #line 226 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } @@ -645,8 +645,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; @@ -2281,16 +2281,16 @@ namespace isc { namespace dhcp { #line 2282 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 389: -#line 1352 "dhcp4_parser.yy" // lalr1.cc:859 + case 390: +#line 1353 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2290 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1354 "dhcp4_parser.yy" // lalr1.cc:859 + case 391: +#line 1355 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); @@ -2299,16 +2299,16 @@ namespace isc { namespace dhcp { #line 2300 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 391: -#line 1360 "dhcp4_parser.yy" // lalr1.cc:859 + case 392: +#line 1361 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2308 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 392: -#line 1362 "dhcp4_parser.yy" // lalr1.cc:859 + case 393: +#line 1363 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as< ElementPtr > (); @@ -2334,16 +2334,16 @@ namespace isc { namespace dhcp { #line 2335 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 393: -#line 1385 "dhcp4_parser.yy" // lalr1.cc:859 + case 394: +#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2343 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 394: -#line 1387 "dhcp4_parser.yy" // lalr1.cc:859 + case 395: +#line 1388 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -2371,8 +2371,8 @@ namespace isc { namespace dhcp { #line 2372 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1415 "dhcp4_parser.yy" // lalr1.cc:859 + case 396: +#line 1416 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); @@ -2382,8 +2382,8 @@ namespace isc { namespace dhcp { #line 2383 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1420 "dhcp4_parser.yy" // lalr1.cc:859 + case 397: +#line 1421 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2391,8 +2391,8 @@ namespace isc { namespace dhcp { #line 2392 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 401: -#line 1433 "dhcp4_parser.yy" // lalr1.cc:859 + case 402: +#line 1434 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2401,8 +2401,8 @@ namespace isc { namespace dhcp { #line 2402 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1437 "dhcp4_parser.yy" // lalr1.cc:859 + case 403: +#line 1438 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); @@ -2410,8 +2410,8 @@ namespace isc { namespace dhcp { #line 2411 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1442 "dhcp4_parser.yy" // lalr1.cc:859 + case 404: +#line 1443 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2420,8 +2420,8 @@ namespace isc { namespace dhcp { #line 2421 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 404: -#line 1446 "dhcp4_parser.yy" // lalr1.cc:859 + case 405: +#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed @@ -2429,16 +2429,16 @@ namespace isc { namespace dhcp { #line 2430 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 424: -#line 1477 "dhcp4_parser.yy" // lalr1.cc:859 + case 425: +#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2438 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1479 "dhcp4_parser.yy" // lalr1.cc:859 + case 426: +#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("next-server", next_server); @@ -2447,16 +2447,16 @@ namespace isc { namespace dhcp { #line 2448 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1485 "dhcp4_parser.yy" // lalr1.cc:859 + case 427: +#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2456 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1487 "dhcp4_parser.yy" // lalr1.cc:859 + case 428: +#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-hostname", srv); @@ -2465,16 +2465,16 @@ namespace isc { namespace dhcp { #line 2466 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1493 "dhcp4_parser.yy" // lalr1.cc:859 + case 429: +#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2474 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1495 "dhcp4_parser.yy" // lalr1.cc:859 + case 430: +#line 1496 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("boot-file-name", bootfile); @@ -2483,16 +2483,16 @@ namespace isc { namespace dhcp { #line 2484 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1501 "dhcp4_parser.yy" // lalr1.cc:859 + case 431: +#line 1502 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2492 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1503 "dhcp4_parser.yy" // lalr1.cc:859 + case 432: +#line 1504 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", addr); @@ -2501,16 +2501,16 @@ namespace isc { namespace dhcp { #line 2502 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1509 "dhcp4_parser.yy" // lalr1.cc:859 + case 433: +#line 1510 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2510 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1511 "dhcp4_parser.yy" // lalr1.cc:859 + case 434: +#line 1512 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); @@ -2519,16 +2519,16 @@ namespace isc { namespace dhcp { #line 2520 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1517 "dhcp4_parser.yy" // lalr1.cc:859 + case 435: +#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2528 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1519 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); @@ -2537,16 +2537,16 @@ namespace isc { namespace dhcp { #line 2538 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1525 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1526 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2546 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1527 "dhcp4_parser.yy" // lalr1.cc:859 + case 438: +#line 1528 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-id", hw); @@ -2555,16 +2555,16 @@ namespace isc { namespace dhcp { #line 2556 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1533 "dhcp4_parser.yy" // lalr1.cc:859 + case 439: +#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2564 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1535 "dhcp4_parser.yy" // lalr1.cc:859 + case 440: +#line 1536 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("circuit-id", hw); @@ -2573,16 +2573,16 @@ namespace isc { namespace dhcp { #line 2574 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1541 "dhcp4_parser.yy" // lalr1.cc:859 + case 441: +#line 1542 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2582 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1543 "dhcp4_parser.yy" // lalr1.cc:859 + case 442: +#line 1544 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); @@ -2591,16 +2591,16 @@ namespace isc { namespace dhcp { #line 2592 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1549 "dhcp4_parser.yy" // lalr1.cc:859 + case 443: +#line 1550 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2600 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1551 "dhcp4_parser.yy" // lalr1.cc:859 + case 444: +#line 1552 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); @@ -2609,8 +2609,8 @@ namespace isc { namespace dhcp { #line 2610 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1557 "dhcp4_parser.yy" // lalr1.cc:859 + case 445: +#line 1558 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); @@ -2620,8 +2620,8 @@ namespace isc { namespace dhcp { #line 2621 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 445: -#line 1562 "dhcp4_parser.yy" // lalr1.cc:859 + case 446: +#line 1563 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2629,8 +2629,8 @@ namespace isc { namespace dhcp { #line 2630 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1570 "dhcp4_parser.yy" // lalr1.cc:859 + case 447: +#line 1571 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); @@ -2640,8 +2640,8 @@ namespace isc { namespace dhcp { #line 2641 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1575 "dhcp4_parser.yy" // lalr1.cc:859 + case 448: +#line 1576 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2649,16 +2649,16 @@ namespace isc { namespace dhcp { #line 2650 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1580 "dhcp4_parser.yy" // lalr1.cc:859 + case 449: +#line 1581 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2658 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 449: -#line 1582 "dhcp4_parser.yy" // lalr1.cc:859 + case 450: +#line 1583 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); @@ -2667,8 +2667,8 @@ namespace isc { namespace dhcp { #line 2668 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 450: -#line 1591 "dhcp4_parser.yy" // lalr1.cc:859 + case 451: +#line 1592 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); @@ -2678,8 +2678,8 @@ namespace isc { namespace dhcp { #line 2679 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 451: -#line 1596 "dhcp4_parser.yy" // lalr1.cc:859 + case 452: +#line 1597 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2687,8 +2687,8 @@ namespace isc { namespace dhcp { #line 2688 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 454: -#line 1605 "dhcp4_parser.yy" // lalr1.cc:859 + case 455: +#line 1606 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2697,8 +2697,8 @@ namespace isc { namespace dhcp { #line 2698 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 455: -#line 1609 "dhcp4_parser.yy" // lalr1.cc:859 + case 456: +#line 1610 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2707,16 +2707,16 @@ namespace isc { namespace dhcp { #line 2708 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 471: -#line 1637 "dhcp4_parser.yy" // lalr1.cc:859 + case 472: +#line 1638 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2716 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 472: -#line 1639 "dhcp4_parser.yy" // lalr1.cc:859 + case 473: +#line 1640 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); @@ -2725,8 +2725,8 @@ namespace isc { namespace dhcp { #line 2726 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 473: -#line 1649 "dhcp4_parser.yy" // lalr1.cc:859 + case 474: +#line 1650 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); @@ -2734,8 +2734,8 @@ namespace isc { namespace dhcp { #line 2735 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 474: -#line 1656 "dhcp4_parser.yy" // lalr1.cc:859 + case 475: +#line 1657 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); @@ -2745,8 +2745,8 @@ namespace isc { namespace dhcp { #line 2746 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 475: -#line 1661 "dhcp4_parser.yy" // lalr1.cc:859 + case 476: +#line 1662 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2754,16 +2754,16 @@ namespace isc { namespace dhcp { #line 2755 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 483: -#line 1677 "dhcp4_parser.yy" // lalr1.cc:859 + case 484: +#line 1678 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2763 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1679 "dhcp4_parser.yy" // lalr1.cc:859 + case 485: +#line 1680 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); @@ -2772,16 +2772,16 @@ namespace isc { namespace dhcp { #line 2773 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1685 "dhcp4_parser.yy" // lalr1.cc:859 + case 486: +#line 1686 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2781 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1687 "dhcp4_parser.yy" // lalr1.cc:859 + case 487: +#line 1688 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); @@ -2790,8 +2790,8 @@ namespace isc { namespace dhcp { #line 2791 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1695 "dhcp4_parser.yy" // lalr1.cc:859 + case 488: +#line 1696 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); @@ -2801,8 +2801,8 @@ namespace isc { namespace dhcp { #line 2802 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1700 "dhcp4_parser.yy" // lalr1.cc:859 + case 489: +#line 1701 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2812,8 +2812,8 @@ namespace isc { namespace dhcp { #line 2813 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1707 "dhcp4_parser.yy" // lalr1.cc:859 + case 490: +#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2822,8 +2822,8 @@ namespace isc { namespace dhcp { #line 2823 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1711 "dhcp4_parser.yy" // lalr1.cc:859 + case 491: +#line 1712 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2832,8 +2832,8 @@ namespace isc { namespace dhcp { #line 2833 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1740 "dhcp4_parser.yy" // lalr1.cc:859 + case 511: +#line 1741 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); @@ -2841,16 +2841,16 @@ namespace isc { namespace dhcp { #line 2842 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1745 "dhcp4_parser.yy" // lalr1.cc:859 + case 512: +#line 1746 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2850 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1747 "dhcp4_parser.yy" // lalr1.cc:859 + case 513: +#line 1748 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); @@ -2859,16 +2859,16 @@ namespace isc { namespace dhcp { #line 2860 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1753 "dhcp4_parser.yy" // lalr1.cc:859 + case 514: +#line 1754 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2868 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1755 "dhcp4_parser.yy" // lalr1.cc:859 + case 515: +#line 1756 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); @@ -2877,8 +2877,8 @@ namespace isc { namespace dhcp { #line 2878 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1761 "dhcp4_parser.yy" // lalr1.cc:859 + case 516: +#line 1762 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); @@ -2886,16 +2886,16 @@ namespace isc { namespace dhcp { #line 2887 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1766 "dhcp4_parser.yy" // lalr1.cc:859 + case 517: +#line 1767 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2895 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1768 "dhcp4_parser.yy" // lalr1.cc:859 + case 518: +#line 1769 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); @@ -2904,8 +2904,8 @@ namespace isc { namespace dhcp { #line 2905 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1774 "dhcp4_parser.yy" // lalr1.cc:859 + case 519: +#line 1775 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); @@ -2913,8 +2913,8 @@ namespace isc { namespace dhcp { #line 2914 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1779 "dhcp4_parser.yy" // lalr1.cc:859 + case 520: +#line 1780 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); @@ -2922,16 +2922,16 @@ namespace isc { namespace dhcp { #line 2923 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1784 "dhcp4_parser.yy" // lalr1.cc:859 + case 521: +#line 1785 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } #line 2931 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 + case 522: +#line 1787 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2939,28 +2939,28 @@ namespace isc { namespace dhcp { #line 2940 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1792 "dhcp4_parser.yy" // lalr1.cc:859 + case 523: +#line 1793 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } #line 2946 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1793 "dhcp4_parser.yy" // lalr1.cc:859 + case 524: +#line 1794 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 2952 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1796 "dhcp4_parser.yy" // lalr1.cc:859 + case 525: +#line 1797 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } #line 2960 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1798 "dhcp4_parser.yy" // lalr1.cc:859 + case 526: +#line 1799 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); @@ -2969,8 +2969,8 @@ namespace isc { namespace dhcp { #line 2970 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1804 "dhcp4_parser.yy" // lalr1.cc:859 + case 527: +#line 1805 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); @@ -2978,8 +2978,8 @@ namespace isc { namespace dhcp { #line 2979 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1809 "dhcp4_parser.yy" // lalr1.cc:859 + case 528: +#line 1810 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); @@ -2987,8 +2987,8 @@ namespace isc { namespace dhcp { #line 2988 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1814 "dhcp4_parser.yy" // lalr1.cc:859 + case 529: +#line 1815 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); @@ -2996,16 +2996,16 @@ namespace isc { namespace dhcp { #line 2997 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1819 "dhcp4_parser.yy" // lalr1.cc:859 + case 530: +#line 1820 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } #line 3005 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1821 "dhcp4_parser.yy" // lalr1.cc:859 + case 531: +#line 1822 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3013,40 +3013,40 @@ namespace isc { namespace dhcp { #line 3014 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1827 "dhcp4_parser.yy" // lalr1.cc:859 + case 532: +#line 1828 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } #line 3022 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1830 "dhcp4_parser.yy" // lalr1.cc:859 + case 533: +#line 1831 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } #line 3030 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1833 "dhcp4_parser.yy" // lalr1.cc:859 + case 534: +#line 1834 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } #line 3038 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1836 "dhcp4_parser.yy" // lalr1.cc:859 + case 535: +#line 1837 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } #line 3046 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1839 "dhcp4_parser.yy" // lalr1.cc:859 + case 536: +#line 1840 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); @@ -3054,16 +3054,16 @@ namespace isc { namespace dhcp { #line 3055 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1845 "dhcp4_parser.yy" // lalr1.cc:859 + case 537: +#line 1846 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3063 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1847 "dhcp4_parser.yy" // lalr1.cc:859 + case 538: +#line 1848 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); @@ -3072,16 +3072,16 @@ namespace isc { namespace dhcp { #line 3073 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1855 "dhcp4_parser.yy" // lalr1.cc:859 + case 539: +#line 1856 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3081 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1857 "dhcp4_parser.yy" // lalr1.cc:859 + case 540: +#line 1858 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3089,16 +3089,16 @@ namespace isc { namespace dhcp { #line 3090 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1862 "dhcp4_parser.yy" // lalr1.cc:859 + case 541: +#line 1863 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3098 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1864 "dhcp4_parser.yy" // lalr1.cc:859 + case 542: +#line 1865 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3106,16 +3106,16 @@ namespace isc { namespace dhcp { #line 3107 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1869 "dhcp4_parser.yy" // lalr1.cc:859 + case 543: +#line 1870 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3115 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1871 "dhcp4_parser.yy" // lalr1.cc:859 + case 544: +#line 1872 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3123,8 +3123,8 @@ namespace isc { namespace dhcp { #line 3124 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1881 "dhcp4_parser.yy" // lalr1.cc:859 + case 545: +#line 1882 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); @@ -3134,8 +3134,8 @@ namespace isc { namespace dhcp { #line 3135 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1886 "dhcp4_parser.yy" // lalr1.cc:859 + case 546: +#line 1887 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3143,8 +3143,8 @@ namespace isc { namespace dhcp { #line 3144 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1891 "dhcp4_parser.yy" // lalr1.cc:859 + case 547: +#line 1892 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Logging map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -3153,16 +3153,16 @@ namespace isc { namespace dhcp { #line 3154 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1895 "dhcp4_parser.yy" // lalr1.cc:859 + case 548: +#line 1896 "dhcp4_parser.yy" // lalr1.cc:859 { // parsing completed } #line 3162 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1911 "dhcp4_parser.yy" // lalr1.cc:859 + case 552: +#line 1912 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); @@ -3172,8 +3172,8 @@ namespace isc { namespace dhcp { #line 3173 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1916 "dhcp4_parser.yy" // lalr1.cc:859 + case 553: +#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3181,8 +3181,8 @@ namespace isc { namespace dhcp { #line 3182 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1928 "dhcp4_parser.yy" // lalr1.cc:859 + case 556: +#line 1929 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); @@ -3191,16 +3191,16 @@ namespace isc { namespace dhcp { #line 3192 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1932 "dhcp4_parser.yy" // lalr1.cc:859 + case 557: +#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3200 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 566: -#line 1949 "dhcp4_parser.yy" // lalr1.cc:859 + case 567: +#line 1950 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); @@ -3208,16 +3208,16 @@ namespace isc { namespace dhcp { #line 3209 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1954 "dhcp4_parser.yy" // lalr1.cc:859 + case 568: +#line 1955 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3217 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 568: -#line 1956 "dhcp4_parser.yy" // lalr1.cc:859 + case 569: +#line 1957 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); @@ -3226,8 +3226,8 @@ namespace isc { namespace dhcp { #line 3227 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 569: -#line 1962 "dhcp4_parser.yy" // lalr1.cc:859 + case 570: +#line 1963 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); @@ -3237,8 +3237,8 @@ namespace isc { namespace dhcp { #line 3238 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 570: -#line 1967 "dhcp4_parser.yy" // lalr1.cc:859 + case 571: +#line 1968 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3246,8 +3246,8 @@ namespace isc { namespace dhcp { #line 3247 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 573: -#line 1976 "dhcp4_parser.yy" // lalr1.cc:859 + case 574: +#line 1977 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3256,24 +3256,24 @@ namespace isc { namespace dhcp { #line 3257 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 574: -#line 1980 "dhcp4_parser.yy" // lalr1.cc:859 + case 575: +#line 1981 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3265 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 581: -#line 1994 "dhcp4_parser.yy" // lalr1.cc:859 + case 582: +#line 1995 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3273 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 582: -#line 1996 "dhcp4_parser.yy" // lalr1.cc:859 + case 583: +#line 1997 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); @@ -3282,8 +3282,8 @@ namespace isc { namespace dhcp { #line 3283 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 583: -#line 2002 "dhcp4_parser.yy" // lalr1.cc:859 + case 584: +#line 2003 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); @@ -3291,8 +3291,8 @@ namespace isc { namespace dhcp { #line 3292 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 584: -#line 2007 "dhcp4_parser.yy" // lalr1.cc:859 + case 585: +#line 2008 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); @@ -3300,8 +3300,8 @@ namespace isc { namespace dhcp { #line 3301 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 585: -#line 2012 "dhcp4_parser.yy" // lalr1.cc:859 + case 586: +#line 2013 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); @@ -3565,107 +3565,107 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -747; + const short int Dhcp4Parser::yypact_ninf_ = -722; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 457, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, 12, 29, 30, 68, 72, 79, - 92, 106, 116, 141, 143, 151, 160, 179, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, 29, -102, 1, 189, 81, 40, - 96, 339, 88, 197, 389, -50, 364, -21, -747, 123, - 198, 188, 195, 204, -747, -747, -747, -747, -747, 256, - -747, 45, -747, -747, -747, -747, -747, -747, -747, 272, - 280, -747, -747, -747, -747, -747, 281, 282, 285, 286, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - 290, -747, -747, -747, 62, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, 291, -747, 66, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, 292, 293, -747, -747, -747, -747, -747, -747, - -747, -747, -747, 69, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, 82, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, 251, 271, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, 295, -747, - -747, 294, -747, -747, -747, 296, -747, -747, 297, 298, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, 302, 303, -747, -747, -747, -747, 300, - 307, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, 93, -747, -747, -747, 308, -747, -747, - 310, -747, 311, 313, -747, -747, 315, 316, 319, -747, - -747, -747, -747, -747, 112, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, 113, -747, -747, -747, 29, 29, -747, 163, 321, - 323, 324, 325, 326, -747, 1, -747, 327, 148, 183, - 331, 334, 335, 337, 340, 199, 206, 207, 208, 342, - 356, 366, 367, 370, 371, 372, 374, 376, 378, 243, - 379, 392, 189, -747, 395, 397, 402, 242, 81, -747, - 131, 403, 404, 408, 410, 412, 413, 414, 253, 276, - 436, 443, 444, 445, 40, -747, 447, 96, -747, 448, - 451, 452, 453, 455, 458, 459, 460, -747, 339, -747, - 461, 462, 336, 478, 479, 480, 341, -747, 197, 482, - 344, 345, -747, 389, 484, 486, -67, -747, 349, 487, - 497, 353, 499, 355, 359, 501, 505, 362, 363, 368, - 506, 511, 364, -747, 513, -21, -747, -747, -747, 516, - 514, 515, 29, 29, 29, -747, 517, -747, -747, 377, - 382, 383, 519, 525, -747, -747, -747, -747, 528, 529, - 530, 533, 532, 393, 537, 538, 539, 540, -747, 541, - 542, -747, 545, 28, 205, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, 543, 549, -747, - -747, -747, 407, 409, 411, 551, 415, 416, 418, -747, - -747, 209, 419, 553, 554, -747, 420, -747, 545, 421, - 422, 423, 424, 426, 427, 428, -747, 429, 430, -747, - 431, 432, 434, -747, -747, 435, -747, -747, -747, 437, - 29, -747, -747, 439, 440, -747, 441, -747, -747, 5, - 442, -747, -747, -747, 54, 463, -747, 557, -747, 29, - 189, -21, -747, -747, -747, 81, -747, -747, -747, 398, - 398, 577, 583, 598, 599, -747, -747, -747, 145, 34, - 600, 124, -20, 364, -747, -747, -747, -747, -747, -747, - -747, -747, 604, -747, 131, -747, -747, -747, 602, -747, - -747, -747, -747, -747, -747, -747, -747, 603, 526, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - 605, -747, 122, 128, 129, -747, -747, -747, -747, 610, - 611, 612, 613, 614, -747, -747, -747, 149, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, 186, -747, 615, 616, -747, -747, 617, 619, -747, - -747, 618, 622, -747, -747, 620, 624, -747, -747, -747, - -747, -747, -747, 53, -747, -747, -747, -747, -747, -747, - -747, 89, -747, 623, 625, -747, 626, 627, 628, 629, - 630, 631, 194, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, 233, -747, -747, -747, 234, - 472, 488, -747, -747, 632, 634, -747, -747, 633, 637, - -747, -747, 635, -747, 111, -747, -747, -747, -747, 638, - 640, 641, 642, 396, 490, 498, 500, 503, 644, 645, - 398, -747, -747, 40, -747, 577, 197, -747, 583, 389, - -747, 598, 120, -747, 599, 145, -747, 34, -747, -50, - -747, 600, 504, 507, 508, 509, 510, 512, 124, -747, - 646, 650, -20, -747, -747, -747, 649, 657, -747, 96, - -747, 602, 339, -747, 603, 658, -747, 333, 605, -747, - 217, 518, 520, 521, -747, -747, -747, -747, -747, 522, - 523, -747, 235, -747, 655, -747, 656, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, 255, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - 263, -747, -747, -747, -747, -747, -747, -747, -747, 524, - 527, -747, -747, 531, 264, -747, 659, -747, 534, -747, - 661, -747, -747, -747, -747, -747, 267, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, 120, -747, -747, -747, -747, - -747, -747, -747, -747, 669, 546, 670, 333, -747, -747, - 671, -747, 535, -747, 673, -747, -747, 187, -747, 39, - 673, -747, -747, 674, 677, 682, 270, -747, -747, -747, - -747, -747, -747, 684, 555, 548, 558, 39, -747, 544, - -747, -747, -747, -747, -747 + 284, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, 41, 19, 24, 50, 60, 92, + 102, 118, 129, 138, 148, 150, 159, 171, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, 19, -93, 8, 62, 31, 151, + -2, 228, 147, 236, 37, -24, 344, 27, -722, 184, + 204, 207, 200, 235, -722, -722, -722, -722, -722, 219, + -722, 48, -722, -722, -722, -722, -722, -722, -722, 227, + 241, -722, -722, -722, -722, -722, 244, 261, 276, 279, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + 283, -722, -722, -722, 56, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, 285, -722, 69, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, 301, 302, -722, -722, -722, -722, -722, -722, -722, + -722, -722, 95, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, 136, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, 231, 255, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, 299, -722, + -722, 314, -722, -722, -722, 315, -722, -722, 325, 332, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, 334, 336, -722, -722, -722, -722, 328, + 339, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, 140, -722, -722, -722, 341, -722, -722, + 343, -722, 350, 351, -722, -722, 352, 353, 355, -722, + -722, -722, -722, -722, 144, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, 146, -722, -722, -722, 19, 19, -722, 216, 363, + 367, 370, 371, 375, -722, 8, -722, 377, 197, 234, + 383, 384, 390, 391, 406, 221, 262, 263, 264, 410, + 411, 412, 413, 428, 429, 430, 431, 432, 433, 289, + 435, 436, 62, -722, 437, 438, 439, 293, 31, -722, + 441, 442, 457, 458, 460, 461, 462, 318, 317, 465, + 468, 470, 471, 151, -722, 472, -2, -722, 475, 476, + 477, 479, 480, 482, 483, 484, -722, 228, -722, 485, + 489, 345, 491, 492, 493, 347, -722, 236, 495, 349, + 356, -722, 37, 497, 500, -9, -722, 357, 502, 505, + 361, 507, 364, 368, 508, 511, 365, 369, 373, 514, + 515, 344, -722, 517, 27, -722, -722, -722, 521, 519, + 520, 19, 19, 19, -722, 522, -722, -722, 380, 382, + 385, 524, 525, -722, -722, -722, -722, 529, 530, 531, + 532, 533, 393, 534, 537, 538, 539, -722, 540, 541, + -722, 544, 96, 170, -722, -722, 396, 397, 402, 546, + 404, 405, 407, -722, -722, 254, 408, 549, 550, -722, + 414, -722, 544, 415, 416, 417, 418, 419, 420, 421, + -722, 422, 423, -722, 424, 425, 426, -722, -722, 427, + -722, -722, -722, 434, 19, -722, -722, 440, 443, -722, + 444, -722, -722, 15, 459, -722, -722, -722, 135, 445, + -722, 553, -722, 19, 62, 27, -722, -722, -722, 31, + -722, -722, -722, 366, 366, 552, 554, 569, 571, -722, + -722, -722, 101, 572, 573, 25, 14, 344, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, 574, + -722, -722, -722, -722, -722, -722, -722, -722, 576, 451, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, 577, -722, 155, 193, 206, -722, -722, -722, -722, + 556, 581, 582, 583, 585, -722, -722, -722, 224, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, 232, -722, 584, 591, -722, -722, 589, 593, + -722, -722, 592, 594, -722, -722, 595, 596, -722, -722, + -722, -722, -722, -722, 26, -722, -722, -722, -722, -722, + -722, -722, 68, -722, -722, 597, 599, -722, 600, 601, + 602, 603, 604, 605, 233, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, 256, -722, -722, + -722, 258, 452, -722, 606, 607, -722, -722, 608, 610, + -722, -722, 609, -722, 94, -722, -722, -722, -722, 611, + 612, 614, 615, 473, 469, 474, 478, 481, 617, 620, + 366, -722, -722, 151, -722, 552, 236, -722, 554, 37, + -722, 569, 182, -722, 571, 101, -722, 220, 572, -722, + -24, -722, 573, 486, 487, 488, 490, 494, 496, 25, + -722, 621, 622, 14, -722, -722, -722, 625, 624, -2, + -722, 574, 228, -722, 576, 628, -722, 64, 577, -722, + 294, 463, 498, 499, -722, -722, -722, -722, -722, 501, + 503, -722, 259, -722, 626, -722, 630, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, 270, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, 632, + 638, -722, -722, -722, -722, 273, -722, -722, -722, -722, + -722, -722, -722, -722, 504, 506, -722, -722, 510, 274, + -722, 634, -722, 512, -722, 629, -722, -722, -722, -722, + -722, 295, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + 182, -722, 640, -722, 220, -722, -722, -722, -722, -722, + -722, -722, 644, 513, 646, 64, -722, -722, 527, -722, + 623, -722, 535, -722, -722, 648, -722, -722, 174, -722, + 4, 648, -722, -722, 649, 652, 655, 313, -722, -722, + -722, -722, -722, -722, 657, 543, 516, 523, 4, -722, + 542, -722, -722, -722, -722, -722 }; const unsigned short int @@ -3676,363 +3676,361 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, 56, 5, 68, 7, 115, 9, 227, 11, 380, 13, - 403, 15, 305, 17, 313, 19, 350, 21, 192, 23, - 489, 25, 546, 27, 45, 39, 0, 0, 0, 0, - 0, 405, 0, 315, 352, 0, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 544, 538, 540, 542, 0, + 404, 15, 305, 17, 313, 19, 350, 21, 192, 23, + 490, 25, 547, 27, 45, 39, 0, 0, 0, 0, + 0, 406, 0, 315, 352, 0, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 545, 539, 541, 543, 0, 65, 0, 58, 60, 62, 63, 64, 61, 104, 0, - 0, 424, 426, 428, 128, 130, 0, 0, 0, 0, - 219, 303, 342, 276, 391, 393, 170, 450, 184, 203, - 0, 474, 487, 97, 0, 70, 72, 73, 74, 75, + 0, 425, 427, 429, 128, 130, 0, 0, 0, 0, + 219, 303, 342, 276, 392, 394, 170, 451, 184, 203, + 0, 475, 488, 97, 0, 70, 72, 73, 74, 75, 90, 91, 78, 79, 80, 81, 85, 86, 76, 77, 83, 84, 95, 96, 92, 93, 94, 82, 87, 88, 89, 117, 119, 123, 0, 114, 0, 106, 108, 109, - 110, 111, 112, 113, 454, 257, 259, 261, 372, 255, - 263, 265, 0, 0, 269, 267, 395, 446, 254, 231, - 232, 233, 245, 0, 229, 236, 249, 250, 251, 237, - 238, 241, 243, 239, 240, 234, 235, 252, 253, 242, - 246, 247, 248, 244, 389, 388, 385, 0, 382, 384, - 386, 387, 444, 432, 434, 438, 436, 442, 440, 430, - 423, 417, 421, 422, 0, 406, 407, 418, 419, 420, - 414, 409, 415, 411, 412, 413, 416, 410, 0, 332, + 110, 111, 112, 113, 257, 259, 261, 372, 255, 263, + 265, 0, 0, 269, 267, 396, 447, 254, 231, 232, + 233, 245, 0, 229, 236, 249, 250, 251, 237, 238, + 241, 243, 239, 240, 234, 235, 252, 253, 242, 246, + 247, 248, 244, 390, 389, 386, 385, 0, 382, 384, + 387, 388, 445, 433, 435, 439, 437, 443, 441, 431, + 424, 418, 422, 423, 0, 407, 408, 419, 420, 421, + 415, 410, 416, 412, 413, 414, 417, 411, 0, 332, 160, 0, 336, 334, 339, 0, 328, 329, 0, 316, 317, 319, 331, 320, 321, 322, 338, 323, 324, 325, 326, 327, 366, 0, 0, 364, 365, 368, 369, 0, 353, 354, 356, 357, 358, 359, 360, 361, 362, 363, - 199, 201, 196, 0, 194, 197, 198, 0, 511, 513, - 0, 516, 0, 0, 520, 524, 0, 0, 0, 529, - 536, 509, 507, 508, 0, 491, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 551, 0, 548, 550, 44, 0, 0, 37, 0, 0, + 199, 201, 196, 0, 194, 197, 198, 0, 512, 514, + 0, 517, 0, 0, 521, 525, 0, 0, 0, 530, + 537, 510, 508, 509, 0, 492, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 552, 0, 549, 551, 44, 0, 0, 37, 0, 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 116, - 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 381, 0, - 0, 0, 0, 0, 0, 0, 0, 404, 0, 306, - 0, 0, 0, 0, 0, 0, 0, 314, 0, 0, - 0, 0, 351, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 490, 0, 0, 547, 48, 41, 0, - 0, 0, 0, 0, 0, 59, 0, 102, 103, 0, - 0, 0, 0, 0, 98, 99, 100, 101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, - 0, 71, 0, 0, 0, 127, 107, 471, 469, 470, - 462, 463, 467, 468, 464, 465, 466, 0, 457, 458, - 460, 461, 0, 0, 0, 0, 0, 0, 0, 274, - 275, 0, 0, 0, 0, 230, 0, 383, 0, 0, - 0, 0, 0, 0, 0, 0, 408, 0, 0, 330, - 0, 0, 0, 341, 318, 0, 370, 371, 355, 0, - 0, 195, 510, 0, 0, 515, 0, 518, 519, 0, - 0, 526, 527, 528, 0, 0, 492, 0, 549, 0, - 0, 0, 539, 541, 543, 0, 425, 427, 429, 0, - 0, 221, 307, 344, 278, 38, 392, 394, 0, 0, - 186, 0, 0, 0, 49, 118, 121, 122, 120, 125, - 126, 124, 0, 455, 0, 258, 260, 262, 374, 256, - 264, 266, 271, 272, 273, 270, 268, 397, 0, 390, - 445, 433, 435, 439, 437, 443, 441, 431, 333, 161, - 337, 335, 340, 367, 200, 202, 512, 514, 517, 522, - 523, 521, 525, 531, 532, 533, 534, 535, 530, 537, - 0, 42, 0, 0, 0, 147, 153, 155, 157, 0, - 0, 0, 0, 0, 166, 168, 146, 0, 132, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 0, 225, 0, 222, 223, 311, 0, 308, 309, - 348, 0, 345, 346, 282, 0, 279, 280, 179, 180, - 181, 182, 183, 0, 172, 174, 175, 176, 177, 178, - 452, 0, 190, 0, 187, 188, 0, 0, 0, 0, - 0, 0, 0, 205, 207, 208, 209, 210, 211, 212, - 483, 485, 482, 480, 481, 0, 476, 478, 479, 0, - 51, 0, 459, 378, 0, 375, 376, 401, 0, 398, - 399, 448, 0, 555, 0, 553, 67, 545, 105, 0, + 0, 0, 0, 0, 228, 0, 0, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 405, 0, 306, 0, + 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, + 0, 351, 0, 0, 0, 0, 193, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 491, 0, 0, 548, 48, 41, 0, 0, + 0, 0, 0, 0, 59, 0, 102, 103, 0, 0, + 0, 0, 0, 98, 99, 100, 101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, + 71, 0, 0, 0, 127, 107, 0, 0, 0, 0, + 0, 0, 0, 274, 275, 0, 0, 0, 0, 230, + 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, + 409, 0, 0, 330, 0, 0, 0, 341, 318, 0, + 370, 371, 355, 0, 0, 195, 511, 0, 0, 516, + 0, 519, 520, 0, 0, 527, 528, 529, 0, 0, + 493, 0, 550, 0, 0, 0, 540, 542, 544, 0, + 426, 428, 430, 0, 0, 221, 307, 344, 278, 38, + 393, 395, 0, 0, 186, 0, 0, 0, 49, 118, + 121, 122, 120, 125, 126, 124, 258, 260, 262, 374, + 256, 264, 266, 271, 272, 273, 270, 268, 398, 0, + 391, 446, 434, 436, 440, 438, 444, 442, 432, 333, + 161, 337, 335, 340, 367, 200, 202, 513, 515, 518, + 523, 524, 522, 526, 532, 533, 534, 535, 536, 531, + 538, 0, 42, 0, 0, 0, 147, 153, 155, 157, + 0, 0, 0, 0, 0, 166, 168, 146, 0, 132, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 0, 225, 0, 222, 223, 311, 0, 308, + 309, 348, 0, 345, 346, 282, 0, 279, 280, 179, + 180, 181, 182, 183, 0, 172, 174, 175, 176, 177, + 178, 455, 0, 453, 190, 0, 187, 188, 0, 0, + 0, 0, 0, 0, 0, 205, 207, 208, 209, 210, + 211, 212, 484, 486, 483, 481, 482, 0, 477, 479, + 480, 0, 51, 378, 0, 375, 376, 402, 0, 399, + 400, 449, 0, 556, 0, 554, 67, 546, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 131, 0, 220, 0, 315, 304, 0, 352, - 343, 0, 0, 277, 0, 0, 171, 0, 451, 0, - 185, 0, 0, 0, 0, 0, 0, 0, 0, 204, - 0, 0, 0, 475, 488, 53, 0, 52, 472, 0, - 373, 0, 405, 396, 0, 0, 447, 0, 0, 552, + 343, 0, 0, 277, 0, 0, 171, 457, 0, 452, + 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, + 204, 0, 0, 0, 476, 489, 53, 0, 52, 0, + 373, 0, 406, 397, 0, 0, 448, 0, 0, 553, 0, 0, 0, 0, 159, 162, 163, 164, 165, 0, 0, 133, 0, 224, 0, 310, 0, 347, 302, 299, 289, 290, 292, 286, 287, 288, 298, 297, 0, 284, - 291, 300, 301, 293, 294, 295, 296, 281, 173, 453, - 0, 189, 213, 214, 215, 216, 217, 218, 206, 0, - 0, 477, 50, 0, 0, 377, 0, 400, 0, 569, - 0, 567, 565, 559, 563, 564, 0, 557, 561, 562, - 560, 554, 149, 150, 151, 152, 148, 154, 156, 158, - 167, 169, 226, 312, 349, 0, 283, 191, 484, 486, - 54, 379, 402, 449, 0, 0, 0, 0, 556, 285, - 0, 566, 0, 558, 0, 568, 573, 0, 571, 0, - 0, 570, 581, 0, 0, 0, 0, 575, 577, 578, - 579, 580, 572, 0, 0, 0, 0, 0, 574, 0, - 583, 584, 585, 576, 582 + 291, 300, 301, 293, 294, 295, 296, 281, 173, 472, + 470, 471, 463, 464, 468, 469, 465, 466, 467, 0, + 458, 459, 461, 462, 454, 0, 189, 213, 214, 215, + 216, 217, 218, 206, 0, 0, 478, 50, 0, 0, + 377, 0, 401, 0, 570, 0, 568, 566, 560, 564, + 565, 0, 558, 562, 563, 561, 555, 149, 150, 151, + 152, 148, 154, 156, 158, 167, 169, 226, 312, 349, + 0, 283, 0, 456, 0, 191, 485, 487, 54, 379, + 403, 450, 0, 0, 0, 0, 557, 285, 0, 460, + 0, 567, 0, 559, 473, 0, 569, 574, 0, 572, + 0, 0, 571, 582, 0, 0, 0, 0, 576, 578, + 579, 580, 581, 573, 0, 0, 0, 0, 0, 575, + 0, 584, 585, 586, 577, 583 }; const short int Dhcp4Parser::yypgoto_[] = { - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -33, -747, 215, -747, -747, - -747, -747, -747, -747, -747, -747, 192, -747, -747, -747, - -66, -747, -747, -747, 373, -747, -747, -747, -747, 167, - 329, -68, -51, -48, -747, -747, -34, -747, -747, 155, - 352, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, 153, -29, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -61, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -43, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -47, -747, -747, -747, -42, 309, -747, -747, -747, - -747, -747, -747, -747, -49, -747, -747, -747, -747, -747, - -747, -746, -747, -747, -747, -25, -747, -747, -747, -18, - 348, -747, -747, -747, -747, -747, -747, -747, -747, -745, - -747, -747, -747, -563, -747, -734, -747, -747, -747, -747, - -747, -747, -747, -747, -31, -747, -747, -146, -57, -747, - -747, -747, -747, -747, -17, -747, -747, -747, -12, -747, - 338, -747, -60, -747, -747, -747, -747, -747, -55, -747, - -747, -747, -747, -747, -3, -747, -747, -747, -14, -747, - -747, -747, -10, -747, 343, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -39, -747, -747, -747, - -35, 375, -747, -747, -44, -747, -19, -747, -747, -747, - -747, -747, -37, -747, -747, -747, -27, -747, 360, -11, - -747, 2, -747, 7, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -729, -747, -747, -747, -747, -747, -747, -747, -747, - -747, 177, -747, -747, -747, -747, -747, -747, -747, -16, - -747, -747, -747, -747, -747, -747, -747, -747, 201, 347, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, -747, -747, -747, -747, -747, -747, -747, - -747, -747, -747, 216, 350, -747, -747, -747, -30, -747, - -747, -126, -747, -747, -747, -747, -747, -747, -138, -747, - -747, -152, -747, -747, -747, -747, -747 + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -51, -722, 202, -722, -722, + -722, -722, -722, -722, -722, -722, 176, -722, -722, -722, + -66, -722, -722, -722, 354, -722, -722, -722, -722, 157, + 316, -23, -21, 0, -722, -722, 6, -722, -722, 141, + 324, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, 154, -35, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -73, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -45, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -38, -722, -722, -722, -43, 305, -722, -722, -722, + -722, -722, -722, -722, -32, -722, -722, -722, -722, -722, + -722, -721, -722, -722, -722, -7, -722, -722, -722, 1, + 362, -722, -722, -722, -722, -722, -722, -722, -722, -715, + -722, -722, -722, -25, -722, -709, -722, -722, -722, -722, + -722, -722, -722, -722, -20, -722, -722, -143, -61, -722, + -722, -722, -722, -722, 2, -722, -722, -722, 11, -722, + 342, -722, -68, -722, -722, -722, -722, -722, -62, -722, + -722, -722, -722, -722, -17, -722, -722, -722, 9, -722, + -722, -722, 12, -722, 346, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -18, -722, -722, -722, + -15, 374, -722, -722, -54, -722, -34, -722, -722, -722, + -722, -722, -12, -722, -722, -722, -16, -722, 360, -46, + -722, -11, -722, -1, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -704, -722, -722, -722, -722, -722, -722, 16, -722, + -722, -722, -125, -722, -722, -722, -722, -722, -722, -722, + 3, -722, -722, -722, -722, -722, -722, -722, -722, 208, + 337, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, + -722, -722, -722, -722, 237, 329, -722, -722, -722, -8, + -722, -722, -128, -722, -722, -722, -722, -722, -722, -142, + -722, -722, -155, -722, -722, -722, -722, -722 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 36, 37, 38, 65, 566, - 82, 83, 39, 64, 79, 80, 575, 720, 786, 787, + 23, 24, 25, 26, 27, 36, 37, 38, 65, 550, + 82, 83, 39, 64, 79, 80, 559, 702, 767, 768, 123, 41, 66, 91, 92, 93, 329, 43, 67, 124, 125, 126, 127, 128, 129, 130, 131, 132, 337, 156, - 157, 45, 68, 158, 364, 159, 365, 578, 160, 366, - 581, 161, 133, 343, 134, 344, 647, 648, 649, 739, - 876, 650, 740, 651, 741, 652, 742, 653, 247, 401, - 655, 656, 657, 658, 659, 748, 660, 749, 135, 355, - 683, 684, 685, 686, 687, 688, 689, 136, 357, 693, - 694, 695, 769, 59, 75, 283, 284, 285, 414, 286, - 415, 137, 358, 702, 703, 704, 705, 706, 707, 708, - 709, 138, 349, 663, 664, 665, 753, 47, 69, 183, - 184, 185, 375, 186, 371, 187, 372, 188, 373, 189, - 376, 190, 377, 191, 381, 192, 380, 595, 193, 194, - 139, 352, 675, 676, 677, 762, 828, 829, 140, 350, - 53, 72, 667, 668, 669, 756, 55, 73, 248, 249, - 250, 251, 252, 253, 254, 400, 255, 404, 256, 403, - 257, 258, 405, 259, 141, 351, 671, 672, 673, 759, - 57, 74, 269, 270, 271, 272, 273, 409, 274, 275, - 276, 277, 196, 374, 724, 725, 726, 789, 49, 70, - 207, 208, 209, 386, 142, 353, 143, 354, 199, 382, - 728, 729, 730, 792, 51, 71, 224, 225, 226, 144, - 340, 145, 341, 146, 342, 230, 396, 231, 390, 232, - 391, 233, 393, 234, 392, 235, 395, 236, 394, 237, - 389, 203, 383, 732, 795, 147, 356, 691, 370, 487, - 488, 489, 490, 491, 582, 148, 149, 360, 715, 716, - 717, 780, 718, 781, 150, 361, 61, 76, 304, 305, - 306, 307, 419, 308, 420, 309, 310, 422, 311, 312, - 313, 425, 621, 314, 426, 315, 316, 317, 318, 430, - 628, 319, 431, 94, 331, 95, 332, 96, 333, 97, - 330, 63, 77, 321, 322, 323, 434, 734, 735, 797, - 866, 867, 868, 869, 896, 870, 894, 907, 908, 909, - 916, 917, 918, 923, 919, 920, 921 + 157, 45, 68, 158, 364, 159, 365, 562, 160, 366, + 565, 161, 133, 343, 134, 344, 628, 629, 630, 719, + 871, 631, 720, 632, 721, 633, 722, 634, 247, 400, + 636, 637, 638, 639, 640, 728, 641, 729, 135, 355, + 664, 665, 666, 667, 668, 669, 670, 136, 357, 675, + 676, 677, 750, 59, 75, 283, 284, 285, 413, 286, + 414, 137, 358, 684, 685, 686, 687, 688, 689, 690, + 691, 138, 349, 644, 645, 646, 733, 47, 69, 182, + 183, 184, 374, 185, 370, 186, 371, 187, 372, 188, + 375, 189, 376, 190, 380, 191, 379, 576, 192, 193, + 139, 352, 656, 657, 658, 742, 808, 809, 140, 350, + 53, 72, 648, 649, 650, 736, 55, 73, 248, 249, + 250, 251, 252, 253, 254, 399, 255, 403, 256, 402, + 257, 258, 404, 259, 141, 351, 652, 653, 654, 739, + 57, 74, 269, 270, 271, 272, 273, 408, 274, 275, + 276, 277, 195, 373, 704, 705, 706, 769, 49, 70, + 207, 208, 209, 385, 142, 353, 143, 354, 198, 381, + 708, 709, 710, 772, 51, 71, 224, 225, 226, 144, + 340, 145, 341, 146, 342, 230, 395, 231, 389, 232, + 390, 233, 392, 234, 391, 235, 394, 236, 393, 237, + 388, 202, 382, 712, 775, 147, 356, 672, 673, 747, + 829, 830, 831, 832, 833, 882, 148, 149, 360, 697, + 698, 699, 761, 700, 762, 150, 361, 61, 76, 304, + 305, 306, 307, 418, 308, 419, 309, 310, 421, 311, + 312, 313, 424, 602, 314, 425, 315, 316, 317, 318, + 429, 609, 319, 430, 94, 331, 95, 332, 96, 333, + 97, 330, 63, 77, 321, 322, 323, 433, 714, 715, + 777, 861, 862, 863, 864, 894, 865, 892, 908, 909, + 910, 917, 918, 919, 924, 920, 921, 922 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 90, 179, 155, 178, 205, 220, 690, 246, 265, 282, - 301, 84, 28, 266, 267, 238, 824, 825, 180, 268, - 619, 181, 280, 281, 162, 197, 210, 222, 827, 260, - 278, 78, 302, 836, 29, 182, 30, 40, 31, 280, - 281, 164, 576, 577, 114, 115, 81, 164, 335, 163, - 198, 211, 223, 336, 261, 279, 765, 303, 200, 766, - 227, 100, 101, 102, 103, 362, 195, 206, 221, 368, - 363, 201, 384, 228, 369, 42, 202, 385, 229, 44, - 710, 711, 106, 107, 108, 387, 46, 165, 166, 167, - 388, 112, 767, 151, 152, 768, 416, 153, 89, 48, - 154, 417, 168, 320, 114, 115, 169, 170, 171, 172, - 173, 174, 175, 50, 798, 432, 435, 799, 175, 176, - 433, 436, 620, 52, 85, 362, 177, 164, 89, 324, - 736, 435, 368, 86, 87, 88, 737, 738, 111, 824, - 825, 100, 101, 102, 103, 114, 115, 112, 54, 89, - 56, 827, 750, 101, 102, 103, 836, 751, 58, 204, - 114, 115, 106, 107, 108, 912, 110, 60, 913, 914, - 915, 112, 240, 623, 624, 625, 626, 32, 33, 34, - 35, 111, 112, 240, 114, 115, 62, 170, 89, 750, - 910, 174, 326, 911, 752, 114, 115, 778, 175, 826, - 98, 325, 779, 327, 839, 627, 177, 328, 477, 99, - 100, 101, 102, 103, 104, 105, 696, 697, 698, 699, - 700, 701, 579, 580, 239, 678, 679, 680, 681, 89, - 682, 106, 107, 108, 109, 110, 782, 432, 384, 111, - 112, 783, 784, 882, 89, 872, 873, 874, 875, 240, - 113, 241, 242, 114, 115, 243, 244, 245, 885, 397, - 334, 114, 115, 886, 116, 117, 416, 387, 89, 90, - 897, 887, 891, 927, 398, 898, 338, 118, 928, 89, - 119, 592, 593, 594, 339, 345, 346, 120, 121, 347, - 348, 122, 437, 438, 359, 367, 378, 379, 402, 447, - 406, 408, 155, 399, 478, 407, 410, 411, 412, 479, - 413, 439, 418, 480, 421, 423, 179, 424, 178, 427, - 428, 205, 826, 429, 162, 440, 482, 441, 442, 443, - 444, 446, 220, 180, 448, 449, 181, 89, 450, 451, - 197, 452, 246, 210, 453, 89, 458, 265, 454, 163, - 182, 483, 266, 267, 222, 455, 456, 457, 268, 484, - 459, 101, 102, 103, 260, 198, 301, 481, 211, 278, - 460, 461, 485, 200, 462, 463, 464, 486, 465, 223, - 466, 195, 467, 469, 206, 240, 201, 227, 302, 261, - 112, 202, 468, 475, 279, 221, 470, 114, 115, 472, - 228, 473, 499, 114, 115, 229, 474, 492, 493, 552, - 553, 554, 494, 303, 495, 212, 496, 497, 498, 213, - 214, 215, 216, 217, 218, 635, 219, 500, 114, 115, - 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, - 501, 240, 262, 241, 242, 263, 264, 502, 503, 504, - 240, 506, 508, 114, 115, 509, 510, 511, 859, 512, - 860, 861, 513, 514, 515, 517, 518, 287, 288, 289, + 90, 266, 155, 177, 204, 220, 267, 246, 265, 282, + 301, 238, 268, 78, 162, 196, 210, 222, 84, 260, + 278, 804, 302, 199, 29, 227, 30, 805, 31, 745, + 600, 40, 746, 807, 163, 197, 211, 223, 816, 261, + 279, 28, 303, 151, 152, 205, 178, 153, 179, 112, + 154, 335, 194, 206, 221, 81, 336, 42, 200, 362, + 228, 203, 114, 115, 363, 280, 281, 44, 201, 180, + 229, 748, 368, 98, 749, 181, 174, 369, 114, 115, + 280, 281, 99, 100, 101, 102, 103, 104, 105, 240, + 262, 241, 242, 263, 264, 114, 115, 778, 383, 46, + 779, 114, 115, 384, 106, 107, 108, 109, 110, 48, + 560, 561, 111, 112, 692, 693, 240, 678, 679, 680, + 681, 682, 683, 113, 89, 50, 114, 115, 114, 115, + 913, 85, 601, 914, 915, 916, 52, 116, 117, 386, + 86, 87, 88, 415, 387, 54, 89, 431, 416, 434, + 118, 320, 432, 119, 435, 56, 89, 58, 362, 804, + 120, 121, 89, 716, 122, 805, 60, 32, 33, 34, + 35, 807, 100, 101, 102, 103, 816, 911, 62, 89, + 912, 659, 660, 661, 662, 89, 663, 563, 564, 854, + 324, 855, 856, 106, 107, 108, 434, 111, 164, 165, + 166, 717, 112, 100, 101, 102, 103, 325, 327, 368, + 89, 326, 89, 167, 718, 114, 115, 168, 169, 170, + 171, 172, 173, 334, 106, 107, 108, 730, 110, 174, + 175, 338, 731, 112, 240, 730, 759, 176, 328, 396, + 732, 760, 101, 102, 103, 339, 114, 115, 345, 169, + 101, 102, 103, 173, 604, 605, 606, 607, 397, 763, + 174, 431, 383, 239, 764, 346, 765, 877, 176, 90, + 111, 112, 240, 880, 436, 437, 415, 386, 881, 112, + 347, 885, 889, 348, 114, 115, 608, 359, 240, 367, + 241, 242, 114, 115, 243, 244, 245, 819, 895, 89, + 114, 115, 155, 896, 212, 377, 378, 398, 213, 214, + 215, 216, 217, 218, 162, 219, 928, 177, 401, 405, + 204, 929, 867, 868, 869, 870, 573, 574, 575, 196, + 89, 220, 210, 406, 163, 407, 411, 199, 409, 266, + 410, 246, 412, 222, 267, 417, 265, 420, 446, 197, + 268, 227, 211, 260, 422, 423, 426, 427, 278, 428, + 178, 205, 179, 223, 438, 301, 194, 439, 89, 206, + 453, 440, 200, 261, 441, 442, 89, 302, 279, 443, + 221, 445, 201, 180, 89, 447, 228, 448, 449, 181, + 536, 537, 538, 616, 450, 451, 229, 303, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 114, 115, + 452, 454, 455, 456, 457, 458, 459, 460, 240, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 471, 472, 473, 474, 476, 477, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 89, 520, 521, 522, 519, 525, 89, 529, 155, - 530, 533, 523, 646, 646, 526, 527, 615, 654, 654, - 532, 534, 535, 536, 537, 539, 712, 301, 538, 540, - 544, 162, 89, 541, 542, 545, 631, 547, 478, 543, - 549, 550, 551, 479, 555, 556, 559, 480, 713, 302, - 557, 558, 560, 561, 562, 563, 163, 89, 564, 30, - 482, 567, 568, 569, 570, 804, 89, 571, 572, 573, - 574, 583, 584, 714, 303, 585, 588, 586, 597, 587, - 622, 598, 630, 589, 590, 483, 591, 596, 599, 601, - 602, 603, 604, 484, 605, 606, 607, 608, 609, 610, - 611, 481, 612, 613, 662, 614, 485, 616, 617, 618, - 666, 486, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 670, 674, 692, 721, 723, - 727, 629, 733, 731, 743, 744, 745, 746, 747, 755, - 785, 754, 758, 757, 760, 761, 763, 764, 771, 770, - 772, 773, 774, 775, 776, 777, 788, 791, 790, 793, - 794, 805, 800, 796, 801, 802, 803, 806, 809, 810, - 849, 807, 808, 842, 850, 852, 843, 844, 845, 846, - 853, 847, 858, 883, 884, 895, 877, 892, 878, 879, - 880, 881, 888, 900, 902, 889, 904, 565, 924, 890, - 906, 925, 893, 905, 646, 179, 926, 178, 929, 654, - 246, 471, 934, 265, 819, 901, 818, 931, 266, 267, - 600, 823, 180, 282, 268, 181, 930, 932, 445, 197, - 634, 820, 260, 661, 821, 278, 712, 632, 831, 182, - 476, 811, 838, 205, 841, 531, 220, 840, 822, 848, - 813, 862, 505, 837, 198, 812, 863, 261, 713, 899, - 279, 815, 200, 832, 814, 210, 524, 817, 222, 816, - 195, 833, 855, 864, 854, 201, 528, 857, 516, 830, - 202, 722, 507, 714, 834, 856, 851, 633, 871, 835, - 211, 903, 922, 223, 719, 933, 0, 0, 865, 546, - 0, 227, 0, 0, 0, 548, 206, 0, 0, 221, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 229, + 300, 478, 479, 596, 480, 481, 482, 483, 484, 485, + 635, 635, 486, 155, 487, 488, 490, 627, 627, 492, + 493, 494, 612, 495, 496, 162, 497, 498, 499, 501, + 694, 301, 89, 502, 503, 504, 505, 506, 507, 509, + 510, 513, 695, 302, 514, 163, 517, 511, 516, 518, + 519, 520, 523, 521, 89, 524, 525, 522, 528, 529, + 526, 531, 696, 303, 527, 533, 534, 535, 540, 539, + 541, 543, 544, 542, 545, 546, 547, 548, 711, 552, + 30, 551, 553, 554, 566, 567, 555, 556, 557, 558, + 568, 569, 570, 571, 578, 572, 577, 579, 611, 643, + 723, 647, 580, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 651, 603, 655, 671, + 674, 703, 595, 707, 713, 724, 725, 726, 597, 727, + 734, 598, 599, 610, 735, 737, 738, 741, 740, 744, + 766, 743, 752, 751, 753, 754, 755, 756, 757, 758, + 771, 872, 770, 774, 773, 780, 781, 776, 782, 783, + 785, 789, 784, 786, 790, 844, 845, 848, 905, 787, + 788, 847, 853, 893, 878, 837, 838, 839, 879, 840, + 883, 884, 890, 841, 898, 842, 873, 874, 900, 875, + 902, 876, 886, 925, 887, 907, 926, 635, 888, 927, + 891, 930, 901, 549, 627, 932, 266, 177, 581, 803, + 246, 267, 933, 265, 821, 904, 798, 268, 470, 196, + 615, 820, 260, 906, 282, 278, 822, 199, 811, 444, + 935, 613, 475, 824, 931, 791, 813, 694, 642, 197, + 818, 826, 261, 204, 858, 279, 220, 835, 812, 695, + 178, 857, 179, 825, 836, 210, 194, 806, 222, 799, + 515, 800, 200, 859, 817, 810, 227, 843, 793, 696, + 823, 814, 201, 180, 792, 211, 827, 897, 223, 181, + 795, 815, 801, 860, 205, 489, 828, 794, 802, 508, + 797, 796, 206, 850, 849, 221, 851, 500, 512, 899, + 491, 228, 852, 532, 834, 701, 846, 903, 530, 923, + 866, 229, 614, 934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 819, 0, 818, - 0, 0, 0, 0, 823, 0, 0, 0, 0, 0, - 0, 862, 0, 0, 820, 0, 863, 821, 0, 0, - 0, 831, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 822, 0, 864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 832, 0, 0, 0, - 0, 0, 0, 0, 833, 0, 0, 0, 865, 0, - 0, 0, 830, 0, 0, 0, 0, 834, 0, 0, - 0, 0, 835 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 803, 0, 0, + 0, 821, 0, 0, 798, 0, 0, 0, 820, 0, + 0, 0, 858, 822, 0, 0, 811, 0, 0, 857, + 824, 0, 0, 0, 813, 0, 0, 0, 826, 0, + 0, 859, 0, 0, 0, 0, 812, 0, 0, 0, + 825, 0, 0, 0, 0, 806, 0, 799, 0, 800, + 0, 860, 0, 810, 0, 0, 0, 823, 0, 814, + 0, 0, 0, 827, 0, 0, 0, 0, 0, 815, + 801, 0, 0, 828, 0, 0, 802 }; const short int Dhcp4Parser::yycheck_[] = { - 66, 69, 68, 69, 70, 71, 569, 73, 74, 75, - 76, 10, 0, 74, 74, 72, 762, 762, 69, 74, - 15, 69, 89, 90, 68, 69, 70, 71, 762, 73, - 74, 64, 76, 762, 5, 69, 7, 7, 9, 89, - 90, 7, 14, 15, 64, 65, 148, 7, 3, 68, - 69, 70, 71, 8, 73, 74, 3, 76, 69, 6, - 71, 21, 22, 23, 24, 3, 69, 70, 71, 3, - 8, 69, 3, 71, 8, 7, 69, 8, 71, 7, - 100, 101, 42, 43, 44, 3, 7, 47, 48, 49, - 8, 51, 3, 12, 13, 6, 3, 16, 148, 7, - 19, 8, 62, 124, 64, 65, 66, 67, 68, 69, - 70, 71, 78, 7, 3, 3, 3, 6, 78, 79, - 8, 8, 117, 7, 123, 3, 86, 7, 148, 6, - 8, 3, 3, 132, 133, 134, 8, 8, 50, 885, - 885, 21, 22, 23, 24, 64, 65, 51, 7, 148, - 7, 885, 3, 22, 23, 24, 885, 8, 7, 63, - 64, 65, 42, 43, 44, 126, 46, 7, 129, 130, - 131, 51, 52, 119, 120, 121, 122, 148, 149, 150, - 151, 50, 51, 52, 64, 65, 7, 67, 148, 3, - 3, 71, 4, 6, 8, 64, 65, 3, 78, 762, - 11, 3, 8, 8, 767, 151, 86, 3, 77, 20, - 21, 22, 23, 24, 25, 26, 92, 93, 94, 95, - 96, 97, 17, 18, 27, 80, 81, 82, 83, 148, - 85, 42, 43, 44, 45, 46, 3, 3, 3, 50, - 51, 8, 8, 8, 148, 28, 29, 30, 31, 52, - 61, 54, 55, 64, 65, 58, 59, 60, 3, 8, - 4, 64, 65, 8, 75, 76, 3, 3, 148, 335, - 3, 8, 8, 3, 3, 8, 4, 88, 8, 148, - 91, 72, 73, 74, 4, 4, 4, 98, 99, 4, - 4, 102, 325, 326, 4, 4, 4, 4, 4, 151, - 4, 3, 368, 8, 370, 8, 4, 4, 8, 370, - 3, 148, 4, 370, 4, 4, 384, 4, 384, 4, - 4, 387, 885, 4, 368, 4, 370, 4, 4, 4, - 4, 4, 398, 384, 151, 4, 384, 148, 4, 4, - 384, 4, 408, 387, 4, 148, 4, 413, 149, 368, - 384, 370, 413, 413, 398, 149, 149, 149, 413, 370, - 4, 22, 23, 24, 408, 384, 432, 370, 387, 413, - 4, 4, 370, 384, 4, 4, 4, 370, 4, 398, - 4, 384, 4, 4, 387, 52, 384, 398, 432, 408, - 51, 384, 149, 151, 413, 398, 4, 64, 65, 4, - 398, 4, 149, 64, 65, 398, 4, 4, 4, 442, - 443, 444, 4, 432, 4, 76, 4, 4, 4, 80, - 81, 82, 83, 84, 85, 27, 87, 151, 64, 65, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 4, 52, 53, 54, 55, 56, 57, 4, 4, 4, - 52, 4, 4, 64, 65, 4, 4, 4, 125, 4, - 127, 128, 4, 4, 4, 4, 4, 103, 104, 105, + 66, 74, 68, 69, 70, 71, 74, 73, 74, 75, + 76, 72, 74, 64, 68, 69, 70, 71, 10, 73, + 74, 742, 76, 69, 5, 71, 7, 742, 9, 3, + 15, 7, 6, 742, 68, 69, 70, 71, 742, 73, + 74, 0, 76, 12, 13, 70, 69, 16, 69, 51, + 19, 3, 69, 70, 71, 148, 8, 7, 69, 3, + 71, 63, 64, 65, 8, 89, 90, 7, 69, 69, + 71, 3, 3, 11, 6, 69, 78, 8, 64, 65, + 89, 90, 20, 21, 22, 23, 24, 25, 26, 52, + 53, 54, 55, 56, 57, 64, 65, 3, 3, 7, + 6, 64, 65, 8, 42, 43, 44, 45, 46, 7, + 14, 15, 50, 51, 100, 101, 52, 92, 93, 94, + 95, 96, 97, 61, 148, 7, 64, 65, 64, 65, + 126, 123, 117, 129, 130, 131, 7, 75, 76, 3, + 132, 133, 134, 3, 8, 7, 148, 3, 8, 3, + 88, 124, 8, 91, 8, 7, 148, 7, 3, 880, + 98, 99, 148, 8, 102, 880, 7, 148, 149, 150, + 151, 880, 21, 22, 23, 24, 880, 3, 7, 148, + 6, 80, 81, 82, 83, 148, 85, 17, 18, 125, + 6, 127, 128, 42, 43, 44, 3, 50, 47, 48, + 49, 8, 51, 21, 22, 23, 24, 3, 8, 3, + 148, 4, 148, 62, 8, 64, 65, 66, 67, 68, + 69, 70, 71, 4, 42, 43, 44, 3, 46, 78, + 79, 4, 8, 51, 52, 3, 3, 86, 3, 8, + 8, 8, 22, 23, 24, 4, 64, 65, 4, 67, + 22, 23, 24, 71, 119, 120, 121, 122, 3, 3, + 78, 3, 3, 27, 8, 4, 8, 8, 86, 335, + 50, 51, 52, 3, 325, 326, 3, 3, 8, 51, + 4, 8, 8, 4, 64, 65, 151, 4, 52, 4, + 54, 55, 64, 65, 58, 59, 60, 77, 3, 148, + 64, 65, 368, 8, 76, 4, 4, 8, 80, 81, + 82, 83, 84, 85, 368, 87, 3, 383, 4, 4, + 386, 8, 28, 29, 30, 31, 72, 73, 74, 383, + 148, 397, 386, 8, 368, 3, 8, 383, 4, 412, + 4, 407, 3, 397, 412, 4, 412, 4, 151, 383, + 412, 397, 386, 407, 4, 4, 4, 4, 412, 4, + 383, 386, 383, 397, 148, 431, 383, 4, 148, 386, + 149, 4, 383, 407, 4, 4, 148, 431, 412, 4, + 397, 4, 383, 383, 148, 151, 397, 4, 4, 383, + 441, 442, 443, 27, 4, 4, 397, 431, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 64, 65, + 4, 149, 149, 149, 4, 4, 4, 4, 52, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 4, 4, 4, 4, 4, 4, 149, 4, + 4, 4, 4, 4, 151, 4, 4, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 148, 4, 4, 4, 149, 4, 148, 4, 555, - 4, 4, 151, 559, 560, 151, 151, 530, 559, 560, - 151, 4, 149, 4, 149, 4, 572, 573, 149, 4, - 4, 555, 148, 151, 151, 4, 549, 4, 584, 151, - 4, 7, 7, 584, 7, 148, 7, 584, 572, 573, - 148, 148, 7, 5, 5, 5, 555, 148, 5, 7, - 584, 148, 5, 5, 5, 149, 148, 7, 7, 7, - 5, 8, 3, 572, 573, 148, 5, 148, 5, 148, - 118, 7, 5, 148, 148, 584, 148, 148, 148, 148, - 148, 148, 148, 584, 148, 148, 148, 148, 148, 148, - 148, 584, 148, 148, 7, 148, 584, 148, 148, 148, - 7, 584, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 7, 7, 7, 4, 7, - 7, 148, 7, 87, 4, 4, 4, 4, 4, 3, - 148, 6, 3, 6, 6, 3, 6, 3, 3, 6, - 4, 4, 4, 4, 4, 4, 148, 3, 6, 6, - 3, 151, 4, 8, 4, 4, 4, 149, 4, 4, - 4, 151, 149, 149, 4, 6, 149, 149, 149, 149, - 3, 149, 4, 8, 8, 4, 148, 8, 148, 148, - 148, 148, 148, 4, 4, 148, 5, 462, 4, 148, - 7, 4, 148, 148, 750, 753, 4, 753, 4, 750, - 756, 362, 148, 759, 762, 149, 762, 149, 759, 759, - 508, 762, 753, 769, 759, 753, 151, 149, 335, 753, - 555, 762, 756, 560, 762, 759, 782, 550, 762, 753, - 368, 750, 765, 789, 771, 416, 792, 769, 762, 778, - 755, 797, 384, 764, 753, 753, 797, 756, 782, 885, - 759, 758, 753, 762, 756, 789, 408, 761, 792, 759, - 753, 762, 791, 797, 789, 753, 413, 794, 398, 762, - 753, 584, 387, 782, 762, 792, 782, 551, 798, 762, - 789, 897, 910, 792, 573, 927, -1, -1, 797, 432, - -1, 792, -1, -1, -1, 435, 789, -1, -1, 792, - -1, -1, -1, -1, 792, -1, -1, -1, -1, 792, + 116, 4, 4, 514, 4, 4, 4, 149, 151, 4, + 543, 544, 4, 539, 4, 4, 4, 543, 544, 4, + 4, 4, 533, 4, 4, 539, 4, 4, 4, 4, + 556, 557, 148, 4, 149, 4, 4, 4, 151, 4, + 151, 4, 556, 557, 4, 539, 4, 151, 151, 4, + 149, 4, 4, 149, 148, 4, 151, 149, 4, 4, + 151, 4, 556, 557, 151, 4, 7, 7, 148, 7, + 148, 7, 7, 148, 5, 5, 5, 5, 87, 5, + 7, 148, 5, 5, 148, 148, 7, 7, 7, 5, + 148, 5, 148, 148, 5, 148, 148, 7, 5, 7, + 4, 7, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 7, 118, 7, 7, + 7, 7, 148, 7, 7, 4, 4, 4, 148, 4, + 6, 148, 148, 148, 3, 6, 3, 3, 6, 3, + 148, 6, 3, 6, 4, 4, 4, 4, 4, 4, + 3, 148, 6, 3, 6, 4, 4, 8, 4, 4, + 151, 4, 149, 149, 4, 4, 4, 3, 5, 151, + 149, 6, 4, 4, 8, 149, 149, 149, 8, 149, + 8, 3, 8, 149, 4, 149, 148, 148, 4, 148, + 4, 148, 148, 4, 148, 7, 4, 730, 148, 4, + 148, 4, 149, 461, 730, 149, 739, 733, 492, 742, + 736, 739, 149, 739, 747, 148, 742, 739, 362, 733, + 539, 747, 736, 148, 750, 739, 747, 733, 742, 335, + 148, 534, 368, 747, 151, 730, 742, 763, 544, 733, + 745, 747, 736, 769, 777, 739, 772, 750, 742, 763, + 733, 777, 733, 747, 752, 769, 733, 742, 772, 742, + 415, 742, 733, 777, 744, 742, 772, 759, 735, 763, + 747, 742, 733, 733, 733, 769, 747, 880, 772, 733, + 738, 742, 742, 777, 769, 383, 747, 736, 742, 407, + 741, 739, 769, 771, 769, 772, 772, 397, 412, 884, + 386, 772, 774, 434, 748, 557, 763, 895, 431, 911, + 778, 772, 535, 928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 885, -1, 885, - -1, -1, -1, -1, 885, -1, -1, -1, -1, -1, - -1, 897, -1, -1, 885, -1, 897, 885, -1, -1, - -1, 885, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 885, -1, 897, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 885, -1, -1, -1, - -1, -1, -1, -1, 885, -1, -1, -1, 897, -1, - -1, -1, 885, -1, -1, -1, -1, 885, -1, -1, - -1, -1, 885 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 880, -1, -1, + -1, 884, -1, -1, 880, -1, -1, -1, 884, -1, + -1, -1, 895, 884, -1, -1, 880, -1, -1, 895, + 884, -1, -1, -1, 880, -1, -1, -1, 884, -1, + -1, 895, -1, -1, -1, -1, 880, -1, -1, -1, + 884, -1, -1, -1, -1, 880, -1, 880, -1, 880, + -1, 895, -1, 880, -1, -1, -1, 884, -1, 880, + -1, -1, -1, 884, -1, -1, -1, -1, -1, 880, + 880, -1, -1, 884, -1, -1, 880 }; const unsigned short int @@ -4044,21 +4042,21 @@ namespace isc { namespace dhcp { 7, 9, 148, 149, 150, 151, 167, 168, 169, 174, 7, 183, 7, 189, 7, 203, 7, 279, 7, 360, 7, 376, 7, 312, 7, 318, 7, 342, 7, 255, - 7, 428, 7, 463, 175, 170, 184, 190, 204, 280, - 361, 377, 313, 319, 343, 256, 429, 464, 167, 176, + 7, 429, 7, 464, 175, 170, 184, 190, 204, 280, + 361, 377, 313, 319, 343, 256, 430, 465, 167, 176, 177, 148, 172, 173, 10, 123, 132, 133, 134, 148, - 182, 185, 186, 187, 455, 457, 459, 461, 11, 20, + 182, 185, 186, 187, 456, 458, 460, 462, 11, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 50, 51, 61, 64, 65, 75, 76, 88, 91, 98, 99, 102, 182, 191, 192, 193, 194, 195, 196, 197, 198, 199, 214, 216, 240, 249, 263, 273, 302, - 310, 336, 366, 368, 381, 383, 385, 407, 417, 418, - 426, 12, 13, 16, 19, 182, 201, 202, 205, 207, - 210, 213, 366, 368, 7, 47, 48, 49, 62, 66, - 67, 68, 69, 70, 71, 78, 79, 86, 182, 193, - 194, 195, 198, 281, 282, 283, 285, 287, 289, 291, - 293, 295, 297, 300, 301, 336, 354, 366, 368, 370, - 381, 383, 385, 403, 63, 182, 336, 362, 363, 364, + 310, 336, 366, 368, 381, 383, 385, 407, 418, 419, + 427, 12, 13, 16, 19, 182, 201, 202, 205, 207, + 210, 213, 366, 368, 47, 48, 49, 62, 66, 67, + 68, 69, 70, 71, 78, 79, 86, 182, 193, 194, + 195, 198, 281, 282, 283, 285, 287, 289, 291, 293, + 295, 297, 300, 301, 336, 354, 366, 368, 370, 381, + 383, 385, 403, 63, 182, 295, 336, 362, 363, 364, 366, 368, 76, 80, 81, 82, 83, 84, 85, 87, 182, 336, 366, 368, 378, 379, 380, 381, 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 310, 27, @@ -4068,70 +4066,70 @@ namespace isc { namespace dhcp { 345, 346, 347, 348, 350, 351, 352, 353, 366, 368, 89, 90, 182, 257, 258, 259, 261, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 182, 366, 368, 430, 431, 432, 433, 435, 437, - 438, 440, 441, 442, 445, 447, 448, 449, 450, 453, - 124, 465, 466, 467, 6, 3, 4, 8, 3, 188, - 462, 456, 458, 460, 4, 3, 8, 200, 4, 4, + 116, 182, 366, 368, 431, 432, 433, 434, 436, 438, + 439, 441, 442, 443, 446, 448, 449, 450, 451, 454, + 124, 466, 467, 468, 6, 3, 4, 8, 3, 188, + 463, 457, 459, 461, 4, 3, 8, 200, 4, 4, 382, 384, 386, 215, 217, 4, 4, 4, 4, 274, 311, 337, 303, 367, 369, 241, 408, 250, 264, 4, - 419, 427, 3, 8, 206, 208, 211, 4, 3, 8, - 410, 286, 288, 290, 355, 284, 292, 294, 4, 4, - 298, 296, 371, 404, 3, 8, 365, 3, 8, 402, - 390, 392, 396, 394, 400, 398, 388, 8, 3, 8, - 327, 231, 4, 331, 329, 334, 4, 8, 3, 349, - 4, 4, 8, 3, 260, 262, 3, 8, 4, 434, - 436, 4, 439, 4, 4, 443, 446, 4, 4, 4, - 451, 454, 3, 8, 468, 3, 8, 167, 167, 148, - 4, 4, 4, 4, 4, 186, 4, 151, 151, 4, - 4, 4, 4, 4, 149, 149, 149, 149, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 149, 4, - 4, 192, 4, 4, 4, 151, 202, 77, 182, 230, - 310, 336, 366, 368, 381, 383, 385, 411, 412, 413, - 414, 415, 4, 4, 4, 4, 4, 4, 4, 149, - 151, 4, 4, 4, 4, 282, 4, 363, 4, 4, - 4, 4, 4, 4, 4, 4, 380, 4, 4, 149, - 4, 4, 4, 151, 322, 4, 151, 151, 346, 4, - 4, 258, 151, 4, 4, 149, 4, 149, 149, 4, - 4, 151, 151, 151, 4, 4, 431, 4, 466, 4, - 7, 7, 167, 167, 167, 7, 148, 148, 148, 7, - 7, 5, 5, 5, 5, 169, 171, 148, 5, 5, - 5, 7, 7, 7, 5, 178, 14, 15, 209, 17, - 18, 212, 416, 8, 3, 148, 148, 148, 5, 148, - 148, 148, 72, 73, 74, 299, 148, 5, 7, 148, - 178, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 167, 148, 148, 148, 15, - 117, 444, 118, 119, 120, 121, 122, 151, 452, 148, - 5, 167, 191, 465, 201, 27, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 182, 218, 219, 220, - 223, 225, 227, 229, 230, 232, 233, 234, 235, 236, - 238, 218, 7, 275, 276, 277, 7, 314, 315, 316, - 7, 338, 339, 340, 7, 304, 305, 306, 80, 81, - 82, 83, 85, 242, 243, 244, 245, 246, 247, 248, - 295, 409, 7, 251, 252, 253, 92, 93, 94, 95, - 96, 97, 265, 266, 267, 268, 269, 270, 271, 272, - 100, 101, 182, 366, 368, 420, 421, 422, 424, 430, - 179, 4, 413, 7, 356, 357, 358, 7, 372, 373, - 374, 87, 405, 7, 469, 470, 8, 8, 8, 221, + 420, 428, 3, 8, 206, 208, 211, 4, 3, 8, + 286, 288, 290, 355, 284, 292, 294, 4, 4, 298, + 296, 371, 404, 3, 8, 365, 3, 8, 402, 390, + 392, 396, 394, 400, 398, 388, 8, 3, 8, 327, + 231, 4, 331, 329, 334, 4, 8, 3, 349, 4, + 4, 8, 3, 260, 262, 3, 8, 4, 435, 437, + 4, 440, 4, 4, 444, 447, 4, 4, 4, 452, + 455, 3, 8, 469, 3, 8, 167, 167, 148, 4, + 4, 4, 4, 4, 186, 4, 151, 151, 4, 4, + 4, 4, 4, 149, 149, 149, 149, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 149, 4, 4, + 192, 4, 4, 4, 151, 202, 4, 4, 4, 4, + 4, 4, 4, 149, 151, 4, 4, 4, 4, 282, + 4, 363, 4, 4, 4, 4, 4, 4, 4, 4, + 380, 4, 4, 149, 4, 4, 4, 151, 322, 4, + 151, 151, 346, 4, 4, 258, 151, 4, 4, 149, + 4, 149, 149, 4, 4, 151, 151, 151, 4, 4, + 432, 4, 467, 4, 7, 7, 167, 167, 167, 7, + 148, 148, 148, 7, 7, 5, 5, 5, 5, 169, + 171, 148, 5, 5, 5, 7, 7, 7, 5, 178, + 14, 15, 209, 17, 18, 212, 148, 148, 148, 5, + 148, 148, 148, 72, 73, 74, 299, 148, 5, 7, + 148, 178, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 167, 148, 148, 148, + 15, 117, 445, 118, 119, 120, 121, 122, 151, 453, + 148, 5, 167, 191, 466, 201, 27, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 182, 218, 219, + 220, 223, 225, 227, 229, 230, 232, 233, 234, 235, + 236, 238, 218, 7, 275, 276, 277, 7, 314, 315, + 316, 7, 338, 339, 340, 7, 304, 305, 306, 80, + 81, 82, 83, 85, 242, 243, 244, 245, 246, 247, + 248, 7, 409, 410, 7, 251, 252, 253, 92, 93, + 94, 95, 96, 97, 265, 266, 267, 268, 269, 270, + 271, 272, 100, 101, 182, 366, 368, 421, 422, 423, + 425, 431, 179, 7, 356, 357, 358, 7, 372, 373, + 374, 87, 405, 7, 470, 471, 8, 8, 8, 221, 224, 226, 228, 4, 4, 4, 4, 4, 237, 239, 3, 8, 8, 278, 6, 3, 317, 6, 3, 341, - 6, 3, 307, 6, 3, 3, 6, 3, 6, 254, - 6, 3, 4, 4, 4, 4, 4, 4, 3, 8, - 423, 425, 3, 8, 8, 148, 180, 181, 148, 359, - 6, 3, 375, 6, 3, 406, 8, 471, 3, 6, + 6, 3, 307, 6, 3, 3, 6, 411, 3, 6, + 254, 6, 3, 4, 4, 4, 4, 4, 4, 3, + 8, 424, 426, 3, 8, 8, 148, 180, 181, 359, + 6, 3, 375, 6, 3, 406, 8, 472, 3, 6, 4, 4, 4, 4, 149, 151, 149, 151, 149, 4, 4, 219, 281, 277, 320, 316, 344, 340, 182, 193, 194, 195, 198, 230, 273, 291, 295, 297, 308, 309, - 336, 366, 368, 381, 383, 385, 403, 306, 243, 295, - 257, 253, 149, 149, 149, 149, 149, 149, 266, 4, - 4, 421, 6, 3, 362, 358, 378, 374, 4, 125, - 127, 128, 182, 230, 366, 368, 472, 473, 474, 475, - 477, 470, 28, 29, 30, 31, 222, 148, 148, 148, - 148, 148, 8, 8, 8, 3, 8, 8, 148, 148, - 148, 8, 8, 148, 478, 4, 476, 3, 8, 309, - 4, 149, 4, 473, 5, 148, 7, 479, 480, 481, - 3, 6, 126, 129, 130, 131, 482, 483, 484, 486, - 487, 488, 480, 485, 4, 4, 4, 3, 8, 4, - 151, 149, 149, 483, 148 + 336, 366, 368, 381, 383, 385, 403, 306, 243, 77, + 182, 230, 310, 336, 366, 368, 381, 383, 385, 412, + 413, 414, 415, 416, 410, 257, 253, 149, 149, 149, + 149, 149, 149, 266, 4, 4, 422, 6, 3, 362, + 358, 378, 374, 4, 125, 127, 128, 182, 230, 366, + 368, 473, 474, 475, 476, 478, 471, 28, 29, 30, + 31, 222, 148, 148, 148, 148, 148, 8, 8, 8, + 3, 8, 417, 8, 3, 8, 148, 148, 148, 8, + 8, 148, 479, 4, 477, 3, 8, 309, 4, 414, + 4, 149, 4, 474, 148, 5, 148, 7, 480, 481, + 482, 3, 6, 126, 129, 130, 131, 483, 484, 485, + 487, 488, 489, 481, 486, 4, 4, 4, 3, 8, + 4, 151, 149, 149, 484, 148 }; const unsigned short int @@ -4175,27 +4173,27 @@ namespace isc { namespace dhcp { 343, 342, 344, 344, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, 346, 347, 349, 348, 350, 351, 352, 353, 355, 354, 356, 356, 357, 357, 359, 358, - 361, 360, 362, 362, 363, 363, 363, 363, 363, 365, - 364, 367, 366, 369, 368, 371, 370, 372, 372, 373, - 373, 375, 374, 377, 376, 378, 378, 379, 379, 380, + 361, 360, 362, 362, 363, 363, 363, 363, 363, 363, + 365, 364, 367, 366, 369, 368, 371, 370, 372, 372, + 373, 373, 375, 374, 377, 376, 378, 378, 379, 379, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 380, 380, 380, 382, 381, 384, 383, 386, 385, - 388, 387, 390, 389, 392, 391, 394, 393, 396, 395, - 398, 397, 400, 399, 402, 401, 404, 403, 406, 405, - 408, 407, 409, 409, 410, 295, 411, 411, 412, 412, - 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, - 414, 416, 415, 417, 419, 418, 420, 420, 421, 421, - 421, 421, 421, 423, 422, 425, 424, 427, 426, 429, - 428, 430, 430, 431, 431, 431, 431, 431, 431, 431, - 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, - 432, 434, 433, 436, 435, 437, 439, 438, 440, 441, - 443, 442, 444, 444, 446, 445, 447, 448, 449, 451, - 450, 452, 452, 452, 452, 452, 454, 453, 456, 455, - 458, 457, 460, 459, 462, 461, 464, 463, 465, 465, - 466, 468, 467, 469, 469, 471, 470, 472, 472, 473, - 473, 473, 473, 473, 473, 473, 474, 476, 475, 478, - 477, 479, 479, 481, 480, 482, 482, 483, 483, 483, - 483, 485, 484, 486, 487, 488 + 380, 380, 380, 380, 380, 382, 381, 384, 383, 386, + 385, 388, 387, 390, 389, 392, 391, 394, 393, 396, + 395, 398, 397, 400, 399, 402, 401, 404, 403, 406, + 405, 408, 407, 409, 409, 411, 410, 412, 412, 413, + 413, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 415, 417, 416, 418, 420, 419, 421, 421, 422, + 422, 422, 422, 422, 424, 423, 426, 425, 428, 427, + 430, 429, 431, 431, 432, 432, 432, 432, 432, 432, + 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, + 432, 433, 435, 434, 437, 436, 438, 440, 439, 441, + 442, 444, 443, 445, 445, 447, 446, 448, 449, 450, + 452, 451, 453, 453, 453, 453, 453, 455, 454, 457, + 456, 459, 458, 461, 460, 463, 462, 465, 464, 466, + 466, 467, 469, 468, 470, 470, 472, 471, 473, 473, + 474, 474, 474, 474, 474, 474, 474, 475, 477, 476, + 479, 478, 480, 480, 482, 481, 483, 483, 484, 484, + 484, 484, 486, 485, 487, 488, 489 }; const unsigned char @@ -4239,27 +4237,27 @@ namespace isc { namespace dhcp { 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 0, - 4, 0, 4, 0, 4, 0, 6, 0, 1, 1, - 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, + 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 0, 4, 0, 4, 0, 4, 0, 6, 0, 1, + 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 4, 0, 6, 0, 4, - 0, 6, 1, 3, 0, 4, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, + 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 4, 3, 0, 6, 1, 3, 1, + 1, 1, 1, 1, 0, 4, 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, 0, 4, 3, 0, 6, 1, 3, 1, 1, - 1, 1, 1, 0, 4, 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, - 3, 0, 4, 0, 4, 3, 0, 4, 3, 3, - 0, 4, 1, 1, 0, 4, 3, 3, 3, 0, - 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, - 1, 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, 0, 4, 3, 3, 3 + 1, 3, 0, 4, 0, 4, 3, 0, 4, 3, + 3, 0, 4, 1, 1, 0, 4, 3, 3, 3, + 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 6, 0, 4, 1, + 3, 1, 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, 0, 4, 3, 3, 3 }; @@ -4372,10 +4370,11 @@ namespace isc { namespace dhcp { "hw_address", "$@80", "client_id_value", "$@81", "circuit_id_value", "$@82", "flex_id_value", "$@83", "hostname", "$@84", "reservation_client_classes", "$@85", "relay", "$@86", "relay_map", - "$@87", "client_classes", "$@88", "client_classes_list", "$@89", - "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@90", - "dhcp4o6_port", "control_socket", "$@91", "control_socket_params", + "$@87", "client_classes", "$@88", "client_classes_list", + "client_class_entry", "$@89", "client_class_params", + "not_empty_client_class_params", "client_class_param", + "client_class_name", "client_class_test", "$@90", "dhcp4o6_port", + "control_socket", "$@91", "control_socket_params", "control_socket_param", "control_socket_type", "$@92", "control_socket_name", "$@93", "dhcp_ddns", "$@94", "sub_dhcp_ddns", "$@95", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", @@ -4436,27 +4435,27 @@ namespace isc { namespace dhcp { 1239, 1239, 1251, 1252, 1257, 1258, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1274, 1276, 1276, 1284, 1286, 1288, 1293, 1301, 1301, 1313, 1314, 1317, 1318, 1321, 1321, - 1331, 1331, 1341, 1342, 1345, 1346, 1347, 1348, 1349, 1352, - 1352, 1360, 1360, 1385, 1385, 1415, 1415, 1425, 1426, 1429, - 1430, 1433, 1433, 1442, 1442, 1451, 1452, 1455, 1456, 1460, + 1331, 1331, 1341, 1342, 1345, 1346, 1347, 1348, 1349, 1350, + 1353, 1353, 1361, 1361, 1386, 1386, 1416, 1416, 1426, 1427, + 1430, 1431, 1434, 1434, 1443, 1443, 1452, 1453, 1456, 1457, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, - 1471, 1472, 1473, 1474, 1477, 1477, 1485, 1485, 1493, 1493, - 1501, 1501, 1509, 1509, 1517, 1517, 1525, 1525, 1533, 1533, - 1541, 1541, 1549, 1549, 1557, 1557, 1570, 1570, 1580, 1580, - 1591, 1591, 1601, 1602, 1605, 1605, 1615, 1616, 1619, 1620, - 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, - 1635, 1637, 1637, 1649, 1656, 1656, 1666, 1667, 1670, 1671, - 1672, 1673, 1674, 1677, 1677, 1685, 1685, 1695, 1695, 1707, - 1707, 1717, 1718, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1471, 1472, 1473, 1474, 1475, 1478, 1478, 1486, 1486, 1494, + 1494, 1502, 1502, 1510, 1510, 1518, 1518, 1526, 1526, 1534, + 1534, 1542, 1542, 1550, 1550, 1558, 1558, 1571, 1571, 1581, + 1581, 1592, 1592, 1602, 1603, 1606, 1606, 1616, 1617, 1620, + 1621, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, + 1633, 1636, 1638, 1638, 1650, 1657, 1657, 1667, 1668, 1671, + 1672, 1673, 1674, 1675, 1678, 1678, 1686, 1686, 1696, 1696, + 1708, 1708, 1718, 1719, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, - 1740, 1745, 1745, 1753, 1753, 1761, 1766, 1766, 1774, 1779, - 1784, 1784, 1792, 1793, 1796, 1796, 1804, 1809, 1814, 1819, - 1819, 1827, 1830, 1833, 1836, 1839, 1845, 1845, 1855, 1855, - 1862, 1862, 1869, 1869, 1881, 1881, 1891, 1891, 1902, 1903, - 1907, 1911, 1911, 1923, 1924, 1928, 1928, 1936, 1937, 1940, - 1941, 1942, 1943, 1944, 1945, 1946, 1949, 1954, 1954, 1962, - 1962, 1972, 1973, 1976, 1976, 1984, 1985, 1988, 1989, 1990, - 1991, 1994, 1994, 2002, 2007, 2012 + 1738, 1741, 1746, 1746, 1754, 1754, 1762, 1767, 1767, 1775, + 1780, 1785, 1785, 1793, 1794, 1797, 1797, 1805, 1810, 1815, + 1820, 1820, 1828, 1831, 1834, 1837, 1840, 1846, 1846, 1856, + 1856, 1863, 1863, 1870, 1870, 1882, 1882, 1892, 1892, 1903, + 1904, 1908, 1912, 1912, 1924, 1925, 1929, 1929, 1937, 1938, + 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1950, 1955, 1955, + 1963, 1963, 1973, 1974, 1977, 1977, 1985, 1986, 1989, 1990, + 1991, 1992, 1995, 1995, 2003, 2008, 2013 }; // Print the state stack on the debug stream. @@ -4491,8 +4490,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4495 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 2017 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4494 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 2018 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index 54ed2dbf8d..456b8b3b1d 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -1416,8 +1416,8 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 892, ///< Last index in yytable_. - yynnts_ = 337, ///< Number of nonterminal symbols. + yylast_ = 886, ///< Last index in yytable_. + yynnts_ = 338, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, @@ -1519,8 +1519,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (other.value); break; @@ -1563,8 +1563,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.copy< ElementPtr > (v); break; @@ -1666,8 +1666,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.template destroy< ElementPtr > (); break; @@ -1716,8 +1716,8 @@ namespace isc { namespace dhcp { case 212: // outbound_interface_value case 222: // db_type case 299: // hr_mode - case 444: // ncr_protocol_value - case 452: // replace_client_name_value + case 445: // ncr_protocol_value + case 453: // replace_client_name_value value.move< ElementPtr > (s.value); break; diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 6d4c574992..9c5f94262a 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1344,6 +1344,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list + | client_class | user_context | comment | unknown_map_entry @@ -1598,11 +1599,11 @@ client_classes: CLIENT_CLASSES { ctx.leave(); }; -client_classes_list: client_class - | client_classes_list COMMA client_class +client_classes_list: client_class_entry + | client_classes_list COMMA client_class_entry ; -client_class: LCURLY_BRACKET { +client_class_entry: LCURLY_BRACKET { ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 65f2c5fc48..5920ce03e6 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index ba1db21308..15f123a94b 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index 6d87f1547c..83b9db2632 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index 0653b5c7e1..da4b250be7 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -4100,6 +4100,7 @@ TEST_F(Dhcp4ParserTest, classifySubnets) { ConstElementPtr json; ASSERT_NO_THROW(json = parseDHCP4(config)); + extractConfig(config); EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json)); checkResult(x, 0); @@ -4157,6 +4158,95 @@ TEST_F(Dhcp4ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } +// Goal of this test is to verify that multiple pools can be configured +// with defined client classes. +TEST_F(Dhcp4ParserTest, classifyPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"pool\": \"192.0.3.101 - 192.0.3.150\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"pool\": \"192.0.4.101 - 192.0.4.150\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"pool\": \"192.0.5.101 - 192.0.5.150\" " + " } ]," + " \"subnet\": \"192.0.0.0/16\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json)); + checkResult(x, 0); + + const Subnet4Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_V4); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pools[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE(pools.at(3)->clientSupported(classes)); +} + // This test verifies that the host reservations can be specified for // respective IPv4 subnets. TEST_F(Dhcp4ParserTest, reservations) { diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index bd9238f7fc..25b540c1ff 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -2322,6 +2322,75 @@ TEST_F(Dhcpv4SrvTest, clientClassify) { EXPECT_FALSE(drop); } +// Checks if the client-class field is indeed used for pool selection. +TEST_F(Dhcpv4SrvTest, clientPoolClassify) { + IfaceMgrTestConfig test_config(true); + IfaceMgr::instance().openSockets4(); + + NakedDhcpv4Srv srv(0); + + // This test configures 2 pools. + // The second pool does not play any role here. The client's + // IP address belongs to the first pool, so only that first + // pool is being tested. + string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ " + "{ \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"client-class\": \"foo\" }, " + " { \"pool\": \"192.0.3.1 - 192.0.3.100\", " + " \"client-class\": \"xyzzy\" } ], " + " \"subnet\": \"192.0.0.0/16\" } " + "]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp4Server(srv, json)); + + CfgMgr::instance().commit(); + + // check if returned status is OK + ASSERT_TRUE(status); + comment_ = config::parseAnswer(rcode_, status); + ASSERT_EQ(0, rcode_); + + // Create a simple packet that we'll use for classification + Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234)); + dis->setRemoteAddr(IOAddress("192.0.2.1")); + dis->setCiaddr(IOAddress("192.0.2.1")); + dis->setIface("eth0"); + OptionPtr clientid = generateClientId(); + dis->addOption(clientid); + + // This discover does not belong to foo class, so it will not + // be serviced + Pkt4Ptr offer = srv.processDiscover(dis); + EXPECT_FALSE(offer); + + // Let's add the packet to bar class and try again. + dis->addClass("bar"); + + // Still not supported, because it belongs to wrong class. + offer = srv.processDiscover(dis); + EXPECT_FALSE(offer); + + // Let's add it to matching class. + dis->addClass("foo"); + + // This time it should work + offer = srv.processDiscover(dis); + ASSERT_TRUE(offer); + EXPECT_EQ(DHCPOFFER, offer->getType()); + EXPECT_FALSE(offer->getYiaddr().isV4Zero()); +} + // Verifies last resort option 43 is backward compatible TEST_F(Dhcpv4SrvTest, option43LastResort) { IfaceMgrTestConfig test_config(true); diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 1f6833d25f..d06bd40017 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -1196,6 +1196,85 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet4\": [\n" " {\n" +" \"client-class\": \"alpha\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.2.0/24\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.3.101 - 192.0.3.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.3.0/24\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.4.101 - 192.0.4.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.4.0/24\"\n" +" },\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"pool\": \"192.0.5.101 - 192.0.5.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.5.0/24\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet4\": [\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"pool\": \"192.0.2.1 - 192.0.2.100\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"pool\": \"192.0.3.101 - 192.0.3.150\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"pool\": \"192.0.4.101 - 192.0.4.150\"\n" +" },\n" +" {\n" +" \"pool\": \"192.0.5.101 - 192.0.5.150\"\n" +" }\n" +" ],\n" +" \"subnet\": \"192.0.0.0/16\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet4\": [\n" +" {\n" " \"id\": 123,\n" " \"pools\": [\n" " {\n" @@ -1285,7 +1364,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1327,7 +1406,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"rebind-timer\": 2000,\n" " \"renew-timer\": 1000,\n" @@ -1369,25 +1448,25 @@ const char* EXTRACTED_CONFIGS[] = { " }\n" " ],\n" " \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 47 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 48 +"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1395,7 +1474,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 49 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1411,7 +1490,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet4\": [ ]\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 50 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1431,7 +1510,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1452,7 +1531,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1473,7 +1552,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 53 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1495,7 +1574,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 54 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1516,7 +1595,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 53 + // CONFIGURATION 55 "{\n" " \"client-classes\": [\n" " {\n" @@ -1547,7 +1626,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 54 + // CONFIGURATION 56 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1567,7 +1646,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 55 + // CONFIGURATION 57 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1588,7 +1667,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 56 + // CONFIGURATION 58 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1613,7 +1692,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 57 + // CONFIGURATION 59 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1638,7 +1717,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 58 + // CONFIGURATION 60 "{\n" " \"comment\": \"A DHCPv4 server\",\n" " \"client-classes\": [\n" @@ -5031,6 +5110,242 @@ const char* UNPARSED_CONFIGS[] = { " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"\",\n" " \"boot-file-name\": \"\",\n" +" \"client-class\": \"alpha\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"client-class\": \"beta\",\n" +" \"id\": 2,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.3.101-192.0.3.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.3.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"client-class\": \"gamma\",\n" +" \"id\": 3,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.4.101-192.0.4.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.4.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" },\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 4,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.5.101-192.0.5.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.5.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.3.101-192.0.3.150\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.4.101-192.0.4.150\"\n" +" },\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.5.101-192.0.5.150\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.0.0/16\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" " \"id\": 123,\n" " \"match-client-id\": true,\n" " \"next-server\": \"0.0.0.0\",\n" @@ -5209,7 +5524,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5309,7 +5624,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5456,96 +5771,10 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [ ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 46 "{\n" -" \"decline-probation-period\": 12345,\n" +" \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5608,12 +5837,12 @@ const char* UNPARSED_CONFIGS[] = { " \"dhcp4o6-port\": 0,\n" " \"echo-client-id\": true,\n" " \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 35,\n" -" \"hold-reclaimed-time\": 1800,\n" -" \"max-reclaim-leases\": 50,\n" -" \"max-reclaim-time\": 100,\n" -" \"reclaim-timer-wait-time\": 20,\n" -" \"unwarned-reclaim-cycles\": 10\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" " },\n" " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" @@ -5631,7 +5860,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 48 "{\n" -" \"decline-probation-period\": 86400,\n" +" \"decline-probation-period\": 12345,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5670,34 +5899,7 @@ const char* UNPARSED_CONFIGS[] = { " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" " \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.1-192.0.2.100\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 49 "{\n" @@ -5721,12 +5923,12 @@ const char* UNPARSED_CONFIGS[] = { " \"dhcp4o6-port\": 0,\n" " \"echo-client-id\": true,\n" " \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" +" \"flush-reclaimed-timer-wait-time\": 35,\n" +" \"hold-reclaimed-time\": 1800,\n" +" \"max-reclaim-leases\": 50,\n" +" \"max-reclaim-time\": 100,\n" +" \"reclaim-timer-wait-time\": 20,\n" +" \"unwarned-reclaim-cycles\": 10\n" " },\n" " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" @@ -5740,34 +5942,7 @@ const char* UNPARSED_CONFIGS[] = { " \"option-data\": [ ],\n" " \"option-def\": [ ],\n" " \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"2001:db8::123/45\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.1-192.0.2.100\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" +" \"subnet4\": [ ]\n" " }\n", // CONFIGURATION 50 "{\n" @@ -5812,7 +5987,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet4\": [\n" " {\n" -" \"4o6-interface\": \"ethX\",\n" +" \"4o6-interface\": \"\",\n" " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"\",\n" " \"boot-file-name\": \"\",\n" @@ -5882,6 +6057,146 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet4\": [\n" " {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"2001:db8::123/45\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 52 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"ethX\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.1-192.0.2.100\"\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 53 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" " \"4o6-interface\": \"ethX\",\n" " \"4o6-interface-id\": \"\",\n" " \"4o6-subnet\": \"2001:db8::543/21\",\n" @@ -5909,7 +6224,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 52 + // CONFIGURATION 54 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5979,7 +6294,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 53 + // CONFIGURATION 55 "{\n" " \"client-classes\": [\n" " {\n" @@ -6074,147 +6389,6 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 54 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.0/28\"\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 55 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"echo-client-id\": true,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"shared-networks\": [ ],\n" -" \"subnet4\": [\n" -" {\n" -" \"4o6-interface\": \"\",\n" -" \"4o6-interface-id\": \"\",\n" -" \"4o6-subnet\": \"\",\n" -" \"boot-file-name\": \"\",\n" -" \"id\": 1,\n" -" \"match-client-id\": true,\n" -" \"next-server\": \"0.0.0.0\",\n" -" \"option-data\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.0/28\",\n" -" \"user-context\": { }\n" -" }\n" -" ],\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"0.0.0.0\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"server-hostname\": \"\",\n" -" \"subnet\": \"192.0.2.0/24\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" " }\n", // CONFIGURATION 56 "{\n" @@ -6270,12 +6444,7 @@ const char* UNPARSED_CONFIGS[] = { " \"pools\": [\n" " {\n" " \"option-data\": [ ],\n" -" \"pool\": \"192.0.2.0/28\",\n" -" \"user-context\": {\n" -" \"bool-param\": true,\n" -" \"integer-param\": 42,\n" -" \"string-param\": \"Sagittarius\"\n" -" }\n" +" \"pool\": \"192.0.2.0/28\"\n" " }\n" " ],\n" " \"rebind-timer\": 2000,\n" @@ -6346,6 +6515,77 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.0/28\",\n" +" \"user-context\": { }\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 58 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.0/28\",\n" " \"user-context\": {\n" " \"bool-param\": true,\n" " \"integer-param\": 42,\n" @@ -6366,7 +6606,82 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 58 + // CONFIGURATION 59 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [\n" +" {\n" +" \"4o6-interface\": \"\",\n" +" \"4o6-interface-id\": \"\",\n" +" \"4o6-subnet\": \"\",\n" +" \"boot-file-name\": \"\",\n" +" \"id\": 1,\n" +" \"match-client-id\": true,\n" +" \"next-server\": \"0.0.0.0\",\n" +" \"option-data\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"192.0.2.0/28\",\n" +" \"user-context\": {\n" +" \"bool-param\": true,\n" +" \"integer-param\": 42,\n" +" \"string-param\": \"Sagittarius\"\n" +" }\n" +" }\n" +" ],\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"0.0.0.0\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"server-hostname\": \"\",\n" +" \"subnet\": \"192.0.2.0/24\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 60 "{\n" " \"comment\": \"A DHCPv4 server\",\n" " \"client-classes\": [\n" diff --git a/src/bin/dhcp4/tests/shared_network_unittest.cc b/src/bin/dhcp4/tests/shared_network_unittest.cc index c5c47007da..64240ec6f5 100644 --- a/src/bin/dhcp4/tests/shared_network_unittest.cc +++ b/src/bin/dhcp4/tests/shared_network_unittest.cc @@ -700,7 +700,7 @@ const char* NETWORKS_CONFIG[] = { // Configuration #13. // - 2 classes -// - 2 shared networks, each with 1 subnet and client class restricton +// - 2 shared networks, each with 1 subnet and client class restriction "{" " \"interfaces-config\": {" " \"interfaces\": [ \"*\" ]" @@ -861,6 +861,158 @@ const char* NETWORKS_CONFIG[] = { " ]" " }" " ]" + "}", + +// Configuration #16 +// - 1 shared network with 1 subnet and 2 pools (first pool has class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #17 +// - 1 shared network with 1 subnet and 2 pools (each with class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #18 +// - plain subnet and 2 pools (first pool has class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #19 +// - plain subnet and 2 pools (each with class restriction) + "{" + " \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + " }," + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[93].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[93].hex == 0x0002\"" + " }" + " ]," + " \"valid-lifetime\": 600," + " \"subnet4\": [" + " {" + " \"subnet\": \"192.0.2.0/24\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"192.0.2.1 - 192.0.2.63\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"192.0.2.100 - 192.0.2.100\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" "}" }; @@ -1813,4 +1965,123 @@ TEST_F(Dhcpv4SharedNetworkTest, customServerIdentifier) { EXPECT_EQ("2.3.4.5", client2.config_.serverid_.toText()); } +// Access to a pool within shared network is restricted by client +// classification. +TEST_F(Dhcpv4SharedNetworkTest, poolInSharedNetworkSelectedByClass) { + // Create client #1 + Dhcp4Client client1(Dhcp4Client::SELECTING); + client1.setIfaceName("eth1"); + + // Configure the server with one shared network including one subnet and + // in 2 pools in it. The access to one of the pools is restricted + // by client classification. + configure(NETWORKS_CONFIG[16], *client1.getServer()); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.100", "192.0.2.63"); + }); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option93 which would cause the client to be classified as "a-devices". + OptionPtr option93(new OptionUint16(Option::V4, 93, 0x0001)); + client1.addExtraOption(option93); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.63", "192.0.2.63"); + }); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp4Client client2(client1.getServer(), Dhcp4Client::SELECTING); + client2.setIfaceName("eth1"); + testAssigned([this, &client2] { + doDORA(client2, "192.0.2.100"); + }); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + configure(NETWORKS_CONFIG[17], *client1.getServer()); + + // The client should be refused to renew the lease because it doesn't belong + // to "b-devices" class. + client2.setState(Dhcp4Client::RENEWING); + testAssigned([this, &client2] { + doRequest(client2, ""); + }); + + // If we add option93 with a value matching this class, the lease should + // get renewed. + OptionPtr option93_bis(new OptionUint16(Option::V4, 93, 0x0002)); + client2.addExtraOption(option93_bis); + + testAssigned([this, &client2] { + doRequest(client2, "192.0.2.100"); + }); +} + +// Access to a pool within plain subnet is restricted by client classification. +TEST_F(Dhcpv4SharedNetworkTest, poolInSubnetSelectedByClass) { + // Create client #1 + Dhcp4Client client1(Dhcp4Client::SELECTING); + client1.setIfaceName("eth1"); + + // Configure the server with one plain subnet including two pools. + // The access to one of the pools is restricted by client classification. + configure(NETWORKS_CONFIG[18], *client1.getServer()); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.100", "192.0.2.63"); + }); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option93 which would cause the client to be classified as "a-devices". + OptionPtr option93(new OptionUint16(Option::V4, 93, 0x0001)); + client1.addExtraOption(option93); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + doDORA(client1, "192.0.2.63", "192.0.2.63"); + }); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp4Client client2(client1.getServer(), Dhcp4Client::SELECTING); + client2.setIfaceName("eth1"); + testAssigned([this, &client2] { + doDORA(client2, "192.0.2.100"); + }); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + configure(NETWORKS_CONFIG[19], *client1.getServer()); + + // The client should be refused to renew the lease because it doesn't belong + // to "b-devices" class. + client2.setState(Dhcp4Client::RENEWING); + testAssigned([this, &client2] { + doRequest(client2, ""); + }); + + // If we add option93 with a value matching this class, the lease should + // get renewed. + OptionPtr option93_bis(new OptionUint16(Option::V4, 93, 0x0002)); + client2.addExtraOption(option93_bis); + + testAssigned([this, &client2] { + doRequest(client2, "192.0.2.100"); + }); +} } // end of anonymous namespace diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index ed7908e21b..4b86a5428d 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -1581,13 +1581,13 @@ static const flex_int16_t yy_rule_linenum[162] = 885, 894, 904, 914, 923, 932, 941, 950, 960, 969, 978, 987, 996, 1005, 1014, 1023, 1032, 1041, 1051, 1060, - 1069, 1079, 1090, 1100, 1109, 1118, 1127, 1138, 1148, 1157, - 1167, 1177, 1186, 1195, 1204, 1213, 1223, 1232, 1242, 1251, - 1260, 1269, 1278, 1287, 1296, 1305, 1314, 1323, 1332, 1341, - 1350, 1359, 1368, 1377, 1386, 1395, 1404, 1413, 1422, 1431, - 1440, 1449, 1458, 1468, 1567, 1572, 1577, 1582, 1583, 1584, - 1585, 1586, 1587, 1589, 1607, 1620, 1625, 1629, 1631, 1633, - 1635 + 1069, 1079, 1092, 1102, 1111, 1120, 1129, 1140, 1150, 1159, + 1169, 1179, 1188, 1197, 1206, 1215, 1225, 1234, 1244, 1253, + 1262, 1271, 1280, 1289, 1298, 1307, 1316, 1325, 1334, 1343, + 1352, 1361, 1370, 1379, 1388, 1397, 1406, 1415, 1424, 1433, + 1442, 1451, 1460, 1470, 1569, 1574, 1579, 1584, 1585, 1586, + 1587, 1588, 1589, 1591, 1609, 1622, 1627, 1631, 1633, 1635, + 1637 } ; /* The intent behind this definition is that it'll catch @@ -2718,7 +2718,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_); @@ -2732,7 +2732,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_); @@ -2746,7 +2746,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_); @@ -2760,7 +2760,7 @@ YY_RULE_SETUP switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_); @@ -2785,7 +2785,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_); @@ -2797,7 +2797,7 @@ YY_RULE_SETUP #line 672 "dhcp6_lexer.ll" { switch (driver.ctx_) { - case Parser6Context::DHCP6: + case isc::dhcp::Parser6Context::DHCP6: return Dhcp6Parser::make_SHARED_NETWORKS(driver.loc_); default: return Dhcp6Parser::make_STRING("shared-networks", driver.loc_); @@ -2828,7 +2828,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_); @@ -2847,7 +2847,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_); @@ -3042,7 +3042,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_); @@ -3055,7 +3055,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_); @@ -3080,7 +3080,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_); @@ -3093,7 +3093,7 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_); @@ -3324,8 +3324,10 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("client-class", driver.loc_); @@ -3334,7 +3336,7 @@ YY_RULE_SETUP YY_BREAK case 103: YY_RULE_SETUP -#line 1090 "dhcp6_lexer.ll" +#line 1092 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3347,7 +3349,7 @@ YY_RULE_SETUP YY_BREAK case 104: YY_RULE_SETUP -#line 1100 "dhcp6_lexer.ll" +#line 1102 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3359,7 +3361,7 @@ YY_RULE_SETUP YY_BREAK case 105: YY_RULE_SETUP -#line 1109 "dhcp6_lexer.ll" +#line 1111 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3371,7 +3373,7 @@ YY_RULE_SETUP YY_BREAK case 106: YY_RULE_SETUP -#line 1118 "dhcp6_lexer.ll" +#line 1120 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3383,7 +3385,7 @@ YY_RULE_SETUP YY_BREAK case 107: YY_RULE_SETUP -#line 1127 "dhcp6_lexer.ll" +#line 1129 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3397,7 +3399,7 @@ YY_RULE_SETUP YY_BREAK case 108: YY_RULE_SETUP -#line 1138 "dhcp6_lexer.ll" +#line 1140 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3410,7 +3412,7 @@ YY_RULE_SETUP YY_BREAK case 109: YY_RULE_SETUP -#line 1148 "dhcp6_lexer.ll" +#line 1150 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3422,7 +3424,7 @@ YY_RULE_SETUP YY_BREAK case 110: YY_RULE_SETUP -#line 1157 "dhcp6_lexer.ll" +#line 1159 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3435,7 +3437,7 @@ YY_RULE_SETUP YY_BREAK case 111: YY_RULE_SETUP -#line 1167 "dhcp6_lexer.ll" +#line 1169 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3448,7 +3450,7 @@ YY_RULE_SETUP YY_BREAK case 112: YY_RULE_SETUP -#line 1177 "dhcp6_lexer.ll" +#line 1179 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3460,7 +3462,7 @@ YY_RULE_SETUP YY_BREAK case 113: YY_RULE_SETUP -#line 1186 "dhcp6_lexer.ll" +#line 1188 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3472,7 +3474,7 @@ YY_RULE_SETUP YY_BREAK case 114: YY_RULE_SETUP -#line 1195 "dhcp6_lexer.ll" +#line 1197 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3484,7 +3486,7 @@ YY_RULE_SETUP YY_BREAK case 115: YY_RULE_SETUP -#line 1204 "dhcp6_lexer.ll" +#line 1206 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3496,11 +3498,11 @@ YY_RULE_SETUP YY_BREAK case 116: YY_RULE_SETUP -#line 1213 "dhcp6_lexer.ll" +#line 1215 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_); @@ -3509,11 +3511,11 @@ YY_RULE_SETUP YY_BREAK case 117: YY_RULE_SETUP -#line 1223 "dhcp6_lexer.ll" +#line 1225 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: - return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("ip-address", driver.loc_); } @@ -3521,7 +3523,7 @@ YY_RULE_SETUP YY_BREAK case 118: YY_RULE_SETUP -#line 1232 "dhcp6_lexer.ll" +#line 1234 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3533,7 +3535,7 @@ YY_RULE_SETUP YY_BREAK case 119: YY_RULE_SETUP -#line 1242 "dhcp6_lexer.ll" +#line 1244 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3545,7 +3547,7 @@ YY_RULE_SETUP YY_BREAK case 120: YY_RULE_SETUP -#line 1251 "dhcp6_lexer.ll" +#line 1253 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3557,7 +3559,7 @@ YY_RULE_SETUP YY_BREAK case 121: YY_RULE_SETUP -#line 1260 "dhcp6_lexer.ll" +#line 1262 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3569,7 +3571,7 @@ YY_RULE_SETUP YY_BREAK case 122: YY_RULE_SETUP -#line 1269 "dhcp6_lexer.ll" +#line 1271 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3581,7 +3583,7 @@ YY_RULE_SETUP YY_BREAK case 123: YY_RULE_SETUP -#line 1278 "dhcp6_lexer.ll" +#line 1280 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3593,7 +3595,7 @@ YY_RULE_SETUP YY_BREAK case 124: YY_RULE_SETUP -#line 1287 "dhcp6_lexer.ll" +#line 1289 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3605,7 +3607,7 @@ YY_RULE_SETUP YY_BREAK case 125: YY_RULE_SETUP -#line 1296 "dhcp6_lexer.ll" +#line 1298 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3617,7 +3619,7 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1305 "dhcp6_lexer.ll" +#line 1307 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3629,7 +3631,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1314 "dhcp6_lexer.ll" +#line 1316 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3641,7 +3643,7 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1323 "dhcp6_lexer.ll" +#line 1325 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3653,7 +3655,7 @@ YY_RULE_SETUP YY_BREAK case 129: YY_RULE_SETUP -#line 1332 "dhcp6_lexer.ll" +#line 1334 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3665,7 +3667,7 @@ YY_RULE_SETUP YY_BREAK case 130: YY_RULE_SETUP -#line 1341 "dhcp6_lexer.ll" +#line 1343 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3677,7 +3679,7 @@ YY_RULE_SETUP YY_BREAK case 131: YY_RULE_SETUP -#line 1350 "dhcp6_lexer.ll" +#line 1352 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3689,7 +3691,7 @@ YY_RULE_SETUP YY_BREAK case 132: YY_RULE_SETUP -#line 1359 "dhcp6_lexer.ll" +#line 1361 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3701,7 +3703,7 @@ YY_RULE_SETUP YY_BREAK case 133: YY_RULE_SETUP -#line 1368 "dhcp6_lexer.ll" +#line 1370 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3713,7 +3715,7 @@ YY_RULE_SETUP YY_BREAK case 134: YY_RULE_SETUP -#line 1377 "dhcp6_lexer.ll" +#line 1379 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3725,7 +3727,7 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1386 "dhcp6_lexer.ll" +#line 1388 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3737,7 +3739,7 @@ YY_RULE_SETUP YY_BREAK case 136: YY_RULE_SETUP -#line 1395 "dhcp6_lexer.ll" +#line 1397 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3749,7 +3751,7 @@ YY_RULE_SETUP YY_BREAK case 137: YY_RULE_SETUP -#line 1404 "dhcp6_lexer.ll" +#line 1406 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3761,7 +3763,7 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1413 "dhcp6_lexer.ll" +#line 1415 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3773,7 +3775,7 @@ YY_RULE_SETUP YY_BREAK case 139: YY_RULE_SETUP -#line 1422 "dhcp6_lexer.ll" +#line 1424 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3785,7 +3787,7 @@ YY_RULE_SETUP YY_BREAK case 140: YY_RULE_SETUP -#line 1431 "dhcp6_lexer.ll" +#line 1433 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3797,7 +3799,7 @@ YY_RULE_SETUP YY_BREAK case 141: YY_RULE_SETUP -#line 1440 "dhcp6_lexer.ll" +#line 1442 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3809,7 +3811,7 @@ YY_RULE_SETUP YY_BREAK case 142: YY_RULE_SETUP -#line 1449 "dhcp6_lexer.ll" +#line 1451 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3821,7 +3823,7 @@ YY_RULE_SETUP YY_BREAK case 143: YY_RULE_SETUP -#line 1458 "dhcp6_lexer.ll" +#line 1460 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3833,7 +3835,7 @@ YY_RULE_SETUP YY_BREAK case 144: YY_RULE_SETUP -#line 1468 "dhcp6_lexer.ll" +#line 1470 "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. @@ -3936,7 +3938,7 @@ YY_RULE_SETUP case 145: /* rule 145 can match eol */ YY_RULE_SETUP -#line 1567 "dhcp6_lexer.ll" +#line 1569 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); @@ -3945,7 +3947,7 @@ YY_RULE_SETUP case 146: /* rule 146 can match eol */ YY_RULE_SETUP -#line 1572 "dhcp6_lexer.ll" +#line 1574 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); @@ -3953,7 +3955,7 @@ YY_RULE_SETUP YY_BREAK case 147: YY_RULE_SETUP -#line 1577 "dhcp6_lexer.ll" +#line 1579 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); @@ -3961,37 +3963,37 @@ YY_RULE_SETUP YY_BREAK case 148: YY_RULE_SETUP -#line 1582 "dhcp6_lexer.ll" +#line 1584 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1583 "dhcp6_lexer.ll" +#line 1585 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1584 "dhcp6_lexer.ll" +#line 1586 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1585 "dhcp6_lexer.ll" +#line 1587 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1586 "dhcp6_lexer.ll" +#line 1588 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1587 "dhcp6_lexer.ll" +#line 1589 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1589 "dhcp6_lexer.ll" +#line 1591 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4012,7 +4014,7 @@ YY_RULE_SETUP YY_BREAK case 155: YY_RULE_SETUP -#line 1607 "dhcp6_lexer.ll" +#line 1609 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4028,7 +4030,7 @@ YY_RULE_SETUP YY_BREAK case 156: YY_RULE_SETUP -#line 1620 "dhcp6_lexer.ll" +#line 1622 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); @@ -4036,33 +4038,33 @@ YY_RULE_SETUP YY_BREAK case 157: YY_RULE_SETUP -#line 1625 "dhcp6_lexer.ll" +#line 1627 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK case 158: YY_RULE_SETUP -#line 1629 "dhcp6_lexer.ll" +#line 1631 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 159: YY_RULE_SETUP -#line 1631 "dhcp6_lexer.ll" +#line 1633 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1633 "dhcp6_lexer.ll" +#line 1635 "dhcp6_lexer.ll" driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); YY_BREAK case 161: YY_RULE_SETUP -#line 1635 "dhcp6_lexer.ll" +#line 1637 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1637 "dhcp6_lexer.ll" +#line 1639 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4088,10 +4090,10 @@ case YY_STATE_EOF(INITIAL): YY_BREAK case 162: YY_RULE_SETUP -#line 1660 "dhcp6_lexer.ll" +#line 1662 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4094 "dhcp6_lexer.cc" +#line 4096 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -5196,7 +5198,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1660 "dhcp6_lexer.ll" +#line 1662 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 4805a86bfc..58808613ea 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -609,7 +609,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_); @@ -620,7 +620,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_); @@ -631,7 +631,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_); @@ -642,7 +642,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_); @@ -661,7 +661,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"subnet6\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_); @@ -670,7 +670,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"shared-networks\" { switch (driver.ctx_) { - case Parser6Context::DHCP6: + case isc::dhcp::Parser6Context::DHCP6: return Dhcp6Parser::make_SHARED_NETWORKS(driver.loc_); default: return Dhcp6Parser::make_STRING("shared-networks", driver.loc_); @@ -695,7 +695,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::RESERVATIONS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_); @@ -711,7 +711,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} case isc::dhcp::Parser6Context::CLIENT_CLASSES: case isc::dhcp::Parser6Context::CLIENT_CLASS: case isc::dhcp::Parser6Context::LOGGERS: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_); @@ -864,7 +864,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"interface\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_); @@ -874,7 +874,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"interface-id\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_); @@ -893,7 +893,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"rapid-commit\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_); @@ -903,7 +903,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"reservation-mode\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_); @@ -1078,8 +1078,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"client-class\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: + case isc::dhcp::Parser6Context::POOLS: + case isc::dhcp::Parser6Context::PD_POOLS: case isc::dhcp::Parser6Context::CLIENT_CLASSES: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("client-class", driver.loc_); @@ -1212,7 +1214,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"relay\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: - case Parser6Context::SHARED_NETWORK: + case isc::dhcp::Parser6Context::SHARED_NETWORK: return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_); @@ -1222,7 +1224,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} \"ip-address\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: - return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_); default: return isc::dhcp::Dhcp6Parser::make_STRING("ip-address", driver.loc_); } diff --git a/src/bin/dhcp6/dhcp6_messages.mes b/src/bin/dhcp6/dhcp6_messages.mes index 9130d958b1..8adb5e9dd6 100644 --- a/src/bin/dhcp6/dhcp6_messages.mes +++ b/src/bin/dhcp6/dhcp6_messages.mes @@ -60,7 +60,7 @@ The first argument specifies the client and transaction identification information. The second argument includes all classes to which the packet has been assigned. -% DHCP6_CLASS_UNCONFIGURED %1: client packet belongs to an unconfigured class: %1 +% DHCP6_CLASS_UNCONFIGURED %1: client packet belongs to an unconfigured class: %2 This debug message informs that incoming packet belongs to a class which cannot be found in the configuration. Either a hook written before the classification was added to Kea is used, or class naming is diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index 871197461b..8bc1713414 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -257,9 +257,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (that.value); break; @@ -298,9 +298,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (that.value); break; @@ -412,21 +412,21 @@ namespace isc { namespace dhcp { #line 413 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 430: // duid_type + case 431: // duid_type #line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 420 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 463: // ncr_protocol_value + case 464: // ncr_protocol_value #line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 427 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 471: // replace_client_name_value + case 472: // replace_client_name_value #line 229 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } @@ -634,9 +634,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; @@ -2182,16 +2182,16 @@ namespace isc { namespace dhcp { #line 2183 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 372: -#line 1315 "dhcp6_parser.yy" // lalr1.cc:859 + case 373: +#line 1316 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2191 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 373: -#line 1317 "dhcp6_parser.yy" // lalr1.cc:859 + case 374: +#line 1318 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); @@ -2200,16 +2200,16 @@ namespace isc { namespace dhcp { #line 2201 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 374: -#line 1323 "dhcp6_parser.yy" // lalr1.cc:859 + case 375: +#line 1324 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2209 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 375: -#line 1325 "dhcp6_parser.yy" // lalr1.cc:859 + case 376: +#line 1326 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as< ElementPtr > (); @@ -2235,16 +2235,16 @@ namespace isc { namespace dhcp { #line 2236 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 376: -#line 1348 "dhcp6_parser.yy" // lalr1.cc:859 + case 377: +#line 1349 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2244 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 377: -#line 1350 "dhcp6_parser.yy" // lalr1.cc:859 + case 378: +#line 1351 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -2272,8 +2272,8 @@ namespace isc { namespace dhcp { #line 2273 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1378 "dhcp6_parser.yy" // lalr1.cc:859 + case 379: +#line 1379 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); @@ -2283,8 +2283,8 @@ namespace isc { namespace dhcp { #line 2284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1383 "dhcp6_parser.yy" // lalr1.cc:859 + case 380: +#line 1384 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2292,8 +2292,8 @@ namespace isc { namespace dhcp { #line 2293 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 384: -#line 1398 "dhcp6_parser.yy" // lalr1.cc:859 + case 385: +#line 1399 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2302,8 +2302,8 @@ namespace isc { namespace dhcp { #line 2303 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1402 "dhcp6_parser.yy" // lalr1.cc:859 + case 386: +#line 1403 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2314,8 +2314,8 @@ namespace isc { namespace dhcp { #line 2315 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1410 "dhcp6_parser.yy" // lalr1.cc:859 + case 387: +#line 1411 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2324,8 +2324,8 @@ namespace isc { namespace dhcp { #line 2325 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1414 "dhcp6_parser.yy" // lalr1.cc:859 + case 388: +#line 1415 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2336,16 +2336,16 @@ namespace isc { namespace dhcp { #line 2337 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 399: -#line 1437 "dhcp6_parser.yy" // lalr1.cc:859 + case 401: +#line 1439 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2345 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 400: -#line 1439 "dhcp6_parser.yy" // lalr1.cc:859 + case 402: +#line 1441 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); @@ -2354,8 +2354,8 @@ namespace isc { namespace dhcp { #line 2355 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 401: -#line 1445 "dhcp6_parser.yy" // lalr1.cc:859 + case 403: +#line 1447 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); @@ -2363,16 +2363,16 @@ namespace isc { namespace dhcp { #line 2364 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1450 "dhcp6_parser.yy" // lalr1.cc:859 + case 404: +#line 1452 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2372 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1452 "dhcp6_parser.yy" // lalr1.cc:859 + case 405: +#line 1454 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); @@ -2381,8 +2381,8 @@ namespace isc { namespace dhcp { #line 2382 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 404: -#line 1458 "dhcp6_parser.yy" // lalr1.cc:859 + case 406: +#line 1460 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); @@ -2390,8 +2390,8 @@ namespace isc { namespace dhcp { #line 2391 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 405: -#line 1463 "dhcp6_parser.yy" // lalr1.cc:859 + case 407: +#line 1465 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); @@ -2399,8 +2399,8 @@ namespace isc { namespace dhcp { #line 2400 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 406: -#line 1471 "dhcp6_parser.yy" // lalr1.cc:859 + case 408: +#line 1473 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); @@ -2410,8 +2410,8 @@ namespace isc { namespace dhcp { #line 2411 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 407: -#line 1476 "dhcp6_parser.yy" // lalr1.cc:859 + case 409: +#line 1478 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2419,8 +2419,8 @@ namespace isc { namespace dhcp { #line 2420 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 412: -#line 1489 "dhcp6_parser.yy" // lalr1.cc:859 + case 414: +#line 1491 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2429,8 +2429,8 @@ namespace isc { namespace dhcp { #line 2430 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 413: -#line 1493 "dhcp6_parser.yy" // lalr1.cc:859 + case 415: +#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); @@ -2438,8 +2438,8 @@ namespace isc { namespace dhcp { #line 2439 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1498 "dhcp6_parser.yy" // lalr1.cc:859 + case 416: +#line 1500 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2448,8 +2448,8 @@ namespace isc { namespace dhcp { #line 2449 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1502 "dhcp6_parser.yy" // lalr1.cc:859 + case 417: +#line 1504 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed @@ -2457,8 +2457,8 @@ namespace isc { namespace dhcp { #line 2458 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1529 "dhcp6_parser.yy" // lalr1.cc:859 + case 433: +#line 1531 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); @@ -2468,8 +2468,8 @@ namespace isc { namespace dhcp { #line 2469 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1534 "dhcp6_parser.yy" // lalr1.cc:859 + case 434: +#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2477,8 +2477,8 @@ namespace isc { namespace dhcp { #line 2478 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1539 "dhcp6_parser.yy" // lalr1.cc:859 + case 435: +#line 1541 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefixes", l); @@ -2488,8 +2488,8 @@ namespace isc { namespace dhcp { #line 2489 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1544 "dhcp6_parser.yy" // lalr1.cc:859 + case 436: +#line 1546 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2497,16 +2497,16 @@ namespace isc { namespace dhcp { #line 2498 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1549 "dhcp6_parser.yy" // lalr1.cc:859 + case 437: +#line 1551 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2506 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1551 "dhcp6_parser.yy" // lalr1.cc:859 + case 438: +#line 1553 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); @@ -2515,16 +2515,16 @@ namespace isc { namespace dhcp { #line 2516 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1557 "dhcp6_parser.yy" // lalr1.cc:859 + case 439: +#line 1559 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2524 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1559 "dhcp6_parser.yy" // lalr1.cc:859 + case 440: +#line 1561 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); @@ -2533,16 +2533,16 @@ namespace isc { namespace dhcp { #line 2534 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1565 "dhcp6_parser.yy" // lalr1.cc:859 + case 441: +#line 1567 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2542 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1567 "dhcp6_parser.yy" // lalr1.cc:859 + case 442: +#line 1569 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); @@ -2551,16 +2551,16 @@ namespace isc { namespace dhcp { #line 2552 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1573 "dhcp6_parser.yy" // lalr1.cc:859 + case 443: +#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2560 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 + case 444: +#line 1577 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); @@ -2569,8 +2569,8 @@ namespace isc { namespace dhcp { #line 2570 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1581 "dhcp6_parser.yy" // lalr1.cc:859 + case 445: +#line 1583 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); @@ -2580,8 +2580,8 @@ namespace isc { namespace dhcp { #line 2581 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1586 "dhcp6_parser.yy" // lalr1.cc:859 + case 446: +#line 1588 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2589,8 +2589,8 @@ namespace isc { namespace dhcp { #line 2590 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 445: -#line 1594 "dhcp6_parser.yy" // lalr1.cc:859 + case 447: +#line 1596 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); @@ -2600,8 +2600,8 @@ namespace isc { namespace dhcp { #line 2601 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1599 "dhcp6_parser.yy" // lalr1.cc:859 + case 448: +#line 1601 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2609,16 +2609,16 @@ namespace isc { namespace dhcp { #line 2610 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1604 "dhcp6_parser.yy" // lalr1.cc:859 + case 449: +#line 1606 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2618 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1606 "dhcp6_parser.yy" // lalr1.cc:859 + case 450: +#line 1608 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); @@ -2627,8 +2627,8 @@ namespace isc { namespace dhcp { #line 2628 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 449: -#line 1615 "dhcp6_parser.yy" // lalr1.cc:859 + case 451: +#line 1617 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); @@ -2638,8 +2638,8 @@ namespace isc { namespace dhcp { #line 2639 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 450: -#line 1620 "dhcp6_parser.yy" // lalr1.cc:859 + case 452: +#line 1622 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2647,8 +2647,8 @@ namespace isc { namespace dhcp { #line 2648 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 453: -#line 1629 "dhcp6_parser.yy" // lalr1.cc:859 + case 455: +#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -2657,8 +2657,8 @@ namespace isc { namespace dhcp { #line 2658 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 454: -#line 1633 "dhcp6_parser.yy" // lalr1.cc:859 + case 456: +#line 1635 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2667,16 +2667,16 @@ namespace isc { namespace dhcp { #line 2668 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 466: -#line 1657 "dhcp6_parser.yy" // lalr1.cc:859 + case 468: +#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2676 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 467: -#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 + case 469: +#line 1661 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); @@ -2685,8 +2685,8 @@ namespace isc { namespace dhcp { #line 2686 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1668 "dhcp6_parser.yy" // lalr1.cc:859 + case 470: +#line 1670 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); @@ -2696,8 +2696,8 @@ namespace isc { namespace dhcp { #line 2697 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1673 "dhcp6_parser.yy" // lalr1.cc:859 + case 471: +#line 1675 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2707,16 +2707,16 @@ namespace isc { namespace dhcp { #line 2708 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 481: -#line 1695 "dhcp6_parser.yy" // lalr1.cc:859 + case 483: +#line 1697 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DUID_TYPE); } #line 2716 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 482: -#line 1697 "dhcp6_parser.yy" // lalr1.cc:859 + case 484: +#line 1699 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -2724,26 +2724,26 @@ namespace isc { namespace dhcp { #line 2725 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 483: -#line 1702 "dhcp6_parser.yy" // lalr1.cc:859 + case 485: +#line 1704 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } #line 2731 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1703 "dhcp6_parser.yy" // lalr1.cc:859 + case 486: +#line 1705 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } #line 2737 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1704 "dhcp6_parser.yy" // lalr1.cc:859 + case 487: +#line 1706 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } #line 2743 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1707 "dhcp6_parser.yy" // lalr1.cc:859 + case 488: +#line 1709 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("htype", htype); @@ -2751,16 +2751,16 @@ namespace isc { namespace dhcp { #line 2752 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1712 "dhcp6_parser.yy" // lalr1.cc:859 + case 489: +#line 1714 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2760 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1714 "dhcp6_parser.yy" // lalr1.cc:859 + case 490: +#line 1716 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("identifier", id); @@ -2769,8 +2769,8 @@ namespace isc { namespace dhcp { #line 2770 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1720 "dhcp6_parser.yy" // lalr1.cc:859 + case 491: +#line 1722 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("time", time); @@ -2778,8 +2778,8 @@ namespace isc { namespace dhcp { #line 2779 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1725 "dhcp6_parser.yy" // lalr1.cc:859 + case 492: +#line 1727 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enterprise-id", time); @@ -2787,8 +2787,8 @@ namespace isc { namespace dhcp { #line 2788 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1732 "dhcp6_parser.yy" // lalr1.cc:859 + case 493: +#line 1734 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); @@ -2796,8 +2796,8 @@ namespace isc { namespace dhcp { #line 2797 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 492: -#line 1739 "dhcp6_parser.yy" // lalr1.cc:859 + case 494: +#line 1741 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); @@ -2807,8 +2807,8 @@ namespace isc { namespace dhcp { #line 2808 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 493: -#line 1744 "dhcp6_parser.yy" // lalr1.cc:859 + case 495: +#line 1746 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -2816,16 +2816,16 @@ namespace isc { namespace dhcp { #line 2817 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 501: -#line 1760 "dhcp6_parser.yy" // lalr1.cc:859 + case 503: +#line 1762 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2825 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 502: -#line 1762 "dhcp6_parser.yy" // lalr1.cc:859 + case 504: +#line 1764 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); @@ -2834,16 +2834,16 @@ namespace isc { namespace dhcp { #line 2835 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1768 "dhcp6_parser.yy" // lalr1.cc:859 + case 505: +#line 1770 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2843 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1770 "dhcp6_parser.yy" // lalr1.cc:859 + case 506: +#line 1772 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); @@ -2852,8 +2852,8 @@ namespace isc { namespace dhcp { #line 2853 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1778 "dhcp6_parser.yy" // lalr1.cc:859 + case 507: +#line 1780 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); @@ -2863,8 +2863,8 @@ namespace isc { namespace dhcp { #line 2864 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1783 "dhcp6_parser.yy" // lalr1.cc:859 + case 508: +#line 1785 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -2874,8 +2874,8 @@ namespace isc { namespace dhcp { #line 2875 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1790 "dhcp6_parser.yy" // lalr1.cc:859 + case 509: +#line 1792 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -2884,8 +2884,8 @@ namespace isc { namespace dhcp { #line 2885 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1794 "dhcp6_parser.yy" // lalr1.cc:859 + case 510: +#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2894,8 +2894,8 @@ namespace isc { namespace dhcp { #line 2895 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1823 "dhcp6_parser.yy" // lalr1.cc:859 + case 530: +#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); @@ -2903,16 +2903,16 @@ namespace isc { namespace dhcp { #line 2904 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1828 "dhcp6_parser.yy" // lalr1.cc:859 + case 531: +#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2912 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 + case 532: +#line 1832 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); @@ -2921,16 +2921,16 @@ namespace isc { namespace dhcp { #line 2922 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1836 "dhcp6_parser.yy" // lalr1.cc:859 + case 533: +#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2930 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 + case 534: +#line 1840 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); @@ -2939,8 +2939,8 @@ namespace isc { namespace dhcp { #line 2940 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1844 "dhcp6_parser.yy" // lalr1.cc:859 + case 535: +#line 1846 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); @@ -2948,16 +2948,16 @@ namespace isc { namespace dhcp { #line 2949 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1849 "dhcp6_parser.yy" // lalr1.cc:859 + case 536: +#line 1851 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 2957 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1851 "dhcp6_parser.yy" // lalr1.cc:859 + case 537: +#line 1853 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); @@ -2966,8 +2966,8 @@ namespace isc { namespace dhcp { #line 2967 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1857 "dhcp6_parser.yy" // lalr1.cc:859 + case 538: +#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); @@ -2975,8 +2975,8 @@ namespace isc { namespace dhcp { #line 2976 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1862 "dhcp6_parser.yy" // lalr1.cc:859 + case 539: +#line 1864 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); @@ -2984,16 +2984,16 @@ namespace isc { namespace dhcp { #line 2985 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1867 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1869 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } #line 2993 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1869 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1871 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3001,28 +3001,28 @@ namespace isc { namespace dhcp { #line 3002 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1875 "dhcp6_parser.yy" // lalr1.cc:859 + case 542: +#line 1877 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } #line 3008 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 + case 543: +#line 1878 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } #line 3014 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1879 "dhcp6_parser.yy" // lalr1.cc:859 + case 544: +#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } #line 3022 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 + case 545: +#line 1883 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); @@ -3031,8 +3031,8 @@ namespace isc { namespace dhcp { #line 3032 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1887 "dhcp6_parser.yy" // lalr1.cc:859 + case 546: +#line 1889 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); @@ -3040,8 +3040,8 @@ namespace isc { namespace dhcp { #line 3041 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1892 "dhcp6_parser.yy" // lalr1.cc:859 + case 547: +#line 1894 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); @@ -3049,8 +3049,8 @@ namespace isc { namespace dhcp { #line 3050 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1897 "dhcp6_parser.yy" // lalr1.cc:859 + case 548: +#line 1899 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); @@ -3058,16 +3058,16 @@ namespace isc { namespace dhcp { #line 3059 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1902 "dhcp6_parser.yy" // lalr1.cc:859 + case 549: +#line 1904 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } #line 3067 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 548: -#line 1904 "dhcp6_parser.yy" // lalr1.cc:859 + case 550: +#line 1906 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3075,40 +3075,40 @@ namespace isc { namespace dhcp { #line 3076 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 549: -#line 1910 "dhcp6_parser.yy" // lalr1.cc:859 + case 551: +#line 1912 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } #line 3084 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 550: -#line 1913 "dhcp6_parser.yy" // lalr1.cc:859 + case 552: +#line 1915 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } #line 3092 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1916 "dhcp6_parser.yy" // lalr1.cc:859 + case 553: +#line 1918 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } #line 3100 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1919 "dhcp6_parser.yy" // lalr1.cc:859 + case 554: +#line 1921 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } #line 3108 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1922 "dhcp6_parser.yy" // lalr1.cc:859 + case 555: +#line 1924 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); @@ -3116,16 +3116,16 @@ namespace isc { namespace dhcp { #line 3117 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1928 "dhcp6_parser.yy" // lalr1.cc:859 + case 556: +#line 1930 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3125 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1930 "dhcp6_parser.yy" // lalr1.cc:859 + case 557: +#line 1932 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); @@ -3134,16 +3134,16 @@ namespace isc { namespace dhcp { #line 3135 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1938 "dhcp6_parser.yy" // lalr1.cc:859 + case 558: +#line 1940 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3143 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 557: -#line 1940 "dhcp6_parser.yy" // lalr1.cc:859 + case 559: +#line 1942 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3151,16 +3151,16 @@ namespace isc { namespace dhcp { #line 3152 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 558: -#line 1945 "dhcp6_parser.yy" // lalr1.cc:859 + case 560: +#line 1947 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3160 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 559: -#line 1947 "dhcp6_parser.yy" // lalr1.cc:859 + case 561: +#line 1949 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3168,16 +3168,16 @@ namespace isc { namespace dhcp { #line 3169 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 560: -#line 1952 "dhcp6_parser.yy" // lalr1.cc:859 + case 562: +#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3177 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 561: -#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 + case 563: +#line 1956 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -3185,8 +3185,8 @@ namespace isc { namespace dhcp { #line 3186 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 562: -#line 1965 "dhcp6_parser.yy" // lalr1.cc:859 + case 564: +#line 1967 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); @@ -3196,8 +3196,8 @@ namespace isc { namespace dhcp { #line 3197 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 563: -#line 1970 "dhcp6_parser.yy" // lalr1.cc:859 + case 565: +#line 1972 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3205,8 +3205,8 @@ namespace isc { namespace dhcp { #line 3206 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 564: -#line 1975 "dhcp6_parser.yy" // lalr1.cc:859 + case 566: +#line 1977 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Logging map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -3215,16 +3215,16 @@ namespace isc { namespace dhcp { #line 3216 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 565: -#line 1979 "dhcp6_parser.yy" // lalr1.cc:859 + case 567: +#line 1981 "dhcp6_parser.yy" // lalr1.cc:859 { // parsing completed } #line 3224 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 569: -#line 1995 "dhcp6_parser.yy" // lalr1.cc:859 + case 571: +#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); @@ -3234,8 +3234,8 @@ namespace isc { namespace dhcp { #line 3235 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 570: -#line 2000 "dhcp6_parser.yy" // lalr1.cc:859 + case 572: +#line 2002 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3243,8 +3243,8 @@ namespace isc { namespace dhcp { #line 3244 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 573: -#line 2012 "dhcp6_parser.yy" // lalr1.cc:859 + case 575: +#line 2014 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); @@ -3253,16 +3253,16 @@ namespace isc { namespace dhcp { #line 3254 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 574: -#line 2016 "dhcp6_parser.yy" // lalr1.cc:859 + case 576: +#line 2018 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3262 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 584: -#line 2033 "dhcp6_parser.yy" // lalr1.cc:859 + case 586: +#line 2035 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); @@ -3270,16 +3270,16 @@ namespace isc { namespace dhcp { #line 3271 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 585: -#line 2038 "dhcp6_parser.yy" // lalr1.cc:859 + case 587: +#line 2040 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3279 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 586: -#line 2040 "dhcp6_parser.yy" // lalr1.cc:859 + case 588: +#line 2042 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); @@ -3288,8 +3288,8 @@ namespace isc { namespace dhcp { #line 3289 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 587: -#line 2046 "dhcp6_parser.yy" // lalr1.cc:859 + case 589: +#line 2048 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); @@ -3299,8 +3299,8 @@ namespace isc { namespace dhcp { #line 3300 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 588: -#line 2051 "dhcp6_parser.yy" // lalr1.cc:859 + case 590: +#line 2053 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -3308,8 +3308,8 @@ namespace isc { namespace dhcp { #line 3309 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 591: -#line 2060 "dhcp6_parser.yy" // lalr1.cc:859 + case 593: +#line 2062 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); @@ -3318,24 +3318,24 @@ namespace isc { namespace dhcp { #line 3319 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 592: -#line 2064 "dhcp6_parser.yy" // lalr1.cc:859 + case 594: +#line 2066 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } #line 3327 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 599: -#line 2078 "dhcp6_parser.yy" // lalr1.cc:859 + case 601: +#line 2080 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } #line 3335 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 600: -#line 2080 "dhcp6_parser.yy" // lalr1.cc:859 + case 602: +#line 2082 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); @@ -3344,8 +3344,8 @@ namespace isc { namespace dhcp { #line 3345 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 601: -#line 2086 "dhcp6_parser.yy" // lalr1.cc:859 + case 603: +#line 2088 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); @@ -3353,8 +3353,8 @@ namespace isc { namespace dhcp { #line 3354 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 602: -#line 2091 "dhcp6_parser.yy" // lalr1.cc:859 + case 604: +#line 2093 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); @@ -3362,8 +3362,8 @@ namespace isc { namespace dhcp { #line 3363 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 603: -#line 2096 "dhcp6_parser.yy" // lalr1.cc:859 + case 605: +#line 2098 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); @@ -3627,111 +3627,111 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -758; + const short int Dhcp6Parser::yypact_ninf_ = -750; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 306, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, 60, 28, 68, 72, 74, - 82, 84, 110, 117, 149, 154, 160, 166, 170, 187, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, 28, 22, - 32, 482, 36, 40, 70, 2, 177, 194, 106, 230, - -33, 320, 86, -758, 229, 240, 254, 269, 276, -758, - -758, -758, -758, -758, 295, -758, 35, -758, -758, -758, - -758, -758, -758, -758, -758, -758, 297, 301, 305, 307, - 313, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, 316, -758, -758, -758, 79, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, 327, -758, 115, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, 333, - 334, -758, -758, -758, -758, -758, -758, -758, -758, -758, - 168, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, 203, - -758, -758, -758, -758, -758, 337, -758, 341, 342, -758, - -758, -758, -758, 204, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, 344, 311, -758, -758, -758, -758, -758, -758, -758, - -758, 346, -758, -758, 351, -758, -758, -758, 354, -758, - -758, 353, 359, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, 360, 361, -758, -758, - -758, -758, 362, 364, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, 214, -758, -758, -758, - 368, -758, -758, 369, -758, 371, 374, -758, -758, 375, - 378, 384, -758, -758, -758, -758, -758, 222, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, 241, -758, -758, -758, 28, 28, - -758, 236, 386, 389, 390, 392, 393, -758, 32, -758, - 394, 395, 396, 249, 250, 251, 253, 255, 404, 406, - 407, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 270, 419, 436, 482, -758, 437, 303, 36, -758, - 38, 456, 457, 458, 459, 460, 312, 309, 463, 464, - 465, 466, 40, -758, 467, 70, -758, 468, 321, 470, - 322, 323, 2, -758, 474, 475, 476, 477, 478, 479, - 480, -758, 177, -758, 484, 485, 338, 490, 491, 494, - 343, -758, 106, 496, 348, 349, -758, 230, 503, 505, - 53, -758, 355, 506, 517, 373, 521, 376, 377, 524, - 528, 379, 380, 381, 529, 530, 320, -758, 536, 86, - -758, -758, -758, 537, 535, 539, 28, 28, 28, -758, - 540, 541, 547, -758, -758, -758, -758, -758, 538, 550, - 551, 552, 405, 558, 559, 561, 564, 565, 566, 567, - 569, -758, 570, 571, -758, 568, -758, -758, -758, -758, - -758, -758, -758, -758, 549, 576, -758, -758, -758, 575, - 577, 428, 432, 433, -758, -758, 284, 438, 584, 583, - -758, 439, -758, 440, -758, 441, -758, -758, -758, 568, - 568, 568, 442, 443, 444, 445, -758, 446, 447, -758, - 448, 449, 450, -758, -758, 451, -758, -758, -758, 452, - 28, -758, -758, 453, 454, -758, 455, -758, -758, 29, - 487, -758, -758, -758, 18, 461, -758, 605, -758, 28, - 482, 86, -758, -758, -758, 36, 174, 174, 604, 606, - 608, -758, -758, -758, 609, -38, 28, 80, 43, 610, - 150, 163, 83, 320, -758, -758, 614, -758, 38, 612, - 613, -758, -758, -758, -758, -758, -758, -758, -758, 615, - 542, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, 616, -758, 242, 243, 272, -758, -758, - -758, -758, 617, 621, 622, 623, 624, -758, -758, -758, - 273, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, 275, -758, 625, 626, -758, -758, - 627, 629, -758, -758, 628, 633, -758, -758, 631, 635, - -758, -758, -758, 63, -758, -758, -758, 634, -758, -758, - -758, 122, -758, -758, -758, -758, 128, -758, 636, 638, - -758, 639, 640, 641, 642, 643, 644, 285, -758, -758, - -758, -758, -758, -758, -758, -758, -758, 645, 646, 647, - -758, -758, -758, -758, 286, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, 287, -758, -758, -758, - 288, 486, 499, -758, -758, 648, 650, -758, -758, 649, - 653, -758, -758, 651, 655, -758, -758, 652, -758, 202, - -758, -758, -758, -758, 657, 658, 659, 660, 511, 510, - 513, 512, 515, 666, 667, 174, -758, -758, 40, -758, - 604, 106, -758, 606, 230, -758, 608, 73, -758, 609, - -38, -758, -758, 80, -758, 43, -758, -33, -758, 610, - 518, 519, 520, 522, 523, 525, 150, -758, 671, 674, - 526, 527, 531, 163, -758, 678, 679, 83, -758, -758, - -758, 680, 656, -758, 70, -758, 612, 2, -758, 613, - 177, -758, 615, 683, -758, 153, 616, -758, 247, 544, - 553, 557, -758, -758, -758, -758, -758, 562, 563, -758, - 289, -758, 676, -758, 681, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, 299, -758, - -758, -758, -758, -758, -758, -758, -758, -758, 300, -758, - -758, -758, -758, -758, -758, -758, -758, 133, 574, -758, - -758, -758, -758, 578, 579, -758, -758, 581, 310, -758, - 326, -758, 682, -758, 582, -758, 684, -758, -758, -758, - -758, -758, 332, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, 73, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, 687, 546, 688, 153, - -758, -758, 607, -758, 585, -758, 686, -758, -758, 215, - -758, -89, 686, -758, -758, 690, 698, 699, 336, -758, - -758, -758, -758, -758, -758, 716, 573, 586, 587, -89, - -758, 589, -758, -758, -758, -758, -758 + 406, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, 51, 27, 42, 115, 123, + 140, 159, 160, 170, 180, 194, 207, 208, 215, 221, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, 27, -88, + 36, 49, 32, 200, 150, 72, 141, 103, 92, 236, + -46, 351, 109, -750, 67, 240, 264, 279, 241, -750, + -750, -750, -750, -750, 285, -750, 34, -750, -750, -750, + -750, -750, -750, -750, -750, -750, 303, 319, 329, 339, + 341, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, 342, -750, -750, -750, 40, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, 344, -750, 54, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, 346, 352, + -750, -750, -750, -750, -750, -750, -750, -750, -750, 63, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, 71, + -750, -750, -750, -750, -750, 359, -750, 363, 364, -750, + -750, -750, -750, -750, 133, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, 290, 315, -750, -750, -750, -750, -750, -750, + -750, -750, 347, -750, -750, 366, -750, -750, -750, 369, + -750, -750, 370, 368, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, 371, 373, -750, + -750, -750, -750, 372, 378, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, 161, -750, -750, + -750, 379, -750, -750, 380, -750, 381, 383, -750, -750, + 386, 387, 389, -750, -750, -750, -750, -750, 162, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, 183, -750, -750, -750, 27, + 27, -750, 242, 390, 398, 400, 405, 407, -750, 36, + -750, 408, 409, 410, 220, 265, 266, 267, 268, 411, + 413, 414, 421, 424, 427, 428, 429, 430, 431, 432, + 433, 434, 288, 435, 437, 49, -750, 439, 289, 32, + -750, 440, 442, 443, 445, 446, 302, 295, 451, 467, + 468, 469, 200, -750, 473, 150, -750, 474, 325, 476, + 327, 328, 72, -750, 479, 480, 481, 482, 483, 484, + 485, -750, 141, -750, 489, 490, 343, 491, 494, 495, + 345, -750, 92, 496, 349, 350, -750, 236, 498, 499, + 7, -750, 353, 503, 504, 356, 507, 361, 362, 513, + 514, 365, 374, 375, 515, 518, 351, -750, 519, 109, + -750, -750, -750, 522, 520, 521, 27, 27, 27, -750, + 525, 526, 527, -750, -750, -750, -750, -750, 524, 530, + 531, 536, 384, 554, 555, 556, 557, 558, 559, 560, + 561, -750, 562, 563, -750, 566, -750, -750, 567, 568, + 412, 422, 423, -750, -750, 189, 425, 569, 570, -750, + 426, -750, 436, -750, 438, -750, -750, -750, 566, 566, + 566, 441, 444, 447, 448, -750, 449, 450, -750, 452, + 453, 454, -750, -750, 455, -750, -750, -750, 456, 27, + -750, -750, 457, 458, -750, 459, -750, -750, -43, 460, + -750, -750, -750, 116, 461, -750, 575, -750, 27, 49, + 109, -750, -750, -750, 32, 74, 74, 574, 576, 577, + -750, -750, -750, 578, -42, 27, 66, 579, 580, 68, + 96, 58, 351, -750, -750, 581, 583, -750, -750, -750, + -750, -750, -750, -750, -750, 585, 511, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, 588, + -750, 205, 227, 243, -750, -750, -750, -750, 592, 594, + 595, 600, 609, -750, -750, -750, 244, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + 262, -750, 610, 612, -750, -750, 611, 615, -750, -750, + 613, 617, -750, -750, 616, 618, -750, -750, -750, 44, + -750, -750, -750, 619, -750, -750, -750, 223, -750, -750, + -750, -750, 261, -750, -750, 620, 621, -750, 623, 624, + 625, 626, 627, 628, 263, -750, -750, -750, -750, -750, + -750, -750, -750, -750, 629, 630, 631, -750, -750, -750, + -750, 280, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, 283, -750, -750, -750, 287, 470, -750, + 632, 633, -750, -750, 634, 636, -750, -750, 635, 639, + -750, -750, 637, -750, 314, -750, -750, -750, -750, 640, + 642, 643, 644, 497, 487, 500, 493, 501, 646, 648, + 74, -750, -750, 200, -750, 574, 92, -750, 576, 236, + -750, 577, 367, -750, 578, -42, -750, -750, 66, -750, + 37, 579, -750, -46, -750, 580, 502, 505, 506, 508, + 509, 510, 68, -750, 649, 653, 512, 516, 517, 96, + -750, 654, 657, 58, -750, -750, -750, 659, 664, 150, + -750, 581, 72, -750, 583, 141, -750, 585, 665, -750, + 153, 588, -750, 321, 523, 529, 532, -750, -750, -750, + -750, -750, 534, 535, -750, 293, -750, 660, -750, 666, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, 294, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, 667, 669, + -750, -750, -750, -750, 297, -750, -750, -750, -750, -750, + -750, -750, -750, 235, 538, -750, -750, -750, -750, 540, + 543, -750, -750, 548, 301, -750, 305, -750, 670, -750, + 549, -750, 673, -750, -750, -750, -750, -750, 308, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, 367, -750, 675, + -750, 37, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, 680, 564, 705, 153, -750, + -750, 571, -750, 668, -750, 572, -750, -750, 703, -750, + -750, 322, -750, 70, 703, -750, -750, 708, 709, 711, + 311, -750, -750, -750, -750, -750, -750, 712, 565, 573, + 584, 70, -750, 591, -750, -750, -750, -750, -750 }; const unsigned short int @@ -3742,140 +3742,140 @@ namespace isc { namespace dhcp { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45, 38, 34, 33, 30, 31, 32, 37, 3, 35, 36, 58, 5, 70, 7, 106, 9, 222, 11, - 363, 13, 386, 15, 414, 17, 288, 19, 296, 21, - 333, 23, 187, 25, 507, 27, 564, 29, 47, 41, - 0, 0, 0, 0, 0, 0, 416, 0, 298, 335, + 363, 13, 387, 15, 416, 17, 288, 19, 296, 21, + 333, 23, 187, 25, 509, 27, 566, 29, 47, 41, + 0, 0, 0, 0, 0, 0, 418, 0, 298, 335, 0, 0, 0, 49, 0, 48, 0, 0, 42, 68, - 562, 556, 558, 560, 0, 67, 0, 60, 62, 64, + 564, 558, 560, 562, 0, 67, 0, 60, 62, 64, 65, 66, 63, 104, 118, 120, 0, 0, 0, 0, - 0, 214, 286, 325, 374, 376, 260, 160, 177, 168, - 449, 179, 198, 468, 0, 492, 505, 98, 0, 72, + 0, 214, 286, 325, 375, 377, 260, 160, 177, 168, + 451, 179, 198, 470, 0, 494, 507, 98, 0, 72, 74, 75, 76, 77, 78, 81, 82, 83, 84, 86, 85, 90, 91, 79, 80, 88, 89, 96, 97, 87, 92, 93, 94, 95, 115, 0, 114, 0, 108, 110, - 111, 112, 113, 453, 355, 378, 245, 247, 249, 0, - 0, 253, 251, 406, 445, 244, 226, 227, 228, 229, - 0, 224, 233, 234, 235, 238, 240, 236, 237, 230, - 231, 242, 243, 232, 239, 241, 372, 371, 368, 0, - 365, 367, 369, 370, 399, 0, 402, 0, 0, 398, - 393, 396, 397, 0, 388, 390, 391, 394, 395, 392, - 443, 431, 433, 435, 437, 439, 441, 430, 427, 428, - 429, 0, 417, 418, 422, 423, 420, 424, 425, 426, - 421, 0, 315, 150, 0, 319, 317, 322, 0, 311, - 312, 0, 299, 300, 302, 314, 303, 304, 305, 321, - 306, 307, 308, 309, 310, 349, 0, 0, 347, 348, - 351, 352, 0, 336, 337, 339, 340, 341, 342, 343, - 344, 345, 346, 194, 196, 191, 0, 189, 192, 193, - 0, 529, 531, 0, 534, 0, 0, 538, 542, 0, - 0, 0, 547, 554, 527, 525, 526, 0, 509, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 569, 0, 566, 568, 46, 0, 0, - 39, 0, 0, 0, 0, 0, 0, 57, 0, 59, + 111, 112, 113, 355, 379, 245, 247, 249, 0, 0, + 253, 251, 408, 447, 244, 226, 227, 228, 229, 0, + 224, 233, 234, 235, 238, 240, 236, 237, 230, 231, + 242, 243, 232, 239, 241, 373, 372, 369, 368, 0, + 365, 367, 370, 371, 401, 0, 404, 0, 0, 400, + 395, 394, 398, 399, 0, 389, 391, 392, 396, 397, + 393, 445, 433, 435, 437, 439, 441, 443, 432, 429, + 430, 431, 0, 419, 420, 424, 425, 422, 426, 427, + 428, 423, 0, 315, 150, 0, 319, 317, 322, 0, + 311, 312, 0, 299, 300, 302, 314, 303, 304, 305, + 321, 306, 307, 308, 309, 310, 349, 0, 0, 347, + 348, 351, 352, 0, 336, 337, 339, 340, 341, 342, + 343, 344, 345, 346, 194, 196, 191, 0, 189, 192, + 193, 0, 531, 533, 0, 536, 0, 0, 540, 544, + 0, 0, 0, 549, 556, 529, 527, 528, 0, 511, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 571, 0, 568, 570, 46, 0, + 0, 39, 0, 0, 0, 0, 0, 0, 57, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 71, 0, 0, 0, 107, - 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 364, 0, 0, 0, - 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, - 0, 415, 0, 289, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, + 0, 417, 0, 289, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 334, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 508, 0, 0, - 565, 50, 43, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 0, 0, 0, 0, 510, 0, 0, + 567, 50, 43, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 99, 100, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 491, 0, 0, 73, 0, 117, 109, 466, 464, - 465, 461, 462, 463, 0, 456, 457, 459, 460, 0, - 0, 0, 0, 0, 258, 259, 0, 0, 0, 0, - 225, 0, 366, 0, 401, 0, 404, 405, 389, 0, - 0, 0, 0, 0, 0, 0, 419, 0, 0, 313, - 0, 0, 0, 324, 301, 0, 353, 354, 338, 0, - 0, 190, 528, 0, 0, 533, 0, 536, 537, 0, - 0, 544, 545, 546, 0, 0, 510, 0, 567, 0, - 0, 0, 557, 559, 561, 0, 0, 0, 216, 290, - 327, 40, 375, 377, 262, 0, 47, 0, 0, 181, - 0, 0, 0, 0, 51, 116, 0, 454, 0, 357, - 380, 246, 248, 250, 255, 256, 257, 254, 252, 408, - 0, 373, 400, 403, 444, 432, 434, 436, 438, 440, - 442, 316, 151, 320, 318, 323, 350, 195, 197, 530, - 532, 535, 540, 541, 539, 543, 549, 550, 551, 552, - 553, 548, 555, 0, 44, 0, 0, 0, 137, 143, - 145, 147, 0, 0, 0, 0, 0, 156, 158, 136, - 0, 122, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 0, 220, 0, 217, 218, 294, - 0, 291, 292, 331, 0, 328, 329, 266, 0, 263, - 264, 166, 167, 0, 162, 164, 165, 0, 175, 176, - 172, 0, 170, 173, 174, 451, 0, 185, 0, 182, - 183, 0, 0, 0, 0, 0, 0, 0, 200, 202, - 203, 204, 205, 206, 207, 481, 487, 0, 0, 0, - 480, 477, 478, 479, 0, 470, 472, 475, 473, 474, - 476, 501, 503, 500, 498, 499, 0, 494, 496, 497, - 0, 53, 0, 458, 361, 0, 358, 359, 384, 0, - 381, 382, 412, 0, 409, 410, 447, 0, 573, 0, - 571, 69, 563, 105, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 121, 0, 215, - 0, 298, 287, 0, 335, 326, 0, 0, 261, 0, - 0, 161, 178, 0, 169, 0, 450, 0, 180, 0, - 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, - 0, 0, 0, 0, 469, 0, 0, 0, 493, 506, - 55, 0, 54, 467, 0, 356, 0, 0, 379, 0, - 416, 407, 0, 0, 446, 0, 0, 570, 0, 0, - 0, 0, 149, 152, 153, 154, 155, 0, 0, 123, - 0, 219, 0, 293, 0, 330, 285, 280, 282, 274, - 275, 270, 271, 272, 273, 279, 278, 281, 0, 268, - 276, 283, 284, 277, 265, 163, 171, 452, 0, 184, - 208, 209, 210, 211, 212, 213, 201, 0, 0, 486, - 489, 490, 471, 0, 0, 495, 52, 0, 0, 360, - 0, 383, 0, 411, 0, 587, 0, 585, 583, 577, - 581, 582, 0, 575, 579, 580, 578, 572, 139, 140, - 141, 142, 138, 144, 146, 148, 157, 159, 221, 295, - 332, 0, 267, 186, 483, 484, 485, 482, 488, 502, - 504, 56, 362, 385, 413, 448, 0, 0, 0, 0, - 574, 269, 0, 584, 0, 576, 0, 586, 591, 0, - 589, 0, 0, 588, 599, 0, 0, 0, 0, 593, - 595, 596, 597, 598, 590, 0, 0, 0, 0, 0, - 592, 0, 601, 602, 603, 594, 600 + 0, 493, 0, 0, 73, 0, 117, 109, 0, 0, + 0, 0, 0, 258, 259, 0, 0, 0, 0, 225, + 0, 366, 0, 403, 0, 406, 407, 390, 0, 0, + 0, 0, 0, 0, 0, 421, 0, 0, 313, 0, + 0, 0, 324, 301, 0, 353, 354, 338, 0, 0, + 190, 530, 0, 0, 535, 0, 538, 539, 0, 0, + 546, 547, 548, 0, 0, 512, 0, 569, 0, 0, + 0, 559, 561, 563, 0, 0, 0, 216, 290, 327, + 40, 376, 378, 262, 0, 47, 0, 0, 181, 0, + 0, 0, 0, 51, 116, 357, 381, 246, 248, 250, + 255, 256, 257, 254, 252, 410, 0, 374, 402, 405, + 446, 434, 436, 438, 440, 442, 444, 316, 151, 320, + 318, 323, 350, 195, 197, 532, 534, 537, 542, 543, + 541, 545, 551, 552, 553, 554, 555, 550, 557, 0, + 44, 0, 0, 0, 137, 143, 145, 147, 0, 0, + 0, 0, 0, 156, 158, 136, 0, 122, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 0, 220, 0, 217, 218, 294, 0, 291, 292, 331, + 0, 328, 329, 266, 0, 263, 264, 166, 167, 0, + 162, 164, 165, 0, 175, 176, 172, 0, 170, 173, + 174, 455, 0, 453, 185, 0, 182, 183, 0, 0, + 0, 0, 0, 0, 0, 200, 202, 203, 204, 205, + 206, 207, 483, 489, 0, 0, 0, 482, 479, 480, + 481, 0, 472, 474, 477, 475, 476, 478, 503, 505, + 502, 500, 501, 0, 496, 498, 499, 0, 53, 361, + 0, 358, 359, 385, 0, 382, 383, 414, 0, 411, + 412, 449, 0, 575, 0, 573, 69, 565, 105, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 121, 0, 215, 0, 298, 287, 0, 335, + 326, 0, 0, 261, 0, 0, 161, 178, 0, 169, + 457, 0, 452, 0, 180, 0, 0, 0, 0, 0, + 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, + 471, 0, 0, 0, 495, 508, 55, 0, 54, 0, + 356, 0, 0, 380, 0, 418, 409, 0, 0, 448, + 0, 0, 572, 0, 0, 0, 0, 149, 152, 153, + 154, 155, 0, 0, 123, 0, 219, 0, 293, 0, + 330, 285, 280, 282, 274, 275, 270, 271, 272, 273, + 279, 278, 281, 0, 268, 276, 283, 284, 277, 265, + 163, 171, 468, 466, 467, 463, 464, 465, 0, 458, + 459, 461, 462, 454, 0, 184, 208, 209, 210, 211, + 212, 213, 201, 0, 0, 488, 491, 492, 473, 0, + 0, 497, 52, 0, 0, 360, 0, 384, 0, 413, + 0, 589, 0, 587, 585, 579, 583, 584, 0, 577, + 581, 582, 580, 574, 139, 140, 141, 142, 138, 144, + 146, 148, 157, 159, 221, 295, 332, 0, 267, 0, + 456, 0, 186, 485, 486, 487, 484, 490, 504, 506, + 56, 362, 386, 415, 450, 0, 0, 0, 0, 576, + 269, 0, 460, 0, 586, 0, 578, 469, 0, 588, + 593, 0, 591, 0, 0, 590, 601, 0, 0, 0, + 0, 595, 597, 598, 599, 600, 592, 0, 0, 0, + 0, 0, 594, 0, 603, 604, 605, 596, 602 }; const short int Dhcp6Parser::yypgoto_[] = { - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -4, -758, 111, -758, - -758, -758, -758, -758, -758, 64, -758, -125, -758, -758, - -758, -70, -758, -758, -758, 398, -758, -758, -758, -758, - 180, 382, -72, -59, -56, -54, -758, -758, -758, -758, - -758, 169, 383, -758, -758, -758, -758, -758, -758, -758, - 182, -22, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -66, -758, -556, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -35, -551, -758, -758, -758, - -758, -34, -758, -758, -758, -758, -758, -758, -758, -758, - -41, -758, -758, -758, -31, 347, -758, -758, -758, -758, - -758, -758, -758, -44, -758, -758, -758, -758, -758, -758, - -757, -758, -758, -758, -17, -758, -758, -758, -7, 387, - -758, -758, -756, -758, -755, -758, -561, -758, -749, -758, - -758, -758, -743, -758, -758, -758, -758, -15, -758, -758, - -159, 693, -758, -758, -758, -758, -758, -1, -758, -758, - -758, 3, -758, 363, -758, -61, -758, -758, -758, -758, - -758, -48, -758, -758, -758, -758, -758, 10, -758, -758, - -758, -3, -758, -758, -758, 5, -758, 365, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -39, - -758, -758, -758, -30, 400, -758, -758, -49, -758, -11, - -758, -758, -758, -758, -758, -36, -758, -758, -758, -37, - 397, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -32, -758, -758, -758, -29, -758, 391, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -741, -758, -758, -758, -758, -758, -758, - -758, -758, -758, 208, -758, -758, -758, -758, -758, -758, - -9, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -26, -758, -758, -758, -758, -758, -758, - -758, -758, 224, 352, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, -758, -758, -758, - -758, -758, -758, -758, -758, -758, -758, 244, 366, -758, - -758, -758, -28, -758, -758, -140, -758, -758, -758, -758, - -758, -758, -152, -758, -758, -168, -758, -758, -758, -758, - -758 + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, 6, -750, 105, -750, + -750, -750, -750, -750, -750, 82, -750, -139, -750, -750, + -750, -70, -750, -750, -750, 391, -750, -750, -750, -750, + 178, 355, -72, -58, -56, -55, -750, -750, -750, -750, + -750, 182, 377, -750, -750, -750, -750, -750, -750, -750, + 185, -16, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -7, -750, -553, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -28, -544, -750, -750, -750, + -750, -19, -750, -750, -750, -750, -750, -750, -750, -750, + -27, -750, -750, -750, -15, 333, -750, -750, -750, -750, + -750, -750, -750, -23, -750, -750, -750, -750, -750, -750, + -749, -750, -750, -750, 5, -750, -750, -750, 8, 385, + -750, -750, -746, -750, -742, -750, -34, -750, -741, -750, + -750, -750, -739, -750, -750, -750, -750, 2, -750, -750, + -147, 694, -750, -750, -750, -750, -750, 14, -750, -750, + -750, 18, -750, 376, -750, -65, -750, -750, -750, -750, + -750, -60, -750, -750, -750, -750, -750, -6, -750, -750, + -750, 15, -750, -750, -750, 16, -750, 360, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -21, + -750, -750, -750, -18, 393, -750, -750, -48, -750, -20, + -750, -750, -750, -750, -750, -17, -750, -750, -750, -13, + 392, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -24, -750, -750, -750, -14, -750, 395, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -733, -750, -750, -750, -750, -750, -750, + 21, -750, -750, -750, -135, -750, -750, -750, -750, -750, + -750, 9, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, 1, -750, -750, -750, -750, -750, + -750, -750, -750, 233, 382, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, + -750, -750, -750, -750, -750, -750, -750, -750, 260, 388, + -750, -750, -750, -10, -750, -750, -136, -750, -750, -750, + -750, -750, -750, -150, -750, -750, -166, -750, -750, -750, + -750, -750 }; const short int @@ -3883,238 +3883,238 @@ namespace isc { namespace dhcp { { -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 83, 39, 40, 69, - 562, 87, 88, 41, 68, 84, 85, 575, 731, 811, - 812, 127, 43, 70, 96, 97, 98, 332, 45, 71, - 128, 129, 130, 131, 132, 133, 134, 135, 340, 47, - 72, 157, 158, 159, 366, 160, 136, 341, 137, 342, - 640, 641, 642, 754, 912, 643, 755, 644, 756, 645, - 757, 646, 250, 405, 648, 649, 650, 651, 652, 763, - 653, 764, 138, 354, 673, 674, 675, 676, 139, 356, - 681, 682, 683, 684, 140, 355, 141, 358, 688, 689, - 690, 787, 63, 80, 286, 287, 288, 418, 289, 419, - 142, 359, 697, 698, 699, 700, 701, 702, 703, 704, - 143, 348, 656, 657, 658, 768, 49, 73, 180, 181, - 182, 373, 183, 374, 184, 375, 185, 379, 186, 378, - 587, 187, 188, 144, 353, 668, 669, 670, 777, 858, - 859, 145, 349, 57, 77, 660, 661, 662, 771, 59, - 78, 251, 252, 253, 254, 255, 256, 257, 404, 258, - 408, 259, 407, 260, 261, 409, 262, 146, 350, 664, - 665, 666, 774, 61, 79, 272, 273, 274, 275, 276, - 413, 277, 278, 279, 280, 190, 371, 735, 736, 737, - 814, 51, 74, 199, 200, 201, 384, 147, 351, 148, - 352, 193, 372, 739, 740, 741, 817, 53, 75, 213, - 214, 215, 387, 216, 217, 389, 218, 219, 194, 380, - 743, 744, 745, 820, 55, 76, 231, 232, 233, 234, - 395, 235, 396, 236, 397, 237, 398, 238, 399, 239, - 400, 240, 394, 195, 381, 747, 823, 149, 357, 686, - 370, 484, 485, 486, 487, 488, 576, 150, 360, 714, - 715, 716, 798, 927, 717, 718, 799, 719, 720, 151, - 152, 362, 726, 727, 728, 805, 729, 806, 153, 363, - 65, 81, 307, 308, 309, 310, 423, 311, 424, 312, - 313, 426, 314, 315, 316, 429, 614, 317, 430, 318, - 319, 320, 321, 434, 621, 322, 435, 99, 334, 100, - 335, 101, 336, 102, 333, 67, 82, 324, 325, 326, - 438, 749, 750, 825, 902, 903, 904, 905, 938, 906, - 936, 949, 950, 951, 958, 959, 960, 965, 961, 962, - 963 + 551, 87, 88, 41, 68, 84, 85, 564, 718, 797, + 798, 127, 43, 70, 96, 97, 98, 333, 45, 71, + 128, 129, 130, 131, 132, 133, 134, 135, 341, 47, + 72, 157, 158, 159, 367, 160, 136, 342, 137, 343, + 626, 627, 628, 739, 908, 629, 740, 630, 741, 631, + 742, 632, 251, 405, 634, 635, 636, 637, 638, 748, + 639, 749, 138, 355, 659, 660, 661, 662, 139, 357, + 667, 668, 669, 670, 140, 356, 141, 359, 675, 676, + 677, 773, 63, 80, 287, 288, 289, 418, 290, 419, + 142, 360, 684, 685, 686, 687, 688, 689, 690, 691, + 143, 349, 642, 643, 644, 753, 49, 73, 179, 180, + 181, 373, 182, 374, 183, 375, 184, 379, 185, 378, + 573, 186, 187, 144, 354, 654, 655, 656, 762, 843, + 844, 145, 350, 57, 77, 646, 647, 648, 756, 59, + 78, 252, 253, 254, 255, 256, 257, 258, 404, 259, + 408, 260, 407, 261, 262, 409, 263, 146, 351, 650, + 651, 652, 759, 61, 79, 273, 274, 275, 276, 277, + 413, 278, 279, 280, 281, 189, 371, 720, 721, 722, + 799, 51, 74, 199, 200, 201, 384, 147, 352, 148, + 353, 192, 372, 724, 725, 726, 802, 53, 75, 214, + 215, 216, 387, 217, 218, 389, 219, 220, 193, 380, + 728, 729, 730, 805, 55, 76, 232, 233, 234, 235, + 395, 236, 396, 237, 397, 238, 398, 239, 399, 240, + 400, 241, 394, 194, 381, 732, 808, 149, 358, 672, + 673, 770, 858, 859, 860, 861, 862, 919, 150, 361, + 701, 702, 703, 784, 926, 704, 705, 785, 706, 707, + 151, 152, 363, 713, 714, 715, 791, 716, 792, 153, + 364, 65, 81, 308, 309, 310, 311, 423, 312, 424, + 313, 314, 426, 315, 316, 317, 429, 600, 318, 430, + 319, 320, 321, 322, 434, 607, 323, 435, 99, 335, + 100, 336, 101, 337, 102, 334, 67, 82, 325, 326, + 327, 438, 734, 735, 810, 898, 899, 900, 901, 937, + 902, 935, 951, 952, 953, 960, 961, 962, 967, 963, + 964, 965 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 95, 176, 156, 175, 197, 209, 227, 685, 249, 268, - 285, 304, 38, 269, 177, 711, 680, 178, 270, 179, - 852, 853, 854, 161, 191, 202, 211, 229, 856, 263, - 281, 271, 305, 31, 857, 32, 863, 33, 338, 671, - 113, 954, 89, 339, 955, 956, 957, 163, 154, 155, - 163, 283, 284, 204, 205, 206, 207, 208, 114, 115, - 30, 162, 192, 203, 212, 230, 780, 264, 282, 781, - 306, 106, 107, 108, 109, 42, 113, 243, 113, 44, - 163, 46, 364, 189, 198, 210, 228, 365, 164, 48, - 165, 50, 114, 115, 114, 115, 114, 115, 166, 167, - 168, 169, 170, 171, 106, 107, 108, 109, 113, 111, - 478, 113, 243, 172, 173, 672, 172, 52, 368, 196, - 94, 174, 242, 369, 54, 783, 114, 115, 784, 114, - 115, 785, 167, 168, 786, 170, 171, 283, 284, 114, - 115, 616, 617, 618, 619, 243, 172, 244, 245, 612, - 613, 246, 247, 248, 174, 94, 56, 671, 678, 90, - 679, 58, 114, 115, 852, 853, 854, 60, 91, 92, - 93, 382, 856, 62, 620, 86, 383, 64, 857, 705, - 863, 34, 35, 36, 37, 94, 721, 722, 633, 94, - 628, 94, 243, 94, 66, 629, 630, 631, 632, 633, - 634, 635, 636, 637, 638, 826, 385, 392, 827, 114, - 115, 386, 393, 243, 323, 113, 855, 420, 952, 114, - 115, 953, 421, 94, 867, 436, 94, 924, 925, 926, - 437, 112, 680, 114, 115, 327, 94, 691, 692, 693, - 694, 695, 696, 328, 439, 364, 439, 711, 220, 440, - 751, 752, 221, 222, 223, 224, 225, 226, 329, 94, - 706, 707, 708, 709, 908, 909, 910, 911, 95, 243, - 265, 244, 245, 266, 267, 368, 765, 330, 765, 331, - 753, 766, 895, 767, 896, 897, 114, 115, 796, 803, - 807, 436, 382, 797, 804, 808, 809, 918, 156, 337, - 479, 343, 921, 420, 480, 344, 94, 922, 923, 345, - 176, 346, 175, 385, 402, 197, 94, 347, 932, 161, - 361, 482, 209, 177, 441, 442, 178, 94, 179, 392, - 94, 367, 227, 191, 933, 939, 202, 376, 377, 969, - 940, 388, 249, 211, 970, 390, 391, 268, 584, 585, - 586, 269, 401, 229, 403, 406, 270, 162, 410, 483, - 855, 411, 412, 263, 414, 415, 304, 417, 281, 271, - 416, 192, 422, 425, 203, 427, 114, 115, 428, 431, - 481, 212, 432, 94, 594, 595, 596, 305, 433, 443, - 444, 230, 189, 445, 446, 198, 447, 448, 450, 451, - 452, 264, 210, 453, 454, 455, 282, 456, 458, 457, - 459, 460, 228, 461, 462, 463, 464, 465, 466, 467, - 468, 469, 470, 472, 471, 306, 290, 291, 292, 293, + 95, 175, 156, 174, 196, 209, 228, 698, 250, 269, + 286, 305, 666, 837, 271, 176, 838, 177, 178, 272, + 839, 841, 38, 842, 161, 190, 202, 212, 230, 848, + 264, 282, 31, 306, 32, 657, 33, 339, 284, 285, + 197, 210, 340, 365, 154, 155, 89, 765, 366, 42, + 766, 30, 162, 191, 203, 213, 231, 369, 265, 283, + 103, 307, 370, 104, 105, 86, 382, 188, 198, 211, + 229, 383, 270, 328, 385, 113, 244, 598, 599, 386, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 614, 284, 285, 114, 115, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 114, 115, 94, 243, 852, + 113, 658, 692, 244, 114, 115, 116, 117, 118, 119, + 120, 619, 44, 204, 205, 206, 207, 208, 114, 115, + 46, 244, 121, 245, 246, 122, 392, 247, 248, 249, + 112, 393, 123, 657, 664, 171, 665, 48, 114, 115, + 124, 125, 114, 115, 126, 678, 679, 680, 681, 682, + 683, 708, 709, 90, 420, 436, 50, 52, 837, 421, + 437, 838, 91, 92, 93, 839, 841, 54, 842, 113, + 34, 35, 36, 37, 848, 94, 439, 56, 113, 94, + 94, 440, 244, 693, 694, 695, 696, 114, 115, 195, + 956, 58, 94, 957, 958, 959, 114, 115, 365, 114, + 115, 94, 221, 736, 60, 62, 222, 223, 224, 225, + 226, 227, 64, 171, 666, 94, 768, 94, 66, 769, + 439, 106, 107, 108, 109, 737, 698, 324, 113, 602, + 603, 604, 605, 329, 332, 94, 369, 750, 163, 94, + 164, 738, 751, 570, 571, 572, 114, 115, 165, 166, + 167, 168, 169, 170, 771, 750, 782, 772, 330, 95, + 752, 783, 606, 171, 172, 244, 266, 245, 246, 267, + 268, 173, 891, 789, 892, 893, 793, 331, 790, 338, + 436, 794, 114, 115, 94, 795, 382, 917, 401, 156, + 420, 914, 918, 94, 385, 922, 94, 344, 392, 931, + 175, 938, 174, 932, 971, 196, 939, 811, 402, 972, + 812, 161, 209, 345, 176, 954, 177, 178, 955, 923, + 924, 925, 228, 346, 190, 441, 442, 202, 904, 905, + 906, 907, 250, 347, 212, 348, 362, 269, 368, 162, + 376, 197, 271, 94, 230, 403, 377, 272, 210, 580, + 581, 582, 191, 388, 264, 203, 305, 390, 391, 282, + 406, 412, 213, 410, 453, 414, 188, 415, 411, 198, + 416, 417, 231, 422, 425, 427, 211, 428, 306, 94, + 431, 432, 265, 433, 444, 443, 229, 283, 106, 107, + 108, 109, 445, 111, 446, 113, 244, 114, 115, 447, + 270, 448, 450, 451, 452, 458, 307, 459, 460, 454, + 455, 456, 457, 114, 115, 461, 166, 167, 462, 169, + 170, 463, 464, 465, 466, 467, 468, 469, 470, 472, + 171, 473, 471, 475, 478, 476, 479, 480, 173, 481, + 482, 484, 541, 542, 543, 485, 483, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 473, 475, 552, 553, 554, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 476, - 489, 490, 491, 492, 493, 495, 494, 496, 497, 498, - 499, 501, 503, 94, 505, 504, 506, 507, 509, 510, - 511, 512, 513, 514, 515, 156, 639, 639, 517, 518, - 647, 647, 519, 103, 520, 521, 104, 105, 522, 523, - 525, 710, 723, 304, 526, 527, 161, 529, 479, 530, - 533, 532, 480, 106, 107, 108, 109, 110, 111, 112, - 113, 534, 712, 724, 305, 536, 608, 535, 539, 482, - 537, 538, 540, 544, 545, 541, 542, 543, 114, 115, - 547, 549, 550, 558, 162, 624, 551, 555, 556, 116, - 117, 118, 119, 120, 557, 559, 560, 577, 563, 32, - 713, 725, 306, 564, 565, 121, 566, 483, 122, 567, - 568, 569, 561, 574, 570, 123, 571, 572, 573, 578, - 579, 581, 580, 124, 125, 582, 583, 126, 481, 589, - 590, 588, 591, 592, 593, 597, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 609, 610, 611, 615, - 623, 655, 946, 659, 622, 663, 667, 687, 732, 734, - 738, 758, 742, 748, 746, 759, 760, 761, 762, 770, - 677, 769, 773, 772, 775, 94, 776, 778, 779, 810, - 782, 789, 788, 790, 791, 792, 793, 794, 795, 800, - 801, 802, 813, 816, 815, 818, 819, 821, 822, 887, - 824, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 870, 871, 872, 877, 873, 874, 878, 875, - 879, 880, 883, 884, 919, 881, 886, 894, 937, 920, - 934, 942, 944, 948, 966, 639, 176, 913, 175, 647, - 943, 249, 967, 968, 268, 847, 914, 846, 269, 177, - 915, 851, 178, 270, 179, 916, 917, 285, 848, 191, - 971, 849, 263, 850, 627, 281, 271, 928, 861, 972, - 625, 929, 930, 710, 931, 935, 449, 723, 947, 654, - 973, 974, 976, 839, 197, 865, 474, 209, 869, 866, - 227, 477, 876, 841, 712, 898, 868, 192, 724, 899, - 264, 840, 941, 282, 864, 202, 862, 531, 211, 500, - 241, 229, 843, 845, 842, 524, 900, 889, 189, 844, - 890, 885, 528, 891, 888, 502, 733, 860, 546, 508, - 893, 892, 713, 516, 882, 626, 725, 730, 907, 945, - 964, 975, 0, 203, 0, 548, 212, 0, 0, 230, - 0, 0, 0, 0, 901, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 0, 0, 210, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 847, - 0, 846, 0, 0, 0, 851, 0, 0, 0, 0, - 0, 0, 848, 0, 0, 849, 0, 850, 0, 898, - 0, 0, 861, 899, 0, 0, 0, 0, 0, 0, + 304, 486, 487, 488, 156, 625, 625, 490, 492, 493, + 494, 495, 496, 498, 499, 500, 501, 502, 503, 504, + 697, 710, 305, 506, 507, 509, 161, 508, 510, 511, + 514, 512, 518, 519, 94, 515, 516, 522, 523, 521, + 524, 525, 699, 711, 306, 526, 527, 528, 529, 533, + 94, 530, 534, 536, 162, 594, 538, 539, 540, 547, + 531, 532, 544, 545, 546, 548, 549, 552, 633, 633, + 700, 712, 307, 32, 610, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 553, + 554, 555, 556, 557, 558, 567, 550, 559, 560, 561, + 562, 563, 565, 566, 575, 568, 569, 576, 574, 577, + 609, 641, 601, 645, 649, 653, 671, 674, 719, 578, + 723, 579, 727, 731, 583, 733, 743, 584, 744, 745, + 585, 586, 587, 588, 746, 589, 590, 591, 592, 593, + 595, 596, 597, 747, 608, 755, 754, 757, 758, 760, + 761, 764, 763, 796, 775, 767, 774, 776, 777, 778, + 779, 780, 781, 786, 787, 788, 801, 663, 800, 804, + 803, 806, 807, 818, 813, 809, 814, 815, 816, 820, + 822, 817, 823, 873, 819, 821, 866, 874, 879, 867, + 868, 880, 869, 870, 871, 882, 875, 883, 915, 890, + 876, 877, 921, 948, 916, 920, 909, 936, 933, 941, + 625, 175, 910, 174, 943, 911, 250, 912, 913, 269, + 832, 927, 831, 928, 271, 176, 929, 177, 178, 272, + 853, 930, 934, 286, 833, 190, 834, 835, 264, 945, + 950, 282, 968, 969, 846, 970, 973, 611, 944, 697, + 474, 974, 856, 710, 947, 949, 613, 975, 840, 196, + 449, 640, 209, 191, 824, 228, 265, 850, 976, 283, + 894, 699, 847, 633, 978, 711, 477, 188, 865, 851, + 857, 202, 270, 520, 212, 836, 845, 230, 864, 872, + 826, 825, 896, 854, 855, 197, 849, 489, 210, 700, + 940, 242, 828, 712, 827, 829, 830, 517, 491, 203, + 885, 884, 213, 889, 497, 231, 942, 887, 513, 886, + 897, 888, 863, 198, 881, 717, 211, 505, 878, 229, + 612, 903, 946, 895, 966, 977, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 535, 0, + 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 900, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 832, 0, 831, 0, 0, + 0, 853, 0, 0, 0, 0, 0, 0, 0, 833, + 0, 834, 835, 0, 0, 0, 0, 0, 894, 846, + 0, 0, 0, 856, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 840, 0, 0, 0, 0, 0, 0, + 896, 0, 0, 0, 0, 0, 0, 847, 0, 0, + 0, 857, 0, 0, 0, 0, 0, 0, 0, 0, + 836, 845, 0, 0, 854, 855, 0, 0, 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 862, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 901, 0, - 0, 860 + 0, 895 }; const short int Dhcp6Parser::yycheck_[] = { - 70, 73, 72, 73, 74, 75, 76, 568, 78, 79, - 80, 81, 16, 79, 73, 571, 567, 73, 79, 73, - 777, 777, 777, 72, 73, 74, 75, 76, 777, 78, - 79, 79, 81, 5, 777, 7, 777, 9, 3, 77, - 38, 130, 10, 8, 133, 134, 135, 7, 12, 13, - 7, 84, 85, 51, 52, 53, 54, 55, 56, 57, - 0, 72, 73, 74, 75, 76, 3, 78, 79, 6, - 81, 31, 32, 33, 34, 7, 38, 39, 38, 7, - 7, 7, 3, 73, 74, 75, 76, 8, 48, 7, - 50, 7, 56, 57, 56, 57, 56, 57, 58, 59, - 60, 61, 62, 63, 31, 32, 33, 34, 38, 36, - 72, 38, 39, 73, 74, 153, 73, 7, 3, 49, - 153, 81, 16, 8, 7, 3, 56, 57, 6, 56, - 57, 3, 59, 60, 6, 62, 63, 84, 85, 56, - 57, 123, 124, 125, 126, 39, 73, 41, 42, 120, - 121, 45, 46, 47, 81, 153, 7, 77, 78, 127, - 80, 7, 56, 57, 921, 921, 921, 7, 136, 137, - 138, 3, 921, 7, 156, 153, 8, 7, 921, 16, - 921, 153, 154, 155, 156, 153, 103, 104, 25, 153, - 16, 153, 39, 153, 7, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 3, 3, 3, 6, 56, - 57, 8, 8, 39, 128, 38, 777, 3, 3, 56, - 57, 6, 8, 153, 785, 3, 153, 94, 95, 96, - 8, 37, 783, 56, 57, 6, 153, 87, 88, 89, - 90, 91, 92, 3, 3, 3, 3, 803, 71, 8, - 8, 8, 75, 76, 77, 78, 79, 80, 4, 153, - 97, 98, 99, 100, 17, 18, 19, 20, 338, 39, - 40, 41, 42, 43, 44, 3, 3, 8, 3, 3, - 8, 8, 129, 8, 131, 132, 56, 57, 3, 3, - 3, 3, 3, 8, 8, 8, 8, 8, 368, 4, - 370, 4, 3, 3, 370, 4, 153, 8, 8, 4, - 382, 4, 382, 3, 3, 385, 153, 4, 8, 368, - 4, 370, 392, 382, 328, 329, 382, 153, 382, 3, - 153, 4, 402, 382, 8, 3, 385, 4, 4, 3, - 8, 4, 412, 392, 8, 4, 4, 417, 64, 65, - 66, 417, 8, 402, 8, 4, 417, 368, 4, 370, - 921, 8, 3, 412, 4, 4, 436, 3, 417, 417, - 8, 382, 4, 4, 385, 4, 56, 57, 4, 4, - 370, 392, 4, 153, 509, 510, 511, 436, 4, 153, - 4, 402, 382, 4, 4, 385, 4, 4, 4, 4, - 4, 412, 392, 154, 154, 154, 417, 154, 4, 154, - 4, 4, 402, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 154, 436, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 4, 4, 446, 447, 448, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 156, - 4, 4, 4, 4, 4, 156, 154, 4, 4, 4, - 4, 4, 4, 153, 4, 154, 154, 154, 4, 4, - 4, 4, 4, 4, 4, 555, 556, 557, 4, 4, - 556, 557, 154, 11, 4, 4, 14, 15, 4, 156, - 4, 571, 572, 573, 156, 156, 555, 4, 578, 4, - 4, 156, 578, 31, 32, 33, 34, 35, 36, 37, - 38, 4, 571, 572, 573, 4, 530, 154, 4, 578, - 154, 154, 4, 4, 4, 156, 156, 156, 56, 57, - 4, 4, 7, 5, 555, 549, 7, 7, 7, 67, - 68, 69, 70, 71, 7, 5, 5, 8, 153, 7, - 571, 572, 573, 5, 5, 83, 5, 578, 86, 5, - 5, 5, 461, 5, 7, 93, 7, 7, 7, 3, - 5, 153, 5, 101, 102, 153, 153, 105, 578, 5, - 7, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 122, - 5, 7, 5, 7, 153, 7, 7, 7, 4, 7, - 7, 4, 7, 7, 82, 4, 4, 4, 4, 3, - 566, 6, 3, 6, 6, 153, 3, 6, 3, 153, - 6, 3, 6, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 153, 3, 6, 6, 3, 6, 3, 3, - 8, 4, 4, 4, 4, 154, 156, 154, 156, 154, - 4, 4, 154, 154, 154, 4, 154, 154, 4, 154, - 154, 154, 4, 4, 8, 154, 6, 4, 4, 8, - 8, 4, 4, 7, 4, 765, 768, 153, 768, 765, - 154, 771, 4, 4, 774, 777, 153, 777, 774, 768, - 153, 777, 768, 774, 768, 153, 153, 787, 777, 768, - 4, 777, 771, 777, 555, 774, 774, 153, 777, 156, - 550, 153, 153, 803, 153, 153, 338, 807, 153, 557, - 154, 154, 153, 765, 814, 780, 364, 817, 789, 783, - 820, 368, 796, 770, 803, 825, 787, 768, 807, 825, - 771, 768, 921, 774, 779, 814, 777, 420, 817, 382, - 77, 820, 773, 776, 771, 412, 825, 816, 768, 774, - 817, 807, 417, 819, 814, 385, 578, 777, 436, 392, - 822, 820, 803, 402, 803, 551, 807, 573, 826, 939, - 952, 969, -1, 814, -1, 439, 817, -1, -1, 820, - -1, -1, -1, -1, 825, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 814, -1, -1, 817, -1, -1, - 820, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 921, - -1, 921, -1, -1, -1, 921, -1, -1, -1, -1, - -1, -1, 921, -1, -1, 921, -1, 921, -1, 939, - -1, -1, 921, 939, -1, -1, -1, -1, -1, -1, + 70, 73, 72, 73, 74, 75, 76, 560, 78, 79, + 80, 81, 556, 762, 79, 73, 762, 73, 73, 79, + 762, 762, 16, 762, 72, 73, 74, 75, 76, 762, + 78, 79, 5, 81, 7, 77, 9, 3, 84, 85, + 74, 75, 8, 3, 12, 13, 10, 3, 8, 7, + 6, 0, 72, 73, 74, 75, 76, 3, 78, 79, + 11, 81, 8, 14, 15, 153, 3, 73, 74, 75, + 76, 8, 79, 6, 3, 38, 39, 120, 121, 8, + 31, 32, 33, 34, 35, 36, 37, 38, 56, 57, + 16, 84, 85, 56, 57, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 56, 57, 153, 16, 72, + 38, 153, 16, 39, 56, 57, 67, 68, 69, 70, + 71, 25, 7, 51, 52, 53, 54, 55, 56, 57, + 7, 39, 83, 41, 42, 86, 3, 45, 46, 47, + 37, 8, 93, 77, 78, 73, 80, 7, 56, 57, + 101, 102, 56, 57, 105, 87, 88, 89, 90, 91, + 92, 103, 104, 127, 3, 3, 7, 7, 917, 8, + 8, 917, 136, 137, 138, 917, 917, 7, 917, 38, + 153, 154, 155, 156, 917, 153, 3, 7, 38, 153, + 153, 8, 39, 97, 98, 99, 100, 56, 57, 49, + 130, 7, 153, 133, 134, 135, 56, 57, 3, 56, + 57, 153, 71, 8, 7, 7, 75, 76, 77, 78, + 79, 80, 7, 73, 768, 153, 3, 153, 7, 6, + 3, 31, 32, 33, 34, 8, 789, 128, 38, 123, + 124, 125, 126, 3, 3, 153, 3, 3, 48, 153, + 50, 8, 8, 64, 65, 66, 56, 57, 58, 59, + 60, 61, 62, 63, 3, 3, 3, 6, 4, 339, + 8, 8, 156, 73, 74, 39, 40, 41, 42, 43, + 44, 81, 129, 3, 131, 132, 3, 8, 8, 4, + 3, 8, 56, 57, 153, 8, 3, 3, 8, 369, + 3, 8, 8, 153, 3, 8, 153, 4, 3, 8, + 382, 3, 382, 8, 3, 385, 8, 3, 3, 8, + 6, 369, 392, 4, 382, 3, 382, 382, 6, 94, + 95, 96, 402, 4, 382, 329, 330, 385, 17, 18, + 19, 20, 412, 4, 392, 4, 4, 417, 4, 369, + 4, 385, 417, 153, 402, 8, 4, 417, 392, 498, + 499, 500, 382, 4, 412, 385, 436, 4, 4, 417, + 4, 3, 392, 4, 154, 4, 382, 4, 8, 385, + 8, 3, 402, 4, 4, 4, 392, 4, 436, 153, + 4, 4, 412, 4, 4, 153, 402, 417, 31, 32, + 33, 34, 4, 36, 4, 38, 39, 56, 57, 4, + 417, 4, 4, 4, 4, 4, 436, 4, 4, 154, + 154, 154, 154, 56, 57, 4, 59, 60, 4, 62, + 63, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 73, 4, 154, 4, 4, 156, 4, 4, 81, 4, + 4, 156, 446, 447, 448, 4, 154, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 4, 4, 4, 544, 545, 546, 4, 4, 154, + 4, 154, 154, 4, 4, 4, 4, 4, 4, 4, + 560, 561, 562, 4, 4, 4, 544, 154, 4, 4, + 4, 156, 4, 4, 153, 156, 156, 4, 4, 156, + 154, 4, 560, 561, 562, 154, 154, 4, 4, 4, + 153, 156, 4, 4, 544, 519, 4, 7, 7, 5, + 156, 156, 7, 7, 7, 5, 5, 153, 545, 546, + 560, 561, 562, 7, 538, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 5, + 5, 5, 5, 5, 5, 153, 461, 7, 7, 7, + 7, 5, 5, 5, 5, 153, 153, 7, 153, 153, + 5, 7, 122, 7, 7, 7, 7, 7, 7, 153, + 7, 153, 7, 82, 153, 7, 4, 153, 4, 4, + 153, 153, 153, 153, 4, 153, 153, 153, 153, 153, + 153, 153, 153, 4, 153, 3, 6, 6, 3, 6, + 3, 3, 6, 153, 3, 6, 6, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 3, 555, 6, 3, + 6, 6, 3, 156, 4, 8, 4, 4, 4, 156, + 4, 154, 4, 4, 154, 154, 154, 4, 4, 154, + 154, 4, 154, 154, 154, 6, 154, 3, 8, 4, + 154, 154, 3, 5, 8, 8, 153, 4, 8, 4, + 750, 753, 153, 753, 4, 153, 756, 153, 153, 759, + 762, 153, 762, 153, 759, 753, 153, 753, 753, 759, + 770, 153, 153, 773, 762, 753, 762, 762, 756, 4, + 7, 759, 4, 4, 762, 4, 4, 539, 154, 789, + 365, 156, 770, 793, 153, 153, 544, 154, 762, 799, + 339, 546, 802, 753, 750, 805, 756, 765, 154, 759, + 810, 789, 762, 750, 153, 793, 369, 753, 775, 768, + 770, 799, 759, 420, 802, 762, 762, 805, 773, 782, + 755, 753, 810, 770, 770, 799, 764, 382, 802, 789, + 917, 77, 758, 793, 756, 759, 761, 417, 385, 799, + 801, 799, 802, 807, 392, 805, 921, 804, 412, 802, + 810, 805, 771, 799, 793, 562, 802, 402, 789, 805, + 540, 811, 938, 810, 954, 971, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 436, -1, + -1, -1, -1, -1, -1, -1, -1, 439, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 939, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 917, -1, 917, -1, -1, + -1, 921, -1, -1, -1, -1, -1, -1, -1, 917, + -1, 917, 917, -1, -1, -1, -1, -1, 938, 917, + -1, -1, -1, 921, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 917, -1, -1, -1, -1, -1, -1, + 938, -1, -1, -1, -1, -1, -1, 917, -1, -1, + -1, 921, -1, -1, -1, -1, -1, -1, -1, -1, + 917, 917, -1, -1, 921, 921, -1, -1, 938, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 921, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 939, -1, - -1, 921 + -1, 938 }; const unsigned short int @@ -4126,98 +4126,98 @@ namespace isc { namespace dhcp { 0, 5, 7, 9, 153, 154, 155, 156, 173, 174, 175, 180, 7, 189, 7, 195, 7, 206, 7, 283, 7, 358, 7, 374, 7, 391, 7, 310, 7, 316, - 7, 340, 7, 259, 7, 447, 7, 482, 181, 176, + 7, 340, 7, 259, 7, 448, 7, 483, 181, 176, 190, 196, 207, 284, 359, 375, 392, 311, 317, 341, - 260, 448, 483, 173, 182, 183, 153, 178, 179, 10, - 127, 136, 137, 138, 153, 188, 191, 192, 193, 474, - 476, 478, 480, 11, 14, 15, 31, 32, 33, 34, + 260, 449, 484, 173, 182, 183, 153, 178, 179, 10, + 127, 136, 137, 138, 153, 188, 191, 192, 193, 475, + 477, 479, 481, 11, 14, 15, 31, 32, 33, 34, 35, 36, 37, 38, 56, 57, 67, 68, 69, 70, 71, 83, 86, 93, 101, 102, 105, 188, 197, 198, 199, 200, 201, 202, 203, 204, 213, 215, 239, 245, 251, 253, 267, 277, 300, 308, 334, 364, 366, 414, - 424, 436, 437, 445, 12, 13, 188, 208, 209, 210, - 212, 364, 366, 7, 48, 50, 58, 59, 60, 61, - 62, 63, 73, 74, 81, 188, 199, 200, 201, 202, - 285, 286, 287, 289, 291, 293, 295, 298, 299, 334, - 352, 364, 366, 368, 385, 410, 49, 188, 334, 360, + 425, 437, 438, 446, 12, 13, 188, 208, 209, 210, + 212, 364, 366, 48, 50, 58, 59, 60, 61, 62, + 63, 73, 74, 81, 188, 199, 200, 201, 202, 285, + 286, 287, 289, 291, 293, 295, 298, 299, 334, 352, + 364, 366, 368, 385, 410, 49, 188, 293, 334, 360, 361, 362, 364, 366, 51, 52, 53, 54, 55, 188, - 334, 364, 366, 376, 377, 378, 380, 381, 383, 384, - 71, 75, 76, 77, 78, 79, 80, 188, 334, 364, - 366, 393, 394, 395, 396, 398, 400, 402, 404, 406, - 408, 308, 16, 39, 41, 42, 45, 46, 47, 188, - 229, 318, 319, 320, 321, 322, 323, 324, 326, 328, - 330, 331, 333, 364, 366, 40, 43, 44, 188, 229, - 322, 328, 342, 343, 344, 345, 346, 348, 349, 350, - 351, 364, 366, 84, 85, 188, 261, 262, 263, 265, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 188, 364, 366, 449, 450, 451, - 452, 454, 456, 457, 459, 460, 461, 464, 466, 467, - 468, 469, 472, 128, 484, 485, 486, 6, 3, 4, - 8, 3, 194, 481, 475, 477, 479, 4, 3, 8, - 205, 214, 216, 4, 4, 4, 4, 4, 278, 309, - 335, 365, 367, 301, 240, 252, 246, 415, 254, 268, - 425, 4, 438, 446, 3, 8, 211, 4, 3, 8, - 417, 353, 369, 288, 290, 292, 4, 4, 296, 294, + 293, 334, 364, 366, 376, 377, 378, 380, 381, 383, + 384, 71, 75, 76, 77, 78, 79, 80, 188, 334, + 364, 366, 393, 394, 395, 396, 398, 400, 402, 404, + 406, 408, 308, 16, 39, 41, 42, 45, 46, 47, + 188, 229, 318, 319, 320, 321, 322, 323, 324, 326, + 328, 330, 331, 333, 364, 366, 40, 43, 44, 188, + 229, 322, 328, 342, 343, 344, 345, 346, 348, 349, + 350, 351, 364, 366, 84, 85, 188, 261, 262, 263, + 265, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 188, 364, 366, 450, 451, + 452, 453, 455, 457, 458, 460, 461, 462, 465, 467, + 468, 469, 470, 473, 128, 485, 486, 487, 6, 3, + 4, 8, 3, 194, 482, 476, 478, 480, 4, 3, + 8, 205, 214, 216, 4, 4, 4, 4, 4, 278, + 309, 335, 365, 367, 301, 240, 252, 246, 415, 254, + 268, 426, 4, 439, 447, 3, 8, 211, 4, 3, + 8, 353, 369, 288, 290, 292, 4, 4, 296, 294, 386, 411, 3, 8, 363, 3, 8, 379, 4, 382, 4, 4, 3, 8, 409, 397, 399, 401, 403, 405, 407, 8, 3, 8, 325, 230, 4, 329, 327, 332, 4, 8, 3, 347, 4, 4, 8, 3, 264, 266, - 3, 8, 4, 453, 455, 4, 458, 4, 4, 462, - 465, 4, 4, 4, 470, 473, 3, 8, 487, 3, + 3, 8, 4, 454, 456, 4, 459, 4, 4, 463, + 466, 4, 4, 4, 471, 474, 3, 8, 488, 3, 8, 173, 173, 153, 4, 4, 4, 4, 4, 192, 4, 4, 4, 154, 154, 154, 154, 154, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 154, 4, 4, 198, 4, 156, 209, 72, 188, - 229, 334, 364, 366, 418, 419, 420, 421, 422, 4, - 4, 4, 4, 4, 154, 156, 4, 4, 4, 4, - 286, 4, 361, 4, 154, 4, 154, 154, 377, 4, - 4, 4, 4, 4, 4, 4, 395, 4, 4, 154, - 4, 4, 4, 156, 320, 4, 156, 156, 344, 4, - 4, 262, 156, 4, 4, 154, 4, 154, 154, 4, - 4, 156, 156, 156, 4, 4, 450, 4, 485, 4, - 7, 7, 173, 173, 173, 7, 7, 7, 5, 5, - 5, 175, 177, 153, 5, 5, 5, 5, 5, 5, - 7, 7, 7, 7, 5, 184, 423, 8, 3, 5, - 5, 153, 153, 153, 64, 65, 66, 297, 153, 5, - 7, 153, 153, 153, 184, 184, 184, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 173, 153, - 153, 153, 120, 121, 463, 122, 123, 124, 125, 126, - 156, 471, 153, 5, 173, 197, 484, 208, 16, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 188, - 217, 218, 219, 222, 224, 226, 228, 229, 231, 232, - 233, 234, 235, 237, 217, 7, 279, 280, 281, 7, - 312, 313, 314, 7, 336, 337, 338, 7, 302, 303, - 304, 77, 153, 241, 242, 243, 244, 182, 78, 80, - 243, 247, 248, 249, 250, 293, 416, 7, 255, 256, - 257, 87, 88, 89, 90, 91, 92, 269, 270, 271, - 272, 273, 274, 275, 276, 16, 97, 98, 99, 100, - 188, 231, 364, 366, 426, 427, 428, 431, 432, 434, - 435, 103, 104, 188, 364, 366, 439, 440, 441, 443, - 449, 185, 4, 420, 7, 354, 355, 356, 7, 370, - 371, 372, 7, 387, 388, 389, 82, 412, 7, 488, - 489, 8, 8, 8, 220, 223, 225, 227, 4, 4, - 4, 4, 4, 236, 238, 3, 8, 8, 282, 6, - 3, 315, 6, 3, 339, 6, 3, 305, 6, 3, - 3, 6, 6, 3, 6, 3, 6, 258, 6, 3, - 4, 4, 4, 4, 4, 4, 3, 8, 429, 433, - 4, 4, 4, 3, 8, 442, 444, 3, 8, 8, - 153, 186, 187, 153, 357, 6, 3, 373, 6, 3, - 390, 6, 3, 413, 8, 490, 3, 6, 4, 4, - 4, 4, 154, 156, 154, 156, 154, 4, 4, 218, - 285, 281, 318, 314, 342, 338, 188, 199, 200, 201, - 202, 229, 277, 289, 291, 293, 295, 299, 306, 307, - 334, 364, 366, 410, 304, 242, 248, 293, 261, 257, - 154, 154, 154, 154, 154, 154, 270, 4, 4, 154, - 154, 154, 427, 4, 4, 440, 6, 3, 360, 356, - 376, 372, 393, 389, 4, 129, 131, 132, 188, 229, - 364, 366, 491, 492, 493, 494, 496, 489, 17, 18, - 19, 20, 221, 153, 153, 153, 153, 153, 8, 8, - 8, 3, 8, 8, 94, 95, 96, 430, 153, 153, - 153, 153, 8, 8, 8, 153, 497, 4, 495, 3, - 8, 307, 4, 154, 4, 492, 5, 153, 7, 498, - 499, 500, 3, 6, 130, 133, 134, 135, 501, 502, - 503, 505, 506, 507, 499, 504, 4, 4, 4, 3, - 8, 4, 156, 154, 154, 502, 153 + 4, 154, 4, 4, 198, 4, 156, 209, 4, 4, + 4, 4, 4, 154, 156, 4, 4, 4, 4, 286, + 4, 361, 4, 154, 4, 154, 154, 377, 4, 4, + 4, 4, 4, 4, 4, 395, 4, 4, 154, 4, + 4, 4, 156, 320, 4, 156, 156, 344, 4, 4, + 262, 156, 4, 4, 154, 4, 154, 154, 4, 4, + 156, 156, 156, 4, 4, 451, 4, 486, 4, 7, + 7, 173, 173, 173, 7, 7, 7, 5, 5, 5, + 175, 177, 153, 5, 5, 5, 5, 5, 5, 7, + 7, 7, 7, 5, 184, 5, 5, 153, 153, 153, + 64, 65, 66, 297, 153, 5, 7, 153, 153, 153, + 184, 184, 184, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 173, 153, 153, 153, 120, 121, + 464, 122, 123, 124, 125, 126, 156, 472, 153, 5, + 173, 197, 485, 208, 16, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 188, 217, 218, 219, 222, + 224, 226, 228, 229, 231, 232, 233, 234, 235, 237, + 217, 7, 279, 280, 281, 7, 312, 313, 314, 7, + 336, 337, 338, 7, 302, 303, 304, 77, 153, 241, + 242, 243, 244, 182, 78, 80, 243, 247, 248, 249, + 250, 7, 416, 417, 7, 255, 256, 257, 87, 88, + 89, 90, 91, 92, 269, 270, 271, 272, 273, 274, + 275, 276, 16, 97, 98, 99, 100, 188, 231, 364, + 366, 427, 428, 429, 432, 433, 435, 436, 103, 104, + 188, 364, 366, 440, 441, 442, 444, 450, 185, 7, + 354, 355, 356, 7, 370, 371, 372, 7, 387, 388, + 389, 82, 412, 7, 489, 490, 8, 8, 8, 220, + 223, 225, 227, 4, 4, 4, 4, 4, 236, 238, + 3, 8, 8, 282, 6, 3, 315, 6, 3, 339, + 6, 3, 305, 6, 3, 3, 6, 6, 3, 6, + 418, 3, 6, 258, 6, 3, 4, 4, 4, 4, + 4, 4, 3, 8, 430, 434, 4, 4, 4, 3, + 8, 443, 445, 3, 8, 8, 153, 186, 187, 357, + 6, 3, 373, 6, 3, 390, 6, 3, 413, 8, + 491, 3, 6, 4, 4, 4, 4, 154, 156, 154, + 156, 154, 4, 4, 218, 285, 281, 318, 314, 342, + 338, 188, 199, 200, 201, 202, 229, 277, 289, 291, + 293, 295, 299, 306, 307, 334, 364, 366, 410, 304, + 242, 248, 72, 188, 229, 334, 364, 366, 419, 420, + 421, 422, 423, 417, 261, 257, 154, 154, 154, 154, + 154, 154, 270, 4, 4, 154, 154, 154, 428, 4, + 4, 441, 6, 3, 360, 356, 376, 372, 393, 389, + 4, 129, 131, 132, 188, 229, 364, 366, 492, 493, + 494, 495, 497, 490, 17, 18, 19, 20, 221, 153, + 153, 153, 153, 153, 8, 8, 8, 3, 8, 424, + 8, 3, 8, 94, 95, 96, 431, 153, 153, 153, + 153, 8, 8, 8, 153, 498, 4, 496, 3, 8, + 307, 4, 421, 4, 154, 4, 493, 153, 5, 153, + 7, 499, 500, 501, 3, 6, 130, 133, 134, 135, + 502, 503, 504, 506, 507, 508, 500, 505, 4, 4, + 4, 3, 8, 4, 156, 154, 154, 503, 153 }; const unsigned short int @@ -4260,30 +4260,30 @@ namespace isc { namespace dhcp { 344, 344, 344, 344, 344, 344, 344, 344, 345, 347, 346, 348, 349, 350, 351, 353, 352, 354, 354, 355, 355, 357, 356, 359, 358, 360, 360, 361, 361, 361, - 361, 361, 363, 362, 365, 364, 367, 366, 369, 368, - 370, 370, 371, 371, 373, 372, 375, 374, 376, 376, - 377, 377, 377, 377, 377, 377, 377, 377, 377, 379, - 378, 380, 382, 381, 383, 384, 386, 385, 387, 387, - 388, 388, 390, 389, 392, 391, 393, 393, 394, 394, - 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, - 395, 397, 396, 399, 398, 401, 400, 403, 402, 405, - 404, 407, 406, 409, 408, 411, 410, 413, 412, 415, - 414, 416, 416, 417, 293, 418, 418, 419, 419, 420, - 420, 420, 420, 420, 420, 421, 423, 422, 425, 424, - 426, 426, 427, 427, 427, 427, 427, 427, 427, 427, - 427, 429, 428, 430, 430, 430, 431, 433, 432, 434, - 435, 436, 438, 437, 439, 439, 440, 440, 440, 440, - 440, 442, 441, 444, 443, 446, 445, 448, 447, 449, - 449, 450, 450, 450, 450, 450, 450, 450, 450, 450, - 450, 450, 450, 450, 450, 450, 450, 450, 451, 453, - 452, 455, 454, 456, 458, 457, 459, 460, 462, 461, - 463, 463, 465, 464, 466, 467, 468, 470, 469, 471, - 471, 471, 471, 471, 473, 472, 475, 474, 477, 476, - 479, 478, 481, 480, 483, 482, 484, 484, 485, 487, - 486, 488, 488, 490, 489, 491, 491, 492, 492, 492, - 492, 492, 492, 492, 493, 495, 494, 497, 496, 498, - 498, 500, 499, 501, 501, 502, 502, 502, 502, 504, - 503, 505, 506, 507 + 361, 361, 361, 363, 362, 365, 364, 367, 366, 369, + 368, 370, 370, 371, 371, 373, 372, 375, 374, 376, + 376, 377, 377, 377, 377, 377, 377, 377, 377, 377, + 377, 379, 378, 380, 382, 381, 383, 384, 386, 385, + 387, 387, 388, 388, 390, 389, 392, 391, 393, 393, + 394, 394, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 397, 396, 399, 398, 401, 400, 403, + 402, 405, 404, 407, 406, 409, 408, 411, 410, 413, + 412, 415, 414, 416, 416, 418, 417, 419, 419, 420, + 420, 421, 421, 421, 421, 421, 421, 422, 424, 423, + 426, 425, 427, 427, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 430, 429, 431, 431, 431, 432, 434, + 433, 435, 436, 437, 439, 438, 440, 440, 441, 441, + 441, 441, 441, 443, 442, 445, 444, 447, 446, 449, + 448, 450, 450, 451, 451, 451, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, + 452, 454, 453, 456, 455, 457, 459, 458, 460, 461, + 463, 462, 464, 464, 466, 465, 467, 468, 469, 471, + 470, 472, 472, 472, 472, 472, 474, 473, 476, 475, + 478, 477, 480, 479, 482, 481, 484, 483, 485, 485, + 486, 488, 487, 489, 489, 491, 490, 492, 492, 493, + 493, 493, 493, 493, 493, 493, 494, 496, 495, 498, + 497, 499, 499, 501, 500, 502, 502, 503, 503, 503, + 503, 505, 504, 506, 507, 508 }; const unsigned char @@ -4326,30 +4326,30 @@ namespace isc { namespace dhcp { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, - 1, 1, 0, 4, 0, 4, 0, 4, 0, 6, - 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 4, 3, 0, 4, 3, 3, 0, 6, 0, 1, - 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 6, 0, 4, 0, - 6, 1, 3, 0, 4, 0, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 0, 4, 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, 0, 4, 1, + 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, + 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 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, 3, 0, 4, 1, - 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, - 0, 4, 0, 6, 0, 4, 1, 3, 1, 0, + 1, 0, 4, 3, 0, 4, 3, 3, 0, 6, + 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, + 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 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, 0, + 4, 1, 3, 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, 3, 0, + 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, + 1, 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, 1, 1, 3, 0, 4, 0, 6, 1, - 3, 0, 4, 1, 3, 1, 1, 1, 1, 0, - 4, 3, 3, 3 + 1, 0, 4, 3, 3, 3 }; @@ -4465,28 +4465,29 @@ namespace isc { namespace dhcp { "$@78", "prefixes", "$@79", "duid", "$@80", "hw_address", "$@81", "hostname", "$@82", "flex_id_value", "$@83", "reservation_client_classes", "$@84", "relay", "$@85", "relay_map", - "$@86", "client_classes", "$@87", "client_classes_list", "$@88", - "client_class_params", "not_empty_client_class_params", - "client_class_param", "client_class_name", "client_class_test", "$@89", - "server_id", "$@90", "server_id_params", "server_id_param", - "server_id_type", "$@91", "duid_type", "htype", "identifier", "$@92", - "time", "enterprise_id", "dhcp4o6_port", "control_socket", "$@93", - "control_socket_params", "control_socket_param", "socket_type", "$@94", - "socket_name", "$@95", "dhcp_ddns", "$@96", "sub_dhcp_ddns", "$@97", - "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@98", "server_ip", "$@99", "server_port", - "sender_ip", "$@100", "sender_port", "max_queue_size", "ncr_protocol", - "$@101", "ncr_protocol_value", "ncr_format", "$@102", - "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@103", "replace_client_name_value", - "generated_prefix", "$@104", "dhcp4_json_object", "$@105", - "dhcpddns_json_object", "$@106", "control_agent_json_object", "$@107", - "logging_object", "$@108", "sub_logging", "$@109", "logging_params", - "logging_param", "loggers", "$@110", "loggers_entries", "logger_entry", - "$@111", "logger_params", "logger_param", "debuglevel", "severity", - "$@112", "output_options_list", "$@113", "output_options_list_content", - "output_entry", "$@114", "output_params_list", "output_params", "output", - "$@115", "flush", "maxsize", "maxver", YY_NULLPTR + "$@86", "client_classes", "$@87", "client_classes_list", + "client_class_entry", "$@88", "client_class_params", + "not_empty_client_class_params", "client_class_param", + "client_class_name", "client_class_test", "$@89", "server_id", "$@90", + "server_id_params", "server_id_param", "server_id_type", "$@91", + "duid_type", "htype", "identifier", "$@92", "time", "enterprise_id", + "dhcp4o6_port", "control_socket", "$@93", "control_socket_params", + "control_socket_param", "socket_type", "$@94", "socket_name", "$@95", + "dhcp_ddns", "$@96", "sub_dhcp_ddns", "$@97", "dhcp_ddns_params", + "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@98", + "server_ip", "$@99", "server_port", "sender_ip", "$@100", "sender_port", + "max_queue_size", "ncr_protocol", "$@101", "ncr_protocol_value", + "ncr_format", "$@102", "always_include_fqdn", "override_no_update", + "override_client_update", "replace_client_name", "$@103", + "replace_client_name_value", "generated_prefix", "$@104", + "dhcp4_json_object", "$@105", "dhcpddns_json_object", "$@106", + "control_agent_json_object", "$@107", "logging_object", "$@108", + "sub_logging", "$@109", "logging_params", "logging_param", "loggers", + "$@110", "loggers_entries", "logger_entry", "$@111", "logger_params", + "logger_param", "debuglevel", "severity", "$@112", "output_options_list", + "$@113", "output_options_list_content", "output_entry", "$@114", + "output_params_list", "output_params", "output", "$@115", "flush", + "maxsize", "maxver", YY_NULLPTR }; #if PARSER6_DEBUG @@ -4530,30 +4531,30 @@ namespace isc { namespace dhcp { 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1238, 1240, 1240, 1248, 1250, 1252, 1257, 1265, 1265, 1277, 1278, 1281, 1282, 1285, 1285, 1295, 1295, 1304, 1305, 1308, 1309, 1310, - 1311, 1312, 1315, 1315, 1323, 1323, 1348, 1348, 1378, 1378, - 1390, 1391, 1394, 1395, 1398, 1398, 1410, 1410, 1422, 1423, - 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1437, - 1437, 1445, 1450, 1450, 1458, 1463, 1471, 1471, 1481, 1482, - 1485, 1486, 1489, 1489, 1498, 1498, 1507, 1508, 1511, 1512, - 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, - 1526, 1529, 1529, 1539, 1539, 1549, 1549, 1557, 1557, 1565, - 1565, 1573, 1573, 1581, 1581, 1594, 1594, 1604, 1604, 1615, - 1615, 1625, 1626, 1629, 1629, 1639, 1640, 1643, 1644, 1647, - 1648, 1649, 1650, 1651, 1652, 1655, 1657, 1657, 1668, 1668, - 1680, 1681, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, - 1692, 1695, 1695, 1702, 1703, 1704, 1707, 1712, 1712, 1720, - 1725, 1732, 1739, 1739, 1749, 1750, 1753, 1754, 1755, 1756, - 1757, 1760, 1760, 1768, 1768, 1778, 1778, 1790, 1790, 1800, - 1801, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, - 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1823, 1828, - 1828, 1836, 1836, 1844, 1849, 1849, 1857, 1862, 1867, 1867, - 1875, 1876, 1879, 1879, 1887, 1892, 1897, 1902, 1902, 1910, - 1913, 1916, 1919, 1922, 1928, 1928, 1938, 1938, 1945, 1945, - 1952, 1952, 1965, 1965, 1975, 1975, 1986, 1987, 1991, 1995, - 1995, 2007, 2008, 2012, 2012, 2020, 2021, 2024, 2025, 2026, - 2027, 2028, 2029, 2030, 2033, 2038, 2038, 2046, 2046, 2056, - 2057, 2060, 2060, 2068, 2069, 2072, 2073, 2074, 2075, 2078, - 2078, 2086, 2091, 2096 + 1311, 1312, 1313, 1316, 1316, 1324, 1324, 1349, 1349, 1379, + 1379, 1391, 1392, 1395, 1396, 1399, 1399, 1411, 1411, 1423, + 1424, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, + 1436, 1439, 1439, 1447, 1452, 1452, 1460, 1465, 1473, 1473, + 1483, 1484, 1487, 1488, 1491, 1491, 1500, 1500, 1509, 1510, + 1513, 1514, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, + 1526, 1527, 1528, 1531, 1531, 1541, 1541, 1551, 1551, 1559, + 1559, 1567, 1567, 1575, 1575, 1583, 1583, 1596, 1596, 1606, + 1606, 1617, 1617, 1627, 1628, 1631, 1631, 1641, 1642, 1645, + 1646, 1649, 1650, 1651, 1652, 1653, 1654, 1657, 1659, 1659, + 1670, 1670, 1682, 1683, 1686, 1687, 1688, 1689, 1690, 1691, + 1692, 1693, 1694, 1697, 1697, 1704, 1705, 1706, 1709, 1714, + 1714, 1722, 1727, 1734, 1741, 1741, 1751, 1752, 1755, 1756, + 1757, 1758, 1759, 1762, 1762, 1770, 1770, 1780, 1780, 1792, + 1792, 1802, 1803, 1806, 1807, 1808, 1809, 1810, 1811, 1812, + 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, + 1825, 1830, 1830, 1838, 1838, 1846, 1851, 1851, 1859, 1864, + 1869, 1869, 1877, 1878, 1881, 1881, 1889, 1894, 1899, 1904, + 1904, 1912, 1915, 1918, 1921, 1924, 1930, 1930, 1940, 1940, + 1947, 1947, 1954, 1954, 1967, 1967, 1977, 1977, 1988, 1989, + 1993, 1997, 1997, 2009, 2010, 2014, 2014, 2022, 2023, 2026, + 2027, 2028, 2029, 2030, 2031, 2032, 2035, 2040, 2040, 2048, + 2048, 2058, 2059, 2062, 2062, 2070, 2071, 2074, 2075, 2076, + 2077, 2080, 2080, 2088, 2093, 2098 }; // Print the state stack on the debug stream. @@ -4588,8 +4589,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4592 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2101 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4593 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2103 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index 0d951f91c4..9634f42983 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -1441,7 +1441,7 @@ namespace isc { namespace dhcp { { yyeof_ = 0, yylast_ = 931, ///< Last index in yytable_. - yynnts_ = 351, ///< Number of nonterminal symbols. + yynnts_ = 352, ///< Number of nonterminal symbols. yyfinal_ = 30, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, @@ -1542,9 +1542,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (other.value); break; @@ -1585,9 +1585,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.copy< ElementPtr > (v); break; @@ -1687,9 +1687,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.template destroy< ElementPtr > (); break; @@ -1736,9 +1736,9 @@ namespace isc { namespace dhcp { case 177: // map_value case 221: // db_type case 297: // hr_mode - case 430: // duid_type - case 463: // ncr_protocol_value - case 471: // replace_client_name_value + case 431: // duid_type + case 464: // ncr_protocol_value + case 472: // replace_client_name_value value.move< ElementPtr > (s.value); break; diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 15c0e8ebb5..5fd8df6db6 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1307,6 +1307,7 @@ pool_params: pool_param pool_param: pool_entry | option_data_list + | client_class | user_context | comment | unknown_map_entry @@ -1427,6 +1428,7 @@ pd_pool_param: pd_prefix | pd_prefix_len | pd_delegated_len | option_data_list + | client_class | excluded_prefix | excluded_prefix_len | user_context @@ -1622,11 +1624,11 @@ client_classes: CLIENT_CLASSES { ctx.leave(); }; -client_classes_list: client_class - | client_classes_list COMMA client_class +client_classes_list: client_class_entry + | client_classes_list COMMA client_class_entry ; -client_class: LCURLY_BRACKET { +client_class_entry: LCURLY_BRACKET { ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index 7c04bc773c..2e2812ac18 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index 64a77fb106..fa6f9d4722 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index c8bcff3852..ee6210af0f 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201712311009 +// Generated 201801182315 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index 3ab0a9c2cf..b63a297c54 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -176,6 +176,17 @@ public: } } + /// @brief Create a solicit + Pkt6Ptr createSolicit(std::string remote_addr = "fe80::abcd") { + OptionPtr clientid = generateClientId(); + Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); + query->setRemoteAddr(IOAddress(remote_addr)); + query->addOption(clientid); + query->setIface("eth1"); + query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + return (query); + } + /// @brief Interface Manager's fake configuration control. IfaceMgrTestConfig iface_mgr_test_config_; }; @@ -244,22 +255,9 @@ TEST_F(ClassifyTest, matchClassification) { ASSERT_NO_THROW(configure(config)); // Create packets with enough to select the subnet - OptionPtr clientid = generateClientId(); - Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234)); - query1->setRemoteAddr(IOAddress("fe80::abcd")); - query1->addOption(clientid); - query1->setIface("eth1"); - query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); - Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234)); - query2->setRemoteAddr(IOAddress("fe80::abcd")); - query2->addOption(clientid); - query2->setIface("eth1"); - query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234)); - query3->setRemoteAddr(IOAddress("fe80::abcd")); - query3->addOption(clientid); - query3->setIface("eth1"); - query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000)); + Pkt6Ptr query1 = createSolicit(); + Pkt6Ptr query2 = createSolicit(); + Pkt6Ptr query3 = createSolicit(); // Create and add an ORO option to the first 2 queries OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -341,12 +339,7 @@ TEST_F(ClassifyTest, subnetClassPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -413,12 +406,7 @@ TEST_F(ClassifyTest, subnetGlobalPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -482,12 +470,7 @@ TEST_F(ClassifyTest, classGlobalPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -558,12 +541,7 @@ TEST_F(ClassifyTest, classGlobalPersistency) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Do not add an ORO. OptionPtr oro = query->getOption(D6O_ORO); @@ -620,11 +598,7 @@ TEST_F(ClassifyTest, clientClassifySubnet) { ASSERT_NO_THROW(configure(config)); - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // This discover does not belong to foo class, so it will not // be serviced @@ -647,17 +621,92 @@ TEST_F(ClassifyTest, clientClassifySubnet) { EXPECT_FALSE(drop); } +// Checks if the client-class field is indeed used for pool selection. +TEST_F(ClassifyTest, clientClassifyPool) { + IfaceMgrTestConfig test_config(true); + + NakedDhcpv6Srv srv(0); + + // This test configures 2 pools. + // The second pool does not play any role here. The client's + // IP address belongs to the first pool, so only that first + // pool is being tested. + std::string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"client-classes\": [ " + " { " + " \"name\": \"foo\" " + " }, " + " { " + " \"name\": \"bar\" " + " } " + "], " + "\"subnet6\": [ " + " { \"pools\": [ " + " { " + " \"pool\": \"2001:db8:1::/64\", " + " \"client-class\": \"foo\" " + " }, " + " { " + " \"pool\": \"2001:db8:2::/64\", " + " \"client-class\": \"xyzzy\" " + " } " + " ], " + " \"subnet\": \"2001:db8:2::/40\" " + " } " + "], " + "\"valid-lifetime\": 4000 }"; + + ASSERT_NO_THROW(configure(config)); + + Pkt6Ptr query1 = createSolicit("2001:db8:1::3"); + Pkt6Ptr query2 = createSolicit("2001:db8:1::3"); + Pkt6Ptr query3 = createSolicit("2001:db8:1::3"); + + // This discover does not belong to foo class, so it will not + // be serviced + srv.classifyPacket(query1); + Pkt6Ptr response1 = srv.processSolicit(query1); + ASSERT_TRUE(response1); + OptionPtr ia_na1 = response1->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na1); + EXPECT_TRUE(ia_na1->getOption(D6O_STATUS_CODE)); + EXPECT_FALSE(ia_na1->getOption(D6O_IAADDR)); + + // Let's add the packet to bar class and try again. + query2->addClass("bar"); + // Still not supported, because it belongs to wrong class. + srv.classifyPacket(query2); + Pkt6Ptr response2 = srv.processSolicit(query2); + ASSERT_TRUE(response2); + OptionPtr ia_na2 = response2->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na2); + EXPECT_TRUE(ia_na2->getOption(D6O_STATUS_CODE)); + EXPECT_FALSE(ia_na2->getOption(D6O_IAADDR)); + + // Let's add it to matching class. + query3->addClass("foo"); + // This time it should work + srv.classifyPacket(query3); + Pkt6Ptr response3 = srv.processSolicit(query3); + ASSERT_TRUE(response3); + OptionPtr ia_na3 = response3->getOption(D6O_IA_NA); + ASSERT_TRUE(ia_na3); + EXPECT_FALSE(ia_na3->getOption(D6O_STATUS_CODE)); + EXPECT_TRUE(ia_na3->getOption(D6O_IAADDR)); +} + // Tests whether a packet with custom vendor-class (not erouter or docsis) // is classified properly. TEST_F(ClassifyTest, vendorClientClassification2) { NakedDhcpv6Srv srv(0); // Let's create a SOLICIT. - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // Now let's add a vendor-class with id=1234 and content "foo" OptionVendorClassPtr vendor_class(new OptionVendorClass(Option::V6, 1234)); @@ -720,11 +769,7 @@ TEST_F(ClassifyTest, relayOverrideAndClientClass) { ASSERT_TRUE(subnet1); ASSERT_TRUE(subnet2); - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // Now pretend the packet came via one relay. Pkt6::RelayInfo relay; diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index fd18d54435..ead3a0d958 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -4211,6 +4211,194 @@ TEST_F(Dhcp6ParserTest, classifySubnets) { EXPECT_TRUE (subnets->at(3)->clientSupported(classes)); } +// Goal of this test is to verify that multiple pools can be configured +// with defined client classes. +TEST_F(Dhcp6ParserTest, classifyPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { " + " \"pool\": \"2001:db8:1::/80\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"pool\": \"2001:db8:2::/80\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"pool\": \"2001:db8:3::/80\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"pool\": \"2001:db8:4::/80\" " + " } ]," + " \"subnet\": \"2001:db8:0::/40\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP6(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); + checkResult(x, 0); + + const Subnet6Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_NA); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE (pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); +} + +// Goal of this test is to verify that multiple pdpools can be configured +// with defined client classes. +TEST_F(Dhcp6ParserTest, classifyPdPools) { + ConstElementPtr x; + string config = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pd-pools\": [ { " + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:1::\", " + " \"client-class\": \"alpha\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:2::\", " + " \"client-class\": \"beta\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:3::\", " + " \"client-class\": \"gamma\" " + " }," + " {" + " \"prefix-len\": 48, " + " \"delegated-len\": 64, " + " \"prefix\": \"2001:db8:4::\" " + " } ]," + " \"subnet\": \"2001:db8::/64\" " + " } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP6(config, true)); + extractConfig(config); + + EXPECT_NO_THROW(x = configureDhcp6Server(srv_, json)); + checkResult(x, 0); + + const Subnet6Collection* subnets = + CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll(); + ASSERT_TRUE(subnets); + ASSERT_EQ(1, subnets->size()); + const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_PD); + ASSERT_EQ(4, pools.size()); // We expect 4 pools + + // Let's check if client belonging to alpha class is supported in pool[0] + // and not supported in any other pool (except pool[3], which allows + // everyone). + ClientClasses classes; + classes.insert("alpha"); + EXPECT_TRUE (pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to beta class is supported in pool[1] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("beta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_TRUE (pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to gamma class is supported in pool[2] + // and not supported in any other pool (except pool[3], which allows + // everyone). + classes.clear(); + classes.insert("gamma"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_TRUE (pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Let's check if client belonging to some other class (not mentioned in + // the config) is supported only in pool[3], which allows everyone. + classes.clear(); + classes.insert("delta"); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); + + // Finally, let's check class-less client. He should be allowed only in + // the last pool, which does not have any class restrictions. + classes.clear(); + EXPECT_FALSE(pools.at(0)->clientSupported(classes)); + EXPECT_FALSE(pools.at(1)->clientSupported(classes)); + EXPECT_FALSE(pools.at(2)->clientSupported(classes)); + EXPECT_TRUE (pools.at(3)->clientSupported(classes)); +} + // This test checks the ability of the server to parse a configuration // containing a full, valid dhcp-ddns (D2ClientConfig) entry. TEST_F(Dhcp6ParserTest, d2ClientConfig) { diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index ec436977f0..1759c8373b 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -1017,6 +1017,80 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 32 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"preferred-lifetime\": 3000,\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet6\": [\n" +" {\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"pool\": \"2001:db8:1::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"pool\": \"2001:db8:2::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"pool\": \"2001:db8:3::/80\"\n" +" },\n" +" {\n" +" \"pool\": \"2001:db8:4::/80\"\n" +" }\n" +" ],\n" +" \"subnet\": \"2001:db8:0::/40\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 33 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"preferred-lifetime\": 3000,\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"subnet6\": [\n" +" {\n" +" \"pd-pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:1::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:2::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:3::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"delegated-len\": 64,\n" +" \"prefix\": \"2001:db8:4::\",\n" +" \"prefix-len\": 48\n" +" }\n" +" ],\n" +" \"subnet\": \"2001:db8::/64\"\n" +" }\n" +" ],\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 34 +"{\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" @@ -1052,7 +1126,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 33 + // CONFIGURATION 35 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1139,7 +1213,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 34 + // CONFIGURATION 36 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1179,7 +1253,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 35 + // CONFIGURATION 37 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1192,7 +1266,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 36 + // CONFIGURATION 38 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1205,7 +1279,7 @@ const char* EXTRACTED_CONFIGS[] = { " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 37 + // CONFIGURATION 39 "{\n" " \"preferred-lifetime\": 3000,\n" " \"rebind-timer\": 2000,\n" @@ -1249,7 +1323,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 38 + // CONFIGURATION 40 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1261,25 +1335,25 @@ const char* EXTRACTED_CONFIGS[] = { " \"renew-timer\": 1000,\n" " \"subnet6\": [ ],\n" " \"valid-lifetime\": 4000\n" -" }\n", - // CONFIGURATION 39 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 40 -"{\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 41 "{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 42 +"{\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" " \"decline-probation-period\": 12345,\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1287,7 +1361,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 42 + // CONFIGURATION 44 "{\n" " \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" @@ -1303,7 +1377,7 @@ const char* EXTRACTED_CONFIGS[] = { " },\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"client-classes\": [\n" " {\n" @@ -1335,7 +1409,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 44 + // CONFIGURATION 46 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1356,7 +1430,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 45 + // CONFIGURATION 47 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1378,7 +1452,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 46 + // CONFIGURATION 48 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1405,7 +1479,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 47 + // CONFIGURATION 49 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1432,7 +1506,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 50 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1455,7 +1529,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1479,7 +1553,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"interfaces-config\": {\n" " \"interfaces\": [ \"*\" ],\n" @@ -1508,7 +1582,7 @@ const char* EXTRACTED_CONFIGS[] = { " ],\n" " \"valid-lifetime\": 4000\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 53 "{\n" " \"comment\": \"A DHCPv6 server\",\n" " \"client-classes\": [\n" @@ -4468,6 +4542,194 @@ const char* UNPARSED_CONFIGS[] = { "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:1::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:2::/80\"\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:3::/80\"\n" +" },\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8:4::/80\"\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/40\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 33 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [\n" +" {\n" +" \"client-class\": \"alpha\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:1::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"beta\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:2::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"client-class\": \"gamma\",\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:3::\",\n" +" \"prefix-len\": 48\n" +" },\n" +" {\n" +" \"delegated-len\": 64,\n" +" \"option-data\": [ ],\n" +" \"prefix\": \"2001:db8:4::\",\n" +" \"prefix-len\": 48\n" +" }\n" +" ],\n" +" \"pools\": [ ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/64\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 34 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" " \"always-include-fqdn\": true,\n" " \"enable-updates\": true,\n" " \"generated-prefix\": \"test.prefix\",\n" @@ -4539,7 +4801,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 33 + // CONFIGURATION 35 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4733,7 +4995,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 34 + // CONFIGURATION 36 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -4830,110 +5092,6 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 35 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 36 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 37 "{\n" @@ -4966,6 +5124,110 @@ const char* UNPARSED_CONFIGS[] = { " \"hooks-libraries\": [ ],\n" " \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" " \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 38 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"client-link-addr-option\", \"remote-id\", \"subscriber-id\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 39 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" " \"interfaces\": [ ],\n" " \"re-detect\": false\n" " },\n" @@ -5076,7 +5338,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 38 + // CONFIGURATION 40 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5127,114 +5389,10 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 39 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" -" }\n", - // CONFIGURATION 40 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [ ]\n" " }\n", // CONFIGURATION 41 "{\n" -" \"decline-probation-period\": 12345,\n" +" \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" " \"always-include-fqdn\": false,\n" " \"enable-updates\": false,\n" @@ -5305,6 +5463,110 @@ const char* UNPARSED_CONFIGS[] = { " },\n" " \"dhcp4o6-port\": 0,\n" " \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 43 +"{\n" +" \"decline-probation-period\": 12345,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 44 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" " \"flush-reclaimed-timer-wait-time\": 35,\n" " \"hold-reclaimed-time\": 1800,\n" " \"max-reclaim-leases\": 50,\n" @@ -5336,7 +5598,7 @@ const char* UNPARSED_CONFIGS[] = { " \"shared-networks\": [ ],\n" " \"subnet6\": [ ]\n" " }\n", - // CONFIGURATION 43 + // CONFIGURATION 45 "{\n" " \"client-classes\": [\n" " {\n" @@ -5424,157 +5686,6 @@ const char* UNPARSED_CONFIGS[] = { " \"valid-lifetime\": 4000\n" " }\n" " ]\n" -" }\n", - // CONFIGURATION 44 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\"\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" -" }\n", - // CONFIGURATION 45 -"{\n" -" \"decline-probation-period\": 86400,\n" -" \"dhcp-ddns\": {\n" -" \"always-include-fqdn\": false,\n" -" \"enable-updates\": false,\n" -" \"generated-prefix\": \"myhost\",\n" -" \"max-queue-size\": 1024,\n" -" \"ncr-format\": \"JSON\",\n" -" \"ncr-protocol\": \"UDP\",\n" -" \"override-client-update\": false,\n" -" \"override-no-update\": false,\n" -" \"qualifying-suffix\": \"\",\n" -" \"replace-client-name\": \"never\",\n" -" \"sender-ip\": \"0.0.0.0\",\n" -" \"sender-port\": 0,\n" -" \"server-ip\": \"127.0.0.1\",\n" -" \"server-port\": 53001\n" -" },\n" -" \"dhcp4o6-port\": 0,\n" -" \"expired-leases-processing\": {\n" -" \"flush-reclaimed-timer-wait-time\": 25,\n" -" \"hold-reclaimed-time\": 3600,\n" -" \"max-reclaim-leases\": 100,\n" -" \"max-reclaim-time\": 250,\n" -" \"reclaim-timer-wait-time\": 10,\n" -" \"unwarned-reclaim-cycles\": 5\n" -" },\n" -" \"hooks-libraries\": [ ],\n" -" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" -" \"interfaces-config\": {\n" -" \"interfaces\": [ \"*\" ],\n" -" \"re-detect\": false\n" -" },\n" -" \"lease-database\": {\n" -" \"type\": \"memfile\"\n" -" },\n" -" \"mac-sources\": [ \"any\" ],\n" -" \"option-data\": [ ],\n" -" \"option-def\": [ ],\n" -" \"relay-supplied-options\": [ \"65\" ],\n" -" \"server-id\": {\n" -" \"enterprise-id\": 0,\n" -" \"htype\": 0,\n" -" \"identifier\": \"\",\n" -" \"persist\": true,\n" -" \"time\": 0,\n" -" \"type\": \"LLT\"\n" -" },\n" -" \"shared-networks\": [ ],\n" -" \"subnet6\": [\n" -" {\n" -" \"id\": 1,\n" -" \"option-data\": [ ],\n" -" \"pd-pools\": [ ],\n" -" \"pools\": [\n" -" {\n" -" \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": { }\n" -" }\n" -" ],\n" -" \"preferred-lifetime\": 3000,\n" -" \"rapid-commit\": false,\n" -" \"rebind-timer\": 2000,\n" -" \"relay\": {\n" -" \"ip-address\": \"::\"\n" -" },\n" -" \"renew-timer\": 1000,\n" -" \"reservation-mode\": \"all\",\n" -" \"reservations\": [ ],\n" -" \"subnet\": \"2001:db8::/32\",\n" -" \"valid-lifetime\": 4000\n" -" }\n" -" ]\n" " }\n", // CONFIGURATION 46 "{\n" @@ -5634,13 +5745,7 @@ const char* UNPARSED_CONFIGS[] = { " \"pools\": [\n" " {\n" " \"option-data\": [ ],\n" -" \"pool\": \"2001:db8::/64\",\n" -" \"user-context\": {\n" -" \"lw4over6-bind-prefix-len\": 56,\n" -" \"lw4over6-sharing-ratio\": 64,\n" -" \"lw4over6-sysports-exclude\": true,\n" -" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" -" }\n" +" \"pool\": \"2001:db8::/64\"\n" " }\n" " ],\n" " \"preferred-lifetime\": 3000,\n" @@ -5716,6 +5821,82 @@ const char* UNPARSED_CONFIGS[] = { " {\n" " \"option-data\": [ ],\n" " \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": { }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 48 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" " \"user-context\": {\n" " \"lw4over6-bind-prefix-len\": 56,\n" " \"lw4over6-sharing-ratio\": 64,\n" @@ -5738,7 +5919,88 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 48 + // CONFIGURATION 49 +"{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [\n" +" {\n" +" \"id\": 1,\n" +" \"option-data\": [ ],\n" +" \"pd-pools\": [ ],\n" +" \"pools\": [\n" +" {\n" +" \"option-data\": [ ],\n" +" \"pool\": \"2001:db8::/64\",\n" +" \"user-context\": {\n" +" \"lw4over6-bind-prefix-len\": 56,\n" +" \"lw4over6-sharing-ratio\": 64,\n" +" \"lw4over6-sysports-exclude\": true,\n" +" \"lw4over6-v4-pool\": \"192.0.2.0/24\"\n" +" }\n" +" }\n" +" ],\n" +" \"preferred-lifetime\": 3000,\n" +" \"rapid-commit\": false,\n" +" \"rebind-timer\": 2000,\n" +" \"relay\": {\n" +" \"ip-address\": \"::\"\n" +" },\n" +" \"renew-timer\": 1000,\n" +" \"reservation-mode\": \"all\",\n" +" \"reservations\": [ ],\n" +" \"subnet\": \"2001:db8::/32\",\n" +" \"valid-lifetime\": 4000\n" +" }\n" +" ]\n" +" }\n", + // CONFIGURATION 50 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5815,7 +6077,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 49 + // CONFIGURATION 51 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5893,7 +6155,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 50 + // CONFIGURATION 52 "{\n" " \"decline-probation-period\": 86400,\n" " \"dhcp-ddns\": {\n" @@ -5976,7 +6238,7 @@ const char* UNPARSED_CONFIGS[] = { " }\n" " ]\n" " }\n", - // CONFIGURATION 51 + // CONFIGURATION 53 "{\n" " \"comment\": \"A DHCPv6 server\",\n" " \"client-classes\": [\n" diff --git a/src/bin/dhcp6/tests/shared_network_unittest.cc b/src/bin/dhcp6/tests/shared_network_unittest.cc index dc8cd2ff31..32fa5d53ec 100644 --- a/src/bin/dhcp6/tests/shared_network_unittest.cc +++ b/src/bin/dhcp6/tests/shared_network_unittest.cc @@ -957,7 +957,151 @@ const char* NETWORKS_CONFIG[] = { " ]" " }" " ]" + "}", + +// Configuration #19. +// - one shared network with one subnet and two pools (the first has +// class restrictions) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #20. +// - one shared network with one subnet and two pools (each with class +// restriction) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #21. +// - one plain subnet with two pools (the first has class restrictions) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"interface\": \"eth1\"," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"" + " }" + " ]" + " }" + " ]" + "}", + +// Configuration #22. +// - one plain subnet with two pools (each with class restriction) + "{" + " \"client-classes\": [" + " {" + " \"name\": \"a-devices\"," + " \"test\": \"option[1234].hex == 0x0001\"" + " }," + " {" + " \"name\": \"b-devices\"," + " \"test\": \"option[1234].hex == 0x0002\"" + " }" + " ]," + " \"shared-networks\": [" + " {" + " \"name\": \"frog\"," + " \"interface\": \"eth1\"," + " \"subnet6\": [" + " {" + " \"subnet\": \"2001:db8:1::/64\"," + " \"id\": 10," + " \"pools\": [" + " {" + " \"pool\": \"2001:db8:1::20 - 2001:db8:1::20\"," + " \"client-class\": \"a-devices\"" + " }," + " {" + " \"pool\": \"2001:db8:1::50 - 2001:db8:1::50\"," + " \"client-class\": \"b-devices\"" + " }" + " ]" + " }" + " ]" + " }" + " ]" "}" + }; /// @Brief Test fixture class for DHCPv6 server using shared networks. @@ -2191,4 +2335,131 @@ TEST_F(Dhcpv6SharedNetworkTest, sharedNetworkRapidCommit3) { testRapidCommit(NETWORKS_CONFIG[1], false, "", ""); } +// Pool is selected based on the client class specified. +TEST_F(Dhcpv6SharedNetworkTest, poolInSharedNetworkSelectedByClass) { + // Create client #1. + Dhcp6Client client1; + client1.setInterface("eth1"); + + // Configure the server with one shared network including one subnet and + // two pools. The access to one of the pools is restricted by + // by client classification. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[19], *client1.getServer())); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + ASSERT_NO_THROW(client1.requestAddress(0xabca, IOAddress("2001:db8:1::20"))); + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::50"))); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option 1234 which would cause the client to be classified as "a-devices". + OptionPtr option1234(new OptionUint16(Option::V6, 1234, 0x0001)); + client1.addExtraOption(option1234); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::20"))); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp6Client client2(client1.getServer()); + client2.setInterface("eth1"); + ASSERT_NO_THROW(client2.requestAddress(0xabca0)); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:1::50"))); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[20], *client1.getServer())); + + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(0, client2.getLeasesWithNonZeroLifetime().size()); + + // If we add option 1234 with a value matching this class, the lease should + // get renewed. + OptionPtr option1234_bis(new OptionUint16(Option::V6, 1234, 0x0002)); + client2.addExtraOption(option1234_bis); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(1, client2.getLeaseNum()); + EXPECT_EQ(1, client2.getLeasesWithNonZeroLifetime().size()); +} + +// Pool is selected based on the client class specified using a plain subnet. +TEST_F(Dhcpv6SharedNetworkTest, poolInSubnetSelectedByClass) { + // Create client #1. + Dhcp6Client client1; + client1.setInterface("eth1"); + + // Configure the server with one plain subnet including two pools. + // The access to one of the pools is restricted by client classification. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[21], *client1.getServer())); + + // Client #1 requests an address in the restricted pool but can't be assigned + // this address because the client doesn't belong to a certain class. + ASSERT_NO_THROW(client1.requestAddress(0xabca, IOAddress("2001:db8:1::20"))); + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::50"))); + + // Release the lease that the client has got, because we'll need this address + // further in the test. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doRelease()); + }); + + // Add option 1234 which would cause the client to be classified as "a-devices". + OptionPtr option1234(new OptionUint16(Option::V6, 1234, 0x0001)); + client1.addExtraOption(option1234); + + // This time, the allocation of the address provided as hint should be successful. + testAssigned([this, &client1] { + ASSERT_NO_THROW(client1.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client1, IOAddress("2001:db8:1::20"))); + + // Client 2 should be assigned an address from the unrestricted pool. + Dhcp6Client client2(client1.getServer()); + client2.setInterface("eth1"); + ASSERT_NO_THROW(client2.requestAddress(0xabca0)); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doSARR()); + }); + ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:1::50"))); + + // Now, let's reconfigure the server to also apply restrictions on the + // pool to which client2 now belongs. + ASSERT_NO_FATAL_FAILURE(configure(NETWORKS_CONFIG[22], *client1.getServer())); + + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(0, client2.getLeasesWithNonZeroLifetime().size()); + + // If we add option 1234 with a value matching this class, the lease should + // get renewed. + OptionPtr option1234_bis(new OptionUint16(Option::V6, 1234, 0x0002)); + client2.addExtraOption(option1234_bis); + testAssigned([this, &client2] { + ASSERT_NO_THROW(client2.doRenew()); + }); + EXPECT_EQ(1, client2.getLeaseNum()); + EXPECT_EQ(1, client2.getLeasesWithNonZeroLifetime().size()); +} + } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/alloc_engine.cc b/src/lib/dhcpsrv/alloc_engine.cc index 24c755b0ae..301b8af6f2 100644 --- a/src/lib/dhcpsrv/alloc_engine.cc +++ b/src/lib/dhcpsrv/alloc_engine.cc @@ -144,19 +144,33 @@ AllocEngine::IterativeAllocator::increasePrefix(const isc::asiolink::IOAddress& return (IOAddress::fromBytes(AF_INET6, packed)); } +isc::asiolink::IOAddress +AllocEngine::IterativeAllocator::increaseAddress(const isc::asiolink::IOAddress& address, + bool prefix, + const uint8_t prefix_len) { + if (!prefix) { + return (IOAddress::increase(address)); + } else { + return (increasePrefix(address, prefix_len)); + } +} isc::asiolink::IOAddress AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, const DuidPtr&, const IOAddress&) { // Is this prefix allocation? bool prefix = pool_type_ == Lease::TYPE_PD; + uint8_t prefix_len = 0; // Let's get the last allocated address. It is usually set correctly, // but there are times when it won't be (like after removing a pool or // perhaps restarting the server). IOAddress last = subnet->getLastAllocated(pool_type_); + bool valid = true; + bool retrying = false; const PoolCollection& pools = subnet->getPools(pool_type_); @@ -166,58 +180,108 @@ AllocEngine::IterativeAllocator::pickAddress(const SubnetPtr& subnet, // first we need to find a pool the last address belongs to. PoolCollection::const_iterator it; + PoolCollection::const_iterator first = pools.end(); + PoolPtr first_pool; for (it = pools.begin(); it != pools.end(); ++it) { + if (!(*it)->clientSupported(client_classes)) { + continue; + } + if (first == pools.end()) { + first = it; + } if ((*it)->inRange(last)) { break; } } + // Caller checked this cannot happen + if (first == pools.end()) { + isc_throw(AllocFailed, "No allowed pools defined in selected subnet"); + } + // last one was bogus for one of several reasons: // - we just booted up and that's the first address we're allocating // - a subnet was removed or other reconfiguration just completed // - perhaps allocation algorithm was changed + // - last pool does not allow this client if (it == pools.end()) { - // ok to access first element directly. We checked that pools is non-empty - IOAddress next = pools[0]->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + it = first; } - // Ok, we have a pool that the last address belonged to, let's use it. - - IOAddress next("::"); - if (!prefix) { - next = IOAddress::increase(last); // basically addr++ - } else { - Pool6Ptr pool6 = boost::dynamic_pointer_cast(*it); - if (!pool6) { - // Something is gravely wrong here - isc_throw(Unexpected, "Wrong type of pool: " << (*it)->toText() - << " is not Pool6"); + for (;;) { + // Trying next pool + if (retrying) { + for (; it != pools.end(); ++it) { + if ((*it)->clientSupported(client_classes)) { + break; + } + } + if (it == pools.end()) { + // Really out of luck today. That was the last pool. + break; + } } - // Get the next prefix - next = increasePrefix(last, pool6->getLength()); - } - if ((*it)->inRange(next)) { - // the next one is in the pool as well, so we haven't hit pool boundary yet - subnet->setLastAllocated(pool_type_, next); - return (next); + + last = (*it)->getLastAllocated(); + valid = (*it)->isLastAllocatedValid(); + if (!valid && (last == (*it)->getFirstAddress())) { + // Pool was (re)initialized + (*it)->setLastAllocated(last); + subnet->setLastAllocated(pool_type_, last); + return (last); + } + // still can be bogus + if (valid && !(*it)->inRange(last)) { + valid = false; + (*it)->resetLastAllocated(); + (*it)->setLastAllocated((*it)->getFirstAddress()); + } + + if (valid) { + // Ok, we have a pool that the last address belonged to, let's use it. + if (prefix) { + Pool6Ptr pool6 = boost::dynamic_pointer_cast(*it); + + if (!pool6) { + // Something is gravely wrong here + isc_throw(Unexpected, "Wrong type of pool: " + << (*it)->toText() + << " is not Pool6"); + } + // Get the prefix length + prefix_len = pool6->getLength(); + } + + IOAddress next = increaseAddress(last, prefix, prefix_len); + if ((*it)->inRange(next)) { + // the next one is in the pool as well, so we haven't hit + // pool boundary yet + (*it)->setLastAllocated(next); + subnet->setLastAllocated(pool_type_, next); + return (next); + } + + valid = false; + (*it)->resetLastAllocated(); + } + // We hit pool boundary, let's try to jump to the next pool and try again + ++it; + retrying = true; } - // We hit pool boundary, let's try to jump to the next pool and try again - ++it; - if (it == pools.end()) { - // Really out of luck today. That was the last pool. Let's rewind - // to the beginning. - next = pools[0]->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + // Let's rewind to the beginning. + for (it = first; it != pools.end(); ++it) { + if ((*it)->clientSupported(client_classes)) { + (*it)->setLastAllocated((*it)->getFirstAddress()); + (*it)->resetLastAllocated(); + } } - // there is a next pool, let's try first address from it - next = (*it)->getFirstAddress(); - subnet->setLastAllocated(pool_type_, next); - return (next); + // ok to access first element directly. We checked that pools is non-empty + last = (*first)->getLastAllocated(); + (*first)->setLastAllocated(last); + subnet->setLastAllocated(pool_type_, last); + return (last); } AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) @@ -228,6 +292,7 @@ AllocEngine::HashedAllocator::HashedAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::HashedAllocator::pickAddress(const SubnetPtr&, + const ClientClasses&, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Hashed allocator is not implemented"); @@ -241,6 +306,7 @@ AllocEngine::RandomAllocator::RandomAllocator(Lease::Type lease_type) isc::asiolink::IOAddress AllocEngine::RandomAllocator::pickAddress(const SubnetPtr&, + const ClientClasses&, const DuidPtr&, const IOAddress&) { isc_throw(NotImplemented, "Random allocator is not implemented"); @@ -361,20 +427,29 @@ namespace { /// function when it belongs to a shared network. /// @param lease_type Type of the lease. /// @param address IPv6 address or prefix to be checked. +/// @param check_subnet if true only subnets are checked else both subnets +/// and pools are checked /// /// @return true if address belongs to a pool in a selected subnet or in /// a pool within any of the subnets belonging to the current shared network. bool inAllowedPool(AllocEngine::ClientContext6& ctx, const Lease::Type& lease_type, - const IOAddress& address) { + const IOAddress& address, bool check_subnet) { // If the subnet belongs to a shared network we will be iterating // over the subnets that belong to this shared network. Subnet6Ptr current_subnet = ctx.subnet_; while (current_subnet) { if (current_subnet->clientSupported(ctx.query_->getClasses())) { - if (current_subnet->inPool(lease_type, address)) { - return (true); + if (check_subnet) { + if (current_subnet->inPool(lease_type, address)) { + return (true); + } + } else { + if (current_subnet->inPool(lease_type, address, + ctx.query_->getClasses())) { + return (true); + } } } @@ -677,7 +752,12 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // check if the hint is in pool and is available // This is equivalent of subnet->inPool(hint), but returns the pool pool = boost::dynamic_pointer_cast - (subnet->getPool(ctx.currentIA().type_, hint, false)); + (subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), hint)); + + // check if the pool is allowed + if (pool && !pool->clientSupported(ctx.query_->getClasses())) { + pool.reset(); + } if (pool) { @@ -775,14 +855,23 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { // - we find a free address // - we find an address for which the lease has expired // - we exhaust number of tries - uint64_t max_attempts = (attempts_ > 0 ? attempts_ : - subnet->getPoolCapacity(ctx.currentIA().type_)); + uint64_t possible_attempts = + subnet->getPoolCapacity(ctx.currentIA().type_, + ctx.query_->getClasses()); + // Try next subnet if there is no chance to get something + if (possible_attempts == 0) { + subnet = subnet->getNextSubnet(original_subnet); + continue; + } + uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); for (uint64_t i = 0; i < max_attempts; ++i) { ++total_attempts; - IOAddress candidate = allocator->pickAddress(subnet, ctx.duid_, + IOAddress candidate = allocator->pickAddress(subnet, + ctx.query_->getClasses(), + ctx.duid_, hint); /// In-pool reservations: Check if this address is reserved for someone @@ -800,7 +889,7 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) { uint8_t prefix_len = 128; if (ctx.currentIA().type_ == Lease::TYPE_PD) { pool = boost::dynamic_pointer_cast( - subnet->getPool(ctx.currentIA().type_, candidate, false)); + subnet->getPool(ctx.currentIA().type_, ctx.query_->getClasses(), candidate)); if (pool) { prefix_len = pool->getLength(); } @@ -1034,11 +1123,14 @@ AllocEngine::allocateReservedLeases6(ClientContext6& ctx, void AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, Lease6Collection& existing_leases) { - // If there are no leases (so nothing to remove) or - // host reservation is disabled (so there are no reserved leases), - // just return. - if (existing_leases.empty() || !ctx.subnet_ || - (ctx.subnet_->getHostReservationMode() == Network::HR_DISABLED) ) { + // If there are no leases (so nothing to remove) just return. + if (existing_leases.empty() || !ctx.subnet_) { + return; + } + // If host reservation is disabled (so there are no reserved leases) + // use the simplified version. + if (ctx.subnet_->getHostReservationMode() == Network::HR_DISABLED) { + removeNonmatchingReservedNoHostLeases6(ctx, existing_leases); return; } @@ -1075,7 +1167,8 @@ AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, // be allocated to us from a dynamic pool, but we must check if // this lease belongs to any pool. If it does, we can proceed to // checking the next lease. - if (!host && inAllowedPool(ctx, candidate->type_, candidate->addr_)) { + if (!host && inAllowedPool(ctx, candidate->type_, + candidate->addr_, false)) { continue; } @@ -1122,6 +1215,44 @@ AllocEngine::removeNonmatchingReservedLeases6(ClientContext6& ctx, } } +void +AllocEngine::removeNonmatchingReservedNoHostLeases6(ClientContext6& ctx, + Lease6Collection& existing_leases) { + // We need a copy, so we won't be iterating over a container and + // removing from it at the same time. It's only a copy of pointers, + // so the operation shouldn't be that expensive. + Lease6Collection copy = existing_leases; + + BOOST_FOREACH(const Lease6Ptr& candidate, copy) { + // Lease can be allocated to us from a dynamic pool, but we must + // check if this lease belongs to any allowed pool. If it does, + // we can proceed to checking the next lease. + if (inAllowedPool(ctx, candidate->type_, + candidate->addr_, false)) { + continue; + } + + // Remove this lease from LeaseMgr as it doesn't belong to a pool. + LeaseMgrFactory::instance().deleteLease(candidate->addr_); + + // Update DNS if needed. + queueNCR(CHG_REMOVE, candidate); + + // Need to decrease statistic for assigned addresses. + StatsMgr::instance().addValue( + StatsMgr::generateName("subnet", candidate->subnet_id_, + ctx.currentIA().type_ == Lease::TYPE_NA ? + "assigned-nas" : "assigned-pds"), + static_cast(-1)); + + // Add this to the list of removed leases. + ctx.currentIA().old_leases_.push_back(candidate); + + // Let's remove this candidate from existing leases + removeLeases(existing_leases, candidate->addr_); + } +} + bool AllocEngine::removeLeases(Lease6Collection& container, const asiolink::IOAddress& addr) { @@ -1678,7 +1809,8 @@ AllocEngine::updateLeaseData(ClientContext6& ctx, const Lease6Collection& leases // If the lease is in the current subnet we need to account // for the re-assignment of The lease. - if (inAllowedPool(ctx, ctx.currentIA().type_, lease->addr_)) { + if (inAllowedPool(ctx, ctx.currentIA().type_, + lease->addr_, true)) { StatsMgr::instance().addValue( StatsMgr::generateName("subnet", lease->subnet_id_, ctx.currentIA().type_ == Lease::TYPE_NA ? @@ -2481,6 +2613,7 @@ void findClientLease(AllocEngine::ClientContext4& ctx, Lease4Ptr& client_lease) /// within a shared network. /// /// @todo Update this function to take client classification into account. +/// @note client classification in pools (vs subnets) is checked /// /// @param ctx Client context. Current subnet may be modified by this /// function when it belongs to a shared network. @@ -2495,7 +2628,8 @@ inAllowedPool(AllocEngine::ClientContext4& ctx, const IOAddress& address) { Subnet4Ptr current_subnet = ctx.subnet_; while (current_subnet) { - if (current_subnet->inPool(Lease::TYPE_V4, address)) { + if (current_subnet->inPool(Lease::TYPE_V4, address, + ctx.query_->getClasses())) { // We found a subnet that this address belongs to, so it // seems that this subnet is the good candidate for allocation. // Let's update the selected subnet. @@ -2819,9 +2953,13 @@ AllocEngine::requestLease4(AllocEngine::ClientContext4& ctx) { // If the client is requesting an address which is assigned to the client // let's just renew this address. Also, renew this address if the client // doesn't request any specific address. + // Added extra checks: the address is reserved or belongs to the dynamic + // pool for the case the pool class has changed before the request. if (client_lease) { - if ((client_lease->addr_ == ctx.requested_address_) || - ctx.requested_address_.isV4Zero()) { + if (((client_lease->addr_ == ctx.requested_address_) || + ctx.requested_address_.isV4Zero()) && + (hasAddressReservation(ctx) || + inAllowedPool(ctx, client_lease->addr_))) { LOG_DEBUG(alloc_engine_logger, ALLOC_ENGINE_DBG_TRACE, ALLOC_ENGINE_V4_REQUEST_EXTEND_LEASE) @@ -3217,10 +3355,19 @@ AllocEngine::allocateUnreservedLease4(ClientContext4& ctx) { client_id = ctx.clientid_; } - const uint64_t max_attempts = (attempts_ > 0 ? attempts_ : - subnet->getPoolCapacity(Lease::TYPE_V4)); + uint64_t possible_attempts = + subnet->getPoolCapacity(Lease::TYPE_V4, + ctx.query_->getClasses()); + uint64_t max_attempts = (attempts_ > 0 ? attempts_ : possible_attempts); + // Skip trying if there is no chance to get something + if (possible_attempts == 0) { + max_attempts = 0; + } + for (uint64_t i = 0; i < max_attempts; ++i) { - IOAddress candidate = allocator->pickAddress(subnet, client_id, + IOAddress candidate = allocator->pickAddress(subnet, + ctx.query_->getClasses(), + client_id, ctx.requested_address_); // If address is not reserved for another client, try to allocate it. if (!addressReserved(candidate, ctx)) { diff --git a/src/lib/dhcpsrv/alloc_engine.h b/src/lib/dhcpsrv/alloc_engine.h index e33b2f7056..382a30f520 100644 --- a/src/lib/dhcpsrv/alloc_engine.h +++ b/src/lib/dhcpsrv/alloc_engine.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,6 +8,7 @@ #define ALLOC_ENGINE_H #include +#include #include #include #include @@ -78,13 +79,18 @@ protected: /// than pickResource(), because nobody would immediately know what the /// resource means in this context. /// + /// Pools which are not allowed for client classes are skipped. + /// /// @param subnet next address will be returned from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID /// @param hint client's hint /// /// @return the next address virtual isc::asiolink::IOAddress - pickAddress(const SubnetPtr& subnet, const DuidPtr& duid, + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, const isc::asiolink::IOAddress& hint) = 0; /// @brief Default constructor. @@ -125,11 +131,13 @@ protected: /// @brief returns the next address from pools in a subnet /// /// @param subnet next address will be returned from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID (ignored) /// @param hint client's hint (ignored) /// @return the next address virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, const DuidPtr& duid, const isc::asiolink::IOAddress& hint); protected: @@ -147,6 +155,20 @@ protected: static isc::asiolink::IOAddress increasePrefix(const isc::asiolink::IOAddress& prefix, const uint8_t prefix_len); + + /// @brief Returns the next address or prefix + /// + /// This method works for IPv4 addresses, IPv6 addresses and + /// IPv6 prefixes. + /// + /// @param address address or prefix to be increased + /// @param prefix true when the previous argument is a prefix + /// @param prefix_len length of the prefix + /// @return result address or prefix + static isc::asiolink::IOAddress + increaseAddress(const isc::asiolink::IOAddress& address, + bool prefix, const uint8_t prefix_len); + }; /// @brief Address/prefix allocator that gets an address based on a hash @@ -164,12 +186,15 @@ protected: /// @todo: Implement this method /// /// @param subnet an address will be picked from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID /// @param hint a hint (last address that was picked) /// @return selected address - virtual isc::asiolink::IOAddress pickAddress(const SubnetPtr& subnet, - const DuidPtr& duid, - const isc::asiolink::IOAddress& hint); + virtual isc::asiolink::IOAddress + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, + const isc::asiolink::IOAddress& hint); }; /// @brief Random allocator that picks address randomly @@ -187,11 +212,14 @@ protected: /// @todo: Implement this method /// /// @param subnet an address will be picked from pool of that subnet + /// @param client_classes list of classes client belongs to /// @param duid Client's DUID (ignored) /// @param hint the last address that was picked (ignored) /// @return a random address from the pool virtual isc::asiolink::IOAddress - pickAddress(const SubnetPtr& subnet, const DuidPtr& duid, + pickAddress(const SubnetPtr& subnet, + const ClientClasses& client_classes, + const DuidPtr& duid, const isc::asiolink::IOAddress& hint); }; @@ -803,8 +831,8 @@ private: /// @brief Removes leases that are reserved for someone else. /// /// Goes through the list specified in existing_leases and removes those that - /// are reserved by someone else. The removed leases are added to the - /// ctx.removed_leases_ collection. + /// are reserved by someone else or do not belong to an allowed pool. + /// The removed leases are added to the ctx.removed_leases_ collection. /// /// @param ctx client context that contains all details (subnet, client-id, etc.) /// @param existing_leases [in/out] leases that should be checked @@ -812,6 +840,17 @@ private: removeNonmatchingReservedLeases6(ClientContext6& ctx, Lease6Collection& existing_leases); + /// @brief Removes leases that are reserved for someone else. + /// + /// Simplified version of removeNonmatchingReservedLeases6 to be + /// used when host reservations are disabled. + /// + /// @param ctx client context that contains all details (subnet, client-id, etc.) + /// @param existing_leases [in/out] leases that should be checked + void + removeNonmatchingReservedNoHostLeases6(ClientContext6& ctx, + Lease6Collection& existing_leases); + /// @brief Removed leases that are not reserved for this client /// /// This method iterates over existing_leases and will remove leases that are diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index 4f5c5f8fdd..b10d7e7eda 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -377,6 +377,15 @@ PoolParser::parse(PoolStoragePtr pools, << " (" << option_data->getPosition() << ")"); } } + + // Client-class. + ConstElementPtr client_class = pool_structure->get("client-class"); + if (client_class) { + string cclass = client_class->stringValue(); + if (!cclass.empty()) { + pool->allowClientClass(cclass); + } + } } //****************************** Pool4Parser ************************* @@ -846,6 +855,11 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { user_context_ = user_context; } + ConstElementPtr client_class = pd_pool_->get("client-class"); + if (client_class) { + client_class_ = client_class; + } + // Check the pool parameters. It will throw an exception if any // of the required parameters are invalid. try { @@ -869,6 +883,14 @@ PdPoolParser::parse(PoolStoragePtr pools, ConstElementPtr pd_pool_) { pool_->setContext(user_context_); } + + if (client_class_) { + string cclass = client_class_->stringValue(); + if (!cclass.empty()) { + pool_->allowClientClass(cclass); + } + } + // Add the local pool to the external storage ptr. pools->push_back(pool_); } diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.h b/src/lib/dhcpsrv/parsers/dhcp_parsers.h index 0941e70b46..12dd20cb0b 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.h +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.h @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -651,7 +651,16 @@ private: /// A storage for pool specific option values. CfgOptionPtr options_; + /// @brief User context (optional, may be null) + /// + /// User context is arbitrary user data, to be used by hooks. isc::data::ConstElementPtr user_context_; + + /// @brief Client class (a client has to belong to to use this pd-pool) + /// + /// If null, everyone is allowed. + isc::data::ConstElementPtr client_class_; + }; /// @brief Parser for a list of prefix delegation pools. diff --git a/src/lib/dhcpsrv/pool.cc b/src/lib/dhcpsrv/pool.cc index be583a3ceb..0e03a6f858 100644 --- a/src/lib/dhcpsrv/pool.cc +++ b/src/lib/dhcpsrv/pool.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -20,13 +20,35 @@ namespace dhcp { Pool::Pool(Lease::Type type, const isc::asiolink::IOAddress& first, const isc::asiolink::IOAddress& last) :id_(getNextID()), first_(first), last_(last), type_(type), - capacity_(0), cfg_option_(new CfgOption()) { + capacity_(0), cfg_option_(new CfgOption()), white_list_(), + last_allocated_(first), last_allocated_valid_(false) { } bool Pool::inRange(const isc::asiolink::IOAddress& addr) const { return (first_.smallerEqual(addr) && addr.smallerEqual(last_)); } +bool Pool::clientSupported(const ClientClasses& classes) const { + if (white_list_.empty()) { + // There is no class defined for this pool, so we do + // support everyone. + return (true); + } + + for (ClientClasses::const_iterator it = white_list_.begin(); + it != white_list_.end(); ++it) { + if (classes.contains(*it)) { + return (true); + } + } + + return (false); +} + +void Pool::allowClientClass(const ClientClass& class_name) { + white_list_.insert(class_name); +} + std::string Pool::toText() const { std::stringstream tmp; @@ -88,6 +110,16 @@ Pool::toElement() const { // Set pool options ConstCfgOptionPtr opts = getCfgOption(); map->set("option-data", opts->toElement()); + + // Set client-class + const ClientClasses& cclasses = getClientClasses(); + if (cclasses.size() > 1) { + isc_throw(ToElementError, "client-class has too many items: " + << cclasses.size()); + } else if (!cclasses.empty()) { + map->set("client-class", Element::create(*cclasses.cbegin())); + } + return (map); } @@ -310,6 +342,7 @@ Pool6::toElement() const { isc_throw(ToElementError, "invalid prefix range " << prefix.toText() << "-" << last.toText()); } + map->set("prefix-len", Element::create(prefix_len)); // Set delegated-len uint8_t len = getLength(); @@ -324,10 +357,14 @@ Pool6::toElement() const { uint8_t xlen = xopt->getExcludedPrefixLength(); map->set("excluded-prefix-len", Element::create(static_cast(xlen))); - } else { - map->set("excluded-prefix", Element::create(std::string("::"))); - map->set("excluded-prefix-len", Element::create(0)); } + // Let's not insert empty excluded-prefix values. If we ever + // decide to insert it after all, here's the code to do it: + // else { + // map->set("excluded-prefix", + // Element::create(std::string("::"))); + // map->set("excluded-prefix-len", Element::create(0)); + /// } break; } diff --git a/src/lib/dhcpsrv/pool.h b/src/lib/dhcpsrv/pool.h index 5bdefceccb..bba123cfcf 100644 --- a/src/lib/dhcpsrv/pool.h +++ b/src/lib/dhcpsrv/pool.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,6 +8,7 @@ #define POOL_H #include +#include #include #include #include @@ -96,6 +97,57 @@ public: return (cfg_option_); } + /// @brief Checks whether this pool supports client that belongs to + /// specified classes. + /// + /// @todo: currently doing the same as network which needs improving. + /// + /// @param client_classes list of all classes the client belongs to + /// @return true if client can be supported, false otherwise + bool clientSupported(const ClientClasses& client_classes) const; + + /// @brief Adds class class_name to the list of supported classes + /// + /// @param class_name client class to be supported by this pool + void allowClientClass(const ClientClass& class_name); + + /// @brief returns the client class white list + /// + /// @note Currently white list is empty or has one element + /// @note The returned reference is only valid as long as the object + /// returned is valid. + /// + /// @return client classes @ref white_list_ + const ClientClasses& getClientClasses() const { + return (white_list_); + } + + /// @brief returns the last address that was tried from this pool + /// + /// @return address/prefix that was last tried from this pool + isc::asiolink::IOAddress getLastAllocated() const { + return last_allocated_; + } + + /// @brief checks if the last address is valid + /// @return true if the last address is valid + bool isLastAllocatedValid() const { + return last_allocated_valid_; + } + + /// @brief sets the last address that was tried from this pool + /// + /// @param addr address/prefix to that was tried last + void setLastAllocated(const isc::asiolink::IOAddress& addr) { + last_allocated_ = addr; + last_allocated_valid_ = true; + } + + /// @brief resets the last address to invalid + void resetLastAllocated() { + last_allocated_valid_ = false; + } + /// @brief Unparse a pool object. /// /// @return A pointer to unparsed pool configuration. @@ -148,6 +200,22 @@ protected: /// @brief Pointer to the option data configuration for this pool. CfgOptionPtr cfg_option_; + + /// @brief Optional definition of a client class + /// + /// If empty, all classes are allowed. If non-empty, only those listed + /// here are allowed. + /// + /// @ref Network::white_list_ + ClientClasses white_list_; + + /// @brief Last allocated address + /// See @ref isc::dhcp::Subnet::last_allocated_ia_ + /// Initialized and reset to first + isc::asiolink::IOAddress last_allocated_; + + /// @brief Status of last allocated address + bool last_allocated_valid_; }; /// @brief Pool information for IPv4 addresses diff --git a/src/lib/dhcpsrv/subnet.cc b/src/lib/dhcpsrv/subnet.cc index 945256b7b0..86b05f1609 100644 --- a/src/lib/dhcpsrv/subnet.cc +++ b/src/lib/dhcpsrv/subnet.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -134,6 +134,23 @@ Subnet::getPoolCapacity(Lease::Type type) const { } } +uint64_t +Subnet::getPoolCapacity(Lease::Type type, + const ClientClasses& client_classes) const { + switch (type) { + case Lease::TYPE_V4: + case Lease::TYPE_NA: + return sumPoolCapacity(pools_, client_classes); + case Lease::TYPE_TA: + return sumPoolCapacity(pools_ta_, client_classes); + case Lease::TYPE_PD: + return sumPoolCapacity(pools_pd_, client_classes); + default: + isc_throw(BadValue, "Unsupported pool type: " + << static_cast(type)); + } +} + uint64_t Subnet::sumPoolCapacity(const PoolCollection& pools) const { uint64_t sum = 0; @@ -152,6 +169,28 @@ Subnet::sumPoolCapacity(const PoolCollection& pools) const { return (sum); } +uint64_t +Subnet::sumPoolCapacity(const PoolCollection& pools, + const ClientClasses& client_classes) const { + uint64_t sum = 0; + for (PoolCollection::const_iterator p = pools.begin(); p != pools.end(); ++p) { + if (!(*p)->clientSupported(client_classes)) { + continue; + } + uint64_t x = (*p)->getCapacity(); + + // Check if we can add it. If sum + x > uint64::max, then we would have + // overflown if we tried to add it. + if (x > std::numeric_limits::max() - sum) { + return (std::numeric_limits::max()); + } + + sum += x; + } + + return (sum); +} + void Subnet4::checkType(Lease::Type type) const { if (type != Lease::TYPE_V4) { isc_throw(BadValue, "Only TYPE_V4 is allowed for Subnet4"); @@ -329,6 +368,33 @@ const PoolPtr Subnet::getPool(Lease::Type type, const isc::asiolink::IOAddress& return (candidate); } +const PoolPtr Subnet::getPool(Lease::Type type, + const ClientClasses& client_classes, + const isc::asiolink::IOAddress& hint) const { + // check if the type is valid (and throw if it isn't) + checkType(type); + + const PoolCollection& pools = getPools(type); + + PoolPtr candidate; + + if (!pools.empty()) { + PoolCollection::const_iterator ub = + std::upper_bound(pools.begin(), pools.end(), hint, + prefixLessThanFirstAddress); + + if (ub != pools.begin()) { + --ub; + if ((*ub)->inRange(hint) && (*ub)->clientSupported(client_classes)) { + candidate = *ub; + } + } + } + + // Return a pool or NULL if no match found. + return (candidate); +} + void Subnet::addPool(const PoolPtr& pool) { // check if the type is valid (and throw if it isn't) @@ -409,6 +475,31 @@ Subnet::inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const { return (false); } +bool +Subnet::inPool(Lease::Type type, + const isc::asiolink::IOAddress& addr, + const ClientClasses& client_classes) const { + + // Let's start with checking if it even belongs to that subnet. + if ((type != Lease::TYPE_PD) && !inRange(addr)) { + return (false); + } + + const PoolCollection& pools = getPools(type); + + for (PoolCollection::const_iterator pool = pools.begin(); + pool != pools.end(); ++pool) { + if (!(*pool)->clientSupported(client_classes)) { + continue; + } + if ((*pool)->inRange(addr)) { + return (true); + } + } + // There's no pool that address belongs to + return (false); +} + bool Subnet::poolOverlaps(const Lease::Type& pool_type, const PoolPtr& pool) const { const PoolCollection& pools = getPools(pool_type); @@ -618,78 +709,16 @@ Subnet6::toElement() const { ElementPtr pool_list = Element::createList(); for (PoolCollection::const_iterator pool = pools.cbegin(); pool != pools.cend(); ++pool) { - // Prepare the map for a pool (@todo move this code to pool.cc) - ElementPtr pool_map = Element::createMap(); - // Set user-context - (*pool)->contextToElement(pool_map); - // Set pool - const IOAddress& first = (*pool)->getFirstAddress(); - const IOAddress& last = (*pool)->getLastAddress(); - std::string range = first.toText() + "-" + last.toText(); - // Try to output a prefix (vs a range) - int prefix_len = prefixLengthFromRange(first, last); - if (prefix_len >= 0) { - std::ostringstream oss; - oss << first.toText() << "/" << prefix_len; - range = oss.str(); - } - pool_map->set("pool", Element::create(range)); - // Set pool options - ConstCfgOptionPtr opts = (*pool)->getCfgOption(); - pool_map->set("option-data", opts->toElement()); - // Push on the pool list - pool_list->add(pool_map); + pool_list->add((*pool)->toElement()); } map->set("pools", pool_list); + // Set pd-pools const PoolCollection& pdpools = getPools(Lease::TYPE_PD); ElementPtr pdpool_list = Element::createList(); for (PoolCollection::const_iterator pool = pdpools.cbegin(); pool != pdpools.cend(); ++pool) { - // Get it as a Pool6 (@todo move this code to pool.cc) - const Pool6* pdpool = dynamic_cast(pool->get()); - if (!pdpool) { - isc_throw(ToElementError, "invalid pd-pool pointer"); - } - // Prepare the map for a pd-pool - ElementPtr pool_map = Element::createMap(); - // Set user-context - pdpool->contextToElement(pool_map); - // Set prefix - const IOAddress& prefix = pdpool->getFirstAddress(); - pool_map->set("prefix", Element::create(prefix.toText())); - // Set prefix-len (get it from min - max) - const IOAddress& last = pdpool->getLastAddress(); - int prefix_len = prefixLengthFromRange(prefix, last); - if (prefix_len < 0) { - // The pool is bad: give up - isc_throw(ToElementError, "invalid prefix range " - << prefix.toText() << "-" << last.toText()); - } - pool_map->set("prefix-len", Element::create(prefix_len)); - // Set delegated-len - uint8_t len = pdpool->getLength(); - pool_map->set("delegated-len", - Element::create(static_cast(len))); - - // Set excluded prefix - const Option6PDExcludePtr& xopt = - pdpool->getPrefixExcludeOption(); - if (xopt) { - const IOAddress& xprefix = - xopt->getExcludedPrefix(prefix, len); - pool_map->set("excluded-prefix", - Element::create(xprefix.toText())); - uint8_t xlen = xopt->getExcludedPrefixLength(); - pool_map->set("excluded-prefix-len", - Element::create(static_cast(xlen))); - } - - // Set pool options - ConstCfgOptionPtr opts = pdpool->getCfgOption(); - pool_map->set("option-data", opts->toElement()); - // Push on the pool list - pdpool_list->add(pool_map); + pdpool_list->add((*pool)->toElement()); } map->set("pd-pools", pdpool_list); diff --git a/src/lib/dhcpsrv/subnet.h b/src/lib/dhcpsrv/subnet.h index ed55698899..52b059a8e1 100644 --- a/src/lib/dhcpsrv/subnet.h +++ b/src/lib/dhcpsrv/subnet.h @@ -55,26 +55,39 @@ public: /// @return true if the address is in any of the pools bool inPool(Lease::Type type, const isc::asiolink::IOAddress& addr) const; - /// @brief returns the last address that was tried from this pool + /// @brief checks if the specified address is in allowed pools + /// + /// This takes also into account client classes + /// + /// @param type type of pools to iterate over + /// @param addr this address will be checked if it belongs to any pools in + /// that subnet + /// @param client_classes client class list which must be allowed + /// @return true if the address is in any of the allowed pools + bool inPool(Lease::Type type, + const isc::asiolink::IOAddress& addr, + const ClientClasses& client_classes) const; + + /// @brief returns the last address that was tried from this subnet /// /// This method returns the last address that was attempted to be allocated /// from this subnet. This is used as helper information for the next /// iteration of the allocation algorithm. /// - /// @todo: Define map somewhere in the + /// @todo: Define map somewhere in the /// AllocEngine::IterativeAllocator and keep the data there /// /// @param type lease type to be returned - /// @return address/prefix that was last tried from this pool + /// @return address/prefix that was last tried from this subnet isc::asiolink::IOAddress getLastAllocated(Lease::Type type) const; - /// @brief sets the last address that was tried from this pool + /// @brief sets the last address that was tried from this subnet /// /// This method sets the last address that was attempted to be allocated /// from this subnet. This is used as helper information for the next /// iteration of the allocation algorithm. /// - /// @todo: Define map somewhere in the + /// @todo: Define map somewhere in the /// AllocEngine::IterativeAllocator and keep the data there /// @param addr address/prefix to that was tried last /// @param type lease type to be set @@ -143,6 +156,17 @@ public: const PoolPtr getPool(Lease::Type type, const isc::asiolink::IOAddress& addr, bool anypool = true) const; + /// @brief Returns a pool that specified address belongs to with classes + /// + /// Variant using only pools allowing given classes + /// + /// @param type pool type that the pool is looked for + /// @param client_classes client class list which must be allowed + /// @param addr address that the returned pool should cover (optional) + const PoolPtr getPool(Lease::Type type, + const ClientClasses& client_classes, + const isc::asiolink::IOAddress& addr) const; + /// @brief Returns a pool without any address specified /// /// @param type pool type that the pool is looked for @@ -170,6 +194,14 @@ public: /// @param type type of the lease uint64_t getPoolCapacity(Lease::Type type) const; + /// @brief Returns the number of possible leases for specified lease type + /// allowed for a client which belongs to classes. + /// + /// @param type type of the lease + /// @param client_classes List of classes the client belongs to. + uint64_t getPoolCapacity(Lease::Type type, + const ClientClasses& client_classes) const; + /// @brief Returns textual representation of the subnet (e.g. /// "2001:db8::/64") /// @@ -283,11 +315,18 @@ protected: /// @throw BadValue if invalid value is used virtual void checkType(Lease::Type type) const = 0; - /// @brief returns a sum of possible leases in all pools + /// @brief Returns a sum of possible leases in all pools /// @param pools list of pools /// @return sum of possible leases uint64_t sumPoolCapacity(const PoolCollection& pools) const; + /// @brief Returns a sum of possible leases in all pools allowing classes + /// @param pools list of pools + /// @param client_classes list of classes + /// @return sum of possible/allowed leases + uint64_t sumPoolCapacity(const PoolCollection& pools, + const ClientClasses& client_classes) const; + /// @brief Checks if the specified pool overlaps with an existing pool. /// /// @param pool_type Pool type. diff --git a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc index ff216a6a77..3e1a370580 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine4_unittest.cc @@ -326,12 +326,35 @@ TEST_F(AllocEngine4Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, clientid_, + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); } } +// This test verifies that the allocator picks addresses that belong to the +// pool using classification +TEST_F(AllocEngine4Test, IterativeAllocator_class) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_V4)); + + // Restrict pool_ to the foo class. Add a second pool with bar class. + pool_->allowClientClass("foo"); + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.200"), + IOAddress("192.0.2.209"))); + pool->allowClientClass("bar"); + subnet_->addPool(pool); + + // Clients are in bar + cc_.insert("bar"); + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, clientid_, + IOAddress("0.0.0.0")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate, cc_)); + } +} // This test verifies that the iterative allocator really walks over all addresses // in all pools in specified subnet. It also must not pick the same address twice @@ -359,7 +382,7 @@ TEST_F(AllocEngine4Test, IterativeAllocator_manyPools4) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, clientid_, IOAddress("0.0.0.0")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, clientid_, IOAddress("0.0.0.0")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_V4, candidate)); // One way to easily verify that the iterative allocator really works is @@ -690,6 +713,44 @@ TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkClassification) { EXPECT_EQ("192.0.2.17", lease->addr_.toText()); } +// This test verifies that the server can offer an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkPoolClassification) { + + // Try to offer address from subnet1. There is one address available + // so it should be offerred. + AllocEngine::ClientContext4 + ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), + false, false, "host.example.com.", true); + ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234)); + Lease4Ptr lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should offer an address from subnet2 that belongs + // to the same shared network. + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1. + ctx.query_->addClass(ClientClass("cable-modem")); + + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_EQ("192.0.2.17", lease->addr_.toText()); +} + // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong. @@ -888,6 +949,59 @@ TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkClassification) { EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); } +// This test verifies that the server can assign an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkPoolClassification) { + // Try to offer address from subnet1. There is one address available + // so it should be offerred. + AllocEngine::ClientContext4 + ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(), + false, false, "host.example.com.", false); + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + Lease4Ptr lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should assign an address from subnet2 that belongs + // to the same shared network. + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Remove the lease so as we can start over. + LeaseMgrFactory::instance().deleteLease(lease->addr_); + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1. + ctx.query_->addClass(ClientClass("cable-modem")); + + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet1_->inPool(Lease::TYPE_V4, lease->addr_)); + + // Let's now remove the client from the cable-modem class and try + // to renew the address. The engine should determine that the + // client doesn't have access to the pool1 anymore and + // assign an address from unrestricted pool. + ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234)); + ctx.subnet_ = subnet1_; + lease = engine_.allocateLease4(ctx); + ASSERT_TRUE(lease); + EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_)); +} + // Test that reservations within shared network take precedence over the // existing leases regardless in which subnet belonging to a shared network // reservations belong (DHCPREQUEST case). diff --git a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc index 1002958cfb..e96ebbd37b 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc +++ b/src/lib/dhcpsrv/tests/alloc_engine6_unittest.cc @@ -189,11 +189,34 @@ TEST_F(AllocEngine6Test, IterativeAllocator) { alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); for (int i = 0; i < 1000; ++i) { - IOAddress candidate = alloc->pickAddress(subnet_, duid_, IOAddress("::")); + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); } } +// This test verifies that the allocator picks addresses that belong to the +// pool using classification +TEST_F(AllocEngine6Test, IterativeAllocator_class) { + boost::scoped_ptr + alloc(new NakedAllocEngine::IterativeAllocator(Lease::TYPE_NA)); + + // Restrict pool_ to the foo class. Add a second pool with bar class. + pool_->allowClientClass("foo"); + Pool6Ptr pool(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::109"))); + pool->allowClientClass("bar"); + subnet_->addPool(pool); + + // Clients are in bar + cc_.insert("bar"); + + for (int i = 0; i < 1000; ++i) { + IOAddress candidate = alloc->pickAddress(subnet_, cc_, duid_, IOAddress("::")); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); + EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate, cc_)); + } +} + TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); @@ -210,23 +233,100 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddrStep) { subnet_->addPool(pool3); // Let's check the first pool (5 addresses here) - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // The second pool is easy - only one address here - EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // This is the third and last pool, with 2 addresses in it - EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // We iterated over all addresses and reached to the end of the last pool. // Let's wrap around and start from the beginning - EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepInClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); + + subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool + + Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + IOAddress("2001:db8:1::5"))); + Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::100"))); + Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), + IOAddress("2001:db8:1::106"))); + // Set pool1 and pool3 but not pool2 in foo class + pool1->allowClientClass("foo"); + pool3->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients are in foo + cc_.insert("foo"); + + // Let's check the first pool (5 addresses here) + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is easy - only one address here + EXPECT_EQ("2001:db8:1::100", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // This is the third and last pool, with 2 addresses in it + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // We iterated over all addresses and reached to the end of the last pool. + // Let's wrap around and start from the beginning + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorAddrStepOutClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); + + subnet_->delPools(Lease::TYPE_NA); // Get rid of default pool + + Pool6Ptr pool1(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + IOAddress("2001:db8:1::5"))); + Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::100"), + IOAddress("2001:db8:1::100"))); + Pool6Ptr pool3(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1::105"), + IOAddress("2001:db8:1::106"))); + // Set pool2 in foo + pool2->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Let's check the first pool (5 addresses here) + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::3", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::4", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::5", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is skipped + + // This is the third and last pool, with 2 addresses in it + EXPECT_EQ("2001:db8:1::105", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::106", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // We iterated over all addresses and reached to the end of the last pool. + // Let's wrap around and start from the beginning + EXPECT_EQ("2001:db8:1::1", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::2", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { @@ -247,41 +347,158 @@ TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStep) { // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) // First pool check (Let's check over all 16 leases) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Second pool (just one lease here) - EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Third pool (256 leases, let's check first and last explicitly and the // rest over in a pool - EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); for (int i = 1; i < 255; i++) { stringstream exp; exp << "2001:db8:2:" << hex << i << dec << "::"; - EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } - EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); // Ok, we've iterated over all prefixes in all pools. We now wrap around. // We're looping over now (iterating over first pool again) - EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); - EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepInClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); + + subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); + + Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); + Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); + Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); + // Set pool1 and pool3 but not pool2 in foo class + pool1->allowClientClass("foo"); + pool3->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // Clients are in foo + cc_.insert("foo"); + + // We have a 2001:db8::/48 subnet that has 3 pools defined in it: + // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) + // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) + // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) + + // First pool check (Let's check over all 16 leases) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Second pool (just one lease here) + EXPECT_EQ("2001:db8:1::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Third pool (256 leases, let's check first and last explicitly and the + // rest over in a pool + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + for (int i = 1; i < 255; i++) { + stringstream exp; + exp << "2001:db8:2:" << hex << i << dec << "::"; + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + } + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Ok, we've iterated over all prefixes in all pools. We now wrap around. + // We're looping over now (iterating over first pool again) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); +} + +TEST_F(AllocEngine6Test, IterativeAllocatorPrefixStepOutClass) { + NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_PD); + + subnet_.reset(new Subnet6(IOAddress("2001:db8::"), 32, 1, 2, 3, 4)); + + Pool6Ptr pool1(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8::"), 56, 60)); + Pool6Ptr pool2(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:1::"), 48, 48)); + Pool6Ptr pool3(new Pool6(Lease::TYPE_PD, IOAddress("2001:db8:2::"), 56, 64)); + // Set pool2 in foo + pool2->allowClientClass("foo"); + subnet_->addPool(pool1); + subnet_->addPool(pool2); + subnet_->addPool(pool3); + + // We have a 2001:db8::/48 subnet that has 3 pools defined in it: + // 2001:db8::/56 split into /60 prefixes (16 leases) (or 2001:db8:0:X0::) + // 2001:db8:1::/48 split into a single /48 prefix (just 1 lease) + // 2001:db8:2::/56 split into /64 prefixes (256 leases) (or 2001:db8:2:XX::) + + // First pool check (Let's check over all 16 leases) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:20::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:30::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:40::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:50::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:60::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:70::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:80::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:90::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:a0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:b0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:c0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:d0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:e0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:f0::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // The second pool is skipped + + // Third pool (256 leases, let's check first and last explicitly and the + // rest over in a pool + EXPECT_EQ("2001:db8:2::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + for (int i = 1; i < 255; i++) { + stringstream exp; + exp << "2001:db8:2:" << hex << i << dec << "::"; + EXPECT_EQ(exp.str(), alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + } + EXPECT_EQ("2001:db8:2:ff::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + + // Ok, we've iterated over all prefixes in all pools. We now wrap around. + // We're looping over now (iterating over first pool again) + EXPECT_EQ("2001:db8::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); + EXPECT_EQ("2001:db8:0:10::", alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")).toText()); } // This test verifies that the iterative allocator can step over addresses @@ -289,7 +506,7 @@ TEST_F(AllocEngine6Test, IterativeAllocatorAddressIncrease) { NakedAllocEngine::NakedIterativeAllocator alloc(Lease::TYPE_NA); // Let's pick the first address - IOAddress addr1 = alloc.pickAddress(subnet_, duid_, IOAddress("2001:db8:1::10")); + IOAddress addr1 = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("2001:db8:1::10")); // Check that we can indeed pick the first address from the pool EXPECT_EQ("2001:db8:1::10", addr1.toText()); @@ -379,7 +596,7 @@ TEST_F(AllocEngine6Test, IterativeAllocator_manyPools6) { std::set generated_addrs; int cnt = 0; while (++cnt) { - IOAddress candidate = alloc.pickAddress(subnet_, duid_, IOAddress("::")); + IOAddress candidate = alloc.pickAddress(subnet_, cc_, duid_, IOAddress("::")); EXPECT_TRUE(subnet_->inPool(Lease::TYPE_NA, candidate)); // One way to easily verify that the iterative allocator really works is @@ -2185,6 +2402,58 @@ TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkClassification) { EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); } +// This test verifies that the server can offer an address from a +// different subnet than orginally selected, when the address pool in +// the first subnet requires another class. +TEST_F(SharedNetworkAlloc6Test, solicitSharedNetworkPoolClassification) { + // Try to offer address from subnet1. There is an address available so + // it should be offerred. + Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); + AllocEngine::ClientContext6 ctx(subnet1_, duid_, false, false, "", true, + query); + ctx.currentIA().iaid_ = iaid_; + + Lease6Ptr lease; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet1_->inRange(lease->addr_)); + + // Apply restrictions on the pool1. This should be only assigned + // to clients belonging to cable-modem class. + pool1_->allowClientClass("cable-modem"); + + // The allocation engine should determine that the pool1 is not + // available for the client not belonging to the cable-modem class. + // Instead, it should offer an address from subnet2 that belongs + // to the same shared network. + AllocEngine::ClientContext6 ctx2(subnet1_, duid_, false, false, "", true, + query); + ctx2.currentIA().iaid_ = iaid_; + ctx2.query_ = query; + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx2))); + ASSERT_TRUE(lease); + ASSERT_TRUE(subnet2_->inRange(lease->addr_)); + + AllocEngine::ClientContext6 ctx3(subnet1_, duid_, false, false, "", true, + query); + ctx3.currentIA().iaid_ = iaid_; + ctx3.query_ = query; + + AllocEngine::ClientContext6 ctx4(subnet1_, duid_, false, false, "", true, + query); + ctx4.currentIA().iaid_ = iaid_; + ctx4.query_ = query; + + // Assign cable-modem class and try again. This time, we should + // offer an address from the pool1_. + ctx4.query_->addClass(ClientClass("cable-modem")); + + AllocEngine::findReservation(ctx4); + ASSERT_NO_THROW(lease = expectOneLease(engine_.allocateLeases6(ctx4))); + ASSERT_TRUE(lease); + EXPECT_EQ("2001:db8:1::1", lease->addr_.toText()); +} + // This test verifies that the client is offerred a reserved address // even if this address belongs to another subnet within the same // shared network. diff --git a/src/lib/dhcpsrv/tests/alloc_engine_utils.h b/src/lib/dhcpsrv/tests/alloc_engine_utils.h index 426189eaaa..eeed469755 100644 --- a/src/lib/dhcpsrv/tests/alloc_engine_utils.h +++ b/src/lib/dhcpsrv/tests/alloc_engine_utils.h @@ -74,6 +74,7 @@ public: :IterativeAllocator(type) { } + using AllocEngine::IterativeAllocator::increaseAddress; using AllocEngine::IterativeAllocator::increasePrefix; }; }; @@ -221,10 +222,10 @@ public: /// @param input address to be increased /// @param exp_output expected address after increase void - checkAddrIncrease(NakedAllocEngine::NakedIterativeAllocator&, + checkAddrIncrease(NakedAllocEngine::NakedIterativeAllocator& alloc, std::string input, std::string exp_output) { - EXPECT_EQ(exp_output, asiolink::IOAddress::increase( - asiolink::IOAddress(input)).toText()); + EXPECT_EQ(exp_output, alloc.increaseAddress(asiolink::IOAddress(input), + false, 0).toText()); } /// @brief Checks if increasePrefix() works as expected @@ -409,6 +410,7 @@ public: bool fqdn_fwd_; ///< Perform forward update for a lease. bool fqdn_rev_; ///< Perform reverse update for a lease. LeaseMgrFactory factory_; ///< pointer to LeaseMgr factory + ClientClasses cc_; ///< client classes }; /// @brief Used in Allocation Engine tests for IPv4 @@ -510,6 +512,7 @@ public: Pool4Ptr pool_; ///< Pool belonging to subnet_ LeaseMgrFactory factory_; ///< Pointer to LeaseMgr factory AllocEngine::ClientContext4 ctx_; ///< Context information passed to various + ClientClasses cc_; ///< Client classes ///< allocation engine functions. }; diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index cfe0363bda..fb2f22a554 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -819,6 +819,7 @@ TEST(CfgSubnets4Test, unparsePool) { Subnet4Ptr subnet(new Subnet4(IOAddress("192.0.2.0"), 24, 1, 2, 3, 123)); Pool4Ptr pool1(new Pool4(IOAddress("192.0.2.1"), IOAddress("192.0.2.10"))); Pool4Ptr pool2(new Pool4(IOAddress("192.0.2.64"), 26)); + pool2->allowClientClass("bar"); std::string json1 = "{ \"comment\": \"foo\", \"version\": 1 }"; data::ElementPtr ctx1 = data::Element::fromJSON(json1); @@ -857,6 +858,7 @@ TEST(CfgSubnets4Test, unparsePool) { " },{\n" " \"option-data\": [ ],\n" " \"pool\": \"192.0.2.64/26\"\n," + " \"client-class\": \"bar\",\n" " \"user-context\": { \"foo\": \"bar\" }\n" " }\n" " ]\n" diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index f8200fad06..5565387d26 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -510,6 +510,7 @@ TEST(CfgSubnets6Test, unparsePool) { IOAddress("2001:db8:1::100"), IOAddress("2001:db8:1::199"))); Pool6Ptr pool2(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:1::"), 64)); + pool2->allowClientClass("bar"); std::string json1 = "{ \"comment\": \"foo\", \"version\": 1 }"; data::ElementPtr ctx1 = data::Element::fromJSON(json1); @@ -541,6 +542,7 @@ TEST(CfgSubnets6Test, unparsePool) { " \"option-data\": [ ]\n" " },{\n" " \"pool\": \"2001:db8:1:1::/64\",\n" + " \"client-class\": \"bar\",\n" " \"user-context\": { \"foo\": \"bar\" },\n" " \"option-data\": [ ]\n" " }\n" @@ -563,6 +565,7 @@ TEST(CfgSubnets6Test, unparsePdPool) { IOAddress("2001:db8:2::"), 48, 64)); Pool6Ptr pdpool2(new Pool6(IOAddress("2001:db8:3::"), 48, 56, IOAddress("2001:db8:3::"), 64)); + pdpool2->allowClientClass("bar"); data::ElementPtr ctx1 = data::Element::fromJSON("{ \"foo\": [ \"bar\" ] }"); pdpool1->setContext(ctx1); @@ -597,7 +600,8 @@ TEST(CfgSubnets6Test, unparsePdPool) { " \"delegated-len\": 56,\n" " \"excluded-prefix\": \"2001:db8:3::\",\n" " \"excluded-prefix-len\": 64,\n" - " \"option-data\": [ ]\n" + " \"option-data\": [ ],\n" + " \"client-class\": \"bar\"\n" " }\n" " ],\n" " \"option-data\": [ ]\n" diff --git a/src/lib/dhcpsrv/tests/pool_unittest.cc b/src/lib/dhcpsrv/tests/pool_unittest.cc index b78cf1fbcd..27960e0254 100644 --- a/src/lib/dhcpsrv/tests/pool_unittest.cc +++ b/src/lib/dhcpsrv/tests/pool_unittest.cc @@ -190,6 +190,106 @@ TEST(Pool4Test, userContext) { EXPECT_EQ(ctx->str(), pool->getContext()->str()); } +// This test checks that handling for client-class is valid. +TEST(Pool4Test, clientClass) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool->getClientClasses().size()); + EXPECT_TRUE(pool->clientSupported(no_class)); + EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); + + // Let's allow only clients belonging to "bar" class. + pool->allowClientClass("bar"); + EXPECT_EQ(1, pool->getClientClasses().size()); + + EXPECT_FALSE(pool->clientSupported(no_class)); + EXPECT_FALSE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + EXPECT_TRUE(pool->clientSupported(three_classes)); +} + +// This test checks that handling for multiple client-classes is valid. +TEST(Pool4Test, clientClasses) { + // Create a pool. + Pool4Ptr pool(new Pool4(IOAddress("192.0.2.0"), + IOAddress("192.0.2.255"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool->getClientClasses().size()); + EXPECT_TRUE(pool->clientSupported(no_class)); + EXPECT_TRUE(pool->clientSupported(foo_class)); + EXPECT_TRUE(pool->clientSupported(bar_class)); + + // Let's allow clients belonging to "bar" or "foo" class. + pool->allowClientClass("bar"); + pool->allowClientClass("foo"); + EXPECT_EQ(2, pool->getClientClasses().size()); + + // Class-less clients are to be rejected. + EXPECT_FALSE(pool->clientSupported(no_class)); + + // Clients in foo class should be accepted. + EXPECT_TRUE(pool->clientSupported(foo_class)); + + // Clients in bar class should be accepted as well. + EXPECT_TRUE(pool->clientSupported(bar_class)); +} + +// This test checks that handling for last allocated address/prefix is valid. +TEST(Pool4Test, lastAllocated) { + // Create a pool. + IOAddress first("192.0.2.0"); + Pool4Ptr pool(new Pool4(first, IOAddress("192.0.2.255"))); + + // Initial values are first invalid. + EXPECT_EQ(first.toText(), pool->getLastAllocated().toText()); + EXPECT_FALSE(pool->isLastAllocatedValid()); + + // Now set last allocated + IOAddress addr("192.0.2.100"); + EXPECT_NO_THROW(pool->setLastAllocated(addr)); + EXPECT_EQ(addr.toText(), pool->getLastAllocated().toText()); + EXPECT_TRUE(pool->isLastAllocatedValid()); + + // Reset makes it invalid and does not touch address + pool->resetLastAllocated(); + EXPECT_EQ(addr.toText(), pool->getLastAllocated().toText()); + EXPECT_FALSE(pool->isLastAllocatedValid()); +} + TEST(Pool6Test, constructor_first_last) { // let's construct 2001:db8:1:: - 2001:db8:1::ffff:ffff:ffff:ffff pool @@ -494,4 +594,104 @@ TEST(Pool6Test, userContext) { EXPECT_EQ(ctx->str(), pool.getContext()->str()); } +// This test checks that handling for client-class is valid. +TEST(Pool6Test, clientClass) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool.getClientClasses().size()); + EXPECT_TRUE(pool.clientSupported(no_class)); + EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); + + // Let's allow only clients belonging to "bar" class. + pool.allowClientClass("bar"); + EXPECT_EQ(1, pool.getClientClasses().size()); + + EXPECT_FALSE(pool.clientSupported(no_class)); + EXPECT_FALSE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + EXPECT_TRUE(pool.clientSupported(three_classes)); +} + +// This test checks that handling for multiple client-classes is valid. +TEST(Pool6Test, clientClasses) { + // Create a pool. + Pool6 pool(Lease::TYPE_NA, IOAddress("2001:db8::1"), + IOAddress("2001:db8::2")); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // No class restrictions defined, any client should be supported + EXPECT_EQ(0, pool.getClientClasses().size()); + EXPECT_TRUE(pool.clientSupported(no_class)); + EXPECT_TRUE(pool.clientSupported(foo_class)); + EXPECT_TRUE(pool.clientSupported(bar_class)); + + // Let's allow clients belonging to "bar" or "foo" class. + pool.allowClientClass("bar"); + pool.allowClientClass("foo"); + EXPECT_EQ(2, pool.getClientClasses().size()); + + // Class-less clients are to be rejected. + EXPECT_FALSE(pool.clientSupported(no_class)); + + // Clients in foo class should be accepted. + EXPECT_TRUE(pool.clientSupported(foo_class)); + + // Clients in bar class should be accepted as well. + EXPECT_TRUE(pool.clientSupported(bar_class)); +} + +// This test checks that handling for last allocated address/prefix is valid. +TEST(Pool6Test, lastAllocated) { + // Create a pool. + IOAddress first("2001:db8::1"); + Pool6 pool(Lease::TYPE_NA, first, IOAddress("2001:db8::200")); + + // Initial values are first invalid. + EXPECT_EQ(first.toText(), pool.getLastAllocated().toText()); + EXPECT_FALSE(pool.isLastAllocatedValid()); + + // Now set last allocated + IOAddress addr("2001:db8::100"); + EXPECT_NO_THROW(pool.setLastAllocated(addr)); + EXPECT_EQ(addr.toText(), pool.getLastAllocated().toText()); + EXPECT_TRUE(pool.isLastAllocatedValid()); + + // Reset makes it invalid and does not touch address + pool.resetLastAllocated(); + EXPECT_EQ(addr.toText(), pool.getLastAllocated().toText()); + EXPECT_FALSE(pool.isLastAllocatedValid()); +} + }; // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index a969b9ccab..4226bc2eea 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -168,15 +168,18 @@ TEST(Subnet4Test, pool4InSubnet4) { PoolPtr pool1(new Pool4(IOAddress("192.1.2.0"), 25)); PoolPtr pool2(new Pool4(IOAddress("192.1.2.128"), 26)); PoolPtr pool3(new Pool4(IOAddress("192.1.2.192"), 30)); + pool3->allowClientClass("bar"); + PoolPtr pool4(new Pool4(IOAddress("192.1.2.200"), 30)); // Add pools in reverse order to make sure that they get ordered by // first address. - EXPECT_NO_THROW(subnet->addPool(pool3)); + EXPECT_NO_THROW(subnet->addPool(pool4)); // If there's only one pool, get that pool PoolPtr mypool = subnet->getAnyPool(Lease::TYPE_V4); - EXPECT_EQ(mypool, pool3); + EXPECT_EQ(mypool, pool4); + EXPECT_NO_THROW(subnet->addPool(pool3)); EXPECT_NO_THROW(subnet->addPool(pool2)); EXPECT_NO_THROW(subnet->addPool(pool1)); @@ -188,8 +191,8 @@ TEST(Subnet4Test, pool4InSubnet4) { // If we provide a hint, we should get a pool that this hint belongs to ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, - IOAddress("192.1.2.195"))); - EXPECT_EQ(mypool, pool3); + IOAddress("192.1.2.201"))); + EXPECT_EQ(mypool, pool4); ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, IOAddress("192.1.2.129"))); @@ -203,7 +206,7 @@ TEST(Subnet4Test, pool4InSubnet4) { // third parameter prevents it from returning "any" available // pool if a good match is not found. ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, - IOAddress("192.1.2.200"), + IOAddress("192.1.2.210"), false)); EXPECT_FALSE(mypool); @@ -211,6 +214,57 @@ TEST(Subnet4Test, pool4InSubnet4) { IOAddress("192.1.1.254"), false)); EXPECT_FALSE(mypool); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + // If we provide a hint, we should get a pool that this hint belongs to + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.201"))); + EXPECT_EQ(mypool, pool4); + + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.129"))); + EXPECT_EQ(mypool, pool2); + + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.64"))); + EXPECT_EQ(mypool, pool1); + + // Specify addresses which don't belong to any existing pools. + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + IOAddress("192.1.2.210"))); + EXPECT_FALSE(mypool); + + // Pool3 requires a member of bar + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, no_class, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, foo_class, + IOAddress("192.1.2.195"))); + EXPECT_FALSE(mypool); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, bar_class, + IOAddress("192.1.2.195"))); + EXPECT_EQ(mypool, pool3); + ASSERT_NO_THROW(mypool = subnet->getPool(Lease::TYPE_V4, three_classes, + IOAddress("192.1.2.195"))); + EXPECT_EQ(mypool, pool3); } // Check if it's possible to get specified number of possible leases for @@ -237,6 +291,38 @@ TEST(Subnet4Test, getCapacity) { PoolPtr pool3(new Pool4(IOAddress("192.1.2.192"), 30)); subnet->addPool(pool3); EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4)); + + // Let's add a forth pool /30. This one has 4 addresses. + PoolPtr pool4(new Pool4(IOAddress("192.1.2.200"), 30)); + subnet->addPool(pool4); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4)); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, no_class)); + EXPECT_EQ(196, subnet->getPoolCapacity(Lease::TYPE_V4, foo_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, bar_class)); + EXPECT_EQ(200, subnet->getPoolCapacity(Lease::TYPE_V4, three_classes)); } // Checks that it is not allowed to add invalid pools. @@ -435,19 +521,44 @@ TEST(Subnet4Test, inRangeinPool) { // the first address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("192.2.0.0"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.0.0"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.0.0"))); // let's try something in the middle as well EXPECT_TRUE(subnet->inRange(IOAddress("192.2.3.4"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); // the last address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("192.2.255.255"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.255.255"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.255.255"))); // the first address that is in range, but out of pool EXPECT_TRUE(subnet->inRange(IOAddress("192.3.0.0"))); EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.3.0.0"))); + + // Add with classes + pool1->allowClientClass("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), no_class)); + + // This client belongs to foo only + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), foo_class)); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), bar_class)); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_V4, IOAddress("192.2.3.4"), three_classes)); } // This test checks if the toText() method returns text representation @@ -647,6 +758,37 @@ TEST(Subnet6Test, Pool6getCapacity) { EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), subnet->getPoolCapacity(Lease::TYPE_NA)); + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + EXPECT_EQ(uint64_t(4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, no_class)); + EXPECT_EQ(uint64_t(4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, foo_class)); + EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, bar_class)); + EXPECT_EQ(uint64_t(4294967296ull + 4294967296ull + 65536), + subnet->getPoolCapacity(Lease::TYPE_NA, three_classes)); + // This is 2^64 prefixes. We're overflown uint64_t. PoolPtr pool4(new Pool6(Lease::TYPE_NA, IOAddress("2001:db8:1:4::"), 64)); subnet->addPool(pool4); @@ -657,6 +799,7 @@ TEST(Subnet6Test, Pool6getCapacity) { subnet->addPool(pool5); EXPECT_EQ(std::numeric_limits::max(), subnet->getPoolCapacity(Lease::TYPE_NA)); + } // Test checks whether the number of prefixes available in the pools are @@ -725,6 +868,41 @@ TEST(Subnet6Test, Pool6InSubnet6) { mypool = subnet->getPool(Lease::TYPE_NA, IOAddress("2001:db8:1:3::dead:beef")); EXPECT_EQ(mypool, pool3); + + // Now play with classes + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + + // This client belongs to foo only. + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + + pool3->allowClientClass("bar"); + + // Pool3 requires a member of bar + mypool = subnet->getPool(Lease::TYPE_NA, no_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, foo_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_FALSE(mypool); + mypool = subnet->getPool(Lease::TYPE_NA, bar_class, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); + mypool = subnet->getPool(Lease::TYPE_NA, three_classes, + IOAddress("2001:db8:1:3::dead:beef")); + EXPECT_EQ(mypool, pool3); } // Check if Subnet6 supports different types of pools properly. @@ -1198,11 +1376,11 @@ TEST(Subnet6Test, inRangeinPool) { // the first address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::10"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::10"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::10"))); // let's try something in the middle as well EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::18"))); - EXPECT_TRUE (subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); // the last address that is in range, in pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::20"))); @@ -1211,6 +1389,31 @@ TEST(Subnet6Test, inRangeinPool) { // the first address that is in range, but out of pool EXPECT_TRUE(subnet->inRange(IOAddress("2001:db8::21"))); EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::21"))); + + // Add with classes + pool1->allowClientClass("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"))); + + // This client does not belong to any class. + isc::dhcp::ClientClasses no_class; + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), no_class)); + + // This client belongs to foo only + isc::dhcp::ClientClasses foo_class; + foo_class.insert("foo"); + EXPECT_FALSE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), foo_class)); + + // This client belongs to bar only. I like that client. + isc::dhcp::ClientClasses bar_class; + bar_class.insert("bar"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), bar_class)); + + // This client belongs to foo, bar and baz classes. + isc::dhcp::ClientClasses three_classes; + three_classes.insert("foo"); + three_classes.insert("bar"); + three_classes.insert("baz"); + EXPECT_TRUE(subnet->inPool(Lease::TYPE_NA, IOAddress("2001:db8::18"), three_classes)); } // This test verifies that inRange() and inPool() methods work properly