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