]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5098] Specialized list2 to string only - migrated global client class defs
authorFrancis Dupont <fdupont@isc.org>
Sun, 8 Jan 2017 16:12:20 +0000 (17:12 +0100)
committerFrancis Dupont <fdupont@isc.org>
Sun, 8 Jan 2017 16:12:20 +0000 (17:12 +0100)
src/bin/dhcp4/dhcp4_parser.cc
src/bin/dhcp4/dhcp4_parser.h
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp6/dhcp6_parser.cc
src/bin/dhcp6/dhcp6_parser.h
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/json_config_parser.cc
src/lib/dhcpsrv/parsers/client_class_def_parser.cc
src/lib/dhcpsrv/parsers/client_class_def_parser.h
src/lib/dhcpsrv/tests/client_class_def_parser_unittest.cc

index da6091cb6752e4434649e88d2fa5b3c33232327c..10113cde2b090253fbaf11d5c51ca397f4e7601f 100644 (file)
@@ -781,75 +781,93 @@ namespace isc { namespace dhcp {
 #line 782 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 38:
-#line 264 "dhcp4_parser.yy" // lalr1.cc:859
+  case 40:
+#line 267 "dhcp4_parser.yy" // lalr1.cc:859
+    {
+                  // List consisting of a single element.
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
+                  }
+#line 791 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 41:
+#line 271 "dhcp4_parser.yy" // lalr1.cc:859
+    {
+                  // List ending with , and a value.
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
+                  }
+#line 800 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 42:
+#line 278 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // List parsing about to start
 }
-#line 790 "dhcp4_parser.cc" // lalr1.cc:859
+#line 808 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 39:
-#line 266 "dhcp4_parser.yy" // lalr1.cc:859
+  case 43:
+#line 280 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
     //ctx.stack_.pop_back();
 }
-#line 799 "dhcp4_parser.cc" // lalr1.cc:859
+#line 817 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 42:
-#line 275 "dhcp4_parser.yy" // lalr1.cc:859
+  case 46:
+#line 289 "dhcp4_parser.yy" // lalr1.cc:859
     {
-                  // List consisting of a single element.
-                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
-                  }
-#line 808 "dhcp4_parser.cc" // lalr1.cc:859
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ctx.stack_.back()->add(s);
+                          }
+#line 826 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 43:
-#line 279 "dhcp4_parser.yy" // lalr1.cc:859
+  case 47:
+#line 293 "dhcp4_parser.yy" // lalr1.cc:859
     {
-                  // List ending with , and a value.
-                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
-                  }
-#line 817 "dhcp4_parser.cc" // lalr1.cc:859
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ctx.stack_.back()->add(s);
+                          }
+#line 835 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 44:
-#line 290 "dhcp4_parser.yy" // lalr1.cc:859
+  case 48:
+#line 304 "dhcp4_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 828 "dhcp4_parser.cc" // lalr1.cc:859
+#line 846 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 45:
-#line 300 "dhcp4_parser.yy" // lalr1.cc:859
+  case 49:
+#line 314 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 839 "dhcp4_parser.cc" // lalr1.cc:859
+#line 857 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 46:
-#line 305 "dhcp4_parser.yy" // lalr1.cc:859
+  case 50:
+#line 319 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 849 "dhcp4_parser.cc" // lalr1.cc:859
+#line 867 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 54:
-#line 324 "dhcp4_parser.yy" // lalr1.cc:859
+  case 58:
+#line 338 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
@@ -858,11 +876,11 @@ namespace isc { namespace dhcp {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP4);
 }
-#line 862 "dhcp4_parser.cc" // lalr1.cc:859
+#line 880 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 55:
-#line 331 "dhcp4_parser.yy" // lalr1.cc:859
+  case 59:
+#line 345 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
@@ -870,522 +888,522 @@ namespace isc { namespace dhcp {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 874 "dhcp4_parser.cc" // lalr1.cc:859
+#line 892 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 56:
-#line 341 "dhcp4_parser.yy" // lalr1.cc:859
+  case 60:
+#line 355 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the Dhcp4 map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 884 "dhcp4_parser.cc" // lalr1.cc:859
+#line 902 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 57:
-#line 345 "dhcp4_parser.yy" // lalr1.cc:859
+  case 61:
+#line 359 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 892 "dhcp4_parser.cc" // lalr1.cc:859
+#line 910 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 82:
-#line 379 "dhcp4_parser.yy" // lalr1.cc:859
+  case 86:
+#line 393 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("valid-lifetime", prf);
 }
-#line 901 "dhcp4_parser.cc" // lalr1.cc:859
+#line 919 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 83:
-#line 384 "dhcp4_parser.yy" // lalr1.cc:859
+  case 87:
+#line 398 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("renew-timer", prf);
 }
-#line 910 "dhcp4_parser.cc" // lalr1.cc:859
+#line 928 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 84:
-#line 389 "dhcp4_parser.yy" // lalr1.cc:859
+  case 88:
+#line 403 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rebind-timer", prf);
 }
-#line 919 "dhcp4_parser.cc" // lalr1.cc:859
+#line 937 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 85:
-#line 394 "dhcp4_parser.yy" // lalr1.cc:859
+  case 89:
+#line 408 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
 }
-#line 928 "dhcp4_parser.cc" // lalr1.cc:859
+#line 946 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 86:
-#line 399 "dhcp4_parser.yy" // lalr1.cc:859
+  case 90:
+#line 413 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("echo-client-id", echo);
 }
-#line 937 "dhcp4_parser.cc" // lalr1.cc:859
+#line 955 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 87:
-#line 404 "dhcp4_parser.yy" // lalr1.cc:859
+  case 91:
+#line 418 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("match-client-id", match);
 }
-#line 946 "dhcp4_parser.cc" // lalr1.cc:859
+#line 964 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 88:
-#line 410 "dhcp4_parser.yy" // lalr1.cc:859
+  case 92:
+#line 424 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces-config", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.INTERFACES_CONFIG);
 }
-#line 957 "dhcp4_parser.cc" // lalr1.cc:859
+#line 975 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 89:
-#line 415 "dhcp4_parser.yy" // lalr1.cc:859
+  case 93:
+#line 429 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 966 "dhcp4_parser.cc" // lalr1.cc:859
+#line 984 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 94:
-#line 428 "dhcp4_parser.yy" // lalr1.cc:859
+  case 98:
+#line 442 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the interfaces-config map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 976 "dhcp4_parser.cc" // lalr1.cc:859
+#line 994 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 95:
-#line 432 "dhcp4_parser.yy" // lalr1.cc:859
+  case 99:
+#line 446 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 984 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1002 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 96:
-#line 436 "dhcp4_parser.yy" // lalr1.cc:859
+  case 100:
+#line 450 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 995 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1013 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 97:
-#line 441 "dhcp4_parser.yy" // lalr1.cc:859
+  case 101:
+#line 455 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1004 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1022 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 98:
-#line 446 "dhcp4_parser.yy" // lalr1.cc:859
+  case 102:
+#line 460 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1012 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1030 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 99:
-#line 448 "dhcp4_parser.yy" // lalr1.cc:859
+  case 103:
+#line 462 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr type(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-socket-type", type);
     ctx.leave();
 }
-#line 1022 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1040 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 100:
-#line 454 "dhcp4_parser.yy" // lalr1.cc:859
+  case 104:
+#line 468 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lease-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.LEASE_DATABASE);
 }
-#line 1033 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1051 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 101:
-#line 459 "dhcp4_parser.yy" // lalr1.cc:859
+  case 105:
+#line 473 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1042 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1060 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 102:
-#line 464 "dhcp4_parser.yy" // lalr1.cc:859
+  case 106:
+#line 478 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1053 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1071 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 103:
-#line 469 "dhcp4_parser.yy" // lalr1.cc:859
+  case 107:
+#line 483 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1062 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1080 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 115:
-#line 489 "dhcp4_parser.yy" // lalr1.cc:859
+  case 119:
+#line 503 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1070 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1088 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 116:
-#line 491 "dhcp4_parser.yy" // lalr1.cc:859
+  case 120:
+#line 505 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("type", prf);
     ctx.leave();
 }
-#line 1080 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1098 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 117:
-#line 497 "dhcp4_parser.yy" // lalr1.cc:859
+  case 121:
+#line 511 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1088 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1106 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 118:
-#line 499 "dhcp4_parser.yy" // lalr1.cc:859
+  case 122:
+#line 513 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user", user);
     ctx.leave();
 }
-#line 1098 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1116 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 119:
-#line 505 "dhcp4_parser.yy" // lalr1.cc:859
+  case 123:
+#line 519 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1106 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1124 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 120:
-#line 507 "dhcp4_parser.yy" // lalr1.cc:859
+  case 124:
+#line 521 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password", pwd);
     ctx.leave();
 }
-#line 1116 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1134 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 121:
-#line 513 "dhcp4_parser.yy" // lalr1.cc:859
+  case 125:
+#line 527 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1124 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1142 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 122:
-#line 515 "dhcp4_parser.yy" // lalr1.cc:859
+  case 126:
+#line 529 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host", h);
     ctx.leave();
 }
-#line 1134 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1152 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 123:
-#line 521 "dhcp4_parser.yy" // lalr1.cc:859
+  case 127:
+#line 535 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1142 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1160 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 124:
-#line 523 "dhcp4_parser.yy" // lalr1.cc:859
+  case 128:
+#line 537 "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("name", name);
     ctx.leave();
 }
-#line 1152 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1170 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 125:
-#line 529 "dhcp4_parser.yy" // lalr1.cc:859
+  case 129:
+#line 543 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("persist", n);
 }
-#line 1161 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1179 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 126:
-#line 534 "dhcp4_parser.yy" // lalr1.cc:859
+  case 130:
+#line 548 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lfc-interval", n);
 }
-#line 1170 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1188 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 127:
-#line 539 "dhcp4_parser.yy" // lalr1.cc:859
+  case 131:
+#line 553 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("readonly", n);
 }
-#line 1179 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1197 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 128:
-#line 544 "dhcp4_parser.yy" // lalr1.cc:859
+  case 132:
+#line 558 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1188 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1206 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 129:
-#line 549 "dhcp4_parser.yy" // lalr1.cc:859
+  case 133:
+#line 563 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host-reservation-identifiers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS);
 }
-#line 1199 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1217 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 130:
-#line 554 "dhcp4_parser.yy" // lalr1.cc:859
+  case 134:
+#line 568 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1208 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1226 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 137:
-#line 569 "dhcp4_parser.yy" // lalr1.cc:859
+  case 141:
+#line 583 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(hwaddr);
 }
-#line 1217 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1235 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 138:
-#line 574 "dhcp4_parser.yy" // lalr1.cc:859
+  case 142:
+#line 588 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(circuit);
 }
-#line 1226 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1244 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 139:
-#line 579 "dhcp4_parser.yy" // lalr1.cc:859
+  case 143:
+#line 593 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(client);
 }
-#line 1235 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1253 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 140:
-#line 584 "dhcp4_parser.yy" // lalr1.cc:859
+  case 144:
+#line 598 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hooks-libraries", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOOKS_LIBRARIES);
 }
-#line 1246 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1264 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 141:
-#line 589 "dhcp4_parser.yy" // lalr1.cc:859
+  case 145:
+#line 603 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1255 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1273 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 146:
-#line 602 "dhcp4_parser.yy" // lalr1.cc:859
+  case 150:
+#line 616 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1265 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1283 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 147:
-#line 606 "dhcp4_parser.yy" // lalr1.cc:859
+  case 151:
+#line 620 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1273 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1291 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 148:
-#line 610 "dhcp4_parser.yy" // lalr1.cc:859
+  case 152:
+#line 624 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the hooks-libraries list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1283 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1301 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 149:
-#line 614 "dhcp4_parser.yy" // lalr1.cc:859
+  case 153:
+#line 628 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1291 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1309 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 155:
-#line 627 "dhcp4_parser.yy" // lalr1.cc:859
+  case 159:
+#line 641 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1299 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1317 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 156:
-#line 629 "dhcp4_parser.yy" // lalr1.cc:859
+  case 160:
+#line 643 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1309 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1327 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 157:
-#line 635 "dhcp4_parser.yy" // lalr1.cc:859
+  case 161:
+#line 649 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1317 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1335 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 158:
-#line 637 "dhcp4_parser.yy" // lalr1.cc:859
+  case 162:
+#line 651 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1326 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1344 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 159:
-#line 643 "dhcp4_parser.yy" // lalr1.cc:859
+  case 163:
+#line 657 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("expired-leases-processing", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1337 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1355 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 160:
-#line 648 "dhcp4_parser.yy" // lalr1.cc:859
+  case 164:
+#line 662 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1346 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1364 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 163:
-#line 660 "dhcp4_parser.yy" // lalr1.cc:859
+  case 167:
+#line 674 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), value);
 }
-#line 1355 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1373 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 164:
-#line 668 "dhcp4_parser.yy" // lalr1.cc:859
+  case 168:
+#line 682 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet4", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SUBNET4);
 }
-#line 1366 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1384 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 165:
-#line 673 "dhcp4_parser.yy" // lalr1.cc:859
+  case 169:
+#line 687 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1375 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1393 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 170:
-#line 693 "dhcp4_parser.yy" // lalr1.cc:859
+  case 174:
+#line 707 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1385 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1403 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 171:
-#line 697 "dhcp4_parser.yy" // lalr1.cc:859
+  case 175:
+#line 711 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Once we reached this place, the subnet parsing is now complete.
     // If we want to, we can implement default values here.
@@ -1404,1133 +1422,1133 @@ namespace isc { namespace dhcp {
     // }
     ctx.stack_.pop_back();
 }
-#line 1408 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1426 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 172:
-#line 716 "dhcp4_parser.yy" // lalr1.cc:859
+  case 176:
+#line 730 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the subnet4 list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1418 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1436 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 173:
-#line 720 "dhcp4_parser.yy" // lalr1.cc:859
+  case 177:
+#line 734 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1426 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1444 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 196:
-#line 752 "dhcp4_parser.yy" // lalr1.cc:859
+  case 200:
+#line 766 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1434 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1452 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 197:
-#line 754 "dhcp4_parser.yy" // lalr1.cc:859
+  case 201:
+#line 768 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet", subnet);
     ctx.leave();
 }
-#line 1444 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1462 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 198:
-#line 760 "dhcp4_parser.yy" // lalr1.cc:859
+  case 202:
+#line 774 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1452 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1470 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 199:
-#line 762 "dhcp4_parser.yy" // lalr1.cc:859
+  case 203:
+#line 776 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface", iface);
     ctx.leave();
 }
-#line 1462 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1480 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 200:
-#line 768 "dhcp4_parser.yy" // lalr1.cc:859
+  case 204:
+#line 782 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1470 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1488 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 201:
-#line 770 "dhcp4_parser.yy" // lalr1.cc:859
+  case 205:
+#line 784 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface-id", iface);
     ctx.leave();
 }
-#line 1480 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1498 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 202:
-#line 776 "dhcp4_parser.yy" // lalr1.cc:859
+  case 206:
+#line 790 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1488 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1506 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 203:
-#line 778 "dhcp4_parser.yy" // lalr1.cc:859
+  case 207:
+#line 792 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-subnet", iface);
     ctx.leave();
 }
-#line 1498 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1516 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 204:
-#line 784 "dhcp4_parser.yy" // lalr1.cc:859
+  case 208:
+#line 798 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1506 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1524 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 205:
-#line 786 "dhcp4_parser.yy" // lalr1.cc:859
+  case 209:
+#line 800 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface", iface);
     ctx.leave();
 }
-#line 1516 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1534 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 206:
-#line 792 "dhcp4_parser.yy" // lalr1.cc:859
+  case 210:
+#line 806 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1524 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1542 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 207:
-#line 794 "dhcp4_parser.yy" // lalr1.cc:859
+  case 211:
+#line 808 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface-id", iface);
     ctx.leave();
 }
-#line 1534 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1552 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 208:
-#line 800 "dhcp4_parser.yy" // lalr1.cc:859
+  case 212:
+#line 814 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.CLIENT_CLASS);
 }
-#line 1542 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1560 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 209:
-#line 802 "dhcp4_parser.yy" // lalr1.cc:859
+  case 213:
+#line 816 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-class", cls);
     ctx.leave();
 }
-#line 1552 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1570 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 210:
-#line 808 "dhcp4_parser.yy" // lalr1.cc:859
+  case 214:
+#line 822 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1560 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1578 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 211:
-#line 810 "dhcp4_parser.yy" // lalr1.cc:859
+  case 215:
+#line 824 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rm(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservation-mode", rm);
     ctx.leave();
 }
-#line 1570 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1588 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 212:
-#line 816 "dhcp4_parser.yy" // lalr1.cc:859
+  case 216:
+#line 830 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("id", id);
 }
-#line 1579 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1597 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 213:
-#line 821 "dhcp4_parser.yy" // lalr1.cc:859
+  case 217:
+#line 835 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rapid-commit", rc);
 }
-#line 1588 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1606 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 214:
-#line 830 "dhcp4_parser.yy" // lalr1.cc:859
+  case 218:
+#line 844 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-def", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DEF);
 }
-#line 1599 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1617 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 215:
-#line 835 "dhcp4_parser.yy" // lalr1.cc:859
+  case 219:
+#line 849 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1608 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1626 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 220:
-#line 852 "dhcp4_parser.yy" // lalr1.cc:859
+  case 224:
+#line 866 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1618 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1636 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 221:
-#line 856 "dhcp4_parser.yy" // lalr1.cc:859
+  case 225:
+#line 870 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1626 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1644 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 222:
-#line 863 "dhcp4_parser.yy" // lalr1.cc:859
+  case 226:
+#line 877 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-def list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1636 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1654 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 223:
-#line 867 "dhcp4_parser.yy" // lalr1.cc:859
+  case 227:
+#line 881 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1644 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1662 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 237:
-#line 893 "dhcp4_parser.yy" // lalr1.cc:859
+  case 241:
+#line 907 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("code", code);
 }
-#line 1653 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1671 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 240:
-#line 902 "dhcp4_parser.yy" // lalr1.cc:859
+  case 244:
+#line 916 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1661 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1679 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 241:
-#line 904 "dhcp4_parser.yy" // lalr1.cc:859
+  case 245:
+#line 918 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("record-types", rtypes);
     ctx.leave();
 }
-#line 1671 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1689 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 242:
-#line 910 "dhcp4_parser.yy" // lalr1.cc:859
+  case 246:
+#line 924 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1679 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1697 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 243:
-#line 912 "dhcp4_parser.yy" // lalr1.cc:859
+  case 247:
+#line 926 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("space", space);
     ctx.leave();
 }
-#line 1689 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1707 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 245:
-#line 920 "dhcp4_parser.yy" // lalr1.cc:859
+  case 249:
+#line 934 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1697 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1715 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 246:
-#line 922 "dhcp4_parser.yy" // lalr1.cc:859
+  case 250:
+#line 936 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("encapsulate", encap);
     ctx.leave();
 }
-#line 1707 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1725 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 247:
-#line 928 "dhcp4_parser.yy" // lalr1.cc:859
+  case 251:
+#line 942 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("array", array);
 }
-#line 1716 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1734 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 248:
-#line 937 "dhcp4_parser.yy" // lalr1.cc:859
+  case 252:
+#line 951 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-data", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DATA);
 }
-#line 1727 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1745 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 249:
-#line 942 "dhcp4_parser.yy" // lalr1.cc:859
+  case 253:
+#line 956 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1736 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1754 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 254:
-#line 961 "dhcp4_parser.yy" // lalr1.cc:859
+  case 258:
+#line 975 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1746 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1764 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 255:
-#line 965 "dhcp4_parser.yy" // lalr1.cc:859
+  case 259:
+#line 979 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1754 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1772 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 256:
-#line 972 "dhcp4_parser.yy" // lalr1.cc:859
+  case 260:
+#line 986 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-data list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1764 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1782 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 257:
-#line 976 "dhcp4_parser.yy" // lalr1.cc:859
+  case 261:
+#line 990 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1772 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1790 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 269:
-#line 1005 "dhcp4_parser.yy" // lalr1.cc:859
+  case 273:
+#line 1019 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1780 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1798 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 270:
-#line 1007 "dhcp4_parser.yy" // lalr1.cc:859
+  case 274:
+#line 1021 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data", data);
     ctx.leave();
 }
-#line 1790 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1808 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 273:
-#line 1017 "dhcp4_parser.yy" // lalr1.cc:859
+  case 277:
+#line 1031 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("csv-format", space);
 }
-#line 1799 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1817 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 274:
-#line 1025 "dhcp4_parser.yy" // lalr1.cc:859
+  case 278:
+#line 1039 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.POOLS);
 }
-#line 1810 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1828 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 275:
-#line 1030 "dhcp4_parser.yy" // lalr1.cc:859
+  case 279:
+#line 1044 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1819 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1837 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 280:
-#line 1045 "dhcp4_parser.yy" // lalr1.cc:859
+  case 284:
+#line 1059 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1829 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1847 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 281:
-#line 1049 "dhcp4_parser.yy" // lalr1.cc:859
+  case 285:
+#line 1063 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1837 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1855 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 282:
-#line 1053 "dhcp4_parser.yy" // lalr1.cc:859
+  case 286:
+#line 1067 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1847 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1865 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 283:
-#line 1057 "dhcp4_parser.yy" // lalr1.cc:859
+  case 287:
+#line 1071 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1855 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1873 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 289:
-#line 1070 "dhcp4_parser.yy" // lalr1.cc:859
+  case 293:
+#line 1084 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1863 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1881 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 290:
-#line 1072 "dhcp4_parser.yy" // lalr1.cc:859
+  case 294:
+#line 1086 "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);
     ctx.leave();
 }
-#line 1873 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1891 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 291:
-#line 1081 "dhcp4_parser.yy" // lalr1.cc:859
+  case 295:
+#line 1095 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservations", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.RESERVATIONS);
 }
-#line 1884 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1902 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 292:
-#line 1086 "dhcp4_parser.yy" // lalr1.cc:859
+  case 296:
+#line 1100 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1893 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1911 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 297:
-#line 1099 "dhcp4_parser.yy" // lalr1.cc:859
+  case 301:
+#line 1113 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1903 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1921 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 298:
-#line 1103 "dhcp4_parser.yy" // lalr1.cc:859
+  case 302:
+#line 1117 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1911 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1929 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 299:
-#line 1107 "dhcp4_parser.yy" // lalr1.cc:859
+  case 303:
+#line 1121 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1921 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1939 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 300:
-#line 1111 "dhcp4_parser.yy" // lalr1.cc:859
+  case 304:
+#line 1125 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1929 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1947 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 317:
-#line 1138 "dhcp4_parser.yy" // lalr1.cc:859
+  case 321:
+#line 1152 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1937 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1955 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 318:
-#line 1140 "dhcp4_parser.yy" // lalr1.cc:859
+  case 322:
+#line 1154 "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);
     ctx.leave();
 }
-#line 1947 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1965 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 319:
-#line 1146 "dhcp4_parser.yy" // lalr1.cc:859
+  case 323:
+#line 1160 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1955 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1973 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 320:
-#line 1148 "dhcp4_parser.yy" // lalr1.cc:859
+  case 324:
+#line 1162 "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);
     ctx.leave();
 }
-#line 1965 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1983 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 321:
-#line 1154 "dhcp4_parser.yy" // lalr1.cc:859
+  case 325:
+#line 1168 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1973 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1991 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 322:
-#line 1156 "dhcp4_parser.yy" // lalr1.cc:859
+  case 326:
+#line 1170 "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);
     ctx.leave();
 }
-#line 1983 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2001 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 323:
-#line 1162 "dhcp4_parser.yy" // lalr1.cc:859
+  case 327:
+#line 1176 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1991 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2009 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 324:
-#line 1164 "dhcp4_parser.yy" // lalr1.cc:859
+  case 328:
+#line 1178 "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);
     ctx.leave();
 }
-#line 2001 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2019 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 325:
-#line 1170 "dhcp4_parser.yy" // lalr1.cc:859
+  case 329:
+#line 1184 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2009 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2027 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 326:
-#line 1172 "dhcp4_parser.yy" // lalr1.cc:859
+  case 330:
+#line 1186 "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);
     ctx.leave();
 }
-#line 2019 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2037 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 327:
-#line 1178 "dhcp4_parser.yy" // lalr1.cc:859
+  case 331:
+#line 1192 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2027 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2045 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 328:
-#line 1180 "dhcp4_parser.yy" // lalr1.cc:859
+  case 332:
+#line 1194 "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);
     ctx.leave();
 }
-#line 2037 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2055 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 329:
-#line 1186 "dhcp4_parser.yy" // lalr1.cc:859
+  case 333:
+#line 1200 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2045 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2063 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 330:
-#line 1188 "dhcp4_parser.yy" // lalr1.cc:859
+  case 334:
+#line 1202 "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);
     ctx.leave();
 }
-#line 2055 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2073 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 331:
-#line 1194 "dhcp4_parser.yy" // lalr1.cc:859
+  case 335:
+#line 1208 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2063 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2081 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 332:
-#line 1196 "dhcp4_parser.yy" // lalr1.cc:859
+  case 336:
+#line 1210 "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);
     ctx.leave();
 }
-#line 2073 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2091 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 333:
-#line 1203 "dhcp4_parser.yy" // lalr1.cc:859
+  case 337:
+#line 1217 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2081 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2099 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 334:
-#line 1205 "dhcp4_parser.yy" // lalr1.cc:859
+  case 338:
+#line 1219 "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);
     ctx.leave();
 }
-#line 2091 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2109 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 335:
-#line 1211 "dhcp4_parser.yy" // lalr1.cc:859
+  case 339:
+#line 1225 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2102 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2120 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 336:
-#line 1216 "dhcp4_parser.yy" // lalr1.cc:859
+  case 340:
+#line 1230 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2111 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2129 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 337:
-#line 1224 "dhcp4_parser.yy" // lalr1.cc:859
+  case 341:
+#line 1238 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.RELAY);
 }
-#line 2122 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2140 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 338:
-#line 1229 "dhcp4_parser.yy" // lalr1.cc:859
+  case 342:
+#line 1243 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2131 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2149 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 339:
-#line 1234 "dhcp4_parser.yy" // lalr1.cc:859
+  case 343:
+#line 1248 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2139 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2157 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 340:
-#line 1236 "dhcp4_parser.yy" // lalr1.cc:859
+  case 344:
+#line 1250 "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);
     ctx.leave();
 }
-#line 2149 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2167 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 341:
-#line 1245 "dhcp4_parser.yy" // lalr1.cc:859
+  case 345:
+#line 1259 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CLIENT_CLASSES);
 }
-#line 2160 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2178 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 342:
-#line 1250 "dhcp4_parser.yy" // lalr1.cc:859
+  case 346:
+#line 1264 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2169 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2187 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 345:
-#line 1259 "dhcp4_parser.yy" // lalr1.cc:859
+  case 349:
+#line 1273 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2179 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2197 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 346:
-#line 1263 "dhcp4_parser.yy" // lalr1.cc:859
+  case 350:
+#line 1277 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2187 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2205 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 359:
-#line 1286 "dhcp4_parser.yy" // lalr1.cc:859
+  case 363:
+#line 1300 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2195 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2213 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 360:
-#line 1288 "dhcp4_parser.yy" // lalr1.cc:859
+  case 364:
+#line 1302 "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);
     ctx.leave();
 }
-#line 2205 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2223 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 361:
-#line 1297 "dhcp4_parser.yy" // lalr1.cc:859
+  case 365:
+#line 1311 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-id", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER_ID);
 }
-#line 2216 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2234 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 362:
-#line 1302 "dhcp4_parser.yy" // lalr1.cc:859
+  case 366:
+#line 1316 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2225 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2243 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 372:
-#line 1320 "dhcp4_parser.yy" // lalr1.cc:859
+  case 376:
+#line 1334 "dhcp4_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);
 }
-#line 2234 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2252 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 373:
-#line 1325 "dhcp4_parser.yy" // lalr1.cc:859
+  case 377:
+#line 1339 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2242 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2260 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 374:
-#line 1327 "dhcp4_parser.yy" // lalr1.cc:859
+  case 378:
+#line 1341 "dhcp4_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);
     ctx.leave();
 }
-#line 2252 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2270 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 375:
-#line 1333 "dhcp4_parser.yy" // lalr1.cc:859
+  case 379:
+#line 1347 "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("time", time);
 }
-#line 2261 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2279 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 376:
-#line 1338 "dhcp4_parser.yy" // lalr1.cc:859
+  case 380:
+#line 1352 "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("enterprise-id", time);
 }
-#line 2270 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2288 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 377:
-#line 1345 "dhcp4_parser.yy" // lalr1.cc:859
+  case 381:
+#line 1359 "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);
 }
-#line 2279 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2297 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 378:
-#line 1352 "dhcp4_parser.yy" // lalr1.cc:859
+  case 382:
+#line 1366 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("control-socket", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKET);
 }
-#line 2290 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2308 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 379:
-#line 1357 "dhcp4_parser.yy" // lalr1.cc:859
+  case 383:
+#line 1371 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2299 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2317 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 384:
-#line 1370 "dhcp4_parser.yy" // lalr1.cc:859
+  case 388:
+#line 1384 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2307 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2325 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 385:
-#line 1372 "dhcp4_parser.yy" // lalr1.cc:859
+  case 389:
+#line 1386 "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);
     ctx.leave();
 }
-#line 2317 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2335 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 386:
-#line 1378 "dhcp4_parser.yy" // lalr1.cc:859
+  case 390:
+#line 1392 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2325 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2343 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 387:
-#line 1380 "dhcp4_parser.yy" // lalr1.cc:859
+  case 391:
+#line 1394 "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);
     ctx.leave();
 }
-#line 2335 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2353 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 388:
-#line 1388 "dhcp4_parser.yy" // lalr1.cc:859
+  case 392:
+#line 1402 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2346 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2364 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 389:
-#line 1393 "dhcp4_parser.yy" // lalr1.cc:859
+  case 393:
+#line 1407 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2355 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2373 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 390:
-#line 1400 "dhcp4_parser.yy" // lalr1.cc:859
+  case 394:
+#line 1414 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2363 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2381 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 391:
-#line 1402 "dhcp4_parser.yy" // lalr1.cc:859
+  case 395:
+#line 1416 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2372 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2390 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 392:
-#line 1407 "dhcp4_parser.yy" // lalr1.cc:859
+  case 396:
+#line 1421 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2380 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2398 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 393:
-#line 1409 "dhcp4_parser.yy" // lalr1.cc:859
+  case 397:
+#line 1423 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2389 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2407 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 394:
-#line 1419 "dhcp4_parser.yy" // lalr1.cc:859
+  case 398:
+#line 1433 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 2400 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2418 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 395:
-#line 1424 "dhcp4_parser.yy" // lalr1.cc:859
+  case 399:
+#line 1438 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2409 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2427 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 399:
-#line 1441 "dhcp4_parser.yy" // lalr1.cc:859
+  case 403:
+#line 1455 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 2420 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2438 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 400:
-#line 1446 "dhcp4_parser.yy" // lalr1.cc:859
+  case 404:
+#line 1460 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2429 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2447 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 403:
-#line 1458 "dhcp4_parser.yy" // lalr1.cc:859
+  case 407:
+#line 1472 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 2439 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2457 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 404:
-#line 1462 "dhcp4_parser.yy" // lalr1.cc:859
+  case 408:
+#line 1476 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2447 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2465 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 412:
-#line 1477 "dhcp4_parser.yy" // lalr1.cc:859
+  case 416:
+#line 1491 "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);
 }
-#line 2456 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2474 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 413:
-#line 1481 "dhcp4_parser.yy" // lalr1.cc:859
+  case 417:
+#line 1495 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2464 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2482 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 414:
-#line 1483 "dhcp4_parser.yy" // lalr1.cc:859
+  case 418:
+#line 1497 "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);
     ctx.leave();
 }
-#line 2474 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2492 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 415:
-#line 1489 "dhcp4_parser.yy" // lalr1.cc:859
+  case 419:
+#line 1503 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 2485 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2503 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 416:
-#line 1494 "dhcp4_parser.yy" // lalr1.cc:859
+  case 420:
+#line 1508 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2494 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2512 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 419:
-#line 1503 "dhcp4_parser.yy" // lalr1.cc:859
+  case 423:
+#line 1517 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2504 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2522 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 420:
-#line 1507 "dhcp4_parser.yy" // lalr1.cc:859
+  case 424:
+#line 1521 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2512 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2530 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 423:
-#line 1515 "dhcp4_parser.yy" // lalr1.cc:859
+  case 427:
+#line 1529 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2520 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2538 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 424:
-#line 1517 "dhcp4_parser.yy" // lalr1.cc:859
+  case 428:
+#line 1531 "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);
     ctx.leave();
 }
-#line 2530 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2548 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 2534 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2552 "dhcp4_parser.cc" // lalr1.cc:859
             default:
               break;
             }
@@ -2785,84 +2803,84 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short int Dhcp4Parser::yypact_ninf_ = -411;
+  const short int Dhcp4Parser::yypact_ninf_ = -414;
 
   const signed char Dhcp4Parser::yytable_ninf_ = -1;
 
   const short int
   Dhcp4Parser::yypact_[] =
   {
-     187,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,    32,    20,    73,    80,   106,   110,   122,   123,   126,
-     134,   153,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,    20,    64,    18,    95,    56,    24,    -4,    30,
-     146,   115,   -33,  -411,   179,   193,   212,   198,   215,  -411,
-    -411,  -411,  -411,   216,  -411,    34,  -411,  -411,  -411,  -411,
-    -411,  -411,   218,   219,  -411,  -411,  -411,   220,   227,   228,
-     230,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   231,
-    -411,  -411,  -411,    41,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,    42,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-     232,   235,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,    48,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,    52,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,   207,   238,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-     244,  -411,  -411,  -411,   245,  -411,  -411,  -411,   234,   249,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,   254,  -411,  -411,  -411,  -411,   251,   250,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,    63,  -411,  -411,
-    -411,  -411,    20,    20,  -411,   162,   257,   261,   263,   265,
-    -411,    18,  -411,   267,   171,   172,   281,   282,   283,   190,
-     191,   192,   194,   284,   288,   290,   291,   292,   293,   294,
-     295,   203,   296,   297,    95,  -411,   299,   300,    56,  -411,
-      46,   301,   302,   303,   304,   305,   306,   307,   213,   214,
-     309,   310,   312,   313,    24,  -411,   314,    -4,  -411,   315,
-     316,   317,   318,   319,   320,   321,   322,   323,  -411,    30,
-     324,   325,   233,   326,   327,   329,   236,  -411,   146,   330,
-     237,  -411,   115,   335,   336,    11,  -411,  -411,  -411,   337,
-     338,   339,    20,    20,  -411,   340,  -411,  -411,   246,   341,
-     342,  -411,  -411,  -411,  -411,   345,   346,   347,   348,   349,
-     350,   351,   352,  -411,   355,   356,  -411,   359,   258,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,   334,   354,  -411,
-    -411,  -411,   269,   270,   271,   365,   273,   274,   275,  -411,
-    -411,   277,   278,   373,   372,  -411,   285,  -411,   286,   287,
-     359,   289,   298,   308,   311,   328,   331,  -411,   332,   333,
-    -411,   343,   344,   353,  -411,  -411,   357,  -411,  -411,   358,
-      20,  -411,    20,    95,   262,  -411,  -411,    56,  -411,   113,
-     113,   374,   379,   381,   168,    29,   383,   360,   127,    98,
-      64,  -411,  -411,  -411,   376,  -411,    46,  -411,  -411,  -411,
-     384,  -411,  -411,  -411,  -411,  -411,   385,   362,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,    93,  -411,   100,
-    -411,  -411,   104,  -411,  -411,  -411,   390,   391,   393,  -411,
-     139,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-     155,  -411,   392,   396,  -411,  -411,   394,   398,  -411,  -411,
-     397,   399,  -411,  -411,  -411,  -411,  -411,  -411,    35,  -411,
-    -411,  -411,  -411,  -411,    94,  -411,   401,   402,  -411,   400,
-     169,  -411,  -411,   404,   406,   407,  -411,  -411,  -411,   170,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,   180,  -411,  -411,
-    -411,   199,    20,   361,  -411,  -411,   408,   409,  -411,  -411,
-     410,   414,  -411,  -411,   411,  -411,   416,   262,  -411,  -411,
-     417,   418,   419,   363,   364,   366,   113,  -411,  -411,    24,
-    -411,   374,   146,  -411,   379,   115,  -411,   381,   168,  -411,
-      29,  -411,   -33,  -411,   383,   367,   360,  -411,   420,   369,
-     370,   371,   127,  -411,   421,   424,    98,  -411,  -411,   412,
-    -411,    -4,  -411,   384,    30,  -411,   385,   428,  -411,   429,
-    -411,   375,   377,   378,  -411,  -411,  -411,  -411,   200,  -411,
-     425,  -411,   427,  -411,  -411,  -411,   201,  -411,  -411,  -411,
-     380,  -411,  -411,  -411,  -411,   382,   386,  -411,  -411,   202,
-    -411,   430,  -411,   387,   432,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   163,
-    -411,    61,   432,  -411,  -411,   433,  -411,  -411,  -411,   209,
-    -411,  -411,  -411,  -411,  -411,   436,   388,   439,    61,  -411,
-     431,  -411,   395,  -411,   437,  -411,  -411,   189,  -411,   389,
-     437,  -411,  -411,   211,  -411,  -411,   441,   389,  -411,   403,
-    -411,  -411
+     187,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,    50,    22,    53,    55,    57,    74,    89,    99,   120,
+     126,   144,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,    22,    59,    18,    71,    24,    19,    47,    93,
+      91,   121,   -35,  -414,   158,   170,   182,   195,   211,  -414,
+    -414,  -414,  -414,   186,  -414,    43,  -414,  -414,  -414,  -414,
+    -414,  -414,   220,   231,  -414,  -414,  -414,   232,   235,   237,
+     238,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,   240,
+    -414,  -414,  -414,    58,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,    72,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+     241,   242,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,    85,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,   110,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,   208,   229,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+     244,  -414,  -414,  -414,   245,  -414,  -414,  -414,   215,   249,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,   254,  -414,  -414,  -414,  -414,   251,   250,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,   111,  -414,  -414,
+    -414,  -414,    22,    22,  -414,   167,   256,   257,   263,   265,
+    -414,    18,  -414,   267,   171,   172,   281,   282,   283,   189,
+     191,   193,   194,   285,   287,   290,   291,   292,   293,   296,
+     297,   204,   298,   300,    71,  -414,   301,   302,    24,  -414,
+      41,   303,   304,   305,   306,   307,   308,   309,   216,   213,
+     312,   313,   314,   315,    19,  -414,   316,    47,  -414,   317,
+     318,   319,   320,   321,   322,   323,   324,   325,  -414,    93,
+     326,   327,   233,   329,   330,   331,   236,  -414,    91,   332,
+     239,  -414,   121,   334,   335,     6,  -414,  -414,  -414,   337,
+     336,   338,    22,    22,  -414,   339,  -414,  -414,   246,   340,
+     341,  -414,  -414,  -414,  -414,   344,   345,   346,   347,   348,
+     349,   350,   351,  -414,   352,   355,  -414,   358,   258,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,   356,   364,  -414,
+    -414,  -414,   270,   271,   272,   366,   274,   275,   277,  -414,
+    -414,   286,   288,   374,   373,  -414,   289,  -414,   294,   299,
+     358,   310,   311,   328,   333,   342,   343,  -414,   353,   354,
+    -414,   357,   359,   360,  -414,  -414,   361,  -414,  -414,   362,
+      22,  -414,    22,    71,   261,  -414,  -414,    24,  -414,    17,
+      17,   376,   378,   381,   168,    38,   383,   363,   103,    65,
+      59,  -414,  -414,  -414,   377,  -414,    41,  -414,  -414,  -414,
+     384,  -414,  -414,  -414,  -414,  -414,   387,   365,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,   141,  -414,   162,
+    -414,  -414,   163,  -414,  -414,  -414,   391,   392,   394,  -414,
+     164,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+     180,  -414,   393,   397,  -414,  -414,   395,   399,  -414,  -414,
+     398,   400,  -414,  -414,  -414,  -414,  -414,  -414,    86,  -414,
+    -414,  -414,  -414,  -414,   190,  -414,   401,   402,  -414,   406,
+     184,  -414,  -414,   407,   408,   409,  -414,  -414,  -414,   192,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,   196,  -414,  -414,
+    -414,   199,   367,   368,  -414,  -414,   410,   403,  -414,  -414,
+     411,   412,  -414,  -414,   413,  -414,   414,   261,  -414,  -414,
+     415,   416,   418,   369,   370,   371,    17,  -414,  -414,    19,
+    -414,   376,    91,  -414,   378,   121,  -414,   381,   168,  -414,
+      38,  -414,   -35,  -414,   383,   372,   363,  -414,   419,   375,
+     379,   380,   103,  -414,   420,   421,    65,  -414,  -414,  -414,
+     422,   424,  -414,    47,  -414,   384,    93,  -414,   387,   425,
+    -414,   427,  -414,   382,   385,   386,  -414,  -414,  -414,  -414,
+     202,  -414,   426,  -414,   428,  -414,  -414,  -414,   203,  -414,
+    -414,  -414,   388,  -414,  -414,  -414,  -414,   389,   390,  -414,
+    -414,   396,   209,  -414,   429,  -414,   404,   431,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,   219,  -414,   100,   431,  -414,  -414,   435,
+    -414,  -414,  -414,   210,  -414,  -414,  -414,  -414,  -414,   438,
+     405,   439,   100,  -414,   430,  -414,   432,  -414,   437,  -414,
+    -414,   228,  -414,   417,   437,  -414,  -414,   212,  -414,  -414,
+     441,   417,  -414,   436,  -414,  -414
   };
 
   const unsigned short int
@@ -2871,274 +2889,274 @@ namespace isc { namespace dhcp {
        0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
       20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     1,    36,    30,    26,    25,    22,    23,    24,
-      29,     3,    27,    28,    45,     5,    56,     7,    94,     9,
-     172,    11,   282,    13,   299,    15,   222,    17,   256,    19,
-     148,    21,    40,    32,     0,     0,     0,     0,     0,   301,
-     224,   258,     0,    42,     0,    41,     0,     0,    33,    54,
-     394,   390,   392,     0,    53,     0,    47,    49,    51,    52,
-      50,    88,     0,     0,   317,   100,   102,     0,     0,     0,
-       0,   164,   214,   248,   129,   341,   140,   159,   361,     0,
-     378,   388,    81,     0,    58,    60,    61,    62,    63,    78,
-      79,    65,    66,    67,    68,    72,    73,    64,    70,    71,
-      80,    69,    74,    75,    76,    77,    96,    98,     0,    90,
-      92,    93,   345,   198,   200,   202,   274,   196,   204,   206,
-       0,     0,   210,   208,   291,   337,   195,   176,   177,   178,
-     190,     0,   174,   181,   192,   193,   194,   182,   183,   186,
-     188,   184,   185,   179,   180,   187,   191,   189,   289,   288,
-     287,     0,   284,   286,   319,   321,   335,   325,   327,   331,
-     329,   333,   323,   316,   312,     0,   302,   303,   313,   314,
-     315,   309,   305,   310,   307,   308,   311,   306,   115,   123,
-       0,   242,   240,   245,     0,   235,   239,   236,     0,   225,
-     226,   228,   238,   229,   230,   231,   244,   232,   233,   234,
-     269,     0,   267,   268,   271,   272,     0,   259,   260,   262,
-     263,   264,   265,   266,   155,   157,   152,     0,   150,   153,
-     154,    37,     0,     0,    31,     0,     0,     0,     0,     0,
-      44,     0,    46,     0,     0,     0,     0,     0,     0,     0,
+      29,     3,    27,    28,    49,     5,    60,     7,    98,     9,
+     176,    11,   286,    13,   303,    15,   226,    17,   260,    19,
+     152,    21,    38,    32,     0,     0,     0,     0,     0,   305,
+     228,   262,     0,    40,     0,    39,     0,     0,    33,    58,
+     398,   394,   396,     0,    57,     0,    51,    53,    55,    56,
+      54,    92,     0,     0,   321,   104,   106,     0,     0,     0,
+       0,   168,   218,   252,   133,   345,   144,   163,   365,     0,
+     382,   392,    85,     0,    62,    64,    65,    66,    67,    82,
+      83,    69,    70,    71,    72,    76,    77,    68,    74,    75,
+      84,    73,    78,    79,    80,    81,   100,   102,     0,    94,
+      96,    97,   349,   202,   204,   206,   278,   200,   208,   210,
+       0,     0,   214,   212,   295,   341,   199,   180,   181,   182,
+     194,     0,   178,   185,   196,   197,   198,   186,   187,   190,
+     192,   188,   189,   183,   184,   191,   195,   193,   293,   292,
+     291,     0,   288,   290,   323,   325,   339,   329,   331,   335,
+     333,   337,   327,   320,   316,     0,   306,   307,   317,   318,
+     319,   313,   309,   314,   311,   312,   315,   310,   119,   127,
+       0,   246,   244,   249,     0,   239,   243,   240,     0,   229,
+     230,   232,   242,   233,   234,   235,   248,   236,   237,   238,
+     273,     0,   271,   272,   275,   276,     0,   263,   264,   266,
+     267,   268,   269,   270,   159,   161,   156,     0,   154,   157,
+     158,    37,     0,     0,    31,     0,     0,     0,     0,     0,
+      48,     0,    50,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    57,     0,     0,     0,    95,
-     347,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   173,     0,     0,   283,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   300,     0,
-       0,     0,     0,     0,     0,     0,     0,   223,     0,     0,
-       0,   257,     0,     0,     0,     0,   149,    43,    34,     0,
-       0,     0,     0,     0,    48,     0,    86,    87,     0,     0,
-       0,    82,    83,    84,    85,     0,     0,     0,     0,     0,
-       0,     0,     0,   377,     0,     0,    59,     0,     0,    91,
-     359,   357,   358,   353,   354,   355,   356,     0,   348,   349,
-     351,   352,     0,     0,     0,     0,     0,     0,     0,   212,
-     213,     0,     0,     0,     0,   175,     0,   285,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   304,     0,     0,
-     237,     0,     0,     0,   247,   227,     0,   273,   261,     0,
-       0,   151,     0,     0,     0,   391,   393,     0,   318,     0,
-       0,   166,   216,   250,     0,     0,   142,     0,     0,     0,
-       0,    38,    97,    99,     0,   346,     0,   199,   201,   203,
-     276,   197,   205,   207,   211,   209,   293,     0,   290,   320,
-     322,   336,   326,   328,   332,   330,   334,   324,   116,   124,
-     243,   241,   246,   270,   156,   158,    35,     0,   399,     0,
-     396,   398,     0,   117,   119,   121,     0,     0,     0,   114,
-       0,   104,   106,   107,   108,   109,   110,   111,   112,   113,
-       0,   170,     0,   167,   168,   220,     0,   217,   218,   254,
-       0,   251,   252,   128,   137,   138,   139,   133,     0,   131,
-     134,   135,   136,   343,     0,   146,     0,   143,   144,     0,
-       0,   161,   373,     0,     0,     0,   371,   365,   370,     0,
-     363,   368,   366,   367,   369,   384,   386,     0,   380,   382,
-     383,     0,    40,     0,   350,   280,     0,   277,   278,   297,
-       0,   294,   295,   339,     0,    55,     0,     0,   395,    89,
-       0,     0,     0,     0,     0,     0,     0,   101,   103,     0,
-     165,     0,   224,   215,     0,   258,   249,     0,     0,   130,
-       0,   342,     0,   141,     0,     0,     0,   160,     0,     0,
-       0,     0,     0,   362,     0,     0,     0,   379,   389,     0,
-     360,     0,   275,     0,   301,   292,     0,     0,   338,     0,
-     397,     0,     0,     0,   125,   126,   127,   105,     0,   169,
-       0,   219,     0,   253,   132,   344,     0,   145,   163,   162,
-       0,   372,   375,   376,   364,     0,     0,   381,    39,     0,
-     279,     0,   296,     0,     0,   118,   120,   122,   171,   221,
-     255,   147,   374,   385,   387,   281,   298,   340,   403,     0,
-     401,     0,     0,   400,   415,     0,   413,   411,   407,     0,
-     405,   409,   410,   408,   402,     0,     0,     0,     0,   404,
-       0,   412,     0,   406,     0,   414,   419,     0,   417,     0,
-       0,   416,   423,     0,   421,   418,     0,     0,   420,     0,
-     422,   424
+       0,     0,     0,     0,     0,    61,     0,     0,     0,    99,
+     351,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   177,     0,     0,   287,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   304,     0,
+       0,     0,     0,     0,     0,     0,     0,   227,     0,     0,
+       0,   261,     0,     0,     0,     0,   153,    41,    34,     0,
+       0,     0,     0,     0,    52,     0,    90,    91,     0,     0,
+       0,    86,    87,    88,    89,     0,     0,     0,     0,     0,
+       0,     0,     0,   381,     0,     0,    63,     0,     0,    95,
+     363,   361,   362,   357,   358,   359,   360,     0,   352,   353,
+     355,   356,     0,     0,     0,     0,     0,     0,     0,   216,
+     217,     0,     0,     0,     0,   179,     0,   289,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   308,     0,     0,
+     241,     0,     0,     0,   251,   231,     0,   277,   265,     0,
+       0,   155,     0,     0,     0,   395,   397,     0,   322,     0,
+       0,   170,   220,   254,     0,     0,   146,     0,     0,     0,
+       0,    42,   101,   103,     0,   350,     0,   203,   205,   207,
+     280,   201,   209,   211,   215,   213,   297,     0,   294,   324,
+     326,   340,   330,   332,   336,   334,   338,   328,   120,   128,
+     247,   245,   250,   274,   160,   162,    35,     0,   403,     0,
+     400,   402,     0,   121,   123,   125,     0,     0,     0,   118,
+       0,   108,   110,   111,   112,   113,   114,   115,   116,   117,
+       0,   174,     0,   171,   172,   224,     0,   221,   222,   258,
+       0,   255,   256,   132,   141,   142,   143,   137,     0,   135,
+     138,   139,   140,   347,     0,   150,     0,   147,   148,     0,
+       0,   165,   377,     0,     0,     0,   375,   369,   374,     0,
+     367,   372,   370,   371,   373,   388,   390,     0,   384,   386,
+     387,     0,    44,     0,   354,   284,     0,   281,   282,   301,
+       0,   298,   299,   343,     0,    59,     0,     0,   399,    93,
+       0,     0,     0,     0,     0,     0,     0,   105,   107,     0,
+     169,     0,   228,   219,     0,   262,   253,     0,     0,   134,
+       0,   346,     0,   145,     0,     0,     0,   164,     0,     0,
+       0,     0,     0,   366,     0,     0,     0,   383,   393,    46,
+       0,    45,   364,     0,   279,     0,   305,   296,     0,     0,
+     342,     0,   401,     0,     0,     0,   129,   130,   131,   109,
+       0,   173,     0,   223,     0,   257,   136,   348,     0,   149,
+     167,   166,     0,   376,   379,   380,   368,     0,     0,   385,
+      43,     0,     0,   283,     0,   300,     0,     0,   122,   124,
+     126,   175,   225,   259,   151,   378,   389,   391,    47,   285,
+     302,   344,   407,     0,   405,     0,     0,   404,   419,     0,
+     417,   415,   411,     0,   409,   413,   414,   412,   406,     0,
+       0,     0,     0,   408,     0,   416,     0,   410,     0,   418,
+     423,     0,   421,     0,     0,   420,   427,     0,   425,   422,
+       0,     0,   424,     0,   426,   428
   };
 
   const short int
   Dhcp4Parser::yypgoto_[] =
   {
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,     3,  -411,  -411,  -411,  -411,    16,  -411,  -411,
-      57,  -411,   -94,  -411,   -54,  -411,  -411,  -411,   206,  -411,
-    -411,  -411,  -411,    36,   176,   -56,   -40,   -38,  -411,  -411,
-     -37,  -411,  -411,    37,   174,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,    33,  -106,  -398,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,   -59,  -411,  -410,  -411,  -411,
-    -411,  -411,  -411,  -411,  -117,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -122,  -411,  -411,  -411,  -111,   140,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -112,  -411,  -411,  -411,  -411,
-     -92,  -411,  -411,  -411,   -88,   183,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -399,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   -91,  -411,
-    -411,  -411,   -90,  -411,   173,  -411,   -52,  -411,  -411,  -411,
-    -411,   -48,  -411,  -411,  -411,  -411,  -411,   -47,  -411,  -411,
-    -411,   -89,  -411,  -411,  -411,   -86,  -411,   164,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -113,  -411,
-    -411,  -411,  -109,   197,  -411,  -411,  -411,  -411,  -411,  -411,
-    -110,  -411,  -411,  -411,  -107,  -411,   186,   -43,  -411,  -257,
-    -411,  -256,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,    62,  -411,  -411,
-    -411,  -411,  -411,  -411,   -93,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,   -96,  -411,  -411,  -411,  -411,  -411,
-    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   -55,  -411,
-    -411,  -411,  -159,  -411,  -411,  -174,  -411,  -411,  -411,  -411,
-    -411,  -411,  -185,  -411,  -411,  -191,  -411
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,   -34,  -414,  -414,  -414,  -414,   -75,  -414,  -414,
+    -414,  -414,    56,  -414,  -414,  -414,   -54,  -414,  -414,  -414,
+     197,  -414,  -414,  -414,  -414,     1,   159,   -56,   -40,   -38,
+    -414,  -414,   -37,  -414,  -414,    30,   175,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,    29,  -116,  -398,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,   -59,  -414,  -413,
+    -414,  -414,  -414,  -414,  -414,  -414,  -124,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -128,  -414,  -414,  -414,  -120,   138,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -122,  -414,  -414,
+    -414,  -414,  -104,  -414,  -414,  -414,  -101,   179,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -402,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+     -99,  -414,  -414,  -414,   -96,  -414,   173,  -414,   -52,  -414,
+    -414,  -414,  -414,   -48,  -414,  -414,  -414,  -414,  -414,   -47,
+    -414,  -414,  -414,  -100,  -414,  -414,  -414,   -94,  -414,   160,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -115,  -414,  -414,  -414,  -118,   198,  -414,  -414,  -414,  -414,
+    -414,  -414,  -119,  -414,  -414,  -414,  -114,  -414,   188,   -43,
+    -414,  -256,  -414,  -255,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,    60,
+    -414,  -414,  -414,  -414,  -414,  -414,   -93,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -103,  -414,  -414,  -414,
+    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
+     -51,  -414,  -414,  -414,  -168,  -414,  -414,  -181,  -414,  -414,
+    -414,  -414,  -414,  -414,  -191,  -414,  -414,  -196,  -414
   };
 
   const short int
   Dhcp4Parser::yydefgoto_[] =
   {
       -1,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    63,    31,    32,    53,    67,    68,    33,    52,
-     432,   542,    64,    65,   102,    35,    54,    75,    76,    77,
-     246,    37,    55,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   253,   128,   129,    39,    56,   130,   276,   131,
-     277,   112,   257,   113,   258,   480,   481,   206,   310,   483,
-     560,   484,   561,   485,   562,   207,   311,   487,   488,   489,
-     507,   114,   266,   508,   509,   510,   511,   512,   115,   268,
-     516,   517,   518,   582,    51,    62,   237,   238,   239,   323,
-     240,   324,   116,   269,   520,   521,   117,   263,   492,   493,
-     494,   569,    41,    57,   151,   152,   153,   285,   154,   281,
-     155,   282,   156,   283,   157,   286,   158,   287,   159,   291,
-     160,   290,   161,   162,   118,   264,   496,   497,   498,   572,
-      47,    60,   208,   209,   210,   211,   212,   213,   214,   215,
-     314,   216,   313,   217,   218,   315,   219,   119,   265,   500,
-     501,   502,   575,    49,    61,   226,   227,   228,   229,   230,
-     319,   231,   232,   233,   164,   284,   546,   547,   548,   601,
-      43,    58,   171,   172,   173,   296,   165,   292,   550,   551,
-     552,   604,    45,    59,   185,   186,   187,   120,   256,   189,
-     299,   190,   300,   191,   307,   192,   302,   193,   303,   194,
-     305,   195,   304,   196,   306,   197,   301,   167,   293,   554,
-     607,   121,   267,   514,   280,   367,   368,   369,   370,   371,
-     434,   122,   270,   529,   530,   531,   532,   588,   533,   534,
-     123,   124,   272,   537,   538,   539,   594,   540,   595,   125,
-     273,    78,   248,    79,   249,    80,   247,   469,   470,   471,
-     556,   659,   660,   661,   669,   670,   671,   672,   677,   673,
-     675,   687,   688,   689,   693,   694,   696
+      20,    21,    30,    31,    32,    53,    67,    68,    33,    52,
+      64,    65,   432,   542,   600,   601,   102,    35,    54,    75,
+      76,    77,   246,    37,    55,   103,   104,   105,   106,   107,
+     108,   109,   110,   111,   253,   128,   129,    39,    56,   130,
+     276,   131,   277,   112,   257,   113,   258,   480,   481,   206,
+     310,   483,   560,   484,   561,   485,   562,   207,   311,   487,
+     488,   489,   507,   114,   266,   508,   509,   510,   511,   512,
+     115,   268,   516,   517,   518,   582,    51,    62,   237,   238,
+     239,   323,   240,   324,   116,   269,   520,   521,   117,   263,
+     492,   493,   494,   569,    41,    57,   151,   152,   153,   285,
+     154,   281,   155,   282,   156,   283,   157,   286,   158,   287,
+     159,   291,   160,   290,   161,   162,   118,   264,   496,   497,
+     498,   572,    47,    60,   208,   209,   210,   211,   212,   213,
+     214,   215,   314,   216,   313,   217,   218,   315,   219,   119,
+     265,   500,   501,   502,   575,    49,    61,   226,   227,   228,
+     229,   230,   319,   231,   232,   233,   164,   284,   546,   547,
+     548,   603,    43,    58,   171,   172,   173,   296,   165,   292,
+     550,   551,   552,   606,    45,    59,   185,   186,   187,   120,
+     256,   189,   299,   190,   300,   191,   307,   192,   302,   193,
+     303,   194,   305,   195,   304,   196,   306,   197,   301,   167,
+     293,   554,   609,   121,   267,   514,   280,   367,   368,   369,
+     370,   371,   434,   122,   270,   529,   530,   531,   532,   588,
+     533,   534,   123,   124,   272,   537,   538,   539,   594,   540,
+     595,   125,   273,    78,   248,    79,   249,    80,   247,   469,
+     470,   471,   556,   663,   664,   665,   673,   674,   675,   676,
+     681,   677,   679,   691,   692,   693,   697,   698,   700
   };
 
   const unsigned short int
   Dhcp4Parser::yytable_[] =
   {
       74,   147,   223,   146,   169,   183,   205,   222,   236,   224,
-     163,   170,   184,   225,   166,    30,   188,   148,   528,   149,
-     150,   482,   482,   365,   366,    23,   513,    24,    69,    25,
-     527,   132,    22,    93,   234,   235,   132,   251,   578,    83,
-      84,   579,   252,   168,   274,   278,    84,   174,   175,   275,
-     279,   294,    87,    88,    89,   297,   295,   133,   134,   135,
-     298,    93,    84,   174,   175,    73,   325,    93,   126,   127,
-     136,   326,   137,   138,   139,   140,   141,   142,   234,   235,
-      34,   143,   144,    93,   199,   176,   143,    36,   145,   177,
-     178,   179,   180,   181,    73,   182,   274,   580,    70,   199,
-     581,   555,   360,   557,    71,    72,    81,   278,   558,    82,
-      83,    84,   559,    38,    85,    86,    73,    40,    26,    27,
-      28,    29,    73,    87,    88,    89,    90,    91,    73,    42,
-      44,    92,    93,    46,   198,   473,   474,   475,   476,   477,
-     478,    48,   566,   664,    73,   665,   666,   567,   198,    94,
-      95,   199,   476,   199,   220,   200,   201,   221,   566,    73,
-      50,    96,    66,   568,    97,    98,   662,   198,   482,   663,
-      99,   100,   586,   592,   101,   535,   536,   587,   593,   365,
-     366,   625,   528,   596,   199,   241,   200,   201,   597,   202,
-     203,   204,   690,    73,   527,   691,   242,    74,   522,   523,
-     524,   525,   245,   294,   325,   297,   244,   598,   648,   651,
-     655,    73,   678,    73,   697,   308,   243,   679,   245,   698,
-     250,   362,   254,   255,   259,    73,   361,   503,   504,   505,
-     506,   260,   261,   363,   262,   271,   288,   364,   147,   289,
-     146,   309,   317,   169,    73,   327,   328,   163,   312,   316,
+     163,   170,   184,   225,   166,   528,   188,   148,    63,   149,
+     150,   482,   482,   513,   365,   366,   132,    23,    69,    24,
+     527,    25,   234,   235,    83,    84,   126,   127,   198,   473,
+     474,   475,   476,   477,   478,   132,   251,    87,    88,    89,
+      22,   252,   133,   134,   135,   199,    93,    84,   174,   175,
+      34,   274,    36,    73,    38,   136,   275,   137,   138,   139,
+     140,   141,   142,   234,   235,   278,   143,   144,    93,   199,
+     279,    40,    81,   145,    93,    82,    83,    84,   294,   578,
+      85,    86,   579,   295,   168,   143,    42,   360,    70,    87,
+      88,    89,    90,    91,    71,    72,    44,    92,    93,    84,
+     174,   175,   198,   297,   325,    73,    73,    73,   298,   326,
+      26,    27,    28,    29,   198,    94,    95,    46,   476,   199,
+      93,   200,   201,    48,   202,   203,   204,    96,   199,    73,
+      97,    98,   535,   536,   274,    73,    99,   100,   176,   555,
+     101,    50,   177,   178,   179,   180,   181,    66,   182,   199,
+     220,   200,   201,   221,   241,   557,   278,   566,   482,    73,
+     558,   559,   567,   242,   522,   523,   524,   525,   627,   528,
+     365,   366,   668,   566,   669,   670,   243,   586,   568,    73,
+     250,    73,   587,   580,   527,   592,   581,    74,    73,   596,
+     593,    73,   245,   244,   597,   294,   325,   598,   327,   328,
+     651,   654,   297,   682,   245,   701,   308,   659,   683,    73,
+     702,   362,   666,   317,   254,   667,   361,   503,   504,   505,
+     506,   694,   309,   363,   695,   255,   259,   364,   147,   260,
+     146,   261,   262,   169,   271,   288,   289,   163,   312,   316,
      170,   166,   318,   322,   148,   183,   149,   150,   320,   321,
-     329,   330,   184,   223,   205,   331,   188,   332,   222,   333,
+     330,   331,   184,   223,   205,   329,   188,   332,   222,   333,
      224,   335,   336,   337,   225,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,   338,   339,   340,   345,   341,
-     342,   343,   346,   344,   347,   348,   349,   350,   351,   352,
-     354,   355,   353,   357,   358,   372,   373,   374,   375,   376,
-     377,   378,   379,   381,   382,   380,   383,   384,   386,   388,
-     389,   390,   391,   392,   393,   394,   395,   396,   398,   399,
-     401,   402,   400,   403,   406,   415,   416,   404,   407,   409,
-     410,   412,   435,   468,   418,   413,   414,   417,   419,   420,
-     421,   422,   423,   424,   425,   426,   433,   436,   427,   428,
-     486,   486,   429,   430,   431,   479,   479,   437,   438,   439,
-     440,   441,   442,   443,   526,   444,   445,   362,   446,   447,
-     543,   491,   361,   448,   449,   450,   495,   452,   499,   363,
-     515,   545,   549,   364,   563,   564,   453,   565,   570,   571,
-     573,   574,   577,   576,   585,   584,   454,   583,   589,   455,
-     590,   591,   603,   465,   602,   466,   605,   606,   638,   608,
-     609,   611,   612,   613,   630,   635,   456,   553,   636,   457,
-     458,   459,   643,   649,   644,   650,   684,   676,   656,   658,
-     680,   460,   461,   682,   686,   699,   541,   451,   599,   467,
-     356,   462,   359,   490,   472,   463,   464,   334,   519,   600,
-     617,   624,   627,   615,   614,   411,   628,   616,   631,   632,
-     633,   626,   692,   645,   629,   646,   647,   385,   652,   619,
-     653,   618,   620,   621,   654,   657,   408,   681,   623,   622,
-     640,   405,   639,   685,   387,   397,   642,   641,   544,   634,
-     637,   701,   610,   674,   683,   695,   700,   486,     0,     0,
+       6,     7,     8,     9,    10,   338,   339,   340,   341,   345,
+     342,   346,   343,   344,   347,   348,   349,   350,   415,   416,
+     351,   352,   354,   353,   355,   357,   358,   372,   373,   374,
+     375,   376,   377,   378,   380,   379,   381,   382,   383,   384,
+     386,   388,   389,   390,   391,   392,   393,   394,   395,   396,
+     398,   399,   400,   401,   402,   403,   406,   404,   409,   410,
+     407,   412,   468,   413,   418,   414,   417,   419,   420,   421,
+     422,   423,   424,   425,   426,   541,   433,   427,   428,   429,
+     486,   486,   430,   431,   435,   479,   479,   436,   437,   438,
+     439,   440,   441,   442,   526,   443,   465,   362,   466,   446,
+     447,   543,   361,   491,   444,   495,   445,   448,   499,   363,
+     515,   545,   449,   364,   549,   563,   564,   450,   565,   570,
+     571,   573,   574,   577,   576,   584,   605,   583,   452,   453,
+     585,   589,   590,   591,   467,   608,   604,   607,   611,   613,
+     614,   610,   615,   632,   637,   638,   454,   641,   640,   646,
+     553,   455,   647,   356,   652,   688,   653,   660,   662,   680,
+     456,   457,   684,   686,   690,   703,   451,   472,   334,   490,
+     619,   458,   459,   359,   626,   460,   629,   461,   462,   463,
+     464,   519,   628,   411,   631,   599,   602,   621,   620,   617,
+     616,   630,   618,   385,   633,   623,   622,   625,   634,   635,
+     648,   624,   408,   649,   650,   642,   655,   656,   657,   645,
+     643,   405,   644,   639,   658,   387,   544,   397,   678,   636,
+     696,   687,   661,   699,   685,   704,   612,   486,     0,     0,
        0,     0,   479,   147,     0,   146,   223,     0,   205,     0,
        0,   222,   163,   224,     0,     0,   166,   225,   236,   148,
-       0,   149,   150,     0,     0,     0,     0,     0,   526,     0,
-       0,     0,     0,     0,     0,     0,     0,   169,     0,     0,
-     183,     0,     0,     0,   170,     0,     0,   184,     0,     0,
-       0,   188,     0,     0,     0,     0,     0,     0,     0,     0,
+     689,   149,   150,     0,   705,     0,     0,     0,   526,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   169,
+       0,     0,   183,     0,     0,     0,   170,     0,     0,   184,
+       0,     0,     0,   188,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   668,     0,     0,     0,     0,   667,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   668,
-       0,     0,     0,     0,   667
+       0,     0,     0,     0,     0,     0,   672,     0,     0,     0,
+       0,   671,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   672,     0,     0,     0,     0,   671
   };
 
   const short int
   Dhcp4Parser::yycheck_[] =
   {
       54,    57,    61,    57,    58,    59,    60,    61,    62,    61,
-      57,    58,    59,    61,    57,    12,    59,    57,   428,    57,
-      57,   419,   420,   280,   280,     5,   425,     7,    10,     9,
-     428,     7,     0,    37,    67,    68,     7,     3,     3,    15,
-      16,     6,     8,    47,     3,     3,    16,    17,    18,     8,
-       8,     3,    28,    29,    30,     3,     8,    33,    34,    35,
-       8,    37,    16,    17,    18,    98,     3,    37,    12,    13,
-      46,     8,    48,    49,    50,    51,    52,    53,    67,    68,
-       7,    57,    58,    37,    38,    55,    57,     7,    64,    59,
-      60,    61,    62,    63,    98,    65,     3,     3,    80,    38,
-       6,     8,    56,     3,    86,    87,    11,     3,     8,    14,
-      15,    16,     8,     7,    19,    20,    98,     7,    98,    99,
-     100,   101,    98,    28,    29,    30,    31,    32,    98,     7,
-       7,    36,    37,     7,    21,    22,    23,    24,    25,    26,
-      27,     7,     3,    82,    98,    84,    85,     8,    21,    54,
-      55,    38,    25,    38,    39,    40,    41,    42,     3,    98,
-       7,    66,    98,     8,    69,    70,     3,    21,   566,     6,
-      75,    76,     3,     3,    79,    77,    78,     8,     8,   436,
-     436,   580,   592,     3,    38,     6,    40,    41,     8,    43,
-      44,    45,     3,    98,   592,     6,     3,   251,    71,    72,
-      73,    74,     3,     3,     3,     3,     8,     8,     8,     8,
-       8,    98,     3,    98,     3,     8,     4,     8,     3,     8,
-       4,   280,     4,     4,     4,    98,   280,    59,    60,    61,
-      62,     4,     4,   280,     4,     4,     4,   280,   294,     4,
-     294,     3,     8,   297,    98,   242,   243,   294,     4,     4,
+      57,    58,    59,    61,    57,   428,    59,    57,    52,    57,
+      57,   419,   420,   425,   280,   280,     7,     5,    10,     7,
+     428,     9,    67,    68,    15,    16,    12,    13,    21,    22,
+      23,    24,    25,    26,    27,     7,     3,    28,    29,    30,
+       0,     8,    33,    34,    35,    38,    37,    16,    17,    18,
+       7,     3,     7,    98,     7,    46,     8,    48,    49,    50,
+      51,    52,    53,    67,    68,     3,    57,    58,    37,    38,
+       8,     7,    11,    64,    37,    14,    15,    16,     3,     3,
+      19,    20,     6,     8,    47,    57,     7,    56,    80,    28,
+      29,    30,    31,    32,    86,    87,     7,    36,    37,    16,
+      17,    18,    21,     3,     3,    98,    98,    98,     8,     8,
+      98,    99,   100,   101,    21,    54,    55,     7,    25,    38,
+      37,    40,    41,     7,    43,    44,    45,    66,    38,    98,
+      69,    70,    77,    78,     3,    98,    75,    76,    55,     8,
+      79,     7,    59,    60,    61,    62,    63,    98,    65,    38,
+      39,    40,    41,    42,     6,     3,     3,     3,   566,    98,
+       8,     8,     8,     3,    71,    72,    73,    74,   580,   592,
+     436,   436,    82,     3,    84,    85,     4,     3,     8,    98,
+       4,    98,     8,     3,   592,     3,     6,   251,    98,     3,
+       8,    98,     3,     8,     8,     3,     3,     8,   242,   243,
+       8,     8,     3,     3,     3,     3,     8,     8,     8,    98,
+       8,   280,     3,     8,     4,     6,   280,    59,    60,    61,
+      62,     3,     3,   280,     6,     4,     4,   280,   294,     4,
+     294,     4,     4,   297,     4,     4,     4,   294,     4,     4,
      297,   294,     3,     3,   294,   309,   294,   294,     4,     8,
-      98,     4,   309,   322,   318,     4,   309,     4,   322,     4,
+       4,     4,   309,   322,   318,    98,   309,     4,   322,     4,
      322,     4,   101,   101,   322,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,     4,     4,     4,     4,    99,
-      99,    99,     4,    99,     4,     4,     4,     4,     4,     4,
-       4,     4,    99,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,    99,     4,     4,   101,     4,     4,     4,     4,
+      93,    94,    95,    96,    97,     4,     4,     4,    99,     4,
+      99,     4,    99,    99,     4,     4,     4,     4,   332,   333,
+       4,     4,     4,    99,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,   101,    99,     4,     4,     4,     4,
        4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,    99,     4,     4,   332,   333,   101,   101,     4,
-       4,     4,     8,    81,    98,     7,     7,     7,     7,     7,
-       5,     5,     5,     5,     5,     5,    98,     3,     7,     7,
-     419,   420,     7,     7,     5,   419,   420,    98,    98,    98,
-       5,    98,    98,    98,   428,    98,    98,   436,     5,     7,
-       4,     7,   436,    98,    98,    98,     7,    98,     7,   436,
-       7,     7,     7,   436,     4,     4,    98,     4,     6,     3,
-       6,     3,     3,     6,     4,     3,    98,     6,     4,    98,
-       4,     4,     3,   410,     6,   412,     6,     3,     6,     8,
-       4,     4,     4,     4,     4,     4,    98,    65,     4,    98,
-      98,    98,     4,     8,     5,     8,     5,     4,     8,     7,
-       4,    98,    98,     4,     7,     4,   430,   390,   542,   413,
-     274,    98,   278,   420,   417,    98,    98,   251,    98,    98,
-     566,   578,   584,    99,   101,   325,    99,   101,    99,    99,
-      99,   582,    83,    98,   586,    98,    98,   294,    98,   571,
-      98,   569,   572,   574,    98,    98,   322,    99,   577,   575,
-     603,   318,   601,    98,   297,   309,   606,   604,   436,   592,
-     596,    98,   557,   662,   678,   690,   697,   566,    -1,    -1,
+       4,     4,    99,     4,     4,     4,     4,   101,     4,     4,
+     101,     4,    81,     7,    98,     7,     7,     7,     7,     5,
+       5,     5,     5,     5,     5,   430,    98,     7,     7,     7,
+     419,   420,     7,     5,     8,   419,   420,     3,    98,    98,
+      98,     5,    98,    98,   428,    98,   410,   436,   412,     5,
+       7,     4,   436,     7,    98,     7,    98,    98,     7,   436,
+       7,     7,    98,   436,     7,     4,     4,    98,     4,     6,
+       3,     6,     3,     3,     6,     3,     3,     6,    98,    98,
+       4,     4,     4,     4,   413,     3,     6,     6,     4,     4,
+       4,     8,     4,     4,     4,     4,    98,     3,     6,     4,
+      65,    98,     5,   274,     8,     5,     8,     8,     7,     4,
+      98,    98,     4,     4,     7,     4,   390,   417,   251,   420,
+     566,    98,    98,   278,   578,    98,   584,    98,    98,    98,
+      98,    98,   582,   325,   586,    98,    98,   571,   569,    99,
+     101,    99,   101,   294,    99,   574,   572,   577,    99,    99,
+      98,   575,   322,    98,    98,   603,    98,    98,    98,   608,
+     605,   318,   606,   596,    98,   297,   436,   309,   666,   592,
+      83,   682,    98,   694,    99,   701,   557,   566,    -1,    -1,
       -1,    -1,   566,   569,    -1,   569,   575,    -1,   572,    -1,
       -1,   575,   569,   575,    -1,    -1,   569,   575,   582,   569,
-      -1,   569,   569,    -1,    -1,    -1,    -1,    -1,   592,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   601,    -1,    -1,
-     604,    -1,    -1,    -1,   601,    -1,    -1,   604,    -1,    -1,
-      -1,   604,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      98,   569,   569,    -1,    98,    -1,    -1,    -1,   592,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   603,
+      -1,    -1,   606,    -1,    -1,    -1,   603,    -1,    -1,   606,
+      -1,    -1,    -1,   606,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   661,    -1,    -1,    -1,    -1,   661,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   678,
-      -1,    -1,    -1,    -1,   678
+      -1,    -1,    -1,    -1,    -1,    -1,   665,    -1,    -1,    -1,
+      -1,   665,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   682,    -1,    -1,    -1,    -1,   682
   };
 
   const unsigned short int
@@ -3147,74 +3165,74 @@ namespace isc { namespace dhcp {
        0,    88,    89,    90,    91,    92,    93,    94,    95,    96,
       97,   103,   104,   105,   106,   107,   108,   109,   110,   111,
      112,   113,     0,     5,     7,     9,    98,    99,   100,   101,
-     114,   115,   116,   120,     7,   127,     7,   133,     7,   147,
-       7,   204,     7,   272,     7,   284,     7,   232,     7,   255,
-       7,   186,   121,   117,   128,   134,   148,   205,   273,   285,
-     233,   256,   187,   114,   124,   125,    98,   118,   119,    10,
-      80,    86,    87,    98,   126,   129,   130,   131,   343,   345,
-     347,    11,    14,    15,    16,    19,    20,    28,    29,    30,
+     114,   115,   116,   120,     7,   129,     7,   135,     7,   149,
+       7,   206,     7,   274,     7,   286,     7,   234,     7,   257,
+       7,   188,   121,   117,   130,   136,   150,   207,   275,   287,
+     235,   258,   189,   114,   122,   123,    98,   118,   119,    10,
+      80,    86,    87,    98,   128,   131,   132,   133,   345,   347,
+     349,    11,    14,    15,    16,    19,    20,    28,    29,    30,
       31,    32,    36,    37,    54,    55,    66,    69,    70,    75,
-      76,    79,   126,   135,   136,   137,   138,   139,   140,   141,
-     142,   143,   153,   155,   173,   180,   194,   198,   226,   249,
-     289,   313,   323,   332,   333,   341,    12,    13,   145,   146,
-     149,   151,     7,    33,    34,    35,    46,    48,    49,    50,
-      51,    52,    53,    57,    58,    64,   126,   137,   138,   139,
-     142,   206,   207,   208,   210,   212,   214,   216,   218,   220,
-     222,   224,   225,   249,   266,   278,   289,   309,    47,   126,
-     249,   274,   275,   276,    17,    18,    55,    59,    60,    61,
-      62,    63,    65,   126,   249,   286,   287,   288,   289,   291,
-     293,   295,   297,   299,   301,   303,   305,   307,    21,    38,
-      40,    41,    43,    44,    45,   126,   159,   167,   234,   235,
-     236,   237,   238,   239,   240,   241,   243,   245,   246,   248,
-      39,    42,   126,   167,   238,   243,   257,   258,   259,   260,
-     261,   263,   264,   265,    67,    68,   126,   188,   189,   190,
-     192,     6,     3,     4,     8,     3,   132,   348,   344,   346,
-       4,     3,     8,   144,     4,     4,   290,   154,   156,     4,
-       4,     4,     4,   199,   227,   250,   174,   314,   181,   195,
-     324,     4,   334,   342,     3,     8,   150,   152,     3,     8,
-     316,   211,   213,   215,   267,   209,   217,   219,     4,     4,
-     223,   221,   279,   310,     3,     8,   277,     3,     8,   292,
-     294,   308,   298,   300,   304,   302,   306,   296,     8,     3,
-     160,   168,     4,   244,   242,   247,     4,     8,     3,   262,
-       4,     8,     3,   191,   193,     3,     8,   114,   114,    98,
-       4,     4,     4,     4,   130,     4,   101,   101,     4,     4,
+      76,    79,   128,   137,   138,   139,   140,   141,   142,   143,
+     144,   145,   155,   157,   175,   182,   196,   200,   228,   251,
+     291,   315,   325,   334,   335,   343,    12,    13,   147,   148,
+     151,   153,     7,    33,    34,    35,    46,    48,    49,    50,
+      51,    52,    53,    57,    58,    64,   128,   139,   140,   141,
+     144,   208,   209,   210,   212,   214,   216,   218,   220,   222,
+     224,   226,   227,   251,   268,   280,   291,   311,    47,   128,
+     251,   276,   277,   278,    17,    18,    55,    59,    60,    61,
+      62,    63,    65,   128,   251,   288,   289,   290,   291,   293,
+     295,   297,   299,   301,   303,   305,   307,   309,    21,    38,
+      40,    41,    43,    44,    45,   128,   161,   169,   236,   237,
+     238,   239,   240,   241,   242,   243,   245,   247,   248,   250,
+      39,    42,   128,   169,   240,   245,   259,   260,   261,   262,
+     263,   265,   266,   267,    67,    68,   128,   190,   191,   192,
+     194,     6,     3,     4,     8,     3,   134,   350,   346,   348,
+       4,     3,     8,   146,     4,     4,   292,   156,   158,     4,
+       4,     4,     4,   201,   229,   252,   176,   316,   183,   197,
+     326,     4,   336,   344,     3,     8,   152,   154,     3,     8,
+     318,   213,   215,   217,   269,   211,   219,   221,     4,     4,
+     225,   223,   281,   312,     3,     8,   279,     3,     8,   294,
+     296,   310,   300,   302,   306,   304,   308,   298,     8,     3,
+     162,   170,     4,   246,   244,   249,     4,     8,     3,   264,
+       4,     8,     3,   193,   195,     3,     8,   114,   114,    98,
+       4,     4,     4,     4,   132,     4,   101,   101,     4,     4,
        4,    99,    99,    99,    99,     4,     4,     4,     4,     4,
-       4,     4,     4,    99,     4,     4,   136,     4,     4,   146,
-      56,   126,   167,   249,   289,   291,   293,   317,   318,   319,
-     320,   321,     4,     4,     4,     4,     4,     4,     4,    99,
-     101,     4,     4,     4,     4,   207,     4,   275,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,   288,     4,     4,
-      99,     4,     4,     4,   101,   236,     4,   101,   259,     4,
-       4,   189,     4,     7,     7,   114,   114,     7,    98,     7,
+       4,     4,     4,    99,     4,     4,   138,     4,     4,   148,
+      56,   128,   169,   251,   291,   293,   295,   319,   320,   321,
+     322,   323,     4,     4,     4,     4,     4,     4,     4,    99,
+     101,     4,     4,     4,     4,   209,     4,   277,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,   290,     4,     4,
+      99,     4,     4,     4,   101,   238,     4,   101,   261,     4,
+       4,   191,     4,     7,     7,   114,   114,     7,    98,     7,
        7,     5,     5,     5,     5,     5,     5,     7,     7,     7,
-       7,     5,   122,    98,   322,     8,     3,    98,    98,    98,
+       7,     5,   124,    98,   324,     8,     3,    98,    98,    98,
        5,    98,    98,    98,    98,    98,     5,     7,    98,    98,
-      98,   122,    98,    98,    98,    98,    98,    98,    98,    98,
-      98,    98,    98,    98,    98,   114,   114,   135,    81,   349,
-     350,   351,   145,    22,    23,    24,    25,    26,    27,   126,
-     157,   158,   159,   161,   163,   165,   167,   169,   170,   171,
-     157,     7,   200,   201,   202,     7,   228,   229,   230,     7,
-     251,   252,   253,    59,    60,    61,    62,   172,   175,   176,
-     177,   178,   179,   220,   315,     7,   182,   183,   184,    98,
-     196,   197,    71,    72,    73,    74,   126,   159,   169,   325,
-     326,   327,   328,   330,   331,    77,    78,   335,   336,   337,
-     339,   119,   123,     4,   319,     7,   268,   269,   270,     7,
-     280,   281,   282,    65,   311,     8,   352,     3,     8,     8,
-     162,   164,   166,     4,     4,     4,     3,     8,     8,   203,
-       6,     3,   231,     6,     3,   254,     6,     3,     3,     6,
-       3,     6,   185,     6,     3,     4,     3,     8,   329,     4,
-       4,     4,     3,     8,   338,   340,     3,     8,     8,   124,
-      98,   271,     6,     3,   283,     6,     3,   312,     8,     4,
-     350,     4,     4,     4,   101,    99,   101,   158,   206,   202,
-     234,   230,   257,   253,   176,   220,   188,   184,    99,   197,
-       4,    99,    99,    99,   326,     4,     4,   336,     6,   274,
-     270,   286,   282,     4,     5,    98,    98,    98,     8,     8,
-       8,     8,    98,    98,    98,     8,     8,    98,     7,   353,
-     354,   355,     3,     6,    82,    84,    85,   126,   167,   356,
-     357,   358,   359,   361,   354,   362,     4,   360,     3,     8,
-       4,    99,     4,   357,     5,    98,     7,   363,   364,   365,
-       3,     6,    83,   366,   367,   364,   368,     3,     8,     4,
-     367,    98
+      98,   124,    98,    98,    98,    98,    98,    98,    98,    98,
+      98,    98,    98,    98,    98,   114,   114,   137,    81,   351,
+     352,   353,   147,    22,    23,    24,    25,    26,    27,   128,
+     159,   160,   161,   163,   165,   167,   169,   171,   172,   173,
+     159,     7,   202,   203,   204,     7,   230,   231,   232,     7,
+     253,   254,   255,    59,    60,    61,    62,   174,   177,   178,
+     179,   180,   181,   222,   317,     7,   184,   185,   186,    98,
+     198,   199,    71,    72,    73,    74,   128,   161,   171,   327,
+     328,   329,   330,   332,   333,    77,    78,   337,   338,   339,
+     341,   119,   125,     4,   321,     7,   270,   271,   272,     7,
+     282,   283,   284,    65,   313,     8,   354,     3,     8,     8,
+     164,   166,   168,     4,     4,     4,     3,     8,     8,   205,
+       6,     3,   233,     6,     3,   256,     6,     3,     3,     6,
+       3,     6,   187,     6,     3,     4,     3,     8,   331,     4,
+       4,     4,     3,     8,   340,   342,     3,     8,     8,    98,
+     126,   127,    98,   273,     6,     3,   285,     6,     3,   314,
+       8,     4,   352,     4,     4,     4,   101,    99,   101,   160,
+     208,   204,   236,   232,   259,   255,   178,   222,   190,   186,
+      99,   199,     4,    99,    99,    99,   328,     4,     4,   338,
+       6,     3,   276,   272,   288,   284,     4,     5,    98,    98,
+      98,     8,     8,     8,     8,    98,    98,    98,    98,     8,
+       8,    98,     7,   355,   356,   357,     3,     6,    82,    84,
+      85,   128,   169,   358,   359,   360,   361,   363,   356,   364,
+       4,   362,     3,     8,     4,    99,     4,   359,     5,    98,
+       7,   365,   366,   367,     3,     6,    83,   368,   369,   366,
+     370,     3,     8,     4,   369,    98
   };
 
   const unsigned short int
@@ -3223,46 +3241,46 @@ namespace isc { namespace dhcp {
        0,   102,   104,   103,   105,   103,   106,   103,   107,   103,
      108,   103,   109,   103,   110,   103,   111,   103,   112,   103,
      113,   103,   114,   114,   114,   114,   114,   114,   114,   115,
-     117,   116,   118,   118,   119,   119,   121,   120,   123,   122,
-     124,   124,   125,   125,   126,   128,   127,   129,   129,   130,
-     130,   130,   130,   130,   132,   131,   134,   133,   135,   135,
-     136,   136,   136,   136,   136,   136,   136,   136,   136,   136,
-     136,   136,   136,   136,   136,   136,   136,   136,   136,   136,
-     136,   136,   137,   138,   139,   140,   141,   142,   144,   143,
-     145,   145,   146,   146,   148,   147,   150,   149,   152,   151,
-     154,   153,   156,   155,   157,   157,   158,   158,   158,   158,
-     158,   158,   158,   158,   158,   160,   159,   162,   161,   164,
-     163,   166,   165,   168,   167,   169,   170,   171,   172,   174,
-     173,   175,   175,   176,   176,   176,   176,   177,   178,   179,
-     181,   180,   182,   182,   183,   183,   185,   184,   187,   186,
-     188,   188,   188,   189,   189,   191,   190,   193,   192,   195,
-     194,   196,   196,   197,   199,   198,   200,   200,   201,   201,
-     203,   202,   205,   204,   206,   206,   207,   207,   207,   207,
-     207,   207,   207,   207,   207,   207,   207,   207,   207,   207,
-     207,   207,   207,   207,   207,   207,   209,   208,   211,   210,
-     213,   212,   215,   214,   217,   216,   219,   218,   221,   220,
-     223,   222,   224,   225,   227,   226,   228,   228,   229,   229,
-     231,   230,   233,   232,   234,   234,   235,   235,   236,   236,
-     236,   236,   236,   236,   236,   236,   237,   238,   239,   240,
-     242,   241,   244,   243,   245,   247,   246,   248,   250,   249,
-     251,   251,   252,   252,   254,   253,   256,   255,   257,   257,
-     258,   258,   259,   259,   259,   259,   259,   259,   260,   262,
-     261,   263,   264,   265,   267,   266,   268,   268,   269,   269,
-     271,   270,   273,   272,   274,   274,   275,   275,   275,   277,
-     276,   279,   278,   280,   280,   281,   281,   283,   282,   285,
-     284,   286,   286,   287,   287,   288,   288,   288,   288,   288,
-     288,   288,   288,   288,   288,   288,   288,   290,   289,   292,
-     291,   294,   293,   296,   295,   298,   297,   300,   299,   302,
-     301,   304,   303,   306,   305,   308,   307,   310,   309,   312,
-     311,   314,   313,   315,   315,   316,   220,   317,   317,   318,
-     318,   319,   319,   319,   319,   319,   319,   319,   320,   322,
-     321,   324,   323,   325,   325,   326,   326,   326,   326,   326,
-     326,   326,   327,   329,   328,   330,   331,   332,   334,   333,
-     335,   335,   336,   336,   338,   337,   340,   339,   342,   341,
-     344,   343,   346,   345,   348,   347,   349,   349,   350,   352,
-     351,   353,   353,   355,   354,   356,   356,   357,   357,   357,
-     357,   357,   358,   360,   359,   362,   361,   363,   363,   365,
-     364,   366,   366,   368,   367
+     117,   116,   118,   118,   119,   119,   121,   120,   122,   122,
+     123,   123,   125,   124,   126,   126,   127,   127,   128,   130,
+     129,   131,   131,   132,   132,   132,   132,   132,   134,   133,
+     136,   135,   137,   137,   138,   138,   138,   138,   138,   138,
+     138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
+     138,   138,   138,   138,   138,   138,   139,   140,   141,   142,
+     143,   144,   146,   145,   147,   147,   148,   148,   150,   149,
+     152,   151,   154,   153,   156,   155,   158,   157,   159,   159,
+     160,   160,   160,   160,   160,   160,   160,   160,   160,   162,
+     161,   164,   163,   166,   165,   168,   167,   170,   169,   171,
+     172,   173,   174,   176,   175,   177,   177,   178,   178,   178,
+     178,   179,   180,   181,   183,   182,   184,   184,   185,   185,
+     187,   186,   189,   188,   190,   190,   190,   191,   191,   193,
+     192,   195,   194,   197,   196,   198,   198,   199,   201,   200,
+     202,   202,   203,   203,   205,   204,   207,   206,   208,   208,
+     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
+     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
+     211,   210,   213,   212,   215,   214,   217,   216,   219,   218,
+     221,   220,   223,   222,   225,   224,   226,   227,   229,   228,
+     230,   230,   231,   231,   233,   232,   235,   234,   236,   236,
+     237,   237,   238,   238,   238,   238,   238,   238,   238,   238,
+     239,   240,   241,   242,   244,   243,   246,   245,   247,   249,
+     248,   250,   252,   251,   253,   253,   254,   254,   256,   255,
+     258,   257,   259,   259,   260,   260,   261,   261,   261,   261,
+     261,   261,   262,   264,   263,   265,   266,   267,   269,   268,
+     270,   270,   271,   271,   273,   272,   275,   274,   276,   276,
+     277,   277,   277,   279,   278,   281,   280,   282,   282,   283,
+     283,   285,   284,   287,   286,   288,   288,   289,   289,   290,
+     290,   290,   290,   290,   290,   290,   290,   290,   290,   290,
+     290,   292,   291,   294,   293,   296,   295,   298,   297,   300,
+     299,   302,   301,   304,   303,   306,   305,   308,   307,   310,
+     309,   312,   311,   314,   313,   316,   315,   317,   317,   318,
+     222,   319,   319,   320,   320,   321,   321,   321,   321,   321,
+     321,   321,   322,   324,   323,   326,   325,   327,   327,   328,
+     328,   328,   328,   328,   328,   328,   329,   331,   330,   332,
+     333,   334,   336,   335,   337,   337,   338,   338,   340,   339,
+     342,   341,   344,   343,   346,   345,   348,   347,   350,   349,
+     351,   351,   352,   354,   353,   355,   355,   357,   356,   358,
+     358,   359,   359,   359,   359,   359,   360,   362,   361,   364,
+     363,   365,   365,   367,   366,   368,   368,   370,   369
   };
 
   const unsigned char
@@ -3271,46 +3289,46 @@ namespace isc { namespace dhcp {
        0,     2,     0,     3,     0,     3,     0,     3,     0,     3,
        0,     3,     0,     3,     0,     3,     0,     3,     0,     3,
        0,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       0,     4,     0,     1,     3,     5,     0,     4,     0,     4,
-       0,     1,     1,     3,     2,     0,     4,     1,     3,     1,
-       1,     1,     1,     1,     0,     6,     0,     4,     1,     3,
+       0,     4,     0,     1,     3,     5,     0,     4,     0,     1,
+       1,     3,     0,     4,     0,     1,     1,     3,     2,     0,
+       4,     1,     3,     1,     1,     1,     1,     1,     0,     6,
+       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     3,     3,     3,     3,
+       3,     3,     0,     6,     1,     3,     1,     1,     0,     4,
+       0,     4,     0,     4,     0,     6,     0,     6,     1,     3,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
+       4,     0,     4,     0,     4,     0,     4,     0,     4,     3,
+       3,     3,     1,     0,     6,     1,     3,     1,     1,     1,
+       1,     1,     1,     1,     0,     6,     0,     1,     1,     3,
+       0,     4,     0,     4,     1,     3,     1,     1,     1,     0,
+       4,     0,     4,     0,     6,     1,     3,     3,     0,     6,
+       0,     1,     1,     3,     0,     4,     0,     4,     1,     3,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     3,     3,     3,     3,     3,     3,     0,     6,
-       1,     3,     1,     1,     0,     4,     0,     4,     0,     4,
-       0,     6,     0,     6,     1,     3,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     0,     4,     0,     4,     0,
-       4,     0,     4,     0,     4,     3,     3,     3,     1,     0,
-       6,     1,     3,     1,     1,     1,     1,     1,     1,     1,
-       0,     6,     0,     1,     1,     3,     0,     4,     0,     4,
-       1,     3,     1,     1,     1,     0,     4,     0,     4,     0,
-       6,     1,     3,     3,     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,     1,     1,     1,     0,     4,     0,     4,
        0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
-       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,     3,     1,     1,
-       0,     4,     0,     4,     1,     0,     4,     3,     0,     6,
+       0,     4,     0,     4,     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,     0,
-       4,     1,     1,     3,     0,     6,     0,     1,     1,     3,
-       0,     4,     0,     4,     1,     3,     1,     1,     1,     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,     0,     4,     0,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     1,     1,     0,     4,     0,     4,     1,     0,
+       4,     3,     0,     6,     0,     1,     1,     3,     0,     4,
+       0,     4,     0,     1,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     0,     4,     1,     1,     3,     0,     6,
+       0,     1,     1,     3,     0,     4,     0,     4,     1,     3,
+       1,     1,     1,     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,     0,     4,     0,     4,     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,     0,
-       4,     0,     6,     1,     3,     1,     1,     1,     1,     1,
-       1,     1,     3,     0,     4,     3,     3,     3,     0,     6,
-       1,     3,     1,     1,     0,     4,     0,     4,     0,     6,
-       0,     4,     0,     4,     0,     6,     1,     3,     1,     0,
-       6,     1,     3,     0,     4,     1,     3,     1,     1,     1,
-       1,     1,     3,     0,     4,     0,     6,     1,     3,     0,
-       4,     1,     3,     0,     4
+       4,     0,     6,     0,     4,     0,     6,     1,     3,     0,
+       4,     0,     1,     1,     3,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     4,     0,     6,     1,     3,     1,
+       1,     1,     1,     1,     1,     1,     3,     0,     4,     3,
+       3,     3,     0,     6,     1,     3,     1,     1,     0,     4,
+       0,     4,     0,     6,     0,     4,     0,     4,     0,     6,
+       1,     3,     1,     0,     6,     1,     3,     0,     4,     1,
+       3,     1,     1,     1,     1,     1,     3,     0,     4,     0,
+       6,     1,     3,     0,     4,     1,     3,     0,     4
   };
 
 
@@ -3349,12 +3367,13 @@ namespace isc { namespace dhcp {
   "\"constant string\"", "\"integer\"", "\"floating point\"",
   "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5",
   "$@6", "$@7", "$@8", "$@9", "$@10", "value", "sub_json", "map2", "$@11",
-  "map_content", "not_empty_map", "list_generic", "$@12", "list2", "$@13",
-  "list_content", "not_empty_list", "unknown_map_entry", "syntax_map",
-  "$@14", "global_objects", "global_object", "dhcp4_object", "$@15",
-  "sub_dhcp4", "$@16", "global_params", "global_param", "valid_lifetime",
-  "renew_timer", "rebind_timer", "decline_probation_period",
-  "echo_client_id", "match_client_id", "interfaces_config", "$@17",
+  "map_content", "not_empty_map", "list_generic", "$@12", "list_content",
+  "not_empty_list", "list_strings", "$@13", "list_strings_content",
+  "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@14",
+  "global_objects", "global_object", "dhcp4_object", "$@15", "sub_dhcp4",
+  "$@16", "global_params", "global_param", "valid_lifetime", "renew_timer",
+  "rebind_timer", "decline_probation_period", "echo_client_id",
+  "match_client_id", "interfaces_config", "$@17",
   "interfaces_config_params", "interfaces_config_param", "sub_interfaces4",
   "$@18", "interfaces_list", "$@19", "dhcp_socket_type", "$@20",
   "lease_database", "$@21", "hosts_database", "$@22",
@@ -3417,46 +3436,46 @@ namespace isc { namespace dhcp {
        0,   198,   198,   198,   199,   199,   200,   200,   201,   201,
      202,   202,   203,   203,   204,   204,   205,   205,   206,   206,
      207,   207,   215,   216,   217,   218,   219,   220,   221,   224,
-     229,   229,   241,   242,   245,   249,   256,   256,   264,   264,
-     271,   272,   275,   279,   290,   300,   300,   312,   313,   317,
-     318,   319,   320,   321,   324,   324,   341,   341,   349,   350,
-     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
-     375,   376,   379,   384,   389,   394,   399,   404,   410,   410,
-     420,   421,   424,   425,   428,   428,   436,   436,   446,   446,
-     454,   454,   464,   464,   474,   475,   478,   479,   480,   481,
-     482,   483,   484,   485,   486,   489,   489,   497,   497,   505,
-     505,   513,   513,   521,   521,   529,   534,   539,   544,   549,
-     549,   559,   560,   563,   564,   565,   566,   569,   574,   579,
-     584,   584,   594,   595,   598,   599,   602,   602,   610,   610,
-     618,   619,   620,   623,   624,   627,   627,   635,   635,   643,
-     643,   653,   654,   660,   668,   668,   681,   682,   685,   686,
-     693,   693,   716,   716,   725,   726,   730,   731,   732,   733,
-     734,   735,   736,   737,   738,   739,   740,   741,   742,   743,
-     744,   745,   746,   747,   748,   749,   752,   752,   760,   760,
-     768,   768,   776,   776,   784,   784,   792,   792,   800,   800,
-     808,   808,   816,   821,   830,   830,   842,   843,   846,   847,
-     852,   852,   863,   863,   873,   874,   877,   878,   881,   882,
-     883,   884,   885,   886,   887,   888,   891,   893,   898,   900,
-     902,   902,   910,   910,   918,   920,   920,   928,   937,   937,
-     949,   950,   955,   956,   961,   961,   972,   972,   983,   984,
-     989,   990,   995,   996,   997,   998,   999,  1000,  1003,  1005,
-    1005,  1013,  1015,  1017,  1025,  1025,  1037,  1038,  1041,  1042,
-    1045,  1045,  1053,  1053,  1061,  1062,  1065,  1066,  1067,  1070,
-    1070,  1081,  1081,  1091,  1092,  1095,  1096,  1099,  1099,  1107,
-    1107,  1115,  1116,  1119,  1120,  1124,  1125,  1126,  1127,  1128,
-    1129,  1130,  1131,  1132,  1133,  1134,  1135,  1138,  1138,  1146,
-    1146,  1154,  1154,  1162,  1162,  1170,  1170,  1178,  1178,  1186,
-    1186,  1194,  1194,  1203,  1203,  1211,  1211,  1224,  1224,  1234,
-    1234,  1245,  1245,  1255,  1256,  1259,  1259,  1267,  1268,  1271,
-    1272,  1275,  1276,  1277,  1278,  1279,  1280,  1281,  1284,  1286,
-    1286,  1297,  1297,  1307,  1308,  1311,  1312,  1313,  1314,  1315,
-    1316,  1317,  1320,  1325,  1325,  1333,  1338,  1345,  1352,  1352,
-    1362,  1363,  1366,  1367,  1370,  1370,  1378,  1378,  1388,  1388,
-    1400,  1400,  1407,  1407,  1419,  1419,  1432,  1433,  1437,  1441,
-    1441,  1453,  1454,  1458,  1458,  1466,  1467,  1470,  1471,  1472,
-    1473,  1474,  1477,  1481,  1481,  1489,  1489,  1499,  1500,  1503,
-    1503,  1511,  1512,  1515,  1515
+     229,   229,   241,   242,   245,   249,   256,   256,   263,   264,
+     267,   271,   278,   278,   285,   286,   289,   293,   304,   314,
+     314,   326,   327,   331,   332,   333,   334,   335,   338,   338,
+     355,   355,   363,   364,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   393,   398,   403,   408,
+     413,   418,   424,   424,   434,   435,   438,   439,   442,   442,
+     450,   450,   460,   460,   468,   468,   478,   478,   488,   489,
+     492,   493,   494,   495,   496,   497,   498,   499,   500,   503,
+     503,   511,   511,   519,   519,   527,   527,   535,   535,   543,
+     548,   553,   558,   563,   563,   573,   574,   577,   578,   579,
+     580,   583,   588,   593,   598,   598,   608,   609,   612,   613,
+     616,   616,   624,   624,   632,   633,   634,   637,   638,   641,
+     641,   649,   649,   657,   657,   667,   668,   674,   682,   682,
+     695,   696,   699,   700,   707,   707,   730,   730,   739,   740,
+     744,   745,   746,   747,   748,   749,   750,   751,   752,   753,
+     754,   755,   756,   757,   758,   759,   760,   761,   762,   763,
+     766,   766,   774,   774,   782,   782,   790,   790,   798,   798,
+     806,   806,   814,   814,   822,   822,   830,   835,   844,   844,
+     856,   857,   860,   861,   866,   866,   877,   877,   887,   888,
+     891,   892,   895,   896,   897,   898,   899,   900,   901,   902,
+     905,   907,   912,   914,   916,   916,   924,   924,   932,   934,
+     934,   942,   951,   951,   963,   964,   969,   970,   975,   975,
+     986,   986,   997,   998,  1003,  1004,  1009,  1010,  1011,  1012,
+    1013,  1014,  1017,  1019,  1019,  1027,  1029,  1031,  1039,  1039,
+    1051,  1052,  1055,  1056,  1059,  1059,  1067,  1067,  1075,  1076,
+    1079,  1080,  1081,  1084,  1084,  1095,  1095,  1105,  1106,  1109,
+    1110,  1113,  1113,  1121,  1121,  1129,  1130,  1133,  1134,  1138,
+    1139,  1140,  1141,  1142,  1143,  1144,  1145,  1146,  1147,  1148,
+    1149,  1152,  1152,  1160,  1160,  1168,  1168,  1176,  1176,  1184,
+    1184,  1192,  1192,  1200,  1200,  1208,  1208,  1217,  1217,  1225,
+    1225,  1238,  1238,  1248,  1248,  1259,  1259,  1269,  1270,  1273,
+    1273,  1281,  1282,  1285,  1286,  1289,  1290,  1291,  1292,  1293,
+    1294,  1295,  1298,  1300,  1300,  1311,  1311,  1321,  1322,  1325,
+    1326,  1327,  1328,  1329,  1330,  1331,  1334,  1339,  1339,  1347,
+    1352,  1359,  1366,  1366,  1376,  1377,  1380,  1381,  1384,  1384,
+    1392,  1392,  1402,  1402,  1414,  1414,  1421,  1421,  1433,  1433,
+    1446,  1447,  1451,  1455,  1455,  1467,  1468,  1472,  1472,  1480,
+    1481,  1484,  1485,  1486,  1487,  1488,  1491,  1495,  1495,  1503,
+    1503,  1513,  1514,  1517,  1517,  1525,  1526,  1529,  1529
   };
 
   // Print the state stack on the debug stream.
@@ -3491,8 +3510,8 @@ namespace isc { namespace dhcp {
 
 #line 14 "dhcp4_parser.yy" // lalr1.cc:1167
 } } // isc::dhcp
-#line 3495 "dhcp4_parser.cc" // lalr1.cc:1167
-#line 1523 "dhcp4_parser.yy" // lalr1.cc:1168
+#line 3514 "dhcp4_parser.cc" // lalr1.cc:1167
+#line 1537 "dhcp4_parser.yy" // lalr1.cc:1168
 
 
 void
index c17beb521ddb2f6aa04a691f3953f09eebe6a2c1..273d0208e50844069a74d7ebbc5c67142d09efdd 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 # define YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "dhcp4_parser.yy" // lalr1.cc:377
+#line 17 "dhcp4_parser.yy" // lalr1.cc:392
 
 #include <string>
 #include <cc/data.h>
@@ -52,7 +52,7 @@ using namespace isc::dhcp;
 using namespace isc::data;
 using namespace std;
 
-#line 56 "dhcp4_parser.h" // lalr1.cc:377
+#line 56 "dhcp4_parser.h" // lalr1.cc:392
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -135,9 +135,9 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined PARSER4_DEBUG */
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:377
+#line 14 "dhcp4_parser.yy" // lalr1.cc:392
 namespace isc { namespace dhcp {
-#line 141 "dhcp4_parser.h" // lalr1.cc:377
+#line 141 "dhcp4_parser.h" // lalr1.cc:392
 
 
 
@@ -1159,8 +1159,8 @@ namespace isc { namespace dhcp {
     enum
     {
       yyeof_ = 0,
-      yylast_ = 624,     ///< Last index in yytable_.
-      yynnts_ = 267,  ///< Number of nonterminal symbols.
+      yylast_ = 628,     ///< Last index in yytable_.
+      yynnts_ = 269,  ///< Number of nonterminal symbols.
       yyfinal_ = 22, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
@@ -2118,9 +2118,9 @@ namespace isc { namespace dhcp {
   }
 
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:377
+#line 14 "dhcp4_parser.yy" // lalr1.cc:392
 } } // isc::dhcp
-#line 2124 "dhcp4_parser.h" // lalr1.cc:377
+#line 2124 "dhcp4_parser.h" // lalr1.cc:392
 
 
 
index 579adb158f937aece1fdd422967fdeb3077a0bec..dd37ef653670a39c293a11e046d199cdd0e00ab3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2017 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
@@ -260,14 +260,6 @@ list_generic: LSQUARE_BRACKET {
     // list parsing complete. Put any sanity checking here
 };
 
-// This one is used in syntax parser.
-list2: LSQUARE_BRACKET {
-    // List parsing about to start
-} list_content RSQUARE_BRACKET {
-    // list parsing complete. Put any sanity checking here
-    //ctx.stack_.pop_back();
-};
-
 list_content: %empty // Empty list
             | not_empty_list
             ;
@@ -282,6 +274,28 @@ not_empty_list: value {
                   }
               ;
 
+// This one is used in syntax parser and is restricted to strings.
+list_strings: LSQUARE_BRACKET {
+    // List parsing about to start
+} list_strings_content RSQUARE_BRACKET {
+    // list parsing complete. Put any sanity checking here
+    //ctx.stack_.pop_back();
+};
+
+list_strings_content: %empty // Empty list
+                    | not_empty_list_strings
+                    ;
+
+not_empty_list_strings: STRING {
+                          ElementPtr s(new StringElement($1, ctx.loc2pos(@1)));
+                          ctx.stack_.back()->add(s);
+                          }
+                      | not_empty_list_strings COMMA STRING {
+                          ElementPtr s(new StringElement($3, ctx.loc2pos(@3)));
+                          ctx.stack_.back()->add(s);
+                          }
+                      ;
+
 // ---- generic JSON parser ends here ----------------------------------
 
 // ---- syntax checking parser starts here -----------------------------
@@ -438,7 +452,7 @@ interfaces_list: INTERFACES {
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
@@ -1213,7 +1227,7 @@ reservation_client_classes: CLIENT_CLASSES {
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
index 8a5d6a12125cbac96033ed3c4faeaa4f9ae005dd..bee3613583c5a1c14b98c56cf02a035b22e9d456 100644 (file)
@@ -441,8 +441,7 @@ DhcpConfigParser* createGlobalDhcp4ConfigParser(const std::string& config_id,
     // control-socket has been converted to SimpleParser already.
     } else if (config_id.compare("expired-leases-processing") == 0) {
         parser = new ExpirationConfigParser();
-    } else if (config_id.compare("client-classes") == 0) {
-        parser = new ClientClassDefListParser(config_id, globalContext());
+    // client-classes has been converted to SimpleParser already.
     // host-reservation-identifiers have been converted to SimpleParser already.
     } else {
         isc_throw(DhcpConfigError,
@@ -573,7 +572,6 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
     ParserPtr subnet_parser;
     ParserPtr iface_parser;
     ParserPtr leases_parser;
-    ParserPtr client_classes_parser;
 
     // Some of the parsers alter the state of the system in a way that can't
     // easily be undone. (Or alter it in a way such that undoing the change has
@@ -646,6 +644,13 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
                 continue;
             }
 
+
+            if (config_pair.first == "client-classes") {
+                ClientClassDefListParser parser;
+                parser.parse(config_pair.second, AF_INET);
+                continue;
+            }
+
             ParserPtr parser(createGlobalDhcp4ConfigParser(config_pair.first,
                                                            config_pair.second));
             LOG_DEBUG(dhcp4_logger, DBG_DHCP4_DETAIL, DHCP4_PARSER_CREATED)
@@ -665,8 +670,6 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
                 // but defer the commit until everything else has committed.
                 hooks_parser = parser;
                 parser->build(config_pair.second);
-            } else if (config_pair.first == "client-classes") {
-                client_classes_parser = parser;
             } else {
                 // Those parsers should be started before other
                 // parsers so we can call build straight away.
@@ -679,15 +682,6 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
             }
         }
 
-        // The class definitions parser is the next one to be run.
-        std::map<std::string, ConstElementPtr>::const_iterator cc_config =
-            values_map.find("client-classes");
-        if (cc_config != values_map.end()) {
-            config_pair.first = "client-classes";
-            client_classes_parser->build(cc_config->second);
-            client_classes_parser->commit();
-        }
-
         // The subnet parser is the next one to be run.
         std::map<std::string, ConstElementPtr>::const_iterator subnet_config =
             values_map.find("subnet4");
index 16c6312529b2e0025c580c19bb155075c6452ef1..59b5fa7e2f85fc0f09bc18935172d173510e2f0a 100644 (file)
@@ -787,75 +787,93 @@ namespace isc { namespace dhcp {
 #line 788 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 40:
-#line 265 "dhcp6_parser.yy" // lalr1.cc:859
+  case 42:
+#line 268 "dhcp6_parser.yy" // lalr1.cc:859
+    {
+                  // List consisting of a single element.
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
+                  }
+#line 797 "dhcp6_parser.cc" // lalr1.cc:859
+    break;
+
+  case 43:
+#line 272 "dhcp6_parser.yy" // lalr1.cc:859
+    {
+                  // List ending with , and a value.
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
+                  }
+#line 806 "dhcp6_parser.cc" // lalr1.cc:859
+    break;
+
+  case 44:
+#line 279 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // List parsing about to start
 }
-#line 796 "dhcp6_parser.cc" // lalr1.cc:859
+#line 814 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 41:
-#line 267 "dhcp6_parser.yy" // lalr1.cc:859
+  case 45:
+#line 281 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
     //ctx.stack_.pop_back();
 }
-#line 805 "dhcp6_parser.cc" // lalr1.cc:859
+#line 823 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 44:
-#line 276 "dhcp6_parser.yy" // lalr1.cc:859
+  case 48:
+#line 290 "dhcp6_parser.yy" // lalr1.cc:859
     {
-                  // List consisting of a single element.
-                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
-                  }
-#line 814 "dhcp6_parser.cc" // lalr1.cc:859
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ctx.stack_.back()->add(s);
+                          }
+#line 832 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 45:
-#line 280 "dhcp6_parser.yy" // lalr1.cc:859
+  case 49:
+#line 294 "dhcp6_parser.yy" // lalr1.cc:859
     {
-                  // List ending with , and a value.
-                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
-                  }
-#line 823 "dhcp6_parser.cc" // lalr1.cc:859
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ctx.stack_.back()->add(s);
+                          }
+#line 841 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 46:
-#line 291 "dhcp6_parser.yy" // lalr1.cc:859
+  case 50:
+#line 305 "dhcp6_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 834 "dhcp6_parser.cc" // lalr1.cc:859
+#line 852 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 47:
-#line 301 "dhcp6_parser.yy" // lalr1.cc:859
+  case 51:
+#line 315 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 845 "dhcp6_parser.cc" // lalr1.cc:859
+#line 863 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 48:
-#line 306 "dhcp6_parser.yy" // lalr1.cc:859
+  case 52:
+#line 320 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 855 "dhcp6_parser.cc" // lalr1.cc:859
+#line 873 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 56:
-#line 325 "dhcp6_parser.yy" // lalr1.cc:859
+  case 60:
+#line 339 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
@@ -864,11 +882,11 @@ namespace isc { namespace dhcp {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP6);
 }
-#line 868 "dhcp6_parser.cc" // lalr1.cc:859
+#line 886 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 57:
-#line 332 "dhcp6_parser.yy" // lalr1.cc:859
+  case 61:
+#line 346 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
@@ -876,526 +894,526 @@ namespace isc { namespace dhcp {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 880 "dhcp6_parser.cc" // lalr1.cc:859
+#line 898 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 58:
-#line 342 "dhcp6_parser.yy" // lalr1.cc:859
+  case 62:
+#line 356 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the Dhcp6 map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 890 "dhcp6_parser.cc" // lalr1.cc:859
+#line 908 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 59:
-#line 346 "dhcp6_parser.yy" // lalr1.cc:859
+  case 63:
+#line 360 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 898 "dhcp6_parser.cc" // lalr1.cc:859
+#line 916 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 84:
-#line 380 "dhcp6_parser.yy" // lalr1.cc:859
+  case 88:
+#line 394 "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("preferred-lifetime", prf);
 }
-#line 907 "dhcp6_parser.cc" // lalr1.cc:859
+#line 925 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 85:
-#line 385 "dhcp6_parser.yy" // lalr1.cc:859
+  case 89:
+#line 399 "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("valid-lifetime", prf);
 }
-#line 916 "dhcp6_parser.cc" // lalr1.cc:859
+#line 934 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 86:
-#line 390 "dhcp6_parser.yy" // lalr1.cc:859
+  case 90:
+#line 404 "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("renew-timer", prf);
 }
-#line 925 "dhcp6_parser.cc" // lalr1.cc:859
+#line 943 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 87:
-#line 395 "dhcp6_parser.yy" // lalr1.cc:859
+  case 91:
+#line 409 "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("rebind-timer", prf);
 }
-#line 934 "dhcp6_parser.cc" // lalr1.cc:859
+#line 952 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 88:
-#line 400 "dhcp6_parser.yy" // lalr1.cc:859
+  case 92:
+#line 414 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
 }
-#line 943 "dhcp6_parser.cc" // lalr1.cc:859
+#line 961 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 89:
-#line 405 "dhcp6_parser.yy" // lalr1.cc:859
+  case 93:
+#line 419 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces-config", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.INTERFACES_CONFIG);
 }
-#line 954 "dhcp6_parser.cc" // lalr1.cc:859
+#line 972 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 90:
-#line 410 "dhcp6_parser.yy" // lalr1.cc:859
+  case 94:
+#line 424 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 963 "dhcp6_parser.cc" // lalr1.cc:859
+#line 981 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 91:
-#line 415 "dhcp6_parser.yy" // lalr1.cc:859
+  case 95:
+#line 429 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the interfaces-config map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 973 "dhcp6_parser.cc" // lalr1.cc:859
+#line 991 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 92:
-#line 419 "dhcp6_parser.yy" // lalr1.cc:859
+  case 96:
+#line 433 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 981 "dhcp6_parser.cc" // lalr1.cc:859
+#line 999 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 93:
-#line 423 "dhcp6_parser.yy" // lalr1.cc:859
+  case 97:
+#line 437 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 992 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1010 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 94:
-#line 428 "dhcp6_parser.yy" // lalr1.cc:859
+  case 98:
+#line 442 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1001 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1019 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 95:
-#line 433 "dhcp6_parser.yy" // lalr1.cc:859
+  case 99:
+#line 447 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lease-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.LEASE_DATABASE);
 }
-#line 1012 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1030 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 96:
-#line 438 "dhcp6_parser.yy" // lalr1.cc:859
+  case 100:
+#line 452 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1021 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1039 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 97:
-#line 443 "dhcp6_parser.yy" // lalr1.cc:859
+  case 101:
+#line 457 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1032 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1050 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 98:
-#line 448 "dhcp6_parser.yy" // lalr1.cc:859
+  case 102:
+#line 462 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1041 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1059 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 110:
-#line 468 "dhcp6_parser.yy" // lalr1.cc:859
+  case 114:
+#line 482 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1049 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1067 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 111:
-#line 470 "dhcp6_parser.yy" // lalr1.cc:859
+  case 115:
+#line 484 "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("type", prf);
     ctx.leave();
 }
-#line 1059 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1077 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 112:
-#line 476 "dhcp6_parser.yy" // lalr1.cc:859
+  case 116:
+#line 490 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1067 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1085 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 113:
-#line 478 "dhcp6_parser.yy" // lalr1.cc:859
+  case 117:
+#line 492 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user", user);
     ctx.leave();
 }
-#line 1077 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1095 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 114:
-#line 484 "dhcp6_parser.yy" // lalr1.cc:859
+  case 118:
+#line 498 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1085 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1103 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 115:
-#line 486 "dhcp6_parser.yy" // lalr1.cc:859
+  case 119:
+#line 500 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password", pwd);
     ctx.leave();
 }
-#line 1095 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1113 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 116:
-#line 492 "dhcp6_parser.yy" // lalr1.cc:859
+  case 120:
+#line 506 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1103 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1121 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 117:
-#line 494 "dhcp6_parser.yy" // lalr1.cc:859
+  case 121:
+#line 508 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host", h);
     ctx.leave();
 }
-#line 1113 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1131 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 118:
-#line 500 "dhcp6_parser.yy" // lalr1.cc:859
+  case 122:
+#line 514 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1121 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1139 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 119:
-#line 502 "dhcp6_parser.yy" // lalr1.cc:859
+  case 123:
+#line 516 "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("name", name);
     ctx.leave();
 }
-#line 1131 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1149 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 120:
-#line 508 "dhcp6_parser.yy" // lalr1.cc:859
+  case 124:
+#line 522 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("persist", n);
 }
-#line 1140 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1158 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 121:
-#line 513 "dhcp6_parser.yy" // lalr1.cc:859
+  case 125:
+#line 527 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lfc-interval", n);
 }
-#line 1149 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1167 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 122:
-#line 518 "dhcp6_parser.yy" // lalr1.cc:859
+  case 126:
+#line 532 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("readonly", n);
 }
-#line 1158 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1176 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 123:
-#line 523 "dhcp6_parser.yy" // lalr1.cc:859
+  case 127:
+#line 537 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("mac-sources", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.MAC_SOURCES);
 }
-#line 1169 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1187 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 124:
-#line 528 "dhcp6_parser.yy" // lalr1.cc:859
+  case 128:
+#line 542 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1178 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1196 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 129:
-#line 541 "dhcp6_parser.yy" // lalr1.cc:859
+  case 133:
+#line 555 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1187 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1205 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 130:
-#line 546 "dhcp6_parser.yy" // lalr1.cc:859
+  case 134:
+#line 560 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1196 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1214 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 131:
-#line 551 "dhcp6_parser.yy" // lalr1.cc:859
+  case 135:
+#line 565 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host-reservation-identifiers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS);
 }
-#line 1207 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1225 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 132:
-#line 556 "dhcp6_parser.yy" // lalr1.cc:859
+  case 136:
+#line 570 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1216 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1234 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 137:
-#line 569 "dhcp6_parser.yy" // lalr1.cc:859
+  case 141:
+#line 583 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(hwaddr);
 }
-#line 1225 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1243 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 138:
-#line 574 "dhcp6_parser.yy" // lalr1.cc:859
+  case 142:
+#line 590 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay-supplied-options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1236 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1254 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 139:
-#line 579 "dhcp6_parser.yy" // lalr1.cc:859
+  case 143:
+#line 595 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1245 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1263 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 140:
-#line 584 "dhcp6_parser.yy" // lalr1.cc:859
+  case 144:
+#line 600 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hooks-libraries", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOOKS_LIBRARIES);
 }
-#line 1256 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1274 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 141:
-#line 589 "dhcp6_parser.yy" // lalr1.cc:859
+  case 145:
+#line 605 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1265 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1283 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 146:
-#line 602 "dhcp6_parser.yy" // lalr1.cc:859
+  case 150:
+#line 618 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1275 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1293 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 147:
-#line 606 "dhcp6_parser.yy" // lalr1.cc:859
+  case 151:
+#line 622 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1283 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1301 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 148:
-#line 610 "dhcp6_parser.yy" // lalr1.cc:859
+  case 152:
+#line 626 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the hooks-libraries list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1293 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1311 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 149:
-#line 614 "dhcp6_parser.yy" // lalr1.cc:859
+  case 153:
+#line 630 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1301 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1319 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 155:
-#line 627 "dhcp6_parser.yy" // lalr1.cc:859
+  case 159:
+#line 643 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1309 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1327 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 156:
-#line 629 "dhcp6_parser.yy" // lalr1.cc:859
+  case 160:
+#line 645 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1319 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1337 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 157:
-#line 635 "dhcp6_parser.yy" // lalr1.cc:859
+  case 161:
+#line 651 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1327 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1345 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 158:
-#line 637 "dhcp6_parser.yy" // lalr1.cc:859
+  case 162:
+#line 653 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1336 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1354 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 159:
-#line 643 "dhcp6_parser.yy" // lalr1.cc:859
+  case 163:
+#line 659 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("expired-leases-processing", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1347 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1365 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 160:
-#line 648 "dhcp6_parser.yy" // lalr1.cc:859
+  case 164:
+#line 664 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1356 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1374 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 163:
-#line 660 "dhcp6_parser.yy" // lalr1.cc:859
+  case 167:
+#line 676 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), value);
 }
-#line 1365 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1383 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 164:
-#line 668 "dhcp6_parser.yy" // lalr1.cc:859
+  case 168:
+#line 684 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet6", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SUBNET6);
 }
-#line 1376 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1394 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 165:
-#line 673 "dhcp6_parser.yy" // lalr1.cc:859
+  case 169:
+#line 689 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1385 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1403 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 170:
-#line 693 "dhcp6_parser.yy" // lalr1.cc:859
+  case 174:
+#line 709 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1395 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1413 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 171:
-#line 697 "dhcp6_parser.yy" // lalr1.cc:859
+  case 175:
+#line 713 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Once we reached this place, the subnet parsing is now complete.
     // If we want to, we can implement default values here.
@@ -1414,1130 +1432,1130 @@ namespace isc { namespace dhcp {
     // }
     ctx.stack_.pop_back();
 }
-#line 1418 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1436 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 172:
-#line 716 "dhcp6_parser.yy" // lalr1.cc:859
+  case 176:
+#line 732 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the subnet6 list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1428 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1446 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 173:
-#line 720 "dhcp6_parser.yy" // lalr1.cc:859
+  case 177:
+#line 736 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1436 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1454 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 193:
-#line 749 "dhcp6_parser.yy" // lalr1.cc:859
+  case 197:
+#line 765 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1444 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1462 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 194:
-#line 751 "dhcp6_parser.yy" // lalr1.cc:859
+  case 198:
+#line 767 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet", subnet);
     ctx.leave();
 }
-#line 1454 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1472 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 195:
-#line 757 "dhcp6_parser.yy" // lalr1.cc:859
+  case 199:
+#line 773 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1462 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1480 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 196:
-#line 759 "dhcp6_parser.yy" // lalr1.cc:859
+  case 200:
+#line 775 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface", iface);
     ctx.leave();
 }
-#line 1472 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1490 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 197:
-#line 765 "dhcp6_parser.yy" // lalr1.cc:859
+  case 201:
+#line 781 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1480 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1498 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 198:
-#line 767 "dhcp6_parser.yy" // lalr1.cc:859
+  case 202:
+#line 783 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface-id", iface);
     ctx.leave();
 }
-#line 1490 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1508 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 199:
-#line 773 "dhcp6_parser.yy" // lalr1.cc:859
+  case 203:
+#line 789 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.CLIENT_CLASS);
 }
-#line 1498 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1516 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 200:
-#line 775 "dhcp6_parser.yy" // lalr1.cc:859
+  case 204:
+#line 791 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-class", cls);
     ctx.leave();
 }
-#line 1508 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1526 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 201:
-#line 781 "dhcp6_parser.yy" // lalr1.cc:859
+  case 205:
+#line 797 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1516 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1534 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 202:
-#line 783 "dhcp6_parser.yy" // lalr1.cc:859
+  case 206:
+#line 799 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr rm(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservation-mode", rm);
     ctx.leave();
 }
-#line 1526 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1544 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 203:
-#line 789 "dhcp6_parser.yy" // lalr1.cc:859
+  case 207:
+#line 805 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("id", id);
 }
-#line 1535 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1553 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 204:
-#line 794 "dhcp6_parser.yy" // lalr1.cc:859
+  case 208:
+#line 810 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rapid-commit", rc);
 }
-#line 1544 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1562 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 205:
-#line 803 "dhcp6_parser.yy" // lalr1.cc:859
+  case 209:
+#line 819 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-def", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DEF);
 }
-#line 1555 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1573 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 206:
-#line 808 "dhcp6_parser.yy" // lalr1.cc:859
+  case 210:
+#line 824 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1564 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1582 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 211:
-#line 825 "dhcp6_parser.yy" // lalr1.cc:859
+  case 215:
+#line 841 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1574 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1592 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 212:
-#line 829 "dhcp6_parser.yy" // lalr1.cc:859
+  case 216:
+#line 845 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1582 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1600 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 213:
-#line 836 "dhcp6_parser.yy" // lalr1.cc:859
+  case 217:
+#line 852 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the option-def list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1592 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1610 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 214:
-#line 840 "dhcp6_parser.yy" // lalr1.cc:859
+  case 218:
+#line 856 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1600 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1618 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 228:
-#line 866 "dhcp6_parser.yy" // lalr1.cc:859
+  case 232:
+#line 882 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("code", code);
 }
-#line 1609 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1627 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 231:
-#line 875 "dhcp6_parser.yy" // lalr1.cc:859
+  case 235:
+#line 891 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1617 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1635 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 232:
-#line 877 "dhcp6_parser.yy" // lalr1.cc:859
+  case 236:
+#line 893 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("record-types", rtypes);
     ctx.leave();
 }
-#line 1627 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1645 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 233:
-#line 883 "dhcp6_parser.yy" // lalr1.cc:859
+  case 237:
+#line 899 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1635 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1653 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 234:
-#line 885 "dhcp6_parser.yy" // lalr1.cc:859
+  case 238:
+#line 901 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("space", space);
     ctx.leave();
 }
-#line 1645 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1663 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 236:
-#line 893 "dhcp6_parser.yy" // lalr1.cc:859
+  case 240:
+#line 909 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1653 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1671 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 237:
-#line 895 "dhcp6_parser.yy" // lalr1.cc:859
+  case 241:
+#line 911 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("encapsulate", encap);
     ctx.leave();
 }
-#line 1663 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1681 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 238:
-#line 901 "dhcp6_parser.yy" // lalr1.cc:859
+  case 242:
+#line 917 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("array", array);
 }
-#line 1672 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1690 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 239:
-#line 910 "dhcp6_parser.yy" // lalr1.cc:859
+  case 243:
+#line 926 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-data", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DATA);
 }
-#line 1683 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1701 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 240:
-#line 915 "dhcp6_parser.yy" // lalr1.cc:859
+  case 244:
+#line 931 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1692 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1710 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 245:
-#line 934 "dhcp6_parser.yy" // lalr1.cc:859
+  case 249:
+#line 950 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1702 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1720 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 246:
-#line 938 "dhcp6_parser.yy" // lalr1.cc:859
+  case 250:
+#line 954 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1710 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1728 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 247:
-#line 945 "dhcp6_parser.yy" // lalr1.cc:859
+  case 251:
+#line 961 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the option-data list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1720 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1738 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 248:
-#line 949 "dhcp6_parser.yy" // lalr1.cc:859
+  case 252:
+#line 965 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1728 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1746 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 260:
-#line 978 "dhcp6_parser.yy" // lalr1.cc:859
+  case 264:
+#line 994 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1736 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1754 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 261:
-#line 980 "dhcp6_parser.yy" // lalr1.cc:859
+  case 265:
+#line 996 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data", data);
     ctx.leave();
 }
-#line 1746 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1764 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 264:
-#line 990 "dhcp6_parser.yy" // lalr1.cc:859
+  case 268:
+#line 1006 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("csv-format", space);
 }
-#line 1755 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1773 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 265:
-#line 998 "dhcp6_parser.yy" // lalr1.cc:859
+  case 269:
+#line 1014 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.POOLS);
 }
-#line 1766 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1784 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 266:
-#line 1003 "dhcp6_parser.yy" // lalr1.cc:859
+  case 270:
+#line 1019 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1775 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1793 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 271:
-#line 1018 "dhcp6_parser.yy" // lalr1.cc:859
+  case 275:
+#line 1034 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1785 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1803 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 272:
-#line 1022 "dhcp6_parser.yy" // lalr1.cc:859
+  case 276:
+#line 1038 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1793 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1811 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 273:
-#line 1026 "dhcp6_parser.yy" // lalr1.cc:859
+  case 277:
+#line 1042 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1803 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1821 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 274:
-#line 1030 "dhcp6_parser.yy" // lalr1.cc:859
+  case 278:
+#line 1046 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1811 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1829 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 280:
-#line 1043 "dhcp6_parser.yy" // lalr1.cc:859
+  case 284:
+#line 1059 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1819 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1837 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 281:
-#line 1045 "dhcp6_parser.yy" // lalr1.cc:859
+  case 285:
+#line 1061 "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);
     ctx.leave();
 }
-#line 1829 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1847 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 282:
-#line 1054 "dhcp6_parser.yy" // lalr1.cc:859
+  case 286:
+#line 1070 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pd-pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.PD_POOLS);
 }
-#line 1840 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1858 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 283:
-#line 1059 "dhcp6_parser.yy" // lalr1.cc:859
+  case 287:
+#line 1075 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1849 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1867 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 288:
-#line 1074 "dhcp6_parser.yy" // lalr1.cc:859
+  case 292:
+#line 1090 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1859 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1877 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 289:
-#line 1078 "dhcp6_parser.yy" // lalr1.cc:859
+  case 293:
+#line 1094 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1867 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1885 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 290:
-#line 1082 "dhcp6_parser.yy" // lalr1.cc:859
+  case 294:
+#line 1098 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the pd-pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1877 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1895 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 291:
-#line 1086 "dhcp6_parser.yy" // lalr1.cc:859
+  case 295:
+#line 1102 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1885 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1903 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 301:
-#line 1103 "dhcp6_parser.yy" // lalr1.cc:859
+  case 305:
+#line 1119 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1893 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1911 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 302:
-#line 1105 "dhcp6_parser.yy" // lalr1.cc:859
+  case 306:
+#line 1121 "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);
     ctx.leave();
 }
-#line 1903 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1921 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 303:
-#line 1111 "dhcp6_parser.yy" // lalr1.cc:859
+  case 307:
+#line 1127 "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);
 }
-#line 1912 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1930 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 304:
-#line 1116 "dhcp6_parser.yy" // lalr1.cc:859
+  case 308:
+#line 1132 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1920 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1938 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 305:
-#line 1118 "dhcp6_parser.yy" // lalr1.cc:859
+  case 309:
+#line 1134 "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);
     ctx.leave();
 }
-#line 1930 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1948 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 306:
-#line 1124 "dhcp6_parser.yy" // lalr1.cc:859
+  case 310:
+#line 1140 "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);
 }
-#line 1939 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1957 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 307:
-#line 1129 "dhcp6_parser.yy" // lalr1.cc:859
+  case 311:
+#line 1145 "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);
 }
-#line 1948 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1966 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 308:
-#line 1137 "dhcp6_parser.yy" // lalr1.cc:859
+  case 312:
+#line 1153 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservations", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.RESERVATIONS);
 }
-#line 1959 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1977 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 309:
-#line 1142 "dhcp6_parser.yy" // lalr1.cc:859
+  case 313:
+#line 1158 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1968 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1986 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 314:
-#line 1155 "dhcp6_parser.yy" // lalr1.cc:859
+  case 318:
+#line 1171 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1978 "dhcp6_parser.cc" // lalr1.cc:859
+#line 1996 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 315:
-#line 1159 "dhcp6_parser.yy" // lalr1.cc:859
+  case 319:
+#line 1175 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1986 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2004 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 316:
-#line 1163 "dhcp6_parser.yy" // lalr1.cc:859
+  case 320:
+#line 1179 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1996 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2014 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 317:
-#line 1167 "dhcp6_parser.yy" // lalr1.cc:859
+  case 321:
+#line 1183 "dhcp6_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 2004 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2022 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 330:
-#line 1190 "dhcp6_parser.yy" // lalr1.cc:859
+  case 334:
+#line 1206 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-addresses", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2015 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2033 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 331:
-#line 1195 "dhcp6_parser.yy" // lalr1.cc:859
+  case 335:
+#line 1211 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2024 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2042 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 332:
-#line 1200 "dhcp6_parser.yy" // lalr1.cc:859
+  case 336:
+#line 1216 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("prefixes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2035 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2053 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 333:
-#line 1205 "dhcp6_parser.yy" // lalr1.cc:859
+  case 337:
+#line 1221 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2044 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2062 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 334:
-#line 1210 "dhcp6_parser.yy" // lalr1.cc:859
+  case 338:
+#line 1226 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2052 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2070 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 335:
-#line 1212 "dhcp6_parser.yy" // lalr1.cc:859
+  case 339:
+#line 1228 "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);
     ctx.leave();
 }
-#line 2062 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2080 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 336:
-#line 1218 "dhcp6_parser.yy" // lalr1.cc:859
+  case 340:
+#line 1234 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2070 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2088 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 337:
-#line 1220 "dhcp6_parser.yy" // lalr1.cc:859
+  case 341:
+#line 1236 "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);
     ctx.leave();
 }
-#line 2080 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2098 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 338:
-#line 1226 "dhcp6_parser.yy" // lalr1.cc:859
+  case 342:
+#line 1242 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2088 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2106 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 339:
-#line 1228 "dhcp6_parser.yy" // lalr1.cc:859
+  case 343:
+#line 1244 "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);
     ctx.leave();
 }
-#line 2098 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2116 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 340:
-#line 1234 "dhcp6_parser.yy" // lalr1.cc:859
+  case 344:
+#line 1250 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2109 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2127 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 341:
-#line 1239 "dhcp6_parser.yy" // lalr1.cc:859
+  case 345:
+#line 1255 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2118 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2136 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 342:
-#line 1247 "dhcp6_parser.yy" // lalr1.cc:859
+  case 346:
+#line 1263 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.RELAY);
 }
-#line 2129 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2147 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 343:
-#line 1252 "dhcp6_parser.yy" // lalr1.cc:859
+  case 347:
+#line 1268 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2138 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2156 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 344:
-#line 1257 "dhcp6_parser.yy" // lalr1.cc:859
+  case 348:
+#line 1273 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2146 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2164 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 345:
-#line 1259 "dhcp6_parser.yy" // lalr1.cc:859
+  case 349:
+#line 1275 "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);
     ctx.leave();
 }
-#line 2156 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2174 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 346:
-#line 1268 "dhcp6_parser.yy" // lalr1.cc:859
+  case 350:
+#line 1284 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CLIENT_CLASSES);
 }
-#line 2167 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2185 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 347:
-#line 1273 "dhcp6_parser.yy" // lalr1.cc:859
+  case 351:
+#line 1289 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2176 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2194 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 350:
-#line 1282 "dhcp6_parser.yy" // lalr1.cc:859
+  case 354:
+#line 1298 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2186 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2204 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 351:
-#line 1286 "dhcp6_parser.yy" // lalr1.cc:859
+  case 355:
+#line 1302 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2194 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2212 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 361:
-#line 1306 "dhcp6_parser.yy" // lalr1.cc:859
+  case 365:
+#line 1322 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2202 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2220 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 362:
-#line 1308 "dhcp6_parser.yy" // lalr1.cc:859
+  case 366:
+#line 1324 "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);
     ctx.leave();
 }
-#line 2212 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2230 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 363:
-#line 1317 "dhcp6_parser.yy" // lalr1.cc:859
+  case 367:
+#line 1333 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-id", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER_ID);
 }
-#line 2223 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2241 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 364:
-#line 1322 "dhcp6_parser.yy" // lalr1.cc:859
+  case 368:
+#line 1338 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2232 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2250 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 374:
-#line 1340 "dhcp6_parser.yy" // lalr1.cc:859
+  case 378:
+#line 1356 "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);
 }
-#line 2241 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2259 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 375:
-#line 1345 "dhcp6_parser.yy" // lalr1.cc:859
+  case 379:
+#line 1361 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2249 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2267 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 376:
-#line 1347 "dhcp6_parser.yy" // lalr1.cc:859
+  case 380:
+#line 1363 "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);
     ctx.leave();
 }
-#line 2259 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2277 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 377:
-#line 1353 "dhcp6_parser.yy" // lalr1.cc:859
+  case 381:
+#line 1369 "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);
 }
-#line 2268 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2286 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 378:
-#line 1358 "dhcp6_parser.yy" // lalr1.cc:859
+  case 382:
+#line 1374 "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);
 }
-#line 2277 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2295 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 379:
-#line 1365 "dhcp6_parser.yy" // lalr1.cc:859
+  case 383:
+#line 1381 "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);
 }
-#line 2286 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2304 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 380:
-#line 1372 "dhcp6_parser.yy" // lalr1.cc:859
+  case 384:
+#line 1388 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("control-socket", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKET);
 }
-#line 2297 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2315 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 381:
-#line 1377 "dhcp6_parser.yy" // lalr1.cc:859
+  case 385:
+#line 1393 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2306 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2324 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 386:
-#line 1390 "dhcp6_parser.yy" // lalr1.cc:859
+  case 390:
+#line 1406 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2314 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2332 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 387:
-#line 1392 "dhcp6_parser.yy" // lalr1.cc:859
+  case 391:
+#line 1408 "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);
     ctx.leave();
 }
-#line 2324 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2342 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 388:
-#line 1398 "dhcp6_parser.yy" // lalr1.cc:859
+  case 392:
+#line 1414 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2332 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2350 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 389:
-#line 1400 "dhcp6_parser.yy" // lalr1.cc:859
+  case 393:
+#line 1416 "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);
     ctx.leave();
 }
-#line 2342 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2360 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 390:
-#line 1408 "dhcp6_parser.yy" // lalr1.cc:859
+  case 394:
+#line 1424 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2353 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2371 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 391:
-#line 1413 "dhcp6_parser.yy" // lalr1.cc:859
+  case 395:
+#line 1429 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2362 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2380 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 392:
-#line 1420 "dhcp6_parser.yy" // lalr1.cc:859
+  case 396:
+#line 1436 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2370 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2388 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 393:
-#line 1422 "dhcp6_parser.yy" // lalr1.cc:859
+  case 397:
+#line 1438 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2379 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2397 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 394:
-#line 1427 "dhcp6_parser.yy" // lalr1.cc:859
+  case 398:
+#line 1443 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2387 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2405 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 395:
-#line 1429 "dhcp6_parser.yy" // lalr1.cc:859
+  case 399:
+#line 1445 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2396 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2414 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 396:
-#line 1439 "dhcp6_parser.yy" // lalr1.cc:859
+  case 400:
+#line 1455 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 2407 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2425 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 397:
-#line 1444 "dhcp6_parser.yy" // lalr1.cc:859
+  case 401:
+#line 1460 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2416 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2434 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 401:
-#line 1461 "dhcp6_parser.yy" // lalr1.cc:859
+  case 405:
+#line 1477 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 2427 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2445 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 402:
-#line 1466 "dhcp6_parser.yy" // lalr1.cc:859
+  case 406:
+#line 1482 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2436 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2454 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 405:
-#line 1478 "dhcp6_parser.yy" // lalr1.cc:859
+  case 409:
+#line 1494 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 2446 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2464 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 406:
-#line 1482 "dhcp6_parser.yy" // lalr1.cc:859
+  case 410:
+#line 1498 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2454 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2472 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 414:
-#line 1497 "dhcp6_parser.yy" // lalr1.cc:859
+  case 418:
+#line 1513 "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);
 }
-#line 2463 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2481 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 415:
-#line 1501 "dhcp6_parser.yy" // lalr1.cc:859
+  case 419:
+#line 1517 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2471 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2489 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 416:
-#line 1503 "dhcp6_parser.yy" // lalr1.cc:859
+  case 420:
+#line 1519 "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);
     ctx.leave();
 }
-#line 2481 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2499 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 417:
-#line 1509 "dhcp6_parser.yy" // lalr1.cc:859
+  case 421:
+#line 1525 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 2492 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2510 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 418:
-#line 1514 "dhcp6_parser.yy" // lalr1.cc:859
+  case 422:
+#line 1530 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2501 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2519 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 421:
-#line 1523 "dhcp6_parser.yy" // lalr1.cc:859
+  case 425:
+#line 1539 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2511 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2529 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 422:
-#line 1527 "dhcp6_parser.yy" // lalr1.cc:859
+  case 426:
+#line 1543 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2519 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2537 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 425:
-#line 1535 "dhcp6_parser.yy" // lalr1.cc:859
+  case 429:
+#line 1551 "dhcp6_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2527 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2545 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
-  case 426:
-#line 1537 "dhcp6_parser.yy" // lalr1.cc:859
+  case 430:
+#line 1553 "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);
     ctx.leave();
 }
-#line 2537 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2555 "dhcp6_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 2541 "dhcp6_parser.cc" // lalr1.cc:859
+#line 2559 "dhcp6_parser.cc" // lalr1.cc:859
             default:
               break;
             }
@@ -2792,85 +2810,85 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short int Dhcp6Parser::yypact_ninf_ = -428;
+  const short int Dhcp6Parser::yypact_ninf_ = -427;
 
   const signed char Dhcp6Parser::yytable_ninf_ = -1;
 
   const short int
   Dhcp6Parser::yypact_[] =
   {
-     110,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,    28,    22,    34,    47,    51,    60,    63,    67,
-      87,   106,   119,   128,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,    22,    -1,    16,    64,
-     150,    15,    56,    39,    91,   112,     2,    32,  -428,   135,
-     161,   170,   174,   181,  -428,  -428,  -428,  -428,   228,  -428,
-      68,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,   240,
-     243,   254,   255,   257,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,   260,  -428,  -428,  -428,   129,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,   185,  -428,  -428,  -428,  -428,  -428,  -428,   261,
-     262,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-     157,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,   158,  -428,  -428,
-    -428,   264,  -428,   265,   266,  -428,  -428,   167,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,   222,   268,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,   269,  -428,  -428,  -428,   271,  -428,  -428,
-    -428,   270,   274,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,   275,  -428,  -428,  -428,  -428,   272,
-     278,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-     168,  -428,  -428,  -428,  -428,    22,    22,  -428,   183,   279,
-     280,   281,   282,  -428,    16,  -428,   283,   284,   285,   172,
-     190,   191,   192,   193,   290,   291,   292,   293,   294,   295,
-     296,   297,   298,   299,   204,   301,   302,    64,  -428,   303,
-    -428,    13,   304,   305,   306,   307,   308,   213,   212,   311,
-     312,   313,   314,    15,  -428,   315,    56,  -428,   316,   221,
-     318,   223,   224,    39,  -428,   321,   322,   323,   324,   325,
-     326,  -428,    91,   327,   328,   235,   329,   330,   332,   238,
-    -428,   112,   333,   239,  -428,     2,   338,   339,    38,  -428,
-    -428,  -428,   340,   341,   342,    22,    22,  -428,   343,   344,
-     347,  -428,  -428,  -428,  -428,  -428,   350,   351,   352,   353,
-     356,   357,   358,   359,   360,   361,  -428,   362,   365,  -428,
-     356,  -428,  -428,  -428,  -428,   337,   363,  -428,  -428,  -428,
-     368,   369,   247,   248,   276,  -428,  -428,   277,   287,   373,
-     372,  -428,   288,  -428,   289,  -428,   300,  -428,  -428,  -428,
-     356,   356,   356,   309,   310,   317,  -428,   319,   320,  -428,
-     331,   334,   335,  -428,  -428,   336,  -428,  -428,   345,    22,
-    -428,    22,    64,   346,  -428,  -428,   150,    30,    30,   374,
-     375,   376,    -2,  -428,  -428,   180,    50,   377,   348,    37,
-     173,    -1,  -428,   385,  -428,    13,   383,   384,  -428,  -428,
-    -428,  -428,  -428,   386,   355,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,   169,  -428,   175,  -428,  -428,   387,  -428,
-    -428,  -428,   388,   390,   392,  -428,   177,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,   178,  -428,   391,   395,
-    -428,  -428,   394,   398,  -428,  -428,   396,   400,  -428,  -428,
-    -428,   122,  -428,  -428,  -428,    22,  -428,  -428,   188,  -428,
-    -428,  -428,   189,  -428,   399,   401,  -428,   402,   206,  -428,
-    -428,   403,   406,   407,  -428,  -428,  -428,   207,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,   209,  -428,  -428,  -428,   210,
-     349,  -428,  -428,   409,   410,  -428,  -428,   411,   418,  -428,
-    -428,   416,   420,  -428,  -428,   417,  -428,   422,   346,  -428,
-    -428,   424,   425,   427,   263,   354,   364,    30,  -428,  -428,
-      15,  -428,   374,   112,  -428,   375,     2,  -428,   376,    -2,
-    -428,   426,   180,  -428,    50,  -428,    32,  -428,   377,   367,
-     348,  -428,   432,   370,   371,   378,    37,  -428,   433,   434,
-     173,  -428,  -428,  -428,    56,  -428,   383,    39,  -428,   384,
-      91,  -428,   386,   435,  -428,   419,  -428,   366,   380,   381,
-    -428,  -428,  -428,  -428,   216,  -428,   437,  -428,   438,  -428,
-    -428,  -428,  -428,  -428,   217,  -428,  -428,  -428,   382,  -428,
-    -428,  -428,  -428,   389,   393,  -428,   218,  -428,   219,  -428,
-     441,  -428,   397,   436,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,   233,
-    -428,    74,   436,  -428,  -428,   446,  -428,  -428,  -428,   225,
-    -428,  -428,  -428,  -428,  -428,   447,   404,   448,    74,  -428,
-     450,  -428,   408,  -428,   449,  -428,  -428,   234,  -428,   379,
-     449,  -428,  -428,   226,  -428,  -428,   453,   379,  -428,   414,
-    -428,  -428
+     184,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,    49,    19,    46,    52,    60,    77,    87,    93,
+      95,    99,   108,   110,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,    19,    24,    17,    85,
+     123,    23,    25,   145,   107,    53,     6,   -33,  -427,   119,
+     141,   142,   149,   160,  -427,  -427,  -427,  -427,   161,  -427,
+      47,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,   187,
+     188,   189,   203,   228,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,   232,  -427,  -427,  -427,    48,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,   193,  -427,  -427,  -427,  -427,  -427,  -427,   233,
+     235,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+      54,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,    57,  -427,  -427,
+    -427,   236,  -427,   237,   238,  -427,  -427,   150,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,   239,   240,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,   244,  -427,  -427,  -427,   247,  -427,  -427,
+    -427,   251,   252,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,   256,  -427,  -427,  -427,  -427,   253,
+     259,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+     173,  -427,  -427,  -427,  -427,    19,    19,  -427,   165,   262,
+     264,   279,   280,  -427,    17,  -427,   281,   282,   283,   190,
+     192,   194,   195,   196,   284,   285,   287,   289,   293,   294,
+     295,   296,   297,   298,   204,   299,   301,    85,  -427,   302,
+    -427,     2,   303,   304,   305,   306,   307,   213,   215,   308,
+     310,   311,   312,    23,  -427,   314,    25,  -427,   315,   220,
+     317,   222,   223,   145,  -427,   320,   321,   322,   323,   324,
+     325,  -427,   107,   326,   327,   234,   328,   329,   331,   241,
+    -427,    53,   332,   242,  -427,     6,   333,   334,     9,  -427,
+    -427,  -427,   335,   338,   339,    19,    19,  -427,   342,   343,
+     344,  -427,  -427,  -427,  -427,  -427,   336,   337,   347,   348,
+     349,   350,   351,   352,   356,   357,  -427,   358,   359,  -427,
+     353,  -427,  -427,  -427,  -427,   360,   364,  -427,  -427,  -427,
+     366,   367,   270,   274,   275,  -427,  -427,   276,   277,   373,
+     374,  -427,   286,  -427,   288,  -427,   290,  -427,  -427,  -427,
+     353,   353,   353,   291,   292,   300,  -427,   309,   313,  -427,
+     316,   318,   319,  -427,  -427,   330,  -427,  -427,   340,    19,
+    -427,    19,    85,   341,  -427,  -427,   123,   111,   111,   375,
+     376,   377,   -17,    19,    31,    22,   379,   345,    76,    56,
+      24,  -427,  -427,   388,  -427,     2,   386,   387,  -427,  -427,
+    -427,  -427,  -427,   389,   346,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,   174,  -427,   175,  -427,  -427,   372,  -427,
+    -427,  -427,   391,   393,   394,  -427,   177,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,   191,  -427,   395,   397,
+    -427,  -427,   396,   400,  -427,  -427,   398,   402,  -427,  -427,
+    -427,    72,  -427,  -427,  -427,   401,  -427,  -427,   139,  -427,
+    -427,  -427,   153,  -427,   403,   407,  -427,   409,   197,  -427,
+    -427,   410,   412,   415,  -427,  -427,  -427,   200,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,   201,  -427,  -427,  -427,   208,
+     354,   355,  -427,  -427,   414,   421,  -427,  -427,   419,   423,
+    -427,  -427,   422,   424,  -427,  -427,   425,  -427,   426,   341,
+    -427,  -427,   427,   428,   430,   361,   362,   363,   111,  -427,
+    -427,    23,  -427,   375,    53,  -427,   376,     6,  -427,   377,
+     -17,  -427,  -427,    31,  -427,    22,  -427,   -33,  -427,   379,
+     368,   345,  -427,   431,   369,   370,   371,    76,  -427,   432,
+     433,    56,  -427,  -427,  -427,   434,   435,  -427,    25,  -427,
+     386,   145,  -427,   387,   107,  -427,   389,   437,  -427,   438,
+    -427,   365,   378,   380,  -427,  -427,  -427,  -427,   210,  -427,
+     439,  -427,   440,  -427,  -427,  -427,  -427,   211,  -427,  -427,
+    -427,   381,  -427,  -427,  -427,  -427,   382,   383,  -427,  -427,
+     384,   212,  -427,   214,  -427,   441,  -427,   385,   399,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,   224,  -427,   113,   399,  -427,
+    -427,   442,  -427,  -427,  -427,   218,  -427,  -427,  -427,  -427,
+    -427,   446,   390,   447,   113,  -427,   450,  -427,   392,  -427,
+     445,  -427,  -427,   225,  -427,   257,   445,  -427,  -427,   221,
+    -427,  -427,   452,   257,  -427,   404,  -427,  -427
   };
 
   const unsigned short int
@@ -2879,108 +2897,108 @@ namespace isc { namespace dhcp {
        0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
       20,    22,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     1,    38,    32,    28,    27,    24,
-      25,    26,    31,     3,    29,    30,    47,     5,    58,     7,
-      91,     9,   172,    11,   273,    13,   290,    15,   316,    17,
-     213,    19,   247,    21,   148,    23,    42,    34,     0,     0,
-       0,     0,     0,     0,   318,   215,   249,     0,    44,     0,
-      43,     0,     0,    35,    56,   396,   392,   394,     0,    55,
-       0,    49,    51,    53,    54,    52,    89,    95,    97,     0,
-       0,     0,     0,     0,   164,   205,   239,   123,   138,   131,
-     346,   140,   159,   363,     0,   380,   390,    83,     0,    60,
-      62,    63,    64,    65,    66,    68,    69,    70,    71,    73,
-      72,    77,    78,    67,    75,    76,    74,    79,    80,    81,
-      82,    93,     0,   350,   265,   282,   193,   195,   197,     0,
-       0,   201,   199,   308,   342,   192,   176,   177,   178,   179,
-       0,   174,   183,   184,   185,   188,   190,   186,   187,   180,
-     181,   182,   189,   191,   280,   279,   278,     0,   275,   277,
-     301,     0,   304,     0,     0,   300,   297,     0,   292,   294,
-     295,   298,   299,   296,   340,   330,   332,   334,   336,   338,
-     329,   328,     0,   319,   320,   324,   325,   322,   326,   327,
-     323,   110,   118,     0,   233,   231,   236,     0,   226,   230,
-     227,     0,   216,   217,   219,   229,   220,   221,   222,   235,
-     223,   224,   225,   260,     0,   258,   259,   262,   263,     0,
-     250,   251,   253,   254,   255,   256,   257,   155,   157,   152,
-       0,   150,   153,   154,    39,     0,     0,    33,     0,     0,
-       0,     0,     0,    46,     0,    48,     0,     0,     0,     0,
+      25,    26,    31,     3,    29,    30,    51,     5,    62,     7,
+      95,     9,   176,    11,   277,    13,   294,    15,   320,    17,
+     217,    19,   251,    21,   152,    23,    40,    34,     0,     0,
+       0,     0,     0,     0,   322,   219,   253,     0,    42,     0,
+      41,     0,     0,    35,    60,   400,   396,   398,     0,    59,
+       0,    53,    55,    57,    58,    56,    93,    99,   101,     0,
+       0,     0,     0,     0,   168,   209,   243,   127,   142,   135,
+     350,   144,   163,   367,     0,   384,   394,    87,     0,    64,
+      66,    67,    68,    69,    70,    72,    73,    74,    75,    77,
+      76,    81,    82,    71,    79,    80,    78,    83,    84,    85,
+      86,    97,     0,   354,   269,   286,   197,   199,   201,     0,
+       0,   205,   203,   312,   346,   196,   180,   181,   182,   183,
+       0,   178,   187,   188,   189,   192,   194,   190,   191,   184,
+     185,   186,   193,   195,   284,   283,   282,     0,   279,   281,
+     305,     0,   308,     0,     0,   304,   301,     0,   296,   298,
+     299,   302,   303,   300,   344,   334,   336,   338,   340,   342,
+     333,   332,     0,   323,   324,   328,   329,   326,   330,   331,
+     327,   114,   122,     0,   237,   235,   240,     0,   230,   234,
+     231,     0,   220,   221,   223,   233,   224,   225,   226,   239,
+     227,   228,   229,   264,     0,   262,   263,   266,   267,     0,
+     254,   255,   257,   258,   259,   260,   261,   159,   161,   156,
+       0,   154,   157,   158,    39,     0,     0,    33,     0,     0,
+       0,     0,     0,    50,     0,    52,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    59,     0,
-      92,   352,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   173,     0,     0,   274,     0,     0,
-       0,     0,     0,     0,   291,     0,     0,     0,     0,     0,
-       0,   317,     0,     0,     0,     0,     0,     0,     0,     0,
-     214,     0,     0,     0,   248,     0,     0,     0,     0,   149,
-      45,    36,     0,     0,     0,     0,     0,    50,     0,     0,
-       0,    84,    85,    86,    87,    88,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   379,     0,     0,    61,
-       0,   361,   359,   360,   358,     0,   353,   354,   356,   357,
-       0,     0,     0,     0,     0,   203,   204,     0,     0,     0,
-       0,   175,     0,   276,     0,   303,     0,   306,   307,   293,
-       0,     0,     0,     0,     0,     0,   321,     0,     0,   228,
-       0,     0,     0,   238,   218,     0,   264,   252,     0,     0,
-     151,     0,     0,     0,   393,   395,     0,     0,     0,   166,
-     207,   241,     0,    40,   139,     0,     0,   142,     0,     0,
-       0,     0,    94,     0,   351,     0,   267,   284,   194,   196,
-     198,   202,   200,   310,     0,   281,   302,   305,   341,   331,
-     333,   335,   337,   339,   111,   119,   234,   232,   237,   261,
-     156,   158,    37,     0,   401,     0,   398,   400,     0,   112,
-     114,   116,     0,     0,     0,   109,     0,    99,   101,   102,
-     103,   104,   105,   106,   107,   108,     0,   170,     0,   167,
-     168,   211,     0,   208,   209,   245,     0,   242,   243,   129,
-     130,     0,   125,   127,   128,    42,   137,   135,     0,   133,
-     136,   348,     0,   146,     0,   143,   144,     0,     0,   161,
-     375,     0,     0,     0,   373,   367,   372,     0,   365,   370,
-     368,   369,   371,   386,   388,     0,   382,   384,   385,     0,
-       0,   355,   271,     0,   268,   269,   288,     0,   285,   286,
-     314,     0,   311,   312,   344,     0,    57,     0,     0,   397,
-      90,     0,     0,     0,     0,     0,     0,     0,    96,    98,
-       0,   165,     0,   215,   206,     0,   249,   240,     0,     0,
-     124,     0,     0,   132,     0,   347,     0,   141,     0,     0,
-       0,   160,     0,     0,     0,     0,     0,   364,     0,     0,
-       0,   381,   391,   362,     0,   266,     0,     0,   283,     0,
-     318,   309,     0,     0,   343,     0,   399,     0,     0,     0,
-     120,   121,   122,   100,     0,   169,     0,   210,     0,   244,
-     126,    41,   134,   349,     0,   145,   163,   162,     0,   374,
-     377,   378,   366,     0,     0,   383,     0,   270,     0,   287,
-       0,   313,     0,     0,   113,   115,   117,   171,   212,   246,
-     147,   376,   387,   389,   272,   289,   315,   345,   405,     0,
-     403,     0,     0,   402,   417,     0,   415,   413,   409,     0,
-     407,   411,   412,   410,   404,     0,     0,     0,     0,   406,
-       0,   414,     0,   408,     0,   416,   421,     0,   419,     0,
-       0,   418,   425,     0,   423,   420,     0,     0,   422,     0,
-     424,   426
+       0,     0,     0,     0,     0,     0,     0,     0,    63,     0,
+      96,   356,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   177,     0,     0,   278,     0,     0,
+       0,     0,     0,     0,   295,     0,     0,     0,     0,     0,
+       0,   321,     0,     0,     0,     0,     0,     0,     0,     0,
+     218,     0,     0,     0,   252,     0,     0,     0,     0,   153,
+      43,    36,     0,     0,     0,     0,     0,    54,     0,     0,
+       0,    88,    89,    90,    91,    92,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   383,     0,     0,    65,
+       0,   365,   363,   364,   362,     0,   357,   358,   360,   361,
+       0,     0,     0,     0,     0,   207,   208,     0,     0,     0,
+       0,   179,     0,   280,     0,   307,     0,   310,   311,   297,
+       0,     0,     0,     0,     0,     0,   325,     0,     0,   232,
+       0,     0,     0,   242,   222,     0,   268,   256,     0,     0,
+     155,     0,     0,     0,   397,   399,     0,     0,     0,   170,
+     211,   245,     0,    40,     0,     0,   146,     0,     0,     0,
+       0,    44,    98,     0,   355,     0,   271,   288,   198,   200,
+     202,   206,   204,   314,     0,   285,   306,   309,   345,   335,
+     337,   339,   341,   343,   115,   123,   238,   236,   241,   265,
+     160,   162,    37,     0,   405,     0,   402,   404,     0,   116,
+     118,   120,     0,     0,     0,   113,     0,   103,   105,   106,
+     107,   108,   109,   110,   111,   112,     0,   174,     0,   171,
+     172,   215,     0,   212,   213,   249,     0,   246,   247,   133,
+     134,     0,   129,   131,   132,     0,   141,   139,     0,   137,
+     140,   352,     0,   150,     0,   147,   148,     0,     0,   165,
+     379,     0,     0,     0,   377,   371,   376,     0,   369,   374,
+     372,   373,   375,   390,   392,     0,   386,   388,   389,     0,
+      46,     0,   359,   275,     0,   272,   273,   292,     0,   289,
+     290,   318,     0,   315,   316,   348,     0,    61,     0,     0,
+     401,    94,     0,     0,     0,     0,     0,     0,     0,   100,
+     102,     0,   169,     0,   219,   210,     0,   253,   244,     0,
+       0,   128,   143,     0,   136,     0,   351,     0,   145,     0,
+       0,     0,   164,     0,     0,     0,     0,     0,   368,     0,
+       0,     0,   385,   395,    48,     0,    47,   366,     0,   270,
+       0,     0,   287,     0,   322,   313,     0,     0,   347,     0,
+     403,     0,     0,     0,   124,   125,   126,   104,     0,   173,
+       0,   214,     0,   248,   130,   138,   353,     0,   149,   167,
+     166,     0,   378,   381,   382,   370,     0,     0,   387,    45,
+       0,     0,   274,     0,   291,     0,   317,     0,     0,   117,
+     119,   121,   175,   216,   250,   151,   380,   391,   393,    49,
+     276,   293,   319,   349,   409,     0,   407,     0,     0,   406,
+     421,     0,   419,   417,   413,     0,   411,   415,   416,   414,
+     408,     0,     0,     0,     0,   410,     0,   418,     0,   412,
+       0,   420,   425,     0,   423,     0,     0,   422,   429,     0,
+     427,   424,     0,     0,   426,     0,   428,   430
   };
 
   const short int
   Dhcp6Parser::yypgoto_[] =
   {
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,     3,  -428,  -428,  -428,  -428,     9,  -428,
-    -428,  -203,  -428,  -125,  -428,   -58,  -428,  -428,  -428,   187,
-    -428,  -428,  -428,  -428,    41,   165,   -41,   -38,   -37,   -36,
-    -428,  -428,  -428,  -428,  -428,    42,  -428,  -428,  -428,  -428,
-    -428,    43,  -108,  -399,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,   -65,  -428,  -427,  -428,  -428,  -428,  -428,  -428,  -119,
-    -415,  -428,  -428,  -428,  -428,  -118,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -120,  -428,  -428,  -428,  -123,   141,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -117,  -428,  -428,  -428,
-    -428,  -100,  -428,  -428,  -428,   -96,   182,  -428,  -428,  -428,
-    -428,  -428,  -428,  -405,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,   -99,  -428,  -428,  -428,   -91,  -428,   156,
-    -428,   -51,  -428,  -428,  -428,  -428,   -49,  -428,  -428,  -428,
-    -428,  -428,   -50,  -428,  -428,  -428,   -95,  -428,  -428,  -428,
-     -92,  -428,   160,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -116,  -428,  -428,  -428,  -115,   195,  -428,
-    -428,  -428,  -428,  -428,  -428,  -122,  -428,  -428,  -428,  -121,
-     194,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -114,  -428,  -428,  -428,  -111,  -428,   196,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,    58,  -428,  -428,  -428,  -428,  -428,  -428,  -102,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -105,  -428,
-    -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,  -428,
-    -428,  -428,   -57,  -428,  -428,  -428,  -172,  -428,  -428,  -185,
-    -428,  -428,  -428,  -428,  -428,  -428,  -195,  -428,  -428,  -201,
-    -428
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,    12,  -427,  -427,  -427,  -427,    15,  -427,
+    -427,    34,  -427,  -349,  -427,  -427,  -427,   -58,  -427,  -427,
+    -427,   205,  -427,  -427,  -427,  -427,    30,   181,   -60,   -43,
+     -41,   -40,  -427,  -427,  -427,  -427,  -427,    44,  -427,  -427,
+    -427,  -427,  -427,    43,  -102,  -395,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,   -56,  -427,  -426,  -427,  -427,  -427,  -427,
+    -427,  -113,  -411,  -427,  -427,  -427,  -427,  -111,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -116,  -427,  -427,  -427,  -112,
+     146,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -115,  -427,
+    -427,  -427,  -427,   -95,  -427,  -427,  -427,   -86,   199,  -427,
+    -427,  -427,  -427,  -427,  -427,  -406,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,   -90,  -427,  -427,  -427,   -87,
+    -427,   167,  -427,   -55,  -427,  -427,  -427,  -427,   -54,  -427,
+    -427,  -427,  -427,  -427,   -47,  -427,  -427,  -427,   -85,  -427,
+    -427,  -427,   -88,  -427,   168,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -114,  -427,  -427,  -427,  -110,
+     206,  -427,  -427,  -427,  -427,  -427,  -427,  -118,  -427,  -427,
+    -427,  -107,   198,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -119,  -427,  -427,  -427,  -109,  -427,
+     202,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,    64,  -427,  -427,  -427,  -427,  -427,  -427,
+     -97,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+     -94,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,  -427,
+    -427,  -427,  -427,  -427,   -53,  -427,  -427,  -427,  -170,  -427,
+    -427,  -185,  -427,  -427,  -427,  -427,  -427,  -427,  -191,  -427,
+    -427,  -196,  -427
   };
 
   const short int
@@ -2988,170 +3006,170 @@ namespace isc { namespace dhcp {
   {
       -1,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    68,    33,    34,    57,    72,    73,    35,
-      56,   424,   505,    69,    70,   107,    37,    58,    80,    81,
-      82,   249,    39,    59,   108,   109,   110,   111,   112,   113,
-     114,   115,   256,    41,    60,   132,   279,   116,   257,   117,
-     258,   476,   477,   209,   313,   479,   561,   480,   562,   481,
-     563,   210,   314,   483,   484,   485,   118,   267,   501,   502,
-     503,   504,   119,   269,   508,   509,   510,   120,   268,   121,
-     271,   514,   515,   516,   586,    55,    67,   240,   241,   242,
-     326,   243,   327,   122,   272,   518,   519,   123,   264,   488,
-     489,   490,   570,    43,    61,   150,   151,   152,   284,   153,
-     285,   154,   286,   155,   290,   156,   289,   157,   158,   124,
-     265,   492,   493,   494,   573,    51,    65,   211,   212,   213,
-     214,   215,   216,   217,   218,   317,   219,   316,   220,   221,
-     318,   222,   125,   266,   496,   497,   498,   576,    53,    66,
-     229,   230,   231,   232,   233,   322,   234,   235,   236,   160,
-     282,   543,   544,   545,   604,    45,    62,   167,   168,   169,
-     295,   161,   283,   547,   548,   549,   607,    47,    63,   177,
-     178,   179,   298,   180,   181,   300,   182,   183,   162,   291,
-     551,   552,   553,   610,    49,    64,   192,   193,   194,   195,
-     306,   196,   307,   197,   308,   198,   309,   199,   310,   200,
-     305,   163,   292,   555,   613,   126,   270,   512,   281,   365,
-     366,   367,   368,   369,   433,   127,   273,   527,   528,   529,
-     530,   592,   531,   532,   128,   129,   275,   535,   536,   537,
-     598,   538,   599,   130,   276,    83,   251,    84,   252,    85,
-     250,   465,   466,   467,   557,   669,   670,   671,   679,   680,
-     681,   682,   687,   683,   685,   697,   698,   699,   703,   704,
-     706
+      56,    69,    70,   432,   540,   605,   606,   107,    37,    58,
+      80,    81,    82,   249,    39,    59,   108,   109,   110,   111,
+     112,   113,   114,   115,   256,    41,    60,   132,   279,   116,
+     257,   117,   258,   476,   477,   209,   313,   479,   562,   480,
+     563,   481,   564,   210,   314,   483,   484,   485,   118,   267,
+     501,   502,   503,   504,   119,   269,   508,   509,   510,   120,
+     268,   121,   271,   514,   515,   516,   587,    55,    67,   240,
+     241,   242,   326,   243,   327,   122,   272,   518,   519,   123,
+     264,   488,   489,   490,   571,    43,    61,   150,   151,   152,
+     284,   153,   285,   154,   286,   155,   290,   156,   289,   157,
+     158,   124,   265,   492,   493,   494,   574,    51,    65,   211,
+     212,   213,   214,   215,   216,   217,   218,   317,   219,   316,
+     220,   221,   318,   222,   125,   266,   496,   497,   498,   577,
+      53,    66,   229,   230,   231,   232,   233,   322,   234,   235,
+     236,   160,   282,   544,   545,   546,   608,    45,    62,   167,
+     168,   169,   295,   161,   283,   548,   549,   550,   611,    47,
+      63,   177,   178,   179,   298,   180,   181,   300,   182,   183,
+     162,   291,   552,   553,   554,   614,    49,    64,   192,   193,
+     194,   195,   306,   196,   307,   197,   308,   198,   309,   199,
+     310,   200,   305,   163,   292,   556,   617,   126,   270,   512,
+     281,   365,   366,   367,   368,   369,   433,   127,   273,   527,
+     528,   529,   530,   593,   531,   532,   128,   129,   275,   535,
+     536,   537,   599,   538,   600,   130,   276,    83,   251,    84,
+     252,    85,   250,   465,   466,   467,   558,   675,   676,   677,
+     685,   686,   687,   688,   693,   689,   691,   703,   704,   705,
+     709,   710,   712
   };
 
   const unsigned short int
   Dhcp6Parser::yytable_[] =
   {
-      79,   226,   526,   145,   165,   175,   190,   208,   225,   239,
-     507,   159,   166,   176,   191,   227,    32,   228,   478,   478,
-     146,   511,   133,   147,   148,   149,    74,    25,    24,    26,
-     525,    27,   202,   223,   203,   204,   224,    89,    90,    91,
-      92,    36,    96,   202,    96,   201,   469,   470,   471,   472,
-     473,   474,   201,   134,    38,   135,   472,   133,    40,   499,
-     202,   136,   137,   138,   139,   140,   141,    42,    96,   361,
-      44,   254,   142,   143,    46,    86,   255,    87,    88,   144,
-     170,   171,   172,   173,   174,    96,    89,    90,    91,    92,
-      93,    94,    95,    96,    48,   164,    75,   500,    71,   237,
-     238,    78,    76,    77,   202,   237,   238,   142,   520,   521,
-     522,   523,    78,    50,    78,    78,    97,    98,    99,   100,
-      96,    28,    29,    30,    31,   579,    52,   201,   580,    78,
-     101,    78,   277,   102,   103,    54,    78,   278,    78,   104,
-     105,   244,   202,   106,   203,   204,   184,   205,   206,   207,
-     185,   186,   187,   188,   189,    78,   674,   432,   675,   676,
-     293,   296,   131,    78,   245,   294,   297,   507,   478,   526,
-     303,   328,   277,    78,   246,   304,   329,   556,   558,   633,
-     567,   567,   247,   559,   248,   568,   569,   448,   449,   450,
-      78,   582,   584,   280,   583,   585,    79,   525,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,   590,
-     596,    78,   600,   248,   591,   597,   363,   601,   602,   293,
-     328,   296,   303,   362,   657,   660,   664,   665,   688,   707,
-     311,   364,   253,   689,   708,   145,   672,   700,   165,   673,
-     701,   499,   506,   159,   259,   175,   166,   260,   330,   331,
-     533,   534,   146,   176,   190,   147,   148,   149,   261,   262,
-     226,   263,   191,   208,   274,   287,   288,   225,   299,   301,
-     302,   312,   341,   315,   227,   319,   228,   321,   320,   323,
-     324,   325,   332,   333,   334,   335,   336,   338,   339,   340,
-     342,   343,   344,   345,   346,   347,   348,   349,   350,   351,
-     352,   353,   354,   355,   356,   357,   358,   360,   370,   371,
-     372,   373,   374,   375,   376,   377,   378,   379,   380,   382,
-     384,   385,   386,   387,   388,   390,   391,   392,   393,   394,
-     395,   397,   398,   400,   401,   399,   402,   405,   414,   415,
-     403,   406,   408,   409,   411,   434,   438,   439,   412,   413,
-     416,   417,   482,   482,   418,   419,   420,   421,   422,   475,
-     475,   423,   425,   426,   427,   620,   435,   428,   429,   430,
-     363,   524,   431,   436,   437,   440,   441,   362,   443,   444,
-     581,   487,   491,   495,   513,   364,   442,   445,   446,   540,
-     542,   546,   564,   550,   565,   560,   566,   571,   572,   447,
-     574,   575,   577,   578,   588,   587,   589,   593,   451,   452,
-     594,   595,   461,   606,   462,   605,   453,   608,   454,   455,
-     554,   609,   611,   612,   653,   614,   615,   464,   617,   618,
-     456,   619,   631,   457,   458,   459,   638,   643,   644,   652,
-     539,   337,   359,   668,   460,   658,   659,   517,   603,   666,
-     686,   690,   692,   463,   621,   694,   696,   709,   468,   623,
-     630,   486,   702,   634,   632,   654,   622,   636,   635,   410,
-     639,   640,   625,   637,   624,   381,   627,   404,   641,   655,
-     656,   661,   626,   629,   628,   407,   648,   649,   662,   646,
-     647,   383,   663,   541,   642,   645,   667,   389,   651,   650,
-     684,   616,   482,   693,   691,   705,   710,   695,   396,   475,
-       0,   226,   145,   711,     0,   208,     0,     0,   225,     0,
-     159,     0,     0,     0,     0,   227,     0,   228,   239,   146,
-       0,     0,   147,   148,   149,     0,     0,     0,   524,     0,
-       0,     0,     0,     0,     0,     0,   165,     0,     0,   175,
-       0,     0,   190,     0,   166,     0,     0,   176,     0,     0,
-     191,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      79,   146,   526,   145,   165,   175,   190,   208,   225,   239,
+     226,   227,   228,   507,   159,   166,   176,   191,   147,   511,
+     148,   149,   478,   478,    25,    32,    26,    74,    27,   133,
+     133,    96,   202,   525,   237,   238,   202,   223,   203,   204,
+     224,   448,   449,   450,   499,    89,    90,    91,    92,    24,
+     254,   277,    96,    36,    96,   255,   278,   293,   361,    38,
+     296,   134,   294,   135,   164,   297,    78,    40,   201,   136,
+     137,   138,   139,   140,   141,   580,   237,   238,   581,   142,
+     142,   143,   500,   202,    42,   203,   204,   144,   205,   206,
+     207,   201,   499,   506,    44,   472,    86,    75,    87,    88,
+      46,    78,    48,    76,    77,    78,    50,    89,    90,    91,
+      92,    93,    94,    95,    96,    52,    78,    54,    28,    29,
+      30,    31,    78,    71,    78,   244,   201,   469,   470,   471,
+     472,   473,   474,   533,   534,   131,    96,    97,    98,    99,
+     100,   202,   583,   202,   245,   584,   246,   520,   521,   522,
+     523,   101,    78,   303,   102,   103,   585,   247,   304,   586,
+     104,   105,   184,   248,   106,   253,   185,   186,   187,   188,
+     189,   526,   507,   478,    96,    78,   328,   277,   559,   636,
+     568,   329,   557,   560,    78,   569,   170,   171,   172,   173,
+     174,   259,   260,   261,   568,   680,    79,   681,   682,   570,
+     591,   280,   525,   597,   601,   592,    78,   262,   598,   602,
+      78,   248,    78,   293,   328,   296,   603,   303,   662,   665,
+     670,   694,   671,   362,   713,   363,   695,   678,   706,   714,
+     679,   707,   263,   146,   364,   145,   274,   287,   165,   288,
+     299,   301,   302,   312,    78,   175,   159,   311,   315,   166,
+     147,   319,   148,   149,   190,   321,   176,   330,   331,   320,
+     323,   324,   325,   208,   332,   191,   333,   225,   334,   226,
+     227,   228,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,   335,   336,   338,   339,   340,   346,   347,
+     341,   348,   342,   349,   343,   344,   345,   350,   351,   352,
+     353,   354,   355,   357,   356,   358,   360,   370,   371,   372,
+     373,   374,   377,   375,   378,   379,   380,   376,   382,   384,
+     385,   386,   387,   388,   390,   391,   392,   393,   394,   395,
+     397,   398,   400,   401,   399,   402,   405,   408,   409,   411,
+     708,   419,   420,   403,   406,   412,   413,   414,   415,   416,
+     417,   418,   421,   422,   423,   424,   425,   426,   431,   475,
+     475,   482,   482,   427,   428,   429,   430,   435,   434,   438,
+     524,   436,   437,   439,   440,   441,   442,   362,   443,   363,
+     561,   444,   487,   491,   495,   445,   513,   446,   364,   447,
+     451,   452,   541,   543,   547,   565,   551,   566,   567,   453,
+     573,   572,   575,   576,   578,   579,   674,   582,   454,   588,
+     589,   555,   455,   590,   594,   456,   595,   457,   458,   596,
+     609,   461,   464,   462,   610,   612,   613,   616,   615,   459,
+     619,   621,   622,   618,   623,   641,   646,   647,   650,   460,
+     649,   657,   463,   658,   517,   539,   692,   663,   664,   672,
+     696,   698,   702,   604,   607,   700,   715,   505,   359,   337,
+     468,   486,   625,   624,   659,   626,   627,   634,   639,   642,
+     643,   644,   635,   638,   410,   637,   640,   660,   629,   661,
+     666,   667,   668,   669,   673,   628,   631,   630,   404,   632,
+     697,   701,   381,   407,   633,   654,   652,   656,   651,   542,
+     645,   389,   383,   717,   653,   655,   620,   648,   690,   699,
+     475,   146,   482,   145,   396,   711,   208,   716,     0,   225,
+       0,   226,   227,   228,   159,     0,     0,     0,   147,   239,
+     148,   149,     0,     0,     0,     0,     0,     0,     0,   524,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     165,     0,     0,   175,     0,     0,   190,     0,     0,     0,
+       0,   166,     0,     0,   176,     0,     0,   191,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   678,     0,     0,     0,
-       0,     0,     0,   677,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   678,     0,     0,     0,     0,     0,     0,
-     677
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   683,
+       0,   684,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   683,     0,   684
   };
 
   const short int
   Dhcp6Parser::yycheck_[] =
   {
-      58,    66,   429,    61,    62,    63,    64,    65,    66,    67,
-     425,    61,    62,    63,    64,    66,    13,    66,   417,   418,
-      61,   426,     7,    61,    61,    61,    10,     5,     0,     7,
-     429,     9,    30,    31,    32,    33,    34,    22,    23,    24,
-      25,     7,    29,    30,    29,    15,    16,    17,    18,    19,
-      20,    21,    15,    38,     7,    40,    19,     7,     7,    61,
-      30,    46,    47,    48,    49,    50,    51,     7,    29,    56,
-       7,     3,    57,    58,     7,    11,     8,    13,    14,    64,
-      41,    42,    43,    44,    45,    29,    22,    23,    24,    25,
-      26,    27,    28,    29,     7,    39,    80,    99,    99,    67,
-      68,    99,    86,    87,    30,    67,    68,    57,    71,    72,
-      73,    74,    99,     7,    99,    99,    52,    53,    54,    55,
-      29,    99,   100,   101,   102,     3,     7,    15,     6,    99,
-      66,    99,     3,    69,    70,     7,    99,     8,    99,    75,
-      76,     6,    30,    79,    32,    33,    55,    35,    36,    37,
-      59,    60,    61,    62,    63,    99,    82,   360,    84,    85,
-       3,     3,    12,    99,     3,     8,     8,   582,   567,   596,
-       3,     3,     3,    99,     4,     8,     8,     8,     3,   584,
-       3,     3,     8,     8,     3,     8,     8,   390,   391,   392,
-      99,     3,     3,     8,     6,     6,   254,   596,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,     3,
-       3,    99,     3,     3,     8,     8,   281,     8,     8,     3,
-       3,     3,     3,   281,     8,     8,     8,     8,     3,     3,
-       8,   281,     4,     8,     8,   293,     3,     3,   296,     6,
-       6,    61,    62,   293,     4,   303,   296,     4,   245,   246,
-      77,    78,   293,   303,   312,   293,   293,   293,     4,     4,
-     325,     4,   312,   321,     4,     4,     4,   325,     4,     4,
-       4,     3,   100,     4,   325,     4,   325,     3,     8,     4,
-       8,     3,    99,     4,     4,     4,     4,     4,     4,     4,
-     100,   100,   100,   100,     4,     4,     4,     4,     4,     4,
+      58,    61,   428,    61,    62,    63,    64,    65,    66,    67,
+      66,    66,    66,   424,    61,    62,    63,    64,    61,   425,
+      61,    61,   417,   418,     5,    13,     7,    10,     9,     7,
+       7,    29,    30,   428,    67,    68,    30,    31,    32,    33,
+      34,   390,   391,   392,    61,    22,    23,    24,    25,     0,
+       3,     3,    29,     7,    29,     8,     8,     3,    56,     7,
+       3,    38,     8,    40,    39,     8,    99,     7,    15,    46,
+      47,    48,    49,    50,    51,     3,    67,    68,     6,    57,
+      57,    58,    99,    30,     7,    32,    33,    64,    35,    36,
+      37,    15,    61,    62,     7,    19,    11,    80,    13,    14,
+       7,    99,     7,    86,    87,    99,     7,    22,    23,    24,
+      25,    26,    27,    28,    29,     7,    99,     7,    99,   100,
+     101,   102,    99,    99,    99,     6,    15,    16,    17,    18,
+      19,    20,    21,    77,    78,    12,    29,    52,    53,    54,
+      55,    30,     3,    30,     3,     6,     4,    71,    72,    73,
+      74,    66,    99,     3,    69,    70,     3,     8,     8,     6,
+      75,    76,    55,     3,    79,     4,    59,    60,    61,    62,
+      63,   597,   583,   568,    29,    99,     3,     3,     3,   585,
+       3,     8,     8,     8,    99,     8,    41,    42,    43,    44,
+      45,     4,     4,     4,     3,    82,   254,    84,    85,     8,
+       3,     8,   597,     3,     3,     8,    99,     4,     8,     8,
+      99,     3,    99,     3,     3,     3,     8,     3,     8,     8,
+       8,     3,     8,   281,     3,   281,     8,     3,     3,     8,
+       6,     6,     4,   293,   281,   293,     4,     4,   296,     4,
+       4,     4,     4,     3,    99,   303,   293,     8,     4,   296,
+     293,     4,   293,   293,   312,     3,   303,   245,   246,     8,
+       4,     8,     3,   321,    99,   312,     4,   325,     4,   325,
+     325,   325,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,     4,     4,     4,     4,     4,     4,     4,
+     100,     4,   100,     4,   100,   100,   100,     4,     4,     4,
        4,     4,     4,     4,   100,     4,     4,     4,     4,     4,
-       4,     4,     4,   100,   102,     4,     4,     4,     4,     4,
-       4,   100,     4,   100,   100,     4,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,   100,     4,     4,   335,   336,
-     102,   102,     4,     4,     4,     8,    99,    99,     7,     7,
-       7,     7,   417,   418,     7,     5,     5,     5,     5,   417,
-     418,     5,     5,     5,     5,   102,     3,     7,     7,     7,
-     435,   429,     7,     5,     5,    99,    99,   435,     5,     7,
-     505,     7,     7,     7,     7,   435,    99,    99,    99,     4,
-       7,     7,     4,     7,     4,     8,     4,     6,     3,    99,
-       6,     3,     6,     3,     3,     6,     4,     4,    99,    99,
-       4,     4,   409,     3,   411,     6,    99,     6,    99,    99,
-      65,     3,     6,     3,     5,     8,     4,    81,     4,     4,
-      99,     4,     6,    99,    99,    99,     4,     4,     4,     4,
-     431,   254,   277,     7,    99,     8,     8,    99,    99,     8,
-       4,     4,     4,   412,   100,     5,     7,     4,   416,   567,
-     579,   418,    83,   586,   582,    99,   102,   100,   588,   328,
-     100,   100,   572,   590,   570,   293,   575,   321,   100,    99,
-      99,    99,   573,   578,   576,   325,   607,   609,    99,   604,
-     606,   296,    99,   435,   596,   600,    99,   303,   612,   610,
-     672,   558,   567,   688,   100,   700,   707,    99,   312,   567,
-      -1,   576,   570,    99,    -1,   573,    -1,    -1,   576,    -1,
-     570,    -1,    -1,    -1,    -1,   576,    -1,   576,   586,   570,
-      -1,    -1,   570,   570,   570,    -1,    -1,    -1,   596,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   604,    -1,    -1,   607,
-      -1,    -1,   610,    -1,   604,    -1,    -1,   607,    -1,    -1,
-     610,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       4,     4,     4,   100,     4,     4,     4,   102,     4,     4,
+     100,     4,   100,   100,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,   100,     4,     4,     4,     4,     4,
+      83,     5,     5,   102,   102,     7,     7,   335,   336,     7,
+       7,     7,     5,     5,     5,     5,     5,     5,     5,   417,
+     418,   417,   418,     7,     7,     7,     7,     3,     8,    99,
+     428,     5,     5,    99,    99,    99,    99,   435,     5,   435,
+       8,     7,     7,     7,     7,    99,     7,    99,   435,    99,
+      99,    99,     4,     7,     7,     4,     7,     4,     4,    99,
+       3,     6,     6,     3,     6,     3,     7,     6,    99,     6,
+       3,    65,    99,     4,     4,    99,     4,    99,    99,     4,
+       6,   409,    81,   411,     3,     6,     3,     3,     6,    99,
+       4,     4,     4,     8,     4,     4,     4,     4,     3,    99,
+       6,     4,   412,     5,    99,   430,     4,     8,     8,     8,
+       4,     4,     7,    99,    99,     5,     4,   423,   277,   254,
+     416,   418,   100,   102,    99,   102,   568,   580,   100,   100,
+     100,   100,   583,   589,   328,   587,   591,    99,   573,    99,
+      99,    99,    99,    99,    99,   571,   576,   574,   321,   577,
+     100,    99,   293,   325,   579,   613,   610,   616,   608,   435,
+     597,   303,   296,    99,   611,   614,   559,   601,   678,   694,
+     568,   571,   568,   571,   312,   706,   574,   713,    -1,   577,
+      -1,   577,   577,   577,   571,    -1,    -1,    -1,   571,   587,
+     571,   571,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   597,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     608,    -1,    -1,   611,    -1,    -1,   614,    -1,    -1,    -1,
+      -1,   608,    -1,    -1,   611,    -1,    -1,   614,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   671,    -1,    -1,    -1,
-      -1,    -1,    -1,   671,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   688,    -1,    -1,    -1,    -1,    -1,    -1,
-     688
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   677,
+      -1,   677,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   694,    -1,   694
   };
 
   const unsigned short int
@@ -3160,75 +3178,75 @@ namespace isc { namespace dhcp {
        0,    88,    89,    90,    91,    92,    93,    94,    95,    96,
       97,    98,   104,   105,   106,   107,   108,   109,   110,   111,
      112,   113,   114,   115,     0,     5,     7,     9,    99,   100,
-     101,   102,   116,   117,   118,   122,     7,   129,     7,   135,
-       7,   146,     7,   206,     7,   268,     7,   280,     7,   297,
-       7,   228,     7,   251,     7,   188,   123,   119,   130,   136,
-     147,   207,   269,   281,   298,   229,   252,   189,   116,   126,
-     127,    99,   120,   121,    10,    80,    86,    87,    99,   128,
-     131,   132,   133,   348,   350,   352,    11,    13,    14,    22,
+     101,   102,   116,   117,   118,   122,     7,   131,     7,   137,
+       7,   148,     7,   208,     7,   270,     7,   282,     7,   299,
+       7,   230,     7,   253,     7,   190,   123,   119,   132,   138,
+     149,   209,   271,   283,   300,   231,   254,   191,   116,   124,
+     125,    99,   120,   121,    10,    80,    86,    87,    99,   130,
+     133,   134,   135,   350,   352,   354,    11,    13,    14,    22,
       23,    24,    25,    26,    27,    28,    29,    52,    53,    54,
-      55,    66,    69,    70,    75,    76,    79,   128,   137,   138,
-     139,   140,   141,   142,   143,   144,   150,   152,   169,   175,
-     180,   182,   196,   200,   222,   245,   318,   328,   337,   338,
-     346,    12,   148,     7,    38,    40,    46,    47,    48,    49,
-      50,    51,    57,    58,    64,   128,   139,   140,   141,   142,
-     208,   209,   210,   212,   214,   216,   218,   220,   221,   245,
-     262,   274,   291,   314,    39,   128,   245,   270,   271,   272,
-      41,    42,    43,    44,    45,   128,   245,   282,   283,   284,
-     286,   287,   289,   290,    55,    59,    60,    61,    62,    63,
-     128,   245,   299,   300,   301,   302,   304,   306,   308,   310,
-     312,    15,    30,    32,    33,    35,    36,    37,   128,   156,
-     164,   230,   231,   232,   233,   234,   235,   236,   237,   239,
-     241,   242,   244,    31,    34,   128,   164,   234,   239,   253,
-     254,   255,   256,   257,   259,   260,   261,    67,    68,   128,
-     190,   191,   192,   194,     6,     3,     4,     8,     3,   134,
-     353,   349,   351,     4,     3,     8,   145,   151,   153,     4,
-       4,     4,     4,     4,   201,   223,   246,   170,   181,   176,
-     319,   183,   197,   329,     4,   339,   347,     3,     8,   149,
-       8,   321,   263,   275,   211,   213,   215,     4,     4,   219,
-     217,   292,   315,     3,     8,   273,     3,     8,   285,     4,
-     288,     4,     4,     3,     8,   313,   303,   305,   307,   309,
-     311,     8,     3,   157,   165,     4,   240,   238,   243,     4,
-       8,     3,   258,     4,     8,     3,   193,   195,     3,     8,
-     116,   116,    99,     4,     4,     4,     4,   132,     4,     4,
+      55,    66,    69,    70,    75,    76,    79,   130,   139,   140,
+     141,   142,   143,   144,   145,   146,   152,   154,   171,   177,
+     182,   184,   198,   202,   224,   247,   320,   330,   339,   340,
+     348,    12,   150,     7,    38,    40,    46,    47,    48,    49,
+      50,    51,    57,    58,    64,   130,   141,   142,   143,   144,
+     210,   211,   212,   214,   216,   218,   220,   222,   223,   247,
+     264,   276,   293,   316,    39,   130,   247,   272,   273,   274,
+      41,    42,    43,    44,    45,   130,   247,   284,   285,   286,
+     288,   289,   291,   292,    55,    59,    60,    61,    62,    63,
+     130,   247,   301,   302,   303,   304,   306,   308,   310,   312,
+     314,    15,    30,    32,    33,    35,    36,    37,   130,   158,
+     166,   232,   233,   234,   235,   236,   237,   238,   239,   241,
+     243,   244,   246,    31,    34,   130,   166,   236,   241,   255,
+     256,   257,   258,   259,   261,   262,   263,    67,    68,   130,
+     192,   193,   194,   196,     6,     3,     4,     8,     3,   136,
+     355,   351,   353,     4,     3,     8,   147,   153,   155,     4,
+       4,     4,     4,     4,   203,   225,   248,   172,   183,   178,
+     321,   185,   199,   331,     4,   341,   349,     3,     8,   151,
+       8,   323,   265,   277,   213,   215,   217,     4,     4,   221,
+     219,   294,   317,     3,     8,   275,     3,     8,   287,     4,
+     290,     4,     4,     3,     8,   315,   305,   307,   309,   311,
+     313,     8,     3,   159,   167,     4,   242,   240,   245,     4,
+       8,     3,   260,     4,     8,     3,   195,   197,     3,     8,
+     116,   116,    99,     4,     4,     4,     4,   134,     4,     4,
        4,   100,   100,   100,   100,   100,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,   100,     4,     4,   138,
-       4,    56,   128,   164,   245,   322,   323,   324,   325,   326,
+       4,     4,     4,     4,     4,     4,   100,     4,     4,   140,
+       4,    56,   130,   166,   247,   324,   325,   326,   327,   328,
        4,     4,     4,     4,     4,   100,   102,     4,     4,     4,
-       4,   209,     4,   271,     4,   100,     4,   100,   100,   283,
-       4,     4,     4,     4,     4,     4,   301,     4,     4,   100,
-       4,     4,     4,   102,   232,     4,   102,   255,     4,     4,
-     191,     4,     7,     7,   116,   116,     7,     7,     7,     5,
-       5,     5,     5,     5,   124,     5,     5,     5,     7,     7,
-       7,     7,   124,   327,     8,     3,     5,     5,    99,    99,
-      99,    99,    99,     5,     7,    99,    99,    99,   124,   124,
-     124,    99,    99,    99,    99,    99,    99,    99,    99,    99,
-      99,   116,   116,   137,    81,   354,   355,   356,   148,    16,
-      17,    18,    19,    20,    21,   128,   154,   155,   156,   158,
-     160,   162,   164,   166,   167,   168,   154,     7,   202,   203,
-     204,     7,   224,   225,   226,     7,   247,   248,   249,    61,
-      99,   171,   172,   173,   174,   125,    62,   173,   177,   178,
-     179,   216,   320,     7,   184,   185,   186,    99,   198,   199,
-      71,    72,    73,    74,   128,   156,   166,   330,   331,   332,
-     333,   335,   336,    77,    78,   340,   341,   342,   344,   121,
-       4,   324,     7,   264,   265,   266,     7,   276,   277,   278,
-       7,   293,   294,   295,    65,   316,     8,   357,     3,     8,
-       8,   159,   161,   163,     4,     4,     4,     3,     8,     8,
-     205,     6,     3,   227,     6,     3,   250,     6,     3,     3,
-       6,   126,     3,     6,     3,     6,   187,     6,     3,     4,
-       3,     8,   334,     4,     4,     4,     3,     8,   343,   345,
-       3,     8,     8,    99,   267,     6,     3,   279,     6,     3,
-     296,     6,     3,   317,     8,     4,   355,     4,     4,     4,
-     102,   100,   102,   155,   208,   204,   230,   226,   253,   249,
-     172,     6,   178,   216,   190,   186,   100,   199,     4,   100,
-     100,   100,   331,     4,     4,   341,   270,   266,   282,   278,
-     299,   295,     4,     5,    99,    99,    99,     8,     8,     8,
-       8,    99,    99,    99,     8,     8,     8,    99,     7,   358,
-     359,   360,     3,     6,    82,    84,    85,   128,   164,   361,
-     362,   363,   364,   366,   359,   367,     4,   365,     3,     8,
-       4,   100,     4,   362,     5,    99,     7,   368,   369,   370,
-       3,     6,    83,   371,   372,   369,   373,     3,     8,     4,
-     372,    99
+       4,   211,     4,   273,     4,   100,     4,   100,   100,   285,
+       4,     4,     4,     4,     4,     4,   303,     4,     4,   100,
+       4,     4,     4,   102,   234,     4,   102,   257,     4,     4,
+     193,     4,     7,     7,   116,   116,     7,     7,     7,     5,
+       5,     5,     5,     5,     5,     5,     5,     7,     7,     7,
+       7,     5,   126,   329,     8,     3,     5,     5,    99,    99,
+      99,    99,    99,     5,     7,    99,    99,    99,   126,   126,
+     126,    99,    99,    99,    99,    99,    99,    99,    99,    99,
+      99,   116,   116,   139,    81,   356,   357,   358,   150,    16,
+      17,    18,    19,    20,    21,   130,   156,   157,   158,   160,
+     162,   164,   166,   168,   169,   170,   156,     7,   204,   205,
+     206,     7,   226,   227,   228,     7,   249,   250,   251,    61,
+      99,   173,   174,   175,   176,   124,    62,   175,   179,   180,
+     181,   218,   322,     7,   186,   187,   188,    99,   200,   201,
+      71,    72,    73,    74,   130,   158,   168,   332,   333,   334,
+     335,   337,   338,    77,    78,   342,   343,   344,   346,   121,
+     127,     4,   326,     7,   266,   267,   268,     7,   278,   279,
+     280,     7,   295,   296,   297,    65,   318,     8,   359,     3,
+       8,     8,   161,   163,   165,     4,     4,     4,     3,     8,
+       8,   207,     6,     3,   229,     6,     3,   252,     6,     3,
+       3,     6,     6,     3,     6,     3,     6,   189,     6,     3,
+       4,     3,     8,   336,     4,     4,     4,     3,     8,   345,
+     347,     3,     8,     8,    99,   128,   129,    99,   269,     6,
+       3,   281,     6,     3,   298,     6,     3,   319,     8,     4,
+     357,     4,     4,     4,   102,   100,   102,   157,   210,   206,
+     232,   228,   255,   251,   174,   180,   218,   192,   188,   100,
+     201,     4,   100,   100,   100,   333,     4,     4,   343,     6,
+       3,   272,   268,   284,   280,   301,   297,     4,     5,    99,
+      99,    99,     8,     8,     8,     8,    99,    99,    99,    99,
+       8,     8,     8,    99,     7,   360,   361,   362,     3,     6,
+      82,    84,    85,   130,   166,   363,   364,   365,   366,   368,
+     361,   369,     4,   367,     3,     8,     4,   100,     4,   364,
+       5,    99,     7,   370,   371,   372,     3,     6,    83,   373,
+     374,   371,   375,     3,     8,     4,   374,    99
   };
 
   const unsigned short int
@@ -3238,45 +3256,46 @@ namespace isc { namespace dhcp {
      109,   104,   110,   104,   111,   104,   112,   104,   113,   104,
      114,   104,   115,   104,   116,   116,   116,   116,   116,   116,
      116,   117,   119,   118,   120,   120,   121,   121,   123,   122,
-     125,   124,   126,   126,   127,   127,   128,   130,   129,   131,
-     131,   132,   132,   132,   132,   132,   134,   133,   136,   135,
-     137,   137,   138,   138,   138,   138,   138,   138,   138,   138,
-     138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
-     138,   138,   138,   138,   139,   140,   141,   142,   143,   145,
-     144,   147,   146,   149,   148,   151,   150,   153,   152,   154,
-     154,   155,   155,   155,   155,   155,   155,   155,   155,   155,
-     157,   156,   159,   158,   161,   160,   163,   162,   165,   164,
-     166,   167,   168,   170,   169,   171,   171,   172,   172,   173,
-     174,   176,   175,   177,   177,   178,   178,   179,   181,   180,
-     183,   182,   184,   184,   185,   185,   187,   186,   189,   188,
-     190,   190,   190,   191,   191,   193,   192,   195,   194,   197,
-     196,   198,   198,   199,   201,   200,   202,   202,   203,   203,
-     205,   204,   207,   206,   208,   208,   209,   209,   209,   209,
-     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
-     209,   209,   209,   211,   210,   213,   212,   215,   214,   217,
-     216,   219,   218,   220,   221,   223,   222,   224,   224,   225,
-     225,   227,   226,   229,   228,   230,   230,   231,   231,   232,
-     232,   232,   232,   232,   232,   232,   232,   233,   234,   235,
-     236,   238,   237,   240,   239,   241,   243,   242,   244,   246,
-     245,   247,   247,   248,   248,   250,   249,   252,   251,   253,
-     253,   254,   254,   255,   255,   255,   255,   255,   255,   256,
-     258,   257,   259,   260,   261,   263,   262,   264,   264,   265,
-     265,   267,   266,   269,   268,   270,   270,   271,   271,   271,
-     273,   272,   275,   274,   276,   276,   277,   277,   279,   278,
-     281,   280,   282,   282,   283,   283,   283,   283,   283,   283,
-     283,   285,   284,   286,   288,   287,   289,   290,   292,   291,
-     293,   293,   294,   294,   296,   295,   298,   297,   299,   299,
-     300,   300,   301,   301,   301,   301,   301,   301,   301,   301,
-     303,   302,   305,   304,   307,   306,   309,   308,   311,   310,
-     313,   312,   315,   314,   317,   316,   319,   318,   320,   320,
-     321,   216,   322,   322,   323,   323,   324,   324,   324,   324,
-     325,   327,   326,   329,   328,   330,   330,   331,   331,   331,
-     331,   331,   331,   331,   332,   334,   333,   335,   336,   337,
-     339,   338,   340,   340,   341,   341,   343,   342,   345,   344,
-     347,   346,   349,   348,   351,   350,   353,   352,   354,   354,
-     355,   357,   356,   358,   358,   360,   359,   361,   361,   362,
-     362,   362,   362,   362,   363,   365,   364,   367,   366,   368,
-     368,   370,   369,   371,   371,   373,   372
+     124,   124,   125,   125,   127,   126,   128,   128,   129,   129,
+     130,   132,   131,   133,   133,   134,   134,   134,   134,   134,
+     136,   135,   138,   137,   139,   139,   140,   140,   140,   140,
+     140,   140,   140,   140,   140,   140,   140,   140,   140,   140,
+     140,   140,   140,   140,   140,   140,   140,   140,   141,   142,
+     143,   144,   145,   147,   146,   149,   148,   151,   150,   153,
+     152,   155,   154,   156,   156,   157,   157,   157,   157,   157,
+     157,   157,   157,   157,   159,   158,   161,   160,   163,   162,
+     165,   164,   167,   166,   168,   169,   170,   172,   171,   173,
+     173,   174,   174,   175,   176,   178,   177,   179,   179,   180,
+     180,   181,   183,   182,   185,   184,   186,   186,   187,   187,
+     189,   188,   191,   190,   192,   192,   192,   193,   193,   195,
+     194,   197,   196,   199,   198,   200,   200,   201,   203,   202,
+     204,   204,   205,   205,   207,   206,   209,   208,   210,   210,
+     211,   211,   211,   211,   211,   211,   211,   211,   211,   211,
+     211,   211,   211,   211,   211,   211,   211,   213,   212,   215,
+     214,   217,   216,   219,   218,   221,   220,   222,   223,   225,
+     224,   226,   226,   227,   227,   229,   228,   231,   230,   232,
+     232,   233,   233,   234,   234,   234,   234,   234,   234,   234,
+     234,   235,   236,   237,   238,   240,   239,   242,   241,   243,
+     245,   244,   246,   248,   247,   249,   249,   250,   250,   252,
+     251,   254,   253,   255,   255,   256,   256,   257,   257,   257,
+     257,   257,   257,   258,   260,   259,   261,   262,   263,   265,
+     264,   266,   266,   267,   267,   269,   268,   271,   270,   272,
+     272,   273,   273,   273,   275,   274,   277,   276,   278,   278,
+     279,   279,   281,   280,   283,   282,   284,   284,   285,   285,
+     285,   285,   285,   285,   285,   287,   286,   288,   290,   289,
+     291,   292,   294,   293,   295,   295,   296,   296,   298,   297,
+     300,   299,   301,   301,   302,   302,   303,   303,   303,   303,
+     303,   303,   303,   303,   305,   304,   307,   306,   309,   308,
+     311,   310,   313,   312,   315,   314,   317,   316,   319,   318,
+     321,   320,   322,   322,   323,   218,   324,   324,   325,   325,
+     326,   326,   326,   326,   327,   329,   328,   331,   330,   332,
+     332,   333,   333,   333,   333,   333,   333,   333,   334,   336,
+     335,   337,   338,   339,   341,   340,   342,   342,   343,   343,
+     345,   344,   347,   346,   349,   348,   351,   350,   353,   352,
+     355,   354,   356,   356,   357,   359,   358,   360,   360,   362,
+     361,   363,   363,   364,   364,   364,   364,   364,   365,   367,
+     366,   369,   368,   370,   370,   372,   371,   373,   373,   375,
+     374
   };
 
   const unsigned char
@@ -3286,45 +3305,46 @@ namespace isc { namespace dhcp {
        0,     3,     0,     3,     0,     3,     0,     3,     0,     3,
        0,     3,     0,     3,     1,     1,     1,     1,     1,     1,
        1,     1,     0,     4,     0,     1,     3,     5,     0,     4,
-       0,     4,     0,     1,     1,     3,     2,     0,     4,     1,
-       3,     1,     1,     1,     1,     1,     0,     6,     0,     4,
-       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     1,     1,     3,     0,     4,     0,     1,     1,     3,
+       2,     0,     4,     1,     3,     1,     1,     1,     1,     1,
+       0,     6,     0,     4,     1,     3,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     3,     3,     3,     3,     3,     0,
-       6,     0,     4,     0,     4,     0,     6,     0,     6,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
-       3,     3,     3,     0,     6,     1,     3,     1,     1,     1,
-       1,     0,     6,     1,     3,     1,     1,     1,     0,     4,
-       0,     6,     0,     1,     1,     3,     0,     4,     0,     4,
-       1,     3,     1,     1,     1,     0,     4,     0,     4,     0,
-       6,     1,     3,     3,     0,     6,     0,     1,     1,     3,
-       0,     4,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     3,     3,
+       3,     3,     3,     0,     6,     0,     4,     0,     4,     0,
+       6,     0,     6,     1,     3,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     0,     4,     0,     4,     0,     4,
+       0,     4,     0,     4,     3,     3,     3,     0,     6,     1,
+       3,     1,     1,     1,     1,     0,     6,     1,     3,     1,
+       1,     1,     0,     6,     0,     6,     0,     1,     1,     3,
+       0,     4,     0,     4,     1,     3,     1,     1,     1,     0,
+       4,     0,     4,     0,     6,     1,     3,     3,     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,     0,     4,     0,     4,     0,     4,     0,
-       4,     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,     3,     1,
-       1,     0,     4,     0,     4,     1,     0,     4,     3,     0,
+       1,     1,     1,     1,     1,     1,     1,     0,     4,     0,
+       4,     0,     4,     0,     4,     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,
-       0,     4,     1,     1,     3,     0,     6,     0,     1,     1,
-       3,     0,     4,     0,     4,     1,     3,     1,     1,     1,
-       0,     4,     0,     6,     0,     1,     1,     3,     0,     4,
-       0,     4,     1,     3,     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,
-       0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
-       0,     4,     0,     6,     0,     4,     0,     6,     1,     3,
+       1,     1,     3,     1,     1,     0,     4,     0,     4,     1,
+       0,     4,     3,     0,     6,     0,     1,     1,     3,     0,
+       4,     0,     4,     0,     1,     1,     3,     1,     1,     1,
+       1,     1,     1,     1,     0,     4,     1,     1,     3,     0,
+       6,     0,     1,     1,     3,     0,     4,     0,     4,     1,
+       3,     1,     1,     1,     0,     4,     0,     6,     0,     1,
+       1,     3,     0,     4,     0,     4,     1,     3,     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,     0,     4,     0,     6,     1,     3,     1,     1,     1,
-       1,     1,     1,     1,     3,     0,     4,     3,     3,     3,
-       0,     6,     1,     3,     1,     1,     0,     4,     0,     4,
-       0,     6,     0,     4,     0,     4,     0,     6,     1,     3,
-       1,     0,     6,     1,     3,     0,     4,     1,     3,     1,
-       1,     1,     1,     1,     3,     0,     4,     0,     6,     1,
-       3,     0,     4,     1,     3,     0,     4
+       1,     1,     1,     1,     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,     6,     1,
+       3,     1,     1,     1,     1,     1,     1,     1,     3,     0,
+       4,     3,     3,     3,     0,     6,     1,     3,     1,     1,
+       0,     4,     0,     4,     0,     6,     0,     4,     0,     4,
+       0,     6,     1,     3,     1,     0,     6,     1,     3,     0,
+       4,     1,     3,     1,     1,     1,     1,     1,     3,     0,
+       4,     0,     6,     1,     3,     0,     4,     1,     3,     0,
+       4
   };
 
 
@@ -3363,8 +3383,9 @@ namespace isc { namespace dhcp {
   "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start",
   "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10",
   "$@11", "value", "sub_json", "map2", "$@12", "map_content",
-  "not_empty_map", "list_generic", "$@13", "list2", "$@14", "list_content",
-  "not_empty_list", "unknown_map_entry", "syntax_map", "$@15",
+  "not_empty_map", "list_generic", "$@13", "list_content",
+  "not_empty_list", "list_strings", "$@14", "list_strings_content",
+  "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@15",
   "global_objects", "global_object", "dhcp6_object", "$@16", "sub_dhcp6",
   "$@17", "global_params", "global_param", "preferred_lifetime",
   "valid_lifetime", "renew_timer", "rebind_timer",
@@ -3434,45 +3455,46 @@ namespace isc { namespace dhcp {
      202,   202,   203,   203,   204,   204,   205,   205,   206,   206,
      207,   207,   208,   208,   216,   217,   218,   219,   220,   221,
      222,   225,   230,   230,   242,   243,   246,   250,   257,   257,
-     265,   265,   272,   273,   276,   280,   291,   301,   301,   313,
-     314,   318,   319,   320,   321,   322,   325,   325,   342,   342,
-     350,   351,   356,   357,   358,   359,   360,   361,   362,   363,
-     364,   365,   366,   367,   368,   369,   370,   371,   372,   373,
-     374,   375,   376,   377,   380,   385,   390,   395,   400,   405,
-     405,   415,   415,   423,   423,   433,   433,   443,   443,   453,
-     454,   457,   458,   459,   460,   461,   462,   463,   464,   465,
-     468,   468,   476,   476,   484,   484,   492,   492,   500,   500,
-     508,   513,   518,   523,   523,   533,   534,   537,   538,   541,
-     546,   551,   551,   561,   562,   565,   566,   569,   574,   574,
-     584,   584,   594,   595,   598,   599,   602,   602,   610,   610,
-     618,   619,   620,   623,   624,   627,   627,   635,   635,   643,
-     643,   653,   654,   660,   668,   668,   681,   682,   685,   686,
-     693,   693,   716,   716,   725,   726,   730,   731,   732,   733,
-     734,   735,   736,   737,   738,   739,   740,   741,   742,   743,
-     744,   745,   746,   749,   749,   757,   757,   765,   765,   773,
-     773,   781,   781,   789,   794,   803,   803,   815,   816,   819,
-     820,   825,   825,   836,   836,   846,   847,   850,   851,   854,
-     855,   856,   857,   858,   859,   860,   861,   864,   866,   871,
-     873,   875,   875,   883,   883,   891,   893,   893,   901,   910,
-     910,   922,   923,   928,   929,   934,   934,   945,   945,   956,
-     957,   962,   963,   968,   969,   970,   971,   972,   973,   976,
-     978,   978,   986,   988,   990,   998,   998,  1010,  1011,  1014,
-    1015,  1018,  1018,  1026,  1026,  1034,  1035,  1038,  1039,  1040,
-    1043,  1043,  1054,  1054,  1066,  1067,  1070,  1071,  1074,  1074,
-    1082,  1082,  1090,  1091,  1094,  1095,  1096,  1097,  1098,  1099,
-    1100,  1103,  1103,  1111,  1116,  1116,  1124,  1129,  1137,  1137,
-    1147,  1148,  1151,  1152,  1155,  1155,  1163,  1163,  1171,  1172,
-    1175,  1176,  1180,  1181,  1182,  1183,  1184,  1185,  1186,  1187,
-    1190,  1190,  1200,  1200,  1210,  1210,  1218,  1218,  1226,  1226,
-    1234,  1234,  1247,  1247,  1257,  1257,  1268,  1268,  1278,  1279,
-    1282,  1282,  1290,  1291,  1294,  1295,  1298,  1299,  1300,  1301,
-    1304,  1306,  1306,  1317,  1317,  1327,  1328,  1331,  1332,  1333,
-    1334,  1335,  1336,  1337,  1340,  1345,  1345,  1353,  1358,  1365,
-    1372,  1372,  1382,  1383,  1386,  1387,  1390,  1390,  1398,  1398,
-    1408,  1408,  1420,  1420,  1427,  1427,  1439,  1439,  1452,  1453,
-    1457,  1461,  1461,  1473,  1474,  1478,  1478,  1486,  1487,  1490,
-    1491,  1492,  1493,  1494,  1497,  1501,  1501,  1509,  1509,  1519,
-    1520,  1523,  1523,  1531,  1532,  1535,  1535
+     264,   265,   268,   272,   279,   279,   286,   287,   290,   294,
+     305,   315,   315,   327,   328,   332,   333,   334,   335,   336,
+     339,   339,   356,   356,   364,   365,   370,   371,   372,   373,
+     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,
+     384,   385,   386,   387,   388,   389,   390,   391,   394,   399,
+     404,   409,   414,   419,   419,   429,   429,   437,   437,   447,
+     447,   457,   457,   467,   468,   471,   472,   473,   474,   475,
+     476,   477,   478,   479,   482,   482,   490,   490,   498,   498,
+     506,   506,   514,   514,   522,   527,   532,   537,   537,   547,
+     548,   551,   552,   555,   560,   565,   565,   575,   576,   579,
+     580,   583,   590,   590,   600,   600,   610,   611,   614,   615,
+     618,   618,   626,   626,   634,   635,   636,   639,   640,   643,
+     643,   651,   651,   659,   659,   669,   670,   676,   684,   684,
+     697,   698,   701,   702,   709,   709,   732,   732,   741,   742,
+     746,   747,   748,   749,   750,   751,   752,   753,   754,   755,
+     756,   757,   758,   759,   760,   761,   762,   765,   765,   773,
+     773,   781,   781,   789,   789,   797,   797,   805,   810,   819,
+     819,   831,   832,   835,   836,   841,   841,   852,   852,   862,
+     863,   866,   867,   870,   871,   872,   873,   874,   875,   876,
+     877,   880,   882,   887,   889,   891,   891,   899,   899,   907,
+     909,   909,   917,   926,   926,   938,   939,   944,   945,   950,
+     950,   961,   961,   972,   973,   978,   979,   984,   985,   986,
+     987,   988,   989,   992,   994,   994,  1002,  1004,  1006,  1014,
+    1014,  1026,  1027,  1030,  1031,  1034,  1034,  1042,  1042,  1050,
+    1051,  1054,  1055,  1056,  1059,  1059,  1070,  1070,  1082,  1083,
+    1086,  1087,  1090,  1090,  1098,  1098,  1106,  1107,  1110,  1111,
+    1112,  1113,  1114,  1115,  1116,  1119,  1119,  1127,  1132,  1132,
+    1140,  1145,  1153,  1153,  1163,  1164,  1167,  1168,  1171,  1171,
+    1179,  1179,  1187,  1188,  1191,  1192,  1196,  1197,  1198,  1199,
+    1200,  1201,  1202,  1203,  1206,  1206,  1216,  1216,  1226,  1226,
+    1234,  1234,  1242,  1242,  1250,  1250,  1263,  1263,  1273,  1273,
+    1284,  1284,  1294,  1295,  1298,  1298,  1306,  1307,  1310,  1311,
+    1314,  1315,  1316,  1317,  1320,  1322,  1322,  1333,  1333,  1343,
+    1344,  1347,  1348,  1349,  1350,  1351,  1352,  1353,  1356,  1361,
+    1361,  1369,  1374,  1381,  1388,  1388,  1398,  1399,  1402,  1403,
+    1406,  1406,  1414,  1414,  1424,  1424,  1436,  1436,  1443,  1443,
+    1455,  1455,  1468,  1469,  1473,  1477,  1477,  1489,  1490,  1494,
+    1494,  1502,  1503,  1506,  1507,  1508,  1509,  1510,  1513,  1517,
+    1517,  1525,  1525,  1535,  1536,  1539,  1539,  1547,  1548,  1551,
+    1551
   };
 
   // Print the state stack on the debug stream.
@@ -3507,8 +3529,8 @@ namespace isc { namespace dhcp {
 
 #line 14 "dhcp6_parser.yy" // lalr1.cc:1167
 } } // isc::dhcp
-#line 3511 "dhcp6_parser.cc" // lalr1.cc:1167
-#line 1543 "dhcp6_parser.yy" // lalr1.cc:1168
+#line 3533 "dhcp6_parser.cc" // lalr1.cc:1167
+#line 1559 "dhcp6_parser.yy" // lalr1.cc:1168
 
 
 void
index e316ad03c92fcd9d892e11a3f837d83e90cc30f6..2653ebe498732e0dffc1892e57210a10cb81fe1d 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef YY_PARSER6_DHCP6_PARSER_H_INCLUDED
 # define YY_PARSER6_DHCP6_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "dhcp6_parser.yy" // lalr1.cc:377
+#line 17 "dhcp6_parser.yy" // lalr1.cc:392
 
 #include <string>
 #include <cc/data.h>
@@ -52,7 +52,7 @@ using namespace isc::dhcp;
 using namespace isc::data;
 using namespace std;
 
-#line 56 "dhcp6_parser.h" // lalr1.cc:377
+#line 56 "dhcp6_parser.h" // lalr1.cc:392
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -135,9 +135,9 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined PARSER6_DEBUG */
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:377
+#line 14 "dhcp6_parser.yy" // lalr1.cc:392
 namespace isc { namespace dhcp {
-#line 141 "dhcp6_parser.h" // lalr1.cc:377
+#line 141 "dhcp6_parser.h" // lalr1.cc:392
 
 
 
@@ -1164,8 +1164,8 @@ namespace isc { namespace dhcp {
     enum
     {
       yyeof_ = 0,
-      yylast_ = 630,     ///< Last index in yytable_.
-      yynnts_ = 271,  ///< Number of nonterminal symbols.
+      yylast_ = 638,     ///< Last index in yytable_.
+      yynnts_ = 273,  ///< Number of nonterminal symbols.
       yyfinal_ = 24, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
@@ -2129,9 +2129,9 @@ namespace isc { namespace dhcp {
   }
 
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:377
+#line 14 "dhcp6_parser.yy" // lalr1.cc:392
 } } // isc::dhcp
-#line 2135 "dhcp6_parser.h" // lalr1.cc:377
+#line 2135 "dhcp6_parser.h" // lalr1.cc:392
 
 
 
index d3a460ace7b8768dfe0da38856980be273b76802..2d91cecad0500220d71915c9465ccae5ff004d5a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2017 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
@@ -261,14 +261,6 @@ list_generic: LSQUARE_BRACKET {
     // list parsing complete. Put any sanity checking here
 };
 
-// This one is used in syntax parser.
-list2: LSQUARE_BRACKET {
-    // List parsing about to start
-} list_content RSQUARE_BRACKET {
-    // list parsing complete. Put any sanity checking here
-    //ctx.stack_.pop_back();
-};
-
 list_content: %empty // Empty list
             | not_empty_list
             ;
@@ -283,6 +275,28 @@ not_empty_list: value {
                   }
               ;
 
+// This one is used in syntax parser and is restricted to strings.
+list_strings: LSQUARE_BRACKET {
+    // List parsing about to start
+} list_strings_content RSQUARE_BRACKET {
+    // list parsing complete. Put any sanity checking here
+    //ctx.stack_.pop_back();
+};
+
+list_strings_content: %empty // Empty list
+                    | not_empty_list_strings
+                    ;
+
+not_empty_list_strings: STRING {
+                          ElementPtr s(new StringElement($1, ctx.loc2pos(@1)));
+                          ctx.stack_.back()->add(s);
+                          }
+                      | not_empty_list_strings COMMA STRING {
+                          ElementPtr s(new StringElement($3, ctx.loc2pos(@3)));
+                          ctx.stack_.back()->add(s);
+                          }
+                      ;
+
 // ---- generic JSON parser ends here ----------------------------------
 
 // ---- syntax checking parser starts here -----------------------------
@@ -425,7 +439,7 @@ interface_config_map: INTERFACES {
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
@@ -571,12 +585,14 @@ hw_address_id : HW_ADDRESS {
     ctx.stack_.back()->add(hwaddr);
 };
 
+// list_content below accepts any value when options are by name (string)
+// or by code (number)
 relay_supplied_options: RELAY_SUPPLIED_OPTIONS {
     ElementPtr l(new ListElement(ctx.loc2pos(@1)));
     ctx.stack_.back()->set("relay-supplied-options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON LSQUARE_BRACKET list_content RSQUARE_BRACKET {
     ctx.stack_.pop_back();
     ctx.leave();
 };
@@ -1192,7 +1208,7 @@ ip_addresses: IP_ADDRESSES {
     ctx.stack_.back()->set("ip-addresses", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
@@ -1202,7 +1218,7 @@ prefixes: PREFIXES  {
     ctx.stack_.back()->set("prefixes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
@@ -1236,7 +1252,7 @@ reservation_client_classes: CLIENT_CLASSES {
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
-} COLON list2 {
+} COLON list_strings {
     ctx.stack_.pop_back();
     ctx.leave();
 };
index bea936afdeee3345804bd9296721e9c150570d8d..abdbcbe91f6ea731fdf8a5bffb243d6b79b02a2f 100644 (file)
@@ -722,8 +722,7 @@ DhcpConfigParser* createGlobal6DhcpConfigParser(const std::string& config_id,
     // control-socket has been converted to SimpleParser.
     } else if (config_id.compare("expired-leases-processing") == 0) {
         parser = new ExpirationConfigParser();
-    } else if (config_id.compare("client-classes") == 0) {
-        parser = new ClientClassDefListParser(config_id, globalContext());
+    // client-classes has been converted to SimpleParser.
     } else if (config_id.compare("server-id") == 0) {
         parser = new DUIDConfigParser();
     // host-reservation-identifiers have been converted to SimpleParser already.
@@ -845,7 +844,6 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) {
     ParserPtr subnet_parser;
     ParserPtr iface_parser;
     ParserPtr leases_parser;
-    ParserPtr client_classes_parser;
 
     // Some of the parsers alter state of the system that can't easily
     // be undone. (Or alter it in a way such that undoing the change
@@ -925,6 +923,12 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) {
                 continue;
             }
 
+           if (config_pair.first =="client-classes") {
+               ClientClassDefListParser parser;
+               parser.parse(config_pair.second, AF_INET6);
+               continue;
+           }
+
             ParserPtr parser(createGlobal6DhcpConfigParser(config_pair.first,
                                                            config_pair.second));
             LOG_DEBUG(dhcp6_logger, DBG_DHCP6_DETAIL, DHCP6_PARSER_CREATED)
@@ -945,8 +949,6 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) {
                 // can be run here before other parsers.
                 parser->build(config_pair.second);
                 iface_parser = parser;
-            } else if (config_pair.first == "client-classes") {
-                client_classes_parser = parser;
             } else {
                 // Those parsers should be started before other
                 // parsers so we can call build straight away.
@@ -959,15 +961,6 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) {
             }
         }
 
-        // The class definitions parser is the next one to be run.
-        std::map<std::string, ConstElementPtr>::const_iterator cc_config =
-            values_map.find("client-classes");
-        if (cc_config != values_map.end()) {
-            config_pair.first = "client-classes";
-            client_classes_parser->build(cc_config->second);
-            client_classes_parser->commit();
-        }
-
         // The subnet parser is the next one to be run.
         std::map<std::string, ConstElementPtr>::const_iterator subnet_config =
             values_map.find("subnet6");
index 679f12b922b2e7ddc3e91538cc4b172f56fc5062..0891aee1ad73383d4848de45c82237e27e313adf 100644 (file)
@@ -1,12 +1,13 @@
-// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2017 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
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-#include <cc/data.h>
+#include <config.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/client_class_def.h>
+#include <dhcpsrv/parsers/dhcp_parsers.h>
 #include <dhcpsrv/parsers/client_class_def_parser.h>
 #include <eval/eval_context.h>
 #include <asiolink/io_address.h>
@@ -18,7 +19,7 @@ using namespace isc::data;
 using namespace isc::asiolink;
 using namespace std;
 
-/// @file client_class_def.cc
+/// @file client_class_def_parser.cc
 ///
 /// @brief Method implementations for client class definition parsing
 
@@ -27,14 +28,12 @@ namespace dhcp {
 
 // ********************** ExpressionParser ****************************
 
-ExpressionParser::ExpressionParser(const std::string&,
-    ExpressionPtr& expression, ParserContextPtr global_context)
-    : local_expression_(ExpressionPtr()), expression_(expression),
-      global_context_(global_context) {
+ExpressionParser::ExpressionParser(ExpressionPtr& expression)
+    : local_expression_(ExpressionPtr()), expression_(expression) {
 }
 
 void
-ExpressionParser::build(ConstElementPtr expression_cfg) {
+ExpressionParser::parse(ConstElementPtr expression_cfg, uint16_t family) {
     if (expression_cfg->getType() != Element::string) {
         isc_throw(DhcpConfigError, "expression ["
             << expression_cfg->str() << "] must be a string, at ("
@@ -46,7 +45,7 @@ ExpressionParser::build(ConstElementPtr expression_cfg) {
     std::string value;
     expression_cfg->getValue(value);
     try {
-        EvalContext eval_ctx(global_context_->universe_);
+        EvalContext eval_ctx(family == AF_INET ? Option::V4 : Option::V6);
         eval_ctx.parseString(value);
         local_expression_.reset(new Expression());
         *local_expression_ = eval_ctx.expression;
@@ -57,76 +56,63 @@ ExpressionParser::build(ConstElementPtr expression_cfg) {
                   <<  "] error: " << ex.what() << " at ("
                   <<  expression_cfg->getPosition() << ")");
     }
-}
 
-void
-ExpressionParser::commit() {
+    // Success so commit.
     expression_ = local_expression_;
 }
 
 // ********************** ClientClassDefParser ****************************
 
-ClientClassDefParser::ClientClassDefParser(const std::string&,
-    ClientClassDictionaryPtr& class_dictionary, ParserContextPtr global_context)
-    : string_values_(new StringStorage()),
-      match_expr_(ExpressionPtr()),
+ClientClassDefParser::ClientClassDefParser(ClientClassDictionaryPtr& class_dictionary)
+    : match_expr_(ExpressionPtr()),
       options_(new CfgOption()),
-      class_dictionary_(class_dictionary),
-      global_context_(global_context) {
+      class_dictionary_(class_dictionary) {
 }
 
 void
-ClientClassDefParser::build(ConstElementPtr class_def_cfg) {
-
-    // Parse the elements that make up the option definition.
-    BOOST_FOREACH(ConfigPair param, class_def_cfg->mapValue()) {
-        std::string entry(param.first);
-        ParserPtr parser;
-        if (entry == "name") {
-            StringParserPtr str_parser(new StringParser(entry, string_values_));
-            parser = str_parser;
-        } else if (entry == "test") {
-            ExpressionParserPtr exp_parser(new ExpressionParser(entry,
-                                                                match_expr_,
-                                                                global_context_));
-            parser = exp_parser;
-        } else if (entry == "option-data") {
-
-            uint16_t family = (global_context_->universe_ == Option::V4 ?
-                                                             AF_INET : AF_INET6);
-
-            OptionDataListParser opts_parser(family);
-            opts_parser.parse(options_, param.second);
-
-            // OptionDataListParser is converted to SimpleParser already,
-            // no need to go through build/commit phases.
-            continue;
-        } else if (entry == "next-server") {
-            StringParserPtr str_parser(new StringParser(entry, string_values_));
-            parser = str_parser;
-        } else if (entry == "server-hostname") {
-            StringParserPtr str_parser(new StringParser(entry, string_values_));
-            parser = str_parser;
-
-        } else if (entry == "boot-file-name") {
-            StringParserPtr str_parser(new StringParser(entry, string_values_));
-            parser = str_parser;
-        } else {
-            isc_throw(DhcpConfigError, "invalid parameter '" << entry
-                      << "' (" << param.second->getPosition() << ")");
-        }
+ClientClassDefParser::parse(ConstElementPtr class_def_cfg, uint16_t family) {
 
-        parser->build(param.second);
-        parser->commit();
-    }
-
-    std::string name;
     try {
-        name = string_values_->getParam("name");
+        std::string name;
+        std::string next_server_txt = "0.0.0.0";
+        std::string sname;
+        std::string filename;
+
+        // Parse the elements that make up the client class definition.
+        BOOST_FOREACH(ConfigPair param, class_def_cfg->mapValue()) {
+            std::string entry(param.first);
+            ConstElementPtr value(param.second);
+
+            if (entry == "name") {
+                name = value->stringValue();
+
+            } else if (entry == "test") {
+                ExpressionParser parser(match_expr_);
+                parser.parse(value, family);
+                
+            } else if (entry == "option-data") {
+                OptionDataListParser opts_parser(family);
+                opts_parser.parse(options_, value);
+
+            } else if (entry == "next-server") {
+                next_server_txt = value->stringValue();
+
+            } else if (entry == "server-hostname") {
+                sname = value->stringValue();
+
+            } else if (entry == "boot-file-name") {
+                filename = value->stringValue();
+
+            } else {
+                isc_throw(DhcpConfigError, "invalid parameter '" << entry
+                          << "' (" << value->getPosition() << ")");
+            }
+        }
+
+        // Make name mandatory?
 
         // Let's parse the next-server field
         IOAddress next_server("0.0.0.0");
-        string next_server_txt = string_values_->getOptionalParam("next-server", "0.0.0.0");
         try {
             next_server = IOAddress(next_server_txt);
         } catch (const IOError& ex) {
@@ -144,22 +130,21 @@ ClientClassDefParser::build(ConstElementPtr class_def_cfg) {
                       << next_server_txt << "', must not be a broadcast");
         }
 
-        // Let's try to parse sname
-        string sname = string_values_->getOptionalParam("server-hostname", "");
+        // Let's try to parse server-hostname
         if (sname.length() >= Pkt4::MAX_SNAME_LEN) {
             isc_throw(DhcpConfigError, "server-hostname must be at most "
                       << Pkt4::MAX_SNAME_LEN - 1 << " bytes long, it is "
                       << sname.length());
         }
 
-        string filename = string_values_->getOptionalParam("boot-file-name", "");
+        // Let's try to parse boot-file-name
         if (filename.length() > Pkt4::MAX_FILE_LEN) {
             isc_throw(DhcpConfigError, "boot-file-name must be at most "
                       << Pkt4::MAX_FILE_LEN - 1 << " bytes long, it is "
                       << filename.length());
         }
 
-        // an OptionCollectionPtr
+        // Add the client class definition
         class_dictionary_->addClass(name, match_expr_, options_, next_server,
                                     sname, filename);
     } catch (const std::exception& ex) {
@@ -170,33 +155,19 @@ ClientClassDefParser::build(ConstElementPtr class_def_cfg) {
 
 // ****************** ClientClassDefListParser ************************
 
-ClientClassDefListParser::ClientClassDefListParser(const std::string&,
-                                                   ParserContextPtr
-                                                   global_context)
-    : local_dictionary_(new ClientClassDictionary()),
-      global_context_(global_context) {
+ClientClassDefListParser::ClientClassDefListParser()
+    : local_dictionary_(new ClientClassDictionary()) {
 }
 
 void
-ClientClassDefListParser::build(ConstElementPtr client_class_def_list) {
-    if (!client_class_def_list) {
-        isc_throw(DhcpConfigError, "parser error: a pointer to a list of"
-                  << " client class definitions is NULL ("
-                  << client_class_def_list->getPosition() << ")");
-    }
-
+ClientClassDefListParser::parse(ConstElementPtr client_class_def_list,
+                                uint16_t family) {
     BOOST_FOREACH(ConstElementPtr client_class_def,
                   client_class_def_list->listValue()) {
-        boost::shared_ptr<ClientClassDefParser>
-            parser(new ClientClassDefParser("client-class-def",
-                                            local_dictionary_,
-                                            global_context_));
-        parser->build(client_class_def);
+        ClientClassDefParser parser(local_dictionary_);
+        parser.parse(client_class_def, family);
     }
-}
-
-void
-ClientClassDefListParser::commit() {
+    // Success so commit
     CfgMgr::instance().getStagingCfg()->setClientClassDictionary(local_dictionary_);
 }
 
index bb63aeaf4bb7900ea73151436360956ecb52d3c3..47643517e91953e0c27f00061c34f78046decc98 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015, 2017 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
@@ -7,10 +7,11 @@
 #ifndef CLIENT_CLASS_DEF_PARSER_H
 #define CLIENT_CLASS_DEF_PARSER_H
 
+#include <cc/data.h>
+#include <cc/simple_parser.h>
 #include <dhcpsrv/client_class_def.h>
-#include <dhcpsrv/parsers/dhcp_parsers.h>
 
-/// @file client_class_def.h
+/// @file client_class_def_parser.h
 ///
 /// @brief Parsers for client class definitions
 ///
 /// There parsers defined are:
 ///
 /// ClientClassDefListParser  - creates a ClientClassDictionary from a list
-/// of element maps, where each map contains the entries that specifiy a
+/// of element maps, where each map contains the entries that specify a
 /// single class.  The names of the classes in the are expected to be
 /// unique.  Attempting to define a duplicate class will result in an
-/// DhcpConfigError throw.  Invoking @c commit() method causes the dictionary
-/// to be stored by the CfgMgr.
+/// DhcpConfigError throw.  At the end the dictionary is stored by the CfgMgr.
 ///
 /// ClientClassDefParser - creates a ClientClassDefinition from an element
 /// map. The elements are as follows:
@@ -37,7 +37,7 @@
 /// membership in the class. This is passed into the eval parser.
 ///
 /// -# "option-data" - a list which defines the options that should be
-/// assigned to memebers of the class.  This element is optional and parsed
+/// assigned to remembers of the class.  This element is optional and parsed
 /// using the @ref isc::dhcp::OptionDataListParser.
 ///
 /// ExpressionParser  - creates an eval::Expression from a string element,
@@ -51,27 +51,20 @@ namespace dhcp {
 /// This parser creates an instance of an Expression from a string.  The
 /// string is passed to the Eval Parser and the resultant Expression is
 /// stored into the ExpressionPtr reference passed into the constructor.
-class ExpressionParser : public DhcpConfigParser {
+class ExpressionParser : public isc::data::SimpleParser {
 public:
     /// @brief Constructor.
     ///
-    /// @param dummy first argument is ignored, all Parser constructors
-    /// accept string as first argument.
     /// @param expression variable in which to store the new expression
-    /// @param global_context is a pointer to the global context which
-    /// stores global scope parameters, options, option defintions.
-    ExpressionParser(const std::string& dummy, ExpressionPtr& expression,
-                     ParserContextPtr global_context);
+    ExpressionParser(ExpressionPtr& expression);
 
     /// @brief Parses an expression configuration element into an Expression
     ///
     /// @param expression_cfg the configuration entry to be parsed.
+    /// @param family the address family of the expression.
     ///
     /// @throw DhcpConfigError if parsing was unsuccessful.
-    void build(isc::data::ConstElementPtr expression_cfg);
-
-    /// @brief Stores the parsed expression to the supplied storage.
-    void commit();
+    void parse(isc::data::ConstElementPtr expression_cfg, uint16_t family);
 
 private:
     /// @brief Local storage for the parsed expression
@@ -79,47 +72,30 @@ private:
 
     /// @brief Storage into which the parsed expression should be committed
     ExpressionPtr& expression_;
-
-    /// @brief Parsing context which contains global values, options and option
-    /// definitions.
-    ParserContextPtr global_context_;
 };
 
-typedef boost::shared_ptr<ExpressionParser> ExpressionParserPtr;
-
 /// @brief Parser for a single client class definition.
 ///
 /// This parser creates an instance of a client class definition.
-class ClientClassDefParser : public DhcpConfigParser {
+class ClientClassDefParser : public isc::data::SimpleParser {
 public:
     /// @brief Constructor.
     ///
-    /// @param dummy first argument is ignored, all Parser constructors
-    /// accept string as first argument.
     /// @param class_dictionary dictionary into which the class should be added
-    /// @param global_context is a pointer to the global context which
-    /// stores global scope parameters, options, option defintions.
-    ClientClassDefParser(const std::string& dummy,
-                         ClientClassDictionaryPtr& class_dictionary,
-                         ParserContextPtr global_context);
+    ClientClassDefParser(ClientClassDictionaryPtr& class_dictionary);
 
     /// @brief Parses an entry that describes single client class definition.
     ///
-    /// Attempts to add the new class direclty into the given dictionary.
+    /// Attempts to add the new class directly into the given dictionary.
     /// This done here to detect duplicate classes prior to commit().
     /// @param client_class_def a configuration entry to be parsed.
+    /// @param family the address family of the client class.
     ///
     /// @throw DhcpConfigError if parsing was unsuccessful.
-    void build(isc::data::ConstElementPtr client_class_def);
-
-    /// @brief Does nothing.
-    void commit() {};
+    void parse(isc::data::ConstElementPtr client_class_def, uint16_t family);
 
 private:
 
-    /// @brief Storage for class string values.
-    StringStoragePtr string_values_;
-
     /// @brief Storage for the class match expression
     ExpressionPtr match_expr_;
 
@@ -127,11 +103,7 @@ private:
     CfgOptionPtr options_;
 
     /// @brief Dictionary to which the new class should be added
-    ClientClassDictionaryPtr class_dictionary_;
-
-    /// @brief Parsing context which contains global values, options and option
-    /// definitions.
-    ParserContextPtr global_context_;
+    ClientClassDictionaryPtr& class_dictionary_;
 };
 
 /// @brief Defines a pointer to a ClientClassDefParser
@@ -141,44 +113,33 @@ typedef boost::shared_ptr<ClientClassDefParser> ClientClassDefParserPtr;
 ///
 /// This parser iterates over all configuration entries that define
 /// client classes and creates ClientClassDef instances for each.
-/// If the parsing done in build() is successful, the collection of
+/// When the parsing successfully completes, the collection of
 /// created definitions is given to the CfgMgr.
-class ClientClassDefListParser : public DhcpConfigParser {
+class ClientClassDefListParser : public isc::data::SimpleParser {
 public:
+
     /// @brief Constructor.
-    ///
-    /// @param dummy first argument is ignored, all Parser constructors
-    /// accept string as first argument.
-    /// @param global_context is a pointer to the global context which
-    /// stores global scope parameters, options, option defintions.
-    ClientClassDefListParser(const std::string& dummy,
-                        ParserContextPtr global_context);
+    ClientClassDefListParser();
 
     /// @brief Parse configuration entries.
     ///
     /// This function parses configuration entries, creates instances
     /// of client class definitions and tries to adds them to the a
-    /// local dictionary.
+    /// local dictionary. At the end class definitions are committed
+    /// to CfgMgr's global storage.
     ///
     /// @param class_def_list pointer to an element that holds entries
     /// for client class definitions.
+    /// @param family the address family of the client class definitions.
     /// @throw DhcpConfigError if configuration parsing fails.
-    void build(isc::data::ConstElementPtr class_def_list);
-
-    /// @brief Commits class definitions to CfgMgr's global storage.
-    void commit();
+    void parse(isc::data::ConstElementPtr class_def_list, uint16_t family);
 
     /// @brief Local class dictionary to store classes as they are being parsed
+    ///
+    /// Left public for easier unit testing.
     ClientClassDictionaryPtr local_dictionary_;
-
-    /// Parsing context which contains global values, options and option
-    /// definitions.
-    ParserContextPtr global_context_;
 };
 
-/// @brief Defines a pointer to a ClientClassDefListParser
-typedef boost::shared_ptr<ClientClassDefListParser> ClientClassDefListParserPtr;
-
 } // end of namespace isc::dhcp
 } // end of namespace isc
 
index bdfcae94fe966ee74e9ed6e19eb768fd405ca492..5a692892e4ef4e804c720b3117a93d3a3d3c4f27 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2017 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
@@ -12,6 +12,7 @@
 #include <dhcp/option_string.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/parsers/client_class_def_parser.h>
+#include <dhcpsrv/parsers/dhcp_parsers.h>
 #include <asiolink/io_address.h>
 #include <eval/evaluate.h>
 #include <gtest/gtest.h>
@@ -39,35 +40,30 @@ protected:
     /// produces an Expression which can be evaluated against a v4 or v6
     /// packet.
     ///
-    /// @param universe V4 or V6.
+    /// @param family AF_INET or AF_INET6
     /// @param expression Textual representation of the expression to be
     /// evaluated.
     /// @param option_string String data to be placed in the hostname
     /// option, being placed in the packet used for evaluation.
     /// @tparam Type of the packet: @c Pkt4 or @c Pkt6.
     template<typename PktType>
-    void testValidExpression(const Option::Universe& universe,
+    void testValidExpression(uint16_t family,
                              const std::string& expression,
                              const std::string& option_string) {
-        ParserContextPtr context(new ParserContext(universe));
-        ExpressionParserPtr parser;
         ExpressionPtr parsed_expr;
+        ExpressionParser parser(parsed_expr);
 
         // Turn config into elements.  This may emit exceptions.
         ElementPtr config_element = Element::fromJSON(expression);
 
-        // Create the parser.
-        ASSERT_NO_THROW(parser.reset(new ExpressionParser("", parsed_expr,
-                                                      context)));
-        // Expression should parse and commit.
-        ASSERT_NO_THROW(parser->build(config_element));
-        ASSERT_NO_THROW(parser->commit());
+        // Expression should parse.
+        ASSERT_NO_THROW(parser.parse(config_element, family));
 
         // Parsed expression should exist.
         ASSERT_TRUE(parsed_expr);
 
         // Build a packet that will fail evaluation.
-        boost::shared_ptr<PktType> pkt(new PktType(universe == Option::V4 ?
+        boost::shared_ptr<PktType> pkt(new PktType(family == AF_INET ?
                                                    DHCPDISCOVER : DHCPV6_SOLICIT,
                                                    123));
         EXPECT_FALSE(evaluate(*parsed_expr, *pkt));
@@ -75,7 +71,8 @@ protected:
         // Now add the option so it will pass. Use a standard option carrying a
         // single string value, i.e. hostname for DHCPv4 and bootfile url for
         // DHCPv6.
-        OptionPtr opt(new OptionString(universe, universe == Option::V4 ?
+        Option::Universe universe(family == AF_INET ? Option::V4 : Option::V6);
+        OptionPtr opt(new OptionString(universe, family == AF_INET ?
                                        DHO_HOST_NAME : D6O_BOOTFILE_URL,
                                        option_string));
         pkt->addOption(opt);
@@ -93,25 +90,23 @@ protected:
     ///
     /// @param config - JSON string containing the client class configuration
     /// to parse.
-    /// @param universe - the universe in which the parsing context should
+    /// @param family - the address family in which the parsing should
     /// occur.
     /// @return Returns a pointer to class instance created, or NULL if
     /// for some unforeseen reason it wasn't created in the local dictionary
     /// @throw indirectly, exceptions convertring the JSON text to elements,
     /// or by the parsing itself are not caught
     ClientClassDefPtr parseClientClassDef(const std::string& config,
-                                          Option::Universe universe) {
+                                          uint16_t family) {
         // Create local dicitonary to which the parser add the class.
         ClientClassDictionaryPtr dictionary(new ClientClassDictionary());
-        // Create the "global" context for the parser.
-        ParserContextPtr context(new ParserContext(universe));
 
         // Turn config into elements.  This may emit exceptions.
         ElementPtr config_element = Element::fromJSON(config);
 
         // Parse the configuration. This may emit exceptions.
-        ClientClassDefParser parser("", dictionary, context);
-        parser.build(config_element);
+        ClientClassDefParser parser(dictionary);
+        parser.parse(config_element, family);
 
         // If we didn't throw, then return the first and only class
         ClientClassDefMapPtr classes = dictionary->getClasses();
@@ -136,26 +131,20 @@ protected:
     /// ClientClassDictionary.
     ///
     /// @param config - JSON string containing the list of definitions to parse.
-    /// @param universe - the universe in which the parsing context should
+    /// @param family - the address family in which the parsing should
     /// occur.
     /// @return Returns a pointer to class dictionary created
     /// @throw indirectly, execptions convertring the JSON text to elements,
     /// or by the parsing itself are not caught
     ClientClassDictionaryPtr parseClientClassDefList(const std::string& config,
-                                                     Option::Universe universe)
+                                                     uint16_t family)
     {
-        // Create the "global" context for the parser.
-        ParserContextPtr context(new ParserContext(universe));
-
         // Turn config into elements.  This may emit exceptions.
         ElementPtr config_element = Element::fromJSON(config);
 
         // Parse the configuration. This may emit exceptions.
-        ClientClassDefListParser parser("", context);
-        parser.build(config_element);
-
-        // Commit should push it to CfgMgr staging
-        parser.commit();
+        ClientClassDefListParser parser;
+        parser.parse(config_element, family);
 
         // Return the parser's local dicationary
         return (parser.local_dictionary_);
@@ -165,13 +154,14 @@ protected:
 // Verifies that given a valid expression, the ExpressionParser
 // produces an Expression which can be evaluated against a v4 packet.
 TEST_F(ExpressionParserTest, validExpression4) {
-    testValidExpression<Pkt4>(Option::V4, "\"option[12].text == 'hundred4'\"",
+    testValidExpression<Pkt4>(AF_INET,
+                              "\"option[12].text == 'hundred4'\"",
                               "hundred4");
 }
 
 // Verifies that the option name can be used in the evaluated expression.
 TEST_F(ExpressionParserTest, validExpressionWithOptionName4) {
-    testValidExpression<Pkt4>(Option::V4,
+    testValidExpression<Pkt4>(AF_INET,
                               "\"option[host-name].text == 'hundred4'\"",
                               "hundred4");
 }
@@ -180,14 +170,15 @@ TEST_F(ExpressionParserTest, validExpressionWithOptionName4) {
 // ExpressionParser produces an Expression which can be evaluated against
 // a v4 packet.
 TEST_F(ExpressionParserTest, validExpressionWithHex4) {
-    testValidExpression<Pkt4>(Option::V4, "\"option[12].hex == 0x68756E6472656434\"",
+    testValidExpression<Pkt4>(AF_INET,
+                              "\"option[12].hex == 0x68756E6472656434\"",
                               "hundred4");
 }
 
 // Verifies that the option name can be used together with .hex operator in
 // the evaluated expression.
 TEST_F(ExpressionParserTest, validExpressionWithOptionNameAndHex4) {
-    testValidExpression<Pkt6>(Option::V4,
+    testValidExpression<Pkt6>(AF_INET,
                               "\"option[host-name].text == 0x68756E6472656434\"",
                               "hundred4");
 }
@@ -195,13 +186,14 @@ TEST_F(ExpressionParserTest, validExpressionWithOptionNameAndHex4) {
 // Verifies that given a valid expression, the ExpressionParser
 // produces an Expression which can be evaluated against a v6 packet.
 TEST_F(ExpressionParserTest, validExpression6) {
-    testValidExpression<Pkt6>(Option::V6, "\"option[59].text == 'hundred6'\"",
+    testValidExpression<Pkt6>(AF_INET6,
+                              "\"option[59].text == 'hundred6'\"",
                               "hundred6");
 }
 
 // Verifies that the option name can be used in the evaluated expression.
 TEST_F(ExpressionParserTest, validExpressionWithOptionName6) {
-    testValidExpression<Pkt6>(Option::V6,
+    testValidExpression<Pkt6>(AF_INET6,
                               "\"option[bootfile-url].text == 'hundred6'\"",
                               "hundred6");
 }
@@ -210,33 +202,31 @@ TEST_F(ExpressionParserTest, validExpressionWithOptionName6) {
 // ExpressionParser produces an Expression which can be evaluated against
 // a v6 packet.
 TEST_F(ExpressionParserTest, validExpressionWithHex6) {
-    testValidExpression<Pkt6>(Option::V6, "\"option[59].hex == 0x68756E6472656436\"",
+    testValidExpression<Pkt6>(AF_INET6,
+                              "\"option[59].hex == 0x68756E6472656436\"",
                               "hundred6");
 }
 
 // Verifies that the option name can be used together with .hex operator in
 // the evaluated expression.
 TEST_F(ExpressionParserTest, validExpressionWithOptionNameAndHex6) {
-    testValidExpression<Pkt6>(Option::V6,
+    testValidExpression<Pkt6>(AF_INET6,
                               "\"option[bootfile-url].text == 0x68756E6472656436\"",
                               "hundred6");
 }
 
 // Verifies that an the ExpressionParser only accepts StringElements.
 TEST_F(ExpressionParserTest, invalidExpressionElement) {
-    ParserContextPtr context(new ParserContext(Option::V4));
-    ExpressionParserPtr parser;
-    ExpressionPtr parsed_expr;
-
     // This will create an integer element should fail.
     std::string cfg_txt = "777";
     ElementPtr config_element = Element::fromJSON(cfg_txt);
 
     // Create the parser.
-    ASSERT_NO_THROW(parser.reset(new ExpressionParser("", parsed_expr,
-                                                      context)));
-    // Expressionn build() should fail.
-    ASSERT_THROW(parser->build(config_element), DhcpConfigError);
+    ExpressionPtr parsed_expr;
+    ExpressionParser parser(parsed_expr);
+
+    // Expression parsing should fail.
+    ASSERT_THROW(parser.parse(config_element, AF_INET), DhcpConfigError);
 }
 
 // Verifies that given an invalid expression with a syntax error,
@@ -245,19 +235,16 @@ TEST_F(ExpressionParserTest, invalidExpressionElement) {
 // It is simply to ensure that if the parser fails, it does so
 // Properly.
 TEST_F(ExpressionParserTest, expressionSyntaxError) {
-    ParserContextPtr context(new ParserContext(Option::V4));
-    ExpressionParserPtr parser;
-    ExpressionPtr parsed_expr;
-
     // Turn config into elements.
     std::string cfg_txt = "\"option 'bogus'\"";
     ElementPtr config_element = Element::fromJSON(cfg_txt);
 
     // Create the parser.
-    ASSERT_NO_THROW(parser.reset(new ExpressionParser("", parsed_expr,
-                                                      context)));
-    // Expressionn build() should fail.
-    ASSERT_THROW(parser->build(config_element), DhcpConfigError);
+    ExpressionPtr parsed_expr;
+    ExpressionParser parser(parsed_expr);
+
+    // Expression parsing should fail.
+    ASSERT_THROW(parser.parse(config_element, AF_INET), DhcpConfigError);
 }
 
 // Verifies you can create a class with only a name
@@ -270,7 +257,7 @@ TEST_F(ClientClassDefParserTest, nameOnlyValid) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -301,7 +288,7 @@ TEST_F(ClientClassDefParserTest, nameAndExpressionClass) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -350,7 +337,7 @@ TEST_F(ClientClassDefParserTest, nameAndOptionsClass) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -386,7 +373,7 @@ TEST_F(ClientClassDefParserTest, basicValidClass) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -429,7 +416,7 @@ TEST_F(ClientClassDefParserTest, noClassName) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, Option::V4),
+    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -452,7 +439,7 @@ TEST_F(ClientClassDefParserTest, blankClassName) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, Option::V4),
+    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -466,7 +453,7 @@ TEST_F(ClientClassDefParserTest, unknownElement) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, Option::V4),
+    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -479,7 +466,7 @@ TEST_F(ClientClassDefParserTest, invalidExpression) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, Option::V4),
+    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -494,7 +481,7 @@ TEST_F(ClientClassDefParserTest, invalidOptionData) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, Option::V4),
+    ASSERT_THROW(cclass = parseClientClassDef(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -516,7 +503,7 @@ TEST_F(ClientClassDefListParserTest, simpleValidList) {
 
     // Parsing the list should succeed.
     ClientClassDictionaryPtr dictionary;
-    ASSERT_NO_THROW(dictionary = parseClientClassDefList(cfg_text, Option::V4));
+    ASSERT_NO_THROW(dictionary = parseClientClassDefList(cfg_text, AF_INET));
     ASSERT_TRUE(dictionary);
 
     // We should have three classes in the dictionary.
@@ -565,7 +552,7 @@ TEST_F(ClientClassDefListParserTest, duplicateClass) {
         "] \n";
 
     ClientClassDictionaryPtr dictionary;
-    ASSERT_THROW(dictionary = parseClientClassDefList(cfg_text, Option::V4),
+    ASSERT_THROW(dictionary = parseClientClassDefList(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -581,7 +568,7 @@ TEST_F(ClientClassDefListParserTest, invalidClass) {
         "] \n";
 
     ClientClassDictionaryPtr dictionary;
-    ASSERT_THROW(dictionary = parseClientClassDefList(cfg_text, Option::V4),
+    ASSERT_THROW(dictionary = parseClientClassDefList(cfg_text, AF_INET),
                  DhcpConfigError);
 }
 
@@ -601,7 +588,7 @@ TEST_F(ClientClassDefParserTest, noFixedFields) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -629,7 +616,7 @@ TEST_F(ClientClassDefParserTest, nextServer) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -666,8 +653,8 @@ TEST_F(ClientClassDefParserTest, nextServerBogus) {
         "      ] \n"
         "} \n";
 
-    EXPECT_THROW(parseClientClassDef(bogus_v6, Option::V4), DhcpConfigError);
-    EXPECT_THROW(parseClientClassDef(bogus_junk, Option::V4), DhcpConfigError);
+    EXPECT_THROW(parseClientClassDef(bogus_v6, AF_INET), DhcpConfigError);
+    EXPECT_THROW(parseClientClassDef(bogus_junk, AF_INET), DhcpConfigError);
 }
 
 // Test verifies that it is possible to define server-hostname field and it
@@ -687,7 +674,7 @@ TEST_F(ClientClassDefParserTest, serverName) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -714,7 +701,7 @@ TEST_F(ClientClassDefParserTest, serverNameInvalid) {
         "      ] \n"
         "} \n";
 
-    EXPECT_THROW(parseClientClassDef(cfg_too_long, Option::V4), DhcpConfigError);
+    EXPECT_THROW(parseClientClassDef(cfg_too_long, AF_INET), DhcpConfigError);
 }
 
 
@@ -735,7 +722,7 @@ TEST_F(ClientClassDefParserTest, filename) {
         "} \n";
 
     ClientClassDefPtr cclass;
-    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, Option::V4));
+    ASSERT_NO_THROW(cclass = parseClientClassDef(cfg_text, AF_INET));
 
     // We should find our class.
     ASSERT_TRUE(cclass);
@@ -767,7 +754,7 @@ TEST_F(ClientClassDefParserTest, filenameBogus) {
         "      ] \n"
         "} \n";
 
-    EXPECT_THROW(parseClientClassDef(cfg_too_long, Option::V4), DhcpConfigError);
+    EXPECT_THROW(parseClientClassDef(cfg_too_long, AF_INET), DhcpConfigError);
 }