]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[master] Merge branch 'trac5350'
authorTomek Mrugalski <tomasz@isc.org>
Tue, 5 Sep 2017 10:55:56 +0000 (12:55 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Tue, 5 Sep 2017 10:55:56 +0000 (12:55 +0200)
1  2 
src/bin/dhcp4/dhcp4_lexer.cc
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.cc
src/bin/dhcp4/dhcp4_parser.h
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp6/dhcp6_lexer.cc
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_parser.cc
src/bin/dhcp6/dhcp6_parser.h
src/bin/dhcp6/dhcp6_parser.yy

index 020b7b833b9b3ca7a4d25d56c27ad7b5da900b0a,9bb3d658a88f458e359a84046119d6775d7dd067..7851598f9d3024bc6a167c317c259da477513f42
@@@ -3774,27 -3550,27 +3554,27 @@@ YY_RULE_SETU
  case 137:
  /* rule 137 can match eol */
  YY_RULE_SETUP
 -#line 1449 "dhcp4_lexer.ll"
 +#line 1453 "dhcp4_lexer.ll"
  {
      /* Bad string with a forbidden control character inside */
-     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
+     driver.error(driver.loc_, "Invalid control in " + std::string(parser4_text));
  }
        YY_BREAK
  case 138:
  /* rule 138 can match eol */
  YY_RULE_SETUP
 -#line 1454 "dhcp4_lexer.ll"
 +#line 1458 "dhcp4_lexer.ll"
  {
      /* Bad string with a bad escape inside */
-     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
+     driver.error(driver.loc_, "Bad escape in " + std::string(parser4_text));
  }
        YY_BREAK
  case 139:
  YY_RULE_SETUP
 -#line 1459 "dhcp4_lexer.ll"
 +#line 1463 "dhcp4_lexer.ll"
  {
      /* Bad string with an open escape at the end */
-     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
+     driver.error(driver.loc_, "Overflow escape in " + std::string(parser4_text));
  }
        YY_BREAK
  case 140:
@@@ -3829,10 -3605,10 +3609,10 @@@ YY_RULE_SETU
        YY_BREAK
  case 146:
  YY_RULE_SETUP
 -#line 1471 "dhcp4_lexer.ll"
 +#line 1475 "dhcp4_lexer.ll"
  {
      /* An integer was found. */
-     std::string tmp(yytext);
+     std::string tmp(parser4_text);
      int64_t integer = 0;
      try {
          /* In substring we want to use negative values (e.g. -1).
        YY_BREAK
  case 147:
  YY_RULE_SETUP
 -#line 1489 "dhcp4_lexer.ll"
 +#line 1493 "dhcp4_lexer.ll"
  {
      /* A floating point was found. */
-     std::string tmp(yytext);
+     std::string tmp(parser4_text);
      double fp = 0.0;
      try {
          fp = boost::lexical_cast<double>(tmp);
        YY_BREAK
  case 148:
  YY_RULE_SETUP
 -#line 1502 "dhcp4_lexer.ll"
 +#line 1506 "dhcp4_lexer.ll"
  {
-     string tmp(yytext);
+     string tmp(parser4_text);
      return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_);
  }
        YY_BREAK
@@@ -3896,11 -3672,11 +3676,11 @@@ driver.error (driver.loc_, "JSON null r
        YY_BREAK
  case 153:
  YY_RULE_SETUP
- #line 1521 "dhcp4_lexer.ll"
- driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
+ #line 1517 "dhcp4_lexer.ll"
+ driver.error (driver.loc_, "Invalid character: " + std::string(parser4_text));
        YY_BREAK
  case YY_STATE_EOF(INITIAL):
 -#line 1519 "dhcp4_lexer.ll"
 +#line 1523 "dhcp4_lexer.ll"
  {
      if (driver.states_.empty()) {
          return isc::dhcp::Dhcp4Parser::make_END(driver.loc_);
        YY_BREAK
  case 154:
  YY_RULE_SETUP
 -#line 1542 "dhcp4_lexer.ll"
 +#line 1546 "dhcp4_lexer.ll"
  ECHO;
        YY_BREAK
- #line 3932 "dhcp4_lexer.cc"
+ #line 3709 "dhcp4_lexer.cc"
  
        case YY_END_OF_BUFFER:
                {
@@@ -5034,9 -4808,10 +4812,10 @@@ void parser4_free (void * ptr 
  
  /* %ok-for-header */
  
 -#line 1542 "dhcp4_lexer.ll"
 +#line 1546 "dhcp4_lexer.ll"
  
  
  using namespace isc::dhcp;
  
  void
Simple merge
index d67db29f85310c9fe1babedf3c2e4ac92e994eb3,341bb64c744547cf6f5409e9e1cc69480fdcf5fb..198f76dd49d477e288ba379f38855a3d35153819
@@@ -1677,1471 -1655,1430 +1677,1463 @@@ namespace isc { namespace dhcp 
      ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.push_back(m);
  }
 -#line 1659 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1681 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
 -  case 211:
 -#line 848 "dhcp4_parser.yy" // lalr1.cc:859
 +  case 213:
 +#line 866 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The subnet subnet4 parameter is required
 +    ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 1667 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1691 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 236:
- #line 900 "dhcp4_parser.yy" // lalr1.cc:859
+   case 235:
+ #line 881 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1675 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1699 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 237:
- #line 902 "dhcp4_parser.yy" // lalr1.cc:859
+   case 236:
+ #line 883 "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 1685 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1709 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 238:
- #line 908 "dhcp4_parser.yy" // lalr1.cc:859
+   case 237:
+ #line 889 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1693 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1717 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 239:
- #line 910 "dhcp4_parser.yy" // lalr1.cc:859
+   case 238:
+ #line 891 "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 1703 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1727 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 240:
- #line 916 "dhcp4_parser.yy" // lalr1.cc:859
+   case 239:
+ #line 897 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1711 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1735 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 241:
- #line 918 "dhcp4_parser.yy" // lalr1.cc:859
+   case 240:
+ #line 899 "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 1721 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1745 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 242:
- #line 924 "dhcp4_parser.yy" // lalr1.cc:859
+   case 241:
+ #line 905 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1729 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1753 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 243:
- #line 926 "dhcp4_parser.yy" // lalr1.cc:859
+   case 242:
+ #line 907 "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 1739 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1763 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 244:
- #line 932 "dhcp4_parser.yy" // lalr1.cc:859
+   case 243:
+ #line 913 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1747 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1771 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 245:
- #line 934 "dhcp4_parser.yy" // lalr1.cc:859
+   case 244:
+ #line 915 "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 1757 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1781 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 246:
- #line 940 "dhcp4_parser.yy" // lalr1.cc:859
+   case 245:
+ #line 921 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1765 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1789 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 247:
- #line 942 "dhcp4_parser.yy" // lalr1.cc:859
+   case 246:
+ #line 923 "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 1775 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1799 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 248:
- #line 948 "dhcp4_parser.yy" // lalr1.cc:859
+   case 247:
+ #line 929 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.CLIENT_CLASS);
  }
 -#line 1783 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1807 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 249:
- #line 950 "dhcp4_parser.yy" // lalr1.cc:859
+   case 248:
+ #line 931 "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 1793 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1817 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 250:
- #line 956 "dhcp4_parser.yy" // lalr1.cc:859
+   case 249:
+ #line 937 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.RESERVATION_MODE);
  }
 -#line 1801 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1825 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 251:
- #line 958 "dhcp4_parser.yy" // lalr1.cc:859
+   case 250:
+ #line 939 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 1810 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1834 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 252:
- #line 963 "dhcp4_parser.yy" // lalr1.cc:859
+   case 251:
+ #line 944 "dhcp4_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); }
 -#line 1816 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1840 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 253:
- #line 964 "dhcp4_parser.yy" // lalr1.cc:859
+   case 252:
+ #line 945 "dhcp4_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); }
 -#line 1822 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1846 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 254:
- #line 965 "dhcp4_parser.yy" // lalr1.cc:859
+   case 253:
+ #line 946 "dhcp4_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); }
 -#line 1828 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1852 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 255:
- #line 968 "dhcp4_parser.yy" // lalr1.cc:859
+   case 254:
+ #line 949 "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 1837 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1861 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 256:
- #line 973 "dhcp4_parser.yy" // lalr1.cc:859
+   case 255:
+ #line 954 "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 1846 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1870 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 257:
- #line 982 "dhcp4_parser.yy" // lalr1.cc:859
+   case 256:
+ #line 963 "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 1857 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1881 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 258:
- #line 987 "dhcp4_parser.yy" // lalr1.cc:859
+   case 257:
+ #line 968 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 1866 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1890 "dhcp4_parser.cc" // lalr1.cc:859
 +    break;
 +
 +  case 259:
 +#line 995 "dhcp4_parser.yy" // lalr1.cc:859
 +    {
 +    ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
 +    ctx.stack_.push_back(m);
 +}
 +#line 1899 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 260:
- #line 998 "dhcp4_parser.yy" // lalr1.cc:859
-     {
-     // parsing completed
- }
- #line 1907 "dhcp4_parser.cc" // lalr1.cc:859
-     break;
-   case 265:
- #line 1014 "dhcp4_parser.yy" // lalr1.cc:859
+   case 262:
+ #line 985 "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 1876 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1917 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 266:
- #line 1018 "dhcp4_parser.yy" // lalr1.cc:859
+   case 263:
+ #line 989 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The name, code and type option def parameters are required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 1884 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1929 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 267:
- #line 1029 "dhcp4_parser.yy" // lalr1.cc:859
+   case 264:
+ #line 996 "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 1894 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1939 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 268:
- #line 1033 "dhcp4_parser.yy" // lalr1.cc:859
+   case 265:
+ #line 1000 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The name, code and type option def parameters are required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 1902 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1951 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 282:
- #line 1063 "dhcp4_parser.yy" // lalr1.cc:859
+   case 279:
+ #line 1026 "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 1911 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1960 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 284:
- #line 1070 "dhcp4_parser.yy" // lalr1.cc:859
+   case 281:
+ #line 1033 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1919 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1968 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 285:
- #line 1072 "dhcp4_parser.yy" // lalr1.cc:859
+   case 282:
+ #line 1035 "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 1929 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1978 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 286:
- #line 1078 "dhcp4_parser.yy" // lalr1.cc:859
+   case 283:
+ #line 1041 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1937 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1986 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 287:
- #line 1080 "dhcp4_parser.yy" // lalr1.cc:859
+   case 284:
+ #line 1043 "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 1947 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 1996 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 288:
- #line 1086 "dhcp4_parser.yy" // lalr1.cc:859
+   case 285:
+ #line 1049 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1955 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2004 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 289:
- #line 1088 "dhcp4_parser.yy" // lalr1.cc:859
+   case 286:
+ #line 1051 "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 1965 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2014 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 291:
- #line 1096 "dhcp4_parser.yy" // lalr1.cc:859
+   case 288:
+ #line 1059 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1973 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2022 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 292:
- #line 1098 "dhcp4_parser.yy" // lalr1.cc:859
+   case 289:
+ #line 1061 "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 1983 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2032 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 293:
- #line 1104 "dhcp4_parser.yy" // lalr1.cc:859
+   case 290:
+ #line 1067 "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 1992 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2041 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 294:
- #line 1113 "dhcp4_parser.yy" // lalr1.cc:859
+   case 291:
+ #line 1076 "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 2003 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2052 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 295:
- #line 1118 "dhcp4_parser.yy" // lalr1.cc:859
+   case 292:
+ #line 1081 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2012 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2061 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 300:
- #line 1137 "dhcp4_parser.yy" // lalr1.cc:859
+   case 297:
+ #line 1100 "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 2022 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2071 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 301:
- #line 1141 "dhcp4_parser.yy" // lalr1.cc:859
+   case 298:
+ #line 1104 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: the code or name parameters are required.
      ctx.stack_.pop_back();
  }
 -#line 2030 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2080 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 302:
- #line 1149 "dhcp4_parser.yy" // lalr1.cc:859
+   case 299:
+ #line 1111 "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 2040 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2090 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 303:
- #line 1153 "dhcp4_parser.yy" // lalr1.cc:859
+   case 300:
+ #line 1115 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: the code or name parameters are required.
      // parsing completed
  }
 -#line 2048 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2099 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 316:
- #line 1184 "dhcp4_parser.yy" // lalr1.cc:859
+   case 313:
+ #line 1145 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2056 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2107 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 317:
- #line 1186 "dhcp4_parser.yy" // lalr1.cc:859
+   case 314:
+ #line 1147 "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 2066 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2117 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 320:
- #line 1196 "dhcp4_parser.yy" // lalr1.cc:859
+   case 317:
+ #line 1157 "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 2075 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2126 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 321:
- #line 1201 "dhcp4_parser.yy" // lalr1.cc:859
+   case 318:
+ #line 1162 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("always-send", persist);
  }
 -#line 2084 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2135 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 322:
- #line 1209 "dhcp4_parser.yy" // lalr1.cc:859
+   case 319:
+ #line 1170 "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 2095 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2146 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 323:
- #line 1214 "dhcp4_parser.yy" // lalr1.cc:859
+   case 320:
+ #line 1175 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2104 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2155 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 328:
- #line 1229 "dhcp4_parser.yy" // lalr1.cc:859
+   case 325:
+ #line 1190 "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 2114 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2165 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 329:
- #line 1233 "dhcp4_parser.yy" // lalr1.cc:859
+   case 326:
+ #line 1194 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The pool parameter is required.
 +    ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 2122 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2175 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 330:
- #line 1239 "dhcp4_parser.yy" // lalr1.cc:859
+   case 327:
+ #line 1198 "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 2132 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2185 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 331:
- #line 1243 "dhcp4_parser.yy" // lalr1.cc:859
+   case 328:
+ #line 1202 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The pool parameter is required.
 +    ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 2140 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2195 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 338:
- #line 1259 "dhcp4_parser.yy" // lalr1.cc:859
+   case 335:
+ #line 1216 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2148 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2203 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 339:
- #line 1261 "dhcp4_parser.yy" // lalr1.cc:859
+   case 336:
+ #line 1218 "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 2158 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2213 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 340:
- #line 1267 "dhcp4_parser.yy" // lalr1.cc:859
+   case 337:
+ #line 1224 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2166 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2221 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 341:
- #line 1269 "dhcp4_parser.yy" // lalr1.cc:859
+   case 338:
+ #line 1226 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2175 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2230 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 342:
- #line 1277 "dhcp4_parser.yy" // lalr1.cc:859
+   case 339:
+ #line 1234 "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 2186 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2241 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 343:
- #line 1282 "dhcp4_parser.yy" // lalr1.cc:859
+   case 340:
+ #line 1239 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2195 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2250 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 348:
- #line 1295 "dhcp4_parser.yy" // lalr1.cc:859
+   case 345:
+ #line 1252 "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 2205 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2260 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 349:
- #line 1299 "dhcp4_parser.yy" // lalr1.cc:859
+   case 346:
+ #line 1256 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: an identifier parameter is required.
      ctx.stack_.pop_back();
  }
 -#line 2213 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2269 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 350:
- #line 1304 "dhcp4_parser.yy" // lalr1.cc:859
+   case 347:
+ #line 1260 "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 2223 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2279 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 351:
- #line 1308 "dhcp4_parser.yy" // lalr1.cc:859
+   case 348:
+ #line 1264 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: an identifier parameter is required.
      // parsing completed
  }
 -#line 2231 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2288 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 369:
- #line 1337 "dhcp4_parser.yy" // lalr1.cc:859
+   case 366:
+ #line 1292 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2239 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2296 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 370:
- #line 1339 "dhcp4_parser.yy" // lalr1.cc:859
+   case 367:
+ #line 1294 "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 2249 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2306 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 371:
- #line 1345 "dhcp4_parser.yy" // lalr1.cc:859
+   case 368:
+ #line 1300 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2257 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2314 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 372:
- #line 1347 "dhcp4_parser.yy" // lalr1.cc:859
+   case 369:
+ #line 1302 "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 2267 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2324 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 373:
- #line 1353 "dhcp4_parser.yy" // lalr1.cc:859
+   case 370:
+ #line 1308 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2275 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2332 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 374:
- #line 1355 "dhcp4_parser.yy" // lalr1.cc:859
+   case 371:
+ #line 1310 "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 2285 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2342 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 375:
- #line 1361 "dhcp4_parser.yy" // lalr1.cc:859
+   case 372:
+ #line 1316 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2293 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2350 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 376:
- #line 1363 "dhcp4_parser.yy" // lalr1.cc:859
+   case 373:
+ #line 1318 "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 2303 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2360 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 377:
- #line 1369 "dhcp4_parser.yy" // lalr1.cc:859
+   case 374:
+ #line 1324 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2311 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2368 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 378:
- #line 1371 "dhcp4_parser.yy" // lalr1.cc:859
+   case 375:
+ #line 1326 "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 2321 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2378 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 379:
- #line 1377 "dhcp4_parser.yy" // lalr1.cc:859
+   case 376:
+ #line 1332 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2329 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2386 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 380:
- #line 1379 "dhcp4_parser.yy" // lalr1.cc:859
+   case 377:
+ #line 1334 "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 2339 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2396 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 381:
- #line 1385 "dhcp4_parser.yy" // lalr1.cc:859
+   case 378:
+ #line 1340 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2347 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2404 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 382:
- #line 1387 "dhcp4_parser.yy" // lalr1.cc:859
+   case 379:
+ #line 1342 "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 2357 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2414 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 383:
- #line 1393 "dhcp4_parser.yy" // lalr1.cc:859
+   case 380:
+ #line 1348 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2365 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2422 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 384:
- #line 1395 "dhcp4_parser.yy" // lalr1.cc:859
+   case 381:
+ #line 1350 "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 2375 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2432 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 385:
- #line 1401 "dhcp4_parser.yy" // lalr1.cc:859
+   case 382:
+ #line 1356 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2383 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2440 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 386:
- #line 1403 "dhcp4_parser.yy" // lalr1.cc:859
+   case 383:
+ #line 1358 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("flex-id", hw);
      ctx.leave();
  }
 -#line 2393 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2450 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 387:
- #line 1409 "dhcp4_parser.yy" // lalr1.cc:859
+   case 384:
+ #line 1364 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2401 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2458 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 388:
- #line 1411 "dhcp4_parser.yy" // lalr1.cc:859
+   case 385:
+ #line 1366 "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 2411 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2468 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 389:
- #line 1417 "dhcp4_parser.yy" // lalr1.cc:859
+   case 386:
+ #line 1372 "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 2422 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2479 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 390:
- #line 1422 "dhcp4_parser.yy" // lalr1.cc:859
+   case 387:
+ #line 1377 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2431 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2488 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 391:
- #line 1430 "dhcp4_parser.yy" // lalr1.cc:859
+   case 388:
+ #line 1385 "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 2442 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2499 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 392:
- #line 1435 "dhcp4_parser.yy" // lalr1.cc:859
+   case 389:
+ #line 1390 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2451 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2508 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 393:
- #line 1440 "dhcp4_parser.yy" // lalr1.cc:859
+   case 390:
+ #line 1395 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2459 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2516 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 394:
- #line 1442 "dhcp4_parser.yy" // lalr1.cc:859
+   case 391:
+ #line 1397 "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 2469 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2526 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 395:
- #line 1451 "dhcp4_parser.yy" // lalr1.cc:859
+   case 392:
+ #line 1406 "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 2480 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2537 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 396:
- #line 1456 "dhcp4_parser.yy" // lalr1.cc:859
+   case 393:
+ #line 1411 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2489 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2546 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 399:
- #line 1465 "dhcp4_parser.yy" // lalr1.cc:859
+   case 396:
+ #line 1420 "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 2499 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2556 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 400:
- #line 1469 "dhcp4_parser.yy" // lalr1.cc:859
+   case 397:
+ #line 1424 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The name client class parameter is required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 2507 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2566 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 413:
- #line 1494 "dhcp4_parser.yy" // lalr1.cc:859
+   case 410:
+ #line 1447 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2515 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2574 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 414:
- #line 1496 "dhcp4_parser.yy" // lalr1.cc:859
+   case 411:
+ #line 1449 "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 2525 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2584 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 415:
- #line 1506 "dhcp4_parser.yy" // lalr1.cc:859
+   case 412:
+ #line 1459 "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 2534 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2593 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 416:
- #line 1513 "dhcp4_parser.yy" // lalr1.cc:859
+   case 413:
+ #line 1466 "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 2545 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2604 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 417:
- #line 1518 "dhcp4_parser.yy" // lalr1.cc:859
+   case 414:
+ #line 1471 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2554 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2613 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 422:
- #line 1531 "dhcp4_parser.yy" // lalr1.cc:859
+   case 419:
+ #line 1484 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2562 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2621 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 423:
- #line 1533 "dhcp4_parser.yy" // lalr1.cc:859
+   case 420:
+ #line 1486 "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 2572 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2631 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 424:
- #line 1539 "dhcp4_parser.yy" // lalr1.cc:859
+   case 421:
+ #line 1492 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2580 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2639 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 425:
- #line 1541 "dhcp4_parser.yy" // lalr1.cc:859
+   case 422:
+ #line 1494 "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 2590 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2649 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 426:
- #line 1549 "dhcp4_parser.yy" // lalr1.cc:859
+   case 423:
+ #line 1502 "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.DHCP_DDNS);
  }
 -#line 2601 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2660 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 427:
- #line 1554 "dhcp4_parser.yy" // lalr1.cc:859
+   case 424:
+ #line 1507 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The enable updates DHCP DDNS parameter is required.
 +    ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2610 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2671 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 428:
- #line 1561 "dhcp4_parser.yy" // lalr1.cc:859
+   case 425:
+ #line 1512 "dhcp4_parser.yy" // lalr1.cc:859
      {
      // Parse the dhcp-ddns map
      ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.push_back(m);
  }
 -#line 2620 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2681 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 429:
- #line 1565 "dhcp4_parser.yy" // lalr1.cc:859
+   case 426:
+ #line 1516 "dhcp4_parser.yy" // lalr1.cc:859
      {
 +    // The enable updates DHCP DDNS parameter is required.
 +    ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 2628 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2691 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 447:
- #line 1592 "dhcp4_parser.yy" // lalr1.cc:859
+   case 444:
+ #line 1541 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("enable-updates", b);
  }
 -#line 2637 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2700 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 448:
- #line 1597 "dhcp4_parser.yy" // lalr1.cc:859
+   case 445:
+ #line 1546 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2645 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2708 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 449:
- #line 1599 "dhcp4_parser.yy" // lalr1.cc:859
+   case 446:
+ #line 1548 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("qualifying-suffix", s);
      ctx.leave();
  }
 -#line 2655 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2718 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 450:
- #line 1605 "dhcp4_parser.yy" // lalr1.cc:859
+   case 447:
+ #line 1554 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2663 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2726 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 451:
- #line 1607 "dhcp4_parser.yy" // lalr1.cc:859
+   case 448:
+ #line 1556 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("server-ip", s);
      ctx.leave();
  }
 -#line 2673 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2736 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 452:
- #line 1613 "dhcp4_parser.yy" // lalr1.cc:859
+   case 449:
+ #line 1562 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("server-port", i);
  }
 -#line 2682 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2745 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 453:
- #line 1618 "dhcp4_parser.yy" // lalr1.cc:859
+   case 450:
+ #line 1567 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2690 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2753 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 454:
- #line 1620 "dhcp4_parser.yy" // lalr1.cc:859
+   case 451:
+ #line 1569 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("sender-ip", s);
      ctx.leave();
  }
 -#line 2700 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2763 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 455:
- #line 1626 "dhcp4_parser.yy" // lalr1.cc:859
+   case 452:
+ #line 1575 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("sender-port", i);
  }
 -#line 2709 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2772 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 456:
- #line 1631 "dhcp4_parser.yy" // lalr1.cc:859
+   case 453:
+ #line 1580 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("max-queue-size", i);
  }
 -#line 2718 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2781 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 457:
- #line 1636 "dhcp4_parser.yy" // lalr1.cc:859
+   case 454:
+ #line 1585 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NCR_PROTOCOL);
  }
 -#line 2726 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2789 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 458:
- #line 1638 "dhcp4_parser.yy" // lalr1.cc:859
+   case 455:
+ #line 1587 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2735 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2798 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 459:
- #line 1644 "dhcp4_parser.yy" // lalr1.cc:859
+   case 456:
+ #line 1593 "dhcp4_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
 -#line 2741 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2804 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 460:
- #line 1645 "dhcp4_parser.yy" // lalr1.cc:859
+   case 457:
+ #line 1594 "dhcp4_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
 -#line 2747 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2810 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 461:
- #line 1648 "dhcp4_parser.yy" // lalr1.cc:859
+   case 458:
+ #line 1597 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NCR_FORMAT);
  }
 -#line 2755 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2818 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 462:
- #line 1650 "dhcp4_parser.yy" // lalr1.cc:859
+   case 459:
+ #line 1599 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("ncr-format", json);
      ctx.leave();
  }
 -#line 2765 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2828 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 463:
- #line 1656 "dhcp4_parser.yy" // lalr1.cc:859
+   case 460:
+ #line 1605 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("always-include-fqdn", b);
  }
 -#line 2774 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2837 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 464:
- #line 1661 "dhcp4_parser.yy" // lalr1.cc:859
+   case 461:
+ #line 1610 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("override-no-update", b);
  }
 -#line 2783 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2846 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 465:
- #line 1666 "dhcp4_parser.yy" // lalr1.cc:859
+   case 462:
+ #line 1615 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("override-client-update", b);
  }
 -#line 2792 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2855 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 466:
- #line 1671 "dhcp4_parser.yy" // lalr1.cc:859
+   case 463:
+ #line 1620 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.REPLACE_CLIENT_NAME);
  }
 -#line 2800 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2863 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 467:
- #line 1673 "dhcp4_parser.yy" // lalr1.cc:859
+   case 464:
+ #line 1622 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2809 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2872 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 468:
- #line 1679 "dhcp4_parser.yy" // lalr1.cc:859
+   case 465:
+ #line 1628 "dhcp4_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); 
        }
 -#line 2817 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2880 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 469:
- #line 1682 "dhcp4_parser.yy" // lalr1.cc:859
+   case 466:
+ #line 1631 "dhcp4_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2825 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2888 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 470:
- #line 1685 "dhcp4_parser.yy" // lalr1.cc:859
+   case 467:
+ #line 1634 "dhcp4_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2833 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2896 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 471:
- #line 1688 "dhcp4_parser.yy" // lalr1.cc:859
+   case 468:
+ #line 1637 "dhcp4_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2841 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2904 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 472:
- #line 1691 "dhcp4_parser.yy" // lalr1.cc:859
+   case 469:
+ #line 1640 "dhcp4_parser.yy" // lalr1.cc:859
      {
        error(yystack_[0].location, "boolean values for the replace-client-name are "
                  "no longer supported");
        }
 -#line 2850 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2913 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 473:
- #line 1697 "dhcp4_parser.yy" // lalr1.cc:859
+   case 470:
+ #line 1646 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2858 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2921 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 474:
- #line 1699 "dhcp4_parser.yy" // lalr1.cc:859
+   case 471:
+ #line 1648 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("generated-prefix", s);
      ctx.leave();
  }
 -#line 2868 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2931 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 475:
- #line 1707 "dhcp4_parser.yy" // lalr1.cc:859
+   case 472:
+ #line 1656 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2876 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2939 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 476:
- #line 1709 "dhcp4_parser.yy" // lalr1.cc:859
+   case 473:
+ #line 1658 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2885 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2948 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 477:
- #line 1714 "dhcp4_parser.yy" // lalr1.cc:859
+   case 474:
+ #line 1663 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2893 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2956 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 478:
- #line 1716 "dhcp4_parser.yy" // lalr1.cc:859
+   case 475:
+ #line 1665 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2902 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2965 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 479:
- #line 1721 "dhcp4_parser.yy" // lalr1.cc:859
+   case 476:
+ #line 1670 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2910 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2973 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 480:
- #line 1723 "dhcp4_parser.yy" // lalr1.cc:859
+   case 477:
+ #line 1672 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2919 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2982 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 481:
- #line 1733 "dhcp4_parser.yy" // lalr1.cc:859
+   case 478:
+ #line 1682 "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 2930 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 2993 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 482:
- #line 1738 "dhcp4_parser.yy" // lalr1.cc:859
+   case 479:
+ #line 1687 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2939 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3002 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 486:
- #line 1755 "dhcp4_parser.yy" // lalr1.cc:859
+   case 483:
+ #line 1704 "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 2950 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3013 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 487:
- #line 1760 "dhcp4_parser.yy" // lalr1.cc:859
+   case 484:
+ #line 1709 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2959 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3022 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 490:
- #line 1772 "dhcp4_parser.yy" // lalr1.cc:859
+   case 487:
+ #line 1721 "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 2969 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3032 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 491:
- #line 1776 "dhcp4_parser.yy" // lalr1.cc:859
+   case 488:
+ #line 1725 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
  }
 -#line 2977 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3040 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 499:
- #line 1791 "dhcp4_parser.yy" // lalr1.cc:859
+   case 496:
+ #line 1740 "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 2986 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3049 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 500:
- #line 1796 "dhcp4_parser.yy" // lalr1.cc:859
+   case 497:
+ #line 1745 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2994 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3057 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 501:
- #line 1798 "dhcp4_parser.yy" // lalr1.cc:859
+   case 498:
+ #line 1747 "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 3004 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3067 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 502:
- #line 1804 "dhcp4_parser.yy" // lalr1.cc:859
+   case 499:
+ #line 1753 "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 3015 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3078 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 503:
- #line 1809 "dhcp4_parser.yy" // lalr1.cc:859
+   case 500:
+ #line 1758 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 3024 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3087 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 506:
- #line 1818 "dhcp4_parser.yy" // lalr1.cc:859
+   case 503:
+ #line 1767 "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 3034 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3097 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 507:
- #line 1822 "dhcp4_parser.yy" // lalr1.cc:859
+   case 504:
+ #line 1771 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
  }
 -#line 3042 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3105 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 514:
- #line 1836 "dhcp4_parser.yy" // lalr1.cc:859
+   case 511:
+ #line 1785 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 3050 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3113 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 515:
- #line 1838 "dhcp4_parser.yy" // lalr1.cc:859
+   case 512:
+ #line 1787 "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 3060 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3123 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 516:
- #line 1844 "dhcp4_parser.yy" // lalr1.cc:859
+   case 513:
+ #line 1793 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("flush", flush);
  }
 -#line 3069 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3132 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 517:
- #line 1849 "dhcp4_parser.yy" // lalr1.cc:859
+   case 514:
+ #line 1798 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("maxsize", maxsize);
  }
 -#line 3078 "dhcp4_parser.cc" // lalr1.cc:859
 +#line 3141 "dhcp4_parser.cc" // lalr1.cc:859
      break;
  
-   case 518:
- #line 1854 "dhcp4_parser.yy" // lalr1.cc:859
+   case 515:
+ #line 1803 "dhcp4_parser.yy" // lalr1.cc:859
      {
      ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("maxver", maxver);
    {
         0,     2,     0,     3,     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,     1,     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,     1,     0,     6,     0,     4,     1,     3,     1,     1,
 +       0,     3,     0,     3,     0,     3,     1,     1,     1,     1,
 +       1,     1,     1,     1,     0,     4,     1,     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,     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,     3,
 -       3,     3,     3,     3,     3,     0,     6,     1,     3,     1,
 -       1,     1,     0,     4,     0,     4,     0,     4,     1,     1,
 -       3,     0,     6,     0,     6,     1,     3,     1,     1,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
 -       0,     4,     1,     1,     1,     1,     0,     4,     0,     4,
 -       0,     4,     3,     0,     4,     3,     3,     3,     3,     0,
 -       4,     0,     4,     0,     6,     1,     3,     1,     1,     1,
 -       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,
 -       1,     1,     1,     1,     1,     1,     3,     3,     3,     3,
 -       3,     3,     0,     6,     0,     1,     1,     3,     0,     4,
 -       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
 +       1,     3,     3,     3,     3,     3,     3,     0,     6,     1,
 +       3,     1,     1,     1,     0,     4,     0,     4,     0,     4,
 +       1,     1,     3,     0,     6,     0,     6,     1,     3,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-        1,     1,     0,     4,     1,     1,     1,     1,     0,     4,
-        0,     4,     0,     4,     3,     0,     4,     3,     3,     3,
-        3,     0,     4,     0,     4,     0,     6,     1,     3,     1,
-        1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
+        1,     1,     1,     1,     1,     0,     4,     0,     4,     0,
+        4,     0,     4,     0,     4,     0,     4,     0,     4,     0,
+        4,     1,     1,     1,     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,     0,     4,     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,     1,     0,     4,     1,     1,     3,     3,     0,
         6,     0,     1,     1,     3,     0,     4,     0,     4,     1,
-        3,     1,     1,     1,     0,     4,     0,     4,     0,     6,
-        1,     3,     1,     1,     1,     1,     1,     1,     3,     3,
-        3,     3,     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,
+        3,     1,     1,     1,     1,     0,     4,     0,     4,     0,
+        6,     0,     1,     1,     3,     0,     4,     0,     4,     0,
+        1,     1,     3,     1,     1,     1,     1,     1,     1,     1,
         1,     1,     1,     1,     1,     1,     0,     4,     0,     4,
         0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
-        0,     4,     1,     1,     1,     3,     3,     0,     6,     0,
-        4,     0,     1,     1,     3,     0,     4,     0,     4,     0,
-        1,     1,     3,     1,     1,     1,     1,     1,     1,     1,
-        1,     1,     3,     1,     0,     4,     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,     1,     0,     4,     1,     1,
-        3,     3,     0,     6,     0,     1,     1,     3,     0,     4,
-        0,     4,     1,     3,     1,     1,     1,     1,     0,     4,
-        0,     4,     0,     6,     0,     1,     1,     3,     0,     4,
-        0,     4,     0,     1,     1,     3,     1,     1,     1,     1,
-        1,     1,     1,     1,     1,     1,     1,     1,     1,     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,     3,     0,     6,     1,     3,
-        1,     1,     0,     4,     0,     4,     0,     6,     0,     4,
+        0,     4,     0,     4,     0,     4,     0,     4,     0,     6,
+        0,     4,     0,     6,     1,     3,     0,     4,     0,     1,
         1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-        1,     1,     1,     1,     1,     1,     1,     3,     0,     4,
-        0,     4,     3,     0,     4,     3,     3,     0,     4,     1,
-        1,     0,     4,     3,     3,     3,     0,     4,     1,     1,
-        1,     1,     1,     0,     4,     0,     4,     0,     4,     0,
-        4,     0,     6,     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,
-        1,     1,     1,     1,     0,     4,     3,     3,     3
+        0,     4,     3,     0,     6,     1,     3,     1,     1,     0,
+        4,     0,     4,     0,     6,     0,     4,     1,     3,     1,
+        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+        1,     1,     1,     1,     3,     0,     4,     0,     4,     3,
+        0,     4,     3,     3,     0,     4,     1,     1,     0,     4,
+        3,     3,     3,     0,     4,     1,     1,     1,     1,     1,
+        0,     4,     0,     4,     0,     4,     0,     4,     0,     6,
+        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,     1,     1,     1,
+        1,     0,     4,     3,     3,     3
    };
  
  
index c0fa4e5059b5569c6988dcb2e93b64541d84c699,c473544f56dcb0207043b94c71a97e3dc736c39a..ff2d5cb7a3d6984608447c3c89baaad8d9a96830
@@@ -1385,12 -1380,12 +1385,12 @@@ namespace isc { namespace dhcp 
      enum
      {
        yyeof_ = 0,
-       yylast_ = 755,     ///< Last index in yytable_.
-       yynnts_ = 321,  ///< Number of nonterminal symbols.
-       yyfinal_ = 26, ///< Termination state number.
+       yylast_ = 757,     ///< Last index in yytable_.
+       yynnts_ = 318,  ///< Number of nonterminal symbols.
+       yyfinal_ = 24, ///< Termination state number.
        yyterror_ = 1,
        yyerrcode_ = 256,
 -      yyntokens_ = 145  ///< Number of tokens.
 +      yyntokens_ = 146  ///< Number of tokens.
      };
  
  
Simple merge
index ac0c8430a045832efb578e5eb6b66fd4d8cab574,a835343260faa9ee0036c054974ae1a443766528..83be290e0a547dc0c917a1cfd0ea6d90eb1362b5
@@@ -3851,27 -3627,27 +3631,27 @@@ YY_RULE_SETU
  case 143:
  /* rule 143 can match eol */
  YY_RULE_SETUP
 -#line 1498 "dhcp6_lexer.ll"
 +#line 1502 "dhcp6_lexer.ll"
  {
      /* Bad string with a forbidden control character inside */
-     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
+     driver.error(driver.loc_, "Invalid control in " + std::string(parser6_text));
  }
        YY_BREAK
  case 144:
  /* rule 144 can match eol */
  YY_RULE_SETUP
 -#line 1503 "dhcp6_lexer.ll"
 +#line 1507 "dhcp6_lexer.ll"
  {
      /* Bad string with a bad escape inside */
-     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
+     driver.error(driver.loc_, "Bad escape in " + std::string(parser6_text));
  }
        YY_BREAK
  case 145:
  YY_RULE_SETUP
 -#line 1508 "dhcp6_lexer.ll"
 +#line 1512 "dhcp6_lexer.ll"
  {
      /* Bad string with an open escape at the end */
-     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
+     driver.error(driver.loc_, "Overflow escape in " + std::string(parser6_text));
  }
        YY_BREAK
  case 146:
@@@ -3906,10 -3682,10 +3686,10 @@@ YY_RULE_SETU
        YY_BREAK
  case 152:
  YY_RULE_SETUP
 -#line 1520 "dhcp6_lexer.ll"
 +#line 1524 "dhcp6_lexer.ll"
  {
      /* An integer was found. */
-     std::string tmp(yytext);
+     std::string tmp(parser6_text);
      int64_t integer = 0;
      try {
          /* In substring we want to use negative values (e.g. -1).
        YY_BREAK
  case 153:
  YY_RULE_SETUP
 -#line 1538 "dhcp6_lexer.ll"
 +#line 1542 "dhcp6_lexer.ll"
  {
      /* A floating point was found. */
-     std::string tmp(yytext);
+     std::string tmp(parser6_text);
      double fp = 0.0;
      try {
          fp = boost::lexical_cast<double>(tmp);
        YY_BREAK
  case 154:
  YY_RULE_SETUP
 -#line 1551 "dhcp6_lexer.ll"
 +#line 1555 "dhcp6_lexer.ll"
  {
-     string tmp(yytext);
+     string tmp(parser6_text);
      return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_);
  }
        YY_BREAK
@@@ -3973,11 -3749,11 +3753,11 @@@ driver.error (driver.loc_, "JSON null r
        YY_BREAK
  case 159:
  YY_RULE_SETUP
- #line 1570 "dhcp6_lexer.ll"
- driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
+ #line 1566 "dhcp6_lexer.ll"
+ driver.error (driver.loc_, "Invalid character: " + std::string(parser6_text));
        YY_BREAK
  case YY_STATE_EOF(INITIAL):
 -#line 1568 "dhcp6_lexer.ll"
 +#line 1572 "dhcp6_lexer.ll"
  {
      if (driver.states_.empty()) {
          return isc::dhcp::Dhcp6Parser::make_END(driver.loc_);
        YY_BREAK
  case 160:
  YY_RULE_SETUP
 -#line 1591 "dhcp6_lexer.ll"
 +#line 1595 "dhcp6_lexer.ll"
  ECHO;
        YY_BREAK
- #line 4009 "dhcp6_lexer.cc"
+ #line 3786 "dhcp6_lexer.cc"
  
        case YY_END_OF_BUFFER:
                {
@@@ -5111,9 -4885,10 +4889,10 @@@ void parser6_free (void * ptr 
  
  /* %ok-for-header */
  
 -#line 1591 "dhcp6_lexer.ll"
 +#line 1595 "dhcp6_lexer.ll"
  
  
  using namespace isc::dhcp;
  
  void
Simple merge
index dba8d9f6c49e80b1206c9d03c55387a829aa36eb,c4071f49d01fe47af2427301c769a5c789dbfd31..ec11fcb15b04c8e561c27a7d134caed0f32df187
@@@ -1676,1577 -1654,1527 +1676,1569 @@@ namespace isc { namespace dhcp 
      ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.push_back(m);
  }
 -#line 1658 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1680 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
 -  case 213:
 -#line 862 "dhcp6_parser.yy" // lalr1.cc:859
 +  case 215:
 +#line 880 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The subnet subnet6 parameter is required
 +    ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 1666 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1690 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 235:
- #line 911 "dhcp6_parser.yy" // lalr1.cc:859
+   case 234:
+ #line 892 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1674 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1698 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 236:
- #line 913 "dhcp6_parser.yy" // lalr1.cc:859
+   case 235:
+ #line 894 "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 1684 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1708 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 237:
- #line 919 "dhcp6_parser.yy" // lalr1.cc:859
+   case 236:
+ #line 900 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1692 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1716 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 238:
- #line 921 "dhcp6_parser.yy" // lalr1.cc:859
+   case 237:
+ #line 902 "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 1702 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1726 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 239:
- #line 927 "dhcp6_parser.yy" // lalr1.cc:859
+   case 238:
+ #line 908 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1710 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1734 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 240:
- #line 929 "dhcp6_parser.yy" // lalr1.cc:859
+   case 239:
+ #line 910 "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 1720 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1744 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 241:
- #line 935 "dhcp6_parser.yy" // lalr1.cc:859
+   case 240:
+ #line 916 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.CLIENT_CLASS);
  }
 -#line 1728 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1752 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 242:
- #line 937 "dhcp6_parser.yy" // lalr1.cc:859
+   case 241:
+ #line 918 "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 1738 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1762 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 243:
- #line 943 "dhcp6_parser.yy" // lalr1.cc:859
+   case 242:
+ #line 924 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.RESERVATION_MODE);
  }
 -#line 1746 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1770 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 244:
- #line 945 "dhcp6_parser.yy" // lalr1.cc:859
+   case 243:
+ #line 926 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 1755 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1779 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 245:
- #line 950 "dhcp6_parser.yy" // lalr1.cc:859
+   case 244:
+ #line 931 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); }
 -#line 1761 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1785 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 246:
- #line 951 "dhcp6_parser.yy" // lalr1.cc:859
+   case 245:
+ #line 932 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); }
 -#line 1767 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1791 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 247:
- #line 952 "dhcp6_parser.yy" // lalr1.cc:859
+   case 246:
+ #line 933 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); }
 -#line 1773 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1797 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 248:
- #line 955 "dhcp6_parser.yy" // lalr1.cc:859
+   case 247:
+ #line 936 "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 1782 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1806 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 249:
- #line 960 "dhcp6_parser.yy" // lalr1.cc:859
+   case 248:
+ #line 941 "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 1791 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1815 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 250:
- #line 969 "dhcp6_parser.yy" // lalr1.cc:859
+   case 249:
+ #line 950 "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 1802 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1826 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 251:
- #line 974 "dhcp6_parser.yy" // lalr1.cc:859
+   case 250:
+ #line 955 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 1811 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1835 "dhcp6_parser.cc" // lalr1.cc:859
 +    break;
 +
 +  case 252:
 +#line 982 "dhcp6_parser.yy" // lalr1.cc:859
 +    {
 +    ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
 +    ctx.stack_.push_back(m);
 +}
 +#line 1844 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 253:
- #line 985 "dhcp6_parser.yy" // lalr1.cc:859
-     {
-     // parsing completed
- }
- #line 1852 "dhcp6_parser.cc" // lalr1.cc:859
-     break;
-   case 258:
- #line 1001 "dhcp6_parser.yy" // lalr1.cc:859
+   case 255:
+ #line 972 "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 1821 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1862 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 259:
- #line 1005 "dhcp6_parser.yy" // lalr1.cc:859
+   case 256:
+ #line 976 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The name, code and type option def parameters are required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 1829 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1874 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 260:
- #line 1016 "dhcp6_parser.yy" // lalr1.cc:859
+   case 257:
+ #line 983 "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 1839 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1884 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 261:
- #line 1020 "dhcp6_parser.yy" // lalr1.cc:859
+   case 258:
+ #line 987 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The name, code and type option def parameters are required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 1847 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1896 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 275:
- #line 1050 "dhcp6_parser.yy" // lalr1.cc:859
+   case 272:
+ #line 1013 "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 1856 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1905 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 277:
- #line 1057 "dhcp6_parser.yy" // lalr1.cc:859
+   case 274:
+ #line 1020 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1864 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1913 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 278:
- #line 1059 "dhcp6_parser.yy" // lalr1.cc:859
+   case 275:
+ #line 1022 "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 1874 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1923 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 279:
- #line 1065 "dhcp6_parser.yy" // lalr1.cc:859
+   case 276:
+ #line 1028 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1882 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1931 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 280:
- #line 1067 "dhcp6_parser.yy" // lalr1.cc:859
+   case 277:
+ #line 1030 "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 1892 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1941 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 281:
- #line 1073 "dhcp6_parser.yy" // lalr1.cc:859
+   case 278:
+ #line 1036 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1900 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1949 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 282:
- #line 1075 "dhcp6_parser.yy" // lalr1.cc:859
+   case 279:
+ #line 1038 "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 1910 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1959 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 284:
- #line 1083 "dhcp6_parser.yy" // lalr1.cc:859
+   case 281:
+ #line 1046 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 1918 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1967 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 285:
- #line 1085 "dhcp6_parser.yy" // lalr1.cc:859
+   case 282:
+ #line 1048 "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 1928 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1977 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 286:
- #line 1091 "dhcp6_parser.yy" // lalr1.cc:859
+   case 283:
+ #line 1054 "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 1937 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1986 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 287:
- #line 1100 "dhcp6_parser.yy" // lalr1.cc:859
+   case 284:
+ #line 1063 "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 1948 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 1997 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 288:
- #line 1105 "dhcp6_parser.yy" // lalr1.cc:859
+   case 285:
+ #line 1068 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 1957 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2006 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 293:
- #line 1124 "dhcp6_parser.yy" // lalr1.cc:859
+   case 290:
+ #line 1087 "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 1967 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2016 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 294:
- #line 1128 "dhcp6_parser.yy" // lalr1.cc:859
+   case 291:
+ #line 1091 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: the code or name parameters are required.
      ctx.stack_.pop_back();
  }
 -#line 1975 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2025 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 295:
- #line 1136 "dhcp6_parser.yy" // lalr1.cc:859
+   case 292:
+ #line 1098 "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 1985 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2035 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 296:
- #line 1140 "dhcp6_parser.yy" // lalr1.cc:859
+   case 293:
+ #line 1102 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: the code or name parameters are required.
      // parsing completed
  }
 -#line 1993 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2044 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 309:
- #line 1171 "dhcp6_parser.yy" // lalr1.cc:859
+   case 306:
+ #line 1132 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2001 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2052 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 310:
- #line 1173 "dhcp6_parser.yy" // lalr1.cc:859
+   case 307:
+ #line 1134 "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 2011 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2062 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 313:
- #line 1183 "dhcp6_parser.yy" // lalr1.cc:859
+   case 310:
+ #line 1144 "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 2020 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2071 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 314:
- #line 1188 "dhcp6_parser.yy" // lalr1.cc:859
+   case 311:
+ #line 1149 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("always-send", persist);
  }
 -#line 2029 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2080 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 315:
- #line 1196 "dhcp6_parser.yy" // lalr1.cc:859
+   case 312:
+ #line 1157 "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 2040 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2091 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 316:
- #line 1201 "dhcp6_parser.yy" // lalr1.cc:859
+   case 313:
+ #line 1162 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2049 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2100 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 321:
- #line 1216 "dhcp6_parser.yy" // lalr1.cc:859
+   case 318:
+ #line 1177 "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 2059 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2110 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 322:
- #line 1220 "dhcp6_parser.yy" // lalr1.cc:859
+   case 319:
+ #line 1181 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The pool parameter is required.
 +    ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 2067 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2120 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 323:
- #line 1226 "dhcp6_parser.yy" // lalr1.cc:859
+   case 320:
+ #line 1185 "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 2077 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2130 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 324:
- #line 1230 "dhcp6_parser.yy" // lalr1.cc:859
+   case 321:
+ #line 1189 "dhcp6_parser.yy" // lalr1.cc:859
      {
 -    // parsing completed
 +    // The pool parameter is required.
 +    ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
  }
 -#line 2085 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2139 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 331:
- #line 1245 "dhcp6_parser.yy" // lalr1.cc:859
+   case 328:
+ #line 1203 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2093 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2147 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 332:
- #line 1247 "dhcp6_parser.yy" // lalr1.cc:859
+   case 329:
+ #line 1205 "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 2103 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2157 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 333:
- #line 1253 "dhcp6_parser.yy" // lalr1.cc:859
+   case 330:
+ #line 1211 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2111 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2165 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 334:
- #line 1255 "dhcp6_parser.yy" // lalr1.cc:859
+   case 331:
+ #line 1213 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("user-context", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2120 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2174 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 335:
- #line 1263 "dhcp6_parser.yy" // lalr1.cc:859
+   case 332:
+ #line 1221 "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 2131 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2185 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 336:
- #line 1268 "dhcp6_parser.yy" // lalr1.cc:859
+   case 333:
+ #line 1226 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2140 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2194 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 341:
- #line 1283 "dhcp6_parser.yy" // lalr1.cc:859
+   case 338:
+ #line 1241 "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 2150 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2204 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 342:
- #line 1287 "dhcp6_parser.yy" // lalr1.cc:859
+   case 339:
+ #line 1245 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The prefix, prefix len and delegated len parameters are required.
 +    ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("prefix-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 2158 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2216 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 343:
- #line 1295 "dhcp6_parser.yy" // lalr1.cc:859
+   case 340:
+ #line 1249 "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 2168 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2226 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 344:
- #line 1299 "dhcp6_parser.yy" // lalr1.cc:859
+   case 341:
+ #line 1253 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The prefix, prefix len and delegated len parameters are required.
 +    ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("prefix-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 +    ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 2176 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2238 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 355:
- #line 1321 "dhcp6_parser.yy" // lalr1.cc:859
+   case 352:
+ #line 1271 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2184 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2246 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 356:
- #line 1323 "dhcp6_parser.yy" // lalr1.cc:859
+   case 353:
+ #line 1273 "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 2194 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2256 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 357:
- #line 1329 "dhcp6_parser.yy" // lalr1.cc:859
+   case 354:
+ #line 1279 "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 2203 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2265 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 358:
- #line 1334 "dhcp6_parser.yy" // lalr1.cc:859
+   case 355:
+ #line 1284 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2211 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2273 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 359:
- #line 1336 "dhcp6_parser.yy" // lalr1.cc:859
+   case 356:
+ #line 1286 "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 2221 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2283 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 360:
- #line 1342 "dhcp6_parser.yy" // lalr1.cc:859
+   case 357:
+ #line 1292 "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 2230 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2292 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 361:
- #line 1347 "dhcp6_parser.yy" // lalr1.cc:859
+   case 358:
+ #line 1297 "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 2239 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2301 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 362:
- #line 1355 "dhcp6_parser.yy" // lalr1.cc:859
+   case 359:
+ #line 1305 "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 2250 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2312 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 363:
- #line 1360 "dhcp6_parser.yy" // lalr1.cc:859
+   case 360:
+ #line 1310 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2259 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2321 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 368:
- #line 1373 "dhcp6_parser.yy" // lalr1.cc:859
+   case 365:
+ #line 1323 "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 2269 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2331 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 369:
- #line 1377 "dhcp6_parser.yy" // lalr1.cc:859
+   case 366:
+ #line 1327 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: an identifier parameter is required.
      ctx.stack_.pop_back();
  }
 -#line 2277 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2340 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 370:
- #line 1382 "dhcp6_parser.yy" // lalr1.cc:859
+   case 367:
+ #line 1331 "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 2287 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2350 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 371:
- #line 1386 "dhcp6_parser.yy" // lalr1.cc:859
+   case 368:
+ #line 1335 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    /// @todo: an identifier parameter is required.
      // parsing completed
  }
 -#line 2295 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2359 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 385:
- #line 1411 "dhcp6_parser.yy" // lalr1.cc:859
+   case 382:
+ #line 1359 "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 2306 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2370 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 386:
- #line 1416 "dhcp6_parser.yy" // lalr1.cc:859
+   case 383:
+ #line 1364 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2315 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2379 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 387:
- #line 1421 "dhcp6_parser.yy" // lalr1.cc:859
+   case 384:
+ #line 1369 "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 2326 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2390 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 388:
- #line 1426 "dhcp6_parser.yy" // lalr1.cc:859
+   case 385:
+ #line 1374 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2335 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2399 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 389:
- #line 1431 "dhcp6_parser.yy" // lalr1.cc:859
+   case 386:
+ #line 1379 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2343 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2407 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 390:
- #line 1433 "dhcp6_parser.yy" // lalr1.cc:859
+   case 387:
+ #line 1381 "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 2353 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2417 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 391:
- #line 1439 "dhcp6_parser.yy" // lalr1.cc:859
+   case 388:
+ #line 1387 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2361 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2425 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 392:
- #line 1441 "dhcp6_parser.yy" // lalr1.cc:859
+   case 389:
+ #line 1389 "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 2371 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2435 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 393:
- #line 1447 "dhcp6_parser.yy" // lalr1.cc:859
+   case 390:
+ #line 1395 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2379 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2443 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 394:
- #line 1449 "dhcp6_parser.yy" // lalr1.cc:859
+   case 391:
+ #line 1397 "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 2389 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2453 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 395:
- #line 1455 "dhcp6_parser.yy" // lalr1.cc:859
+   case 392:
+ #line 1403 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2397 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2461 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 396:
- #line 1457 "dhcp6_parser.yy" // lalr1.cc:859
+   case 393:
+ #line 1405 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("flex-id", hw);
      ctx.leave();
  }
 -#line 2407 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2471 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 397:
- #line 1463 "dhcp6_parser.yy" // lalr1.cc:859
+   case 394:
+ #line 1411 "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 2418 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2482 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 398:
- #line 1468 "dhcp6_parser.yy" // lalr1.cc:859
+   case 395:
+ #line 1416 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2427 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2491 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 399:
- #line 1476 "dhcp6_parser.yy" // lalr1.cc:859
+   case 396:
+ #line 1424 "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 2438 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2502 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 400:
- #line 1481 "dhcp6_parser.yy" // lalr1.cc:859
+   case 397:
+ #line 1429 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2447 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2511 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 401:
- #line 1486 "dhcp6_parser.yy" // lalr1.cc:859
+   case 398:
+ #line 1434 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2455 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2519 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 402:
- #line 1488 "dhcp6_parser.yy" // lalr1.cc:859
+   case 399:
+ #line 1436 "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 2465 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2529 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 403:
- #line 1497 "dhcp6_parser.yy" // lalr1.cc:859
+   case 400:
+ #line 1445 "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 2476 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2540 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 404:
- #line 1502 "dhcp6_parser.yy" // lalr1.cc:859
+   case 401:
+ #line 1450 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2485 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2549 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 407:
- #line 1511 "dhcp6_parser.yy" // lalr1.cc:859
+   case 404:
+ #line 1459 "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 2495 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2559 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 408:
- #line 1515 "dhcp6_parser.yy" // lalr1.cc:859
+   case 405:
+ #line 1463 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The name client class parameter is required.
 +    ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
  }
 -#line 2503 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2569 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 418:
- #line 1537 "dhcp6_parser.yy" // lalr1.cc:859
+   case 415:
+ #line 1483 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2511 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2577 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 419:
- #line 1539 "dhcp6_parser.yy" // lalr1.cc:859
+   case 416:
+ #line 1485 "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 2521 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2587 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 420:
- #line 1548 "dhcp6_parser.yy" // lalr1.cc:859
+   case 417:
+ #line 1494 "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 2532 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2598 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 421:
- #line 1553 "dhcp6_parser.yy" // lalr1.cc:859
+   case 418:
+ #line 1499 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The type parameter is required.
 +    ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2541 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2609 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 431:
- #line 1573 "dhcp6_parser.yy" // lalr1.cc:859
+   case 428:
+ #line 1517 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.DUID_TYPE);
  }
 -#line 2549 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2617 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 432:
- #line 1575 "dhcp6_parser.yy" // lalr1.cc:859
+   case 429:
+ #line 1519 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2558 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2626 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 433:
- #line 1580 "dhcp6_parser.yy" // lalr1.cc:859
+   case 430:
+ #line 1524 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); }
 -#line 2564 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2632 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 434:
- #line 1581 "dhcp6_parser.yy" // lalr1.cc:859
+   case 431:
+ #line 1525 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); }
 -#line 2570 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2638 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 435:
- #line 1582 "dhcp6_parser.yy" // lalr1.cc:859
+   case 432:
+ #line 1526 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); }
 -#line 2576 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2644 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 436:
- #line 1585 "dhcp6_parser.yy" // lalr1.cc:859
+   case 433:
+ #line 1529 "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 2585 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2653 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 437:
- #line 1590 "dhcp6_parser.yy" // lalr1.cc:859
+   case 434:
+ #line 1534 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2593 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2661 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 438:
- #line 1592 "dhcp6_parser.yy" // lalr1.cc:859
+   case 435:
+ #line 1536 "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 2603 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2671 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 439:
- #line 1598 "dhcp6_parser.yy" // lalr1.cc:859
+   case 436:
+ #line 1542 "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 2612 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2680 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 440:
- #line 1603 "dhcp6_parser.yy" // lalr1.cc:859
+   case 437:
+ #line 1547 "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 2621 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2689 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 441:
- #line 1610 "dhcp6_parser.yy" // lalr1.cc:859
+   case 438:
+ #line 1554 "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 2630 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2698 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 442:
- #line 1617 "dhcp6_parser.yy" // lalr1.cc:859
+   case 439:
+ #line 1561 "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 2641 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2709 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 443:
- #line 1622 "dhcp6_parser.yy" // lalr1.cc:859
+   case 440:
+ #line 1566 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2650 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2718 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 448:
- #line 1635 "dhcp6_parser.yy" // lalr1.cc:859
+   case 445:
+ #line 1579 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2658 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2726 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 449:
- #line 1637 "dhcp6_parser.yy" // lalr1.cc:859
+   case 446:
+ #line 1581 "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 2668 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2736 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 450:
- #line 1643 "dhcp6_parser.yy" // lalr1.cc:859
+   case 447:
+ #line 1587 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2676 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2744 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 451:
- #line 1645 "dhcp6_parser.yy" // lalr1.cc:859
+   case 448:
+ #line 1589 "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 2686 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2754 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 452:
- #line 1653 "dhcp6_parser.yy" // lalr1.cc:859
+   case 449:
+ #line 1597 "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.DHCP_DDNS);
  }
 -#line 2697 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2765 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 453:
- #line 1658 "dhcp6_parser.yy" // lalr1.cc:859
+   case 450:
+ #line 1602 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The enable updates DHCP DDNS parameter is required.
 +    ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 2706 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2776 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 454:
- #line 1665 "dhcp6_parser.yy" // lalr1.cc:859
+   case 451:
+ #line 1607 "dhcp6_parser.yy" // lalr1.cc:859
      {
      // Parse the dhcp-ddns map
      ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.push_back(m);
  }
 -#line 2716 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2786 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 455:
- #line 1669 "dhcp6_parser.yy" // lalr1.cc:859
+   case 452:
+ #line 1611 "dhcp6_parser.yy" // lalr1.cc:859
      {
 +    // The enable updates DHCP DDNS parameter is required.
 +    ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
      // parsing completed
  }
 -#line 2724 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2796 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 473:
- #line 1696 "dhcp6_parser.yy" // lalr1.cc:859
+   case 470:
+ #line 1636 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("enable-updates", b);
  }
 -#line 2733 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2805 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 474:
- #line 1701 "dhcp6_parser.yy" // lalr1.cc:859
+   case 471:
+ #line 1641 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2741 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2813 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 475:
- #line 1703 "dhcp6_parser.yy" // lalr1.cc:859
+   case 472:
+ #line 1643 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("qualifying-suffix", s);
      ctx.leave();
  }
 -#line 2751 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2823 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 476:
- #line 1709 "dhcp6_parser.yy" // lalr1.cc:859
+   case 473:
+ #line 1649 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2759 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2831 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 477:
- #line 1711 "dhcp6_parser.yy" // lalr1.cc:859
+   case 474:
+ #line 1651 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("server-ip", s);
      ctx.leave();
  }
 -#line 2769 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2841 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 478:
- #line 1717 "dhcp6_parser.yy" // lalr1.cc:859
+   case 475:
+ #line 1657 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("server-port", i);
  }
 -#line 2778 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2850 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 479:
- #line 1722 "dhcp6_parser.yy" // lalr1.cc:859
+   case 476:
+ #line 1662 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2786 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2858 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 480:
- #line 1724 "dhcp6_parser.yy" // lalr1.cc:859
+   case 477:
+ #line 1664 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("sender-ip", s);
      ctx.leave();
  }
 -#line 2796 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2868 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 481:
- #line 1730 "dhcp6_parser.yy" // lalr1.cc:859
+   case 478:
+ #line 1670 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("sender-port", i);
  }
 -#line 2805 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2877 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 482:
- #line 1735 "dhcp6_parser.yy" // lalr1.cc:859
+   case 479:
+ #line 1675 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("max-queue-size", i);
  }
 -#line 2814 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2886 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 483:
- #line 1740 "dhcp6_parser.yy" // lalr1.cc:859
+   case 480:
+ #line 1680 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NCR_PROTOCOL);
  }
 -#line 2822 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2894 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 484:
- #line 1742 "dhcp6_parser.yy" // lalr1.cc:859
+   case 481:
+ #line 1682 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2831 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2903 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 485:
- #line 1748 "dhcp6_parser.yy" // lalr1.cc:859
+   case 482:
+ #line 1688 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
 -#line 2837 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2909 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 486:
- #line 1749 "dhcp6_parser.yy" // lalr1.cc:859
+   case 483:
+ #line 1689 "dhcp6_parser.yy" // lalr1.cc:859
      { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
 -#line 2843 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2915 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 487:
- #line 1752 "dhcp6_parser.yy" // lalr1.cc:859
+   case 484:
+ #line 1692 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NCR_FORMAT);
  }
 -#line 2851 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2923 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 488:
- #line 1754 "dhcp6_parser.yy" // lalr1.cc:859
+   case 485:
+ #line 1694 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("ncr-format", json);
      ctx.leave();
  }
 -#line 2861 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2933 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 489:
- #line 1760 "dhcp6_parser.yy" // lalr1.cc:859
+   case 486:
+ #line 1700 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("always-include-fqdn", b);
  }
 -#line 2870 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2942 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 490:
- #line 1765 "dhcp6_parser.yy" // lalr1.cc:859
+   case 487:
+ #line 1705 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("override-no-update", b);
  }
 -#line 2879 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2951 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 491:
- #line 1770 "dhcp6_parser.yy" // lalr1.cc:859
+   case 488:
+ #line 1710 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("override-client-update", b);
  }
 -#line 2888 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2960 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 492:
- #line 1775 "dhcp6_parser.yy" // lalr1.cc:859
+   case 489:
+ #line 1715 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.REPLACE_CLIENT_NAME);
  }
 -#line 2896 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2968 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 493:
- #line 1777 "dhcp6_parser.yy" // lalr1.cc:859
+   case 490:
+ #line 1717 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2905 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2977 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 494:
- #line 1783 "dhcp6_parser.yy" // lalr1.cc:859
+   case 491:
+ #line 1723 "dhcp6_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); 
        }
 -#line 2913 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2985 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 495:
- #line 1786 "dhcp6_parser.yy" // lalr1.cc:859
+   case 492:
+ #line 1726 "dhcp6_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2921 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 2993 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 496:
- #line 1789 "dhcp6_parser.yy" // lalr1.cc:859
+   case 493:
+ #line 1729 "dhcp6_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2929 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3001 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 497:
- #line 1792 "dhcp6_parser.yy" // lalr1.cc:859
+   case 494:
+ #line 1732 "dhcp6_parser.yy" // lalr1.cc:859
      {
        yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
        }
 -#line 2937 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3009 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 498:
- #line 1795 "dhcp6_parser.yy" // lalr1.cc:859
+   case 495:
+ #line 1735 "dhcp6_parser.yy" // lalr1.cc:859
      {
        error(yystack_[0].location, "boolean values for the replace-client-name are "
                  "no longer supported");
        }
 -#line 2946 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3018 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 499:
- #line 1801 "dhcp6_parser.yy" // lalr1.cc:859
+   case 496:
+ #line 1741 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2954 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3026 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 500:
- #line 1803 "dhcp6_parser.yy" // lalr1.cc:859
+   case 497:
+ #line 1743 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("generated-prefix", s);
      ctx.leave();
  }
 -#line 2964 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3036 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 501:
- #line 1811 "dhcp6_parser.yy" // lalr1.cc:859
+   case 498:
+ #line 1751 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2972 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3044 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 502:
- #line 1813 "dhcp6_parser.yy" // lalr1.cc:859
+   case 499:
+ #line 1753 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2981 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3053 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 503:
- #line 1818 "dhcp6_parser.yy" // lalr1.cc:859
+   case 500:
+ #line 1758 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 2989 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3061 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 504:
- #line 1820 "dhcp6_parser.yy" // lalr1.cc:859
+   case 501:
+ #line 1760 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 2998 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3070 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 505:
- #line 1825 "dhcp6_parser.yy" // lalr1.cc:859
+   case 502:
+ #line 1765 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 3006 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3078 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 506:
- #line 1827 "dhcp6_parser.yy" // lalr1.cc:859
+   case 503:
+ #line 1767 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ());
      ctx.leave();
  }
 -#line 3015 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3087 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 507:
- #line 1838 "dhcp6_parser.yy" // lalr1.cc:859
+   case 504:
+ #line 1778 "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 3026 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3098 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 508:
- #line 1843 "dhcp6_parser.yy" // lalr1.cc:859
+   case 505:
+ #line 1783 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 3035 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3107 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 512:
- #line 1860 "dhcp6_parser.yy" // lalr1.cc:859
+   case 509:
+ #line 1800 "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 3046 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3118 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 513:
- #line 1865 "dhcp6_parser.yy" // lalr1.cc:859
+   case 510:
+ #line 1805 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 3055 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3127 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 516:
- #line 1877 "dhcp6_parser.yy" // lalr1.cc:859
+   case 513:
+ #line 1817 "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 3065 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3137 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 517:
- #line 1881 "dhcp6_parser.yy" // lalr1.cc:859
+   case 514:
+ #line 1821 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
  }
 -#line 3073 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3145 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 525:
- #line 1896 "dhcp6_parser.yy" // lalr1.cc:859
+   case 522:
+ #line 1836 "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 3082 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3154 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 526:
- #line 1901 "dhcp6_parser.yy" // lalr1.cc:859
+   case 523:
+ #line 1841 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 3090 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3162 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 527:
- #line 1903 "dhcp6_parser.yy" // lalr1.cc:859
+   case 524:
+ #line 1843 "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 3100 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3172 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 528:
- #line 1909 "dhcp6_parser.yy" // lalr1.cc:859
+   case 525:
+ #line 1849 "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 3111 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3183 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 529:
- #line 1914 "dhcp6_parser.yy" // lalr1.cc:859
+   case 526:
+ #line 1854 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
      ctx.leave();
  }
 -#line 3120 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3192 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 532:
- #line 1923 "dhcp6_parser.yy" // lalr1.cc:859
+   case 529:
+ #line 1863 "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 3130 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3202 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 533:
- #line 1927 "dhcp6_parser.yy" // lalr1.cc:859
+   case 530:
+ #line 1867 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.stack_.pop_back();
  }
 -#line 3138 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3210 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 540:
- #line 1941 "dhcp6_parser.yy" // lalr1.cc:859
+   case 537:
+ #line 1881 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ctx.enter(ctx.NO_KEYWORD);
  }
 -#line 3146 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3218 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 541:
- #line 1943 "dhcp6_parser.yy" // lalr1.cc:859
+   case 538:
+ #line 1883 "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 3156 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3228 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 542:
- #line 1949 "dhcp6_parser.yy" // lalr1.cc:859
+   case 539:
+ #line 1889 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("flush", flush);
  }
 -#line 3165 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3237 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 543:
- #line 1954 "dhcp6_parser.yy" // lalr1.cc:859
+   case 540:
+ #line 1894 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("maxsize", maxsize);
  }
 -#line 3174 "dhcp6_parser.cc" // lalr1.cc:859
 +#line 3246 "dhcp6_parser.cc" // lalr1.cc:859
      break;
  
-   case 544:
- #line 1959 "dhcp6_parser.yy" // lalr1.cc:859
+   case 541:
+ #line 1899 "dhcp6_parser.yy" // lalr1.cc:859
      {
      ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
      ctx.stack_.back()->set("maxver", maxver);
    {
         0,     2,     0,     3,     0,     3,     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,     1,     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,     1,     0,     6,     0,     4,     1,     3,
 -       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
 +       0,     3,     0,     3,     0,     3,     0,     3,     1,     1,
 +       1,     1,     1,     1,     1,     1,     0,     4,     1,     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,     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,     3,     3,     3,     3,     3,     0,     6,     0,
 -       4,     1,     3,     1,     1,     0,     4,     3,     0,     6,
 +       1,     1,     1,     1,     3,     3,     3,     3,     3,     0,
 +       6,     0,     4,     1,     3,     1,     1,     0,     4,     3,
 +       0,     6,     0,     6,     1,     3,     1,     1,     1,     1,
 +       1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
 +       4,     1,     1,     1,     1,     0,     4,     0,     4,     0,
 +       4,     3,     0,     4,     3,     3,     3,     3,     0,     4,
 +       0,     4,     0,     6,     1,     3,     1,     1,     1,     1,
 +       0,     6,     1,     3,     1,     1,     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,     1,     1,     1,     1,     1,     1,
 -       1,     1,     1,     1,     1,     1,     1,     0,     4,     1,
 -       1,     1,     1,     0,     4,     0,     4,     0,     4,     3,
 -       0,     4,     3,     3,     3,     3,     0,     4,     0,     4,
 -       0,     6,     1,     3,     1,     1,     1,     1,     0,     6,
 -       1,     3,     1,     1,     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,     1,     1,     1,     1,     1,     1,     3,     3,
 -       3,     3,     3,     3,     0,     6,     0,     1,     1,     3,
 -       0,     4,     0,     4,     1,     3,     1,     1,     1,     1,
 +       3,     3,     3,     3,     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,     0,     4,     0,     4,     0,
-        4,     0,     4,     0,     4,     1,     1,     1,     3,     3,
-        0,     6,     0,     4,     0,     1,     1,     3,     0,     4,
-        0,     4,     0,     1,     1,     3,     1,     1,     1,     1,
-        1,     1,     1,     1,     1,     3,     1,     0,     4,     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,     1,     0,
-        4,     1,     1,     3,     3,     0,     6,     0,     1,     1,
-        3,     0,     4,     0,     4,     1,     3,     1,     1,     1,
-        1,     0,     4,     0,     4,     0,     6,     0,     1,     1,
-        3,     0,     4,     0,     4,     1,     3,     1,     1,     1,
-        1,     1,     1,     1,     1,     0,     4,     3,     0,     4,
+        1,     1,     1,     1,     0,     4,     0,     4,     0,     4,
+        0,     4,     0,     4,     1,     1,     1,     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,     0,     4,     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,     1,     0,     4,     1,     1,
         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,     0,     4,     0,     4,     0,
-        4,     0,     4,     0,     4,     0,     4,     0,     4,     0,
-        6,     0,     4,     0,     6,     1,     3,     0,     4,     0,
-        1,     1,     3,     1,     1,     1,     1,     1,     0,     4,
-        0,     6,     1,     3,     1,     1,     1,     1,     1,     1,
-        1,     0,     4,     1,     1,     1,     3,     0,     4,     3,
-        3,     3,     0,     6,     1,     3,     1,     1,     0,     4,
-        0,     4,     0,     6,     0,     4,     1,     3,     1,     1,
+        0,     4,     1,     3,     1,     1,     1,     1,     0,     4,
+        0,     4,     0,     6,     0,     1,     1,     3,     0,     4,
+        0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
+        1,     1,     0,     4,     3,     0,     4,     3,     3,     0,
+        6,     0,     1,     1,     3,     0,     4,     0,     4,     0,
+        1,     1,     3,     1,     1,     1,     1,     1,     1,     1,
+        1,     1,     0,     4,     0,     4,     0,     4,     0,     4,
+        0,     4,     0,     4,     0,     4,     0,     6,     0,     4,
+        0,     6,     1,     3,     0,     4,     0,     1,     1,     3,
+        1,     1,     1,     1,     1,     0,     4,     0,     6,     1,
+        3,     1,     1,     1,     1,     1,     1,     1,     0,     4,
+        1,     1,     1,     3,     0,     4,     3,     3,     3,     0,
+        6,     1,     3,     1,     1,     0,     4,     0,     4,     0,
+        6,     0,     4,     1,     3,     1,     1,     1,     1,     1,
         1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-        1,     1,     1,     3,     0,     4,     0,     4,     3,     0,
-        4,     3,     3,     0,     4,     1,     1,     0,     4,     3,
-        3,     3,     0,     4,     1,     1,     1,     1,     1,     0,
-        4,     0,     4,     0,     4,     0,     4,     0,     6,     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,     1,     1,     1,     1,
-        0,     4,     3,     3,     3
+        3,     0,     4,     0,     4,     3,     0,     4,     3,     3,
+        0,     4,     1,     1,     0,     4,     3,     3,     3,     0,
+        4,     1,     1,     1,     1,     1,     0,     4,     0,     4,
+        0,     4,     0,     4,     0,     6,     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,     1,     1,     1,     1,     0,     4,     3,
+        3,     3
    };
  
  
index 0484482f99065e953627f8dda1dfaa4ab05b40b5,af0fc18596eb57a5a666134c30e152091bd9ca9c..c601b009aa9a4ed0d946263478d83b77e28f54b6
@@@ -1425,12 -1420,12 +1425,12 @@@ namespace isc { namespace dhcp 
      enum
      {
        yyeof_ = 0,
-       yylast_ = 803,     ///< Last index in yytable_.
-       yynnts_ = 338,  ///< Number of nonterminal symbols.
-       yyfinal_ = 28, ///< Termination state number.
+       yylast_ = 805,     ///< Last index in yytable_.
+       yynnts_ = 335,  ///< Number of nonterminal symbols.
+       yyfinal_ = 26, ///< Termination state number.
        yyterror_ = 1,
        yyerrcode_ = 256,
 -      yyntokens_ = 153  ///< Number of tokens.
 +      yyntokens_ = 154  ///< Number of tokens.
      };
  
  
Simple merge