]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3477] Updated dhcp4 syntax
authorFrancis Dupont <fdupont@isc.org>
Thu, 4 Jul 2024 11:39:28 +0000 (13:39 +0200)
committerFrancis Dupont <fdupont@isc.org>
Thu, 1 Aug 2024 07:23:53 +0000 (09:23 +0200)
doc/examples/agent/simple.json
doc/examples/kea4/all-keys.json
doc/examples/kea4/comments.json
src/bin/dhcp4/dhcp4_lexer.cc
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.cc
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp4/tests/parser_unittest.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc

index 5e82b99530bd217d154358e986148364d8dec87e..7597f652db3e6b1f42ccc91847c7687100c5e7b1 100644 (file)
@@ -47,7 +47,7 @@
                     "password": "1234"
                 },
 
-                // This specifies a hiddent client.
+                // This specifies a hidden client.
                 {
                     // The user id is the content of the file /tmp/kea-creds/hiddenu.
                     "user-file": "hiddenu",
index ff62093877659ef7bf3d2bc6af7882dbb5d49f77..fe1105baf7646a6861f26c355bbdfebd67b2bc4a 100644 (file)
         },
 
         // Command control socket configuration parameters for the Kea DHCPv4 server.
-        "control-socket": {
-            // Location of the UNIX domain socket file the DHCPv4 server uses
-            // to receive control commands from the Kea Control Agent or the
-            // local server administrator.
-            "socket-name": "/tmp/kea4-ctrl-socket",
-
-            // Control socket type used by the Kea DHCPv4 server. The 'unix'
-            // socket is currently the only supported type.
-            "socket-type": "unix"
-        },
+        "control-sockets": [
+            {
+                // Control socket type used by the Kea DHCPv4 server.
+                // Must be unix, http or https.
+                "socket-type": "unix",
+
+               // Location of the UNIX domain socket file the DHCPv4
+               // server uses to receive control commands from the
+               // local server administrator.
+               "socket-name": "/tmp/kea4-ctrl-socket"
+            },
+            {
+                // Control socket type used by the Kea DHCPv4 server.
+                // Must be unix, http or https.
+                "socket-type": "https",
+
+                // Address of the HTTPS socket the Kea DHCPv4 server should
+                // listen for incoming queries. In fact an alias of
+                // socket-name.
+                "socket-address": "127.0.0.1",
+
+                // Port of the HTTPS socket the Kea DHCPv4 server
+                // should listen for incoming queries. If enabling HA
+                // and multi-threading, the 8000 port is used by the
+                // HA hook library http listener. When using HA hook
+                // library with multi-threading to function, make sure
+                // the port used by dedicated listener is different
+                // (e.g. 8001) than the one specified here.  Note the
+                // commands should still be sent to a control socket.
+                // The dedicated listener is specifically for HA
+                // updates only.
+                "socket-port": 8000,
+
+                // TLS trust anchor (Certificate Authority). This is a
+                // file name or a directory path. Make sense with other
+                // TLS parameters only for the https control socket type.
+                "trust-anchor": "my-ca",
+
+                // TLS server certificate file name.
+                "cert-file": "my-cert",
+
+                // TLS server private key file name.
+                "key-file": "my-key",
+
+                // TLS require client certificates flag. Default is
+                // true and means require client certificates. False
+                // means they are optional.
+                "cert-required": true,
+
+                // Optional authentication.
+                "authentication": {
+
+                    // Required authentication type. The only
+                    // supported value is basic for the basic HTTP
+                    // authentication.
+                    "type": "basic",
+
+                    // An optional parameter is the basic HTTP
+                    // authentication realm.  Its default is
+                    // "kea-dhcpv4-server"
+                    "realm": "kea-dhcpv4-server",
+
+                    // This optional parameter can be used to specify a common
+                    // prefix for files handling client credentials.
+                    "directory": "/tmp/kea-creds",
+
+                    // This list specifies the user ids and passwords
+                    // to use for basic HTTP authentication. If empty
+                    // or not present any client is authorized.
+                    "clients": [
+                        // This specifies an authorized client.
+                        {
+                            // The user id must not be empty or
+                            // contain the ':' character. It is a
+                            // mandatory parameter.
+                            "user": "admin",
+
+                            // If password is not specified an empty
+                            // password is used.
+                            "password": "1234"
+                        },
+
+                        // This specifies a hidden client.
+                        {
+                            // The user id is the content of the
+                            // file /tmp/kea-creds/hiddenu.
+                            "user-file": "hiddenu",
+
+                            // The password is the content of the
+                            // file /tmp/kea-creds/hiddenp.
+                            "password-file": "hiddenp"
+                        },
+
+                        // This specifies a hidden client using a
+                        // secret in a file.
+                        {
+                            // The secret is the content of the file
+                            // /tmp/kea-creds/hiddens which must be in
+                            // the <user-id>:<password> format.
+                            "password-file": "hiddens"
+                        }
+                    ]
+                }
+            }
+        ],
+
 
         // Specifies a prefix to be prepended to the generated Client FQDN.
         // It may be specified at the global, shared-network, and subnet levels.
index a5cfbdcd5c76d23b79b57ea5742a72fe28a1f229..af013d4a49d1f07c5b6c66a0110fc7ef04ce63d6 100644 (file)
        }
    ],
 
-   // In control socket (more for the agent)
-   "control-socket": {
-       "socket-type": "unix",
-       "socket-name": "/tmp/kea4-ctrl-socket",
-       "user-context": { "comment": "Indirect comment" }
-   },
+   // In control sockets (more for the agent)
+   "control-sockets": [
+       {
+           "socket-type": "unix",
+           "socket-name": "/tmp/kea4-ctrl-socket",
+           "user-context": { "comment": "Indirect comment" }
+       },
+       {
+           "comment": "HTTP control socket",
+           "socket-type": "http",
+           "socket-address": "::1",
+           "socket-port": 8000,
+           
+           // In authentication
+           "authentication": {
+               "comment": "basic HTTP authentication",
+               "type": "basic",
+               // In basic HTTP authentication clients
+               "clients": [ {
+                   "comment": "admin is authorized",
+                   "user": "admin",
+                   "password": "1234"
+               } ]
+           }
+       }
+   ],
 
    // In shared networks
    "shared-networks": [ {
index 1fb5e715afdc6867845614801179843e4fd18dfd..87dacd5fb2c20ad23d6fa469eaac4308d5c711a0 100644 (file)
@@ -328,6 +328,7 @@ typedef int16_t flex_int16_t;
 typedef uint16_t flex_uint16_t;
 typedef int32_t flex_int32_t;
 typedef uint32_t flex_uint32_t;
+typedef uint64_t flex_uint64_t;
 #else
 typedef signed char flex_int8_t;
 typedef short int flex_int16_t;
@@ -452,7 +453,7 @@ typedef size_t yy_size_t;
 #endif
 
 /* %if-not-reentrant */
-extern int yyleng;
+extern yy_size_t yyleng;
 /* %endif */
 
 /* %if-c-only */
@@ -505,7 +506,7 @@ struct yy_buffer_state
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
         */
-       int yy_n_chars;
+       yy_size_t yy_n_chars;
 
        /* Whether we "own" the buffer - i.e., we know we created it,
         * and can realloc() it to grow it, and should free() it to
@@ -586,8 +587,8 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
 /* %not-for-header */
 /* yy_hold_char holds the character lost when yytext is formed. */
 static char yy_hold_char;
-static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int yyleng;
+static yy_size_t yy_n_chars;           /* number of characters read into yy_ch_buf */
+yy_size_t yyleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = NULL;
@@ -617,7 +618,7 @@ static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
 
 YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
 YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
-YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, yy_size_t len  );
 
 /* %endif */
 
@@ -685,7 +686,7 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 #define YY_DO_BEFORE_ACTION \
        (yytext_ptr) = yy_bp; \
 /* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
-       yyleng = (int) (yy_cp - yy_bp); \
+       yyleng = (yy_size_t) (yy_cp - yy_bp); \
        (yy_hold_char) = *yy_cp; \
        *yy_cp = '\0'; \
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
@@ -2180,23 +2181,23 @@ static const flex_int16_t yy_rule_linenum[238] =
       678,  690,  702,  714,  725,  736,  745,  754,  763,  774,
       783,  792,  803,  814,  825,  836,  847,  858,  869,  880,
       891,  900,  909,  918,  928,  939,  949,  960,  969,  979,
-      993, 1009, 1018, 1027, 1036, 1045, 1054, 1063, 1085, 1107,
-
-     1116, 1126, 1135, 1146, 1157, 1168, 1178, 1187, 1198, 1209,
-     1220, 1231, 1243, 1252, 1261, 1270, 1279, 1288, 1297, 1306,
-     1315, 1324, 1333, 1343, 1354, 1366, 1375, 1384, 1393, 1403,
-     1413, 1423, 1433, 1443, 1453, 1462, 1472, 1481, 1490, 1499,
-     1508, 1518, 1527, 1536, 1546, 1555, 1564, 1573, 1582, 1591,
-     1600, 1609, 1618, 1627, 1636, 1645, 1654, 1663, 1672, 1681,
-     1690, 1699, 1708, 1717, 1726, 1735, 1744, 1753, 1762, 1771,
-     1780, 1789, 1798, 1807, 1816, 1825, 1834, 1843, 1852, 1861,
-     1870, 1879, 1888, 1897, 1906, 1915, 1924, 1933, 1942, 1953,
-     1964, 1974, 1984, 1994, 2004, 2014, 2024, 2034, 2044, 2054,
-
-     2063, 2072, 2081, 2090, 2101, 2112, 2125, 2138, 2151, 2160,
-     2169, 2178, 2187, 2196, 2205, 2214, 2223, 2235, 2244, 2345,
-     2361, 2410, 2418, 2433, 2434, 2435, 2436, 2437, 2438, 2440,
-     2458, 2471, 2476, 2480, 2482, 2484, 2486
+      993, 1009, 1018, 1027, 1036, 1045, 1054, 1063, 1087, 1111,
+
+     1120, 1130, 1139, 1150, 1161, 1172, 1182, 1191, 1202, 1213,
+     1224, 1235, 1247, 1256, 1265, 1274, 1283, 1292, 1301, 1310,
+     1319, 1328, 1337, 1347, 1358, 1370, 1379, 1388, 1397, 1407,
+     1417, 1427, 1437, 1447, 1457, 1466, 1476, 1485, 1494, 1503,
+     1512, 1522, 1531, 1540, 1550, 1559, 1568, 1577, 1586, 1595,
+     1604, 1613, 1622, 1631, 1640, 1649, 1658, 1667, 1676, 1685,
+     1694, 1703, 1712, 1721, 1730, 1739, 1748, 1757, 1766, 1775,
+     1784, 1793, 1802, 1811, 1820, 1829, 1838, 1847, 1856, 1865,
+     1874, 1883, 1892, 1901, 1910, 1919, 1928, 1937, 1946, 1957,
+     1968, 1978, 1988, 1998, 2008, 2018, 2028, 2038, 2048, 2058,
+
+     2067, 2076, 2085, 2094, 2105, 2116, 2129, 2142, 2155, 2164,
+     2173, 2182, 2191, 2200, 2209, 2218, 2227, 2239, 2248, 2349,
+     2365, 2414, 2422, 2437, 2438, 2439, 2440, 2441, 2442, 2444,
+     2462, 2475, 2480, 2484, 2486, 2488, 2490
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -2251,7 +2252,7 @@ using namespace isc::dhcp;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg)
-#line 2254 "dhcp4_lexer.cc"
+#line 2255 "dhcp4_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -2277,8 +2278,8 @@ using namespace isc::dhcp;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 2280 "dhcp4_lexer.cc"
 #line 2281 "dhcp4_lexer.cc"
+#line 2282 "dhcp4_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -2334,7 +2335,7 @@ FILE *yyget_out ( void );
 
 void yyset_out  ( FILE * _out_str  );
 
-                       int yyget_leng ( void );
+                       yy_size_t yyget_leng ( void );
 
 char *yyget_text ( void );
 
@@ -2421,7 +2422,7 @@ static int input ( void );
        if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
                { \
                int c = '*'; \
-               int n; \
+               yy_size_t n; \
                for ( n = 0; n < max_size && \
                             (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
@@ -2606,7 +2607,7 @@ YY_DECL
     }
 
 
-#line 2609 "dhcp4_lexer.cc"
+#line 2610 "dhcp4_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -3056,7 +3057,7 @@ YY_RULE_SETUP
     case isc::dhcp::Parser4Context::HOSTS_DATABASE:
     case isc::dhcp::Parser4Context::OPTION_DEF:
     case isc::dhcp::Parser4Context::CONFIG_DATABASE:
-    case isc::dhcp::Parser4Context::AUTH_TYPE:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
         return isc::dhcp::Dhcp4Parser::make_TYPE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("type", driver.loc_);
@@ -3914,6 +3915,8 @@ YY_RULE_SETUP
     case isc::dhcp::Parser4Context::RESERVATIONS:
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
+    case isc::dhcp::Parser4Context::CLIENTS:
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -3926,7 +3929,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 1085 "dhcp4_lexer.ll"
+#line 1087 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3939,6 +3942,8 @@ YY_RULE_SETUP
     case isc::dhcp::Parser4Context::RESERVATIONS:
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
+    case isc::dhcp::Parser4Context::CLIENTS:
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -3951,7 +3956,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 1107 "dhcp4_lexer.ll"
+#line 1111 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3963,7 +3968,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 1116 "dhcp4_lexer.ll"
+#line 1120 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3976,7 +3981,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 1126 "dhcp4_lexer.ll"
+#line 1130 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3988,7 +3993,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 1135 "dhcp4_lexer.ll"
+#line 1139 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4002,7 +4007,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 1146 "dhcp4_lexer.ll"
+#line 1150 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4016,7 +4021,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 1157 "dhcp4_lexer.ll"
+#line 1161 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4030,7 +4035,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 1168 "dhcp4_lexer.ll"
+#line 1172 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4043,7 +4048,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 1178 "dhcp4_lexer.ll"
+#line 1182 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4055,7 +4060,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 1187 "dhcp4_lexer.ll"
+#line 1191 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4069,7 +4074,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 1198 "dhcp4_lexer.ll"
+#line 1202 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4083,7 +4088,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 1209 "dhcp4_lexer.ll"
+#line 1213 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4097,7 +4102,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 1220 "dhcp4_lexer.ll"
+#line 1224 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4111,7 +4116,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 1231 "dhcp4_lexer.ll"
+#line 1235 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4125,7 +4130,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 1243 "dhcp4_lexer.ll"
+#line 1247 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4137,7 +4142,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 1252 "dhcp4_lexer.ll"
+#line 1256 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4149,7 +4154,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 1261 "dhcp4_lexer.ll"
+#line 1265 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4161,7 +4166,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 1270 "dhcp4_lexer.ll"
+#line 1274 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4173,7 +4178,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 1279 "dhcp4_lexer.ll"
+#line 1283 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4185,7 +4190,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 1288 "dhcp4_lexer.ll"
+#line 1292 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4197,7 +4202,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 1297 "dhcp4_lexer.ll"
+#line 1301 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4209,7 +4214,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 1306 "dhcp4_lexer.ll"
+#line 1310 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4221,7 +4226,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 1315 "dhcp4_lexer.ll"
+#line 1319 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4233,7 +4238,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 1324 "dhcp4_lexer.ll"
+#line 1328 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4245,7 +4250,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 1333 "dhcp4_lexer.ll"
+#line 1337 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4258,7 +4263,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 1343 "dhcp4_lexer.ll"
+#line 1347 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4272,7 +4277,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 1354 "dhcp4_lexer.ll"
+#line 1358 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4287,7 +4292,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 1366 "dhcp4_lexer.ll"
+#line 1370 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4299,7 +4304,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 1375 "dhcp4_lexer.ll"
+#line 1379 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4311,7 +4316,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 1384 "dhcp4_lexer.ll"
+#line 1388 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4323,7 +4328,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 1393 "dhcp4_lexer.ll"
+#line 1397 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4336,7 +4341,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 1403 "dhcp4_lexer.ll"
+#line 1407 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4349,7 +4354,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 1413 "dhcp4_lexer.ll"
+#line 1417 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4362,7 +4367,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 1423 "dhcp4_lexer.ll"
+#line 1427 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4375,7 +4380,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 1433 "dhcp4_lexer.ll"
+#line 1437 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4388,7 +4393,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 1443 "dhcp4_lexer.ll"
+#line 1447 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4401,7 +4406,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 1453 "dhcp4_lexer.ll"
+#line 1457 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RESERVATIONS:
@@ -4413,7 +4418,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 1462 "dhcp4_lexer.ll"
+#line 1466 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4426,7 +4431,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 1472 "dhcp4_lexer.ll"
+#line 1476 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -4438,7 +4443,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 1481 "dhcp4_lexer.ll"
+#line 1485 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4450,7 +4455,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 1490 "dhcp4_lexer.ll"
+#line 1494 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4462,7 +4467,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 1499 "dhcp4_lexer.ll"
+#line 1503 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4474,7 +4479,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 1508 "dhcp4_lexer.ll"
+#line 1512 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4487,7 +4492,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 1518 "dhcp4_lexer.ll"
+#line 1522 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RESERVATIONS:
@@ -4499,7 +4504,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 1527 "dhcp4_lexer.ll"
+#line 1531 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RELAY:
@@ -4511,7 +4516,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 1536 "dhcp4_lexer.ll"
+#line 1540 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4523,7 +4528,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 1546 "dhcp4_lexer.ll"
+#line 1550 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -4535,7 +4540,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 1555 "dhcp4_lexer.ll"
+#line 1559 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -4547,7 +4552,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 1564 "dhcp4_lexer.ll"
+#line 1568 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4559,7 +4564,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 1573 "dhcp4_lexer.ll"
+#line 1577 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4571,7 +4576,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 149:
 YY_RULE_SETUP
-#line 1582 "dhcp4_lexer.ll"
+#line 1586 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4583,7 +4588,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 150:
 YY_RULE_SETUP
-#line 1591 "dhcp4_lexer.ll"
+#line 1595 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4595,7 +4600,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 1600 "dhcp4_lexer.ll"
+#line 1604 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4607,7 +4612,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 1609 "dhcp4_lexer.ll"
+#line 1613 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4619,7 +4624,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 1618 "dhcp4_lexer.ll"
+#line 1622 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4631,7 +4636,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 154:
 YY_RULE_SETUP
-#line 1627 "dhcp4_lexer.ll"
+#line 1631 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4643,7 +4648,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 155:
 YY_RULE_SETUP
-#line 1636 "dhcp4_lexer.ll"
+#line 1640 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4655,7 +4660,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 156:
 YY_RULE_SETUP
-#line 1645 "dhcp4_lexer.ll"
+#line 1649 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4667,7 +4672,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 157:
 YY_RULE_SETUP
-#line 1654 "dhcp4_lexer.ll"
+#line 1658 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4679,7 +4684,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 158:
 YY_RULE_SETUP
-#line 1663 "dhcp4_lexer.ll"
+#line 1667 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4691,7 +4696,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 159:
 YY_RULE_SETUP
-#line 1672 "dhcp4_lexer.ll"
+#line 1676 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4703,7 +4708,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 1681 "dhcp4_lexer.ll"
+#line 1685 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4715,7 +4720,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 161:
 YY_RULE_SETUP
-#line 1690 "dhcp4_lexer.ll"
+#line 1694 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4727,7 +4732,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 162:
 YY_RULE_SETUP
-#line 1699 "dhcp4_lexer.ll"
+#line 1703 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4739,7 +4744,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 163:
 YY_RULE_SETUP
-#line 1708 "dhcp4_lexer.ll"
+#line 1712 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4751,7 +4756,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 164:
 YY_RULE_SETUP
-#line 1717 "dhcp4_lexer.ll"
+#line 1721 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4763,7 +4768,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 165:
 YY_RULE_SETUP
-#line 1726 "dhcp4_lexer.ll"
+#line 1730 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4775,7 +4780,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 166:
 YY_RULE_SETUP
-#line 1735 "dhcp4_lexer.ll"
+#line 1739 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4787,7 +4792,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 167:
 YY_RULE_SETUP
-#line 1744 "dhcp4_lexer.ll"
+#line 1748 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4799,7 +4804,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 168:
 YY_RULE_SETUP
-#line 1753 "dhcp4_lexer.ll"
+#line 1757 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4811,7 +4816,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 169:
 YY_RULE_SETUP
-#line 1762 "dhcp4_lexer.ll"
+#line 1766 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTH_TYPE:
@@ -4823,7 +4828,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 170:
 YY_RULE_SETUP
-#line 1771 "dhcp4_lexer.ll"
+#line 1775 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4835,7 +4840,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 171:
 YY_RULE_SETUP
-#line 1780 "dhcp4_lexer.ll"
+#line 1784 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4847,7 +4852,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 172:
 YY_RULE_SETUP
-#line 1789 "dhcp4_lexer.ll"
+#line 1793 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4859,7 +4864,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 1798 "dhcp4_lexer.ll"
+#line 1802 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENTS:
@@ -4871,7 +4876,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 174:
 YY_RULE_SETUP
-#line 1807 "dhcp4_lexer.ll"
+#line 1811 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENTS:
@@ -4883,7 +4888,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 175:
 YY_RULE_SETUP
-#line 1816 "dhcp4_lexer.ll"
+#line 1820 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4895,7 +4900,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 176:
 YY_RULE_SETUP
-#line 1825 "dhcp4_lexer.ll"
+#line 1829 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4907,7 +4912,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 177:
 YY_RULE_SETUP
-#line 1834 "dhcp4_lexer.ll"
+#line 1838 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -4919,7 +4924,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 178:
 YY_RULE_SETUP
-#line 1843 "dhcp4_lexer.ll"
+#line 1847 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -4931,7 +4936,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 179:
 YY_RULE_SETUP
-#line 1852 "dhcp4_lexer.ll"
+#line 1856 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -4943,7 +4948,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 1861 "dhcp4_lexer.ll"
+#line 1865 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4955,7 +4960,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 1870 "dhcp4_lexer.ll"
+#line 1874 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -4967,7 +4972,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 182:
 YY_RULE_SETUP
-#line 1879 "dhcp4_lexer.ll"
+#line 1883 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -4979,7 +4984,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 183:
 YY_RULE_SETUP
-#line 1888 "dhcp4_lexer.ll"
+#line 1892 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -4991,7 +4996,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 184:
 YY_RULE_SETUP
-#line 1897 "dhcp4_lexer.ll"
+#line 1901 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5003,7 +5008,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 185:
 YY_RULE_SETUP
-#line 1906 "dhcp4_lexer.ll"
+#line 1910 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5015,7 +5020,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 186:
 YY_RULE_SETUP
-#line 1915 "dhcp4_lexer.ll"
+#line 1919 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5027,7 +5032,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 187:
 YY_RULE_SETUP
-#line 1924 "dhcp4_lexer.ll"
+#line 1928 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5039,7 +5044,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 188:
 YY_RULE_SETUP
-#line 1933 "dhcp4_lexer.ll"
+#line 1937 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5051,7 +5056,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 1942 "dhcp4_lexer.ll"
+#line 1946 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5065,7 +5070,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 1953 "dhcp4_lexer.ll"
+#line 1957 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5079,7 +5084,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 1964 "dhcp4_lexer.ll"
+#line 1968 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -5092,7 +5097,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 1974 "dhcp4_lexer.ll"
+#line 1978 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -5105,7 +5110,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 1984 "dhcp4_lexer.ll"
+#line 1988 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) {
@@ -5118,7 +5123,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 1994 "dhcp4_lexer.ll"
+#line 1998 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5131,7 +5136,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 195:
 YY_RULE_SETUP
-#line 2004 "dhcp4_lexer.ll"
+#line 2008 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5144,7 +5149,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 196:
 YY_RULE_SETUP
-#line 2014 "dhcp4_lexer.ll"
+#line 2018 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5157,7 +5162,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 197:
 YY_RULE_SETUP
-#line 2024 "dhcp4_lexer.ll"
+#line 2028 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5170,7 +5175,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 198:
 YY_RULE_SETUP
-#line 2034 "dhcp4_lexer.ll"
+#line 2038 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5183,7 +5188,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 199:
 YY_RULE_SETUP
-#line 2044 "dhcp4_lexer.ll"
+#line 2048 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5196,7 +5201,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 2054 "dhcp4_lexer.ll"
+#line 2058 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5208,7 +5213,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 201:
 YY_RULE_SETUP
-#line 2063 "dhcp4_lexer.ll"
+#line 2067 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5220,7 +5225,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 202:
 YY_RULE_SETUP
-#line 2072 "dhcp4_lexer.ll"
+#line 2076 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5232,7 +5237,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 203:
 YY_RULE_SETUP
-#line 2081 "dhcp4_lexer.ll"
+#line 2085 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5244,7 +5249,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 204:
 YY_RULE_SETUP
-#line 2090 "dhcp4_lexer.ll"
+#line 2094 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5258,7 +5263,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 205:
 YY_RULE_SETUP
-#line 2101 "dhcp4_lexer.ll"
+#line 2105 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5272,7 +5277,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 206:
 YY_RULE_SETUP
-#line 2112 "dhcp4_lexer.ll"
+#line 2116 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5288,7 +5293,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 207:
 YY_RULE_SETUP
-#line 2125 "dhcp4_lexer.ll"
+#line 2129 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5304,7 +5309,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 208:
 YY_RULE_SETUP
-#line 2138 "dhcp4_lexer.ll"
+#line 2142 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5320,7 +5325,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 209:
 YY_RULE_SETUP
-#line 2151 "dhcp4_lexer.ll"
+#line 2155 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5332,7 +5337,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 210:
 YY_RULE_SETUP
-#line 2160 "dhcp4_lexer.ll"
+#line 2164 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5344,7 +5349,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 211:
 YY_RULE_SETUP
-#line 2169 "dhcp4_lexer.ll"
+#line 2173 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5356,7 +5361,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 212:
 YY_RULE_SETUP
-#line 2178 "dhcp4_lexer.ll"
+#line 2182 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5368,7 +5373,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 213:
 YY_RULE_SETUP
-#line 2187 "dhcp4_lexer.ll"
+#line 2191 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5380,7 +5385,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 214:
 YY_RULE_SETUP
-#line 2196 "dhcp4_lexer.ll"
+#line 2200 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5392,7 +5397,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 215:
 YY_RULE_SETUP
-#line 2205 "dhcp4_lexer.ll"
+#line 2209 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5404,7 +5409,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 216:
 YY_RULE_SETUP
-#line 2214 "dhcp4_lexer.ll"
+#line 2218 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5416,7 +5421,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 217:
 YY_RULE_SETUP
-#line 2223 "dhcp4_lexer.ll"
+#line 2227 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5431,7 +5436,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 218:
 YY_RULE_SETUP
-#line 2235 "dhcp4_lexer.ll"
+#line 2239 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5443,7 +5448,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 219:
 YY_RULE_SETUP
-#line 2244 "dhcp4_lexer.ll"
+#line 2248 "dhcp4_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -5548,7 +5553,7 @@ YY_RULE_SETUP
 case 220:
 /* rule 220 can match eol */
 YY_RULE_SETUP
-#line 2345 "dhcp4_lexer.ll"
+#line 2349 "dhcp4_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     std::string raw(yytext+1);
@@ -5568,7 +5573,7 @@ YY_RULE_SETUP
 case 221:
 /* rule 221 can match eol */
 YY_RULE_SETUP
-#line 2361 "dhcp4_lexer.ll"
+#line 2365 "dhcp4_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     std::string raw(yytext+1);
@@ -5620,7 +5625,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 222:
 YY_RULE_SETUP
-#line 2410 "dhcp4_lexer.ll"
+#line 2414 "dhcp4_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     std::string raw(yytext+1);
@@ -5631,7 +5636,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 223:
 YY_RULE_SETUP
-#line 2418 "dhcp4_lexer.ll"
+#line 2422 "dhcp4_lexer.ll"
 {
     /* Bad string with an open unicode escape at the end */
     std::string raw(yytext+1);
@@ -5649,37 +5654,37 @@ YY_RULE_SETUP
        YY_BREAK
 case 224:
 YY_RULE_SETUP
-#line 2433 "dhcp4_lexer.ll"
+#line 2437 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 225:
 YY_RULE_SETUP
-#line 2434 "dhcp4_lexer.ll"
+#line 2438 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 226:
 YY_RULE_SETUP
-#line 2435 "dhcp4_lexer.ll"
+#line 2439 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 227:
 YY_RULE_SETUP
-#line 2436 "dhcp4_lexer.ll"
+#line 2440 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 228:
 YY_RULE_SETUP
-#line 2437 "dhcp4_lexer.ll"
+#line 2441 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); }
        YY_BREAK
 case 229:
 YY_RULE_SETUP
-#line 2438 "dhcp4_lexer.ll"
+#line 2442 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); }
        YY_BREAK
 case 230:
 YY_RULE_SETUP
-#line 2440 "dhcp4_lexer.ll"
+#line 2444 "dhcp4_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -5700,7 +5705,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 231:
 YY_RULE_SETUP
-#line 2458 "dhcp4_lexer.ll"
+#line 2462 "dhcp4_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -5716,7 +5721,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 232:
 YY_RULE_SETUP
-#line 2471 "dhcp4_lexer.ll"
+#line 2475 "dhcp4_lexer.ll"
 {
     string tmp(yytext);
     return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_);
@@ -5724,33 +5729,33 @@ YY_RULE_SETUP
        YY_BREAK
 case 233:
 YY_RULE_SETUP
-#line 2476 "dhcp4_lexer.ll"
+#line 2480 "dhcp4_lexer.ll"
 {
    return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
 case 234:
 YY_RULE_SETUP
-#line 2480 "dhcp4_lexer.ll"
+#line 2484 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
 case 235:
 YY_RULE_SETUP
-#line 2482 "dhcp4_lexer.ll"
+#line 2486 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
 case 236:
 YY_RULE_SETUP
-#line 2484 "dhcp4_lexer.ll"
+#line 2488 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
 case 237:
 YY_RULE_SETUP
-#line 2486 "dhcp4_lexer.ll"
+#line 2490 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 2488 "dhcp4_lexer.ll"
+#line 2492 "dhcp4_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::dhcp::Dhcp4Parser::make_END(driver.loc_);
@@ -5776,10 +5781,10 @@ case YY_STATE_EOF(INITIAL):
        YY_BREAK
 case 238:
 YY_RULE_SETUP
-#line 2511 "dhcp4_lexer.ll"
+#line 2515 "dhcp4_lexer.ll"
 ECHO;
        YY_BREAK
-#line 5782 "dhcp4_lexer.cc"
+#line 5787 "dhcp4_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -5981,7 +5986,7 @@ static int yy_get_next_buffer (void)
 
        else
                {
-                       int num_to_read =
+                       yy_size_t num_to_read =
                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
@@ -5995,7 +6000,7 @@ static int yy_get_next_buffer (void)
 
                        if ( b->yy_is_our_buffer )
                                {
-                               int new_size = b->yy_buf_size * 2;
+                               yy_size_t new_size = b->yy_buf_size * 2;
 
                                if ( new_size <= 0 )
                                        b->yy_buf_size += b->yy_buf_size / 8;
@@ -6053,7 +6058,7 @@ static int yy_get_next_buffer (void)
 
        if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
                /* Extend the array by 50%, plus the number we really need. */
-               int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+               yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
                YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
                        (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
                if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
@@ -6174,7 +6179,7 @@ static int yy_get_next_buffer (void)
 
                else
                        { /* need more input */
-                       int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+                       yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
                        ++(yy_c_buf_p);
 
                        switch ( yy_get_next_buffer(  ) )
@@ -6617,12 +6622,12 @@ YY_BUFFER_STATE yy_scan_string (const char * yystr )
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, yy_size_t  _yybytes_len )
 {
        YY_BUFFER_STATE b;
        char *buf;
        yy_size_t n;
-       int i;
+       yy_size_t i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = (yy_size_t) (_yybytes_len + 2);
@@ -6669,7 +6674,7 @@ static void yynoreturn yy_fatal_error (const char* msg )
        do \
                { \
                /* Undo effects of setting up yytext. */ \
-        int yyless_macro_arg = (n); \
+        yy_size_t yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
                yytext[yyleng] = (yy_hold_char); \
                (yy_c_buf_p) = yytext + yyless_macro_arg; \
@@ -6713,7 +6718,7 @@ FILE *yyget_out  (void)
 /** Get the length of the current token.
  * 
  */
-int yyget_leng  (void)
+yy_size_t yyget_leng  (void)
 {
         return yyleng;
 }
@@ -6884,7 +6889,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 2511 "dhcp4_lexer.ll"
+#line 2515 "dhcp4_lexer.ll"
 
 
 using namespace isc::dhcp;
index e4dc4e73f8261697b1931c118656ac4da08c3f5f..8c8636fa6df25d04ddf8e6765e71d463e3f3adc2 100644 (file)
@@ -401,7 +401,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::HOSTS_DATABASE:
     case isc::dhcp::Parser4Context::OPTION_DEF:
     case isc::dhcp::Parser4Context::CONFIG_DATABASE:
-    case isc::dhcp::Parser4Context::AUTH_TYPE:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
         return isc::dhcp::Dhcp4Parser::make_TYPE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("type", driver.loc_);
@@ -1071,6 +1071,8 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::RESERVATIONS:
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
+    case isc::dhcp::Parser4Context::CLIENTS:
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -1093,6 +1095,8 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::RESERVATIONS:
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
+    case isc::dhcp::Parser4Context::AUTHENTICATION:
+    case isc::dhcp::Parser4Context::CLIENTS:
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
     case isc::dhcp::Parser4Context::LOGGERS:
index 2187176eaca9260a8b7c7134d9cd6af65f8ab2df..648588421f147e4544b666582041092d2edcc058 100644 (file)
@@ -4026,7 +4026,7 @@ namespace isc { namespace dhcp {
 #line 2547 "dhcp4_parser.yy"
                                      {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
-    ctx.stack_.back()->set("control-socket", m);
+    ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
 #line 4033 "dhcp4_parser.cc"
@@ -4036,7 +4036,6 @@ namespace isc { namespace dhcp {
 #line 2551 "dhcp4_parser.yy"
                                        {
     ctx.stack_.pop_back();
-    ctx.leave();
 }
 #line 4042 "dhcp4_parser.cc"
     break;
index 17eaf2add8b9d72e8d5fa3b9f3e695e3938cbdc7..a2704c6ed4973fb9020369a297907e34919196e8 100644 (file)
@@ -2546,11 +2546,10 @@ not_empty_control_socket_list: control_socket_entry
 
 control_socket_entry: LCURLY_BRACKET {
     ElementPtr m(new MapElement(ctx.loc2pos(@1)));
-    ctx.stack_.back()->set("control-socket", m);
+    ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 } control_socket_params RCURLY_BRACKET {
     ctx.stack_.pop_back();
-    ctx.leave();
 };
 
 control_socket_params: control_socket_param
index c2e34c50f049882f56b61852e5554248e8cacad3..40fc565277740aec253439160376eb0199c44271 100644 (file)
@@ -578,6 +578,7 @@ processDhcp4Config(isc::data::ConstElementPtr config_set) {
             if ((config_pair.first == "option-def") ||
                 (config_pair.first == "option-data") ||
                 (config_pair.first == "control-socket") ||
+                (config_pair.first == "control-sockets") ||
                 (config_pair.first == "multi-threading") ||
                 (config_pair.first == "dhcp-queue-control") ||
                 (config_pair.first == "host-reservation-identifiers") ||
index 9d801374db002c29ef845df32413d1f55a1cfeea..bc21c35095068c96cb935b99828159f7410f66bf 100644 (file)
@@ -919,10 +919,21 @@ public:
 TEST_F(TrailingCommasTest, tests) {
     string txt(R"({
   "Dhcp4": {
-    "control-socket": {
-      "socket-name": "/tmp/kea-dhcp4-ctrl.sock",
-      "socket-type": "unix",
-    },
+    "control-sockets": [
+      {
+        "socket-type": "http",
+        "socket-address": "127.0.0.1",
+        "authentication": {
+          "clients": [
+            {
+              "password-file": "/tmp/pwd",
+            }
+          ],
+          "type": "basic",
+        },
+        "socket-port": 8000,
+      },
+    ],
     "hooks-libraries": [
       {
         "library": "/usr/local/lib/kea/hooks/libdhcp_dummy.so",
@@ -970,22 +981,25 @@ TEST_F(TrailingCommasTest, tests) {
 })");
     testParser(txt, Parser4Context::PARSER_DHCP4, false);
 
-    addLog("<string>:5.28");
-    addLog("<string>:9.63");
-    addLog("<string>:10.8");
-    addLog("<string>:14.15");
-    addLog("<string>:15.8");
-    addLog("<string>:20.24");
-    addLog("<string>:28.31");
-    addLog("<string>:29.12");
-    addLog("<string>:31.28");
-    addLog("<string>:32.8");
-    addLog("<string>:43.37");
-    addLog("<string>:44.12");
-    addLog("<string>:47.35");
-    addLog("<string>:48.8");
-    addLog("<string>:49.6");
-    addLog("<string>:50.4");
+    addLog("<string>:10.42");
+    addLog("<string>:13.26");
+    addLog("<string>:15.28");
+    addLog("<string>:16.8");
+    addLog("<string>:20.63");
+    addLog("<string>:21.8");
+    addLog("<string>:25.15");
+    addLog("<string>:26.8");
+    addLog("<string>:31.24");
+    addLog("<string>:39.31");
+    addLog("<string>:40.12");
+    addLog("<string>:42.28");
+    addLog("<string>:43.8");
+    addLog("<string>:54.37");
+    addLog("<string>:55.12");
+    addLog("<string>:58.35");
+    addLog("<string>:59.8");
+    addLog("<string>:60.6");
+    addLog("<string>:61.4");
     EXPECT_TRUE(checkFile());
 
     // Test with many consecutive commas.
index abc4d96fa3538aefb2330da8ff0dae028a22ee42..845025e234b4dadb52894a8e142cb9c51d248016 100644 (file)
@@ -55,6 +55,7 @@ const SimpleKeywords SimpleParser4::GLOBAL4_PARAMETERS = {
     { "expired-leases-processing",        Element::map },
     { "dhcp4o6-port",                     Element::integer },
     { "control-socket",                   Element::map },
+    { "control-sockets",                  Element::list },
     { "dhcp-queue-control",               Element::map },
     { "dhcp-ddns",                        Element::map },
     { "echo-client-id",                   Element::boolean },