]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5020fd] Unspecialized raw/udp, added new syntactic context
authorFrancis Dupont <fdupont@isc.org>
Fri, 6 Jan 2017 23:37:37 +0000 (00:37 +0100)
committerTomek Mrugalski <tomasz@isc.org>
Mon, 9 Jan 2017 14:07:14 +0000 (15:07 +0100)
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/dhcp4/parser_context.cc
src/bin/dhcp4/parser_context.h

index f96e7d90f9cc22fe6ff9efbeff3a4e636ebb8c46..6f8a8296906864ab0c4dbb55d492c4e1ebd35f82 100644 (file)
@@ -1670,10 +1670,9 @@ case 15:
 YY_RULE_SETUP
 #line 199 "dhcp4_lexer.ll"
 {
-    std::cout << "RAW regexp" << std::endl;
     switch(driver.ctx_) {
-    case isc::dhcp::Parser4Context::INTERFACES_CONFIG:
-        return  isc::dhcp::Dhcp4Parser::make_DHCP_SOCKET_TYPE_RAW(driver.loc_);
+    case isc::dhcp::Parser4Context::DHCP_SOCKET_TYPE:
+        return  isc::dhcp::Dhcp4Parser::make_RAW(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("raw", driver.loc_);
     }
@@ -1683,10 +1682,9 @@ case 16:
 YY_RULE_SETUP
 #line 209 "dhcp4_lexer.ll"
 {
-    std::cout << "RAW regexp" << std::endl;
     switch(driver.ctx_) {
-    case isc::dhcp::Parser4Context::INTERFACES_CONFIG:
-        return  isc::dhcp::Dhcp4Parser::make_DHCP_SOCKET_TYPE_UDP(driver.loc_);
+    case isc::dhcp::Parser4Context::DHCP_SOCKET_TYPE:
+        return  isc::dhcp::Dhcp4Parser::make_UDP(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("udp", driver.loc_);
     }
index 695b453046732112aa29cdc21aafa631bbd51684..c98ed651d3dac7b4082348836cc4f53eedf11d15 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -197,20 +197,18 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
 }
 
 \"raw\" {
-    std::cout << "RAW regexp" << std::endl;
     switch(driver.ctx_) {
-    case isc::dhcp::Parser4Context::INTERFACES_CONFIG:
-        return  isc::dhcp::Dhcp4Parser::make_DHCP_SOCKET_TYPE_RAW(driver.loc_);
+    case isc::dhcp::Parser4Context::DHCP_SOCKET_TYPE:
+        return  isc::dhcp::Dhcp4Parser::make_RAW(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("raw", driver.loc_);
     }
 }
 
 \"udp\" {
-    std::cout << "RAW regexp" << std::endl;
     switch(driver.ctx_) {
-    case isc::dhcp::Parser4Context::INTERFACES_CONFIG:
-        return  isc::dhcp::Dhcp4Parser::make_DHCP_SOCKET_TYPE_UDP(driver.loc_);
+    case isc::dhcp::Parser4Context::DHCP_SOCKET_TYPE:
+        return  isc::dhcp::Dhcp4Parser::make_UDP(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("udp", driver.loc_);
     }
index aee62b96008414fe9b8fc41896fa57b8b3fc3b77..3982ab71b79fe8193367d8ff4fcea5330e7143c9 100644 (file)
@@ -254,6 +254,7 @@ namespace isc { namespace dhcp {
       switch (that.type_get ())
     {
       case 116: // value
+      case 155: // socket_type
         value.move< ElementPtr > (that.value);
         break;
 
@@ -289,6 +290,7 @@ namespace isc { namespace dhcp {
       switch (that.type_get ())
     {
       case 116: // value
+      case 155: // socket_type
         value.copy< ElementPtr > (that.value);
         break;
 
@@ -346,37 +348,44 @@ namespace isc { namespace dhcp {
     {
             case 100: // "constant string"
 
-#line 191 "dhcp4_parser.yy" // lalr1.cc:636
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< std::string > (); }
-#line 352 "dhcp4_parser.cc" // lalr1.cc:636
+#line 354 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
       case 101: // "integer"
 
-#line 191 "dhcp4_parser.yy" // lalr1.cc:636
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< int64_t > (); }
-#line 359 "dhcp4_parser.cc" // lalr1.cc:636
+#line 361 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
       case 102: // "floating point"
 
-#line 191 "dhcp4_parser.yy" // lalr1.cc:636
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< double > (); }
-#line 366 "dhcp4_parser.cc" // lalr1.cc:636
+#line 368 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
       case 103: // "boolean"
 
-#line 191 "dhcp4_parser.yy" // lalr1.cc:636
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< bool > (); }
-#line 373 "dhcp4_parser.cc" // lalr1.cc:636
+#line 375 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
       case 116: // value
 
-#line 191 "dhcp4_parser.yy" // lalr1.cc:636
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 380 "dhcp4_parser.cc" // lalr1.cc:636
+#line 382 "dhcp4_parser.cc" // lalr1.cc:636
+        break;
+
+      case 155: // socket_type
+
+#line 192 "dhcp4_parser.yy" // lalr1.cc:636
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 389 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
 
@@ -577,6 +586,7 @@ namespace isc { namespace dhcp {
         switch (yyr1_[yyn])
     {
       case 116: // value
+      case 155: // socket_type
         yylhs.value.build< ElementPtr > ();
         break;
 
@@ -614,242 +624,242 @@ namespace isc { namespace dhcp {
           switch (yyn)
             {
   case 2:
-#line 200 "dhcp4_parser.yy" // lalr1.cc:859
+#line 201 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.NO_KEYWORD; }
-#line 620 "dhcp4_parser.cc" // lalr1.cc:859
+#line 630 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 4:
-#line 201 "dhcp4_parser.yy" // lalr1.cc:859
+#line 202 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.CONFIG; }
-#line 626 "dhcp4_parser.cc" // lalr1.cc:859
+#line 636 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 6:
-#line 202 "dhcp4_parser.yy" // lalr1.cc:859
+#line 203 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DHCP4; }
-#line 632 "dhcp4_parser.cc" // lalr1.cc:859
+#line 642 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 8:
-#line 203 "dhcp4_parser.yy" // lalr1.cc:859
+#line 204 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.INTERFACES_CONFIG; }
-#line 638 "dhcp4_parser.cc" // lalr1.cc:859
+#line 648 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 10:
-#line 204 "dhcp4_parser.yy" // lalr1.cc:859
+#line 205 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.SUBNET4; }
-#line 644 "dhcp4_parser.cc" // lalr1.cc:859
+#line 654 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 12:
-#line 205 "dhcp4_parser.yy" // lalr1.cc:859
+#line 206 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.POOLS; }
-#line 650 "dhcp4_parser.cc" // lalr1.cc:859
+#line 660 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 14:
-#line 206 "dhcp4_parser.yy" // lalr1.cc:859
+#line 207 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.RESERVATIONS; }
-#line 656 "dhcp4_parser.cc" // lalr1.cc:859
+#line 666 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 16:
-#line 207 "dhcp4_parser.yy" // lalr1.cc:859
+#line 208 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.OPTION_DEF; }
-#line 662 "dhcp4_parser.cc" // lalr1.cc:859
+#line 672 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 18:
-#line 208 "dhcp4_parser.yy" // lalr1.cc:859
+#line 209 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.OPTION_DATA; }
-#line 668 "dhcp4_parser.cc" // lalr1.cc:859
+#line 678 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 20:
-#line 209 "dhcp4_parser.yy" // lalr1.cc:859
+#line 210 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.HOOKS_LIBRARIES; }
-#line 674 "dhcp4_parser.cc" // lalr1.cc:859
+#line 684 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 22:
-#line 217 "dhcp4_parser.yy" // lalr1.cc:859
+#line 218 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 680 "dhcp4_parser.cc" // lalr1.cc:859
+#line 690 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 23:
-#line 218 "dhcp4_parser.yy" // lalr1.cc:859
+#line 219 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 686 "dhcp4_parser.cc" // lalr1.cc:859
+#line 696 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 24:
-#line 219 "dhcp4_parser.yy" // lalr1.cc:859
+#line 220 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 692 "dhcp4_parser.cc" // lalr1.cc:859
+#line 702 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 25:
-#line 220 "dhcp4_parser.yy" // lalr1.cc:859
+#line 221 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 698 "dhcp4_parser.cc" // lalr1.cc:859
+#line 708 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 26:
-#line 221 "dhcp4_parser.yy" // lalr1.cc:859
+#line 222 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 704 "dhcp4_parser.cc" // lalr1.cc:859
+#line 714 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 27:
-#line 222 "dhcp4_parser.yy" // lalr1.cc:859
+#line 223 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 710 "dhcp4_parser.cc" // lalr1.cc:859
+#line 720 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 28:
-#line 223 "dhcp4_parser.yy" // lalr1.cc:859
+#line 224 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 716 "dhcp4_parser.cc" // lalr1.cc:859
+#line 726 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 29:
-#line 226 "dhcp4_parser.yy" // lalr1.cc:859
+#line 227 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Push back the JSON value on the stack
     ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 725 "dhcp4_parser.cc" // lalr1.cc:859
+#line 735 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 30:
-#line 231 "dhcp4_parser.yy" // lalr1.cc:859
+#line 232 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 736 "dhcp4_parser.cc" // lalr1.cc:859
+#line 746 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 31:
-#line 236 "dhcp4_parser.yy" // lalr1.cc:859
+#line 237 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 746 "dhcp4_parser.cc" // lalr1.cc:859
+#line 756 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 34:
-#line 247 "dhcp4_parser.yy" // lalr1.cc:859
+#line 248 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // map containing a single entry
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 755 "dhcp4_parser.cc" // lalr1.cc:859
+#line 765 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 35:
-#line 251 "dhcp4_parser.yy" // lalr1.cc:859
+#line 252 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 765 "dhcp4_parser.cc" // lalr1.cc:859
+#line 775 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 36:
-#line 258 "dhcp4_parser.yy" // lalr1.cc:859
+#line 259 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 774 "dhcp4_parser.cc" // lalr1.cc:859
+#line 784 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 37:
-#line 261 "dhcp4_parser.yy" // lalr1.cc:859
+#line 262 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
 }
-#line 782 "dhcp4_parser.cc" // lalr1.cc:859
+#line 792 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 38:
-#line 266 "dhcp4_parser.yy" // lalr1.cc:859
+#line 267 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // List parsing about to start
 }
-#line 790 "dhcp4_parser.cc" // lalr1.cc:859
+#line 800 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 39:
-#line 268 "dhcp4_parser.yy" // lalr1.cc:859
+#line 269 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
     //ctx.stack_.pop_back();
 }
-#line 799 "dhcp4_parser.cc" // lalr1.cc:859
+#line 809 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 42:
-#line 277 "dhcp4_parser.yy" // lalr1.cc:859
+#line 278 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // List consisting of a single element.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 808 "dhcp4_parser.cc" // lalr1.cc:859
+#line 818 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 43:
-#line 281 "dhcp4_parser.yy" // lalr1.cc:859
+#line 282 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // List ending with , and a value.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 817 "dhcp4_parser.cc" // lalr1.cc:859
+#line 827 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 44:
-#line 292 "dhcp4_parser.yy" // lalr1.cc:859
+#line 293 "dhcp4_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 828 "dhcp4_parser.cc" // lalr1.cc:859
+#line 838 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 45:
-#line 302 "dhcp4_parser.yy" // lalr1.cc:859
+#line 303 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 839 "dhcp4_parser.cc" // lalr1.cc:859
+#line 849 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 46:
-#line 307 "dhcp4_parser.yy" // lalr1.cc:859
+#line 308 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 849 "dhcp4_parser.cc" // lalr1.cc:859
+#line 859 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 54:
-#line 326 "dhcp4_parser.yy" // lalr1.cc:859
+#line 327 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
@@ -858,11 +868,11 @@ namespace isc { namespace dhcp {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP4);
 }
-#line 862 "dhcp4_parser.cc" // lalr1.cc:859
+#line 872 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 55:
-#line 333 "dhcp4_parser.yy" // lalr1.cc:859
+#line 334 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
@@ -870,522 +880,533 @@ namespace isc { namespace dhcp {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 874 "dhcp4_parser.cc" // lalr1.cc:859
+#line 884 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 56:
-#line 343 "dhcp4_parser.yy" // lalr1.cc:859
+#line 344 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the Dhcp4 map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 884 "dhcp4_parser.cc" // lalr1.cc:859
+#line 894 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 57:
-#line 347 "dhcp4_parser.yy" // lalr1.cc:859
+#line 348 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 892 "dhcp4_parser.cc" // lalr1.cc:859
+#line 902 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 82:
-#line 381 "dhcp4_parser.yy" // lalr1.cc:859
+#line 382 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("valid-lifetime", prf);
 }
-#line 901 "dhcp4_parser.cc" // lalr1.cc:859
+#line 911 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 83:
-#line 386 "dhcp4_parser.yy" // lalr1.cc:859
+#line 387 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("renew-timer", prf);
 }
-#line 910 "dhcp4_parser.cc" // lalr1.cc:859
+#line 920 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 84:
-#line 391 "dhcp4_parser.yy" // lalr1.cc:859
+#line 392 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rebind-timer", prf);
 }
-#line 919 "dhcp4_parser.cc" // lalr1.cc:859
+#line 929 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 85:
-#line 396 "dhcp4_parser.yy" // lalr1.cc:859
+#line 397 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
 }
-#line 928 "dhcp4_parser.cc" // lalr1.cc:859
+#line 938 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 86:
-#line 401 "dhcp4_parser.yy" // lalr1.cc:859
+#line 402 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("echo-client-id", echo);
 }
-#line 937 "dhcp4_parser.cc" // lalr1.cc:859
+#line 947 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 87:
-#line 406 "dhcp4_parser.yy" // lalr1.cc:859
+#line 407 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("match-client-id", match);
 }
-#line 946 "dhcp4_parser.cc" // lalr1.cc:859
+#line 956 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 88:
-#line 412 "dhcp4_parser.yy" // lalr1.cc:859
+#line 413 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces-config", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.INTERFACES_CONFIG);
 }
-#line 957 "dhcp4_parser.cc" // lalr1.cc:859
+#line 967 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 89:
-#line 417 "dhcp4_parser.yy" // lalr1.cc:859
+#line 418 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 966 "dhcp4_parser.cc" // lalr1.cc:859
+#line 976 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 94:
-#line 430 "dhcp4_parser.yy" // lalr1.cc:859
+#line 431 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the interfaces-config map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 976 "dhcp4_parser.cc" // lalr1.cc:859
+#line 986 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 95:
-#line 434 "dhcp4_parser.yy" // lalr1.cc:859
+#line 435 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 984 "dhcp4_parser.cc" // lalr1.cc:859
+#line 994 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 96:
-#line 438 "dhcp4_parser.yy" // lalr1.cc:859
+#line 439 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 995 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1005 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 97:
-#line 443 "dhcp4_parser.yy" // lalr1.cc:859
+#line 444 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1004 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1014 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 100:
-#line 452 "dhcp4_parser.yy" // lalr1.cc:859
+  case 98:
+#line 449 "dhcp4_parser.yy" // lalr1.cc:859
     {
-    ElementPtr type(new StringElement("raw", ctx.loc2pos(yystack_[0].location)));
-    ctx.stack_.back()->set("dhcp-socket-type", type);
+    ctx.enter(ctx.DHCP_SOCKET_TYPE);
 }
-#line 1013 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1022 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 101:
-#line 457 "dhcp4_parser.yy" // lalr1.cc:859
+  case 99:
+#line 451 "dhcp4_parser.yy" // lalr1.cc:859
     {
-    ElementPtr type(new StringElement("udp", ctx.loc2pos(yystack_[0].location)));
-    ctx.stack_.back()->set("dhcp-socket-type", type);
+    ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ());
+    ctx.leave();
 }
-#line 1022 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1031 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 100:
+#line 456 "dhcp4_parser.yy" // lalr1.cc:859
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); }
+#line 1037 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 101:
+#line 457 "dhcp4_parser.yy" // lalr1.cc:859
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); }
+#line 1043 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 102:
-#line 462 "dhcp4_parser.yy" // lalr1.cc:859
+#line 460 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lease-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.LEASE_DATABASE);
 }
-#line 1033 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1054 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 103:
-#line 467 "dhcp4_parser.yy" // lalr1.cc:859
+#line 465 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1042 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1063 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 104:
-#line 472 "dhcp4_parser.yy" // lalr1.cc:859
+#line 470 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1053 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1074 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 105:
-#line 477 "dhcp4_parser.yy" // lalr1.cc:859
+#line 475 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1062 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1083 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 117:
-#line 497 "dhcp4_parser.yy" // lalr1.cc:859
+#line 495 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1070 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1091 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 118:
-#line 499 "dhcp4_parser.yy" // lalr1.cc:859
+#line 497 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("type", prf);
     ctx.leave();
 }
-#line 1080 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1101 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 119:
-#line 505 "dhcp4_parser.yy" // lalr1.cc:859
+#line 503 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1088 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1109 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 120:
-#line 507 "dhcp4_parser.yy" // lalr1.cc:859
+#line 505 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user", user);
     ctx.leave();
 }
-#line 1098 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1119 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 121:
-#line 513 "dhcp4_parser.yy" // lalr1.cc:859
+#line 511 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1106 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1127 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 122:
-#line 515 "dhcp4_parser.yy" // lalr1.cc:859
+#line 513 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password", pwd);
     ctx.leave();
 }
-#line 1116 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1137 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 123:
-#line 521 "dhcp4_parser.yy" // lalr1.cc:859
+#line 519 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1124 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1145 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 124:
-#line 523 "dhcp4_parser.yy" // lalr1.cc:859
+#line 521 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host", h);
     ctx.leave();
 }
-#line 1134 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1155 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 125:
-#line 529 "dhcp4_parser.yy" // lalr1.cc:859
+#line 527 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1142 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1163 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 126:
-#line 531 "dhcp4_parser.yy" // lalr1.cc:859
+#line 529 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1152 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1173 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 127:
-#line 537 "dhcp4_parser.yy" // lalr1.cc:859
+#line 535 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("persist", n);
 }
-#line 1161 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1182 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 128:
-#line 542 "dhcp4_parser.yy" // lalr1.cc:859
+#line 540 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lfc-interval", n);
 }
-#line 1170 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1191 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 129:
-#line 547 "dhcp4_parser.yy" // lalr1.cc:859
+#line 545 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("readonly", n);
 }
-#line 1179 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1200 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 130:
-#line 552 "dhcp4_parser.yy" // lalr1.cc:859
+#line 550 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1188 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1209 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 131:
-#line 557 "dhcp4_parser.yy" // lalr1.cc:859
+#line 555 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host-reservation-identifiers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS);
 }
-#line 1199 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1220 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 132:
-#line 562 "dhcp4_parser.yy" // lalr1.cc:859
+#line 560 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1208 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1229 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 139:
-#line 577 "dhcp4_parser.yy" // lalr1.cc:859
+#line 575 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(hwaddr);
 }
-#line 1217 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1238 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 140:
-#line 582 "dhcp4_parser.yy" // lalr1.cc:859
+#line 580 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(circuit);
 }
-#line 1226 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1247 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 141:
-#line 587 "dhcp4_parser.yy" // lalr1.cc:859
+#line 585 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(client);
 }
-#line 1235 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1256 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 142:
-#line 592 "dhcp4_parser.yy" // lalr1.cc:859
+#line 590 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hooks-libraries", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOOKS_LIBRARIES);
 }
-#line 1246 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1267 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 143:
-#line 597 "dhcp4_parser.yy" // lalr1.cc:859
+#line 595 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1255 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1276 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 148:
-#line 610 "dhcp4_parser.yy" // lalr1.cc:859
+#line 608 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1265 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1286 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 149:
-#line 614 "dhcp4_parser.yy" // lalr1.cc:859
+#line 612 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1273 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1294 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 150:
-#line 618 "dhcp4_parser.yy" // lalr1.cc:859
+#line 616 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the hooks-libraries list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1283 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1304 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 151:
-#line 622 "dhcp4_parser.yy" // lalr1.cc:859
+#line 620 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1291 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1312 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 157:
-#line 635 "dhcp4_parser.yy" // lalr1.cc:859
+#line 633 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1299 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1320 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 158:
-#line 637 "dhcp4_parser.yy" // lalr1.cc:859
+#line 635 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1309 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1330 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 159:
-#line 643 "dhcp4_parser.yy" // lalr1.cc:859
+#line 641 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1317 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1338 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 160:
-#line 645 "dhcp4_parser.yy" // lalr1.cc:859
+#line 643 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1326 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1347 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 161:
-#line 651 "dhcp4_parser.yy" // lalr1.cc:859
+#line 649 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("expired-leases-processing", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1337 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1358 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 162:
-#line 656 "dhcp4_parser.yy" // lalr1.cc:859
+#line 654 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1346 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1367 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 165:
-#line 668 "dhcp4_parser.yy" // lalr1.cc:859
+#line 666 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), value);
 }
-#line 1355 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1376 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 166:
-#line 676 "dhcp4_parser.yy" // lalr1.cc:859
+#line 674 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet4", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SUBNET4);
 }
-#line 1366 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1387 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 167:
-#line 681 "dhcp4_parser.yy" // lalr1.cc:859
+#line 679 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1375 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1396 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 172:
-#line 701 "dhcp4_parser.yy" // lalr1.cc:859
+#line 699 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1385 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1406 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 173:
-#line 705 "dhcp4_parser.yy" // lalr1.cc:859
+#line 703 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Once we reached this place, the subnet parsing is now complete.
     // If we want to, we can implement default values here.
@@ -1404,1133 +1425,1133 @@ namespace isc { namespace dhcp {
     // }
     ctx.stack_.pop_back();
 }
-#line 1408 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1429 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 174:
-#line 724 "dhcp4_parser.yy" // lalr1.cc:859
+#line 722 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the subnet4 list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1418 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1439 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 175:
-#line 728 "dhcp4_parser.yy" // lalr1.cc:859
+#line 726 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1426 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1447 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 198:
-#line 760 "dhcp4_parser.yy" // lalr1.cc:859
+#line 758 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1434 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1455 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 199:
-#line 762 "dhcp4_parser.yy" // lalr1.cc:859
+#line 760 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet", subnet);
     ctx.leave();
 }
-#line 1444 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1465 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 200:
-#line 768 "dhcp4_parser.yy" // lalr1.cc:859
+#line 766 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1452 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1473 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 201:
-#line 770 "dhcp4_parser.yy" // lalr1.cc:859
+#line 768 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface", iface);
     ctx.leave();
 }
-#line 1462 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1483 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 202:
-#line 776 "dhcp4_parser.yy" // lalr1.cc:859
+#line 774 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1470 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1491 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 203:
-#line 778 "dhcp4_parser.yy" // lalr1.cc:859
+#line 776 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface-id", iface);
     ctx.leave();
 }
-#line 1480 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1501 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 204:
-#line 784 "dhcp4_parser.yy" // lalr1.cc:859
+#line 782 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1488 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1509 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 205:
-#line 786 "dhcp4_parser.yy" // lalr1.cc:859
+#line 784 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-subnet", iface);
     ctx.leave();
 }
-#line 1498 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1519 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 206:
-#line 792 "dhcp4_parser.yy" // lalr1.cc:859
+#line 790 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1506 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1527 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 207:
-#line 794 "dhcp4_parser.yy" // lalr1.cc:859
+#line 792 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface", iface);
     ctx.leave();
 }
-#line 1516 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1537 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 208:
-#line 800 "dhcp4_parser.yy" // lalr1.cc:859
+#line 798 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1524 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1545 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 209:
-#line 802 "dhcp4_parser.yy" // lalr1.cc:859
+#line 800 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface-id", iface);
     ctx.leave();
 }
-#line 1534 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1555 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 210:
-#line 808 "dhcp4_parser.yy" // lalr1.cc:859
+#line 806 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.CLIENT_CLASS);
 }
-#line 1542 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1563 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 211:
-#line 810 "dhcp4_parser.yy" // lalr1.cc:859
+#line 808 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-class", cls);
     ctx.leave();
 }
-#line 1552 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1573 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 212:
-#line 816 "dhcp4_parser.yy" // lalr1.cc:859
+#line 814 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1560 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1581 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 213:
-#line 818 "dhcp4_parser.yy" // lalr1.cc:859
+#line 816 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rm(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservation-mode", rm);
     ctx.leave();
 }
-#line 1570 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1591 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 214:
-#line 824 "dhcp4_parser.yy" // lalr1.cc:859
+#line 822 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("id", id);
 }
-#line 1579 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1600 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 215:
-#line 829 "dhcp4_parser.yy" // lalr1.cc:859
+#line 827 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rapid-commit", rc);
 }
-#line 1588 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1609 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 216:
-#line 838 "dhcp4_parser.yy" // lalr1.cc:859
+#line 836 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-def", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DEF);
 }
-#line 1599 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1620 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 217:
-#line 843 "dhcp4_parser.yy" // lalr1.cc:859
+#line 841 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1608 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1629 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 222:
-#line 860 "dhcp4_parser.yy" // lalr1.cc:859
+#line 858 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1618 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1639 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 223:
-#line 864 "dhcp4_parser.yy" // lalr1.cc:859
+#line 862 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1626 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1647 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 224:
-#line 871 "dhcp4_parser.yy" // lalr1.cc:859
+#line 869 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-def list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1636 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1657 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 225:
-#line 875 "dhcp4_parser.yy" // lalr1.cc:859
+#line 873 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1644 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1665 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 239:
-#line 901 "dhcp4_parser.yy" // lalr1.cc:859
+#line 899 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("code", code);
 }
-#line 1653 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1674 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 242:
-#line 910 "dhcp4_parser.yy" // lalr1.cc:859
+#line 908 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1661 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1682 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 243:
-#line 912 "dhcp4_parser.yy" // lalr1.cc:859
+#line 910 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("record-types", rtypes);
     ctx.leave();
 }
-#line 1671 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1692 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 244:
-#line 918 "dhcp4_parser.yy" // lalr1.cc:859
+#line 916 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1679 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1700 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 245:
-#line 920 "dhcp4_parser.yy" // lalr1.cc:859
+#line 918 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("space", space);
     ctx.leave();
 }
-#line 1689 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1710 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 247:
-#line 928 "dhcp4_parser.yy" // lalr1.cc:859
+#line 926 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1697 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1718 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 248:
-#line 930 "dhcp4_parser.yy" // lalr1.cc:859
+#line 928 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("encapsulate", encap);
     ctx.leave();
 }
-#line 1707 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1728 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 249:
-#line 936 "dhcp4_parser.yy" // lalr1.cc:859
+#line 934 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("array", array);
 }
-#line 1716 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1737 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 250:
-#line 945 "dhcp4_parser.yy" // lalr1.cc:859
+#line 943 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-data", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DATA);
 }
-#line 1727 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1748 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 251:
-#line 950 "dhcp4_parser.yy" // lalr1.cc:859
+#line 948 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1736 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1757 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 256:
-#line 969 "dhcp4_parser.yy" // lalr1.cc:859
+#line 967 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1746 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1767 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 257:
-#line 973 "dhcp4_parser.yy" // lalr1.cc:859
+#line 971 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1754 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1775 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 258:
-#line 980 "dhcp4_parser.yy" // lalr1.cc:859
+#line 978 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-data list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1764 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1785 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 259:
-#line 984 "dhcp4_parser.yy" // lalr1.cc:859
+#line 982 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1772 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1793 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 271:
-#line 1013 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1011 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1780 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1801 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 272:
-#line 1015 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1013 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data", data);
     ctx.leave();
 }
-#line 1790 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1811 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 275:
-#line 1025 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1023 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("csv-format", space);
 }
-#line 1799 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1820 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 276:
-#line 1033 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1031 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.POOLS);
 }
-#line 1810 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1831 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 277:
-#line 1038 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1036 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1819 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1840 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 282:
-#line 1053 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1051 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1829 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1850 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 283:
-#line 1057 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1055 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1837 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1858 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 284:
-#line 1061 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1059 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1847 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1868 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 285:
-#line 1065 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1063 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1855 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1876 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 291:
-#line 1078 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1076 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1863 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1884 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 292:
-#line 1080 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1078 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pool", pool);
     ctx.leave();
 }
-#line 1873 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1894 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 293:
-#line 1089 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1087 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservations", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.RESERVATIONS);
 }
-#line 1884 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1905 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 294:
-#line 1094 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1092 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1893 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1914 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 299:
-#line 1107 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1105 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1903 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1924 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 300:
-#line 1111 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1109 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 1911 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1932 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 301:
-#line 1115 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1113 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1921 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1942 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 302:
-#line 1119 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1117 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 1929 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1950 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 319:
-#line 1146 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1144 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1937 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1958 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 320:
-#line 1148 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1146 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("next-server", next_server);
     ctx.leave();
 }
-#line 1947 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1968 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 321:
-#line 1154 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1152 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1955 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1976 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 322:
-#line 1156 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1154 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-hostname", srv);
     ctx.leave();
 }
-#line 1965 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1986 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 323:
-#line 1162 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1160 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1973 "dhcp4_parser.cc" // lalr1.cc:859
+#line 1994 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 324:
-#line 1164 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1162 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("boot-file-name", bootfile);
     ctx.leave();
 }
-#line 1983 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2004 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 325:
-#line 1170 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1168 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1991 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2012 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 326:
-#line 1172 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1170 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", addr);
     ctx.leave();
 }
-#line 2001 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2022 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 327:
-#line 1178 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1176 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2009 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2030 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 328:
-#line 1180 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1178 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("duid", d);
     ctx.leave();
 }
-#line 2019 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2040 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 329:
-#line 1186 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1184 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2027 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2048 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 330:
-#line 1188 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1186 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hw-address", hw);
     ctx.leave();
 }
-#line 2037 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2058 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 331:
-#line 1194 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1192 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2045 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2066 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 332:
-#line 1196 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1194 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-id", hw);
     ctx.leave();
 }
-#line 2055 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2076 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 333:
-#line 1202 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1200 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2063 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2084 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 334:
-#line 1204 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1202 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("circuit-id", hw);
     ctx.leave();
 }
-#line 2073 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2094 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 335:
-#line 1211 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1209 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2081 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2102 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 336:
-#line 1213 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1211 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname", host);
     ctx.leave();
 }
-#line 2091 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2112 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 337:
-#line 1219 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1217 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2102 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2123 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 338:
-#line 1224 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1222 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2111 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2132 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 339:
-#line 1232 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1230 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.RELAY);
 }
-#line 2122 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2143 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 340:
-#line 1237 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1235 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2131 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2152 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 341:
-#line 1242 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1240 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2139 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2160 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 342:
-#line 1244 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1242 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", ip);
     ctx.leave();
 }
-#line 2149 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2170 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 343:
-#line 1253 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1251 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CLIENT_CLASSES);
 }
-#line 2160 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2181 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 344:
-#line 1258 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1256 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2169 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2190 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 347:
-#line 1267 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1265 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2179 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2200 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 348:
-#line 1271 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1269 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2187 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2208 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 361:
-#line 1294 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1292 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2195 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2216 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 362:
-#line 1296 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1294 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("test", test);
     ctx.leave();
 }
-#line 2205 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2226 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 363:
-#line 1305 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1303 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-id", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER_ID);
 }
-#line 2216 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2237 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 364:
-#line 1310 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1308 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2225 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2246 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 374:
-#line 1328 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1326 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("htype", htype);
 }
-#line 2234 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2255 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 375:
-#line 1333 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1331 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2242 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2263 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 376:
-#line 1335 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1333 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("identifier", id);
     ctx.leave();
 }
-#line 2252 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2273 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 377:
-#line 1341 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1339 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("time", time);
 }
-#line 2261 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2282 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 378:
-#line 1346 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1344 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("enterprise-id", time);
 }
-#line 2270 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2291 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 379:
-#line 1353 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1351 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp4o6-port", time);
 }
-#line 2279 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2300 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 380:
-#line 1360 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1358 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("control-socket", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKET);
 }
-#line 2290 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2311 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 381:
-#line 1365 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1363 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2299 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2320 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 386:
-#line 1378 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1376 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2307 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2328 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 387:
-#line 1380 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1378 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-type", stype);
     ctx.leave();
 }
-#line 2317 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2338 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 388:
-#line 1386 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1384 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2325 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2346 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 389:
-#line 1388 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1386 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
     ctx.leave();
 }
-#line 2335 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2356 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 390:
-#line 1396 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1394 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2346 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2367 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 391:
-#line 1401 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1399 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2355 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2376 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 392:
-#line 1408 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1406 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2363 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2384 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 393:
-#line 1410 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1408 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2372 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2393 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 394:
-#line 1415 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1413 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2380 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2401 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 395:
-#line 1417 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1415 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2389 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2410 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 396:
-#line 1427 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1425 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 2400 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2421 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 397:
-#line 1432 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1430 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2409 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2430 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 401:
-#line 1449 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1447 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 2420 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2441 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 402:
-#line 1454 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1452 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2429 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2450 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 405:
-#line 1466 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1464 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 2439 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2460 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 406:
-#line 1470 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1468 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2447 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2468 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 414:
-#line 1485 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1483 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 2456 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2477 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 415:
-#line 1489 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1487 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2464 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2485 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 416:
-#line 1491 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1489 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 2474 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2495 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 417:
-#line 1497 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1495 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 2485 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2506 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 418:
-#line 1502 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1500 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2494 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2515 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 421:
-#line 1511 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1509 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2504 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2525 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 422:
-#line 1515 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1513 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2512 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2533 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 425:
-#line 1523 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1521 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2520 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2541 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 426:
-#line 1525 "dhcp4_parser.yy" // lalr1.cc:859
+#line 1523 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 2530 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2551 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 2534 "dhcp4_parser.cc" // lalr1.cc:859
+#line 2555 "dhcp4_parser.cc" // lalr1.cc:859
             default:
               break;
             }
@@ -2785,84 +2806,84 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short int Dhcp4Parser::yypact_ninf_ = -414;
+  const short int Dhcp4Parser::yypact_ninf_ = -411;
 
   const signed char Dhcp4Parser::yytable_ninf_ = -1;
 
   const short int
   Dhcp4Parser::yypact_[] =
   {
-     187,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,    33,    20,    34,    53,    69,    75,    92,   100,   104,
-     110,   130,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,    20,   -69,    24,    70,   163,    19,    -7,    96,
-     126,    54,   -23,  -414,   146,    36,   152,   200,   211,  -414,
-    -414,  -414,  -414,   218,  -414,    32,  -414,  -414,  -414,  -414,
-    -414,  -414,   223,   227,  -414,  -414,  -414,   228,   229,   230,
-     232,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,   233,
-    -414,  -414,  -414,    45,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,   234,    49,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,   237,   239,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,    58,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,    60,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,   236,   243,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,   246,  -414,  -414,  -414,   247,  -414,  -414,  -414,
-     252,   251,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,   257,  -414,  -414,  -414,  -414,   254,   260,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,    72,
-    -414,  -414,  -414,  -414,    20,    20,  -414,   167,   265,   267,
-     269,   270,  -414,    24,  -414,   271,   184,   185,   285,   286,
-     287,   154,   191,   193,   194,   289,   292,   293,   294,   295,
-     296,   297,   298,   202,   300,   301,    70,  -414,   302,   169,
-     163,  -414,    25,   303,   304,   305,   306,   307,   308,   309,
-     213,   212,   312,   313,   314,   315,    19,  -414,   316,    -7,
-    -414,   317,   318,   319,   320,   321,   322,   323,   324,   325,
-    -414,    96,   326,   327,   231,   329,   330,   331,   238,  -414,
-     126,   332,   240,  -414,    54,   335,   336,   155,  -414,  -414,
-    -414,   338,   337,   339,    20,    20,  -414,   340,  -414,  -414,
-     245,   341,   342,  -414,  -414,  -414,  -414,   345,   346,   347,
-     348,   349,   350,   351,   352,  -414,   353,   354,  -414,   357,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-     358,   362,  -414,  -414,  -414,   256,   272,   273,   365,   274,
-     275,   276,  -414,  -414,   278,   280,   366,   360,  -414,   281,
-    -414,   282,   283,   357,   288,   290,   299,   310,   311,   328,
-    -414,   333,   334,  -414,   343,   344,   355,  -414,  -414,   356,
-    -414,  -414,   359,    20,  -414,    20,    70,   363,  -414,  -414,
-     163,  -414,   105,   105,   378,   379,   380,   157,    31,   382,
-     361,   113,   150,   -69,  -414,  -414,   388,  -414,    25,  -414,
-    -414,  -414,   386,  -414,  -414,  -414,  -414,  -414,   387,   364,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,    81,
-    -414,   102,  -414,  -414,   136,  -414,  -414,  -414,   392,   393,
-     394,  -414,   147,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,   182,  -414,   395,   397,  -414,  -414,   396,   400,
-    -414,  -414,   398,   402,  -414,  -414,  -414,  -414,  -414,  -414,
-      56,  -414,  -414,  -414,  -414,  -414,   140,  -414,   401,   403,
-    -414,   404,   189,  -414,  -414,   405,   408,   409,  -414,  -414,
-    -414,   192,  -414,  -414,  -414,  -414,  -414,  -414,  -414,   195,
-    -414,  -414,  -414,   198,    20,   367,  -414,  -414,   411,   412,
-    -414,  -414,   413,   417,  -414,  -414,   406,  -414,   418,   363,
-    -414,  -414,   419,   420,   421,   368,   369,   370,   105,  -414,
-    -414,    19,  -414,   378,   126,  -414,   379,    54,  -414,   380,
-     157,  -414,    31,  -414,   -23,  -414,   382,   371,   361,  -414,
-     422,   373,   374,   375,   113,  -414,   423,   425,   150,  -414,
-    -414,   415,  -414,    -7,  -414,   386,    96,  -414,   387,   426,
-    -414,   427,  -414,   377,   381,   383,  -414,  -414,  -414,  -414,
-     199,  -414,   428,  -414,   429,  -414,  -414,  -414,   201,  -414,
-    -414,  -414,   384,  -414,  -414,  -414,  -414,   385,   389,  -414,
-    -414,   207,  -414,   430,  -414,   390,   432,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,   171,  -414,    78,   432,  -414,  -414,   431,  -414,  -414,
-    -414,   208,  -414,  -414,  -414,  -414,  -414,   436,   391,   437,
-      78,  -414,   440,  -414,   399,  -414,   435,  -414,  -414,   188,
-    -414,   372,   435,  -414,  -414,   209,  -414,  -414,   443,   372,
-    -414,   407,  -414,  -414
+     108,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,    37,    20,    25,    40,    64,    66,    73,    79,   110,
+     118,   139,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,    20,    53,    18,    71,   219,    24,    -3,    93,
+     122,     8,    29,  -411,   153,   160,   204,   228,   236,  -411,
+    -411,  -411,  -411,   240,  -411,    31,  -411,  -411,  -411,  -411,
+    -411,  -411,   244,   245,  -411,  -411,  -411,   248,   249,   254,
+     255,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   256,
+    -411,  -411,  -411,    32,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,    35,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+     257,   261,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,    50,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,    54,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,   259,   266,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+     267,  -411,  -411,  -411,   268,  -411,  -411,  -411,   265,   272,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,   273,  -411,  -411,  -411,  -411,   270,   276,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,   111,  -411,  -411,
+    -411,  -411,    20,    20,  -411,   176,   277,   278,   279,   280,
+    -411,    18,  -411,   281,   177,   183,   283,   284,   285,   190,
+     191,   192,   193,   286,   291,   292,   293,   294,   295,   296,
+     297,   201,   299,   300,    71,  -411,   301,   302,   219,  -411,
+      76,   303,   304,   305,   306,   307,   308,   309,   213,   212,
+     312,   313,   314,   315,    24,  -411,   316,    -3,  -411,   317,
+     318,   319,   320,   321,   322,   323,   324,   325,  -411,    93,
+     326,   327,   231,   329,   330,   333,   235,  -411,   122,   335,
+     237,  -411,     8,   337,   338,   -25,  -411,  -411,  -411,   339,
+     340,   341,    20,    20,  -411,   342,  -411,  -411,   246,   343,
+     344,  -411,  -411,  -411,  -411,   347,   348,   349,   350,   351,
+     352,   355,   356,  -411,   357,   360,  -411,   353,   220,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,   336,   365,  -411,
+    -411,  -411,   269,   271,   275,   354,   282,   287,   288,  -411,
+    -411,   289,   290,   367,   363,  -411,   298,  -411,   310,   311,
+     353,   328,   331,   332,   334,   345,   346,  -411,   358,   359,
+    -411,   361,   362,   364,  -411,  -411,   366,  -411,  -411,   368,
+      20,  -411,    20,    71,   262,  -411,  -411,   219,  -411,    41,
+      41,   369,   370,   371,   166,    26,   373,   372,   113,   162,
+      53,  -411,  -411,  -411,  -411,  -411,   377,  -411,    76,  -411,
+    -411,  -411,   376,  -411,  -411,  -411,  -411,  -411,   378,   374,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   123,
+    -411,   158,  -411,  -411,   169,  -411,  -411,  -411,   382,   388,
+     389,  -411,   170,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,   171,  -411,   390,   391,  -411,  -411,   393,   394,
+    -411,  -411,   395,   397,  -411,  -411,  -411,  -411,  -411,  -411,
+     127,  -411,  -411,  -411,  -411,  -411,   141,  -411,   396,   400,
+    -411,   401,   172,  -411,  -411,   402,   403,   404,  -411,  -411,
+    -411,   182,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   206,
+    -411,  -411,  -411,   207,    20,   375,  -411,  -411,   398,   406,
+    -411,  -411,   408,   409,  -411,  -411,   410,  -411,   412,   262,
+    -411,  -411,   413,   415,   416,   379,   380,   381,    41,  -411,
+    -411,    24,  -411,   369,   122,  -411,   370,     8,  -411,   371,
+     166,  -411,    26,  -411,    29,  -411,   373,   384,   372,  -411,
+     417,   385,   386,   387,   113,  -411,   418,   419,   162,  -411,
+    -411,   420,  -411,    -3,  -411,   376,    93,  -411,   378,   421,
+    -411,   422,  -411,   383,   392,   399,  -411,  -411,  -411,  -411,
+     208,  -411,   425,  -411,   427,  -411,  -411,  -411,   209,  -411,
+    -411,  -411,   405,  -411,  -411,  -411,  -411,   407,   411,  -411,
+    -411,   215,  -411,   428,  -411,   426,   423,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,   188,  -411,    51,   423,  -411,  -411,   433,  -411,  -411,
+    -411,   216,  -411,  -411,  -411,  -411,  -411,   434,   431,   435,
+      51,  -411,   424,  -411,   436,  -411,   437,  -411,  -411,   189,
+    -411,   442,   437,  -411,  -411,   217,  -411,  -411,   438,   442,
+    -411,   439,  -411,  -411
   };
 
   const unsigned short int
@@ -2880,38 +2901,38 @@ namespace isc { namespace dhcp {
        0,   166,   216,   250,   131,   343,   142,   161,   363,     0,
      380,   390,    81,     0,    58,    60,    61,    62,    63,    78,
       79,    65,    66,    67,    68,    72,    73,    64,    70,    71,
-      80,    69,    74,    75,    76,    77,    96,     0,     0,    90,
-      92,    93,    98,    99,   347,   200,   202,   204,   276,   198,
-     206,   208,     0,     0,   212,   210,   293,   339,   197,   178,
-     179,   180,   192,     0,   176,   183,   194,   195,   196,   184,
-     185,   188,   190,   186,   187,   181,   182,   189,   193,   191,
-     291,   290,   289,     0,   286,   288,   321,   323,   337,   327,
-     329,   333,   331,   335,   325,   318,   314,     0,   304,   305,
-     315,   316,   317,   311,   307,   312,   309,   310,   313,   308,
-     117,   125,     0,   244,   242,   247,     0,   237,   241,   238,
-       0,   227,   228,   230,   240,   231,   232,   233,   246,   234,
-     235,   236,   271,     0,   269,   270,   273,   274,     0,   261,
-     262,   264,   265,   266,   267,   268,   157,   159,   154,     0,
-     152,   155,   156,    37,     0,     0,    31,     0,     0,     0,
-       0,     0,    44,     0,    46,     0,     0,     0,     0,     0,
+      80,    69,    74,    75,    76,    77,    96,    98,     0,    90,
+      92,    93,   347,   200,   202,   204,   276,   198,   206,   208,
+       0,     0,   212,   210,   293,   339,   197,   178,   179,   180,
+     192,     0,   176,   183,   194,   195,   196,   184,   185,   188,
+     190,   186,   187,   181,   182,   189,   193,   191,   291,   290,
+     289,     0,   286,   288,   321,   323,   337,   327,   329,   333,
+     331,   335,   325,   318,   314,     0,   304,   305,   315,   316,
+     317,   311,   307,   312,   309,   310,   313,   308,   117,   125,
+       0,   244,   242,   247,     0,   237,   241,   238,     0,   227,
+     228,   230,   240,   231,   232,   233,   246,   234,   235,   236,
+     271,     0,   269,   270,   273,   274,     0,   261,   262,   264,
+     265,   266,   267,   268,   157,   159,   154,     0,   152,   155,
+     156,    37,     0,     0,    31,     0,     0,     0,     0,     0,
+      44,     0,    46,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    57,     0,     0,
-       0,    95,   349,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   175,     0,     0,
-     285,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     302,     0,     0,     0,     0,     0,     0,     0,     0,   225,
-       0,     0,     0,   259,     0,     0,     0,     0,   151,    43,
-      34,     0,     0,     0,     0,     0,    48,     0,    86,    87,
-       0,     0,     0,    82,    83,    84,    85,     0,     0,     0,
-       0,     0,     0,     0,     0,   379,     0,     0,    59,     0,
-     100,   101,    91,   361,   359,   360,   355,   356,   357,   358,
-       0,   350,   351,   353,   354,     0,     0,     0,     0,     0,
-       0,     0,   214,   215,     0,     0,     0,     0,   177,     0,
-     287,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     306,     0,     0,   239,     0,     0,     0,   249,   229,     0,
-     275,   263,     0,     0,   153,     0,     0,     0,   393,   395,
-       0,   320,     0,     0,   168,   218,   252,     0,     0,   144,
-       0,     0,     0,     0,    38,    97,     0,   348,     0,   201,
+       0,     0,     0,     0,     0,    57,     0,     0,     0,    95,
+     349,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   175,     0,     0,   285,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   302,     0,
+       0,     0,     0,     0,     0,     0,     0,   225,     0,     0,
+       0,   259,     0,     0,     0,     0,   151,    43,    34,     0,
+       0,     0,     0,     0,    48,     0,    86,    87,     0,     0,
+       0,    82,    83,    84,    85,     0,     0,     0,     0,     0,
+       0,     0,     0,   379,     0,     0,    59,     0,     0,    91,
+     361,   359,   360,   355,   356,   357,   358,     0,   350,   351,
+     353,   354,     0,     0,     0,     0,     0,     0,     0,   214,
+     215,     0,     0,     0,     0,   177,     0,   287,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   306,     0,     0,
+     239,     0,     0,     0,   249,   229,     0,   275,   263,     0,
+       0,   153,     0,     0,     0,   393,   395,     0,   320,     0,
+       0,   168,   218,   252,     0,     0,   144,     0,     0,     0,
+       0,    38,    97,   100,   101,    99,     0,   348,     0,   201,
      203,   205,   278,   199,   207,   209,   213,   211,   295,     0,
      292,   322,   324,   338,   328,   330,   334,   332,   336,   326,
      118,   126,   245,   243,   248,   272,   158,   160,    35,     0,
@@ -2944,33 +2965,33 @@ namespace isc { namespace dhcp {
   const short int
   Dhcp4Parser::yypgoto_[] =
   {
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,     3,  -414,  -414,  -414,  -414,   -76,  -414,  -414,
-      55,  -414,   -95,  -414,   -54,  -414,  -414,  -414,   197,  -414,
-    -414,  -414,  -414,    35,   176,   -56,   -40,   -38,  -414,  -414,
-     -37,  -414,  -414,    38,   173,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,    37,  -114,  -401,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,   -59,  -414,  -413,  -414,
-    -414,  -414,  -414,  -414,  -414,  -118,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -123,  -414,  -414,  -414,  -120,   138,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -122,  -414,  -414,  -414,
-    -414,  -105,  -414,  -414,  -414,  -102,   183,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -400,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,   -98,
-    -414,  -414,  -414,   -94,  -414,   162,  -414,   -52,  -414,  -414,
-    -414,  -414,   -48,  -414,  -414,  -414,  -414,  -414,   -47,  -414,
-    -414,  -414,   -93,  -414,  -414,  -414,   -90,  -414,   164,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -112,
-    -414,  -414,  -414,  -109,   196,  -414,  -414,  -414,  -414,  -414,
-    -414,  -117,  -414,  -414,  -414,  -110,  -414,   186,   -43,  -414,
-    -259,  -414,  -258,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,    62,  -414,
-    -414,  -414,  -414,  -414,  -414,   -96,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,   -97,  -414,  -414,  -414,  -414,
-    -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,  -414,   -57,
-    -414,  -414,  -414,  -161,  -414,  -414,  -176,  -414,  -414,  -414,
-    -414,  -414,  -414,  -187,  -414,  -414,  -193,  -414
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,     3,  -411,  -411,  -411,  -411,   -57,  -411,  -411,
+      34,  -411,  -104,  -411,   -54,  -411,  -411,  -411,   196,  -411,
+    -411,  -411,  -411,    30,   174,   -56,   -40,   -38,  -411,  -411,
+     -37,  -411,  -411,    33,   173,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,    36,  -119,  -398,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,   -59,  -411,  -410,  -411,
+    -411,  -411,  -411,  -411,  -411,  -128,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -133,  -411,  -411,  -411,  -130,   130,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -131,  -411,  -411,  -411,
+    -411,  -113,  -411,  -411,  -411,  -108,   175,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -399,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -111,
+    -411,  -411,  -411,  -107,  -411,   152,  -411,   -52,  -411,  -411,
+    -411,  -411,   -48,  -411,  -411,  -411,  -411,  -411,   -47,  -411,
+    -411,  -411,  -106,  -411,  -411,  -411,  -103,  -411,   149,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -129,
+    -411,  -411,  -411,  -126,   181,  -411,  -411,  -411,  -411,  -411,
+    -411,  -118,  -411,  -411,  -411,  -127,  -411,   180,   -43,  -411,
+    -257,  -411,  -256,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,    42,  -411,
+    -411,  -411,  -411,  -411,  -411,  -101,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -102,  -411,  -411,  -411,  -411,
+    -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,  -411,   -68,
+    -411,  -411,  -411,  -170,  -411,  -411,  -185,  -411,  -411,  -411,
+    -411,  -411,  -411,  -195,  -411,  -411,  -201,  -411
   };
 
   const short int
@@ -2978,29 +2999,29 @@ namespace isc { namespace dhcp {
   {
       -1,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    63,    31,    32,    53,    67,    68,    33,    52,
-     435,   544,    64,    65,   102,    35,    54,    75,    76,    77,
-     248,    37,    55,   103,   104,   105,   106,   107,   108,   109,
-     110,   111,   255,   128,   129,    39,    56,   130,   278,   131,
-     132,   133,   112,   259,   113,   260,   482,   483,   208,   312,
-     485,   562,   486,   563,   487,   564,   209,   313,   489,   490,
-     491,   509,   114,   268,   510,   511,   512,   513,   514,   115,
-     270,   518,   519,   520,   584,    51,    62,   239,   240,   241,
-     325,   242,   326,   116,   271,   522,   523,   117,   265,   494,
-     495,   496,   571,    41,    57,   153,   154,   155,   287,   156,
-     283,   157,   284,   158,   285,   159,   288,   160,   289,   161,
-     293,   162,   292,   163,   164,   118,   266,   498,   499,   500,
-     574,    47,    60,   210,   211,   212,   213,   214,   215,   216,
-     217,   316,   218,   315,   219,   220,   317,   221,   119,   267,
-     502,   503,   504,   577,    49,    61,   228,   229,   230,   231,
-     232,   321,   233,   234,   235,   166,   286,   548,   549,   550,
-     603,    43,    58,   173,   174,   175,   298,   167,   294,   552,
-     553,   554,   606,    45,    59,   187,   188,   189,   120,   258,
-     191,   301,   192,   302,   193,   309,   194,   304,   195,   305,
-     196,   307,   197,   306,   198,   308,   199,   303,   169,   295,
-     556,   609,   121,   269,   516,   282,   370,   371,   372,   373,
-     374,   436,   122,   272,   531,   532,   533,   534,   590,   535,
-     536,   123,   124,   274,   539,   540,   541,   596,   542,   597,
-     125,   275,    78,   250,    79,   251,    80,   249,   471,   472,
+     432,   544,    64,    65,   102,    35,    54,    75,    76,    77,
+     246,    37,    55,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   253,   128,   129,    39,    56,   130,   276,   131,
+     277,   435,   112,   257,   113,   258,   482,   483,   206,   310,
+     485,   562,   486,   563,   487,   564,   207,   311,   489,   490,
+     491,   509,   114,   266,   510,   511,   512,   513,   514,   115,
+     268,   518,   519,   520,   584,    51,    62,   237,   238,   239,
+     323,   240,   324,   116,   269,   522,   523,   117,   263,   494,
+     495,   496,   571,    41,    57,   151,   152,   153,   285,   154,
+     281,   155,   282,   156,   283,   157,   286,   158,   287,   159,
+     291,   160,   290,   161,   162,   118,   264,   498,   499,   500,
+     574,    47,    60,   208,   209,   210,   211,   212,   213,   214,
+     215,   314,   216,   313,   217,   218,   315,   219,   119,   265,
+     502,   503,   504,   577,    49,    61,   226,   227,   228,   229,
+     230,   319,   231,   232,   233,   164,   284,   548,   549,   550,
+     603,    43,    58,   171,   172,   173,   296,   165,   292,   552,
+     553,   554,   606,    45,    59,   185,   186,   187,   120,   256,
+     189,   299,   190,   300,   191,   307,   192,   302,   193,   303,
+     194,   305,   195,   304,   196,   306,   197,   301,   167,   293,
+     556,   609,   121,   267,   516,   280,   367,   368,   369,   370,
+     371,   436,   122,   270,   531,   532,   533,   534,   590,   535,
+     536,   123,   124,   272,   539,   540,   541,   596,   542,   597,
+     125,   273,    78,   248,    79,   249,    80,   247,   471,   472,
      473,   558,   661,   662,   663,   671,   672,   673,   674,   679,
      675,   677,   689,   690,   691,   695,   696,   698
   };
@@ -3008,63 +3029,63 @@ namespace isc { namespace dhcp {
   const unsigned short int
   Dhcp4Parser::yytable_[] =
   {
-      74,   149,   225,   148,   171,   185,   207,   224,   238,   226,
-     165,   172,   186,   227,   168,    30,   190,   150,   530,   151,
-     152,   484,   484,   368,   369,    23,   134,    24,   515,    25,
-     529,    66,    93,    22,    69,   253,    83,    84,   134,   244,
-     254,    34,   170,    84,   176,   177,   236,   237,   276,    87,
-      88,    89,   280,   277,   135,   136,   137,   281,    93,   580,
-      36,   296,   581,   299,    93,   201,   297,   138,   300,   139,
-     140,   141,   142,   143,   144,   327,    38,    73,   145,   146,
-     328,    81,    40,   363,   276,   147,    82,    83,    84,   557,
-     145,    85,    86,    73,   201,   222,   202,   203,   223,    42,
-      87,    88,    89,    90,    91,   559,    70,    44,    92,    93,
-     560,    46,    71,    72,    84,   176,   177,    48,   201,    73,
-      26,    27,    28,    29,    73,    73,    94,    95,   200,   475,
-     476,   477,   478,   479,   480,    93,   200,    50,    96,   280,
-     478,    97,    98,   582,   561,   201,   583,    99,   100,   200,
-     568,   101,   243,   178,    73,   569,   245,   179,   180,   181,
-     182,   183,   666,   184,   667,   668,   201,   484,   202,   203,
-      73,   204,   205,   206,   664,   126,   127,   665,    73,   368,
-     369,   530,   627,   360,   361,   568,   524,   525,   526,   527,
-     570,   692,   588,   529,   693,   594,    73,   589,   598,    74,
-     595,   247,   296,   599,   327,    73,   600,   650,   246,   653,
-     299,   680,   699,    73,   247,   657,   681,   700,   505,   506,
-     507,   508,   252,   365,   236,   237,    73,   256,   364,   537,
-     538,   257,   261,   262,   263,   366,   264,   273,   279,   367,
-     149,   290,   148,   291,   310,   171,   311,   329,   330,   165,
-     314,   318,   172,   168,   320,   343,   150,   185,   151,   152,
-     319,   322,   323,   324,   186,   225,   207,   331,   190,   332,
-     224,   333,   226,   334,   335,   337,   227,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,   338,   339,   340,
-     341,   342,   344,   347,   345,   346,   348,   349,   350,   351,
-     352,   353,   354,   355,   356,   357,   359,   375,   376,   377,
-     378,   379,   380,   381,   382,   383,   384,   385,   386,   387,
-     389,   391,   392,   393,   394,   395,   396,   397,   398,   399,
-     401,   402,   403,   404,   405,   406,   409,   418,   419,   412,
-     413,   407,   415,   410,   416,   421,   417,   420,   422,   423,
-     424,   425,   426,   427,   428,   429,   439,   543,   430,   431,
-     432,   433,   434,   488,   488,   438,   437,   449,   481,   481,
-     442,   448,   440,   441,   443,   444,   445,   528,   446,   365,
-     447,   450,   451,   452,   364,   493,   497,   501,   454,   517,
-     455,   366,   545,   547,   551,   367,   565,   566,   567,   456,
-     573,   572,   575,   576,   578,   579,   586,   585,   587,   591,
-     457,   458,   592,   593,   610,   605,   467,   604,   468,   607,
-     608,   640,   611,   613,   614,   615,   632,   637,   459,   638,
-     645,   555,   646,   460,   461,   678,   651,   652,   658,   660,
-     682,   684,   688,   462,   463,   686,   470,   701,   453,   601,
-     336,   469,   358,   362,   619,   464,   465,   694,   474,   466,
-     492,   521,   626,   629,   628,   414,   631,   602,   621,   620,
-     617,   616,   630,   618,   633,   634,   635,   647,   623,   388,
-     622,   648,   408,   649,   654,   655,   625,   624,   411,   656,
-     659,   644,   683,   642,   641,   390,   643,   400,   636,   687,
-     546,   639,   612,   676,   685,   697,   702,   703,     0,   488,
-       0,     0,     0,     0,   481,   149,     0,   148,   225,     0,
-     207,     0,     0,   224,   165,   226,     0,     0,   168,   227,
-     238,   150,     0,   151,   152,     0,     0,     0,     0,     0,
-     528,     0,     0,     0,     0,     0,     0,     0,     0,   171,
-       0,     0,   185,     0,     0,     0,   172,     0,     0,   186,
-       0,     0,     0,   190,     0,     0,     0,     0,     0,     0,
+      74,   147,   223,   146,   169,   183,   205,   222,   236,   224,
+     163,   170,   184,   225,   166,    30,   188,   148,   530,   149,
+     150,   484,   484,   365,   366,    23,   515,    24,    69,    25,
+     529,   132,    34,   132,   251,   274,    93,    22,   278,   252,
+     275,    83,    84,   279,   234,   235,   168,    36,   199,   220,
+     200,   201,   221,   294,    87,    88,    89,   297,   295,   133,
+     134,   135,   298,    93,   198,   475,   476,   477,   478,   479,
+     480,    38,   136,    40,   137,   138,   139,   140,   141,   142,
+      42,   199,    81,   143,   144,   143,    44,    82,    83,    84,
+     145,   199,    85,    86,    84,   174,   175,    73,   234,   235,
+      70,    87,    88,    89,    90,    91,    71,    72,    73,    92,
+      93,    84,   174,   175,   325,    93,   199,    46,    73,   326,
+      26,    27,    28,    29,    73,    48,   274,    94,    95,    73,
+     580,   557,    93,   581,   360,   666,   198,   667,   668,    96,
+     478,    73,    97,    98,   582,   198,    50,   583,    99,   100,
+     176,    73,   101,    66,   177,   178,   179,   180,   181,   241,
+     182,   559,   199,   242,   200,   201,   560,   202,   203,   204,
+     484,    73,   278,   568,   568,   588,    73,   561,   569,   570,
+     589,   365,   366,   627,   530,   594,   524,   525,   526,   527,
+     595,   664,   692,    73,   665,   693,   529,    74,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,   243,   598,
+     245,   294,   325,    73,   599,   600,   650,   653,   297,   680,
+     699,   362,    73,   657,   681,   700,   361,   505,   506,   507,
+     508,   126,   127,   363,   433,   434,   244,   364,   147,   245,
+     146,   537,   538,   169,   250,   327,   328,   163,   254,   255,
+     170,   166,   259,   260,   148,   183,   149,   150,   261,   262,
+     271,   288,   184,   223,   205,   289,   188,   308,   222,   309,
+     224,   312,   316,   317,   225,   318,   329,   320,   321,   322,
+     336,   330,   331,   332,   333,   335,   337,   338,   339,   340,
+     345,   341,   342,   343,   344,   346,   347,   348,   349,   350,
+     351,   352,   353,   354,   355,   357,   358,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     386,   388,   389,   390,   391,   392,   393,   394,   395,   396,
+     398,   399,   400,   401,   402,   415,   416,   403,   404,   406,
+     407,   409,   410,   412,   437,   470,   418,   413,   414,   417,
+     419,   420,   421,   422,   423,   424,   425,   426,   431,   442,
+     488,   488,   427,   428,   429,   481,   481,   430,   438,   439,
+     449,   440,   448,   543,   528,   441,   493,   497,   501,   362,
+     517,   545,   443,   547,   361,   551,   565,   444,   445,   446,
+     447,   363,   566,   567,   573,   364,   572,   576,   450,   575,
+     579,   578,   585,   586,   604,   587,   591,   592,   593,   605,
+     451,   452,   608,   467,   607,   468,   611,   613,   610,   614,
+     615,   632,   637,   638,   453,   645,   640,   646,   454,   686,
+     660,   455,   456,   651,   457,   652,   658,   678,   682,   684,
+     601,   555,   701,   469,   688,   458,   459,   334,   356,   619,
+     474,   359,   626,   629,   628,   411,   492,   631,   460,   461,
+     621,   462,   463,   620,   464,   623,   465,   622,   466,   385,
+     405,   408,   521,   625,   624,   602,   642,   641,   387,   643,
+     546,   617,   616,   647,   618,   630,   633,   634,   635,   397,
+     644,   612,   648,   636,   676,   685,   639,   697,   702,   649,
+       0,     0,     0,     0,     0,   654,     0,   655,     0,   488,
+       0,   656,     0,     0,   481,   147,     0,   146,   223,     0,
+     205,     0,     0,   222,   163,   224,   659,   694,   166,   225,
+     236,   148,   683,   149,   150,     0,   687,     0,     0,   703,
+     528,     0,     0,     0,     0,     0,     0,     0,     0,   169,
+       0,     0,   183,     0,     0,     0,   170,     0,     0,   184,
+       0,     0,     0,   188,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -3077,59 +3098,59 @@ namespace isc { namespace dhcp {
   Dhcp4Parser::yycheck_[] =
   {
       54,    57,    61,    57,    58,    59,    60,    61,    62,    61,
-      57,    58,    59,    61,    57,    12,    59,    57,   431,    57,
-      57,   422,   423,   282,   282,     5,     7,     7,   428,     9,
-     431,   100,    39,     0,    10,     3,    17,    18,     7,     3,
-       8,     7,    49,    18,    19,    20,    69,    70,     3,    30,
-      31,    32,     3,     8,    35,    36,    37,     8,    39,     3,
-       7,     3,     6,     3,    39,    40,     8,    48,     8,    50,
-      51,    52,    53,    54,    55,     3,     7,   100,    59,    60,
-       8,    11,     7,    58,     3,    66,    16,    17,    18,     8,
-      59,    21,    22,   100,    40,    41,    42,    43,    44,     7,
-      30,    31,    32,    33,    34,     3,    82,     7,    38,    39,
-       8,     7,    88,    89,    18,    19,    20,     7,    40,   100,
-     100,   101,   102,   103,   100,   100,    56,    57,    23,    24,
-      25,    26,    27,    28,    29,    39,    23,     7,    68,     3,
-      27,    71,    72,     3,     8,    40,     6,    77,    78,    23,
-       3,    81,     6,    57,   100,     8,     4,    61,    62,    63,
-      64,    65,    84,    67,    86,    87,    40,   568,    42,    43,
-     100,    45,    46,    47,     3,    12,    13,     6,   100,   438,
-     438,   594,   582,    14,    15,     3,    73,    74,    75,    76,
-       8,     3,     3,   594,     6,     3,   100,     8,     3,   253,
-       8,     3,     3,     8,     3,   100,     8,     8,     8,     8,
-       3,     3,     3,   100,     3,     8,     8,     8,    61,    62,
-      63,    64,     4,   282,    69,    70,   100,     4,   282,    79,
-      80,     4,     4,     4,     4,   282,     4,     4,     4,   282,
-     296,     4,   296,     4,     8,   299,     3,   244,   245,   296,
-       4,     4,   299,   296,     3,   101,   296,   311,   296,   296,
-       8,     4,     8,     3,   311,   324,   320,   100,   311,     4,
-     324,     4,   324,     4,     4,     4,   324,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   103,   103,     4,
-       4,     4,   101,     4,   101,   101,     4,     4,     4,     4,
-       4,     4,     4,   101,     4,     4,     4,     4,     4,     4,
+      57,    58,    59,    61,    57,    12,    59,    57,   428,    57,
+      57,   419,   420,   280,   280,     5,   425,     7,    10,     9,
+     428,     7,     7,     7,     3,     3,    39,     0,     3,     8,
+       8,    17,    18,     8,    69,    70,    49,     7,    40,    41,
+      42,    43,    44,     3,    30,    31,    32,     3,     8,    35,
+      36,    37,     8,    39,    23,    24,    25,    26,    27,    28,
+      29,     7,    48,     7,    50,    51,    52,    53,    54,    55,
+       7,    40,    11,    59,    60,    59,     7,    16,    17,    18,
+      66,    40,    21,    22,    18,    19,    20,   100,    69,    70,
+      82,    30,    31,    32,    33,    34,    88,    89,   100,    38,
+      39,    18,    19,    20,     3,    39,    40,     7,   100,     8,
+     100,   101,   102,   103,   100,     7,     3,    56,    57,   100,
+       3,     8,    39,     6,    58,    84,    23,    86,    87,    68,
+      27,   100,    71,    72,     3,    23,     7,     6,    77,    78,
+      57,   100,    81,   100,    61,    62,    63,    64,    65,     6,
+      67,     3,    40,     3,    42,    43,     8,    45,    46,    47,
+     568,   100,     3,     3,     3,     3,   100,     8,     8,     8,
+       8,   438,   438,   582,   594,     3,    73,    74,    75,    76,
+       8,     3,     3,   100,     6,     6,   594,   251,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,     4,     3,
+       3,     3,     3,   100,     8,     8,     8,     8,     3,     3,
+       3,   280,   100,     8,     8,     8,   280,    61,    62,    63,
+      64,    12,    13,   280,    14,    15,     8,   280,   294,     3,
+     294,    79,    80,   297,     4,   242,   243,   294,     4,     4,
+     297,   294,     4,     4,   294,   309,   294,   294,     4,     4,
+       4,     4,   309,   322,   318,     4,   309,     8,   322,     3,
+     322,     4,     4,     8,   322,     3,   100,     4,     8,     3,
+     103,     4,     4,     4,     4,     4,   103,     4,     4,     4,
+       4,   101,   101,   101,   101,     4,     4,     4,     4,     4,
+       4,     4,   101,     4,     4,     4,     4,     4,     4,     4,
        4,     4,     4,     4,   101,   103,     4,     4,     4,     4,
        4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,   101,     4,     4,     4,     4,   334,   335,     4,
-       4,   103,     4,   103,     7,   100,     7,     7,     7,     7,
-       5,     5,     5,     5,     5,     5,   100,   433,     7,     7,
-       7,     7,     5,   422,   423,     3,     8,     7,   422,   423,
-       5,     5,   100,   100,   100,   100,   100,   431,   100,   438,
-     100,   100,   100,   100,   438,     7,     7,     7,   100,     7,
-     100,   438,     4,     7,     7,   438,     4,     4,     4,   100,
-       3,     6,     6,     3,     6,     3,     3,     6,     4,     4,
-     100,   100,     4,     4,     8,     3,   413,     6,   415,     6,
-       3,     6,     4,     4,     4,     4,     4,     4,   100,     4,
-       4,    67,     5,   100,   100,     4,     8,     8,     8,     7,
-       4,     4,     7,   100,   100,     5,    83,     4,   393,   544,
-     253,   416,   276,   280,   568,   100,   100,    85,   420,   100,
-     423,   100,   580,   586,   584,   327,   588,   100,   573,   571,
-     101,   103,   101,   103,   101,   101,   101,   100,   576,   296,
-     574,   100,   320,   100,   100,   100,   579,   577,   324,   100,
-     100,   608,   101,   605,   603,   299,   606,   311,   594,   100,
-     438,   598,   559,   664,   680,   692,   699,   100,    -1,   568,
-      -1,    -1,    -1,    -1,   568,   571,    -1,   571,   577,    -1,
-     574,    -1,    -1,   577,   571,   577,    -1,    -1,   571,   577,
-     584,   571,    -1,   571,   571,    -1,    -1,    -1,    -1,    -1,
+       4,     4,   101,     4,     4,   332,   333,     4,   103,     4,
+     103,     4,     4,     4,     8,    83,   100,     7,     7,     7,
+       7,     7,     5,     5,     5,     5,     5,     5,     5,     5,
+     419,   420,     7,     7,     7,   419,   420,     7,     3,   100,
+       7,   100,     5,   430,   428,   100,     7,     7,     7,   438,
+       7,     4,   100,     7,   438,     7,     4,   100,   100,   100,
+     100,   438,     4,     4,     3,   438,     6,     3,   100,     6,
+       3,     6,     6,     3,     6,     4,     4,     4,     4,     3,
+     100,   100,     3,   410,     6,   412,     4,     4,     8,     4,
+       4,     4,     4,     4,   390,     4,     6,     5,   100,     5,
+       7,   100,   100,     8,   100,     8,     8,     4,     4,     4,
+     544,    67,     4,   413,     7,   100,   100,   251,   274,   568,
+     417,   278,   580,   586,   584,   325,   420,   588,   100,   100,
+     573,   100,   100,   571,   100,   576,   100,   574,   100,   294,
+     318,   322,   100,   579,   577,   100,   605,   603,   297,   606,
+     438,   101,   103,   100,   103,   101,   101,   101,   101,   309,
+     608,   559,   100,   594,   664,   680,   598,   692,   699,   100,
+      -1,    -1,    -1,    -1,    -1,   100,    -1,   100,    -1,   568,
+      -1,   100,    -1,    -1,   568,   571,    -1,   571,   577,    -1,
+     574,    -1,    -1,   577,   571,   577,   100,    85,   571,   577,
+     584,   571,   101,   571,   571,    -1,   100,    -1,    -1,   100,
      594,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   603,
       -1,    -1,   606,    -1,    -1,    -1,   603,    -1,    -1,   606,
       -1,    -1,    -1,   606,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -3157,37 +3178,37 @@ namespace isc { namespace dhcp {
       78,    81,   128,   137,   138,   139,   140,   141,   142,   143,
      144,   145,   156,   158,   176,   183,   197,   201,   229,   252,
      292,   316,   326,   335,   336,   344,    12,    13,   147,   148,
-     151,   153,   154,   155,     7,    35,    36,    37,    48,    50,
-      51,    52,    53,    54,    55,    59,    60,    66,   128,   139,
-     140,   141,   144,   209,   210,   211,   213,   215,   217,   219,
-     221,   223,   225,   227,   228,   252,   269,   281,   292,   312,
-      49,   128,   252,   277,   278,   279,    19,    20,    57,    61,
-      62,    63,    64,    65,    67,   128,   252,   289,   290,   291,
-     292,   294,   296,   298,   300,   302,   304,   306,   308,   310,
-      23,    40,    42,    43,    45,    46,    47,   128,   162,   170,
-     237,   238,   239,   240,   241,   242,   243,   244,   246,   248,
-     249,   251,    41,    44,   128,   170,   241,   246,   260,   261,
-     262,   263,   264,   266,   267,   268,    69,    70,   128,   191,
-     192,   193,   195,     6,     3,     4,     8,     3,   134,   351,
-     347,   349,     4,     3,     8,   146,     4,     4,   293,   157,
-     159,     4,     4,     4,     4,   202,   230,   253,   177,   317,
-     184,   198,   327,     4,   337,   345,     3,     8,   152,     4,
-       3,     8,   319,   214,   216,   218,   270,   212,   220,   222,
-       4,     4,   226,   224,   282,   313,     3,     8,   280,     3,
-       8,   295,   297,   311,   301,   303,   307,   305,   309,   299,
-       8,     3,   163,   171,     4,   247,   245,   250,     4,     8,
-       3,   265,     4,     8,     3,   194,   196,     3,     8,   116,
-     116,   100,     4,     4,     4,     4,   132,     4,   103,   103,
-       4,     4,     4,   101,   101,   101,   101,     4,     4,     4,
-       4,     4,     4,     4,     4,   101,     4,     4,   138,     4,
-      14,    15,   148,    58,   128,   170,   252,   292,   294,   296,
-     320,   321,   322,   323,   324,     4,     4,     4,     4,     4,
-       4,     4,   101,   103,     4,     4,     4,     4,   210,     4,
-     278,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-     291,     4,     4,   101,     4,     4,     4,   103,   239,     4,
-     103,   262,     4,     4,   192,     4,     7,     7,   116,   116,
-       7,   100,     7,     7,     5,     5,     5,     5,     5,     5,
-       7,     7,     7,     7,     5,   124,   325,     8,     3,   100,
+     151,   153,     7,    35,    36,    37,    48,    50,    51,    52,
+      53,    54,    55,    59,    60,    66,   128,   139,   140,   141,
+     144,   209,   210,   211,   213,   215,   217,   219,   221,   223,
+     225,   227,   228,   252,   269,   281,   292,   312,    49,   128,
+     252,   277,   278,   279,    19,    20,    57,    61,    62,    63,
+      64,    65,    67,   128,   252,   289,   290,   291,   292,   294,
+     296,   298,   300,   302,   304,   306,   308,   310,    23,    40,
+      42,    43,    45,    46,    47,   128,   162,   170,   237,   238,
+     239,   240,   241,   242,   243,   244,   246,   248,   249,   251,
+      41,    44,   128,   170,   241,   246,   260,   261,   262,   263,
+     264,   266,   267,   268,    69,    70,   128,   191,   192,   193,
+     195,     6,     3,     4,     8,     3,   134,   351,   347,   349,
+       4,     3,     8,   146,     4,     4,   293,   157,   159,     4,
+       4,     4,     4,   202,   230,   253,   177,   317,   184,   198,
+     327,     4,   337,   345,     3,     8,   152,   154,     3,     8,
+     319,   214,   216,   218,   270,   212,   220,   222,     4,     4,
+     226,   224,   282,   313,     3,     8,   280,     3,     8,   295,
+     297,   311,   301,   303,   307,   305,   309,   299,     8,     3,
+     163,   171,     4,   247,   245,   250,     4,     8,     3,   265,
+       4,     8,     3,   194,   196,     3,     8,   116,   116,   100,
+       4,     4,     4,     4,   132,     4,   103,   103,     4,     4,
+       4,   101,   101,   101,   101,     4,     4,     4,     4,     4,
+       4,     4,     4,   101,     4,     4,   138,     4,     4,   148,
+      58,   128,   170,   252,   292,   294,   296,   320,   321,   322,
+     323,   324,     4,     4,     4,     4,     4,     4,     4,   101,
+     103,     4,     4,     4,     4,   210,     4,   278,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,   291,     4,     4,
+     101,     4,     4,     4,   103,   239,     4,   103,   262,     4,
+       4,   192,     4,     7,     7,   116,   116,     7,   100,     7,
+       7,     5,     5,     5,     5,     5,     5,     7,     7,     7,
+       7,     5,   124,    14,    15,   155,   325,     8,     3,   100,
      100,   100,     5,   100,   100,   100,   100,   100,     5,     7,
      100,   100,   100,   124,   100,   100,   100,   100,   100,   100,
      100,   100,   100,   100,   100,   100,   100,   116,   116,   137,
@@ -3229,8 +3250,8 @@ namespace isc { namespace dhcp {
      138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
      138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
      138,   138,   139,   140,   141,   142,   143,   144,   146,   145,
-     147,   147,   148,   148,   150,   149,   152,   151,   153,   153,
-     154,   155,   157,   156,   159,   158,   160,   160,   161,   161,
+     147,   147,   148,   148,   150,   149,   152,   151,   154,   153,
+     155,   155,   157,   156,   159,   158,   160,   160,   161,   161,
      161,   161,   161,   161,   161,   161,   161,   163,   162,   165,
      164,   167,   166,   169,   168,   171,   170,   172,   173,   174,
      175,   177,   176,   178,   178,   179,   179,   179,   179,   180,
@@ -3277,8 +3298,8 @@ namespace isc { namespace dhcp {
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     3,     3,     3,     3,     3,     3,     0,     6,
-       1,     3,     1,     1,     0,     4,     0,     4,     1,     1,
-       3,     3,     0,     6,     0,     6,     1,     3,     1,     1,
+       1,     3,     1,     1,     0,     4,     0,     4,     0,     4,
+       1,     1,     0,     6,     0,     6,     1,     3,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     0,     4,     0,
        4,     0,     4,     0,     4,     0,     4,     3,     3,     3,
        1,     0,     6,     1,     3,     1,     1,     1,     1,     1,
@@ -3356,108 +3377,108 @@ namespace isc { namespace dhcp {
   "renew_timer", "rebind_timer", "decline_probation_period",
   "echo_client_id", "match_client_id", "interfaces_config", "$@17",
   "interfaces_config_params", "interfaces_config_param", "sub_interfaces4",
-  "$@18", "interfaces_list", "$@19", "dhcp_socket_type",
-  "dhcp_socket_type_raw", "dhcp_socket_type_udp", "lease_database", "$@20",
-  "hosts_database", "$@21", "database_map_params", "database_map_param",
-  "type", "$@22", "user", "$@23", "password", "$@24", "host", "$@25",
-  "name", "$@26", "persist", "lfc_interval", "readonly", "duid_id",
-  "host_reservation_identifiers", "$@27",
-  "host_reservation_identifiers_list", "host_reservation_identifier",
-  "hw_address_id", "circuit_id", "client_id", "hooks_libraries", "$@28",
-  "hooks_libraries_list", "not_empty_hooks_libraries_list",
-  "hooks_library", "$@29", "sub_hooks_library", "$@30", "hooks_params",
-  "hooks_param", "library", "$@31", "parameters", "$@32",
-  "expired_leases_processing", "$@33", "expired_leases_params",
-  "expired_leases_param", "subnet4_list", "$@34", "subnet4_list_content",
-  "not_empty_subnet4_list", "subnet4", "$@35", "sub_subnet4", "$@36",
-  "subnet4_params", "subnet4_param", "subnet", "$@37",
-  "subnet_4o6_interface", "$@38", "subnet_4o6_interface_id", "$@39",
-  "subnet_4o6_subnet", "$@40", "interface", "$@41", "interface_id", "$@42",
-  "client_class", "$@43", "reservation_mode", "$@44", "id", "rapid_commit",
-  "option_def_list", "$@45", "option_def_list_content",
-  "not_empty_option_def_list", "option_def_entry", "$@46",
-  "sub_option_def", "$@47", "option_def_params",
+  "$@18", "interfaces_list", "$@19", "dhcp_socket_type", "$@20",
+  "socket_type", "lease_database", "$@21", "hosts_database", "$@22",
+  "database_map_params", "database_map_param", "type", "$@23", "user",
+  "$@24", "password", "$@25", "host", "$@26", "name", "$@27", "persist",
+  "lfc_interval", "readonly", "duid_id", "host_reservation_identifiers",
+  "$@28", "host_reservation_identifiers_list",
+  "host_reservation_identifier", "hw_address_id", "circuit_id",
+  "client_id", "hooks_libraries", "$@29", "hooks_libraries_list",
+  "not_empty_hooks_libraries_list", "hooks_library", "$@30",
+  "sub_hooks_library", "$@31", "hooks_params", "hooks_param", "library",
+  "$@32", "parameters", "$@33", "expired_leases_processing", "$@34",
+  "expired_leases_params", "expired_leases_param", "subnet4_list", "$@35",
+  "subnet4_list_content", "not_empty_subnet4_list", "subnet4", "$@36",
+  "sub_subnet4", "$@37", "subnet4_params", "subnet4_param", "subnet",
+  "$@38", "subnet_4o6_interface", "$@39", "subnet_4o6_interface_id",
+  "$@40", "subnet_4o6_subnet", "$@41", "interface", "$@42", "interface_id",
+  "$@43", "client_class", "$@44", "reservation_mode", "$@45", "id",
+  "rapid_commit", "option_def_list", "$@46", "option_def_list_content",
+  "not_empty_option_def_list", "option_def_entry", "$@47",
+  "sub_option_def", "$@48", "option_def_params",
   "not_empty_option_def_params", "option_def_param", "option_def_name",
   "code", "option_def_code", "option_def_type", "option_def_record_types",
-  "$@48", "space", "$@49", "option_def_space", "option_def_encapsulate",
-  "$@50", "option_def_array", "option_data_list", "$@51",
+  "$@49", "space", "$@50", "option_def_space", "option_def_encapsulate",
+  "$@51", "option_def_array", "option_data_list", "$@52",
   "option_data_list_content", "not_empty_option_data_list",
-  "option_data_entry", "$@52", "sub_option_data", "$@53",
+  "option_data_entry", "$@53", "sub_option_data", "$@54",
   "option_data_params", "not_empty_option_data_params",
-  "option_data_param", "option_data_name", "option_data_data", "$@54",
+  "option_data_param", "option_data_name", "option_data_data", "$@55",
   "option_data_code", "option_data_space", "option_data_csv_format",
-  "pools_list", "$@55", "pools_list_content", "not_empty_pools_list",
-  "pool_list_entry", "$@56", "sub_pool4", "$@57", "pool_params",
-  "pool_param", "pool_entry", "$@58", "reservations", "$@59",
+  "pools_list", "$@56", "pools_list_content", "not_empty_pools_list",
+  "pool_list_entry", "$@57", "sub_pool4", "$@58", "pool_params",
+  "pool_param", "pool_entry", "$@59", "reservations", "$@60",
   "reservations_list", "not_empty_reservations_list", "reservation",
-  "$@60", "sub_reservation", "$@61", "reservation_params",
+  "$@61", "sub_reservation", "$@62", "reservation_params",
   "not_empty_reservation_params", "reservation_param", "next_server",
-  "$@62", "server_hostname", "$@63", "boot_file_name", "$@64",
-  "ip_address", "$@65", "duid", "$@66", "hw_address", "$@67",
-  "client_id_value", "$@68", "circuit_id_value", "$@69", "hostname",
-  "$@70", "reservation_client_classes", "$@71", "relay", "$@72",
-  "relay_map", "$@73", "client_classes", "$@74", "client_classes_list",
-  "$@75", "client_class_params", "not_empty_client_class_params",
-  "client_class_param", "client_class_name", "client_class_test", "$@76",
-  "server_id", "$@77", "server_id_params", "server_id_param", "htype",
-  "identifier", "$@78", "time", "enterprise_id", "dhcp4o6_port",
-  "control_socket", "$@79", "control_socket_params",
-  "control_socket_param", "socket_type", "$@80", "socket_name", "$@81",
-  "dhcp_ddns", "$@82", "dhcp6_json_object", "$@83", "dhcpddns_json_object",
-  "$@84", "logging_object", "$@85", "logging_params", "logging_param",
-  "loggers", "$@86", "loggers_entries", "logger_entry", "$@87",
-  "logger_params", "logger_param", "debuglevel", "severity", "$@88",
-  "output_options_list", "$@89", "output_options_list_content",
-  "output_entry", "$@90", "output_params", "output_param", "$@91", YY_NULLPTR
+  "$@63", "server_hostname", "$@64", "boot_file_name", "$@65",
+  "ip_address", "$@66", "duid", "$@67", "hw_address", "$@68",
+  "client_id_value", "$@69", "circuit_id_value", "$@70", "hostname",
+  "$@71", "reservation_client_classes", "$@72", "relay", "$@73",
+  "relay_map", "$@74", "client_classes", "$@75", "client_classes_list",
+  "$@76", "client_class_params", "not_empty_client_class_params",
+  "client_class_param", "client_class_name", "client_class_test", "$@77",
+  "server_id", "$@78", "server_id_params", "server_id_param", "htype",
+  "identifier", "$@79", "time", "enterprise_id", "dhcp4o6_port",
+  "control_socket", "$@80", "control_socket_params",
+  "control_socket_param", "control_socket_type", "$@81",
+  "control_socket_name", "$@82", "dhcp_ddns", "$@83", "dhcp6_json_object",
+  "$@84", "dhcpddns_json_object", "$@85", "logging_object", "$@86",
+  "logging_params", "logging_param", "loggers", "$@87", "loggers_entries",
+  "logger_entry", "$@88", "logger_params", "logger_param", "debuglevel",
+  "severity", "$@89", "output_options_list", "$@90",
+  "output_options_list_content", "output_entry", "$@91", "output_params",
+  "output_param", "$@92", YY_NULLPTR
   };
 
 #if PARSER4_DEBUG
   const unsigned short int
   Dhcp4Parser::yyrline_[] =
   {
-       0,   200,   200,   200,   201,   201,   202,   202,   203,   203,
-     204,   204,   205,   205,   206,   206,   207,   207,   208,   208,
-     209,   209,   217,   218,   219,   220,   221,   222,   223,   226,
-     231,   231,   243,   244,   247,   251,   258,   258,   266,   266,
-     273,   274,   277,   281,   292,   302,   302,   314,   315,   319,
-     320,   321,   322,   323,   326,   326,   343,   343,   351,   352,
-     357,   358,   359,   360,   361,   362,   363,   364,   365,   366,
-     367,   368,   369,   370,   371,   372,   373,   374,   375,   376,
-     377,   378,   381,   386,   391,   396,   401,   406,   412,   412,
-     422,   423,   426,   427,   430,   430,   438,   438,   448,   449,
-     452,   457,   462,   462,   472,   472,   482,   483,   486,   487,
-     488,   489,   490,   491,   492,   493,   494,   497,   497,   505,
-     505,   513,   513,   521,   521,   529,   529,   537,   542,   547,
-     552,   557,   557,   567,   568,   571,   572,   573,   574,   577,
-     582,   587,   592,   592,   602,   603,   606,   607,   610,   610,
-     618,   618,   626,   627,   628,   631,   632,   635,   635,   643,
-     643,   651,   651,   661,   662,   668,   676,   676,   689,   690,
-     693,   694,   701,   701,   724,   724,   733,   734,   738,   739,
-     740,   741,   742,   743,   744,   745,   746,   747,   748,   749,
-     750,   751,   752,   753,   754,   755,   756,   757,   760,   760,
-     768,   768,   776,   776,   784,   784,   792,   792,   800,   800,
-     808,   808,   816,   816,   824,   829,   838,   838,   850,   851,
-     854,   855,   860,   860,   871,   871,   881,   882,   885,   886,
-     889,   890,   891,   892,   893,   894,   895,   896,   899,   901,
-     906,   908,   910,   910,   918,   918,   926,   928,   928,   936,
-     945,   945,   957,   958,   963,   964,   969,   969,   980,   980,
-     991,   992,   997,   998,  1003,  1004,  1005,  1006,  1007,  1008,
-    1011,  1013,  1013,  1021,  1023,  1025,  1033,  1033,  1045,  1046,
-    1049,  1050,  1053,  1053,  1061,  1061,  1069,  1070,  1073,  1074,
-    1075,  1078,  1078,  1089,  1089,  1099,  1100,  1103,  1104,  1107,
-    1107,  1115,  1115,  1123,  1124,  1127,  1128,  1132,  1133,  1134,
-    1135,  1136,  1137,  1138,  1139,  1140,  1141,  1142,  1143,  1146,
-    1146,  1154,  1154,  1162,  1162,  1170,  1170,  1178,  1178,  1186,
-    1186,  1194,  1194,  1202,  1202,  1211,  1211,  1219,  1219,  1232,
-    1232,  1242,  1242,  1253,  1253,  1263,  1264,  1267,  1267,  1275,
-    1276,  1279,  1280,  1283,  1284,  1285,  1286,  1287,  1288,  1289,
-    1292,  1294,  1294,  1305,  1305,  1315,  1316,  1319,  1320,  1321,
-    1322,  1323,  1324,  1325,  1328,  1333,  1333,  1341,  1346,  1353,
-    1360,  1360,  1370,  1371,  1374,  1375,  1378,  1378,  1386,  1386,
-    1396,  1396,  1408,  1408,  1415,  1415,  1427,  1427,  1440,  1441,
-    1445,  1449,  1449,  1461,  1462,  1466,  1466,  1474,  1475,  1478,
-    1479,  1480,  1481,  1482,  1485,  1489,  1489,  1497,  1497,  1507,
-    1508,  1511,  1511,  1519,  1520,  1523,  1523
+       0,   201,   201,   201,   202,   202,   203,   203,   204,   204,
+     205,   205,   206,   206,   207,   207,   208,   208,   209,   209,
+     210,   210,   218,   219,   220,   221,   222,   223,   224,   227,
+     232,   232,   244,   245,   248,   252,   259,   259,   267,   267,
+     274,   275,   278,   282,   293,   303,   303,   315,   316,   320,
+     321,   322,   323,   324,   327,   327,   344,   344,   352,   353,
+     358,   359,   360,   361,   362,   363,   364,   365,   366,   367,
+     368,   369,   370,   371,   372,   373,   374,   375,   376,   377,
+     378,   379,   382,   387,   392,   397,   402,   407,   413,   413,
+     423,   424,   427,   428,   431,   431,   439,   439,   449,   449,
+     456,   457,   460,   460,   470,   470,   480,   481,   484,   485,
+     486,   487,   488,   489,   490,   491,   492,   495,   495,   503,
+     503,   511,   511,   519,   519,   527,   527,   535,   540,   545,
+     550,   555,   555,   565,   566,   569,   570,   571,   572,   575,
+     580,   585,   590,   590,   600,   601,   604,   605,   608,   608,
+     616,   616,   624,   625,   626,   629,   630,   633,   633,   641,
+     641,   649,   649,   659,   660,   666,   674,   674,   687,   688,
+     691,   692,   699,   699,   722,   722,   731,   732,   736,   737,
+     738,   739,   740,   741,   742,   743,   744,   745,   746,   747,
+     748,   749,   750,   751,   752,   753,   754,   755,   758,   758,
+     766,   766,   774,   774,   782,   782,   790,   790,   798,   798,
+     806,   806,   814,   814,   822,   827,   836,   836,   848,   849,
+     852,   853,   858,   858,   869,   869,   879,   880,   883,   884,
+     887,   888,   889,   890,   891,   892,   893,   894,   897,   899,
+     904,   906,   908,   908,   916,   916,   924,   926,   926,   934,
+     943,   943,   955,   956,   961,   962,   967,   967,   978,   978,
+     989,   990,   995,   996,  1001,  1002,  1003,  1004,  1005,  1006,
+    1009,  1011,  1011,  1019,  1021,  1023,  1031,  1031,  1043,  1044,
+    1047,  1048,  1051,  1051,  1059,  1059,  1067,  1068,  1071,  1072,
+    1073,  1076,  1076,  1087,  1087,  1097,  1098,  1101,  1102,  1105,
+    1105,  1113,  1113,  1121,  1122,  1125,  1126,  1130,  1131,  1132,
+    1133,  1134,  1135,  1136,  1137,  1138,  1139,  1140,  1141,  1144,
+    1144,  1152,  1152,  1160,  1160,  1168,  1168,  1176,  1176,  1184,
+    1184,  1192,  1192,  1200,  1200,  1209,  1209,  1217,  1217,  1230,
+    1230,  1240,  1240,  1251,  1251,  1261,  1262,  1265,  1265,  1273,
+    1274,  1277,  1278,  1281,  1282,  1283,  1284,  1285,  1286,  1287,
+    1290,  1292,  1292,  1303,  1303,  1313,  1314,  1317,  1318,  1319,
+    1320,  1321,  1322,  1323,  1326,  1331,  1331,  1339,  1344,  1351,
+    1358,  1358,  1368,  1369,  1372,  1373,  1376,  1376,  1384,  1384,
+    1394,  1394,  1406,  1406,  1413,  1413,  1425,  1425,  1438,  1439,
+    1443,  1447,  1447,  1459,  1460,  1464,  1464,  1472,  1473,  1476,
+    1477,  1478,  1479,  1480,  1483,  1487,  1487,  1495,  1495,  1505,
+    1506,  1509,  1509,  1517,  1518,  1521,  1521
   };
 
   // Print the state stack on the debug stream.
@@ -3492,8 +3513,8 @@ namespace isc { namespace dhcp {
 
 #line 14 "dhcp4_parser.yy" // lalr1.cc:1167
 } } // isc::dhcp
-#line 3496 "dhcp4_parser.cc" // lalr1.cc:1167
-#line 1531 "dhcp4_parser.yy" // lalr1.cc:1168
+#line 3517 "dhcp4_parser.cc" // lalr1.cc:1167
+#line 1529 "dhcp4_parser.yy" // lalr1.cc:1168
 
 
 void
index 6ec3447b29e1d46895abd7556d73853b9153d16f..14dbd3df9742eefc181d93b837fb184350ceca0e 100644 (file)
@@ -40,7 +40,7 @@
 #ifndef YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 # define YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "dhcp4_parser.yy" // lalr1.cc:377
+#line 17 "dhcp4_parser.yy" // lalr1.cc:392
 
 #include <string>
 #include <cc/data.h>
@@ -52,7 +52,7 @@ using namespace isc::dhcp;
 using namespace isc::data;
 using namespace std;
 
-#line 56 "dhcp4_parser.h" // lalr1.cc:377
+#line 56 "dhcp4_parser.h" // lalr1.cc:392
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -135,9 +135,9 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined PARSER4_DEBUG */
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:377
+#line 14 "dhcp4_parser.yy" // lalr1.cc:392
 namespace isc { namespace dhcp {
-#line 141 "dhcp4_parser.h" // lalr1.cc:377
+#line 141 "dhcp4_parser.h" // lalr1.cc:392
 
 
 
@@ -305,6 +305,7 @@ namespace isc { namespace dhcp {
     union union_type
     {
       // value
+      // socket_type
       char dummy1[sizeof(ElementPtr)];
 
       // "boolean"
@@ -352,8 +353,8 @@ namespace isc { namespace dhcp {
         TOKEN_INTERFACES_CONFIG = 266,
         TOKEN_INTERFACES = 267,
         TOKEN_DHCP_SOCKET_TYPE = 268,
-        TOKEN_DHCP_SOCKET_TYPE_RAW = 269,
-        TOKEN_DHCP_SOCKET_TYPE_UDP = 270,
+        TOKEN_RAW = 269,
+        TOKEN_UDP = 270,
         TOKEN_ECHO_CLIENT_ID = 271,
         TOKEN_MATCH_CLIENT_ID = 272,
         TOKEN_NEXT_SERVER = 273,
@@ -606,11 +607,11 @@ namespace isc { namespace dhcp {
 
     static inline
     symbol_type
-    make_DHCP_SOCKET_TYPE_RAW (const location_type& l);
+    make_RAW (const location_type& l);
 
     static inline
     symbol_type
-    make_DHCP_SOCKET_TYPE_UDP (const location_type& l);
+    make_UDP (const location_type& l);
 
     static inline
     symbol_type
@@ -1262,6 +1263,7 @@ namespace isc { namespace dhcp {
       switch (other.type_get ())
     {
       case 116: // value
+      case 155: // socket_type
         value.copy< ElementPtr > (other.value);
         break;
 
@@ -1299,6 +1301,7 @@ namespace isc { namespace dhcp {
       switch (this->type_get ())
     {
       case 116: // value
+      case 155: // socket_type
         value.copy< ElementPtr > (v);
         break;
 
@@ -1395,6 +1398,7 @@ namespace isc { namespace dhcp {
     switch (yytype)
     {
       case 116: // value
+      case 155: // socket_type
         value.template destroy< ElementPtr > ();
         break;
 
@@ -1438,6 +1442,7 @@ namespace isc { namespace dhcp {
       switch (this->type_get ())
     {
       case 116: // value
+      case 155: // socket_type
         value.move< ElementPtr > (s.value);
         break;
 
@@ -1600,15 +1605,15 @@ namespace isc { namespace dhcp {
   }
 
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP_SOCKET_TYPE_RAW (const location_type& l)
+  Dhcp4Parser::make_RAW (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP_SOCKET_TYPE_RAW, l);
+    return symbol_type (token::TOKEN_RAW, l);
   }
 
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP_SOCKET_TYPE_UDP (const location_type& l)
+  Dhcp4Parser::make_UDP (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP_SOCKET_TYPE_UDP, l);
+    return symbol_type (token::TOKEN_UDP, l);
   }
 
   Dhcp4Parser::symbol_type
@@ -2140,9 +2145,9 @@ namespace isc { namespace dhcp {
   }
 
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:377
+#line 14 "dhcp4_parser.yy" // lalr1.cc:392
 } } // isc::dhcp
-#line 2146 "dhcp4_parser.h" // lalr1.cc:377
+#line 2151 "dhcp4_parser.h" // lalr1.cc:392
 
 
 
index cc8324aee1302d876cc6f59da36ad88d4b591700..c8d473bb73c25805bf0d7b94f2bc20e741bc2b3f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -53,8 +53,8 @@ using namespace std;
   INTERFACES_CONFIG "interfaces-config"
   INTERFACES "interfaces"
   DHCP_SOCKET_TYPE "dhcp-socket-type"
-  DHCP_SOCKET_TYPE_RAW "raw"
-  DHCP_SOCKET_TYPE_UDP "udp"
+  RAW "raw"
+  UDP "udp"
 
   ECHO_CLIENT_ID "echo-client-id"
   MATCH_CLIENT_ID "match-client-id"
@@ -187,6 +187,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> socket_type
 
 %printer { yyoutput << $$; } <*>;
 
@@ -445,19 +446,16 @@ interfaces_list: INTERFACES {
     ctx.leave();
 };
 
-dhcp_socket_type: dhcp_socket_type_raw
-                | dhcp_socket_type_udp
-                ;
-
-dhcp_socket_type_raw: DHCP_SOCKET_TYPE COLON DHCP_SOCKET_TYPE_RAW {
-    ElementPtr type(new StringElement("raw", ctx.loc2pos(@3)));
-    ctx.stack_.back()->set("dhcp-socket-type", type);
+dhcp_socket_type: DHCP_SOCKET_TYPE {
+    ctx.enter(ctx.DHCP_SOCKET_TYPE);
+} COLON socket_type {
+    ctx.stack_.back()->set("dhcp-socket-type", $4);
+    ctx.leave();
 };
 
-dhcp_socket_type_udp: DHCP_SOCKET_TYPE COLON DHCP_SOCKET_TYPE_UDP {
-    ElementPtr type(new StringElement("udp", ctx.loc2pos(@3)));
-    ctx.stack_.back()->set("dhcp-socket-type", type);
-};
+socket_type: RAW { $$ = ElementPtr(new StringElement("raw", ctx.loc2pos(@1))); }
+           | UDP { $$ = ElementPtr(new StringElement("udp", ctx.loc2pos(@1))); }
+           ;
 
 lease_database: LEASE_DATABASE {
     ElementPtr i(new MapElement(ctx.loc2pos(@1)));
@@ -1371,11 +1369,11 @@ control_socket_params: control_socket_param
                      | control_socket_params COMMA control_socket_param
                      ;
 
-control_socket_param: socket_type
-                    | socket_name
+control_socket_param: control_socket_type
+                    | control_socket_name
                     ;
 
-socket_type: SOCKET_TYPE {
+control_socket_type: SOCKET_TYPE {
     ctx.enter(ctx.NO_KEYWORD);
 } COLON STRING {
     ElementPtr stype(new StringElement($4, ctx.loc2pos(@4)));
@@ -1383,7 +1381,7 @@ socket_type: SOCKET_TYPE {
     ctx.leave();
 };
 
-socket_name: SOCKET_NAME {
+control_socket_name: SOCKET_NAME {
     ctx.enter(ctx.NO_KEYWORD);
 } COLON STRING {
     ElementPtr name(new StringElement($4, ctx.loc2pos(@4)));
index 250f4dbc8f43054790a7e6fb47af8d00b8e52408..5951ec15e5a0a70de69583fba88298ff794210e9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -127,6 +127,8 @@ Parser4Context::contextName()
         return ("Logging");
     case INTERFACES_CONFIG:
         return ("interfaces-config");
+    case DHCP_SOCKET_TYPE:
+        return ("dhcp-socket-type");
     case LEASE_DATABASE:
         return ("lease-database");
     case HOSTS_DATABASE:
index 4c8c7d1631d6846babe4c4a03eb57de263d404ff..1e6fcf7bae9b818601662a87bc881f429d00c649 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -193,6 +193,9 @@ public:
         /// Used while parsing Dhcp4/interfaces structures.
         INTERFACES_CONFIG,
 
+        /// Used while parsing Dhcp4/interfaces/dhcp-socket-type structures.
+        DHCP_SOCKET_TYPE,
+
         /// Used while parsing Dhcp4/lease-database structures.
         LEASE_DATABASE,