From 60d9fe4e7b03205643a7134e0a65da0f8a93ea37 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 11 Feb 2018 01:56:53 +0100 Subject: [PATCH 01/18] [5528] Code and tests done --- src/lib/dhcpsrv/host_data_source_factory.cc | 159 +++++++++++++++----- src/lib/dhcpsrv/host_data_source_factory.h | 34 ++++- src/lib/dhcpsrv/tests/Makefile.am | 1 + 3 files changed, 154 insertions(+), 40 deletions(-) diff --git a/src/lib/dhcpsrv/host_data_source_factory.cc b/src/lib/dhcpsrv/host_data_source_factory.cc index c9e5203c91..3a63770cba 100644 --- a/src/lib/dhcpsrv/host_data_source_factory.cc +++ b/src/lib/dhcpsrv/host_data_source_factory.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -38,6 +38,8 @@ using namespace std; namespace isc { namespace dhcp { +map HostDataSourceFactory::map_; + HostDataSourcePtr& HostDataSourceFactory::getHostDataSourcePtr() { static HostDataSourcePtr hostDataSourcePtr; @@ -45,7 +47,7 @@ HostDataSourceFactory::getHostDataSourcePtr() { } void -HostDataSourceFactory::create(const std::string& dbaccess) { +HostDataSourceFactory::create(const string& dbaccess) { // Parse the access string and create a redacted string for logging. DatabaseConnection::ParameterMap parameters = DatabaseConnection::parse(dbaccess); @@ -57,38 +59,23 @@ HostDataSourceFactory::create(const std::string& dbaccess) { "contain the 'type' keyword"); } - std::string db_type = it->second; + string db_type = it->second; + auto index = map_.find(db_type); -#ifdef HAVE_MYSQL - if (db_type == "mysql") { - LOG_INFO(dhcpsrv_logger, DHCPSRV_MYSQL_HOST_DB) - .arg(DatabaseConnection::redactedAccessString(parameters)); - getHostDataSourcePtr().reset(new MySqlHostDataSource(parameters)); - return; + // No match? + if (index == map_.end()) { + isc_throw(InvalidType, "Hosts database access parameter 'type': " << + db_type << " is invalid"); } -#endif -#ifdef HAVE_PGSQL - if (db_type == "postgresql") { - LOG_INFO(dhcpsrv_logger, DHCPSRV_PGSQL_HOST_DB) - .arg(DatabaseConnection::redactedAccessString(parameters)); - getHostDataSourcePtr().reset(new PgSqlHostDataSource(parameters)); - return; + // Call the factory + getHostDataSourcePtr().reset(index->second(parameters)); + + // Check the factory did not return NULL. + if (!getHostDataSourcePtr()) { + isc_throw(Unexpected, "Hosts database " << db_type << + " factory returned NULL"); } -#endif - -#ifdef HAVE_CQL - if (db_type == "cql") { - LOG_INFO(dhcpsrv_logger, DHCPSRV_CQL_HOST_DB) - .arg(DatabaseConnection::redactedAccessString(parameters)); - getHostDataSourcePtr().reset(new CqlHostDataSource(parameters)); - return; - } -#endif - - // Get here on no match. - isc_throw(InvalidType, "Hosts database access parameter 'type': " << - db_type << " is invalid"); } void @@ -102,17 +89,111 @@ HostDataSourceFactory::destroy() { getHostDataSourcePtr().reset(); } -#if 0 -BaseHostDataSource& -HostDataSourceFactory::instance() { - BaseHostDataSource* hdsptr = getHostDataSourcePtr().get(); - if (hdsptr == NULL) { - isc_throw(NoHostDataSourceManager, - "no current host data source instance is available"); +bool +HostDataSourceFactory::registerFactory(const string& db_type, + const Factory& factory) { + if (map_.count(db_type)) { + return (false); + } + map_.insert(pair(db_type, factory)); + return (true); +} + +bool +HostDataSourceFactory::deregisterFactory(const string& db_type) { + auto index = map_.find(db_type); + if (index != map_.end()) { + map_.erase(index); + return (true); + } else { + return (false); } - return (*hdsptr); } -#endif } // namespace dhcp } // namespace isc + +// +// Register database backends +// + +using namespace isc::dhcp; + +namespace { + +#ifdef HAVE_MYSQL +struct MySqlHostDataSourceInit { + // Constructor registers + MySqlHostDataSourceInit() { + HostDataSourceFactory::registerFactory("mysql", factory); + } + + // Destructor deregisters + ~MySqlHostDataSourceInit() { + HostDataSourceFactory::deregisterFactory("mysql"); + } + + // Factory class method + static BaseHostDataSource* + factory(const DatabaseConnection::ParameterMap& parameters) { + LOG_INFO(dhcpsrv_logger, DHCPSRV_MYSQL_HOST_DB) + .arg(DatabaseConnection::redactedAccessString(parameters)); + return (new MySqlHostDataSource(parameters)); + } +}; + +// Database backend will be registered at object initialization +MySqlHostDataSourceInit mysql_init; +#endif + +#ifdef HAVE_PGSQL +struct PgSqlHostDataSourceInit { + // Constructor registers + PgSqlHostDataSourceInit() { + HostDataSourceFactory::registerFactory("postgresql", factory); + } + + // Destructor deregisters + ~PgSqlHostDataSourceInit() { + HostDataSourceFactory::deregisterFactory("postgresql"); + } + + // Factory class method + static BaseHostDataSource* + factory(const DatabaseConnection::ParameterMap& parameters) { + LOG_INFO(dhcpsrv_logger, DHCPSRV_PGSQL_HOST_DB) + .arg(DatabaseConnection::redactedAccessString(parameters)); + return (new PgSqlHostDataSource(parameters)); + } +}; + +// Database backend will be registered at object initialization +PgSqlHostDataSourceInit mysql_init; +#endif + +#ifdef HAVE_CQL +struct CqlHostDataSourceInit { + // Constructor registers + CqlHostDataSourceInit() { + HostDataSourceFactory::registerFactory("cql", factory); + } + + // Destructor deregisters + ~CqlHostDataSourceInit() { + HostDataSourceFactory::deregisterFactory("cql"); + } + + // Factory class method + static BaseHostDataSource* + factory(const DatabaseConnection::ParameterMap& parameters) { + LOG_INFO(dhcpsrv_logger, DHCPSRV_CQL_HOST_DB) + .arg(DatabaseConnection::redactedAccessString(parameters)); + return (new CqlHostDataSource(parameters)); + } +}; + +// Database backend will be registered at object initialization +CqlHostDataSourceInit mysql_init; +#endif + +} // end of anonymous namespace diff --git a/src/lib/dhcpsrv/host_data_source_factory.h b/src/lib/dhcpsrv/host_data_source_factory.h index d7c3123a6b..68492213dc 100644 --- a/src/lib/dhcpsrv/host_data_source_factory.h +++ b/src/lib/dhcpsrv/host_data_source_factory.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -11,8 +11,10 @@ #include #include #include +#include #include +#include namespace isc { namespace dhcp { @@ -77,6 +79,36 @@ public: /// is encapsulated in this method to avoid a "static initialization /// fiasco" if defined in an external static variable. static HostDataSourcePtr& getHostDataSourcePtr(); + + /// @brief Type of host data source factory + /// + /// A factory takes a parameter map and returns a pointer to a host + /// data source. In case of failure it must throw and not return NULL. + typedef boost::function Factory; + + /// @brief Register a host data source factory + /// + /// Associate the factory to a database type in the map. + /// + /// @param db_type database type + /// @param factory host data source factory + /// @return true if the factory was successfully added to the map, false + /// if it already exists. + static bool registerFactory(const std::string& db_type, + const Factory& factory); + + /// @brief Deregister a host data source factory + /// + /// Disassociate the factory to a database type in the map. + /// + /// @param db_type database type + /// @return true if the factory was successfully removed from the map, + /// false if it was not found. + static bool deregisterFactory(const std::string& db_type); + +private: + /// @brief Factory map + static std::map map_; }; diff --git a/src/lib/dhcpsrv/tests/Makefile.am b/src/lib/dhcpsrv/tests/Makefile.am index 83a178a0d3..95c5c4f753 100644 --- a/src/lib/dhcpsrv/tests/Makefile.am +++ b/src/lib/dhcpsrv/tests/Makefile.am @@ -91,6 +91,7 @@ libdhcpsrv_unittests_SOURCES += dbaccess_parser_unittest.cc libdhcpsrv_unittests_SOURCES += dhcp4o6_ipc_unittest.cc libdhcpsrv_unittests_SOURCES += duid_config_parser_unittest.cc libdhcpsrv_unittests_SOURCES += expiration_config_parser_unittest.cc +libdhcpsrv_unittests_SOURCES += host_data_source_factory_unittest.cc libdhcpsrv_unittests_SOURCES += host_mgr_unittest.cc libdhcpsrv_unittests_SOURCES += host_unittest.cc libdhcpsrv_unittests_SOURCES += host_reservation_parser_unittest.cc From 0006fb983cede91ff6dd6477c26f7c3098d0b3c1 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 11 Feb 2018 10:12:16 +0100 Subject: [PATCH 02/18] [5528] Updated doc, final improvements to tests --- src/lib/dhcpsrv/database_backends.dox | 2 +- src/lib/dhcpsrv/libdhcpsrv.dox | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lib/dhcpsrv/database_backends.dox b/src/lib/dhcpsrv/database_backends.dox index fa9ae65f4d..4bfbc7f040 100644 --- a/src/lib/dhcpsrv/database_backends.dox +++ b/src/lib/dhcpsrv/database_backends.dox @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/src/lib/dhcpsrv/libdhcpsrv.dox b/src/lib/dhcpsrv/libdhcpsrv.dox index a8dc6cca70..04775b6977 100644 --- a/src/lib/dhcpsrv/libdhcpsrv.dox +++ b/src/lib/dhcpsrv/libdhcpsrv.dox @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -103,9 +103,10 @@ database. This object must implement the \ref isc::dhcp::BaseHostDataSource interface and its implementation is specific to the type of storage holding the reservations. For example, the host data source managing host reservations in the MySQL database is required to establish -connection to the MySQL database and issue specific queries. Once -implemented, the \ref isc::dhcp::HostMgr::create method must be updated -to create an instance of this datasource. Note, that this instance is +connection to the MySQL database and issue specific queries. A factory +method creating an instance of a base host data source object must be +registered (at global object initialization for built-in backends, +dynamically for backends loaded at run-time). Note, that this instance is created as "alternate host data source" as opposed to the primary data source which returns host reservations specified in the configuration file. The primary data source is implemented internally in the From 405ae2f6a85bbc2c2123fb3075bd5259adea523c Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 11 Feb 2018 22:46:07 +0100 Subject: [PATCH 03/18] [5531] Checkpoint: 3/4 code done --- src/lib/dhcpsrv/base_host_data_source.h | 10 +- src/lib/dhcpsrv/cfg_db_access.cc | 6 +- src/lib/dhcpsrv/cfg_hosts.cc | 6 +- src/lib/dhcpsrv/cfg_hosts.h | 5 +- src/lib/dhcpsrv/cql_host_data_source.cc | 6 +- src/lib/dhcpsrv/cql_host_data_source.h | 5 +- src/lib/dhcpsrv/host_data_source_factory.cc | 34 +-- src/lib/dhcpsrv/host_data_source_factory.h | 31 +-- src/lib/dhcpsrv/host_mgr.cc | 220 ++++++++++------ src/lib/dhcpsrv/host_mgr.h | 67 +++-- src/lib/dhcpsrv/mysql_host_data_source.cc | 6 +- src/lib/dhcpsrv/mysql_host_data_source.h | 5 +- src/lib/dhcpsrv/pgsql_host_data_source.cc | 4 +- src/lib/dhcpsrv/pgsql_host_data_source.h | 5 +- .../tests/cql_host_data_source_unittest.cc | 47 ++-- .../generic_host_data_source_unittest.cc | 7 +- .../host_data_source_factory_unittest.cc | 248 ++++++++++++++++++ src/lib/dhcpsrv/tests/host_mgr_unittest.cc | 22 +- .../tests/mysql_host_data_source_unittest.cc | 50 ++-- .../tests/pgsql_host_data_source_unittest.cc | 47 ++-- 20 files changed, 587 insertions(+), 244 deletions(-) create mode 100644 src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc diff --git a/src/lib/dhcpsrv/base_host_data_source.h b/src/lib/dhcpsrv/base_host_data_source.h index 2e3ed16db1..e68f5d1729 100644 --- a/src/lib/dhcpsrv/base_host_data_source.h +++ b/src/lib/dhcpsrv/base_host_data_source.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -14,6 +14,8 @@ #include #include +#include + namespace isc { namespace dhcp { @@ -245,7 +247,8 @@ public: /// is identified by HW address, another one by DUID. /// /// @param host Pointer to the new @c Host object being added. - virtual void add(const HostPtr& host) = 0; + /// @return true if addition was successful. + virtual bool add(const HostPtr& host) = 0; /// @brief Attempts to delete a host by (subnet-id, address) /// @@ -310,6 +313,9 @@ public: /// @brief HostDataSource pointer typedef boost::shared_ptr HostDataSourcePtr; +/// @brief HostDataSource list +typedef std::vector HostDataSourceList; + } } diff --git a/src/lib/dhcpsrv/cfg_db_access.cc b/src/lib/dhcpsrv/cfg_db_access.cc index 366cdf4be2..44c4b67040 100644 --- a/src/lib/dhcpsrv/cfg_db_access.cc +++ b/src/lib/dhcpsrv/cfg_db_access.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -44,9 +44,9 @@ CfgDbAccess::createManagers() const { LeaseMgrFactory::create(getLeaseDbAccessString()); // Recreate host data source. - HostDataSourceFactory::destroy(); + HostMgr::create(); if (!host_db_access_.empty()) { - HostMgr::create(getHostDbAccessString()); + HostMgr::addSource(getHostDbAccessString()); } } diff --git a/src/lib/dhcpsrv/cfg_hosts.cc b/src/lib/dhcpsrv/cfg_hosts.cc index b7f52d405e..1a99efba58 100644 --- a/src/lib/dhcpsrv/cfg_hosts.cc +++ b/src/lib/dhcpsrv/cfg_hosts.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -549,7 +549,7 @@ CfgHosts::getHostInternal(const SubnetID& subnet_id, const bool subnet6, return (host); } -void +bool CfgHosts::add(const HostPtr& host) { LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_CFG_ADD_HOST) .arg(host ? host->toText() : "(no-host)"); @@ -569,6 +569,8 @@ CfgHosts::add(const HostPtr& host) { add4(host); add6(host); + + return (true); } void diff --git a/src/lib/dhcpsrv/cfg_hosts.h b/src/lib/dhcpsrv/cfg_hosts.h index 0717e9a174..519101215e 100644 --- a/src/lib/dhcpsrv/cfg_hosts.h +++ b/src/lib/dhcpsrv/cfg_hosts.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -318,9 +318,10 @@ public: /// /// @param host Pointer to the new @c Host object being added. /// + /// @return always return true as additions are successful or throw. /// @throw DuplicateHost If a host for a particular HW address or DUID /// has already been added to the IPv4 or IPv6 subnet. - virtual void add(const HostPtr& host); + virtual bool add(const HostPtr& host); /// @brief Attempts to delete a host by address. /// diff --git a/src/lib/dhcpsrv/cql_host_data_source.cc b/src/lib/dhcpsrv/cql_host_data_source.cc index 7e2416cceb..38d0bb84b5 100644 --- a/src/lib/dhcpsrv/cql_host_data_source.cc +++ b/src/lib/dhcpsrv/cql_host_data_source.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Deutsche Telekom AG. +// Copyright (C) 2016-2018 Deutsche Telekom AG. // // Author: Andrei Pavel // @@ -1820,11 +1820,13 @@ CqlHostDataSource::~CqlHostDataSource() { delete impl_; } -void +bool CqlHostDataSource::add(const HostPtr& host) { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_CQL_HOST_ADD); impl_->add(host); + + return (true); } ConstHostCollection diff --git a/src/lib/dhcpsrv/cql_host_data_source.h b/src/lib/dhcpsrv/cql_host_data_source.h index 60ea0a805c..ceb721bd98 100644 --- a/src/lib/dhcpsrv/cql_host_data_source.h +++ b/src/lib/dhcpsrv/cql_host_data_source.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Deutsche Telekom AG. +// Copyright (C) 2016-2018 Deutsche Telekom AG. // // Author: Andrei Pavel // @@ -98,7 +98,8 @@ public: /// Host, where one instance is identified by different identifier types. /// /// @param host pointer to the new @ref Host being added. - virtual void add(const HostPtr& host) override; + /// @return true as addition is successful or throws. + virtual bool add(const HostPtr& host) override; /// @brief Retrieves a single @ref Host connected to an IPv4 subnet. /// diff --git a/src/lib/dhcpsrv/host_data_source_factory.cc b/src/lib/dhcpsrv/host_data_source_factory.cc index 3a63770cba..3bb700be81 100644 --- a/src/lib/dhcpsrv/host_data_source_factory.cc +++ b/src/lib/dhcpsrv/host_data_source_factory.cc @@ -40,14 +40,9 @@ namespace dhcp { map HostDataSourceFactory::map_; -HostDataSourcePtr& -HostDataSourceFactory::getHostDataSourcePtr() { - static HostDataSourcePtr hostDataSourcePtr; - return (hostDataSourcePtr); -} - void -HostDataSourceFactory::create(const string& dbaccess) { +HostDataSourceFactory::add(HostDataSourceList& sources, + const string& dbaccess) { // Parse the access string and create a redacted string for logging. DatabaseConnection::ParameterMap parameters = DatabaseConnection::parse(dbaccess); @@ -68,25 +63,30 @@ HostDataSourceFactory::create(const string& dbaccess) { db_type << " is invalid"); } - // Call the factory - getHostDataSourcePtr().reset(index->second(parameters)); + // Call the factory and push the pointer on sources. + sources.push_back(boost::shared_ptr(index->second(parameters))); // Check the factory did not return NULL. - if (!getHostDataSourcePtr()) { + if (!sources.back()) { + sources.pop_back(); isc_throw(Unexpected, "Hosts database " << db_type << " factory returned NULL"); } } -void -HostDataSourceFactory::destroy() { - // Destroy current host data source instance. This is a no-op if no host - // data source is available. - if (getHostDataSourcePtr()) { +bool +HostDataSourceFactory::del(HostDataSourceList& sources, + const string& db_type) { + for (auto it = sources.begin(); it != sources.end(); ++it) { + if ((*it)->getType() != db_type) { + continue; + } LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE, HOSTS_CFG_CLOSE_HOST_DATA_SOURCE) - .arg(getHostDataSourcePtr()->getType()); + .arg(db_type); + sources.erase(it); + return (true); } - getHostDataSourcePtr().reset(); + return (false); } bool diff --git a/src/lib/dhcpsrv/host_data_source_factory.h b/src/lib/dhcpsrv/host_data_source_factory.h index 68492213dc..a8e2038d49 100644 --- a/src/lib/dhcpsrv/host_data_source_factory.h +++ b/src/lib/dhcpsrv/host_data_source_factory.h @@ -40,21 +40,18 @@ public: class HostDataSourceFactory { public: - /// @brief Create an instance of a host data source. + /// @brief Create and add an instance of a host data source. /// /// Each database backend has its own host data source type. This static - /// method sets the "current" host data source to be an object of the - /// appropriate type. The actual host data source is returned by the - /// "instance" method. - /// - /// @note When called, the current host data source is always destroyed - /// and a new one created - even if the parameters are the same. + /// method adds an object of the appropriate type to a list of + /// host data sources. /// /// dbaccess is a generic way of passing parameters. Parameters are passed /// in the "name=value" format, separated by spaces. The data MUST include /// a keyword/value pair of the form "type=dbtype" giving the database /// type, e.q. "mysql" or "sqlite3". /// + /// @param sources host data source list. /// @param dbaccess Database access parameters. These are in the form of /// "keyword=value" pairs, separated by spaces. They are backend- /// -end specific, although must include the "type" keyword which @@ -64,21 +61,17 @@ public: /// keyword. /// @throw isc::dhcp::InvalidType The "type" keyword in dbaccess does not /// identify a supported backend. - static void create(const std::string& dbaccess); + static void add(HostDataSourceList& sources, const std::string& dbaccess); - /// @brief Destroy host data source + /// @brief Delete a host data source. /// - /// Destroys the current host data source object. This should have the effect - /// of closing the database connection. The method is a no-op if no - /// host data source is available. - static void destroy(); - - /// @brief Hold pointer to host data source instance + /// Delete the first instance of a host data source of the given type. + /// This should have the effect of closing the database connection. /// - /// Holds a pointer to the singleton host data source. The singleton - /// is encapsulated in this method to avoid a "static initialization - /// fiasco" if defined in an external static variable. - static HostDataSourcePtr& getHostDataSourcePtr(); + /// @param sources host data source list. + /// @param db_type database backend type. + /// @return true when found and removed, false when not found. + static bool del(HostDataSourceList& sources, const std::string& db_type); /// @brief Type of host data source factory /// diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index 302da6c0d7..b04bd3f0f9 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -37,24 +37,31 @@ HostMgr::getHostMgrPtr() { } void -HostMgr::create(const std::string& access) { +HostMgr::create() { getHostMgrPtr().reset(new HostMgr()); +} - if (!access.empty()) { - // If the user specified parameters, let's pass them to the create - // method. It will destroy any prior instances and will create - // the new one. - HostDataSourceFactory::create(access); - } else { - // Ok, no parameters were specified. We should destroy the existing - // instance. - HostDataSourceFactory::destroy(); +void +HostMgr::addSource(const std::string& access) { + HostDataSourceFactory::add(getHostMgrPtr()->alternate_sources_, access); +} + +bool +HostMgr::delSource(const std::string& db_type) { + return (HostDataSourceFactory::del(getHostMgrPtr()->alternate_sources_, db_type)); +} + +void +HostMgr::delAllSources() { + getHostMgrPtr()->alternate_sources_.clear(); +} + +HostDataSourcePtr +HostMgr::getHostDataSource() const { + if (alternate_sources_.empty()) { + return (HostDataSourcePtr()); } - - // Now store the host data source pointer. It may be NULL. That's ok as - // NULL value indicates that there's no host data source configured. - getHostMgrPtr()->alternate_source_ = - HostDataSourceFactory::getHostDataSourcePtr(); + return (alternate_sources_[0]); } HostMgr& @@ -69,8 +76,9 @@ HostMgr::instance() { ConstHostCollection HostMgr::getAll(const HWAddrPtr& hwaddr, const DuidPtr& duid) const { ConstHostCollection hosts = getCfgHosts()->getAll(hwaddr, duid); - if (alternate_source_) { - ConstHostCollection hosts_plus = alternate_source_->getAll(hwaddr, duid); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + ConstHostCollection hosts_plus = (*it)->getAll(hwaddr, duid); hosts.insert(hosts.end(), hosts_plus.begin(), hosts_plus.end()); } return (hosts); @@ -83,10 +91,10 @@ HostMgr::getAll(const Host::IdentifierType& identifier_type, ConstHostCollection hosts = getCfgHosts()->getAll(identifier_type, identifier_begin, identifier_len); - if (alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { ConstHostCollection hosts_plus = - alternate_source_->getAll(identifier_type, identifier_begin, - identifier_len); + (*it)->getAll(identifier_type, identifier_begin, identifier_len); hosts.insert(hosts.end(), hosts_plus.begin(), hosts_plus.end()); } return (hosts); @@ -96,8 +104,9 @@ HostMgr::getAll(const Host::IdentifierType& identifier_type, ConstHostCollection HostMgr::getAll4(const IOAddress& address) const { ConstHostCollection hosts = getCfgHosts()->getAll4(address); - if (alternate_source_) { - ConstHostCollection hosts_plus = alternate_source_->getAll4(address); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + ConstHostCollection hosts_plus = (*it)->getAll4(address); hosts.insert(hosts.end(), hosts_plus.begin(), hosts_plus.end()); } return (hosts); @@ -107,17 +116,21 @@ ConstHostPtr HostMgr::get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, const DuidPtr& duid) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, hwaddr, duid); - if (!host && alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_HWADDR_DUID) .arg(subnet_id) .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)") .arg(duid ? duid->toText() : "(duid)"); if (duid) { - host = alternate_source_->get4(subnet_id, HWAddrPtr(), duid); + host = (*it)->get4(subnet_id, HWAddrPtr(), duid); } if (!host && hwaddr) { - host = alternate_source_->get4(subnet_id, hwaddr, DuidPtr()); + host = (*it)->get4(subnet_id, hwaddr, DuidPtr()); } } return (host); @@ -130,32 +143,37 @@ HostMgr::get4(const SubnetID& subnet_id, const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, identifier_type, identifier_begin, identifier_len); - if (!host && alternate_source_) { - + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER) .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, identifier_len)); - host = alternate_source_->get4(subnet_id, identifier_type, - identifier_begin, identifier_len); + host = (*it)->get4(subnet_id, identifier_type, + identifier_begin, identifier_len); if (host) { LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_HOST) .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, identifier_len)) .arg(host->toText()); - - } else { - LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, - HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_NULL) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, - identifier_len)); + break; } + LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, + HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_NULL) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, + identifier_len)); } return (host); @@ -165,12 +183,16 @@ ConstHostPtr HostMgr::get4(const SubnetID& subnet_id, const asiolink::IOAddress& address) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, address); - if (!host && alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_ADDRESS4) .arg(subnet_id) .arg(address.toText()); - host = alternate_source_->get4(subnet_id, address); + host = (*it)->get4(subnet_id, address); } return (host); } @@ -180,17 +202,21 @@ ConstHostPtr HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, const HWAddrPtr& hwaddr) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, duid, hwaddr); - if (!host && alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_DUID_HWADDR) .arg(subnet_id) .arg(duid ? duid->toText() : "(duid)") .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)"); if (duid) { - host = alternate_source_->get6(subnet_id, duid, HWAddrPtr()); + host = (*it)->get6(subnet_id, duid, HWAddrPtr()); } if (!host && hwaddr) { - host = alternate_source_->get6(subnet_id, DuidPtr(), hwaddr); + host = (*it)->get6(subnet_id, DuidPtr(), hwaddr); } } return (host); @@ -199,12 +225,16 @@ HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, ConstHostPtr HostMgr::get6(const IOAddress& prefix, const uint8_t prefix_len) const { ConstHostPtr host = getCfgHosts()->get6(prefix, prefix_len); - if (!host && alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET6_PREFIX) .arg(prefix.toText()) .arg(static_cast(prefix_len)); - host = alternate_source_->get6(prefix, prefix_len); + host = (*it)->get6(prefix, prefix_len); } return (host); } @@ -216,34 +246,37 @@ HostMgr::get6(const SubnetID& subnet_id, const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, identifier_type, identifier_begin, identifier_len); - if (!host && alternate_source_) { - + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER) .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, identifier_len)); - - host = alternate_source_->get6(subnet_id, identifier_type, - identifier_begin, identifier_len); + host = (*it)->get6(subnet_id, identifier_type, + identifier_begin, identifier_len); if (host) { - LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_HOST) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, - identifier_len)) - .arg(host->toText()); - - } else { - LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_NULL) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, - identifier_len)); + LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_HOST) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, + identifier_len)) + .arg(host->toText()); + break; } - + LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_NULL) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, + identifier_begin, + identifier_len)); } return (host); } @@ -252,57 +285,86 @@ ConstHostPtr HostMgr::get6(const SubnetID& subnet_id, const asiolink::IOAddress& addr) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, addr); - if (!host && alternate_source_) { + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if (host) { + break; + } LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_ADDRESS6) .arg(subnet_id) .arg(addr.toText()); - host = alternate_source_->get6(subnet_id, addr); + host = (*it)->get6(subnet_id, addr); } return (host); } -void +bool HostMgr::add(const HostPtr& host) { - if (!alternate_source_) { + if (alternate_sources_.empty()) { isc_throw(NoHostDataSourceManager, "Unable to add new host because there is " "no hosts-database configured."); } - alternate_source_->add(host); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if ((*it)->add(host)) { + return (true); + } + } + // This should never happen as at least one backend implements addition. + return (false); } bool HostMgr::del(const SubnetID& subnet_id, const asiolink::IOAddress& addr) { - if (!alternate_source_) { + if (alternate_sources_.empty()) { isc_throw(NoHostDataSourceManager, "Unable to delete a host because there is " "no hosts-database configured."); } - return (alternate_source_->del(subnet_id, addr)); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if ((*it)->del(subnet_id, addr)) { + return (true); + } + } + return (false); } bool HostMgr::del4(const SubnetID& subnet_id, const Host::IdentifierType& identifier_type, const uint8_t* identifier_begin, const size_t identifier_len) { - if (!alternate_source_) { + if (alternate_sources_.empty()) { isc_throw(NoHostDataSourceManager, "Unable to delete a host because there is " "no hosts-database configured."); } - return (alternate_source_->del4(subnet_id, identifier_type, - identifier_begin, identifier_len)); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if ((*it)->del4(subnet_id, identifier_type, + identifier_begin, identifier_len)) { + return (true); + } + } + return (false); } bool HostMgr::del6(const SubnetID& subnet_id, const Host::IdentifierType& identifier_type, const uint8_t* identifier_begin, const size_t identifier_len) { - if (!alternate_source_) { + if (alternate_sources_.empty()) { isc_throw(NoHostDataSourceManager, "unable to delete a host because there is " "no alternate host data source present"); } - return (alternate_source_->del6(subnet_id, identifier_type, - identifier_begin, identifier_len)); + for (auto it = alternate_sources_.begin(); + it != alternate_sources_.end(); ++it) { + if ((*it)->del6(subnet_id, identifier_type, + identifier_begin, identifier_len)) { + return (true); + } + } + return (false); } } // end of isc::dhcp namespace diff --git a/src/lib/dhcpsrv/host_mgr.h b/src/lib/dhcpsrv/host_mgr.h index c177f58829..dca2697efa 100644 --- a/src/lib/dhcpsrv/host_mgr.h +++ b/src/lib/dhcpsrv/host_mgr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -33,42 +33,53 @@ namespace dhcp { /// configuration, accessible through the @c CfgHosts object in the @c CfgMgr. /// The @c CfgHosts object holds all reservations specified in the DHCP server /// configuration file. If a particular reservation is not found in the -/// @c CfgHosts object, the @c HostMgr will try to find it using the alternate -/// host data storage. The alternate host data storage is usually a database +/// @c CfgHosts object, the @c HostMgr will try to find it using alternate +/// host data storages. An alternate host data storage is usually a database /// (e.g. SQL database), accessible through a dedicated host data source /// object (a.k.a. database backend). This datasource is responsible for /// managing the connection with the database and forming appropriate queries /// to retrieve (or update) the information about the reservations. /// -/// The use of the alternate host data source is optional and usually requires +/// The use of alternate host data sources is optional and usually requires /// additional configuration to be specified by the server administrator. /// For example, for the SQL database the user's credentials, database address, /// and database name are required. The @c HostMgr passes these parameters /// to an appropriate datasource which is responsible for opening a connection /// and maintaining it. /// -/// It is possible to switch to a different alternate data source or disable -/// the use of the alternate datasource, e.g. as a result of server's +/// It is possible to switch to different alternate data sources or disable +/// the use of alternate datasources, e.g. as a result of server's /// reconfiguration. However, the use of the primary host data source (i.e. /// reservations specified in the configuration file) can't be disabled. -/// -/// @todo Implement alternate host data sources: MySQL, PostgreSQL, etc. class HostMgr : public boost::noncopyable, public BaseHostDataSource { public: /// @brief Creates new instance of the @c HostMgr. /// /// If an instance of the @c HostMgr already exists, it will be replaced - /// by the new instance. Thus, any instances of the alternate host data + /// by the new instance. Thus, any instances of alternate host data /// sources will be dropped. /// + static void create(); + + /// @brief Add an alternate host data source. + /// /// @param access Host data source access parameters for the alternate /// host data source. It holds "keyword=value" pairs, separated by spaces. /// The supported values are specific to the alternate data source in use. /// However, the "type" parameter will be common and it will specify which /// data source is to be used. Currently, no parameters are supported /// and the parameter is ignored. - static void create(const std::string& access = ""); + static void addSource(const std::string& access); + + /// @brief Delete an alternate host data source. + /// + /// @param db_type_type database backend type. + /// @return true when found and removed, false when not found. + static bool delSource(const std::string& db_type); + + /// @brief Delete all alternate host data source. + static void delAllSources(); /// @brief Returns a sole instance of the @c HostMgr. /// @@ -250,7 +261,8 @@ public: /// in use. /// /// @param host Pointer to the new @c Host object being added. - virtual void add(const HostPtr& host); + /// @return true if addition was successful. + virtual bool add(const HostPtr& host); /// @brief Return backend type /// @@ -261,28 +273,33 @@ public: return (std::string("host_mgr")); } - /// @brief Returns pointer to the host data source + /// @brief Returns the host data source list. /// - /// May return NULL - /// @return pointer to the host data source (or NULL) - HostDataSourcePtr getHostDataSource() const { - return (alternate_source_); + /// @return reference to the host data source list. + HostDataSourceList& getHostDataSourceList() { + return (alternate_sources_); } - /// @brief Sets the alternate host data source. + /// @brief Returns the fist host data source. + /// + /// May return NULL if the host data source list is empty. + /// @return pointer to the first host data source (or NULL) + HostDataSourcePtr getHostDataSource() const; + + /// @brief Sets alternate host data source list. /// /// Note: This should be used only for testing. Do not use /// in production. Normal control flow assumes that - /// HostMgr::create(...) is called and it instantiates - /// appropriate host data source. However, some tests + /// HostMgr::create() and HostMgr::add() is called and it instantiates + /// appropriate host data sources. However, some tests /// (e.g. host_cmds) implement their own very simple /// data source. It's not production ready by any means, /// so it does not belong in host_data_source_factory.cc. /// The testing nature of this method is reflected in its name. /// - /// @param source new source to be set (may be NULL) - void setTestHostDataSource(const HostDataSourcePtr& source) { - alternate_source_ = source; + /// @param sources new source list to be set + void setTestHostDataSourceList(const HostDataSourceList& sources) { + alternate_sources_ = sources; } /// @brief Attempts to delete a host by address. @@ -327,10 +344,8 @@ private: /// @brief Private default constructor. HostMgr() { } - /// @brief Pointer to an alternate host data source. - /// - /// If this pointer is NULL, the source is not in use. - HostDataSourcePtr alternate_source_; + /// @brief List of alternate host data sources. + HostDataSourceList alternate_sources_; /// @brief Returns a pointer to the currently used instance of the /// @c HostMgr. diff --git a/src/lib/dhcpsrv/mysql_host_data_source.cc b/src/lib/dhcpsrv/mysql_host_data_source.cc index db8437f1cb..1d41789674 100644 --- a/src/lib/dhcpsrv/mysql_host_data_source.cc +++ b/src/lib/dhcpsrv/mysql_host_data_source.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2562,7 +2562,7 @@ MySqlHostDataSource::~MySqlHostDataSource() { delete impl_; } -void +bool MySqlHostDataSource::add(const HostPtr& host) { // If operating in read-only mode, throw exception. impl_->checkReadOnly(); @@ -2607,6 +2607,8 @@ MySqlHostDataSource::add(const HostPtr& host) { // Everything went fine, so explicitly commit the transaction. transaction.commit(); + + return (true); } bool diff --git a/src/lib/dhcpsrv/mysql_host_data_source.h b/src/lib/dhcpsrv/mysql_host_data_source.h index 3850d8cd3c..7bedf1bff1 100644 --- a/src/lib/dhcpsrv/mysql_host_data_source.h +++ b/src/lib/dhcpsrv/mysql_host_data_source.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -223,7 +223,8 @@ public: /// one instance is identified by HW address, another one by DUID. /// /// @param host Pointer to the new @c Host object being added. - virtual void add(const HostPtr& host); + /// @return true as addition is successful or throws. + virtual bool add(const HostPtr& host); /// @brief Attempts to delete a host by (subnet-id, address) /// diff --git a/src/lib/dhcpsrv/pgsql_host_data_source.cc b/src/lib/dhcpsrv/pgsql_host_data_source.cc index 252f22cc4c..02f9b75e27 100644 --- a/src/lib/dhcpsrv/pgsql_host_data_source.cc +++ b/src/lib/dhcpsrv/pgsql_host_data_source.cc @@ -1934,7 +1934,7 @@ PgSqlHostDataSource::~PgSqlHostDataSource() { delete impl_; } -void +bool PgSqlHostDataSource::add(const HostPtr& host) { // If operating in read-only mode, throw exception. impl_->checkReadOnly(); @@ -1977,6 +1977,8 @@ PgSqlHostDataSource::add(const HostPtr& host) { // Everything went fine, so explicitly commit the transaction. transaction.commit(); + + return (true); } bool diff --git a/src/lib/dhcpsrv/pgsql_host_data_source.h b/src/lib/dhcpsrv/pgsql_host_data_source.h index a737342fc7..c8a2b96c2d 100644 --- a/src/lib/dhcpsrv/pgsql_host_data_source.h +++ b/src/lib/dhcpsrv/pgsql_host_data_source.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -247,9 +247,10 @@ public: /// -# Address and Prefix Length must be unique (DuplicateEntry) /// /// @param host Pointer to the new @c Host object being added. + /// @return true as addition is successful or throws. /// @throw DuplicateEntry or DbOperationError dependent on the constraint /// violation - virtual void add(const HostPtr& host); + virtual bool add(const HostPtr& host); /// @brief Attempts to delete a host by (subnet-id, address) /// diff --git a/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc index e8b5544da1..59af1339e1 100644 --- a/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,8 @@ public: // Connect to the database try { - HostDataSourceFactory::create(validCqlConnectionString()); + HostMgr::create(); + HostMgr::addSource(validCqlConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test" "*** environment is broken and must be fixed before" @@ -52,7 +54,7 @@ public: throw; } - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + hdsptr_ = HostMgr::instance().getHostDataSource(); } /// @brief Destroys the HDS and the schema. @@ -63,7 +65,8 @@ public: // Rollback should never fail, as Cassandra doesn't support transactions // (commit and rollback are both no-op). } - HostDataSourceFactory::destroy(); + HostMgr::delAllSources(); + hdsptr_.reset(); destroyCqlSchema(false, true); } @@ -91,9 +94,9 @@ public: /// Parameter is ignored for CQL backend as the v4 and v6 leases share /// the same database. void reopen(Universe) { - HostDataSourceFactory::destroy(); - HostDataSourceFactory::create(validCqlConnectionString()); - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + HostMgr::create(); + HostMgr::addSource(validCqlConnectionString()); + hdsptr_ = HostMgr::instance().getHostDataSource(); } }; @@ -112,9 +115,9 @@ TEST(CqlHostDataSource, OpenDatabase) { // Check that lease manager open the database opens correctly and tidy up. // If it fails, print the error message. try { - HostDataSourceFactory::create(validCqlConnectionString()); - EXPECT_NO_THROW((void)HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + HostMgr::create(); + EXPECT_NO_THROW(HostMgr::addSource(validCqlConnectionString())); + HostMgr::delSource("cql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -127,9 +130,9 @@ TEST(CqlHostDataSource, OpenDatabase) { try { std::string connection_string = validCqlConnectionString() + std::string(" ") + std::string(VALID_TIMEOUT); - HostDataSourceFactory::create(connection_string); - EXPECT_NO_THROW((void)HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + HostMgr::create(); + EXPECT_NO_THROW(HostMgr::addSource(connection_string)); + HostMgr::delSource("cql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -139,39 +142,39 @@ TEST(CqlHostDataSource, OpenDatabase) { // Check that attempting to get an instance of the host data source when // none is set throws an exception. - EXPECT_FALSE(HostDataSourceFactory::getHostDataSourcePtr()); + EXPECT_FALSE(HostMgr::instance().getHostDataSource()); // Check that wrong specification of backend throws an exception. // (This is really a check on HostDataSourceFactory, but is convenient to // perform here.) - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( NULL, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)), InvalidParameter); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( INVALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)), InvalidType); // Check that invalid login data does not cause an exception, CQL should use // default values. - EXPECT_NO_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_NO_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD))); - EXPECT_NO_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_NO_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD))); - EXPECT_NO_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_NO_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD))); - EXPECT_NO_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_NO_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, INVALID_PASSWORD))); // Check that invalid timeouts throw DbOperationError. - EXPECT_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_1)), DbOperationError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_2)), DbOperationError); // Check that CQL allows the hostname to not be specified. - EXPECT_NO_THROW(HostDataSourceFactory::create(connectionString(CQL_VALID_TYPE, + EXPECT_NO_THROW(HostMgr::addSource(connectionString(CQL_VALID_TYPE, NULL, VALID_HOST, INVALID_USER, VALID_PASSWORD))); // Tidy up after the test diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc index 1209677ace..a66d5e2c9e 100644 --- a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -585,12 +586,12 @@ GenericHostDataSourceTest::testReadOnlyDatabase(const char* valid_db_type) { // Close the database connection and reopen in "read-only" mode as // specified by the "VALID_READONLY_DB" parameter. - HostDataSourceFactory::destroy(); - HostDataSourceFactory::create(connectionString( + HostMgr::create(); + HostMgr::addSource(connectionString( valid_db_type, VALID_NAME, VALID_HOST, VALID_READONLY_USER, VALID_PASSWORD, VALID_READONLY_DB)); - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + hdsptr_ = HostMgr::instance().getHostDataSource(); // Check that an attempt to insert new host would result in // exception. diff --git a/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc b/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc new file mode 100644 index 0000000000..0ff2a34e2e --- /dev/null +++ b/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc @@ -0,0 +1,248 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +#include +#include + +#include + +#include +#include + +using namespace std; +using namespace isc; +using namespace isc::dhcp; + +namespace { + +// @brief Names of test backends +enum Names { FOOBAR, FOO, BAR }; + +// @brief Convert a name to a string +string toString(Names name) { + switch (name) { + case FOOBAR: + return ("foobar"); + case FOO: + return ("foo"); + default: + return ("bar"); + } +} + +// A host data source +template +class FakeHostDataSource : public BaseHostDataSource { +public: + // @brief Constructor + FakeHostDataSource(const DatabaseConnection::ParameterMap&) { } + + virtual ~FakeHostDataSource() { } + + // The base class is abstract so we need to define methods + + virtual ConstHostCollection + getAll(const HWAddrPtr&, const DuidPtr&) const { + return (ConstHostCollection()); + } + + virtual ConstHostCollection + getAll(const Host::IdentifierType&, const uint8_t*, const size_t) const { + return (ConstHostCollection()); + } + + virtual ConstHostCollection + getAll4(const asiolink::IOAddress&) const { + return (ConstHostCollection()); + } + + virtual ConstHostPtr + get4(const SubnetID&, const HWAddrPtr&, const DuidPtr&) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get4(const SubnetID&, const Host::IdentifierType&, + const uint8_t*, const size_t) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get4(const SubnetID&, const asiolink::IOAddress&) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get6(const SubnetID&, const DuidPtr&, const HWAddrPtr&) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get6(const SubnetID&, const Host::IdentifierType&, + const uint8_t*, const size_t) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get6(const asiolink::IOAddress&, const uint8_t) const { + return (ConstHostPtr()); + } + + virtual ConstHostPtr + get6(const SubnetID&, const asiolink::IOAddress&) const { + return (ConstHostPtr()); + } + + virtual bool add(const HostPtr&) { + return (false); + } + + virtual bool del(const SubnetID&, const asiolink::IOAddress&) { + return (false); + } + + virtual bool del4(const SubnetID&, const Host::IdentifierType&, + const uint8_t*, const size_t) { + return (false); + } + + virtual bool del6(const SubnetID&, const Host::IdentifierType&, + const uint8_t*, const size_t) { + return (false); + } + + virtual string getType() const { + return (toString(NAME)); + } +}; + +// @brief Factory function template +template +BaseHostDataSource* +factory(const DatabaseConnection::ParameterMap& parameters) { + return (new FakeHostDataSource(parameters)); +} + +// @brief Register factory template +template +bool registerFactory() { + return (HostDataSourceFactory::registerFactory(toString(NAME), + factory)); +} + +// @brief Factory function returning 0 +BaseHostDataSource* factory0(const DatabaseConnection::ParameterMap&) { + return (0); +} + +// @brief Test fixture class +class HostDataSourceFactoryTest : public ::testing::Test { +private: + // @brief Prepares the class for a test. + virtual void SetUp() { + } + + // @brief Cleans up after the test. + virtual void TearDown() { + sources_.clear(); + HostDataSourceFactory::deregisterFactory("foobar"); + HostDataSourceFactory::deregisterFactory("foo"); + HostDataSourceFactory::deregisterFactory("bar"); + } +public: + HostDataSourceList sources_; +}; + +// Verify a factory can be registered and only once. +TEST_F(HostDataSourceFactoryTest, registerFactory) { + EXPECT_TRUE(registerFactory()); + + // Only once + EXPECT_FALSE(registerFactory()); +} + +// Verify a factory can be registered and deregistered +TEST_F(HostDataSourceFactoryTest, deregisterFactory) { + // Does not exist at the beginning + EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("foobar")); + + // Register and deregister + EXPECT_TRUE(registerFactory()); + EXPECT_TRUE(HostDataSourceFactory::deregisterFactory("foobar")); + + // No longer exists + EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("foobar")); +} + +// Verify a registered factory can be called +TEST_F(HostDataSourceFactoryTest, add) { + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foobar")); + ASSERT_EQ(1, sources_.size()); + EXPECT_EQ("foobar", sources_[0]->getType()); +} + +// Verify that type is required +TEST_F(HostDataSourceFactoryTest, notype) { + EXPECT_THROW(HostDataSourceFactory::add(sources_, "tp=foobar"), + InvalidParameter); + EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=foobar"), + InvalidType); +} + +// Verify that factory must not return NULL +TEST_F(HostDataSourceFactoryTest, null) { + EXPECT_TRUE(HostDataSourceFactory::registerFactory("foobar", factory0)); + EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=foobar"), + Unexpected); +} + +// Verify del class method +TEST_F(HostDataSourceFactoryTest, del) { + // No sources at the beginning + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foobar")); + + // Add foobar + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foobar")); + ASSERT_EQ(1, sources_.size()); + + // Delete another + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "another")); + + // Delete foobar + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foobar")); + + // No longer foobar in sources + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foobar")); +} + +// Verify add and del class method on multiple backends +TEST_F(HostDataSourceFactoryTest, multiple) { + // Add foo twice + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foo")); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foo")); + + // Add bar once + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=bar")); + + // Delete them + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foo")); + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "bar")); + // Second instance of foo + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foo")); + + // No more sources + EXPECT_EQ(0, sources_.size()); + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foo")); + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "bar")); +} + +}; // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc index 1f7cc680f5..0a42513c02 100644 --- a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -210,8 +210,8 @@ HostMgrTest::testGetAll(BaseHostDataSource& data_source1, // If there non-matching HW address is specified, nothing should be // returned. hosts = HostMgr::instance().getAll(Host::IDENT_HWADDR, - &hwaddrs_[1]->hwaddr_[0], - hwaddrs_[1]->hwaddr_.size()); + &hwaddrs_[1]->hwaddr_[0], + hwaddrs_[1]->hwaddr_.size()); ASSERT_TRUE(hosts.empty()); // For the correct HW address, there should be two reservations. @@ -225,7 +225,7 @@ HostMgrTest::testGetAll(BaseHostDataSource& data_source1, // Look for the first reservation. bool found = false; - for (int i = 0; i < 2; ++i) { + for (unsigned i = 0; i < 2; ++i) { if (hosts[0]->getIPv4Reservation() == IOAddress("192.0.2.5")) { ASSERT_EQ(1, hosts[0]->getIPv4SubnetID()); found = true; @@ -238,7 +238,7 @@ HostMgrTest::testGetAll(BaseHostDataSource& data_source1, // Look for the second reservation. found = false; - for (int i = 0; i < 2; ++i) { + for (unsigned i = 0; i < 2; ++i) { if (hosts[1]->getIPv4Reservation() == IOAddress("192.0.3.10")) { ASSERT_EQ(10, hosts[1]->getIPv4SubnetID()); found = true; @@ -425,7 +425,7 @@ MySQLHostMgrTest::SetUp() { // Connect to the database try { - HostMgr::create(test::validMySQLConnectionString()); + HostMgr::addSource(test::validMySQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -438,8 +438,8 @@ MySQLHostMgrTest::SetUp() { void MySQLHostMgrTest::TearDown() { - HostDataSourceFactory::getHostDataSourcePtr()->rollback(); - HostDataSourceFactory::destroy(); + HostMgr::instance().getHostDataSource()->rollback(); + HostMgr::delSource("mysql"); test::destroyMySQLSchema(); } @@ -502,7 +502,7 @@ PostgreSQLHostMgrTest::SetUp() { // Connect to the database try { - HostMgr::create(test::validPgSQLConnectionString()); + HostMgr::addSource(test::validPgSQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -515,8 +515,8 @@ PostgreSQLHostMgrTest::SetUp() { void PostgreSQLHostMgrTest::TearDown() { - HostDataSourceFactory::getHostDataSourcePtr()->rollback(); - HostDataSourceFactory::destroy(); + HostMgr::instance().getHostDataSource()->rollback(); + HostMgr::delSource("postgresql"); test::destroyPgSQLSchema(); } diff --git a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc index 63a81b4539..ccad94341a 100644 --- a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -46,7 +47,8 @@ public: // Connect to the database try { - HostDataSourceFactory::create(validMySQLConnectionString()); + HostMgr::create(); + HostMgr::addSource(validMySQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -56,7 +58,7 @@ public: throw; } - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + hdsptr_ = HostMgr::instance().getHostDataSource(); } /// @brief Destructor @@ -69,7 +71,7 @@ public: } catch (...) { // Rollback may fail if backend is in read only mode. That's ok. } - HostDataSourceFactory::destroy(); + HostMgr::delAllSources(); hdsptr_.reset(); destroyMySQLSchema(); } @@ -82,9 +84,9 @@ public: /// Parameter is ignored for MySQL backend as the v4 and v6 leases share /// the same database. void reopen(Universe) { - HostDataSourceFactory::destroy(); - HostDataSourceFactory::create(validMySQLConnectionString()); - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + HostMgr::create(); + HostMgr::addSource(validMySQLConnectionString()); + hdsptr_ = HostMgr::instance().getHostDataSource(); } /// @brief returns number of rows in a table @@ -148,9 +150,9 @@ TEST(MySqlHostDataSource, OpenDatabase) { // Check that lease manager open the database opens correctly and tidy up. // If it fails, print the error message. try { - HostDataSourceFactory::create(validMySQLConnectionString()); - EXPECT_NO_THROW((void) HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + HostMgr::create(); + EXPECT_NO_THROW(HostMgr::addSource(validMySQLConnectionString())); + HostMgr::delSource("mysql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -163,9 +165,9 @@ TEST(MySqlHostDataSource, OpenDatabase) { try { string connection_string = validMySQLConnectionString() + string(" ") + string(VALID_TIMEOUT); - HostDataSourceFactory::create(connection_string); - EXPECT_NO_THROW((void) HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + HostMgr::create(); + EXPECT_NO_THROW(HostMgr::addSource(connection_string)); + HostMgr::delSource("mysql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -175,43 +177,43 @@ TEST(MySqlHostDataSource, OpenDatabase) { // Check that attempting to get an instance of the lease manager when // none is set throws an exception. - EXPECT_FALSE(HostDataSourceFactory::getHostDataSourcePtr()); + EXPECT_FALSE(HostMgr::instance().getHostDataSource()); // Check that wrong specification of backend throws an exception. // (This is really a check on LeaseMgrFactory, but is convenient to // perform here.) - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( NULL, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)), InvalidParameter); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( INVALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)), InvalidType); // Check that invalid login data causes an exception. - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, INVALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_1)), DbInvalidTimeout); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_2)), DbInvalidTimeout); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, VALID_TIMEOUT, INVALID_READONLY_DB)), DbInvalidReadOnly); // Check for missing parameters - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( MYSQL_VALID_TYPE, NULL, VALID_HOST, INVALID_USER, VALID_PASSWORD)), NoDatabaseName); diff --git a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc index 269fe77e95..d9e422259f 100644 --- a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -46,7 +47,8 @@ public: // Connect to the database try { - HostDataSourceFactory::create(validPgSQLConnectionString()); + HostMgr::create(); + HostMgr::addSource(validPgSQLConnectionString()); } catch (...) { std::cerr << "*** ERROR: unable to open database. The test\n" "*** environment is broken and must be fixed before\n" @@ -56,7 +58,7 @@ public: throw; } - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + hdsptr_ = HostMgr::instance().getHostDataSource(); } /// @brief Destructor @@ -70,7 +72,7 @@ public: } catch (...) { // Rollback may fail if backend is in read only mode. That's ok. } - HostDataSourceFactory::destroy(); + HostMgr::delAllSources(); hdsptr_.reset(); destroyPgSQLSchema(); } @@ -83,9 +85,9 @@ public: /// Parameter is ignored for PostgreSQL backend as the v4 and v6 leases /// share the same database. void reopen(Universe) { - HostDataSourceFactory::destroy(); - HostDataSourceFactory::create(validPgSQLConnectionString()); - hdsptr_ = HostDataSourceFactory::getHostDataSourcePtr(); + HostMgr::create(); + HostMgr::addSource(validPgSQLConnectionString()); + hdsptr_ = HostMgr::instance().getHostDataSource(); } /// @brief returns number of rows in a table @@ -148,9 +150,9 @@ TEST(PgSqlHostDataSource, OpenDatabase) { // Check that lease manager open the database opens correctly and tidy up. // If it fails, print the error message. try { - HostDataSourceFactory::create(validPgSQLConnectionString()); - EXPECT_NO_THROW((void) HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + HostMgr::create(); + EXPECT_NO_THROW(HostMgr::addSource(validPgSQLConnectionString())); + HostMgr::delSource("postgresql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -163,9 +165,8 @@ TEST(PgSqlHostDataSource, OpenDatabase) { try { string connection_string = validPgSQLConnectionString() + string(" ") + string(VALID_TIMEOUT); - HostDataSourceFactory::create(connection_string); - EXPECT_NO_THROW((void) HostDataSourceFactory::getHostDataSourcePtr()); - HostDataSourceFactory::destroy(); + EXPECT_NO_THROW(HostMgr::addSource(connection_string)); + HostMgr::delSource("postgresql"); } catch (const isc::Exception& ex) { FAIL() << "*** ERROR: unable to open database, reason:\n" << " " << ex.what() << "\n" @@ -175,40 +176,40 @@ TEST(PgSqlHostDataSource, OpenDatabase) { // Check that attempting to get an instance of the lease manager when // none is set throws an exception. - EXPECT_FALSE(HostDataSourceFactory::getHostDataSourcePtr()); + EXPECT_FALSE(HostMgr::instance().getHostDataSource()); // Check that wrong specification of backend throws an exception. // (This is really a check on LeaseMgrFactory, but is convenient to // perform here.) - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( NULL, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)), InvalidParameter); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( INVALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)), InvalidType); // Check that invalid login data causes an exception. - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, INVALID_PASSWORD)), DbOpenError); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_1)), DbInvalidTimeout); - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD, INVALID_TIMEOUT_2)), DbInvalidTimeout); // Check for missing parameters - EXPECT_THROW(HostDataSourceFactory::create(connectionString( + EXPECT_THROW(HostMgr::addSource(connectionString( PGSQL_VALID_TYPE, NULL, VALID_HOST, INVALID_USER, VALID_PASSWORD)), NoDatabaseName); From 66fd3572c095fac47546ffc2a82ad46a7478b05f Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 12 Feb 2018 01:34:48 +0100 Subject: [PATCH 04/18] [5531] Checkpoint before first syntax change --- src/bin/dhcp4/dhcp4_lexer.ll | 11 +- src/bin/dhcp4/dhcp4_parser.yy | 32 +++++- src/bin/dhcp4/json_config_parser.cc | 13 ++- src/bin/dhcp4/parser_context.h | 4 +- src/bin/dhcp6/dhcp6_lexer.ll | 11 +- src/bin/dhcp6/dhcp6_parser.yy | 32 +++++- src/bin/dhcp6/json_config_parser.cc | 13 ++- src/bin/dhcp6/parser_context.h | 4 +- src/lib/dhcpsrv/host_mgr.cc | 156 ++++++++++++++-------------- src/lib/dhcpsrv/hosts_messages.mes | 32 +++--- 10 files changed, 206 insertions(+), 102 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index d5d88ff41a..8fcecb7ac2 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -294,6 +294,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"hosts-databases\" { + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::DHCP4: + return isc::dhcp::Dhcp4Parser::make_HOSTS_DATABASES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("hosts-databases", driver.loc_); + } +} + \"readonly\" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOSTS_DATABASE: diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 9c5f94262a..d1ab591aa4 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -68,6 +68,7 @@ using namespace std; LEASE_DATABASE "lease-database" HOSTS_DATABASE "hosts-database" + HOSTS_DATABASES "hosts-databases" TYPE "type" MEMFILE "memfile" MYSQL "mysql" @@ -421,6 +422,7 @@ global_param: valid_lifetime | interfaces_config | lease_database | hosts_database + | hosts_databases | host_reservation_identifiers | client_classes | option_def_list @@ -568,6 +570,34 @@ hosts_database: HOSTS_DATABASE { ctx.leave(); }; +hosts_databases: HOSTS_DATABASES { + ElementPtr l(new ListElement(ctx.loc2pos(@1))); + ctx.stack_.back()->set("hosts-databases", l); + ctx.stack_.push_back(l); + ctx.enter(ctx.HOSTS_DATABASE); +} COLON LSQUARE_BRACKET database_list RSQUARE_BRACKET { + ctx.stack_.pop_back(); + ctx.leave(); +}; + +database_list: %empty + | not_empty_database_list + ; + +not_empty_database_list: database + | not_empty_database_list COMMA database + ; + +database: LCURLY_BRACKET { + ElementPtr m(new MapElement(ctx.loc2pos(@1))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); +} database_map_params RCURLY_BRACKET { + // The type parameter is required + ctx.require("type", ctx.loc2pos(@1), ctx.loc2pos(@4)); + ctx.stack_.pop_back(); +}; + database_map_params: database_map_param | database_map_params COMMA database_map_param ; diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index 4c8417ef5e..ea009f5a58 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -425,6 +425,17 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set, continue; } + // For now only support empty or singleton, ignoring extra entries. + if (config_pair.first == "hosts-databases") { + if (config_pair.second->size() == 0) { + continue; + } + DbAccessParser parser(DbAccessParser::HOSTS_DB); + CfgDbAccessPtr cfg_db_access = srv_cfg->getCfgDbAccess(); + parser.parse(cfg_db_access, config_pair.second->get(0)); + continue; + } + if (config_pair.first == "subnet4") { SrvConfigPtr srv_cfg = CfgMgr::instance().getStagingCfg(); Subnets4ListConfigParser subnets_parser; diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index 189d7512ae..23a8c1ca32 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -223,7 +223,7 @@ public: /// Used while parsing Dhcp4/lease-database structures. LEASE_DATABASE, - /// Used while parsing Dhcp4/hosts-database structures. + /// Used while parsing Dhcp4/hosts-database[s] structures. HOSTS_DATABASE, /// Used while parsing Dhcp4/*-database/type. diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 58808613ea..f9fe3f8c5f 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -457,6 +457,15 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} } } +\"hosts-databases\" { + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::DHCP6: + return isc::dhcp::Dhcp6Parser::make_HOSTS_DATABASES(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("hosts-databases", driver.loc_); + } +} + \"readonly\" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOSTS_DATABASE: diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 5fd8df6db6..7ed24cdc8f 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1,4 +1,4 @@ -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -56,6 +56,7 @@ using namespace std; LEASE_DATABASE "lease-database" HOSTS_DATABASE "hosts-database" + HOSTS_DATABASES "hosts-databases" TYPE "type" MEMFILE "memfile" MYSQL "mysql" @@ -425,6 +426,7 @@ global_param: preferred_lifetime | interfaces_config | lease_database | hosts_database + | hosts_databases | mac_sources | relay_supplied_options | host_reservation_identifiers @@ -538,6 +540,34 @@ hosts_database: HOSTS_DATABASE { ctx.leave(); }; +hosts_databases: HOSTS_DATABASES { + ElementPtr l(new ListElement(ctx.loc2pos(@1))); + ctx.stack_.back()->set("hosts-databases", l); + ctx.stack_.push_back(l); + ctx.enter(ctx.HOSTS_DATABASE); +} COLON LSQUARE_BRACKET database_list RSQUARE_BRACKET { + ctx.stack_.pop_back(); + ctx.leave(); +}; + +database_list: %empty + | not_empty_database_list + ; + +not_empty_database_list: database + | not_empty_database_list COMMA database + ; + +database: LCURLY_BRACKET { + ElementPtr m(new MapElement(ctx.loc2pos(@1))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); +} database_map_params RCURLY_BRACKET { + // The type parameter is required + ctx.require("type", ctx.loc2pos(@1), ctx.loc2pos(@4)); + ctx.stack_.pop_back(); +}; + database_map_params: database_map_param | database_map_params COMMA database_map_param ; diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index bab6ebe21d..a999ebe407 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -538,6 +538,17 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set, continue; } + // For now only support empty or singleton, ignoring extra entries. + if (config_pair.first == "hosts-databases") { + if (config_pair.second->size() == 0) { + continue; + } + DbAccessParser parser(DbAccessParser::HOSTS_DB); + CfgDbAccessPtr cfg_db_access = srv_config->getCfgDbAccess(); + parser.parse(cfg_db_access, config_pair.second->get(0)); + continue; + } + if (config_pair.first == "subnet6") { Subnets6ListConfigParser subnets_parser; // parse() returns number of subnets parsed. We may log it one day. diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 9cca5e630f..8fe201b157 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -221,7 +221,7 @@ public: /// Used while parsing Dhcp6/lease-database structures. LEASE_DATABASE, - /// Used while parsing Dhcp6/hosts-database structures. + /// Used while parsing Dhcp6/hosts-database[s] structures. HOSTS_DATABASE, /// Used while parsing Dhcp6/*-database/type. diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index b04bd3f0f9..8b62d54235 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -116,16 +116,16 @@ ConstHostPtr HostMgr::get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, const DuidPtr& duid) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, hwaddr, duid); + if (host || alternate_sources_.empty()) { + return (host); + } + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_HWADDR_DUID) + .arg(subnet_id) + .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)") + .arg(duid ? duid->toText() : "(duid)"); for (auto it = alternate_sources_.begin(); - it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_HWADDR_DUID) - .arg(subnet_id) - .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)") - .arg(duid ? duid->toText() : "(duid)"); + !host && it != alternate_sources_.end(); ++it) { if (duid) { host = (*it)->get4(subnet_id, HWAddrPtr(), duid); } @@ -143,18 +143,18 @@ HostMgr::get4(const SubnetID& subnet_id, const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, identifier_type, identifier_begin, identifier_len); + if (host || alternate_sources_.empty()) { + return (host); + } + + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + identifier_len)); + for (auto it = alternate_sources_.begin(); it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, - identifier_begin, - identifier_len)); - host = (*it)->get4(subnet_id, identifier_type, identifier_begin, identifier_len); @@ -165,17 +165,17 @@ HostMgr::get4(const SubnetID& subnet_id, .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, identifier_len)) + .arg((*it)->getType()) .arg(host->toText()); - break; + + return (host); } - LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, - HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_NULL) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, - identifier_begin, - identifier_len)); } - + LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, + HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_NULL) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + identifier_len)); return (host); } @@ -183,15 +183,15 @@ ConstHostPtr HostMgr::get4(const SubnetID& subnet_id, const asiolink::IOAddress& address) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, address); + if (host || alternate_sources_.empty()) { + return (host); + } + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_ADDRESS4) + .arg(subnet_id) + .arg(address.toText()); for (auto it = alternate_sources_.begin(); - it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_ADDRESS4) - .arg(subnet_id) - .arg(address.toText()); + !host && it != alternate_sources_.end(); ++it) { host = (*it)->get4(subnet_id, address); } return (host); @@ -202,16 +202,17 @@ ConstHostPtr HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, const HWAddrPtr& hwaddr) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, duid, hwaddr); + if (host || alternate_sources_.empty()) { + return (host); + } + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_DUID_HWADDR) + .arg(subnet_id) + .arg(duid ? duid->toText() : "(duid)") + .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)"); + for (auto it = alternate_sources_.begin(); - it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_DUID_HWADDR) - .arg(subnet_id) - .arg(duid ? duid->toText() : "(duid)") - .arg(hwaddr ? hwaddr->toText() : "(no-hwaddr)"); + !host && it != alternate_sources_.end(); ++it) { if (duid) { host = (*it)->get6(subnet_id, duid, HWAddrPtr()); } @@ -225,15 +226,15 @@ HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, ConstHostPtr HostMgr::get6(const IOAddress& prefix, const uint8_t prefix_len) const { ConstHostPtr host = getCfgHosts()->get6(prefix, prefix_len); + if (host || alternate_sources_.empty()) { + return (host); + } + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET6_PREFIX) + .arg(prefix.toText()) + .arg(static_cast(prefix_len)); for (auto it = alternate_sources_.begin(); - it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET6_PREFIX) - .arg(prefix.toText()) - .arg(static_cast(prefix_len)); + !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(prefix, prefix_len); } return (host); @@ -246,17 +247,18 @@ HostMgr::get6(const SubnetID& subnet_id, const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, identifier_type, identifier_begin, identifier_len); + if (host || alternate_sources_.empty()) { + return (host); + } + + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + identifier_len)); + for (auto it = alternate_sources_.begin(); it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, - identifier_begin, - identifier_len)); host = (*it)->get6(subnet_id, identifier_type, identifier_begin, identifier_len); @@ -268,16 +270,18 @@ HostMgr::get6(const SubnetID& subnet_id, .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, identifier_len)) + .arg((*it)->getType()) .arg(host->toText()); - break; + return (host); } - LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_NULL) - .arg(subnet_id) - .arg(Host::getIdentifierAsText(identifier_type, - identifier_begin, - identifier_len)); } + + LOG_DEBUG(hosts_logger, HOSTS_DBG_RESULTS, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_NULL) + .arg(subnet_id) + .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, + identifier_len)); + return (host); } @@ -285,15 +289,15 @@ ConstHostPtr HostMgr::get6(const SubnetID& subnet_id, const asiolink::IOAddress& addr) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, addr); + if (host || alternate_sources_.empty()) { + return (host); + } + LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, + HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_ADDRESS6) + .arg(subnet_id) + .arg(addr.toText()); for (auto it = alternate_sources_.begin(); - it != alternate_sources_.end(); ++it) { - if (host) { - break; - } - LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, - HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_ADDRESS6) - .arg(subnet_id) - .arg(addr.toText()); + !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(subnet_id, addr); } return (host); diff --git a/src/lib/dhcpsrv/hosts_messages.mes b/src/lib/dhcpsrv/hosts_messages.mes index 00f0b23b4b..d47c582623 100644 --- a/src/lib/dhcpsrv/hosts_messages.mes +++ b/src/lib/dhcpsrv/hosts_messages.mes @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this @@ -134,24 +134,24 @@ subnet id and specific host identifier. This debug message is issued when no host was found using the specified subnet id and host identifier. -% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_ADDRESS4 trying alternate source for host using subnet id %1 and address %2 +% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_ADDRESS4 trying alternate sources for host using subnet id %1 and address %2 This debug message is issued when the Host Manager doesn't find the host connected to the specific subnet and having the reservation for the specific IPv4 address, and it is starting to search for this host -in the alternate host data source. +in alternate host data sources. -% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_HWADDR_DUID trying alternate source for host using subnet id %1, HWADDR %2, DUID%3 +% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_HWADDR_DUID trying alternate sources for host using subnet id %1, HWADDR %2, DUID%3 This debug message is issued when the Host Manager doesn't find the host connected to the specific subnet and identified by the HW address -or DUID, and it is starting to search for this host in the alternate -host data source. +or DUID, and it is starting to search for this host in alternate +host data sources. % HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER get one host with IPv4 reservation for subnet id %1, identified by %2 This debug message is issued when starting to retrieve a host holding IPv4 reservation, which is connected to a specific subnet and is identified by a specific unique identifier. -% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_HOST using subnet id %1 and identifier %2, found host: %3 +% HOSTS_MGR_ALTERNATE_GET4_SUBNET_ID_IDENTIFIER_HOST using subnet id %1 and identifier %2, found in %3 host: %4 This debug message includes the details of a host returned by an alternate hosts data source using a subnet id and specific host identifier. @@ -160,32 +160,32 @@ identifier. This debug message is issued when no host was found using the specified subnet id and host identifier. -% HOSTS_MGR_ALTERNATE_GET6_PREFIX trying alternate source for host using prefix %1/%2 +% HOSTS_MGR_ALTERNATE_GET6_PREFIX trying alternate sources for host using prefix %1/%2 This debug message is issued when the Host Manager doesn't find the host connected to the specific subnet and having the reservation for the specified prefix, and it is starting to search for this host in -the alternate host data source. +alternate host data sources. -% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_ADDRESS6 trying alternate source for host using subnet id %1 and IPv6 address %2 +% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_ADDRESS6 trying alternate sources for host using subnet id %1 and IPv6 address %2 This debug message is issued when the Host Manager doesn't find the host connected to the specific subnet and having the reservation for the specified IPv6 address, and it is starting to search for this -host in the alternate host data source. +host in alternate host data sources. -% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_DUID_HWADDR trying alternate source for host using subnet id %1, DUID %2, HWADDR %3 +% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_DUID_HWADDR trying alternate sources for host using subnet id %1, DUID %2, HWADDR %3 This debug message is issued when the Host Manager doesn't find the host connected to the specific subnet and identified by the specified -DUID or HW Address, and it is starting to search for this host in the -alternate host data source. +DUID or HW Address, and it is starting to search for this host in +alternate host data sources. % HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER get one host with IPv6 reservation for subnet id %1, identified by %2 This debug message is issued when starting to retrieve a host holding IPv4 reservation, which is connected to a specific subnet and is identified by a specific unique identifier. -% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_HOST using subnet id %1 and identifier %2, found host: %3 +% HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_HOST using subnet id %1 and identifier %2, found in %3 host: %4 This debug message includes the details of a host returned by an -alternate hosts data source using a subnet id and specific host +alternate host data source using a subnet id and specific host identifier. % HOSTS_MGR_ALTERNATE_GET6_SUBNET_ID_IDENTIFIER_NULL host not found using subnet id %1 and identifier %2 From 68fbae07731b8c892e26de40561985c0432ebd54 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 12 Feb 2018 00:37:40 +0000 Subject: [PATCH 05/18] [trac5531] regen flex/bison --- src/bin/dhcp4/dhcp4_lexer.cc | 1534 +++++++------- src/bin/dhcp4/dhcp4_parser.cc | 3354 ++++++++++++++++--------------- src/bin/dhcp4/dhcp4_parser.h | 371 ++-- src/bin/dhcp4/location.hh | 2 +- src/bin/dhcp4/position.hh | 2 +- src/bin/dhcp4/stack.hh | 2 +- src/bin/dhcp6/dhcp6_lexer.cc | 1456 +++++++------- src/bin/dhcp6/dhcp6_parser.cc | 3540 +++++++++++++++++---------------- src/bin/dhcp6/dhcp6_parser.h | 395 ++-- src/bin/dhcp6/location.hh | 2 +- src/bin/dhcp6/position.hh | 2 +- src/bin/dhcp6/stack.hh | 2 +- 12 files changed, 5407 insertions(+), 5255 deletions(-) diff --git a/src/bin/dhcp4/dhcp4_lexer.cc b/src/bin/dhcp4/dhcp4_lexer.cc index 25f15adda8..d5c3d6784a 100644 --- a/src/bin/dhcp4/dhcp4_lexer.cc +++ b/src/bin/dhcp4/dhcp4_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 159 -#define YY_END_OF_BUFFER 160 +#define YY_NUM_RULES 160 +#define YY_END_OF_BUFFER 161 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,21 +700,21 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1292] = +static const flex_int16_t yy_accept[1294] = { 0, - 152, 152, 0, 0, 0, 0, 0, 0, 0, 0, - 160, 158, 10, 11, 158, 1, 152, 149, 152, 152, - 158, 151, 150, 158, 158, 158, 158, 158, 145, 146, - 158, 158, 158, 147, 148, 5, 5, 5, 158, 158, - 158, 10, 11, 0, 0, 141, 0, 0, 0, 0, + 153, 153, 0, 0, 0, 0, 0, 0, 0, 0, + 161, 159, 10, 11, 159, 1, 153, 150, 153, 153, + 159, 152, 151, 159, 159, 159, 159, 159, 146, 147, + 159, 159, 159, 148, 149, 5, 5, 5, 159, 159, + 159, 10, 11, 0, 0, 142, 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, 1, - 152, 152, 0, 151, 152, 3, 2, 6, 0, 152, + 153, 153, 0, 152, 153, 3, 2, 6, 0, 153, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, - 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, + 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 145, 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, @@ -722,128 +722,128 @@ static const flex_int16_t yy_accept[1292] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 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, 57, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 157, 155, - 0, 154, 153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 122, 0, 121, 0, 0, 63, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 158, 156, + 0, 155, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 122, 0, 0, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 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, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, - 0, 0, 156, 153, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 123, 0, 0, 125, 0, 0, + 0, 0, 157, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 126, 0, 0, - 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 0, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, + 0, 49, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 77, 25, 0, 0, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 130, 0, 127, 0, 126, + 0, 78, 26, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 131, 0, 128, 0, 127, - 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, - 0, 0, 7, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, + 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, + 0, 0, 7, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73, 0, 0, 0, 0, 0, 0, 0, 69, 0, + 74, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, - 67, 0, 0, 0, 72, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, + 68, 0, 0, 0, 73, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, + 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 37, + 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 0, 0, 106, 0, + 0, 82, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, - 0, 0, 0, 111, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 112, 0, 0, 110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, - 0, 0, 0, 82, 0, 0, 0, 0, 86, 70, + 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 0, 87, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 0, 20, 0, 91, 0, 0, - 0, 0, 0, 115, 0, 0, 0, 45, 0, 0, - 0, 0, 0, 93, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 81, 0, 20, 0, 92, 0, 0, + 0, 0, 0, 116, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 94, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 138, 46, 62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, - 0, 0, 0, 112, 0, 110, 0, 105, 104, 0, - 19, 0, 0, 0, 0, 0, 124, 0, 0, 76, - 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 0, 35, - 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, - 58, 41, 0, 87, 0, 0, 78, 0, 0, 0, - 0, 52, 0, 133, 0, 132, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 139, 47, 63, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, + 0, 0, 0, 113, 0, 111, 0, 106, 105, 0, + 19, 0, 0, 0, 0, 0, 125, 0, 0, 77, + 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 0, 0, 36, + 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, + 59, 42, 0, 88, 0, 0, 79, 0, 0, 0, + 0, 53, 0, 134, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 140, 75, 0, 38, - 103, 0, 0, 136, 107, 0, 0, 0, 0, 0, - 0, 23, 0, 22, 0, 113, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 39, 0, 0, 0, 36, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 137, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 139, 44, 0, 134, 129, - 0, 0, 14, 0, 0, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 141, 76, 0, 39, + 104, 0, 0, 137, 108, 0, 0, 0, 0, 0, + 0, 23, 0, 0, 22, 0, 114, 0, 0, 0, + 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 40, 0, 0, 0, 37, 0, 0, 0, 0, + 0, 0, 93, 0, 24, 0, 138, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 140, 45, 0, + 135, 130, 0, 0, 14, 0, 0, 121, 0, 0, - 100, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 17, 0, 117, 0, 0, 0, 116, 0, 0, - 0, 98, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 0, 101, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 100, 17, 0, 118, 0, 0, 0, 117, + 0, 0, 0, 99, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, - 0, 0, 96, 101, 42, 0, 0, 0, 95, 0, - 0, 0, 0, 0, 0, 0, 65, 0, 0, 97, - 0 + 0, 0, 0, 0, 0, 0, 0, 119, 0, 0, + 0, 0, 0, 0, 97, 102, 43, 0, 0, 0, + 96, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 98, 0 } ; @@ -891,307 +891,307 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1304] = +static const flex_int16_t yy_base[1306] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1653, 1654, 32, 1649, 141, 0, 201, 1654, 206, 88, - 11, 213, 1654, 1631, 114, 25, 2, 6, 1654, 1654, - 73, 11, 17, 1654, 1654, 1654, 104, 1637, 1592, 0, - 1629, 107, 1644, 217, 247, 1654, 1588, 185, 1587, 1593, - 93, 58, 1585, 91, 211, 195, 14, 273, 195, 1584, - 181, 275, 202, 209, 1593, 66, 188, 1592, 232, 219, - 296, 282, 207, 1575, 78, 301, 302, 296, 1594, 0, - 341, 357, 365, 371, 376, 1654, 0, 1654, 301, 379, - 223, 299, 196, 309, 322, 210, 1654, 1591, 1630, 1654, + 1655, 1656, 32, 1651, 141, 0, 201, 1656, 206, 88, + 11, 213, 1656, 1633, 114, 25, 2, 6, 1656, 1656, + 73, 11, 17, 1656, 1656, 1656, 104, 1639, 1594, 0, + 1631, 107, 1646, 217, 247, 1656, 1590, 185, 1589, 1595, + 93, 58, 1587, 91, 211, 195, 14, 273, 195, 1586, + 181, 275, 202, 209, 1595, 66, 188, 1594, 232, 219, + 296, 282, 207, 1577, 78, 301, 302, 296, 1596, 0, + 341, 357, 365, 371, 376, 1656, 0, 1656, 301, 379, + 223, 299, 196, 309, 322, 210, 1656, 1593, 1632, 1656, - 283, 1654, 391, 1619, 295, 1577, 1587, 333, 344, 1582, - 341, 352, 362, 368, 374, 1625, 0, 442, 365, 1569, - 1571, 1567, 1575, 360, 1571, 1560, 1561, 89, 1577, 1560, - 1569, 1569, 364, 1560, 361, 1561, 375, 1606, 1610, 1552, - 1603, 1545, 1568, 1565, 1565, 1559, 351, 1552, 1545, 1550, - 1544, 376, 1555, 1540, 1539, 1553, 306, 1539, 377, 1555, - 72, 438, 1542, 385, 1553, 1550, 1551, 1549, 1531, 1533, - 402, 1525, 1542, 1534, 0, 389, 392, 428, 410, 416, - 437, 1533, 1654, 0, 1576, 448, 1523, 1526, 436, 444, - 1534, 448, 1577, 454, 1576, 447, 1575, 1654, 491, 1574, + 283, 1656, 391, 1621, 295, 1579, 1589, 333, 344, 1584, + 341, 352, 362, 368, 374, 1627, 0, 442, 365, 1571, + 1573, 1569, 1577, 360, 1573, 1562, 1563, 89, 1579, 1562, + 1571, 1571, 364, 1562, 361, 1563, 375, 1608, 1612, 1554, + 1605, 1547, 1570, 1567, 1567, 1561, 351, 1554, 1547, 1552, + 1546, 376, 1557, 1542, 1541, 1555, 306, 1541, 377, 1557, + 72, 438, 1544, 385, 1555, 1552, 1553, 1551, 1533, 1535, + 402, 1527, 1544, 1536, 0, 389, 392, 428, 410, 416, + 437, 1535, 1656, 0, 1578, 448, 1525, 1528, 436, 444, + 1536, 448, 1579, 454, 1578, 447, 1577, 1656, 491, 1576, - 459, 1535, 1515, 1531, 1528, 1527, 1518, 418, 1567, 1561, - 1527, 1506, 1514, 1509, 1523, 1519, 1507, 1519, 1519, 1510, - 1494, 1498, 1511, 1511, 1503, 1493, 1511, 1654, 1506, 1509, - 1490, 1489, 1539, 1488, 1498, 1501, 467, 1497, 1485, 1496, - 1532, 1479, 1535, 1488, 449, 1478, 1494, 1475, 1474, 1480, - 1471, 1470, 1477, 1479, 1524, 1482, 1481, 1475, 274, 1482, - 1477, 1469, 1475, 1474, 1474, 1455, 1471, 1457, 1463, 1470, - 1458, 1451, 1465, 1506, 1467, 448, 1458, 474, 1654, 1654, - 485, 1654, 1654, 1445, 0, 459, 198, 1447, 503, 495, - 1501, 1454, 490, 1654, 1499, 1654, 1493, 538, 1654, 487, + 459, 1537, 1517, 1533, 1530, 1529, 1520, 418, 1569, 1563, + 1529, 1508, 1516, 1511, 1525, 1521, 1509, 1521, 1521, 1512, + 1496, 1500, 1513, 1513, 1505, 1495, 1513, 1656, 1508, 1511, + 1492, 1491, 1541, 1490, 1500, 1503, 467, 1499, 1487, 1498, + 1534, 1481, 1537, 1490, 449, 1480, 1496, 1477, 1476, 1482, + 1473, 1472, 1479, 1481, 1526, 1484, 1483, 1477, 274, 1484, + 1479, 1471, 1477, 1476, 1476, 1457, 1473, 1459, 1465, 1472, + 1460, 1453, 1467, 1508, 1469, 448, 1460, 474, 1656, 1656, + 485, 1656, 1656, 1447, 0, 459, 198, 1449, 503, 495, + 1503, 1456, 490, 1656, 1501, 1656, 1495, 538, 1656, 487, - 1435, 1491, 1437, 1443, 1493, 1450, 1449, 368, 1654, 1447, - 1489, 1444, 1441, 513, 1447, 1485, 1479, 1434, 1429, 1426, - 1475, 1434, 1423, 1472, 1420, 519, 1434, 1419, 1432, 1419, - 1429, 1424, 1431, 1426, 1422, 481, 1420, 1423, 1418, 1414, - 1462, 485, 1456, 1654, 1408, 1407, 1406, 1399, 1401, 1405, - 1394, 1407, 539, 1452, 1407, 1404, 1408, 1654, 1406, 1395, - 1395, 1407, 1389, 1381, 1382, 1403, 1385, 1434, 1396, 1395, - 1381, 1393, 1392, 1391, 1390, 1431, 1430, 1654, 1374, 1373, - 559, 1386, 1654, 1654, 1385, 0, 1374, 1366, 512, 1371, - 1422, 1421, 1379, 1419, 1654, 1367, 1417, 1654, 518, 588, + 1437, 1493, 1439, 1445, 1495, 1452, 1451, 368, 1656, 1449, + 1491, 1446, 1443, 513, 1449, 1487, 1481, 1436, 1431, 1428, + 1477, 1436, 1425, 1474, 1422, 519, 1436, 1421, 1434, 1421, + 1431, 1426, 1433, 1428, 1424, 481, 1422, 1425, 1420, 1416, + 1464, 485, 1458, 1656, 1410, 1409, 1408, 1401, 1403, 1407, + 1396, 1409, 539, 1454, 1409, 1406, 1410, 1656, 1408, 1397, + 1397, 1409, 1391, 1383, 1384, 1405, 1387, 1436, 1398, 1397, + 1383, 1395, 1394, 1393, 1392, 1433, 1432, 1656, 1376, 1375, + 559, 1388, 1656, 1656, 1387, 0, 1376, 1368, 512, 1373, + 1424, 1423, 1381, 1421, 1656, 1369, 1419, 1656, 518, 588, - 532, 1416, 1372, 1368, 1356, 1654, 1361, 1371, 1370, 1357, - 1356, 1654, 1358, 1355, 509, 1353, 1355, 1654, 1363, 1360, - 1345, 1358, 1353, 561, 1360, 1342, 1391, 1654, 1340, 1356, - 1388, 1351, 1348, 1349, 1351, 1383, 1336, 1331, 1330, 1379, - 1325, 1340, 1318, 1325, 1330, 1378, 1654, 1325, 1321, 1319, - 1323, 1330, 1314, 1314, 1324, 1327, 1316, 1311, 1654, 1366, - 1654, 1310, 1321, 1358, 1305, 1310, 1319, 1313, 1317, 1357, - 1351, 1315, 1295, 1315, 1297, 1296, 1304, 1308, 1291, 1347, - 1289, 1654, 1654, 1294, 1292, 1654, 1303, 1337, 1299, 0, - 1283, 1300, 1338, 1288, 1654, 1654, 1285, 1654, 1291, 1654, + 532, 1418, 1374, 1370, 1358, 1656, 1363, 1373, 1372, 1359, + 1358, 1656, 1360, 1357, 509, 1355, 1357, 1656, 1365, 1362, + 1347, 1360, 1355, 561, 1362, 1344, 1393, 1656, 1342, 1358, + 1390, 1353, 1350, 1351, 1353, 1385, 1338, 1333, 1332, 1381, + 1327, 1342, 1320, 1327, 1332, 1380, 1656, 1327, 1323, 1321, + 1325, 1332, 1316, 1316, 1326, 1329, 1318, 1313, 1656, 1368, + 1656, 1312, 1323, 1360, 1307, 1312, 1321, 1315, 1319, 1359, + 1353, 1317, 1297, 1317, 1299, 1298, 1306, 1310, 1293, 1349, + 1291, 1656, 1656, 1296, 1294, 1656, 1305, 1339, 1301, 0, + 1285, 1302, 1340, 1290, 1656, 1656, 1287, 1656, 1293, 1656, - 500, 535, 567, 1654, 1288, 1276, 1327, 1274, 1273, 1272, - 1279, 1272, 1284, 1283, 1283, 1271, 1312, 1279, 1271, 1314, - 1260, 1276, 1275, 1654, 1260, 1257, 1271, 1263, 1269, 1260, - 1268, 1253, 1269, 1251, 1265, 1263, 1246, 1240, 1245, 1260, - 1257, 1258, 1255, 1296, 1253, 1654, 1239, 1241, 1250, 1286, - 1285, 1238, 563, 1247, 1230, 1231, 1228, 1654, 1242, 1221, - 1242, 1239, 1231, 1274, 1228, 1272, 1654, 1219, 1233, 1236, - 1217, 1267, 1266, 1213, 1264, 1263, 1654, 14, 1225, 1208, - 1213, 1215, 1654, 1221, 1211, 1654, 1256, 1204, 1259, 544, - 532, 536, 1209, 1252, 543, 1256, 1250, 1249, 1248, 1202, + 500, 535, 567, 1656, 1290, 1278, 1329, 1276, 1275, 1274, + 1281, 1274, 1286, 1285, 1285, 1273, 1314, 1281, 1273, 1316, + 1262, 1278, 1277, 1656, 1262, 1259, 1273, 1265, 1271, 1262, + 1270, 1255, 1271, 1253, 1267, 1265, 1248, 1242, 1247, 1262, + 1259, 1260, 1257, 1298, 1255, 1656, 1241, 1243, 1252, 1288, + 1287, 1240, 563, 1249, 1232, 1233, 1230, 1656, 1244, 1223, + 1244, 1241, 1233, 1276, 1230, 1274, 1656, 1221, 1235, 1238, + 1219, 1269, 1268, 1215, 1266, 1265, 1656, 14, 1227, 1210, + 1215, 1217, 1656, 1223, 1213, 1656, 1258, 1206, 1261, 544, + 532, 536, 1211, 1254, 543, 1258, 1252, 1251, 1250, 1204, - 1192, 1245, 1198, 1208, 1242, 1205, 1199, 1186, 1194, 1237, - 1241, 1198, 1197, 1198, 1191, 1180, 1193, 1196, 1191, 1192, - 1189, 1188, 1191, 1186, 1227, 1226, 1176, 1166, 1174, 1222, - 1654, 1221, 1170, 1162, 1163, 1176, 1163, 1174, 1654, 1162, - 1171, 1170, 1170, 1210, 1153, 1162, 1155, 1166, 1143, 1147, - 1198, 1145, 1155, 1195, 1142, 1193, 538, 540, 1135, 1145, - 558, 1654, 1195, 1153, 1136, 1141, 1145, 1135, 1147, 1150, - 1187, 1654, 1181, 566, 1134, 1142, 1141, 1136, 1132, 1139, - 1654, 1122, 1125, 1121, 1138, 1133, 1121, 1117, 1124, 1118, - 1170, 1127, 1115, 1129, 1117, 1654, 1125, 1123, 1114, 1123, + 1194, 1247, 1200, 1210, 1244, 1207, 1201, 1188, 1196, 1239, + 1243, 1200, 1199, 1200, 1193, 1182, 1195, 1198, 1193, 1194, + 1191, 1190, 1193, 1188, 1229, 1228, 1178, 1168, 1176, 1224, + 1656, 1223, 1172, 1164, 1165, 1178, 1165, 1176, 1656, 1164, + 1173, 1172, 1172, 1212, 1155, 1164, 1157, 1168, 1145, 1149, + 1200, 1147, 1157, 1197, 1144, 1195, 538, 540, 1137, 1147, + 558, 1656, 1197, 1155, 1138, 1143, 1147, 1137, 1149, 1152, + 1189, 1656, 1183, 566, 1136, 1144, 1143, 1138, 1134, 1141, + 1656, 1124, 1127, 1123, 1140, 1135, 1123, 1119, 1126, 1120, + 1172, 1129, 1117, 1131, 1119, 1656, 1127, 1125, 1116, 1125, - 1119, 1160, 1102, 1102, 1115, 1100, 1155, 1097, 1098, 1654, - 1654, 1106, 1109, 1112, 1654, 1654, 1111, 1, 3, 572, - 63, 277, 356, 417, 486, 543, 1654, 533, 548, 552, + 1121, 1162, 1104, 1104, 1117, 1102, 1157, 1099, 1100, 1656, + 1656, 1108, 1111, 1114, 1656, 1656, 1113, 1, 3, 572, + 63, 277, 356, 417, 486, 543, 1656, 533, 548, 552, 554, 612, 567, 559, 555, 568, 579, 574, 575, 570, - 572, 573, 579, 581, 634, 593, 598, 575, 1654, 633, - 593, 583, 598, 599, 586, 600, 1654, 619, 627, 607, + 572, 573, 579, 581, 634, 593, 598, 575, 1656, 633, + 593, 583, 598, 599, 586, 600, 1656, 619, 627, 607, 597, 644, 609, 613, 652, 607, 602, 603, 599, 608, - 603, 659, 618, 609, 1654, 611, 622, 607, 623, 617, - 662, 630, 615, 616, 1654, 635, 618, 675, 620, 1654, + 603, 659, 618, 609, 1656, 611, 622, 607, 623, 617, + 662, 630, 615, 616, 1656, 635, 618, 675, 620, 1656, 639, 619, 637, 676, 636, 626, 644, 643, 629, 644, - 636, 643, 633, 651, 636, 1654, 644, 650, 645, 696, - 1654, 647, 652, 646, 658, 652, 651, 653, 705, 651, - 651, 708, 654, 1654, 653, 661, 659, 658, 663, 673, + 636, 643, 633, 651, 636, 1656, 644, 650, 645, 696, + 1656, 647, 652, 646, 658, 652, 651, 653, 705, 651, + 651, 708, 654, 1656, 653, 661, 659, 658, 663, 673, 674, 679, 718, 677, 693, 698, 672, 682, 673, 725, - 670, 1654, 677, 682, 689, 730, 732, 681, 1654, 677, + 670, 1656, 677, 682, 689, 730, 732, 681, 1656, 677, 680, 679, 699, 696, 701, 702, 688, 696, 705, 685, - 706, 746, 1654, 701, 750, 751, 713, 715, 703, 700, + 706, 746, 1656, 701, 750, 751, 713, 715, 703, 700, 707, 758, 707, 705, 723, 762, 714, 713, 719, 717, - 715, 768, 769, 765, 725, 1654, 730, 723, 732, 720, - 730, 726, 739, 1654, 722, 723, 1654, 724, 722, 741, + 715, 768, 769, 765, 725, 1656, 730, 723, 732, 720, + 730, 726, 739, 1656, 722, 723, 1656, 724, 722, 741, - 742, 743, 742, 726, 731, 749, 1654, 739, 772, 763, - 735, 794, 757, 1654, 740, 755, 747, 751, 1654, 1654, + 742, 743, 742, 726, 731, 749, 1656, 739, 772, 763, + 735, 794, 757, 1656, 740, 755, 747, 751, 1656, 1656, 761, 796, 745, 798, 747, 805, 750, 761, 753, 759, - 755, 773, 774, 1654, 772, 1654, 775, 1654, 778, 768, - 761, 773, 816, 1654, 773, 823, 824, 1654, 825, 769, - 775, 782, 824, 1654, 1654, 774, 774, 777, 791, 778, + 755, 773, 774, 1656, 772, 1656, 775, 1656, 778, 768, + 761, 773, 816, 1656, 773, 823, 824, 1656, 825, 769, + 775, 782, 824, 1656, 1656, 774, 774, 777, 791, 778, 835, 794, 832, 786, 839, 789, 841, 790, 843, 844, - 805, 846, 790, 802, 807, 793, 823, 852, 812, 1654, + 805, 846, 790, 802, 807, 793, 823, 852, 812, 1656, 804, 855, 804, 800, 816, 821, 803, 861, 816, 821, - 1654, 822, 815, 824, 825, 822, 812, 814, 871, 820, + 1656, 822, 815, 824, 825, 822, 812, 814, 871, 820, - 817, 874, 870, 813, 828, 878, 1654, 1654, 1654, 838, - 830, 840, 825, 826, 886, 887, 834, 890, 1654, 840, - 842, 893, 836, 1654, 857, 1654, 841, 1654, 1654, 849, - 1654, 899, 850, 901, 902, 884, 1654, 862, 863, 1654, - 851, 850, 853, 853, 854, 850, 1654, 872, 858, 859, - 874, 874, 877, 877, 874, 879, 1654, 871, 881, 1654, - 878, 883, 885, 882, 1654, 874, 874, 880, 879, 890, - 1654, 1654, 929, 1654, 878, 884, 1654, 886, 888, 891, - 902, 1654, 899, 1654, 896, 1654, 919, 939, 945, 946, + 817, 874, 870, 813, 828, 878, 1656, 1656, 1656, 838, + 830, 840, 825, 826, 886, 887, 834, 890, 1656, 840, + 842, 893, 836, 1656, 857, 1656, 841, 1656, 1656, 849, + 1656, 899, 850, 901, 902, 884, 1656, 862, 863, 1656, + 851, 850, 853, 853, 854, 850, 1656, 872, 858, 859, + 874, 874, 877, 877, 874, 879, 1656, 871, 881, 1656, + 878, 883, 885, 882, 1656, 874, 874, 880, 879, 890, + 1656, 1656, 929, 1656, 878, 884, 1656, 886, 888, 891, + 902, 1656, 899, 1656, 896, 1656, 919, 939, 945, 946, 890, 948, 949, 904, 898, 952, 953, 949, 914, 910, 952, 902, 907, 960, 918, 962, 922, 964, 927, 916, 924, 968, 912, 930, 929, 913, 969, 934, 935, 935, - 922, 933, 980, 940, 953, 940, 1654, 1654, 984, 1654, - 1654, 933, 944, 1654, 1654, 934, 983, 928, 933, 991, - 941, 1654, 947, 1654, 994, 1654, 939, 954, 959, 1654, - 993, 961, 954, 963, 951, 961, 1004, 1005, 1006, 957, - 1654, 1008, 1009, 957, 1654, 961, 1013, 959, 958, 1016, - 971, 1654, 1013, 975, 1654, 978, 1021, 982, 965, 967, - 964, 980, 989, 1028, 1654, 1654, 1654, 1024, 1654, 1654, - 989, 1026, 1654, 980, 987, 1654, 984, 989, 1036, 981, + 922, 933, 980, 940, 953, 940, 1656, 1656, 984, 1656, + 1656, 933, 944, 1656, 1656, 934, 983, 928, 933, 991, + 941, 1656, 993, 948, 1656, 995, 1656, 940, 955, 960, + 1656, 994, 962, 955, 964, 952, 962, 1005, 1006, 1007, + 958, 1656, 1009, 1011, 958, 1656, 962, 1014, 960, 960, + 1018, 973, 1656, 1015, 1656, 977, 1656, 980, 1023, 984, + 967, 969, 966, 982, 991, 1030, 1656, 1656, 1656, 1026, + 1656, 1656, 991, 1028, 1656, 982, 989, 1656, 986, 991, - 1654, 996, 986, 998, 1041, 985, 993, 1654, 1004, 994, - 993, 1007, 998, 1007, 1009, 1654, 1051, 1052, 1012, 1054, - 1654, 1050, 1014, 995, 1058, 1017, 1018, 1019, 1062, 1021, - 1654, 1654, 1026, 1654, 1008, 1066, 1027, 1654, 1013, 1013, - 1015, 1654, 1020, 1015, 1027, 1654, 1025, 1029, 1020, 1072, - 1021, 1037, 1030, 1039, 1030, 1037, 1024, 1039, 1086, 1045, - 1032, 1048, 1039, 1053, 1049, 1654, 1093, 1094, 1095, 1052, - 1051, 1052, 1654, 1654, 1654, 1099, 1043, 1059, 1654, 1097, - 1048, 1047, 1049, 1060, 1107, 1058, 1654, 1067, 1110, 1654, - 1654, 1116, 1121, 1126, 1131, 1136, 1141, 1146, 1149, 1123, + 1038, 983, 1656, 998, 988, 1000, 1043, 987, 995, 1656, + 1006, 996, 995, 1009, 1000, 1009, 1011, 1656, 1053, 1054, + 1014, 1056, 1656, 1052, 1016, 997, 1060, 1019, 1020, 1021, + 1064, 1023, 1656, 1656, 1028, 1656, 1010, 1068, 1029, 1656, + 1015, 1015, 1017, 1656, 1022, 1017, 1029, 1656, 1027, 1031, + 1022, 1074, 1023, 1039, 1032, 1041, 1032, 1039, 1026, 1041, + 1088, 1047, 1034, 1050, 1041, 1055, 1051, 1656, 1095, 1096, + 1097, 1054, 1053, 1054, 1656, 1656, 1656, 1101, 1045, 1061, + 1656, 1099, 1050, 1049, 1051, 1062, 1109, 1060, 1656, 1069, + 1112, 1656, 1656, 1118, 1123, 1128, 1133, 1138, 1143, 1148, - 1128, 1130, 1143 + 1151, 1125, 1130, 1132, 1145 } ; -static const flex_int16_t yy_def[1304] = +static const flex_int16_t yy_def[1306] = { 0, - 1292, 1292, 1293, 1293, 1292, 1292, 1292, 1292, 1292, 1292, - 1291, 1291, 1291, 1291, 1291, 1294, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1295, - 1291, 1291, 1291, 1296, 15, 1291, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1297, 45, 45, + 1294, 1294, 1295, 1295, 1294, 1294, 1294, 1294, 1294, 1294, + 1293, 1293, 1293, 1293, 1293, 1296, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1297, + 1293, 1293, 1293, 1298, 15, 1293, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1294, - 1291, 1291, 1291, 1291, 1291, 1291, 1298, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1295, 1291, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1296, + 1293, 1293, 1293, 1293, 1293, 1293, 1300, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1297, 1293, - 1296, 1291, 1291, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1299, 45, 1297, 45, 45, + 1298, 1293, 1293, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1301, 45, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1298, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1300, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1299, 1291, 1297, 45, + 45, 45, 45, 45, 1300, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1302, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1301, 1293, 1299, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1301, 45, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 1291, 45, 1297, 1291, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1303, 45, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 1293, 45, 1299, 1293, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1291, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, - 45, 45, 1291, 1291, 1291, 1302, 45, 45, 45, 45, - 45, 45, 45, 45, 1291, 45, 45, 1291, 45, 1297, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, + 45, 45, 1293, 1293, 1293, 1304, 45, 45, 45, 45, + 45, 45, 45, 45, 1293, 45, 45, 1293, 45, 1299, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 45, 1291, 45, 45, 45, 45, 45, 1291, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, + 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, + 45, 1293, 45, 45, 45, 45, 45, 1293, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1291, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1293, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1291, 1291, 45, 45, 1291, 45, 45, 1291, 1303, - 45, 45, 45, 45, 1291, 1291, 45, 1291, 45, 1291, + 45, 1293, 1293, 45, 45, 1293, 45, 45, 1293, 1305, + 45, 45, 45, 45, 1293, 1293, 45, 1293, 45, 1293, - 45, 45, 45, 1291, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1291, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, - 45, 45, 1291, 45, 45, 1291, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, + 45, 45, 1293, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 1291, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1291, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1291, 45, 45, 45, 45, 45, 45, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, + 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1291, - 1291, 45, 45, 45, 1291, 1291, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1293, + 1293, 45, 45, 45, 1293, 1293, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1291, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1293, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1291, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1291, 45, 45, 45, 45, 1291, + 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1293, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1291, 45, 45, 45, 45, 45, 45, 1291, 45, + 45, 1293, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1291, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 45, 1291, 45, 45, 45, + 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 45, 1293, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, - 45, 45, 45, 1291, 45, 45, 45, 45, 1291, 1291, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 45, 1293, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1291, 45, 1291, 45, 1291, 45, 45, - 45, 45, 45, 1291, 45, 45, 45, 1291, 45, 45, - 45, 45, 45, 1291, 1291, 45, 45, 45, 45, 45, + 45, 45, 45, 1293, 45, 1293, 45, 1293, 45, 45, + 45, 45, 45, 1293, 45, 45, 45, 1293, 45, 45, + 45, 45, 45, 1293, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1291, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 1291, 1291, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1291, 45, - 45, 45, 45, 1291, 45, 1291, 45, 1291, 1291, 45, - 1291, 45, 45, 45, 45, 45, 1291, 45, 45, 1291, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 1291, - 45, 45, 45, 45, 1291, 45, 45, 45, 45, 45, - 1291, 1291, 45, 1291, 45, 45, 1291, 45, 45, 45, - 45, 1291, 45, 1291, 45, 1291, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 1293, 1293, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1293, 45, + 45, 45, 45, 1293, 45, 1293, 45, 1293, 1293, 45, + 1293, 45, 45, 45, 45, 45, 1293, 45, 45, 1293, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 45, 45, 1293, + 45, 45, 45, 45, 1293, 45, 45, 45, 45, 45, + 1293, 1293, 45, 1293, 45, 45, 1293, 45, 45, 45, + 45, 1293, 45, 1293, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1291, 1291, 45, 1291, - 1291, 45, 45, 1291, 1291, 45, 45, 45, 45, 45, - 45, 1291, 45, 1291, 45, 1291, 45, 45, 45, 1291, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1291, 45, 45, 45, 1291, 45, 45, 45, 45, 45, - 45, 1291, 45, 45, 1291, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1291, 1291, 1291, 45, 1291, 1291, - 45, 45, 1291, 45, 45, 1291, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 1293, 45, 1293, + 1293, 45, 45, 1293, 1293, 45, 45, 45, 45, 45, + 45, 1293, 45, 45, 1293, 45, 1293, 45, 45, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1293, 45, 45, 45, 1293, 45, 45, 45, 45, + 45, 45, 1293, 45, 1293, 45, 1293, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1293, 1293, 1293, 45, + 1293, 1293, 45, 45, 1293, 45, 45, 1293, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 1291, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 1291, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1291, 1291, 45, 1291, 45, 45, 45, 1291, 45, 45, - 45, 1291, 45, 45, 45, 1291, 45, 45, 45, 45, + 45, 45, 1293, 45, 45, 45, 45, 45, 45, 1293, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, + 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 1293, 1293, 45, 1293, 45, 45, 45, 1293, + 45, 45, 45, 1293, 45, 45, 45, 1293, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1291, 45, 45, 45, 45, - 45, 45, 1291, 1291, 1291, 45, 45, 45, 1291, 45, - 45, 45, 45, 45, 45, 45, 1291, 45, 45, 1291, - 0, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 45, 45, 45, 45, 45, 45, 45, 1293, 45, 45, + 45, 45, 45, 45, 1293, 1293, 1293, 45, 45, 45, + 1293, 45, 45, 45, 45, 45, 45, 45, 1293, 45, + 45, 1293, 0, 1293, 1293, 1293, 1293, 1293, 1293, 1293, - 1291, 1291, 1291 + 1293, 1293, 1293, 1293, 1293 } ; -static const flex_int16_t yy_nxt[1726] = +static const flex_int16_t yy_nxt[1728] = { 0, - 1291, 13, 14, 13, 1291, 15, 16, 1291, 17, 18, + 1293, 13, 14, 13, 1293, 15, 16, 1293, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 86, 662, - 37, 14, 37, 87, 25, 26, 38, 1291, 663, 27, + 37, 14, 37, 87, 25, 26, 38, 1293, 663, 27, 37, 14, 37, 42, 28, 42, 38, 92, 93, 29, 115, 30, 13, 14, 13, 91, 92, 25, 31, 93, 13, 14, 13, 13, 14, 13, 32, 40, 797, 13, @@ -1294,14 +1294,14 @@ static const flex_int16_t yy_nxt[1726] = 1108, 1087, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, - 1147, 1148, 1149, 1150, 1151, 1125, 1152, 1153, 1154, 1155, - 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, + 1137, 1138, 1139, 1140, 1141, 1142, 1144, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 1152, 1125, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, + 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, - 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, - 1186, 1187, 1188, 1189, 1190, 1163, 1191, 1192, 1193, 1194, - 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, + 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1164, 1192, 1193, 1194, 1195, + 1196, 1143, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, @@ -1311,77 +1311,77 @@ static const flex_int16_t yy_nxt[1726] = 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, - 1285, 1286, 1287, 1288, 1289, 1290, 12, 12, 12, 12, - 12, 36, 36, 36, 36, 36, 80, 285, 80, 80, - 80, 99, 386, 99, 490, 99, 101, 101, 101, 101, - 101, 116, 116, 116, 116, 116, 175, 101, 175, 175, - 175, 197, 197, 197, 796, 795, 794, 793, 792, 791, - 790, 789, 788, 787, 786, 785, 784, 783, 782, 781, - 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, - 770, 769, 768, 767, 766, 765, 764, 763, 762, 761, - 760, 758, 757, 756, 755, 754, 753, 752, 751, 750, + 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 12, 12, + 12, 12, 12, 36, 36, 36, 36, 36, 80, 285, + 80, 80, 80, 99, 386, 99, 490, 99, 101, 101, + 101, 101, 101, 116, 116, 116, 116, 116, 175, 101, + 175, 175, 175, 197, 197, 197, 796, 795, 794, 793, + 792, 791, 790, 789, 788, 787, 786, 785, 784, 783, + 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, + 772, 771, 770, 769, 768, 767, 766, 765, 764, 763, + 762, 761, 760, 758, 757, 756, 755, 754, 753, 752, - 749, 746, 745, 739, 738, 737, 736, 735, 734, 733, - 732, 731, 730, 729, 728, 727, 726, 725, 724, 723, - 722, 721, 720, 719, 718, 717, 716, 715, 714, 713, - 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, - 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, - 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, - 682, 681, 678, 677, 672, 671, 670, 669, 668, 667, - 666, 665, 664, 661, 660, 659, 658, 657, 656, 655, - 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, - 644, 643, 642, 641, 638, 637, 636, 635, 634, 633, + 751, 750, 749, 746, 745, 739, 738, 737, 736, 735, + 734, 733, 732, 731, 730, 729, 728, 727, 726, 725, + 724, 723, 722, 721, 720, 719, 718, 717, 716, 715, + 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, + 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, + 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, + 684, 683, 682, 681, 678, 677, 672, 671, 670, 669, + 668, 667, 666, 665, 664, 661, 660, 659, 658, 657, + 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, + 646, 645, 644, 643, 642, 641, 638, 637, 636, 635, - 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, - 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, - 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, - 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, - 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, - 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, - 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, - 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, - 549, 548, 547, 546, 545, 544, 543, 542, 541, 540, - 539, 538, 537, 536, 535, 534, 533, 532, 531, 530, + 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, + 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, + 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, + 604, 603, 602, 601, 600, 599, 598, 597, 596, 595, + 594, 593, 589, 588, 587, 586, 585, 584, 583, 582, + 581, 580, 579, 578, 577, 576, 575, 574, 573, 572, + 571, 570, 569, 568, 567, 566, 565, 564, 563, 562, + 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, - 529, 528, 527, 526, 523, 522, 521, 520, 519, 518, - 517, 514, 513, 512, 511, 510, 509, 508, 507, 506, - 505, 504, 500, 499, 498, 497, 496, 495, 494, 492, - 491, 489, 488, 485, 484, 483, 482, 481, 480, 479, - 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, - 468, 467, 466, 465, 464, 463, 462, 461, 458, 457, - 456, 455, 454, 453, 452, 451, 450, 447, 446, 445, - 444, 443, 440, 439, 438, 437, 436, 435, 434, 433, - 432, 427, 426, 425, 424, 423, 422, 421, 420, 419, - 418, 417, 414, 413, 412, 411, 408, 407, 406, 405, + 531, 530, 529, 528, 527, 526, 523, 522, 521, 520, + 519, 518, 517, 514, 513, 512, 511, 510, 509, 508, + 507, 506, 505, 504, 500, 499, 498, 497, 496, 495, + 494, 492, 491, 489, 488, 485, 484, 483, 482, 481, + 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, + 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, + 458, 457, 456, 455, 454, 453, 452, 451, 450, 447, + 446, 445, 444, 443, 440, 439, 438, 437, 436, 435, + 434, 433, 432, 427, 426, 425, 424, 423, 422, 421, + 420, 419, 418, 417, 414, 413, 412, 411, 408, 407, - 404, 403, 402, 399, 398, 396, 395, 390, 385, 382, - 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, - 369, 368, 367, 366, 365, 364, 361, 360, 359, 358, - 357, 356, 355, 354, 353, 352, 351, 350, 349, 345, - 344, 343, 342, 341, 340, 339, 335, 334, 333, 332, - 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, - 321, 320, 319, 318, 317, 316, 315, 314, 313, 312, - 311, 310, 309, 306, 305, 304, 303, 302, 301, 299, - 198, 296, 294, 292, 289, 288, 286, 284, 277, 276, - 275, 273, 272, 271, 270, 269, 268, 264, 253, 249, + 406, 405, 404, 403, 402, 399, 398, 396, 395, 390, + 385, 382, 379, 378, 377, 376, 375, 374, 373, 372, + 371, 370, 369, 368, 367, 366, 365, 364, 361, 360, + 359, 358, 357, 356, 355, 354, 353, 352, 351, 350, + 349, 345, 344, 343, 342, 341, 340, 339, 335, 334, + 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, + 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, + 313, 312, 311, 310, 309, 306, 305, 304, 303, 302, + 301, 299, 198, 296, 294, 292, 289, 288, 286, 284, + 277, 276, 275, 273, 272, 271, 270, 269, 268, 264, - 246, 245, 244, 243, 241, 240, 239, 238, 235, 234, - 233, 232, 231, 230, 229, 228, 227, 223, 220, 217, - 216, 215, 214, 211, 210, 209, 205, 204, 203, 202, - 198, 191, 188, 187, 185, 183, 182, 174, 160, 142, - 136, 121, 110, 107, 106, 104, 43, 100, 98, 97, - 88, 43, 1291, 11, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 253, 249, 246, 245, 244, 243, 241, 240, 239, 238, + 235, 234, 233, 232, 231, 230, 229, 228, 227, 223, + 220, 217, 216, 215, 214, 211, 210, 209, 205, 204, + 203, 202, 198, 191, 188, 187, 185, 183, 182, 174, + 160, 142, 136, 121, 110, 107, 106, 104, 43, 100, + 98, 97, 88, 43, 1293, 11, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291 + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293 } ; -static const flex_int16_t yy_chk[1726] = +static const flex_int16_t yy_chk[1728] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 578, @@ -1491,88 +1491,88 @@ static const flex_int16_t yy_chk[1726] = 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1087, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1129, - 1132, 1133, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1145, + 1132, 1133, 1136, 1137, 1138, 1139, 1140, 1141, 1143, 1144, - 1147, 1148, 1149, 1151, 1152, 1153, 1154, 1155, 1156, 1157, - 1158, 1159, 1160, 1162, 1163, 1125, 1164, 1166, 1167, 1168, - 1169, 1170, 1171, 1173, 1174, 1176, 1177, 1178, 1179, 1180, - 1181, 1182, 1183, 1184, 1188, 1191, 1192, 1194, 1195, 1197, - 1198, 1199, 1200, 1202, 1203, 1204, 1205, 1206, 1207, 1209, - 1210, 1211, 1212, 1213, 1214, 1215, 1217, 1218, 1219, 1220, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1233, - 1235, 1236, 1237, 1239, 1240, 1241, 1243, 1244, 1245, 1247, - 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, - 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1267, 1268, + 1146, 1148, 1149, 1150, 1152, 1153, 1154, 1155, 1156, 1157, + 1158, 1159, 1160, 1161, 1163, 1125, 1164, 1165, 1167, 1168, + 1169, 1104, 1170, 1171, 1172, 1174, 1176, 1178, 1179, 1180, + 1181, 1182, 1183, 1184, 1185, 1186, 1190, 1193, 1194, 1196, + 1197, 1199, 1200, 1201, 1202, 1204, 1205, 1206, 1207, 1208, + 1209, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1219, 1220, + 1221, 1222, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1232, 1235, 1237, 1238, 1239, 1241, 1242, 1243, 1245, 1246, + 1247, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, + 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, - 1269, 1270, 1271, 1272, 1276, 1277, 1278, 1280, 1281, 1282, - 1283, 1284, 1285, 1286, 1288, 1289, 1292, 1292, 1292, 1292, - 1292, 1293, 1293, 1293, 1293, 1293, 1294, 1300, 1294, 1294, - 1294, 1295, 1301, 1295, 1302, 1295, 1296, 1296, 1296, 1296, - 1296, 1297, 1297, 1297, 1297, 1297, 1298, 1303, 1298, 1298, - 1298, 1299, 1299, 1299, 717, 714, 713, 712, 709, 708, - 707, 706, 705, 704, 703, 702, 701, 700, 699, 698, - 697, 695, 694, 693, 692, 691, 690, 689, 688, 687, - 686, 685, 684, 683, 682, 680, 679, 678, 677, 676, - 675, 673, 671, 670, 669, 668, 667, 666, 665, 664, + 1269, 1270, 1271, 1272, 1273, 1274, 1278, 1279, 1280, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1290, 1291, 1294, 1294, + 1294, 1294, 1294, 1295, 1295, 1295, 1295, 1295, 1296, 1302, + 1296, 1296, 1296, 1297, 1303, 1297, 1304, 1297, 1298, 1298, + 1298, 1298, 1298, 1299, 1299, 1299, 1299, 1299, 1300, 1305, + 1300, 1300, 1300, 1301, 1301, 1301, 717, 714, 713, 712, + 709, 708, 707, 706, 705, 704, 703, 702, 701, 700, + 699, 698, 697, 695, 694, 693, 692, 691, 690, 689, + 688, 687, 686, 685, 684, 683, 682, 680, 679, 678, + 677, 676, 675, 673, 671, 670, 669, 668, 667, 666, - 663, 660, 659, 656, 655, 654, 653, 652, 651, 650, - 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, - 638, 637, 636, 635, 634, 633, 632, 630, 629, 628, - 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, - 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, - 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, - 597, 596, 594, 593, 589, 588, 587, 585, 584, 582, - 581, 580, 579, 576, 575, 574, 573, 572, 571, 570, - 569, 568, 566, 565, 564, 563, 562, 561, 560, 559, - 557, 556, 555, 554, 552, 551, 550, 549, 548, 547, + 665, 664, 663, 660, 659, 656, 655, 654, 653, 652, + 651, 650, 649, 648, 647, 646, 645, 644, 643, 642, + 641, 640, 638, 637, 636, 635, 634, 633, 632, 630, + 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, + 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, + 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, + 599, 598, 597, 596, 594, 593, 589, 588, 587, 585, + 584, 582, 581, 580, 579, 576, 575, 574, 573, 572, + 571, 570, 569, 568, 566, 565, 564, 563, 562, 561, + 560, 559, 557, 556, 555, 554, 552, 551, 550, 549, - 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, - 535, 534, 533, 532, 531, 530, 529, 528, 527, 526, - 525, 523, 522, 521, 520, 519, 518, 517, 516, 515, - 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, - 499, 497, 494, 493, 492, 491, 489, 488, 487, 485, - 484, 481, 480, 479, 478, 477, 476, 475, 474, 473, - 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, - 462, 460, 458, 457, 456, 455, 454, 453, 452, 451, - 450, 449, 448, 446, 445, 444, 443, 442, 441, 440, - 439, 438, 437, 436, 435, 434, 433, 432, 431, 430, + 548, 547, 545, 544, 543, 542, 541, 540, 539, 538, + 537, 536, 535, 534, 533, 532, 531, 530, 529, 528, + 527, 526, 525, 523, 522, 521, 520, 519, 518, 517, + 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, + 506, 505, 499, 497, 494, 493, 492, 491, 489, 488, + 487, 485, 484, 481, 480, 479, 478, 477, 476, 475, + 474, 473, 472, 471, 470, 469, 468, 467, 466, 465, + 464, 463, 462, 460, 458, 457, 456, 455, 454, 453, + 452, 451, 450, 449, 448, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, - 429, 427, 426, 425, 423, 422, 421, 420, 419, 417, - 416, 414, 413, 411, 410, 409, 408, 407, 405, 404, - 403, 402, 397, 396, 394, 393, 392, 391, 390, 388, - 387, 385, 382, 380, 379, 377, 376, 375, 374, 373, - 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, - 362, 361, 360, 359, 357, 356, 355, 354, 352, 351, - 350, 349, 348, 347, 346, 345, 343, 341, 340, 339, - 338, 337, 335, 334, 333, 332, 331, 330, 329, 328, - 327, 325, 324, 323, 322, 321, 320, 319, 318, 317, - 316, 315, 313, 312, 311, 310, 307, 306, 305, 304, + 431, 430, 429, 427, 426, 425, 423, 422, 421, 420, + 419, 417, 416, 414, 413, 411, 410, 409, 408, 407, + 405, 404, 403, 402, 397, 396, 394, 393, 392, 391, + 390, 388, 387, 385, 382, 380, 379, 377, 376, 375, + 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, + 364, 363, 362, 361, 360, 359, 357, 356, 355, 354, + 352, 351, 350, 349, 348, 347, 346, 345, 343, 341, + 340, 339, 338, 337, 335, 334, 333, 332, 331, 330, + 329, 328, 327, 325, 324, 323, 322, 321, 320, 319, + 318, 317, 316, 315, 313, 312, 311, 310, 307, 306, - 303, 302, 301, 297, 295, 292, 291, 288, 284, 277, - 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, - 265, 264, 263, 262, 261, 260, 258, 257, 256, 255, - 254, 253, 252, 251, 250, 249, 248, 247, 246, 244, - 243, 242, 241, 240, 239, 238, 236, 235, 234, 233, - 232, 231, 230, 229, 227, 226, 225, 224, 223, 222, - 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, - 211, 210, 209, 207, 206, 205, 204, 203, 202, 200, - 197, 195, 193, 191, 188, 187, 185, 182, 174, 173, - 172, 170, 169, 168, 167, 166, 165, 163, 160, 158, + 305, 304, 303, 302, 301, 297, 295, 292, 291, 288, + 284, 277, 275, 274, 273, 272, 271, 270, 269, 268, + 267, 266, 265, 264, 263, 262, 261, 260, 258, 257, + 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, + 246, 244, 243, 242, 241, 240, 239, 238, 236, 235, + 234, 233, 232, 231, 230, 229, 227, 226, 225, 224, + 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, + 213, 212, 211, 210, 209, 207, 206, 205, 204, 203, + 202, 200, 197, 195, 193, 191, 188, 187, 185, 182, + 174, 173, 172, 170, 169, 168, 167, 166, 165, 163, - 156, 155, 154, 153, 151, 150, 149, 148, 146, 145, - 144, 143, 142, 141, 140, 139, 138, 136, 134, 132, - 131, 130, 129, 127, 126, 125, 123, 122, 121, 120, - 116, 110, 107, 106, 104, 99, 98, 79, 74, 68, - 65, 60, 53, 50, 49, 47, 43, 41, 39, 38, - 24, 14, 11, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 160, 158, 156, 155, 154, 153, 151, 150, 149, 148, + 146, 145, 144, 143, 142, 141, 140, 139, 138, 136, + 134, 132, 131, 130, 129, 127, 126, 125, 123, 122, + 121, 120, 116, 110, 107, 106, 104, 99, 98, 79, + 74, 68, 65, 60, 53, 50, 49, 47, 43, 41, + 39, 38, 24, 14, 11, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291 + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, + 1293, 1293, 1293, 1293, 1293, 1293, 1293 } ; static yy_state_type yy_last_accepting_state; @@ -1581,25 +1581,25 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[159] = +static const flex_int16_t yy_rule_linenum[160] = { 0, 145, 147, 149, 154, 155, 160, 161, 162, 174, 177, 182, 189, 198, 207, 216, 225, 235, 244, 253, 262, - 271, 280, 289, 298, 307, 318, 327, 336, 345, 354, - 364, 374, 384, 394, 404, 414, 424, 434, 444, 455, - 466, 477, 486, 496, 505, 515, 530, 546, 555, 564, - 573, 582, 602, 622, 631, 641, 650, 659, 668, 678, - 687, 696, 705, 714, 724, 733, 742, 751, 760, 769, - 778, 787, 796, 805, 814, 824, 836, 846, 855, 865, - 875, 885, 895, 905, 914, 924, 933, 942, 951, 960, - 970, 980, 990, 999, 1008, 1017, 1026, 1035, 1044, 1053, + 271, 280, 289, 298, 307, 316, 327, 336, 345, 354, + 363, 373, 383, 393, 403, 413, 423, 433, 443, 453, + 464, 475, 486, 495, 505, 514, 524, 539, 555, 564, + 573, 582, 591, 611, 631, 640, 650, 659, 668, 677, + 687, 696, 705, 714, 723, 733, 742, 751, 760, 769, + 778, 787, 796, 805, 814, 823, 833, 845, 855, 864, + 874, 884, 894, 904, 914, 923, 933, 942, 951, 960, + 969, 979, 989, 999, 1008, 1017, 1026, 1035, 1044, 1053, 1062, 1071, 1080, 1089, 1098, 1107, 1116, 1125, 1134, 1143, 1152, 1161, 1170, 1179, 1188, 1197, 1206, 1215, 1224, 1233, - 1242, 1252, 1262, 1272, 1282, 1292, 1302, 1312, 1322, 1332, - 1341, 1350, 1359, 1368, 1377, 1386, 1395, 1406, 1419, 1432, - 1447, 1546, 1551, 1556, 1561, 1562, 1563, 1564, 1565, 1566, - 1568, 1586, 1599, 1604, 1608, 1610, 1612, 1614 + 1242, 1251, 1261, 1271, 1281, 1291, 1301, 1311, 1321, 1331, + 1341, 1350, 1359, 1368, 1377, 1386, 1395, 1404, 1415, 1428, + 1441, 1456, 1555, 1560, 1565, 1570, 1571, 1572, 1573, 1574, + 1575, 1577, 1595, 1608, 1613, 1617, 1619, 1621, 1623 } ; /* The intent behind this definition is that it'll catch @@ -1611,7 +1611,7 @@ static const flex_int16_t yy_rule_linenum[159] = #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "dhcp4_lexer.ll" -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2036,13 +2036,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1292 ) + if ( yy_current_state >= 1294 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1291 ); + while ( yy_current_state != 1293 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2061,13 +2061,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 159 ) + else if ( yy_act < 160 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 159 ) + else if ( yy_act == 160 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 160 ) + else if ( yy_act == 161 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2319,6 +2319,18 @@ YY_RULE_SETUP case 24: YY_RULE_SETUP #line 298 "dhcp4_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::DHCP4: + return isc::dhcp::Dhcp4Parser::make_HOSTS_DATABASES(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("hosts-databases", driver.loc_); + } +} + YY_BREAK +case 25: +YY_RULE_SETUP +#line 307 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOSTS_DATABASE: @@ -2328,9 +2340,9 @@ YY_RULE_SETUP } } YY_BREAK -case 25: +case 26: YY_RULE_SETUP -#line 307 "dhcp4_lexer.ll" +#line 316 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2342,9 +2354,9 @@ YY_RULE_SETUP } } YY_BREAK -case 26: +case 27: YY_RULE_SETUP -#line 318 "dhcp4_lexer.ll" +#line 327 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DATABASE_TYPE: @@ -2354,9 +2366,9 @@ YY_RULE_SETUP } } YY_BREAK -case 27: +case 28: YY_RULE_SETUP -#line 327 "dhcp4_lexer.ll" +#line 336 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DATABASE_TYPE: @@ -2366,9 +2378,9 @@ YY_RULE_SETUP } } YY_BREAK -case 28: +case 29: YY_RULE_SETUP -#line 336 "dhcp4_lexer.ll" +#line 345 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DATABASE_TYPE: @@ -2378,9 +2390,9 @@ YY_RULE_SETUP } } YY_BREAK -case 29: +case 30: YY_RULE_SETUP -#line 345 "dhcp4_lexer.ll" +#line 354 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DATABASE_TYPE: @@ -2390,9 +2402,9 @@ YY_RULE_SETUP } } YY_BREAK -case 30: +case 31: YY_RULE_SETUP -#line 354 "dhcp4_lexer.ll" +#line 363 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2403,9 +2415,9 @@ YY_RULE_SETUP } } YY_BREAK -case 31: +case 32: YY_RULE_SETUP -#line 364 "dhcp4_lexer.ll" +#line 373 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2416,9 +2428,9 @@ YY_RULE_SETUP } } YY_BREAK -case 32: +case 33: YY_RULE_SETUP -#line 374 "dhcp4_lexer.ll" +#line 383 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2429,9 +2441,9 @@ YY_RULE_SETUP } } YY_BREAK -case 33: +case 34: YY_RULE_SETUP -#line 384 "dhcp4_lexer.ll" +#line 393 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2442,9 +2454,9 @@ YY_RULE_SETUP } } YY_BREAK -case 34: +case 35: YY_RULE_SETUP -#line 394 "dhcp4_lexer.ll" +#line 403 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2455,9 +2467,9 @@ YY_RULE_SETUP } } YY_BREAK -case 35: +case 36: YY_RULE_SETUP -#line 404 "dhcp4_lexer.ll" +#line 413 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2468,9 +2480,9 @@ YY_RULE_SETUP } } YY_BREAK -case 36: +case 37: YY_RULE_SETUP -#line 414 "dhcp4_lexer.ll" +#line 423 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2481,9 +2493,9 @@ YY_RULE_SETUP } } YY_BREAK -case 37: +case 38: YY_RULE_SETUP -#line 424 "dhcp4_lexer.ll" +#line 433 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2494,9 +2506,9 @@ YY_RULE_SETUP } } YY_BREAK -case 38: +case 39: YY_RULE_SETUP -#line 434 "dhcp4_lexer.ll" +#line 443 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2507,9 +2519,9 @@ YY_RULE_SETUP } } YY_BREAK -case 39: +case 40: YY_RULE_SETUP -#line 444 "dhcp4_lexer.ll" +#line 453 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2521,9 +2533,9 @@ YY_RULE_SETUP } } YY_BREAK -case 40: +case 41: YY_RULE_SETUP -#line 455 "dhcp4_lexer.ll" +#line 464 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2535,9 +2547,9 @@ YY_RULE_SETUP } } YY_BREAK -case 41: +case 42: YY_RULE_SETUP -#line 466 "dhcp4_lexer.ll" +#line 475 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2549,9 +2561,9 @@ YY_RULE_SETUP } } YY_BREAK -case 42: +case 43: YY_RULE_SETUP -#line 477 "dhcp4_lexer.ll" +#line 486 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2561,9 +2573,9 @@ YY_RULE_SETUP } } YY_BREAK -case 43: +case 44: YY_RULE_SETUP -#line 486 "dhcp4_lexer.ll" +#line 495 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2574,9 +2586,9 @@ YY_RULE_SETUP } } YY_BREAK -case 44: +case 45: YY_RULE_SETUP -#line 496 "dhcp4_lexer.ll" +#line 505 "dhcp4_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2586,9 +2598,9 @@ YY_RULE_SETUP } } YY_BREAK -case 45: +case 46: YY_RULE_SETUP -#line 505 "dhcp4_lexer.ll" +#line 514 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2599,9 +2611,9 @@ YY_RULE_SETUP } } YY_BREAK -case 46: +case 47: YY_RULE_SETUP -#line 515 "dhcp4_lexer.ll" +#line 524 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2617,9 +2629,9 @@ YY_RULE_SETUP } } YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 530 "dhcp4_lexer.ll" +#line 539 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LEASE_DATABASE: @@ -2636,9 +2648,9 @@ YY_RULE_SETUP } } YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 546 "dhcp4_lexer.ll" +#line 555 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -2648,9 +2660,9 @@ YY_RULE_SETUP } } YY_BREAK -case 49: +case 50: YY_RULE_SETUP -#line 555 "dhcp4_lexer.ll" +#line 564 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -2660,9 +2672,9 @@ YY_RULE_SETUP } } YY_BREAK -case 50: +case 51: YY_RULE_SETUP -#line 564 "dhcp4_lexer.ll" +#line 573 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2672,9 +2684,9 @@ YY_RULE_SETUP } } YY_BREAK -case 51: +case 52: YY_RULE_SETUP -#line 573 "dhcp4_lexer.ll" +#line 582 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::POOLS: @@ -2684,9 +2696,9 @@ YY_RULE_SETUP } } YY_BREAK -case 52: +case 53: YY_RULE_SETUP -#line 582 "dhcp4_lexer.ll" +#line 591 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2707,9 +2719,9 @@ YY_RULE_SETUP } } YY_BREAK -case 53: +case 54: YY_RULE_SETUP -#line 602 "dhcp4_lexer.ll" +#line 611 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2730,9 +2742,9 @@ YY_RULE_SETUP } } YY_BREAK -case 54: +case 55: YY_RULE_SETUP -#line 622 "dhcp4_lexer.ll" +#line 631 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2742,9 +2754,9 @@ YY_RULE_SETUP } } YY_BREAK -case 55: +case 56: YY_RULE_SETUP -#line 631 "dhcp4_lexer.ll" +#line 640 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2755,9 +2767,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 57: YY_RULE_SETUP -#line 641 "dhcp4_lexer.ll" +#line 650 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2767,9 +2779,9 @@ YY_RULE_SETUP } } YY_BREAK -case 57: +case 58: YY_RULE_SETUP -#line 650 "dhcp4_lexer.ll" +#line 659 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2779,9 +2791,9 @@ YY_RULE_SETUP } } YY_BREAK -case 58: +case 59: YY_RULE_SETUP -#line 659 "dhcp4_lexer.ll" +#line 668 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2791,9 +2803,9 @@ YY_RULE_SETUP } } YY_BREAK -case 59: +case 60: YY_RULE_SETUP -#line 668 "dhcp4_lexer.ll" +#line 677 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -2804,18 +2816,6 @@ YY_RULE_SETUP } } YY_BREAK -case 60: -YY_RULE_SETUP -#line 678 "dhcp4_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser4Context::RESERVATION_MODE: - return isc::dhcp::Dhcp4Parser::make_DISABLED(driver.loc_); - default: - return isc::dhcp::Dhcp4Parser::make_STRING("disabled", driver.loc_); - } -} - YY_BREAK case 61: YY_RULE_SETUP #line 687 "dhcp4_lexer.ll" @@ -2824,7 +2824,7 @@ YY_RULE_SETUP case isc::dhcp::Parser4Context::RESERVATION_MODE: return isc::dhcp::Dhcp4Parser::make_DISABLED(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("off", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("disabled", driver.loc_); } } YY_BREAK @@ -2834,9 +2834,9 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: - return isc::dhcp::Dhcp4Parser::make_OUT_OF_POOL(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_DISABLED(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("out-of-pool", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("off", driver.loc_); } } YY_BREAK @@ -2846,15 +2846,27 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATION_MODE: - return isc::dhcp::Dhcp4Parser::make_ALL(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_OUT_OF_POOL(driver.loc_); default: - return isc::dhcp::Dhcp4Parser::make_STRING("all", driver.loc_); + return isc::dhcp::Dhcp4Parser::make_STRING("out-of-pool", driver.loc_); } } YY_BREAK case 64: YY_RULE_SETUP #line 714 "dhcp4_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser4Context::RESERVATION_MODE: + return isc::dhcp::Dhcp4Parser::make_ALL(driver.loc_); + default: + return isc::dhcp::Dhcp4Parser::make_STRING("all", driver.loc_); + } +} + YY_BREAK +case 65: +YY_RULE_SETUP +#line 723 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -2865,9 +2877,9 @@ YY_RULE_SETUP } } YY_BREAK -case 65: +case 66: YY_RULE_SETUP -#line 724 "dhcp4_lexer.ll" +#line 733 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2877,9 +2889,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 67: YY_RULE_SETUP -#line 733 "dhcp4_lexer.ll" +#line 742 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -2889,9 +2901,9 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 68: YY_RULE_SETUP -#line 742 "dhcp4_lexer.ll" +#line 751 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGING: @@ -2901,9 +2913,9 @@ YY_RULE_SETUP } } YY_BREAK -case 68: +case 69: YY_RULE_SETUP -#line 751 "dhcp4_lexer.ll" +#line 760 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2913,9 +2925,9 @@ YY_RULE_SETUP } } YY_BREAK -case 69: +case 70: YY_RULE_SETUP -#line 760 "dhcp4_lexer.ll" +#line 769 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2925,9 +2937,9 @@ YY_RULE_SETUP } } YY_BREAK -case 70: +case 71: YY_RULE_SETUP -#line 769 "dhcp4_lexer.ll" +#line 778 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2937,9 +2949,9 @@ YY_RULE_SETUP } } YY_BREAK -case 71: +case 72: YY_RULE_SETUP -#line 778 "dhcp4_lexer.ll" +#line 787 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2949,9 +2961,9 @@ YY_RULE_SETUP } } YY_BREAK -case 72: +case 73: YY_RULE_SETUP -#line 787 "dhcp4_lexer.ll" +#line 796 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2961,9 +2973,9 @@ YY_RULE_SETUP } } YY_BREAK -case 73: +case 74: YY_RULE_SETUP -#line 796 "dhcp4_lexer.ll" +#line 805 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OUTPUT_OPTIONS: @@ -2973,9 +2985,9 @@ YY_RULE_SETUP } } YY_BREAK -case 74: +case 75: YY_RULE_SETUP -#line 805 "dhcp4_lexer.ll" +#line 814 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::LOGGERS: @@ -2985,9 +2997,9 @@ YY_RULE_SETUP } } YY_BREAK -case 75: +case 76: YY_RULE_SETUP -#line 814 "dhcp4_lexer.ll" +#line 823 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -2998,9 +3010,9 @@ YY_RULE_SETUP } } YY_BREAK -case 76: +case 77: YY_RULE_SETUP -#line 824 "dhcp4_lexer.ll" +#line 833 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3013,9 +3025,9 @@ YY_RULE_SETUP } } YY_BREAK -case 77: +case 78: YY_RULE_SETUP -#line 836 "dhcp4_lexer.ll" +#line 845 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CLIENT_CLASSES: @@ -3026,9 +3038,9 @@ YY_RULE_SETUP } } YY_BREAK -case 78: +case 79: YY_RULE_SETUP -#line 846 "dhcp4_lexer.ll" +#line 855 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3038,9 +3050,9 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 80: YY_RULE_SETUP -#line 855 "dhcp4_lexer.ll" +#line 864 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3051,9 +3063,9 @@ YY_RULE_SETUP } } YY_BREAK -case 80: +case 81: YY_RULE_SETUP -#line 865 "dhcp4_lexer.ll" +#line 874 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3064,9 +3076,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 82: YY_RULE_SETUP -#line 875 "dhcp4_lexer.ll" +#line 884 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3077,9 +3089,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 83: YY_RULE_SETUP -#line 885 "dhcp4_lexer.ll" +#line 894 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3090,9 +3102,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 84: YY_RULE_SETUP -#line 895 "dhcp4_lexer.ll" +#line 904 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS: @@ -3103,9 +3115,9 @@ YY_RULE_SETUP } } YY_BREAK -case 84: +case 85: YY_RULE_SETUP -#line 905 "dhcp4_lexer.ll" +#line 914 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RESERVATIONS: @@ -3115,9 +3127,9 @@ YY_RULE_SETUP } } YY_BREAK -case 85: +case 86: YY_RULE_SETUP -#line 914 "dhcp4_lexer.ll" +#line 923 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3128,9 +3140,9 @@ YY_RULE_SETUP } } YY_BREAK -case 86: +case 87: YY_RULE_SETUP -#line 924 "dhcp4_lexer.ll" +#line 933 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DATA: @@ -3140,9 +3152,9 @@ YY_RULE_SETUP } } YY_BREAK -case 87: +case 88: YY_RULE_SETUP -#line 933 "dhcp4_lexer.ll" +#line 942 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3152,9 +3164,9 @@ YY_RULE_SETUP } } YY_BREAK -case 88: +case 89: YY_RULE_SETUP -#line 942 "dhcp4_lexer.ll" +#line 951 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3164,9 +3176,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 90: YY_RULE_SETUP -#line 951 "dhcp4_lexer.ll" +#line 960 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::OPTION_DEF: @@ -3176,9 +3188,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 91: YY_RULE_SETUP -#line 960 "dhcp4_lexer.ll" +#line 969 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3189,9 +3201,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 92: YY_RULE_SETUP -#line 970 "dhcp4_lexer.ll" +#line 979 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::RELAY: @@ -3202,9 +3214,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 93: YY_RULE_SETUP -#line 980 "dhcp4_lexer.ll" +#line 989 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3214,9 +3226,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 94: YY_RULE_SETUP -#line 990 "dhcp4_lexer.ll" +#line 999 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3226,9 +3238,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 95: YY_RULE_SETUP -#line 999 "dhcp4_lexer.ll" +#line 1008 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::HOOKS_LIBRARIES: @@ -3238,9 +3250,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 96: YY_RULE_SETUP -#line 1008 "dhcp4_lexer.ll" +#line 1017 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3250,9 +3262,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 97: YY_RULE_SETUP -#line 1017 "dhcp4_lexer.ll" +#line 1026 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3262,9 +3274,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 98: YY_RULE_SETUP -#line 1026 "dhcp4_lexer.ll" +#line 1035 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3274,9 +3286,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 99: YY_RULE_SETUP -#line 1035 "dhcp4_lexer.ll" +#line 1044 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3286,9 +3298,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 100: YY_RULE_SETUP -#line 1044 "dhcp4_lexer.ll" +#line 1053 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3298,9 +3310,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 101: YY_RULE_SETUP -#line 1053 "dhcp4_lexer.ll" +#line 1062 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3310,9 +3322,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 102: YY_RULE_SETUP -#line 1062 "dhcp4_lexer.ll" +#line 1071 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING: @@ -3322,9 +3334,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 103: YY_RULE_SETUP -#line 1071 "dhcp4_lexer.ll" +#line 1080 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3334,9 +3346,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 104: YY_RULE_SETUP -#line 1080 "dhcp4_lexer.ll" +#line 1089 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3346,9 +3358,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 105: YY_RULE_SETUP -#line 1089 "dhcp4_lexer.ll" +#line 1098 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3358,9 +3370,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 106: YY_RULE_SETUP -#line 1098 "dhcp4_lexer.ll" +#line 1107 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONTROL_SOCKET: @@ -3370,9 +3382,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 107: YY_RULE_SETUP -#line 1107 "dhcp4_lexer.ll" +#line 1116 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3382,9 +3394,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 108: YY_RULE_SETUP -#line 1116 "dhcp4_lexer.ll" +#line 1125 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3394,9 +3406,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 109: YY_RULE_SETUP -#line 1125 "dhcp4_lexer.ll" +#line 1134 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3406,9 +3418,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 110: YY_RULE_SETUP -#line 1134 "dhcp4_lexer.ll" +#line 1143 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3418,9 +3430,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 111: YY_RULE_SETUP -#line 1143 "dhcp4_lexer.ll" +#line 1152 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3430,9 +3442,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 112: YY_RULE_SETUP -#line 1152 "dhcp4_lexer.ll" +#line 1161 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3442,9 +3454,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 113: YY_RULE_SETUP -#line 1161 "dhcp4_lexer.ll" +#line 1170 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3454,9 +3466,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 114: YY_RULE_SETUP -#line 1170 "dhcp4_lexer.ll" +#line 1179 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3466,9 +3478,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 115: YY_RULE_SETUP -#line 1179 "dhcp4_lexer.ll" +#line 1188 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3478,9 +3490,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 116: YY_RULE_SETUP -#line 1188 "dhcp4_lexer.ll" +#line 1197 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3490,9 +3502,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 117: YY_RULE_SETUP -#line 1197 "dhcp4_lexer.ll" +#line 1206 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3502,9 +3514,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 118: YY_RULE_SETUP -#line 1206 "dhcp4_lexer.ll" +#line 1215 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3514,9 +3526,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 119: YY_RULE_SETUP -#line 1215 "dhcp4_lexer.ll" +#line 1224 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3526,9 +3538,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 120: YY_RULE_SETUP -#line 1224 "dhcp4_lexer.ll" +#line 1233 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3538,9 +3550,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 121: YY_RULE_SETUP -#line 1233 "dhcp4_lexer.ll" +#line 1242 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP_DDNS: @@ -3550,9 +3562,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 122: YY_RULE_SETUP -#line 1242 "dhcp4_lexer.ll" +#line 1251 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3563,9 +3575,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 122: +case 123: YY_RULE_SETUP -#line 1252 "dhcp4_lexer.ll" +#line 1261 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) { @@ -3576,9 +3588,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 123: +case 124: YY_RULE_SETUP -#line 1262 "dhcp4_lexer.ll" +#line 1271 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) { @@ -3589,22 +3601,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 124: -YY_RULE_SETUP -#line 1272 "dhcp4_lexer.ll" -{ - /* dhcp-ddns value keywords are case insensitive */ - if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); - } - std::string tmp(yytext+1); - tmp.resize(tmp.size() - 1); - return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); -} - YY_BREAK case 125: YY_RULE_SETUP -#line 1282 "dhcp4_lexer.ll" +#line 1281 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3617,11 +3616,11 @@ YY_RULE_SETUP YY_BREAK case 126: YY_RULE_SETUP -#line 1292 "dhcp4_lexer.ll" +#line 1291 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { - return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + return isc::dhcp::Dhcp4Parser::make_WHEN_PRESENT(driver.loc_); } std::string tmp(yytext+1); tmp.resize(tmp.size() - 1); @@ -3630,7 +3629,7 @@ YY_RULE_SETUP YY_BREAK case 127: YY_RULE_SETUP -#line 1302 "dhcp4_lexer.ll" +#line 1301 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3643,7 +3642,20 @@ YY_RULE_SETUP YY_BREAK case 128: YY_RULE_SETUP -#line 1312 "dhcp4_lexer.ll" +#line 1311 "dhcp4_lexer.ll" +{ + /* dhcp-ddns value keywords are case insensitive */ + if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { + return isc::dhcp::Dhcp4Parser::make_NEVER(driver.loc_); + } + std::string tmp(yytext+1); + tmp.resize(tmp.size() - 1); + return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); +} + YY_BREAK +case 129: +YY_RULE_SETUP +#line 1321 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3654,9 +3666,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 129: +case 130: YY_RULE_SETUP -#line 1322 "dhcp4_lexer.ll" +#line 1331 "dhcp4_lexer.ll" { /* dhcp-ddns value keywords are case insensitive */ if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) { @@ -3667,9 +3679,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_); } YY_BREAK -case 130: +case 131: YY_RULE_SETUP -#line 1332 "dhcp4_lexer.ll" +#line 1341 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3679,9 +3691,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 132: YY_RULE_SETUP -#line 1341 "dhcp4_lexer.ll" +#line 1350 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3691,9 +3703,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 133: YY_RULE_SETUP -#line 1350 "dhcp4_lexer.ll" +#line 1359 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::CONFIG: @@ -3703,9 +3715,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 134: YY_RULE_SETUP -#line 1359 "dhcp4_lexer.ll" +#line 1368 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3715,9 +3727,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 135: YY_RULE_SETUP -#line 1368 "dhcp4_lexer.ll" +#line 1377 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3727,9 +3739,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 136: YY_RULE_SETUP -#line 1377 "dhcp4_lexer.ll" +#line 1386 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::SUBNET4: @@ -3739,9 +3751,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 137: YY_RULE_SETUP -#line 1386 "dhcp4_lexer.ll" +#line 1395 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3751,9 +3763,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 138: YY_RULE_SETUP -#line 1395 "dhcp4_lexer.ll" +#line 1404 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3765,9 +3777,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 139: YY_RULE_SETUP -#line 1406 "dhcp4_lexer.ll" +#line 1415 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3781,9 +3793,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 140: YY_RULE_SETUP -#line 1419 "dhcp4_lexer.ll" +#line 1428 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3797,9 +3809,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 141: YY_RULE_SETUP -#line 1432 "dhcp4_lexer.ll" +#line 1441 "dhcp4_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser4Context::DHCP4: @@ -3813,9 +3825,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 142: YY_RULE_SETUP -#line 1447 "dhcp4_lexer.ll" +#line 1456 "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. @@ -3915,65 +3927,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 142: -/* rule 142 can match eol */ +case 143: +/* rule 143 can match eol */ YY_RULE_SETUP -#line 1546 "dhcp4_lexer.ll" +#line 1555 "dhcp4_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 143: -/* rule 143 can match eol */ +case 144: +/* rule 144 can match eol */ YY_RULE_SETUP -#line 1551 "dhcp4_lexer.ll" +#line 1560 "dhcp4_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 144: +case 145: YY_RULE_SETUP -#line 1556 "dhcp4_lexer.ll" +#line 1565 "dhcp4_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 145: -YY_RULE_SETUP -#line 1561 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK case 146: YY_RULE_SETUP -#line 1562 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } +#line 1570 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 147: YY_RULE_SETUP -#line 1563 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1571 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 148: YY_RULE_SETUP -#line 1564 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1572 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 149: YY_RULE_SETUP -#line 1565 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } +#line 1573 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1566 "dhcp4_lexer.ll" -{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } +#line 1574 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1568 "dhcp4_lexer.ll" +#line 1575 "dhcp4_lexer.ll" +{ return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); } + YY_BREAK +case 152: +YY_RULE_SETUP +#line 1577 "dhcp4_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -3992,9 +4004,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 152: +case 153: YY_RULE_SETUP -#line 1586 "dhcp4_lexer.ll" +#line 1595 "dhcp4_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4008,43 +4020,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp4Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 153: +case 154: YY_RULE_SETUP -#line 1599 "dhcp4_lexer.ll" +#line 1608 "dhcp4_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 154: +case 155: YY_RULE_SETUP -#line 1604 "dhcp4_lexer.ll" +#line 1613 "dhcp4_lexer.ll" { return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 155: -YY_RULE_SETUP -#line 1608 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK case 156: YY_RULE_SETUP -#line 1610 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); +#line 1617 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 157: YY_RULE_SETUP -#line 1612 "dhcp4_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); +#line 1619 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 158: YY_RULE_SETUP -#line 1614 "dhcp4_lexer.ll" +#line 1621 "dhcp4_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 159: +YY_RULE_SETUP +#line 1623 "dhcp4_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1616 "dhcp4_lexer.ll" +#line 1625 "dhcp4_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp4Parser::make_END(driver.loc_); @@ -4068,12 +4080,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 159: +case 160: YY_RULE_SETUP -#line 1639 "dhcp4_lexer.ll" +#line 1648 "dhcp4_lexer.ll" ECHO; YY_BREAK -#line 4076 "dhcp4_lexer.cc" +#line 4088 "dhcp4_lexer.cc" case YY_END_OF_BUFFER: { @@ -4392,7 +4404,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1292 ) + if ( yy_current_state >= 1294 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4425,11 +4437,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1292 ) + if ( yy_current_state >= 1294 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1291); + yy_is_jam = (yy_current_state == 1293); return yy_is_jam ? 0 : yy_current_state; } @@ -5178,7 +5190,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1639 "dhcp4_lexer.ll" +#line 1648 "dhcp4_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp4/dhcp4_parser.cc b/src/bin/dhcp4/dhcp4_parser.cc index 698791d27c..78dee737e3 100644 --- a/src/bin/dhcp4/dhcp4_parser.cc +++ b/src/bin/dhcp4/dhcp4_parser.cc @@ -253,30 +253,30 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 151: // "boolean" + case 152: // "boolean" value.move< bool > (that.value); break; - case 150: // "floating point" + case 151: // "floating point" value.move< double > (that.value); break; - case 149: // "integer" + case 150: // "integer" value.move< int64_t > (that.value); break; - case 148: // "constant string" + case 149: // "constant string" value.move< std::string > (that.value); break; @@ -295,30 +295,30 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 151: // "boolean" + case 152: // "boolean" value.copy< bool > (that.value); break; - case 150: // "floating point" + case 151: // "floating point" value.copy< double > (that.value); break; - case 149: // "integer" + case 150: // "integer" value.copy< int64_t > (that.value); break; - case 148: // "constant string" + case 149: // "constant string" value.copy< std::string > (that.value); break; @@ -358,86 +358,86 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 148: // "constant string" + case 149: // "constant string" -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 366 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 149: // "integer" + case 150: // "integer" -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } #line 373 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 150: // "floating point" + case 151: // "floating point" -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } #line 380 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 151: // "boolean" + case 152: // "boolean" -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } #line 387 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 167: // value + case 168: // value -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 394 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 171: // map_value + case 172: // map_value -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 401 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 209: // socket_type + case 210: // socket_type -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 408 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 212: // outbound_interface_value + case 213: // outbound_interface_value -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 415 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 222: // db_type + case 229: // db_type -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 422 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 299: // hr_mode + case 306: // hr_mode -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 429 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 445: // ncr_protocol_value + case 452: // ncr_protocol_value -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 436 "dhcp4_parser.cc" // lalr1.cc:636 break; - case 453: // replace_client_name_value + case 460: // replace_client_name_value -#line 226 "dhcp4_parser.yy" // lalr1.cc:636 +#line 227 "dhcp4_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 443 "dhcp4_parser.cc" // lalr1.cc:636 break; @@ -639,30 +639,30 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 151: // "boolean" + case 152: // "boolean" yylhs.value.build< bool > (); break; - case 150: // "floating point" + case 151: // "floating point" yylhs.value.build< double > (); break; - case 149: // "integer" + case 150: // "integer" yylhs.value.build< int64_t > (); break; - case 148: // "constant string" + case 149: // "constant string" yylhs.value.build< std::string > (); break; @@ -684,127 +684,127 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 235 "dhcp4_parser.yy" // lalr1.cc:859 +#line 236 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } #line 690 "dhcp4_parser.cc" // lalr1.cc:859 break; case 4: -#line 236 "dhcp4_parser.yy" // lalr1.cc:859 +#line 237 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } #line 696 "dhcp4_parser.cc" // lalr1.cc:859 break; case 6: -#line 237 "dhcp4_parser.yy" // lalr1.cc:859 +#line 238 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } #line 702 "dhcp4_parser.cc" // lalr1.cc:859 break; case 8: -#line 238 "dhcp4_parser.yy" // lalr1.cc:859 +#line 239 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } #line 708 "dhcp4_parser.cc" // lalr1.cc:859 break; case 10: -#line 239 "dhcp4_parser.yy" // lalr1.cc:859 +#line 240 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET4; } #line 714 "dhcp4_parser.cc" // lalr1.cc:859 break; case 12: -#line 240 "dhcp4_parser.yy" // lalr1.cc:859 +#line 241 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } #line 720 "dhcp4_parser.cc" // lalr1.cc:859 break; case 14: -#line 241 "dhcp4_parser.yy" // lalr1.cc:859 +#line 242 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } #line 726 "dhcp4_parser.cc" // lalr1.cc:859 break; case 16: -#line 242 "dhcp4_parser.yy" // lalr1.cc:859 +#line 243 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP4; } #line 732 "dhcp4_parser.cc" // lalr1.cc:859 break; case 18: -#line 243 "dhcp4_parser.yy" // lalr1.cc:859 +#line 244 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } #line 738 "dhcp4_parser.cc" // lalr1.cc:859 break; case 20: -#line 244 "dhcp4_parser.yy" // lalr1.cc:859 +#line 245 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } #line 744 "dhcp4_parser.cc" // lalr1.cc:859 break; case 22: -#line 245 "dhcp4_parser.yy" // lalr1.cc:859 +#line 246 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } #line 750 "dhcp4_parser.cc" // lalr1.cc:859 break; case 24: -#line 246 "dhcp4_parser.yy" // lalr1.cc:859 +#line 247 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } #line 756 "dhcp4_parser.cc" // lalr1.cc:859 break; case 26: -#line 247 "dhcp4_parser.yy" // lalr1.cc:859 +#line 248 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.LOGGING; } #line 762 "dhcp4_parser.cc" // lalr1.cc:859 break; case 28: -#line 255 "dhcp4_parser.yy" // lalr1.cc:859 +#line 256 "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 768 "dhcp4_parser.cc" // lalr1.cc:859 break; case 29: -#line 256 "dhcp4_parser.yy" // lalr1.cc:859 +#line 257 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } #line 774 "dhcp4_parser.cc" // lalr1.cc:859 break; case 30: -#line 257 "dhcp4_parser.yy" // lalr1.cc:859 +#line 258 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } #line 780 "dhcp4_parser.cc" // lalr1.cc:859 break; case 31: -#line 258 "dhcp4_parser.yy" // lalr1.cc:859 +#line 259 "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 786 "dhcp4_parser.cc" // lalr1.cc:859 break; case 32: -#line 259 "dhcp4_parser.yy" // lalr1.cc:859 +#line 260 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } #line 792 "dhcp4_parser.cc" // lalr1.cc:859 break; case 33: -#line 260 "dhcp4_parser.yy" // lalr1.cc:859 +#line 261 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 798 "dhcp4_parser.cc" // lalr1.cc:859 break; case 34: -#line 261 "dhcp4_parser.yy" // lalr1.cc:859 +#line 262 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 804 "dhcp4_parser.cc" // lalr1.cc:859 break; case 35: -#line 264 "dhcp4_parser.yy" // lalr1.cc:859 +#line 265 "dhcp4_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); @@ -813,7 +813,7 @@ namespace isc { namespace dhcp { break; case 36: -#line 269 "dhcp4_parser.yy" // lalr1.cc:859 +#line 270 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -824,7 +824,7 @@ namespace isc { namespace dhcp { break; case 37: -#line 274 "dhcp4_parser.yy" // lalr1.cc:859 +#line 275 "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 @@ -834,13 +834,13 @@ namespace isc { namespace dhcp { break; case 38: -#line 280 "dhcp4_parser.yy" // lalr1.cc:859 +#line 281 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 840 "dhcp4_parser.cc" // lalr1.cc:859 break; case 41: -#line 287 "dhcp4_parser.yy" // lalr1.cc:859 +#line 288 "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 > ()); @@ -849,7 +849,7 @@ namespace isc { namespace dhcp { break; case 42: -#line 291 "dhcp4_parser.yy" // lalr1.cc:859 +#line 292 "dhcp4_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value @@ -859,7 +859,7 @@ namespace isc { namespace dhcp { break; case 43: -#line 298 "dhcp4_parser.yy" // lalr1.cc:859 +#line 299 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); @@ -868,7 +868,7 @@ namespace isc { namespace dhcp { break; case 44: -#line 301 "dhcp4_parser.yy" // lalr1.cc:859 +#line 302 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } @@ -876,7 +876,7 @@ namespace isc { namespace dhcp { break; case 47: -#line 309 "dhcp4_parser.yy" // lalr1.cc:859 +#line 310 "dhcp4_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -885,7 +885,7 @@ namespace isc { namespace dhcp { break; case 48: -#line 313 "dhcp4_parser.yy" // lalr1.cc:859 +#line 314 "dhcp4_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -894,7 +894,7 @@ namespace isc { namespace dhcp { break; case 49: -#line 320 "dhcp4_parser.yy" // lalr1.cc:859 +#line 321 "dhcp4_parser.yy" // lalr1.cc:859 { // List parsing about to start } @@ -902,7 +902,7 @@ namespace isc { namespace dhcp { break; case 50: -#line 322 "dhcp4_parser.yy" // lalr1.cc:859 +#line 323 "dhcp4_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); @@ -911,7 +911,7 @@ namespace isc { namespace dhcp { break; case 53: -#line 331 "dhcp4_parser.yy" // lalr1.cc:859 +#line 332 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -920,7 +920,7 @@ namespace isc { namespace dhcp { break; case 54: -#line 335 "dhcp4_parser.yy" // lalr1.cc:859 +#line 336 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -929,7 +929,7 @@ namespace isc { namespace dhcp { break; case 55: -#line 346 "dhcp4_parser.yy" // lalr1.cc:859 +#line 347 "dhcp4_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); @@ -940,7 +940,7 @@ namespace isc { namespace dhcp { break; case 56: -#line 356 "dhcp4_parser.yy" // lalr1.cc:859 +#line 357 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -951,7 +951,7 @@ namespace isc { namespace dhcp { break; case 57: -#line 361 "dhcp4_parser.yy" // lalr1.cc:859 +#line 362 "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 @@ -964,7 +964,7 @@ namespace isc { namespace dhcp { break; case 66: -#line 385 "dhcp4_parser.yy" // lalr1.cc:859 +#line 386 "dhcp4_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -977,7 +977,7 @@ namespace isc { namespace dhcp { break; case 67: -#line 392 "dhcp4_parser.yy" // lalr1.cc:859 +#line 393 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); @@ -987,7 +987,7 @@ namespace isc { namespace dhcp { break; case 68: -#line 400 "dhcp4_parser.yy" // lalr1.cc:859 +#line 401 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Dhcp4 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -997,7 +997,7 @@ namespace isc { namespace dhcp { break; case 69: -#line 404 "dhcp4_parser.yy" // lalr1.cc:859 +#line 405 "dhcp4_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed @@ -1005,8 +1005,8 @@ namespace isc { namespace dhcp { #line 1006 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 98: -#line 443 "dhcp4_parser.yy" // lalr1.cc:859 + case 99: +#line 445 "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); @@ -1014,8 +1014,8 @@ namespace isc { namespace dhcp { #line 1015 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 99: -#line 448 "dhcp4_parser.yy" // lalr1.cc:859 + case 100: +#line 450 "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); @@ -1023,8 +1023,8 @@ namespace isc { namespace dhcp { #line 1024 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 100: -#line 453 "dhcp4_parser.yy" // lalr1.cc:859 + case 101: +#line 455 "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); @@ -1032,8 +1032,8 @@ namespace isc { namespace dhcp { #line 1033 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 101: -#line 458 "dhcp4_parser.yy" // lalr1.cc:859 + case 102: +#line 460 "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); @@ -1041,8 +1041,8 @@ namespace isc { namespace dhcp { #line 1042 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 102: -#line 463 "dhcp4_parser.yy" // lalr1.cc:859 + case 103: +#line 465 "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); @@ -1050,8 +1050,8 @@ namespace isc { namespace dhcp { #line 1051 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 103: -#line 468 "dhcp4_parser.yy" // lalr1.cc:859 + case 104: +#line 470 "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); @@ -1059,8 +1059,8 @@ namespace isc { namespace dhcp { #line 1060 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 104: -#line 474 "dhcp4_parser.yy" // lalr1.cc:859 + case 105: +#line 476 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); @@ -1070,8 +1070,8 @@ namespace isc { namespace dhcp { #line 1071 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 105: -#line 479 "dhcp4_parser.yy" // lalr1.cc:859 + case 106: +#line 481 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); @@ -1080,8 +1080,8 @@ namespace isc { namespace dhcp { #line 1081 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 115: -#line 498 "dhcp4_parser.yy" // lalr1.cc:859 + case 116: +#line 500 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1090,8 +1090,8 @@ namespace isc { namespace dhcp { #line 1091 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 116: -#line 502 "dhcp4_parser.yy" // lalr1.cc:859 + case 117: +#line 504 "dhcp4_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed @@ -1099,8 +1099,8 @@ namespace isc { namespace dhcp { #line 1100 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 117: -#line 507 "dhcp4_parser.yy" // lalr1.cc:859 + case 118: +#line 509 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); @@ -1110,8 +1110,8 @@ namespace isc { namespace dhcp { #line 1111 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 118: -#line 512 "dhcp4_parser.yy" // lalr1.cc:859 + case 119: +#line 514 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1119,16 +1119,16 @@ namespace isc { namespace dhcp { #line 1120 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 119: -#line 517 "dhcp4_parser.yy" // lalr1.cc:859 + case 120: +#line 519 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DHCP_SOCKET_TYPE); } #line 1128 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 120: -#line 519 "dhcp4_parser.yy" // lalr1.cc:859 + case 121: +#line 521 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1136,28 +1136,28 @@ namespace isc { namespace dhcp { #line 1137 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 121: -#line 524 "dhcp4_parser.yy" // lalr1.cc:859 + case 122: +#line 526 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); } #line 1143 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 122: -#line 525 "dhcp4_parser.yy" // lalr1.cc:859 + case 123: +#line 527 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); } #line 1149 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 123: -#line 528 "dhcp4_parser.yy" // lalr1.cc:859 + case 124: +#line 530 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.OUTBOUND_INTERFACE); } #line 1157 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 124: -#line 530 "dhcp4_parser.yy" // lalr1.cc:859 + case 125: +#line 532 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); @@ -1165,24 +1165,24 @@ namespace isc { namespace dhcp { #line 1166 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 125: -#line 535 "dhcp4_parser.yy" // lalr1.cc:859 + case 126: +#line 537 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location))); } #line 1174 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 126: -#line 537 "dhcp4_parser.yy" // lalr1.cc:859 + case 127: +#line 539 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location))); } #line 1182 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 127: -#line 541 "dhcp4_parser.yy" // lalr1.cc:859 + case 128: +#line 543 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); @@ -1190,8 +1190,8 @@ namespace isc { namespace dhcp { #line 1191 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 128: -#line 547 "dhcp4_parser.yy" // lalr1.cc:859 + case 129: +#line 549 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); @@ -1201,8 +1201,8 @@ namespace isc { namespace dhcp { #line 1202 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 129: -#line 552 "dhcp4_parser.yy" // lalr1.cc:859 + case 130: +#line 554 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1212,8 +1212,8 @@ namespace isc { namespace dhcp { #line 1213 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 130: -#line 559 "dhcp4_parser.yy" // lalr1.cc:859 + case 131: +#line 561 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); @@ -1223,8 +1223,8 @@ namespace isc { namespace dhcp { #line 1224 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 131: -#line 564 "dhcp4_parser.yy" // lalr1.cc:859 + case 132: +#line 566 "dhcp4_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1234,467 +1234,507 @@ namespace isc { namespace dhcp { #line 1235 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 147: -#line 590 "dhcp4_parser.yy" // lalr1.cc:859 + case 133: +#line 573 "dhcp4_parser.yy" // lalr1.cc:859 + { + ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("hosts-databases", l); + ctx.stack_.push_back(l); + ctx.enter(ctx.HOSTS_DATABASE); +} +#line 1246 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 134: +#line 578 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 1255 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 139: +#line 591 "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 + break; + + case 140: +#line 595 "dhcp4_parser.yy" // lalr1.cc:859 + { + // The type parameter is required + ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 1275 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 156: +#line 620 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1243 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1283 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 148: -#line 592 "dhcp4_parser.yy" // lalr1.cc:859 + case 157: +#line 622 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1252 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1292 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 149: -#line 597 "dhcp4_parser.yy" // lalr1.cc:859 + case 158: +#line 627 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1258 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1298 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 150: -#line 598 "dhcp4_parser.yy" // lalr1.cc:859 + case 159: +#line 628 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1264 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1304 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 151: -#line 599 "dhcp4_parser.yy" // lalr1.cc:859 + case 160: +#line 629 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1270 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1310 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 152: -#line 600 "dhcp4_parser.yy" // lalr1.cc:859 + case 161: +#line 630 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1276 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1316 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 153: -#line 603 "dhcp4_parser.yy" // lalr1.cc:859 + case 162: +#line 633 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1284 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1324 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 154: -#line 605 "dhcp4_parser.yy" // lalr1.cc:859 + case 163: +#line 635 "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 1294 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1334 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 155: -#line 611 "dhcp4_parser.yy" // lalr1.cc:859 + case 164: +#line 641 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1302 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1342 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 156: -#line 613 "dhcp4_parser.yy" // lalr1.cc:859 + case 165: +#line 643 "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 1312 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1352 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 157: -#line 619 "dhcp4_parser.yy" // lalr1.cc:859 + case 166: +#line 649 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1320 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1360 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 158: -#line 621 "dhcp4_parser.yy" // lalr1.cc:859 + case 167: +#line 651 "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 1330 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1370 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 159: -#line 627 "dhcp4_parser.yy" // lalr1.cc:859 + case 168: +#line 657 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1339 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1379 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 160: -#line 632 "dhcp4_parser.yy" // lalr1.cc:859 + case 169: +#line 662 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1347 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1387 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 161: -#line 634 "dhcp4_parser.yy" // lalr1.cc:859 + case 170: +#line 664 "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 1357 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1397 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 162: -#line 640 "dhcp4_parser.yy" // lalr1.cc:859 + case 171: +#line 670 "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 1366 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1406 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 163: -#line 645 "dhcp4_parser.yy" // lalr1.cc:859 + case 172: +#line 675 "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 1375 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1415 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 164: -#line 650 "dhcp4_parser.yy" // lalr1.cc:859 + case 173: +#line 680 "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 1384 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1424 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 165: -#line 655 "dhcp4_parser.yy" // lalr1.cc:859 + case 174: +#line 685 "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("connect-timeout", n); } -#line 1393 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1433 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 166: -#line 660 "dhcp4_parser.yy" // lalr1.cc:859 + case 175: +#line 690 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1401 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1441 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 167: -#line 662 "dhcp4_parser.yy" // lalr1.cc:859 + case 176: +#line 692 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1411 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1451 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 168: -#line 668 "dhcp4_parser.yy" // lalr1.cc:859 + case 177: +#line 698 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1419 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1459 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 169: -#line 670 "dhcp4_parser.yy" // lalr1.cc:859 + case 178: +#line 700 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1429 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1469 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 170: -#line 677 "dhcp4_parser.yy" // lalr1.cc:859 + case 179: +#line 707 "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 1440 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1480 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 171: -#line 682 "dhcp4_parser.yy" // lalr1.cc:859 + case 180: +#line 712 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1449 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1489 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 179: -#line 698 "dhcp4_parser.yy" // lalr1.cc:859 + case 188: +#line 728 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1458 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1498 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 180: -#line 703 "dhcp4_parser.yy" // lalr1.cc:859 + case 189: +#line 733 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1467 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1507 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 181: -#line 708 "dhcp4_parser.yy" // lalr1.cc:859 + case 190: +#line 738 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(circuit); } -#line 1476 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1516 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 182: -#line 713 "dhcp4_parser.yy" // lalr1.cc:859 + case 191: +#line 743 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(client); } -#line 1485 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1525 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 183: -#line 718 "dhcp4_parser.yy" // lalr1.cc:859 + case 192: +#line 748 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1494 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1534 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 184: -#line 723 "dhcp4_parser.yy" // lalr1.cc:859 + case 193: +#line 753 "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 1505 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1545 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 185: -#line 728 "dhcp4_parser.yy" // lalr1.cc:859 + case 194: +#line 758 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1514 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 190: -#line 741 "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 1524 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 191: -#line 745 "dhcp4_parser.yy" // lalr1.cc:859 - { - // The library hooks parameter is required - ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.stack_.pop_back(); -} -#line 1534 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 192: -#line 751 "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 1544 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 193: -#line 755 "dhcp4_parser.yy" // lalr1.cc:859 - { - // The library hooks parameter is required - ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - // parsing completed -} #line 1554 "dhcp4_parser.cc" // lalr1.cc:859 break; case 199: -#line 770 "dhcp4_parser.yy" // lalr1.cc:859 +#line 771 "dhcp4_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); } -#line 1562 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1564 "dhcp4_parser.cc" // lalr1.cc:859 break; case 200: -#line 772 "dhcp4_parser.yy" // lalr1.cc:859 +#line 775 "dhcp4_parser.yy" // lalr1.cc:859 + { + // The library hooks parameter is required + ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 1574 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 201: +#line 781 "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 1584 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 202: +#line 785 "dhcp4_parser.yy" // lalr1.cc:859 + { + // The library hooks parameter is required + ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + // parsing completed +} +#line 1594 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 208: +#line 800 "dhcp4_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 1602 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 209: +#line 802 "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 1572 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1612 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 201: -#line 778 "dhcp4_parser.yy" // lalr1.cc:859 + case 210: +#line 808 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1580 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1620 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 202: -#line 780 "dhcp4_parser.yy" // lalr1.cc:859 + case 211: +#line 810 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1589 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1629 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 203: -#line 786 "dhcp4_parser.yy" // lalr1.cc:859 + case 212: +#line 816 "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.EXPIRED_LEASES_PROCESSING); } -#line 1600 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1640 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 204: -#line 791 "dhcp4_parser.yy" // lalr1.cc:859 + case 213: +#line 821 "dhcp4_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1610 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1650 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 213: -#line 809 "dhcp4_parser.yy" // lalr1.cc:859 + case 222: +#line 839 "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("reclaim-timer-wait-time", value); } -#line 1619 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1659 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 214: -#line 814 "dhcp4_parser.yy" // lalr1.cc:859 + case 223: +#line 844 "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("flush-reclaimed-timer-wait-time", value); } -#line 1628 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1668 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 215: -#line 819 "dhcp4_parser.yy" // lalr1.cc:859 + case 224: +#line 849 "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("hold-reclaimed-time", value); } -#line 1637 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1677 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 216: -#line 824 "dhcp4_parser.yy" // lalr1.cc:859 + case 225: +#line 854 "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("max-reclaim-leases", value); } -#line 1646 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1686 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 217: -#line 829 "dhcp4_parser.yy" // lalr1.cc:859 + case 226: +#line 859 "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("max-reclaim-time", value); } -#line 1655 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1695 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 218: -#line 834 "dhcp4_parser.yy" // lalr1.cc:859 + case 227: +#line 864 "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("unwarned-reclaim-cycles", value); } -#line 1664 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1704 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 219: -#line 842 "dhcp4_parser.yy" // lalr1.cc:859 + case 228: +#line 872 "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 1675 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1715 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 220: -#line 847 "dhcp4_parser.yy" // lalr1.cc:859 + case 229: +#line 877 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1684 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1724 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 225: -#line 867 "dhcp4_parser.yy" // lalr1.cc:859 + case 234: +#line 897 "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 1694 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1734 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 226: -#line 871 "dhcp4_parser.yy" // lalr1.cc:859 + case 235: +#line 901 "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. @@ -1716,317 +1756,317 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1720 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1760 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 227: -#line 893 "dhcp4_parser.yy" // lalr1.cc:859 + case 236: +#line 923 "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 1730 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1770 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 228: -#line 897 "dhcp4_parser.yy" // lalr1.cc:859 + case 237: +#line 927 "dhcp4_parser.yy" // lalr1.cc:859 { // The subnet subnet4 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1740 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1780 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 255: -#line 935 "dhcp4_parser.yy" // lalr1.cc:859 + case 264: +#line 965 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1748 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1788 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 256: -#line 937 "dhcp4_parser.yy" // lalr1.cc:859 + case 265: +#line 967 "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 1758 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1798 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 257: -#line 943 "dhcp4_parser.yy" // lalr1.cc:859 + case 266: +#line 973 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1766 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1806 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 258: -#line 945 "dhcp4_parser.yy" // lalr1.cc:859 + case 267: +#line 975 "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 1776 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1816 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 259: -#line 951 "dhcp4_parser.yy" // lalr1.cc:859 + case 268: +#line 981 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1784 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1824 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 260: -#line 953 "dhcp4_parser.yy" // lalr1.cc:859 + case 269: +#line 983 "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 1794 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1834 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 261: -#line 959 "dhcp4_parser.yy" // lalr1.cc:859 + case 270: +#line 989 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1802 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1842 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 262: -#line 961 "dhcp4_parser.yy" // lalr1.cc:859 + case 271: +#line 991 "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 1812 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1852 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 263: -#line 967 "dhcp4_parser.yy" // lalr1.cc:859 + case 272: +#line 997 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1820 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1860 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 264: -#line 969 "dhcp4_parser.yy" // lalr1.cc:859 + case 273: +#line 999 "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 1830 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1870 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 265: -#line 975 "dhcp4_parser.yy" // lalr1.cc:859 + case 274: +#line 1005 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1838 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1878 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 266: -#line 977 "dhcp4_parser.yy" // lalr1.cc:859 + case 275: +#line 1007 "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 1848 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1888 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 267: -#line 983 "dhcp4_parser.yy" // lalr1.cc:859 + case 276: +#line 1013 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.CLIENT_CLASS); } -#line 1856 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1896 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 268: -#line 985 "dhcp4_parser.yy" // lalr1.cc:859 + case 277: +#line 1015 "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 1866 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1906 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 269: -#line 991 "dhcp4_parser.yy" // lalr1.cc:859 + case 278: +#line 1021 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1874 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1914 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 270: -#line 993 "dhcp4_parser.yy" // lalr1.cc:859 + case 279: +#line 1023 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1883 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1923 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 271: -#line 998 "dhcp4_parser.yy" // lalr1.cc:859 + case 280: +#line 1028 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1889 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1929 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 272: -#line 999 "dhcp4_parser.yy" // lalr1.cc:859 + case 281: +#line 1029 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1895 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1935 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 273: -#line 1000 "dhcp4_parser.yy" // lalr1.cc:859 + case 282: +#line 1030 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1901 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1941 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 274: -#line 1003 "dhcp4_parser.yy" // lalr1.cc:859 + case 283: +#line 1033 "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 1910 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1950 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 275: -#line 1008 "dhcp4_parser.yy" // lalr1.cc:859 + case 284: +#line 1038 "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 1919 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1959 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 276: -#line 1015 "dhcp4_parser.yy" // lalr1.cc:859 + case 285: +#line 1045 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1930 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1970 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 277: -#line 1020 "dhcp4_parser.yy" // lalr1.cc:859 + case 286: +#line 1050 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1939 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1979 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 282: -#line 1035 "dhcp4_parser.yy" // lalr1.cc:859 + case 291: +#line 1065 "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 1949 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1989 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 283: -#line 1039 "dhcp4_parser.yy" // lalr1.cc:859 + case 292: +#line 1069 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1957 "dhcp4_parser.cc" // lalr1.cc:859 +#line 1997 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 303: -#line 1070 "dhcp4_parser.yy" // lalr1.cc:859 + case 312: +#line 1100 "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 1968 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2008 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 304: -#line 1075 "dhcp4_parser.yy" // lalr1.cc:859 + case 313: +#line 1105 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1977 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2017 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 305: -#line 1083 "dhcp4_parser.yy" // lalr1.cc:859 + case 314: +#line 1113 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1986 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 306: -#line 1086 "dhcp4_parser.yy" // lalr1.cc:859 - { - // parsing completed -} -#line 1994 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 311: -#line 1102 "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 2004 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 312: -#line 1106 "dhcp4_parser.yy" // lalr1.cc:859 - { - // The name, code and type option def parameters are required. - ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.stack_.pop_back(); -} -#line 2016 "dhcp4_parser.cc" // lalr1.cc:859 - break; - - case 313: -#line 1117 "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 2026 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 314: -#line 1121 "dhcp4_parser.yy" // lalr1.cc:859 + case 315: +#line 1116 "dhcp4_parser.yy" // lalr1.cc:859 + { + // parsing completed +} +#line 2034 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 320: +#line 1132 "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 2044 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 321: +#line 1136 "dhcp4_parser.yy" // lalr1.cc:859 + { + // The name, code and type option def parameters are required. + ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 2056 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 322: +#line 1147 "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 2066 "dhcp4_parser.cc" // lalr1.cc:859 + break; + + case 323: +#line 1151 "dhcp4_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2034,281 +2074,281 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2038 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2078 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 330: -#line 1153 "dhcp4_parser.yy" // lalr1.cc:859 + case 339: +#line 1183 "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 2047 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2087 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 332: -#line 1160 "dhcp4_parser.yy" // lalr1.cc:859 + case 341: +#line 1190 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2055 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2095 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 333: -#line 1162 "dhcp4_parser.yy" // lalr1.cc:859 + case 342: +#line 1192 "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 2065 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2105 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 334: -#line 1168 "dhcp4_parser.yy" // lalr1.cc:859 + case 343: +#line 1198 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2073 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2113 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 335: -#line 1170 "dhcp4_parser.yy" // lalr1.cc:859 + case 344: +#line 1200 "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 2083 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2123 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 336: -#line 1176 "dhcp4_parser.yy" // lalr1.cc:859 + case 345: +#line 1206 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2091 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2131 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 337: -#line 1178 "dhcp4_parser.yy" // lalr1.cc:859 + case 346: +#line 1208 "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 2101 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2141 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 339: -#line 1186 "dhcp4_parser.yy" // lalr1.cc:859 + case 348: +#line 1216 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2109 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2149 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 340: -#line 1188 "dhcp4_parser.yy" // lalr1.cc:859 + case 349: +#line 1218 "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 2119 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2159 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 341: -#line 1194 "dhcp4_parser.yy" // lalr1.cc:859 + case 350: +#line 1224 "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 2128 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2168 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 342: -#line 1203 "dhcp4_parser.yy" // lalr1.cc:859 + case 351: +#line 1233 "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 2139 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2179 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 343: -#line 1208 "dhcp4_parser.yy" // lalr1.cc:859 + case 352: +#line 1238 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2148 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2188 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 348: -#line 1227 "dhcp4_parser.yy" // lalr1.cc:859 + case 357: +#line 1257 "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 2158 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2198 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 349: -#line 1231 "dhcp4_parser.yy" // lalr1.cc:859 + case 358: +#line 1261 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2167 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2207 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 350: -#line 1239 "dhcp4_parser.yy" // lalr1.cc:859 + case 359: +#line 1269 "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 2177 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2217 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 351: -#line 1243 "dhcp4_parser.yy" // lalr1.cc:859 + case 360: +#line 1273 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2186 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2226 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 366: -#line 1276 "dhcp4_parser.yy" // lalr1.cc:859 + case 375: +#line 1306 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2194 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2234 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 367: -#line 1278 "dhcp4_parser.yy" // lalr1.cc:859 + case 376: +#line 1308 "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 2204 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2244 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 370: -#line 1288 "dhcp4_parser.yy" // lalr1.cc:859 + case 379: +#line 1318 "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 2213 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2253 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 371: -#line 1293 "dhcp4_parser.yy" // lalr1.cc:859 + case 380: +#line 1323 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2222 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2262 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 372: -#line 1301 "dhcp4_parser.yy" // lalr1.cc:859 + case 381: +#line 1331 "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 2233 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2273 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 373: -#line 1306 "dhcp4_parser.yy" // lalr1.cc:859 + case 382: +#line 1336 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2242 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2282 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1321 "dhcp4_parser.yy" // lalr1.cc:859 + case 387: +#line 1351 "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 2252 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2292 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1325 "dhcp4_parser.yy" // lalr1.cc:859 + case 388: +#line 1355 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2262 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2302 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 380: -#line 1331 "dhcp4_parser.yy" // lalr1.cc:859 + case 389: +#line 1361 "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 2272 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2312 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 381: -#line 1335 "dhcp4_parser.yy" // lalr1.cc:859 + case 390: +#line 1365 "dhcp4_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2282 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2322 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 390: -#line 1353 "dhcp4_parser.yy" // lalr1.cc:859 + case 399: +#line 1383 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2290 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2330 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 391: -#line 1355 "dhcp4_parser.yy" // lalr1.cc:859 + case 400: +#line 1385 "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 2300 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2340 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 392: -#line 1361 "dhcp4_parser.yy" // lalr1.cc:859 + case 401: +#line 1391 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2308 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2348 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 393: -#line 1363 "dhcp4_parser.yy" // lalr1.cc:859 + case 402: +#line 1393 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as< ElementPtr > (); @@ -2331,19 +2371,19 @@ namespace isc { namespace dhcp { parent->set("user-context", user_context); ctx.leave(); } -#line 2335 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2375 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 394: -#line 1386 "dhcp4_parser.yy" // lalr1.cc:859 + case 403: +#line 1416 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2343 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2383 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 395: -#line 1388 "dhcp4_parser.yy" // lalr1.cc:859 + case 404: +#line 1418 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -2368,949 +2408,949 @@ namespace isc { namespace dhcp { parent->set("user-context", user_context); ctx.leave(); } -#line 2372 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2412 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 396: -#line 1416 "dhcp4_parser.yy" // lalr1.cc:859 + case 405: +#line 1446 "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 2383 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2423 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 397: -#line 1421 "dhcp4_parser.yy" // lalr1.cc:859 + case 406: +#line 1451 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2392 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2432 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1434 "dhcp4_parser.yy" // lalr1.cc:859 + case 411: +#line 1464 "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 2402 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2442 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1438 "dhcp4_parser.yy" // lalr1.cc:859 + case 412: +#line 1468 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2411 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2451 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 404: -#line 1443 "dhcp4_parser.yy" // lalr1.cc:859 + case 413: +#line 1473 "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 2421 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2461 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 405: -#line 1447 "dhcp4_parser.yy" // lalr1.cc:859 + case 414: +#line 1477 "dhcp4_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2430 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2470 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 425: -#line 1478 "dhcp4_parser.yy" // lalr1.cc:859 + case 434: +#line 1508 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2438 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2478 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 426: -#line 1480 "dhcp4_parser.yy" // lalr1.cc:859 + case 435: +#line 1510 "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 2448 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2488 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 427: -#line 1486 "dhcp4_parser.yy" // lalr1.cc:859 + case 436: +#line 1516 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2456 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2496 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 428: -#line 1488 "dhcp4_parser.yy" // lalr1.cc:859 + case 437: +#line 1518 "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 2466 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2506 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 429: -#line 1494 "dhcp4_parser.yy" // lalr1.cc:859 + case 438: +#line 1524 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2474 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2514 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 430: -#line 1496 "dhcp4_parser.yy" // lalr1.cc:859 + case 439: +#line 1526 "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 2484 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2524 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 431: -#line 1502 "dhcp4_parser.yy" // lalr1.cc:859 + case 440: +#line 1532 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2492 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2532 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 432: -#line 1504 "dhcp4_parser.yy" // lalr1.cc:859 + case 441: +#line 1534 "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 2502 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2542 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1510 "dhcp4_parser.yy" // lalr1.cc:859 + case 442: +#line 1540 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2510 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2550 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1512 "dhcp4_parser.yy" // lalr1.cc:859 + case 443: +#line 1542 "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 2520 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2560 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1518 "dhcp4_parser.yy" // lalr1.cc:859 + case 444: +#line 1548 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2528 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2568 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1520 "dhcp4_parser.yy" // lalr1.cc:859 + case 445: +#line 1550 "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 2538 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2578 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1526 "dhcp4_parser.yy" // lalr1.cc:859 + case 446: +#line 1556 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2546 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2586 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1528 "dhcp4_parser.yy" // lalr1.cc:859 + case 447: +#line 1558 "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 2556 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2596 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1534 "dhcp4_parser.yy" // lalr1.cc:859 + case 448: +#line 1564 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2564 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2604 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1536 "dhcp4_parser.yy" // lalr1.cc:859 + case 449: +#line 1566 "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 2574 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2614 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1542 "dhcp4_parser.yy" // lalr1.cc:859 + case 450: +#line 1572 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2582 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2622 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1544 "dhcp4_parser.yy" // lalr1.cc:859 + case 451: +#line 1574 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2592 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2632 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1550 "dhcp4_parser.yy" // lalr1.cc:859 + case 452: +#line 1580 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2600 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2640 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1552 "dhcp4_parser.yy" // lalr1.cc:859 + case 453: +#line 1582 "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 2610 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2650 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 445: -#line 1558 "dhcp4_parser.yy" // lalr1.cc:859 + case 454: +#line 1588 "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 2621 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2661 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1563 "dhcp4_parser.yy" // lalr1.cc:859 + case 455: +#line 1593 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2630 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2670 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1571 "dhcp4_parser.yy" // lalr1.cc:859 + case 456: +#line 1601 "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 2641 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2681 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1576 "dhcp4_parser.yy" // lalr1.cc:859 + case 457: +#line 1606 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2650 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2690 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 449: -#line 1581 "dhcp4_parser.yy" // lalr1.cc:859 + case 458: +#line 1611 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2658 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2698 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 450: -#line 1583 "dhcp4_parser.yy" // lalr1.cc:859 + case 459: +#line 1613 "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 2668 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2708 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 451: -#line 1592 "dhcp4_parser.yy" // lalr1.cc:859 + case 460: +#line 1622 "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 2679 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2719 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 452: -#line 1597 "dhcp4_parser.yy" // lalr1.cc:859 + case 461: +#line 1627 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2688 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2728 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 455: -#line 1606 "dhcp4_parser.yy" // lalr1.cc:859 + case 464: +#line 1636 "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 2698 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2738 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 456: -#line 1610 "dhcp4_parser.yy" // lalr1.cc:859 + case 465: +#line 1640 "dhcp4_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2708 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2748 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 472: -#line 1638 "dhcp4_parser.yy" // lalr1.cc:859 + case 481: +#line 1668 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2716 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2756 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 473: -#line 1640 "dhcp4_parser.yy" // lalr1.cc:859 + case 482: +#line 1670 "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 2726 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2766 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 474: -#line 1650 "dhcp4_parser.yy" // lalr1.cc:859 + case 483: +#line 1680 "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 2735 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2775 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 475: -#line 1657 "dhcp4_parser.yy" // lalr1.cc:859 + case 484: +#line 1687 "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 2746 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2786 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 476: -#line 1662 "dhcp4_parser.yy" // lalr1.cc:859 + case 485: +#line 1692 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2755 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2795 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 484: -#line 1678 "dhcp4_parser.yy" // lalr1.cc:859 + case 493: +#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2763 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2803 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 485: -#line 1680 "dhcp4_parser.yy" // lalr1.cc:859 + case 494: +#line 1710 "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 2773 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2813 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 486: -#line 1686 "dhcp4_parser.yy" // lalr1.cc:859 + case 495: +#line 1716 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2781 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2821 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 487: -#line 1688 "dhcp4_parser.yy" // lalr1.cc:859 + case 496: +#line 1718 "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 2791 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2831 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 488: -#line 1696 "dhcp4_parser.yy" // lalr1.cc:859 + case 497: +#line 1726 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2802 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2842 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 489: -#line 1701 "dhcp4_parser.yy" // lalr1.cc:859 + case 498: +#line 1731 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2813 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2853 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 490: -#line 1708 "dhcp4_parser.yy" // lalr1.cc:859 + case 499: +#line 1738 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2823 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2863 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 491: -#line 1712 "dhcp4_parser.yy" // lalr1.cc:859 + case 500: +#line 1742 "dhcp4_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2833 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2873 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 511: -#line 1741 "dhcp4_parser.yy" // lalr1.cc:859 + case 520: +#line 1771 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2842 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2882 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 512: -#line 1746 "dhcp4_parser.yy" // lalr1.cc:859 + case 521: +#line 1776 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2850 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2890 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 513: -#line 1748 "dhcp4_parser.yy" // lalr1.cc:859 + case 522: +#line 1778 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2860 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2900 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 514: -#line 1754 "dhcp4_parser.yy" // lalr1.cc:859 + case 523: +#line 1784 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2868 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2908 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 515: -#line 1756 "dhcp4_parser.yy" // lalr1.cc:859 + case 524: +#line 1786 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2878 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2918 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 516: -#line 1762 "dhcp4_parser.yy" // lalr1.cc:859 + case 525: +#line 1792 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2887 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2927 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 517: -#line 1767 "dhcp4_parser.yy" // lalr1.cc:859 + case 526: +#line 1797 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2895 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2935 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 518: -#line 1769 "dhcp4_parser.yy" // lalr1.cc:859 + case 527: +#line 1799 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2905 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2945 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 519: -#line 1775 "dhcp4_parser.yy" // lalr1.cc:859 + case 528: +#line 1805 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2914 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2954 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 520: -#line 1780 "dhcp4_parser.yy" // lalr1.cc:859 + case 529: +#line 1810 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2923 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2963 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 521: -#line 1785 "dhcp4_parser.yy" // lalr1.cc:859 + case 530: +#line 1815 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } -#line 2931 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2971 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 522: -#line 1787 "dhcp4_parser.yy" // lalr1.cc:859 + case 531: +#line 1817 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 2940 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2980 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 523: -#line 1793 "dhcp4_parser.yy" // lalr1.cc:859 + case 532: +#line 1823 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 2946 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2986 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 524: -#line 1794 "dhcp4_parser.yy" // lalr1.cc:859 + case 533: +#line 1824 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 2952 "dhcp4_parser.cc" // lalr1.cc:859 +#line 2992 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 525: -#line 1797 "dhcp4_parser.yy" // lalr1.cc:859 + case 534: +#line 1827 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } -#line 2960 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3000 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 526: -#line 1799 "dhcp4_parser.yy" // lalr1.cc:859 + case 535: +#line 1829 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 2970 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3010 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 527: -#line 1805 "dhcp4_parser.yy" // lalr1.cc:859 + case 536: +#line 1835 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 2979 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3019 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 528: -#line 1810 "dhcp4_parser.yy" // lalr1.cc:859 + case 537: +#line 1840 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 2988 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3028 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 529: -#line 1815 "dhcp4_parser.yy" // lalr1.cc:859 + case 538: +#line 1845 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 2997 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3037 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1820 "dhcp4_parser.yy" // lalr1.cc:859 + case 539: +#line 1850 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3005 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3045 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1822 "dhcp4_parser.yy" // lalr1.cc:859 + case 540: +#line 1852 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3014 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3054 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1828 "dhcp4_parser.yy" // lalr1.cc:859 + case 541: +#line 1858 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3022 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3062 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1831 "dhcp4_parser.yy" // lalr1.cc:859 + case 542: +#line 1861 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3030 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3070 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1834 "dhcp4_parser.yy" // lalr1.cc:859 + case 543: +#line 1864 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3038 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3078 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1837 "dhcp4_parser.yy" // lalr1.cc:859 + case 544: +#line 1867 "dhcp4_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3046 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3086 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1840 "dhcp4_parser.yy" // lalr1.cc:859 + case 545: +#line 1870 "dhcp4_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3055 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3095 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1846 "dhcp4_parser.yy" // lalr1.cc:859 + case 546: +#line 1876 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3063 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3103 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1848 "dhcp4_parser.yy" // lalr1.cc:859 + case 547: +#line 1878 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3073 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3113 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1856 "dhcp4_parser.yy" // lalr1.cc:859 + case 548: +#line 1886 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3081 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3121 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1858 "dhcp4_parser.yy" // lalr1.cc:859 + case 549: +#line 1888 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3090 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3130 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1863 "dhcp4_parser.yy" // lalr1.cc:859 + case 550: +#line 1893 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3098 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3138 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1865 "dhcp4_parser.yy" // lalr1.cc:859 + case 551: +#line 1895 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3107 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3147 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1870 "dhcp4_parser.yy" // lalr1.cc:859 + case 552: +#line 1900 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3115 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3155 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1872 "dhcp4_parser.yy" // lalr1.cc:859 + case 553: +#line 1902 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3124 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3164 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1882 "dhcp4_parser.yy" // lalr1.cc:859 + case 554: +#line 1912 "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 3135 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3175 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1887 "dhcp4_parser.yy" // lalr1.cc:859 + case 555: +#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3144 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3184 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1892 "dhcp4_parser.yy" // lalr1.cc:859 + case 556: +#line 1922 "dhcp4_parser.yy" // lalr1.cc:859 { // Parse the Logging map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 3154 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3194 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 548: -#line 1896 "dhcp4_parser.yy" // lalr1.cc:859 + case 557: +#line 1926 "dhcp4_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 3162 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3202 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1912 "dhcp4_parser.yy" // lalr1.cc:859 + case 561: +#line 1942 "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 3173 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3213 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1917 "dhcp4_parser.yy" // lalr1.cc:859 + case 562: +#line 1947 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3182 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3222 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1929 "dhcp4_parser.yy" // lalr1.cc:859 + case 565: +#line 1959 "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 3192 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3232 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 557: -#line 1933 "dhcp4_parser.yy" // lalr1.cc:859 + case 566: +#line 1963 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3200 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3240 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1950 "dhcp4_parser.yy" // lalr1.cc:859 + case 576: +#line 1980 "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 3209 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3249 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 568: -#line 1955 "dhcp4_parser.yy" // lalr1.cc:859 + case 577: +#line 1985 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3217 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3257 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 569: -#line 1957 "dhcp4_parser.yy" // lalr1.cc:859 + case 578: +#line 1987 "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 3227 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3267 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 570: -#line 1963 "dhcp4_parser.yy" // lalr1.cc:859 + case 579: +#line 1993 "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 3238 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3278 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 571: -#line 1968 "dhcp4_parser.yy" // lalr1.cc:859 + case 580: +#line 1998 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3247 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3287 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 574: -#line 1977 "dhcp4_parser.yy" // lalr1.cc:859 + case 583: +#line 2007 "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 3257 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3297 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 575: -#line 1981 "dhcp4_parser.yy" // lalr1.cc:859 + case 584: +#line 2011 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3265 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3305 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 582: -#line 1995 "dhcp4_parser.yy" // lalr1.cc:859 + case 591: +#line 2025 "dhcp4_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3273 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3313 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 583: -#line 1997 "dhcp4_parser.yy" // lalr1.cc:859 + case 592: +#line 2027 "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 3283 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3323 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 584: -#line 2003 "dhcp4_parser.yy" // lalr1.cc:859 + case 593: +#line 2033 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3292 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3332 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 585: -#line 2008 "dhcp4_parser.yy" // lalr1.cc:859 + case 594: +#line 2038 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3301 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3341 "dhcp4_parser.cc" // lalr1.cc:859 break; - case 586: -#line 2013 "dhcp4_parser.yy" // lalr1.cc:859 + case 595: +#line 2043 "dhcp4_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3310 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3350 "dhcp4_parser.cc" // lalr1.cc:859 break; -#line 3314 "dhcp4_parser.cc" // lalr1.cc:859 +#line 3354 "dhcp4_parser.cc" // lalr1.cc:859 default: break; } @@ -3565,107 +3605,109 @@ namespace isc { namespace dhcp { } - const short int Dhcp4Parser::yypact_ninf_ = -722; + const short int Dhcp4Parser::yypact_ninf_ = -737; const signed char Dhcp4Parser::yytable_ninf_ = -1; const short int Dhcp4Parser::yypact_[] = { - 284, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, 41, 19, 24, 50, 60, 92, - 102, 118, 129, 138, 148, 150, 159, 171, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, 19, -93, 8, 62, 31, 151, - -2, 228, 147, 236, 37, -24, 344, 27, -722, 184, - 204, 207, 200, 235, -722, -722, -722, -722, -722, 219, - -722, 48, -722, -722, -722, -722, -722, -722, -722, 227, - 241, -722, -722, -722, -722, -722, 244, 261, 276, 279, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - 283, -722, -722, -722, 56, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, 285, -722, 69, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, 301, 302, -722, -722, -722, -722, -722, -722, -722, - -722, -722, 95, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, 136, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, 231, 255, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, 299, -722, - -722, 314, -722, -722, -722, 315, -722, -722, 325, 332, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, 334, 336, -722, -722, -722, -722, 328, - 339, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, 140, -722, -722, -722, 341, -722, -722, - 343, -722, 350, 351, -722, -722, 352, 353, 355, -722, - -722, -722, -722, -722, 144, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, 146, -722, -722, -722, 19, 19, -722, 216, 363, - 367, 370, 371, 375, -722, 8, -722, 377, 197, 234, - 383, 384, 390, 391, 406, 221, 262, 263, 264, 410, - 411, 412, 413, 428, 429, 430, 431, 432, 433, 289, - 435, 436, 62, -722, 437, 438, 439, 293, 31, -722, - 441, 442, 457, 458, 460, 461, 462, 318, 317, 465, - 468, 470, 471, 151, -722, 472, -2, -722, 475, 476, - 477, 479, 480, 482, 483, 484, -722, 228, -722, 485, - 489, 345, 491, 492, 493, 347, -722, 236, 495, 349, - 356, -722, 37, 497, 500, -9, -722, 357, 502, 505, - 361, 507, 364, 368, 508, 511, 365, 369, 373, 514, - 515, 344, -722, 517, 27, -722, -722, -722, 521, 519, - 520, 19, 19, 19, -722, 522, -722, -722, 380, 382, - 385, 524, 525, -722, -722, -722, -722, 529, 530, 531, - 532, 533, 393, 534, 537, 538, 539, -722, 540, 541, - -722, 544, 96, 170, -722, -722, 396, 397, 402, 546, - 404, 405, 407, -722, -722, 254, 408, 549, 550, -722, - 414, -722, 544, 415, 416, 417, 418, 419, 420, 421, - -722, 422, 423, -722, 424, 425, 426, -722, -722, 427, - -722, -722, -722, 434, 19, -722, -722, 440, 443, -722, - 444, -722, -722, 15, 459, -722, -722, -722, 135, 445, - -722, 553, -722, 19, 62, 27, -722, -722, -722, 31, - -722, -722, -722, 366, 366, 552, 554, 569, 571, -722, - -722, -722, 101, 572, 573, 25, 14, 344, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, 574, - -722, -722, -722, -722, -722, -722, -722, -722, 576, 451, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, 577, -722, 155, 193, 206, -722, -722, -722, -722, - 556, 581, 582, 583, 585, -722, -722, -722, 224, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, 232, -722, 584, 591, -722, -722, 589, 593, - -722, -722, 592, 594, -722, -722, 595, 596, -722, -722, - -722, -722, -722, -722, 26, -722, -722, -722, -722, -722, - -722, -722, 68, -722, -722, 597, 599, -722, 600, 601, - 602, 603, 604, 605, 233, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, 256, -722, -722, - -722, 258, 452, -722, 606, 607, -722, -722, 608, 610, - -722, -722, 609, -722, 94, -722, -722, -722, -722, 611, - 612, 614, 615, 473, 469, 474, 478, 481, 617, 620, - 366, -722, -722, 151, -722, 552, 236, -722, 554, 37, - -722, 569, 182, -722, 571, 101, -722, 220, 572, -722, - -24, -722, 573, 486, 487, 488, 490, 494, 496, 25, - -722, 621, 622, 14, -722, -722, -722, 625, 624, -2, - -722, 574, 228, -722, 576, 628, -722, 64, 577, -722, - 294, 463, 498, 499, -722, -722, -722, -722, -722, 501, - 503, -722, 259, -722, 626, -722, 630, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, 270, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, 632, - 638, -722, -722, -722, -722, 273, -722, -722, -722, -722, - -722, -722, -722, -722, 504, 506, -722, -722, 510, 274, - -722, 634, -722, 512, -722, 629, -722, -722, -722, -722, - -722, 295, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - 182, -722, 640, -722, 220, -722, -722, -722, -722, -722, - -722, -722, 644, 513, 646, 64, -722, -722, 527, -722, - 623, -722, 535, -722, -722, 648, -722, -722, 174, -722, - 4, 648, -722, -722, 649, 652, 655, 313, -722, -722, - -722, -722, -722, -722, 657, 543, 516, 523, 4, -722, - 542, -722, -722, -722, -722, -722 + 374, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, 45, 19, 40, 64, 82, 104, + 105, 106, 117, 127, 139, 143, 153, 154, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, 19, -100, 31, 33, 74, 165, + 42, 173, 126, 92, 253, 14, 313, 58, -737, 186, + 191, 208, 210, 213, -737, -737, -737, -737, -737, 222, + -737, 61, -737, -737, -737, -737, -737, -737, -737, 236, + 249, -737, -737, -737, -737, -737, -737, 256, 262, 268, + 281, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, 282, -737, -737, -737, 62, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, 296, -737, 80, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, 300, 308, -737, -737, -737, -737, -737, + -737, -737, -737, -737, 134, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, 146, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, 305, 312, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + 319, -737, -737, 324, -737, -737, -737, 327, -737, -737, + 325, 333, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, 334, 335, -737, -737, -737, + -737, 337, 338, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, 164, -737, -737, -737, 339, + -737, -737, 346, -737, 347, 353, -737, -737, 354, 355, + 358, -737, -737, -737, -737, -737, 182, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, 190, -737, -737, -737, 19, 19, -737, + 167, 360, 363, 370, 371, 373, -737, 31, -737, 378, + 232, 233, 383, 388, 390, 391, 392, 394, 192, 251, + 255, 264, 395, 402, 411, 412, 427, 431, 433, 434, + 435, 436, 297, 439, 440, 33, -737, 441, 442, 444, + 298, 74, -737, 445, 447, 448, 449, 452, 454, 455, + 310, 311, 460, 461, 462, 463, 165, -737, 465, 42, + -737, 466, 467, 469, 470, 471, 474, 475, 476, -737, + 173, -737, 478, 479, 336, 480, 481, 483, 340, -737, + 92, 484, 342, 345, -737, 253, 486, 487, -9, -737, + 349, 489, 494, 352, 495, 356, 375, 499, 500, 372, + 377, 379, 501, 519, 313, -737, 522, 58, -737, -737, + -737, 526, 525, 527, 19, 19, 19, -737, 528, -737, + -737, 384, 387, 393, 530, 532, 535, -737, -737, -737, + -737, 536, 538, 539, 540, 541, 397, 542, 544, 545, + 546, -737, 547, 548, -737, 551, 15, 79, -737, -737, + 403, 408, 409, 554, 413, 414, 415, -737, -737, -12, + 416, 555, 559, -737, 418, -737, 551, 419, 420, 421, + 422, 423, 424, 425, -737, 426, 428, -737, 429, 430, + 432, -737, -737, 437, -737, -737, -737, 438, 19, -737, + -737, 443, 446, -737, 450, -737, -737, 23, 457, -737, + -737, -737, 99, 451, -737, 556, -737, 19, 33, 58, + -737, -737, -737, 74, -737, -737, -737, 242, 242, 573, + 575, 576, 577, 578, -737, -737, -737, 181, 581, 582, + 107, 26, 313, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, 583, -737, -737, -737, -737, -737, + -737, -737, -737, 584, 505, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, 587, -737, 203, 221, + 239, -737, -737, -737, -737, 592, 593, 594, 597, 598, + -737, -737, -737, 240, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, 265, -737, 599, + 600, -737, -737, 601, 603, -737, -737, 602, 606, -737, + -737, 604, 608, -737, -737, 607, 609, -737, -737, -737, + -737, -737, -737, 120, -737, -737, -737, -737, -737, -737, + -737, 132, -737, -737, 610, 611, -737, 613, 614, 615, + 616, 617, 618, 266, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, 284, -737, -737, -737, + 285, 477, -737, 619, 612, -737, -737, 621, 620, -737, + -737, 543, -737, 178, -737, -737, -737, -737, 624, 625, + 626, 627, 482, 472, 485, 488, 491, 629, 630, 242, + -737, -737, 242, -737, 573, 165, -737, 575, 92, -737, + 576, 253, -737, 577, 389, -737, 578, 181, -737, 78, + 581, -737, 14, -737, 582, 492, 493, 496, 497, 498, + 502, 107, -737, 632, 633, 26, -737, -737, -737, 638, + 635, 42, -737, 583, 173, -737, 584, 641, -737, 50, + 587, -737, 341, 490, 504, 506, -737, -737, -737, -737, + -737, 507, 508, -737, 286, -737, 293, -737, 596, -737, + 642, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, 294, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, 643, 646, -737, -737, -737, -737, 295, + -737, -737, -737, -737, -737, -737, -737, -737, 509, 510, + -737, -737, 511, 318, -737, 653, -737, 513, -737, 650, + -737, -737, -737, -737, -737, 321, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, 389, -737, 659, -737, 78, + -737, -737, -737, -737, -737, -737, -737, 660, 515, 662, + 50, -737, -737, 518, -737, 663, -737, 520, -737, -737, + 664, -737, -737, 243, -737, -13, 664, -737, -737, 666, + 668, 669, 322, -737, -737, -737, -737, -737, -737, 670, + 523, 531, 534, -13, -737, 529, -737, -737, -737, -737, + -737 }; const unsigned short int @@ -3675,525 +3717,536 @@ namespace isc { namespace dhcp { 20, 22, 24, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 43, 36, 32, 31, 28, 29, 30, 35, 3, 33, 34, - 56, 5, 68, 7, 115, 9, 227, 11, 380, 13, - 404, 15, 305, 17, 313, 19, 350, 21, 192, 23, - 490, 25, 547, 27, 45, 39, 0, 0, 0, 0, - 0, 406, 0, 315, 352, 0, 0, 0, 47, 0, - 46, 0, 0, 40, 66, 545, 539, 541, 543, 0, - 65, 0, 58, 60, 62, 63, 64, 61, 104, 0, - 0, 425, 427, 429, 128, 130, 0, 0, 0, 0, - 219, 303, 342, 276, 392, 394, 170, 451, 184, 203, - 0, 475, 488, 97, 0, 70, 72, 73, 74, 75, - 90, 91, 78, 79, 80, 81, 85, 86, 76, 77, - 83, 84, 95, 96, 92, 93, 94, 82, 87, 88, - 89, 117, 119, 123, 0, 114, 0, 106, 108, 109, - 110, 111, 112, 113, 257, 259, 261, 372, 255, 263, - 265, 0, 0, 269, 267, 396, 447, 254, 231, 232, - 233, 245, 0, 229, 236, 249, 250, 251, 237, 238, - 241, 243, 239, 240, 234, 235, 252, 253, 242, 246, - 247, 248, 244, 390, 389, 386, 385, 0, 382, 384, - 387, 388, 445, 433, 435, 439, 437, 443, 441, 431, - 424, 418, 422, 423, 0, 407, 408, 419, 420, 421, - 415, 410, 416, 412, 413, 414, 417, 411, 0, 332, - 160, 0, 336, 334, 339, 0, 328, 329, 0, 316, - 317, 319, 331, 320, 321, 322, 338, 323, 324, 325, - 326, 327, 366, 0, 0, 364, 365, 368, 369, 0, - 353, 354, 356, 357, 358, 359, 360, 361, 362, 363, - 199, 201, 196, 0, 194, 197, 198, 0, 512, 514, - 0, 517, 0, 0, 521, 525, 0, 0, 0, 530, - 537, 510, 508, 509, 0, 492, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 552, 0, 549, 551, 44, 0, 0, 37, 0, 0, - 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, + 56, 5, 68, 7, 116, 9, 236, 11, 389, 13, + 413, 15, 314, 17, 322, 19, 359, 21, 201, 23, + 499, 25, 556, 27, 45, 39, 0, 0, 0, 0, + 0, 415, 0, 324, 361, 0, 0, 0, 47, 0, + 46, 0, 0, 40, 66, 554, 548, 550, 552, 0, + 65, 0, 58, 60, 62, 63, 64, 61, 105, 0, + 0, 434, 436, 438, 129, 131, 133, 0, 0, 0, + 0, 228, 312, 351, 285, 401, 403, 179, 460, 193, + 212, 0, 484, 497, 98, 0, 70, 72, 73, 74, + 75, 91, 92, 78, 79, 80, 81, 82, 86, 87, + 76, 77, 84, 85, 96, 97, 93, 94, 95, 83, + 88, 89, 90, 118, 120, 124, 0, 115, 0, 107, + 109, 110, 111, 112, 113, 114, 266, 268, 270, 381, + 264, 272, 274, 0, 0, 278, 276, 405, 456, 263, + 240, 241, 242, 254, 0, 238, 245, 258, 259, 260, + 246, 247, 250, 252, 248, 249, 243, 244, 261, 262, + 251, 255, 256, 257, 253, 399, 398, 395, 394, 0, + 391, 393, 396, 397, 454, 442, 444, 448, 446, 452, + 450, 440, 433, 427, 431, 432, 0, 416, 417, 428, + 429, 430, 424, 419, 425, 421, 422, 423, 426, 420, + 0, 341, 169, 0, 345, 343, 348, 0, 337, 338, + 0, 325, 326, 328, 340, 329, 330, 331, 347, 332, + 333, 334, 335, 336, 375, 0, 0, 373, 374, 377, + 378, 0, 362, 363, 365, 366, 367, 368, 369, 370, + 371, 372, 208, 210, 205, 0, 203, 206, 207, 0, + 521, 523, 0, 526, 0, 0, 530, 534, 0, 0, + 0, 539, 546, 519, 517, 518, 0, 501, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 561, 0, 558, 560, 44, 0, 0, 37, + 0, 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 414, + 0, 315, 0, 0, 0, 0, 0, 0, 0, 323, + 0, 0, 0, 0, 360, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 405, 0, 306, 0, - 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, - 0, 351, 0, 0, 0, 0, 193, 0, 0, 0, + 0, 0, 0, 0, 0, 500, 0, 0, 557, 48, + 41, 0, 0, 0, 0, 0, 0, 59, 0, 103, + 104, 0, 0, 0, 0, 0, 0, 99, 100, 101, + 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 483, 0, 0, 71, 0, 0, 0, 128, 108, + 0, 0, 0, 0, 0, 0, 0, 283, 284, 0, + 0, 0, 0, 239, 0, 392, 0, 0, 0, 0, + 0, 0, 0, 0, 418, 0, 0, 339, 0, 0, + 0, 350, 327, 0, 379, 380, 364, 0, 0, 204, + 520, 0, 0, 525, 0, 528, 529, 0, 0, 536, + 537, 538, 0, 0, 502, 0, 559, 0, 0, 0, + 549, 551, 553, 0, 435, 437, 439, 0, 0, 135, + 230, 316, 353, 287, 38, 402, 404, 0, 0, 195, + 0, 0, 0, 49, 119, 122, 123, 121, 126, 127, + 125, 267, 269, 271, 383, 265, 273, 275, 280, 281, + 282, 279, 277, 407, 0, 400, 455, 443, 445, 449, + 447, 453, 451, 441, 342, 170, 346, 344, 349, 376, + 209, 211, 522, 524, 527, 532, 533, 531, 535, 541, + 542, 543, 544, 545, 540, 547, 0, 42, 0, 0, + 0, 156, 162, 164, 166, 0, 0, 0, 0, 0, + 175, 177, 155, 0, 141, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 0, 139, 0, + 136, 137, 234, 0, 231, 232, 320, 0, 317, 318, + 357, 0, 354, 355, 291, 0, 288, 289, 188, 189, + 190, 191, 192, 0, 181, 183, 184, 185, 186, 187, + 464, 0, 462, 199, 0, 196, 197, 0, 0, 0, + 0, 0, 0, 0, 214, 216, 217, 218, 219, 220, + 221, 493, 495, 492, 490, 491, 0, 486, 488, 489, + 0, 51, 387, 0, 384, 385, 411, 0, 408, 409, + 458, 0, 565, 0, 563, 67, 555, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 491, 0, 0, 548, 48, 41, 0, 0, - 0, 0, 0, 0, 59, 0, 102, 103, 0, 0, - 0, 0, 0, 98, 99, 100, 101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, - 71, 0, 0, 0, 127, 107, 0, 0, 0, 0, - 0, 0, 0, 274, 275, 0, 0, 0, 0, 230, - 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, - 409, 0, 0, 330, 0, 0, 0, 341, 318, 0, - 370, 371, 355, 0, 0, 195, 511, 0, 0, 516, - 0, 519, 520, 0, 0, 527, 528, 529, 0, 0, - 493, 0, 550, 0, 0, 0, 540, 542, 544, 0, - 426, 428, 430, 0, 0, 221, 307, 344, 278, 38, - 393, 395, 0, 0, 186, 0, 0, 0, 49, 118, - 121, 122, 120, 125, 126, 124, 258, 260, 262, 374, - 256, 264, 266, 271, 272, 273, 270, 268, 398, 0, - 391, 446, 434, 436, 440, 438, 444, 442, 432, 333, - 161, 337, 335, 340, 367, 200, 202, 513, 515, 518, - 523, 524, 522, 526, 532, 533, 534, 535, 536, 531, - 538, 0, 42, 0, 0, 0, 147, 153, 155, 157, - 0, 0, 0, 0, 0, 166, 168, 146, 0, 132, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 0, 225, 0, 222, 223, 311, 0, 308, - 309, 348, 0, 345, 346, 282, 0, 279, 280, 179, - 180, 181, 182, 183, 0, 172, 174, 175, 176, 177, - 178, 455, 0, 453, 190, 0, 187, 188, 0, 0, - 0, 0, 0, 0, 0, 205, 207, 208, 209, 210, - 211, 212, 484, 486, 483, 481, 482, 0, 477, 479, - 480, 0, 51, 378, 0, 375, 376, 402, 0, 399, - 400, 449, 0, 556, 0, 554, 67, 546, 105, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 129, 131, 0, 220, 0, 315, 304, 0, 352, - 343, 0, 0, 277, 0, 0, 171, 457, 0, 452, - 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, - 204, 0, 0, 0, 476, 489, 53, 0, 52, 0, - 373, 0, 406, 397, 0, 0, 448, 0, 0, 553, - 0, 0, 0, 0, 159, 162, 163, 164, 165, 0, - 0, 133, 0, 224, 0, 310, 0, 347, 302, 299, - 289, 290, 292, 286, 287, 288, 298, 297, 0, 284, - 291, 300, 301, 293, 294, 295, 296, 281, 173, 472, - 470, 471, 463, 464, 468, 469, 465, 466, 467, 0, - 458, 459, 461, 462, 454, 0, 189, 213, 214, 215, - 216, 217, 218, 206, 0, 0, 478, 50, 0, 0, - 377, 0, 401, 0, 570, 0, 568, 566, 560, 564, - 565, 0, 558, 562, 563, 561, 555, 149, 150, 151, - 152, 148, 154, 156, 158, 167, 169, 226, 312, 349, - 0, 283, 0, 456, 0, 191, 485, 487, 54, 379, - 403, 450, 0, 0, 0, 0, 557, 285, 0, 460, - 0, 567, 0, 559, 473, 0, 569, 574, 0, 572, - 0, 0, 571, 582, 0, 0, 0, 0, 576, 578, - 579, 580, 581, 573, 0, 0, 0, 0, 0, 575, - 0, 584, 585, 586, 577, 583 + 130, 132, 0, 134, 0, 0, 229, 0, 324, 313, + 0, 361, 352, 0, 0, 286, 0, 0, 180, 466, + 0, 461, 0, 194, 0, 0, 0, 0, 0, 0, + 0, 0, 213, 0, 0, 0, 485, 498, 53, 0, + 52, 0, 382, 0, 415, 406, 0, 0, 457, 0, + 0, 562, 0, 0, 0, 0, 168, 171, 172, 173, + 174, 0, 0, 142, 0, 138, 0, 233, 0, 319, + 0, 356, 311, 308, 298, 299, 301, 295, 296, 297, + 307, 306, 0, 293, 300, 309, 310, 302, 303, 304, + 305, 290, 182, 481, 479, 480, 472, 473, 477, 478, + 474, 475, 476, 0, 467, 468, 470, 471, 463, 0, + 198, 222, 223, 224, 225, 226, 227, 215, 0, 0, + 487, 50, 0, 0, 386, 0, 410, 0, 579, 0, + 577, 575, 569, 573, 574, 0, 567, 571, 572, 570, + 564, 158, 159, 160, 161, 157, 163, 165, 167, 176, + 178, 140, 235, 321, 358, 0, 292, 0, 465, 0, + 200, 494, 496, 54, 388, 412, 459, 0, 0, 0, + 0, 566, 294, 0, 469, 0, 576, 0, 568, 482, + 0, 578, 583, 0, 581, 0, 0, 580, 591, 0, + 0, 0, 0, 585, 587, 588, 589, 590, 582, 0, + 0, 0, 0, 0, 584, 0, 593, 594, 595, 586, + 592 }; const short int Dhcp4Parser::yypgoto_[] = { - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -51, -722, 202, -722, -722, - -722, -722, -722, -722, -722, -722, 176, -722, -722, -722, - -66, -722, -722, -722, 354, -722, -722, -722, -722, 157, - 316, -23, -21, 0, -722, -722, 6, -722, -722, 141, - 324, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, 154, -35, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -73, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -45, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -38, -722, -722, -722, -43, 305, -722, -722, -722, - -722, -722, -722, -722, -32, -722, -722, -722, -722, -722, - -722, -721, -722, -722, -722, -7, -722, -722, -722, 1, - 362, -722, -722, -722, -722, -722, -722, -722, -722, -715, - -722, -722, -722, -25, -722, -709, -722, -722, -722, -722, - -722, -722, -722, -722, -20, -722, -722, -143, -61, -722, - -722, -722, -722, -722, 2, -722, -722, -722, 11, -722, - 342, -722, -68, -722, -722, -722, -722, -722, -62, -722, - -722, -722, -722, -722, -17, -722, -722, -722, 9, -722, - -722, -722, 12, -722, 346, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -18, -722, -722, -722, - -15, 374, -722, -722, -54, -722, -34, -722, -722, -722, - -722, -722, -12, -722, -722, -722, -16, -722, 360, -46, - -722, -11, -722, -1, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -704, -722, -722, -722, -722, -722, -722, 16, -722, - -722, -722, -125, -722, -722, -722, -722, -722, -722, -722, - 3, -722, -722, -722, -722, -722, -722, -722, -722, 208, - 337, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, -722, -722, -722, -722, -722, -722, - -722, -722, -722, -722, 237, 329, -722, -722, -722, -8, - -722, -722, -128, -722, -722, -722, -722, -722, -722, -142, - -722, -722, -155, -722, -722, -722, -722, -722 + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -37, -737, 211, -737, -737, + -737, -737, -737, -737, -737, -737, 184, -737, -737, -737, + -66, -737, -737, -737, 350, -737, -737, -737, -737, 148, + 330, -38, -26, -23, -737, -737, -21, -737, -737, 147, + 306, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -52, -737, -535, -36, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -22, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -56, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -60, -737, -737, + -737, -50, 288, -737, -737, -737, -737, -737, -737, -737, + -69, -737, -737, -737, -737, -737, -737, -736, -737, -737, + -737, -11, -737, -737, -737, -35, 357, -737, -737, -737, + -737, -737, -737, -737, -737, -733, -737, -737, -737, -20, + -737, -722, -737, -737, -737, -737, -737, -737, -737, -737, + -17, -737, -737, -155, -61, -737, -737, -737, -737, -737, + -6, -737, -737, -737, -2, -737, 343, -737, -68, -737, + -737, -737, -737, -737, -62, -737, -737, -737, -737, -737, + -3, -737, -737, -737, -8, -737, -737, -737, 1, -737, + 344, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -29, -737, -737, -737, -16, 380, -737, -737, + -54, -737, -34, -737, -737, -737, -737, -737, -18, -737, + -737, -737, -24, -737, 364, -46, -737, 3, -737, 4, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -721, -737, -737, + -737, -737, -737, -737, 6, -737, -737, -737, -129, -737, + -737, -737, -737, -737, -737, -737, -4, -737, -737, -737, + -737, -737, -737, -737, -737, 212, 348, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + -737, -737, -737, -737, -737, -737, -737, -737, -737, -737, + 234, 359, -737, -737, -737, -15, -737, -737, -138, -737, + -737, -737, -737, -737, -737, -150, -737, -737, -166, -737, + -737, -737, -737, -737 }; const short int Dhcp4Parser::yydefgoto_[] = { -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 36, 37, 38, 65, 550, - 82, 83, 39, 64, 79, 80, 559, 702, 767, 768, - 123, 41, 66, 91, 92, 93, 329, 43, 67, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 337, 156, - 157, 45, 68, 158, 364, 159, 365, 562, 160, 366, - 565, 161, 133, 343, 134, 344, 628, 629, 630, 719, - 871, 631, 720, 632, 721, 633, 722, 634, 247, 400, - 636, 637, 638, 639, 640, 728, 641, 729, 135, 355, - 664, 665, 666, 667, 668, 669, 670, 136, 357, 675, - 676, 677, 750, 59, 75, 283, 284, 285, 413, 286, - 414, 137, 358, 684, 685, 686, 687, 688, 689, 690, - 691, 138, 349, 644, 645, 646, 733, 47, 69, 182, - 183, 184, 374, 185, 370, 186, 371, 187, 372, 188, - 375, 189, 376, 190, 380, 191, 379, 576, 192, 193, - 139, 352, 656, 657, 658, 742, 808, 809, 140, 350, - 53, 72, 648, 649, 650, 736, 55, 73, 248, 249, - 250, 251, 252, 253, 254, 399, 255, 403, 256, 402, - 257, 258, 404, 259, 141, 351, 652, 653, 654, 739, - 57, 74, 269, 270, 271, 272, 273, 408, 274, 275, - 276, 277, 195, 373, 704, 705, 706, 769, 49, 70, - 207, 208, 209, 385, 142, 353, 143, 354, 198, 381, - 708, 709, 710, 772, 51, 71, 224, 225, 226, 144, - 340, 145, 341, 146, 342, 230, 395, 231, 389, 232, - 390, 233, 392, 234, 391, 235, 394, 236, 393, 237, - 388, 202, 382, 712, 775, 147, 356, 672, 673, 747, - 829, 830, 831, 832, 833, 882, 148, 149, 360, 697, - 698, 699, 761, 700, 762, 150, 361, 61, 76, 304, - 305, 306, 307, 418, 308, 419, 309, 310, 421, 311, - 312, 313, 424, 602, 314, 425, 315, 316, 317, 318, - 429, 609, 319, 430, 94, 331, 95, 332, 96, 333, - 97, 330, 63, 77, 321, 322, 323, 433, 714, 715, - 777, 861, 862, 863, 864, 894, 865, 892, 908, 909, - 910, 917, 918, 919, 924, 920, 921, 922 + 23, 24, 25, 26, 27, 36, 37, 38, 65, 555, + 82, 83, 39, 64, 79, 80, 564, 711, 779, 780, + 632, 41, 66, 91, 92, 93, 331, 43, 67, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 339, 158, + 159, 45, 68, 160, 367, 161, 368, 567, 162, 369, + 570, 163, 134, 345, 135, 346, 136, 347, 649, 650, + 651, 742, 633, 634, 635, 728, 885, 636, 729, 637, + 730, 638, 731, 639, 640, 403, 641, 642, 643, 644, + 645, 737, 646, 738, 137, 358, 673, 674, 675, 676, + 677, 678, 679, 138, 360, 684, 685, 686, 762, 59, + 75, 285, 286, 287, 416, 288, 417, 139, 361, 693, + 694, 695, 696, 697, 698, 699, 700, 140, 352, 653, + 654, 655, 745, 47, 69, 184, 185, 186, 377, 187, + 373, 188, 374, 189, 375, 190, 378, 191, 379, 192, + 383, 193, 382, 581, 194, 195, 141, 355, 665, 666, + 667, 754, 822, 823, 142, 353, 53, 72, 657, 658, + 659, 748, 55, 73, 250, 251, 252, 253, 254, 255, + 256, 402, 257, 406, 258, 405, 259, 260, 407, 261, + 143, 354, 661, 662, 663, 751, 57, 74, 271, 272, + 273, 274, 275, 411, 276, 277, 278, 279, 197, 376, + 713, 714, 715, 781, 49, 70, 209, 210, 211, 388, + 144, 356, 145, 357, 200, 384, 717, 718, 719, 784, + 51, 71, 226, 227, 228, 146, 342, 147, 343, 148, + 344, 232, 398, 233, 392, 234, 393, 235, 395, 236, + 394, 237, 397, 238, 396, 239, 391, 204, 385, 721, + 787, 149, 359, 681, 682, 759, 843, 844, 845, 846, + 847, 897, 150, 151, 363, 706, 707, 708, 773, 709, + 774, 152, 364, 61, 76, 306, 307, 308, 309, 421, + 310, 422, 311, 312, 424, 313, 314, 315, 427, 607, + 316, 428, 317, 318, 319, 320, 432, 614, 321, 433, + 94, 333, 95, 334, 96, 335, 97, 332, 63, 77, + 323, 324, 325, 436, 723, 724, 789, 875, 876, 877, + 878, 909, 879, 907, 923, 924, 925, 932, 933, 934, + 939, 935, 936, 937 }; const unsigned short int Dhcp4Parser::yytable_[] = { - 90, 266, 155, 177, 204, 220, 267, 246, 265, 282, - 301, 238, 268, 78, 162, 196, 210, 222, 84, 260, - 278, 804, 302, 199, 29, 227, 30, 805, 31, 745, - 600, 40, 746, 807, 163, 197, 211, 223, 816, 261, - 279, 28, 303, 151, 152, 205, 178, 153, 179, 112, - 154, 335, 194, 206, 221, 81, 336, 42, 200, 362, - 228, 203, 114, 115, 363, 280, 281, 44, 201, 180, - 229, 748, 368, 98, 749, 181, 174, 369, 114, 115, - 280, 281, 99, 100, 101, 102, 103, 104, 105, 240, - 262, 241, 242, 263, 264, 114, 115, 778, 383, 46, - 779, 114, 115, 384, 106, 107, 108, 109, 110, 48, - 560, 561, 111, 112, 692, 693, 240, 678, 679, 680, - 681, 682, 683, 113, 89, 50, 114, 115, 114, 115, - 913, 85, 601, 914, 915, 916, 52, 116, 117, 386, - 86, 87, 88, 415, 387, 54, 89, 431, 416, 434, - 118, 320, 432, 119, 435, 56, 89, 58, 362, 804, - 120, 121, 89, 716, 122, 805, 60, 32, 33, 34, - 35, 807, 100, 101, 102, 103, 816, 911, 62, 89, - 912, 659, 660, 661, 662, 89, 663, 563, 564, 854, - 324, 855, 856, 106, 107, 108, 434, 111, 164, 165, - 166, 717, 112, 100, 101, 102, 103, 325, 327, 368, - 89, 326, 89, 167, 718, 114, 115, 168, 169, 170, - 171, 172, 173, 334, 106, 107, 108, 730, 110, 174, - 175, 338, 731, 112, 240, 730, 759, 176, 328, 396, - 732, 760, 101, 102, 103, 339, 114, 115, 345, 169, - 101, 102, 103, 173, 604, 605, 606, 607, 397, 763, - 174, 431, 383, 239, 764, 346, 765, 877, 176, 90, - 111, 112, 240, 880, 436, 437, 415, 386, 881, 112, - 347, 885, 889, 348, 114, 115, 608, 359, 240, 367, - 241, 242, 114, 115, 243, 244, 245, 819, 895, 89, - 114, 115, 155, 896, 212, 377, 378, 398, 213, 214, - 215, 216, 217, 218, 162, 219, 928, 177, 401, 405, - 204, 929, 867, 868, 869, 870, 573, 574, 575, 196, - 89, 220, 210, 406, 163, 407, 411, 199, 409, 266, - 410, 246, 412, 222, 267, 417, 265, 420, 446, 197, - 268, 227, 211, 260, 422, 423, 426, 427, 278, 428, - 178, 205, 179, 223, 438, 301, 194, 439, 89, 206, - 453, 440, 200, 261, 441, 442, 89, 302, 279, 443, - 221, 445, 201, 180, 89, 447, 228, 448, 449, 181, - 536, 537, 538, 616, 450, 451, 229, 303, 617, 618, - 619, 620, 621, 622, 623, 624, 625, 626, 114, 115, - 452, 454, 455, 456, 457, 458, 459, 460, 240, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 461, 462, 463, 464, 465, 466, 467, 468, - 469, 471, 472, 473, 474, 476, 477, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 478, 479, 596, 480, 481, 482, 483, 484, 485, - 635, 635, 486, 155, 487, 488, 490, 627, 627, 492, - 493, 494, 612, 495, 496, 162, 497, 498, 499, 501, - 694, 301, 89, 502, 503, 504, 505, 506, 507, 509, - 510, 513, 695, 302, 514, 163, 517, 511, 516, 518, - 519, 520, 523, 521, 89, 524, 525, 522, 528, 529, - 526, 531, 696, 303, 527, 533, 534, 535, 540, 539, - 541, 543, 544, 542, 545, 546, 547, 548, 711, 552, - 30, 551, 553, 554, 566, 567, 555, 556, 557, 558, - 568, 569, 570, 571, 578, 572, 577, 579, 611, 643, - 723, 647, 580, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, 593, 594, 651, 603, 655, 671, - 674, 703, 595, 707, 713, 724, 725, 726, 597, 727, - 734, 598, 599, 610, 735, 737, 738, 741, 740, 744, - 766, 743, 752, 751, 753, 754, 755, 756, 757, 758, - 771, 872, 770, 774, 773, 780, 781, 776, 782, 783, - 785, 789, 784, 786, 790, 844, 845, 848, 905, 787, - 788, 847, 853, 893, 878, 837, 838, 839, 879, 840, - 883, 884, 890, 841, 898, 842, 873, 874, 900, 875, - 902, 876, 886, 925, 887, 907, 926, 635, 888, 927, - 891, 930, 901, 549, 627, 932, 266, 177, 581, 803, - 246, 267, 933, 265, 821, 904, 798, 268, 470, 196, - 615, 820, 260, 906, 282, 278, 822, 199, 811, 444, - 935, 613, 475, 824, 931, 791, 813, 694, 642, 197, - 818, 826, 261, 204, 858, 279, 220, 835, 812, 695, - 178, 857, 179, 825, 836, 210, 194, 806, 222, 799, - 515, 800, 200, 859, 817, 810, 227, 843, 793, 696, - 823, 814, 201, 180, 792, 211, 827, 897, 223, 181, - 795, 815, 801, 860, 205, 489, 828, 794, 802, 508, - 797, 796, 206, 850, 849, 221, 851, 500, 512, 899, - 491, 228, 852, 532, 834, 701, 846, 903, 530, 923, - 866, 229, 614, 934, 0, 0, 0, 0, 0, 0, + 90, 124, 157, 179, 206, 222, 269, 248, 267, 284, + 303, 240, 270, 647, 164, 198, 212, 224, 818, 262, + 280, 819, 304, 201, 29, 229, 30, 78, 31, 565, + 566, 180, 821, 830, 165, 199, 213, 225, 605, 263, + 281, 84, 305, 181, 98, 28, 182, 40, 183, 81, + 207, 249, 268, 99, 100, 101, 102, 103, 104, 105, + 106, 578, 579, 580, 337, 365, 196, 208, 223, 338, + 366, 42, 202, 203, 230, 231, 107, 108, 109, 110, + 111, 282, 283, 371, 112, 113, 153, 154, 372, 44, + 155, 115, 116, 156, 113, 114, 568, 569, 115, 116, + 101, 102, 103, 242, 282, 283, 205, 115, 116, 117, + 118, 46, 48, 50, 928, 115, 116, 929, 930, 931, + 241, 176, 119, 757, 52, 120, 758, 701, 702, 112, + 113, 242, 121, 122, 54, 760, 123, 386, 761, 115, + 116, 606, 387, 115, 116, 242, 56, 243, 244, 389, + 58, 245, 246, 247, 390, 85, 833, 115, 116, 818, + 60, 62, 819, 89, 86, 87, 88, 418, 32, 33, + 34, 35, 419, 821, 830, 89, 868, 112, 869, 870, + 89, 790, 89, 322, 791, 434, 100, 101, 102, 103, + 435, 89, 326, 437, 327, 101, 102, 103, 438, 89, + 687, 688, 689, 690, 691, 692, 365, 804, 107, 108, + 109, 725, 328, 166, 167, 168, 330, 113, 329, 609, + 610, 611, 612, 89, 437, 113, 336, 89, 169, 726, + 115, 116, 170, 171, 172, 173, 174, 175, 115, 116, + 340, 89, 371, 739, 176, 177, 926, 727, 740, 927, + 214, 613, 178, 341, 215, 216, 217, 218, 219, 220, + 348, 221, 668, 669, 670, 671, 349, 672, 739, 771, + 621, 90, 350, 741, 772, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 351, 362, 775, 434, 739, + 439, 440, 776, 777, 891, 242, 386, 895, 418, 124, + 370, 892, 896, 900, 380, 157, 242, 264, 243, 244, + 265, 266, 381, 399, 89, 400, 441, 164, 115, 116, + 179, 389, 89, 206, 910, 943, 904, 401, 404, 911, + 944, 408, 198, 409, 222, 212, 410, 165, 412, 413, + 201, 415, 457, 420, 248, 414, 224, 269, 180, 267, + 423, 425, 199, 270, 229, 213, 262, 426, 429, 430, + 181, 280, 431, 182, 442, 183, 225, 443, 303, 207, + 881, 882, 883, 884, 444, 445, 263, 446, 115, 116, + 304, 281, 448, 196, 449, 450, 208, 451, 249, 202, + 203, 89, 452, 268, 453, 454, 455, 223, 456, 461, + 305, 458, 89, 230, 231, 459, 462, 540, 541, 542, + 100, 101, 102, 103, 460, 463, 464, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 465, 107, 108, 109, 466, 111, 467, 468, 469, + 470, 113, 242, 472, 473, 475, 476, 471, 477, 480, + 478, 481, 482, 483, 115, 116, 484, 171, 485, 486, + 487, 175, 89, 488, 489, 490, 491, 492, 176, 494, + 496, 497, 124, 498, 499, 500, 178, 157, 501, 502, + 503, 601, 505, 506, 508, 509, 507, 510, 513, 164, + 517, 518, 511, 521, 514, 703, 303, 515, 522, 524, + 617, 520, 523, 527, 528, 532, 525, 704, 304, 165, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 533, 529, 526, 535, 705, 305, 530, + 537, 531, 538, 544, 539, 543, 545, 547, 89, 548, + 549, 550, 546, 551, 552, 553, 556, 557, 30, 558, + 559, 788, 571, 560, 561, 562, 563, 572, 573, 574, + 583, 616, 575, 576, 577, 582, 584, 585, 587, 588, + 589, 590, 591, 592, 593, 594, 608, 595, 596, 597, + 648, 598, 652, 656, 660, 664, 599, 600, 680, 683, + 712, 716, 602, 720, 722, 603, 732, 733, 734, 604, + 615, 735, 736, 744, 893, 743, 747, 746, 749, 750, + 752, 753, 756, 755, 764, 783, 763, 765, 766, 767, + 768, 769, 770, 786, 797, 782, 778, 785, 792, 793, + 794, 795, 796, 801, 802, 798, 858, 859, 862, 886, + 799, 800, 851, 852, 861, 867, 853, 854, 855, 899, + 894, 898, 856, 887, 908, 888, 889, 890, 901, 902, + 903, 905, 906, 913, 915, 916, 917, 919, 920, 921, + 940, 922, 941, 942, 945, 946, 554, 479, 950, 179, + 586, 947, 248, 269, 948, 267, 618, 447, 812, 270, + 620, 198, 805, 834, 262, 474, 284, 280, 836, 201, + 825, 832, 857, 803, 850, 838, 519, 180, 827, 703, + 806, 199, 849, 840, 263, 206, 813, 281, 222, 181, + 826, 704, 182, 871, 183, 839, 249, 212, 814, 268, + 224, 815, 817, 816, 820, 873, 807, 835, 229, 831, + 912, 705, 196, 493, 809, 811, 808, 213, 202, 203, + 225, 824, 810, 512, 864, 874, 837, 828, 829, 516, + 865, 207, 841, 842, 504, 863, 848, 872, 866, 495, + 914, 860, 918, 619, 710, 880, 938, 949, 208, 0, + 0, 223, 534, 0, 0, 0, 0, 230, 231, 0, + 0, 0, 0, 0, 0, 0, 536, 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, 803, 0, 0, - 0, 821, 0, 0, 798, 0, 0, 0, 820, 0, - 0, 0, 858, 822, 0, 0, 811, 0, 0, 857, - 824, 0, 0, 0, 813, 0, 0, 0, 826, 0, - 0, 859, 0, 0, 0, 0, 812, 0, 0, 0, - 825, 0, 0, 0, 0, 806, 0, 799, 0, 800, - 0, 860, 0, 810, 0, 0, 0, 823, 0, 814, - 0, 0, 0, 827, 0, 0, 0, 0, 0, 815, - 801, 0, 0, 828, 0, 0, 802 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 812, + 0, 0, 0, 834, 0, 0, 0, 0, 836, 0, + 0, 825, 0, 0, 871, 838, 0, 0, 0, 827, + 0, 0, 0, 840, 0, 0, 873, 813, 0, 0, + 0, 826, 0, 0, 0, 839, 0, 0, 0, 814, + 0, 0, 815, 817, 816, 820, 874, 835, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 872, 0, + 0, 0, 824, 0, 0, 0, 837, 0, 828, 829, + 0, 0, 841, 842 }; const short int Dhcp4Parser::yycheck_[] = { - 66, 74, 68, 69, 70, 71, 74, 73, 74, 75, - 76, 72, 74, 64, 68, 69, 70, 71, 10, 73, - 74, 742, 76, 69, 5, 71, 7, 742, 9, 3, - 15, 7, 6, 742, 68, 69, 70, 71, 742, 73, - 74, 0, 76, 12, 13, 70, 69, 16, 69, 51, - 19, 3, 69, 70, 71, 148, 8, 7, 69, 3, - 71, 63, 64, 65, 8, 89, 90, 7, 69, 69, - 71, 3, 3, 11, 6, 69, 78, 8, 64, 65, - 89, 90, 20, 21, 22, 23, 24, 25, 26, 52, - 53, 54, 55, 56, 57, 64, 65, 3, 3, 7, - 6, 64, 65, 8, 42, 43, 44, 45, 46, 7, - 14, 15, 50, 51, 100, 101, 52, 92, 93, 94, - 95, 96, 97, 61, 148, 7, 64, 65, 64, 65, - 126, 123, 117, 129, 130, 131, 7, 75, 76, 3, - 132, 133, 134, 3, 8, 7, 148, 3, 8, 3, - 88, 124, 8, 91, 8, 7, 148, 7, 3, 880, - 98, 99, 148, 8, 102, 880, 7, 148, 149, 150, - 151, 880, 21, 22, 23, 24, 880, 3, 7, 148, - 6, 80, 81, 82, 83, 148, 85, 17, 18, 125, - 6, 127, 128, 42, 43, 44, 3, 50, 47, 48, - 49, 8, 51, 21, 22, 23, 24, 3, 8, 3, - 148, 4, 148, 62, 8, 64, 65, 66, 67, 68, - 69, 70, 71, 4, 42, 43, 44, 3, 46, 78, - 79, 4, 8, 51, 52, 3, 3, 86, 3, 8, - 8, 8, 22, 23, 24, 4, 64, 65, 4, 67, - 22, 23, 24, 71, 119, 120, 121, 122, 3, 3, - 78, 3, 3, 27, 8, 4, 8, 8, 86, 335, - 50, 51, 52, 3, 325, 326, 3, 3, 8, 51, - 4, 8, 8, 4, 64, 65, 151, 4, 52, 4, - 54, 55, 64, 65, 58, 59, 60, 77, 3, 148, - 64, 65, 368, 8, 76, 4, 4, 8, 80, 81, - 82, 83, 84, 85, 368, 87, 3, 383, 4, 4, - 386, 8, 28, 29, 30, 31, 72, 73, 74, 383, - 148, 397, 386, 8, 368, 3, 8, 383, 4, 412, - 4, 407, 3, 397, 412, 4, 412, 4, 151, 383, - 412, 397, 386, 407, 4, 4, 4, 4, 412, 4, - 383, 386, 383, 397, 148, 431, 383, 4, 148, 386, - 149, 4, 383, 407, 4, 4, 148, 431, 412, 4, - 397, 4, 383, 383, 148, 151, 397, 4, 4, 383, - 441, 442, 443, 27, 4, 4, 397, 431, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 64, 65, - 4, 149, 149, 149, 4, 4, 4, 4, 52, 135, + 66, 67, 68, 69, 70, 71, 74, 73, 74, 75, + 76, 72, 74, 548, 68, 69, 70, 71, 754, 73, + 74, 754, 76, 69, 5, 71, 7, 64, 9, 14, + 15, 69, 754, 754, 68, 69, 70, 71, 15, 73, + 74, 10, 76, 69, 11, 0, 69, 7, 69, 149, + 70, 73, 74, 20, 21, 22, 23, 24, 25, 26, + 27, 73, 74, 75, 3, 3, 69, 70, 71, 8, + 8, 7, 69, 69, 71, 71, 43, 44, 45, 46, + 47, 90, 91, 3, 51, 52, 12, 13, 8, 7, + 16, 65, 66, 19, 52, 62, 17, 18, 65, 66, + 22, 23, 24, 53, 90, 91, 64, 65, 66, 76, + 77, 7, 7, 7, 127, 65, 66, 130, 131, 132, + 28, 79, 89, 3, 7, 92, 6, 101, 102, 51, + 52, 53, 99, 100, 7, 3, 103, 3, 6, 65, + 66, 118, 8, 65, 66, 53, 7, 55, 56, 3, + 7, 59, 60, 61, 8, 124, 78, 65, 66, 895, + 7, 7, 895, 149, 133, 134, 135, 3, 149, 150, + 151, 152, 8, 895, 895, 149, 126, 51, 128, 129, + 149, 3, 149, 125, 6, 3, 21, 22, 23, 24, + 8, 149, 6, 3, 3, 22, 23, 24, 8, 149, + 93, 94, 95, 96, 97, 98, 3, 742, 43, 44, + 45, 8, 4, 48, 49, 50, 3, 52, 8, 120, + 121, 122, 123, 149, 3, 52, 4, 149, 63, 8, + 65, 66, 67, 68, 69, 70, 71, 72, 65, 66, + 4, 149, 3, 3, 79, 80, 3, 8, 8, 6, + 77, 152, 87, 4, 81, 82, 83, 84, 85, 86, + 4, 88, 81, 82, 83, 84, 4, 86, 3, 3, + 28, 337, 4, 8, 8, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 4, 4, 3, 3, 3, + 327, 328, 8, 8, 8, 53, 3, 3, 3, 365, + 4, 8, 8, 8, 4, 371, 53, 54, 55, 56, + 57, 58, 4, 8, 149, 3, 149, 371, 65, 66, + 386, 3, 149, 389, 3, 3, 8, 8, 4, 8, + 8, 4, 386, 8, 400, 389, 3, 371, 4, 4, + 386, 3, 150, 4, 410, 8, 400, 415, 386, 415, + 4, 4, 386, 415, 400, 389, 410, 4, 4, 4, + 386, 415, 4, 386, 4, 386, 400, 4, 434, 389, + 29, 30, 31, 32, 4, 4, 410, 4, 65, 66, + 434, 415, 4, 386, 152, 152, 389, 4, 410, 386, + 386, 149, 4, 415, 4, 4, 4, 400, 4, 4, + 434, 150, 149, 400, 400, 150, 4, 444, 445, 446, + 21, 22, 23, 24, 150, 4, 4, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 4, 43, 44, 45, 4, 47, 4, 4, 4, + 4, 52, 53, 4, 4, 4, 4, 150, 4, 4, + 152, 4, 4, 4, 65, 66, 4, 68, 4, 4, + 150, 72, 149, 152, 4, 4, 4, 4, 79, 4, + 4, 4, 538, 4, 4, 4, 87, 543, 4, 4, + 4, 518, 4, 4, 4, 4, 150, 4, 4, 543, + 4, 4, 152, 4, 152, 561, 562, 152, 4, 4, + 537, 152, 150, 4, 4, 4, 150, 561, 562, 543, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 4, 4, 4, 4, 4, 4, 149, 4, - 4, 4, 4, 4, 151, 4, 4, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 4, 4, 514, 4, 4, 4, 149, 151, 4, - 543, 544, 4, 539, 4, 4, 4, 543, 544, 4, - 4, 4, 533, 4, 4, 539, 4, 4, 4, 4, - 556, 557, 148, 4, 149, 4, 4, 4, 151, 4, - 151, 4, 556, 557, 4, 539, 4, 151, 151, 4, - 149, 4, 4, 149, 148, 4, 151, 149, 4, 4, - 151, 4, 556, 557, 151, 4, 7, 7, 148, 7, - 148, 7, 7, 148, 5, 5, 5, 5, 87, 5, - 7, 148, 5, 5, 148, 148, 7, 7, 7, 5, - 148, 5, 148, 148, 5, 148, 148, 7, 5, 7, - 4, 7, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 7, 118, 7, 7, - 7, 7, 148, 7, 7, 4, 4, 4, 148, 4, - 6, 148, 148, 148, 3, 6, 3, 3, 6, 3, - 148, 6, 3, 6, 4, 4, 4, 4, 4, 4, - 3, 148, 6, 3, 6, 4, 4, 8, 4, 4, - 151, 4, 149, 149, 4, 4, 4, 3, 5, 151, - 149, 6, 4, 4, 8, 149, 149, 149, 8, 149, - 8, 3, 8, 149, 4, 149, 148, 148, 4, 148, - 4, 148, 148, 4, 148, 7, 4, 730, 148, 4, - 148, 4, 149, 461, 730, 149, 739, 733, 492, 742, - 736, 739, 149, 739, 747, 148, 742, 739, 362, 733, - 539, 747, 736, 148, 750, 739, 747, 733, 742, 335, - 148, 534, 368, 747, 151, 730, 742, 763, 544, 733, - 745, 747, 736, 769, 777, 739, 772, 750, 742, 763, - 733, 777, 733, 747, 752, 769, 733, 742, 772, 742, - 415, 742, 733, 777, 744, 742, 772, 759, 735, 763, - 747, 742, 733, 733, 733, 769, 747, 880, 772, 733, - 738, 742, 742, 777, 769, 383, 747, 736, 742, 407, - 741, 739, 769, 771, 769, 772, 772, 397, 412, 884, - 386, 772, 774, 434, 748, 557, 763, 895, 431, 911, - 778, 772, 535, 928, -1, -1, -1, -1, -1, -1, + 146, 147, 148, 4, 152, 150, 4, 561, 562, 152, + 4, 152, 7, 149, 7, 7, 149, 7, 149, 7, + 5, 5, 149, 5, 5, 5, 149, 5, 7, 5, + 5, 8, 149, 7, 7, 7, 5, 149, 149, 5, + 5, 5, 149, 149, 149, 149, 7, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 119, 149, 149, 149, + 7, 149, 7, 7, 7, 7, 149, 149, 7, 7, + 7, 7, 149, 88, 7, 149, 4, 4, 4, 149, + 149, 4, 4, 3, 8, 6, 3, 6, 6, 3, + 6, 3, 3, 6, 3, 3, 6, 4, 4, 4, + 4, 4, 4, 3, 152, 6, 149, 6, 4, 4, + 4, 4, 150, 4, 4, 150, 4, 4, 3, 149, + 152, 150, 150, 150, 6, 4, 150, 150, 150, 3, + 8, 8, 150, 149, 4, 149, 149, 149, 149, 149, + 149, 8, 149, 4, 4, 150, 4, 149, 5, 149, + 4, 7, 4, 4, 4, 152, 465, 371, 149, 745, + 496, 150, 748, 751, 150, 751, 538, 337, 754, 751, + 543, 745, 744, 759, 748, 365, 762, 751, 759, 745, + 754, 757, 771, 739, 764, 759, 418, 745, 754, 775, + 745, 745, 762, 759, 748, 781, 754, 751, 784, 745, + 754, 775, 745, 789, 745, 759, 748, 781, 754, 751, + 784, 754, 754, 754, 754, 789, 747, 759, 784, 756, + 895, 775, 745, 386, 750, 753, 748, 781, 745, 745, + 784, 754, 751, 410, 783, 789, 759, 754, 754, 415, + 784, 781, 759, 759, 400, 781, 760, 789, 786, 389, + 899, 775, 910, 539, 562, 790, 926, 943, 781, -1, + -1, 784, 434, -1, -1, -1, -1, 784, 784, -1, + -1, -1, -1, -1, -1, -1, 437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 880, -1, -1, - -1, 884, -1, -1, 880, -1, -1, -1, 884, -1, - -1, -1, 895, 884, -1, -1, 880, -1, -1, 895, - 884, -1, -1, -1, 880, -1, -1, -1, 884, -1, - -1, 895, -1, -1, -1, -1, 880, -1, -1, -1, - 884, -1, -1, -1, -1, 880, -1, 880, -1, 880, - -1, 895, -1, 880, -1, -1, -1, 884, -1, 880, - -1, -1, -1, 884, -1, -1, -1, -1, -1, 880, - 880, -1, -1, 884, -1, -1, 880 + -1, -1, -1, -1, -1, -1, -1, -1, -1, 895, + -1, -1, -1, 899, -1, -1, -1, -1, 899, -1, + -1, 895, -1, -1, 910, 899, -1, -1, -1, 895, + -1, -1, -1, 899, -1, -1, 910, 895, -1, -1, + -1, 895, -1, -1, -1, 899, -1, -1, -1, 895, + -1, -1, 895, 895, 895, 895, 910, 899, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 910, -1, + -1, -1, 895, -1, -1, -1, 899, -1, 895, 895, + -1, -1, 899, 899 }; const unsigned short int Dhcp4Parser::yystos_[] = { - 0, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 0, 5, - 7, 9, 148, 149, 150, 151, 167, 168, 169, 174, - 7, 183, 7, 189, 7, 203, 7, 279, 7, 360, - 7, 376, 7, 312, 7, 318, 7, 342, 7, 255, - 7, 429, 7, 464, 175, 170, 184, 190, 204, 280, - 361, 377, 313, 319, 343, 256, 430, 465, 167, 176, - 177, 148, 172, 173, 10, 123, 132, 133, 134, 148, - 182, 185, 186, 187, 456, 458, 460, 462, 11, 20, - 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, - 46, 50, 51, 61, 64, 65, 75, 76, 88, 91, - 98, 99, 102, 182, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 214, 216, 240, 249, 263, 273, 302, - 310, 336, 366, 368, 381, 383, 385, 407, 418, 419, - 427, 12, 13, 16, 19, 182, 201, 202, 205, 207, - 210, 213, 366, 368, 47, 48, 49, 62, 66, 67, - 68, 69, 70, 71, 78, 79, 86, 182, 193, 194, - 195, 198, 281, 282, 283, 285, 287, 289, 291, 293, - 295, 297, 300, 301, 336, 354, 366, 368, 370, 381, - 383, 385, 403, 63, 182, 295, 336, 362, 363, 364, - 366, 368, 76, 80, 81, 82, 83, 84, 85, 87, - 182, 336, 366, 368, 378, 379, 380, 381, 383, 385, - 387, 389, 391, 393, 395, 397, 399, 401, 310, 27, - 52, 54, 55, 58, 59, 60, 182, 230, 320, 321, - 322, 323, 324, 325, 326, 328, 330, 332, 333, 335, - 366, 368, 53, 56, 57, 182, 230, 324, 330, 344, - 345, 346, 347, 348, 350, 351, 352, 353, 366, 368, - 89, 90, 182, 257, 258, 259, 261, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 182, 366, 368, 431, 432, 433, 434, 436, 438, - 439, 441, 442, 443, 446, 448, 449, 450, 451, 454, - 124, 466, 467, 468, 6, 3, 4, 8, 3, 188, - 463, 457, 459, 461, 4, 3, 8, 200, 4, 4, - 382, 384, 386, 215, 217, 4, 4, 4, 4, 274, - 311, 337, 303, 367, 369, 241, 408, 250, 264, 4, - 420, 428, 3, 8, 206, 208, 211, 4, 3, 8, - 286, 288, 290, 355, 284, 292, 294, 4, 4, 298, - 296, 371, 404, 3, 8, 365, 3, 8, 402, 390, - 392, 396, 394, 400, 398, 388, 8, 3, 8, 327, - 231, 4, 331, 329, 334, 4, 8, 3, 349, 4, - 4, 8, 3, 260, 262, 3, 8, 4, 435, 437, - 4, 440, 4, 4, 444, 447, 4, 4, 4, 452, - 455, 3, 8, 469, 3, 8, 167, 167, 148, 4, - 4, 4, 4, 4, 186, 4, 151, 151, 4, 4, - 4, 4, 4, 149, 149, 149, 149, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 149, 4, 4, - 192, 4, 4, 4, 151, 202, 4, 4, 4, 4, - 4, 4, 4, 149, 151, 4, 4, 4, 4, 282, - 4, 363, 4, 4, 4, 4, 4, 4, 4, 4, - 380, 4, 4, 149, 4, 4, 4, 151, 322, 4, - 151, 151, 346, 4, 4, 258, 151, 4, 4, 149, - 4, 149, 149, 4, 4, 151, 151, 151, 4, 4, - 432, 4, 467, 4, 7, 7, 167, 167, 167, 7, - 148, 148, 148, 7, 7, 5, 5, 5, 5, 169, - 171, 148, 5, 5, 5, 7, 7, 7, 5, 178, - 14, 15, 209, 17, 18, 212, 148, 148, 148, 5, - 148, 148, 148, 72, 73, 74, 299, 148, 5, 7, - 148, 178, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 167, 148, 148, 148, - 15, 117, 445, 118, 119, 120, 121, 122, 151, 453, - 148, 5, 167, 191, 466, 201, 27, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 182, 218, 219, - 220, 223, 225, 227, 229, 230, 232, 233, 234, 235, - 236, 238, 218, 7, 275, 276, 277, 7, 314, 315, - 316, 7, 338, 339, 340, 7, 304, 305, 306, 80, - 81, 82, 83, 85, 242, 243, 244, 245, 246, 247, - 248, 7, 409, 410, 7, 251, 252, 253, 92, 93, - 94, 95, 96, 97, 265, 266, 267, 268, 269, 270, - 271, 272, 100, 101, 182, 366, 368, 421, 422, 423, - 425, 431, 179, 7, 356, 357, 358, 7, 372, 373, - 374, 87, 405, 7, 470, 471, 8, 8, 8, 221, - 224, 226, 228, 4, 4, 4, 4, 4, 237, 239, - 3, 8, 8, 278, 6, 3, 317, 6, 3, 341, - 6, 3, 307, 6, 3, 3, 6, 411, 3, 6, - 254, 6, 3, 4, 4, 4, 4, 4, 4, 3, - 8, 424, 426, 3, 8, 8, 148, 180, 181, 359, - 6, 3, 375, 6, 3, 406, 8, 472, 3, 6, - 4, 4, 4, 4, 149, 151, 149, 151, 149, 4, - 4, 219, 281, 277, 320, 316, 344, 340, 182, 193, - 194, 195, 198, 230, 273, 291, 295, 297, 308, 309, - 336, 366, 368, 381, 383, 385, 403, 306, 243, 77, - 182, 230, 310, 336, 366, 368, 381, 383, 385, 412, - 413, 414, 415, 416, 410, 257, 253, 149, 149, 149, - 149, 149, 149, 266, 4, 4, 422, 6, 3, 362, - 358, 378, 374, 4, 125, 127, 128, 182, 230, 366, - 368, 473, 474, 475, 476, 478, 471, 28, 29, 30, - 31, 222, 148, 148, 148, 148, 148, 8, 8, 8, - 3, 8, 417, 8, 3, 8, 148, 148, 148, 8, - 8, 148, 479, 4, 477, 3, 8, 309, 4, 414, - 4, 149, 4, 474, 148, 5, 148, 7, 480, 481, - 482, 3, 6, 126, 129, 130, 131, 483, 484, 485, - 487, 488, 489, 481, 486, 4, 4, 4, 3, 8, - 4, 151, 149, 149, 484, 148 + 0, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 0, 5, + 7, 9, 149, 150, 151, 152, 168, 169, 170, 175, + 7, 184, 7, 190, 7, 204, 7, 286, 7, 367, + 7, 383, 7, 319, 7, 325, 7, 349, 7, 262, + 7, 436, 7, 471, 176, 171, 185, 191, 205, 287, + 368, 384, 320, 326, 350, 263, 437, 472, 168, 177, + 178, 149, 173, 174, 10, 124, 133, 134, 135, 149, + 183, 186, 187, 188, 463, 465, 467, 469, 11, 20, + 21, 22, 23, 24, 25, 26, 27, 43, 44, 45, + 46, 47, 51, 52, 62, 65, 66, 76, 77, 89, + 92, 99, 100, 103, 183, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 215, 217, 219, 247, 256, 270, + 280, 309, 317, 343, 373, 375, 388, 390, 392, 414, + 425, 426, 434, 12, 13, 16, 19, 183, 202, 203, + 206, 208, 211, 214, 373, 375, 48, 49, 50, 63, + 67, 68, 69, 70, 71, 72, 79, 80, 87, 183, + 194, 195, 196, 199, 288, 289, 290, 292, 294, 296, + 298, 300, 302, 304, 307, 308, 343, 361, 373, 375, + 377, 388, 390, 392, 410, 64, 183, 302, 343, 369, + 370, 371, 373, 375, 77, 81, 82, 83, 84, 85, + 86, 88, 183, 343, 373, 375, 385, 386, 387, 388, + 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, + 317, 28, 53, 55, 56, 59, 60, 61, 183, 237, + 327, 328, 329, 330, 331, 332, 333, 335, 337, 339, + 340, 342, 373, 375, 54, 57, 58, 183, 237, 331, + 337, 351, 352, 353, 354, 355, 357, 358, 359, 360, + 373, 375, 90, 91, 183, 264, 265, 266, 268, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 183, 373, 375, 438, 439, 440, 441, + 443, 445, 446, 448, 449, 450, 453, 455, 456, 457, + 458, 461, 125, 473, 474, 475, 6, 3, 4, 8, + 3, 189, 470, 464, 466, 468, 4, 3, 8, 201, + 4, 4, 389, 391, 393, 216, 218, 220, 4, 4, + 4, 4, 281, 318, 344, 310, 374, 376, 248, 415, + 257, 271, 4, 427, 435, 3, 8, 207, 209, 212, + 4, 3, 8, 293, 295, 297, 362, 291, 299, 301, + 4, 4, 305, 303, 378, 411, 3, 8, 372, 3, + 8, 409, 397, 399, 403, 401, 407, 405, 395, 8, + 3, 8, 334, 238, 4, 338, 336, 341, 4, 8, + 3, 356, 4, 4, 8, 3, 267, 269, 3, 8, + 4, 442, 444, 4, 447, 4, 4, 451, 454, 4, + 4, 4, 459, 462, 3, 8, 476, 3, 8, 168, + 168, 149, 4, 4, 4, 4, 4, 187, 4, 152, + 152, 4, 4, 4, 4, 4, 4, 150, 150, 150, + 150, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 150, 4, 4, 193, 4, 4, 4, 152, 203, + 4, 4, 4, 4, 4, 4, 4, 150, 152, 4, + 4, 4, 4, 289, 4, 370, 4, 4, 4, 4, + 4, 4, 4, 4, 387, 4, 4, 150, 4, 4, + 4, 152, 329, 4, 152, 152, 353, 4, 4, 265, + 152, 4, 4, 150, 4, 150, 150, 4, 4, 152, + 152, 152, 4, 4, 439, 4, 474, 4, 7, 7, + 168, 168, 168, 7, 149, 149, 149, 7, 7, 5, + 5, 5, 5, 5, 170, 172, 149, 5, 5, 5, + 7, 7, 7, 5, 179, 14, 15, 210, 17, 18, + 213, 149, 149, 149, 5, 149, 149, 149, 73, 74, + 75, 306, 149, 5, 7, 149, 179, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 168, 149, 149, 149, 15, 118, 452, 119, 120, + 121, 122, 123, 152, 460, 149, 5, 168, 192, 473, + 202, 28, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 183, 225, 226, 227, 230, 232, 234, 236, + 237, 239, 240, 241, 242, 243, 245, 225, 7, 221, + 222, 223, 7, 282, 283, 284, 7, 321, 322, 323, + 7, 345, 346, 347, 7, 311, 312, 313, 81, 82, + 83, 84, 86, 249, 250, 251, 252, 253, 254, 255, + 7, 416, 417, 7, 258, 259, 260, 93, 94, 95, + 96, 97, 98, 272, 273, 274, 275, 276, 277, 278, + 279, 101, 102, 183, 373, 375, 428, 429, 430, 432, + 438, 180, 7, 363, 364, 365, 7, 379, 380, 381, + 88, 412, 7, 477, 478, 8, 8, 8, 228, 231, + 233, 235, 4, 4, 4, 4, 4, 244, 246, 3, + 8, 8, 224, 6, 3, 285, 6, 3, 324, 6, + 3, 348, 6, 3, 314, 6, 3, 3, 6, 418, + 3, 6, 261, 6, 3, 4, 4, 4, 4, 4, + 4, 3, 8, 431, 433, 3, 8, 8, 149, 181, + 182, 366, 6, 3, 382, 6, 3, 413, 8, 479, + 3, 6, 4, 4, 4, 4, 150, 152, 150, 152, + 150, 4, 4, 226, 225, 223, 288, 284, 327, 323, + 351, 347, 183, 194, 195, 196, 199, 237, 280, 298, + 302, 304, 315, 316, 343, 373, 375, 388, 390, 392, + 410, 313, 250, 78, 183, 237, 317, 343, 373, 375, + 388, 390, 392, 419, 420, 421, 422, 423, 417, 264, + 260, 150, 150, 150, 150, 150, 150, 273, 4, 4, + 429, 6, 3, 369, 365, 385, 381, 4, 126, 128, + 129, 183, 237, 373, 375, 480, 481, 482, 483, 485, + 478, 29, 30, 31, 32, 229, 149, 149, 149, 149, + 149, 8, 8, 8, 8, 3, 8, 424, 8, 3, + 8, 149, 149, 149, 8, 8, 149, 486, 4, 484, + 3, 8, 316, 4, 421, 4, 150, 4, 481, 149, + 5, 149, 7, 487, 488, 489, 3, 6, 127, 130, + 131, 132, 490, 491, 492, 494, 495, 496, 488, 493, + 4, 4, 4, 3, 8, 4, 152, 150, 150, 491, + 149 }; const unsigned short int Dhcp4Parser::yyr1_[] = { - 0, 152, 154, 153, 155, 153, 156, 153, 157, 153, - 158, 153, 159, 153, 160, 153, 161, 153, 162, 153, - 163, 153, 164, 153, 165, 153, 166, 153, 167, 167, - 167, 167, 167, 167, 167, 168, 170, 169, 171, 172, - 172, 173, 173, 175, 174, 176, 176, 177, 177, 179, - 178, 180, 180, 181, 181, 182, 184, 183, 185, 185, - 186, 186, 186, 186, 186, 186, 188, 187, 190, 189, - 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 193, 194, - 195, 196, 197, 198, 200, 199, 201, 201, 202, 202, - 202, 202, 202, 202, 202, 204, 203, 206, 205, 208, - 207, 209, 209, 211, 210, 212, 212, 213, 215, 214, - 217, 216, 218, 218, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 221, 220, 222, - 222, 222, 222, 224, 223, 226, 225, 228, 227, 229, - 231, 230, 232, 233, 234, 235, 237, 236, 239, 238, - 241, 240, 242, 242, 243, 243, 243, 243, 243, 244, - 245, 246, 247, 248, 250, 249, 251, 251, 252, 252, - 254, 253, 256, 255, 257, 257, 257, 258, 258, 260, - 259, 262, 261, 264, 263, 265, 265, 266, 266, 266, - 266, 266, 266, 267, 268, 269, 270, 271, 272, 274, - 273, 275, 275, 276, 276, 278, 277, 280, 279, 281, - 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 284, 283, 286, 285, 288, - 287, 290, 289, 292, 291, 294, 293, 296, 295, 298, - 297, 299, 299, 299, 300, 301, 303, 302, 304, 304, - 305, 305, 307, 306, 308, 308, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 311, 310, 313, 312, 314, 314, 315, - 315, 317, 316, 319, 318, 320, 320, 321, 321, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 323, - 324, 325, 327, 326, 329, 328, 331, 330, 332, 334, - 333, 335, 337, 336, 338, 338, 339, 339, 341, 340, - 343, 342, 344, 344, 345, 345, 346, 346, 346, 346, - 346, 346, 346, 346, 346, 347, 349, 348, 350, 351, - 352, 353, 355, 354, 356, 356, 357, 357, 359, 358, - 361, 360, 362, 362, 363, 363, 363, 363, 363, 363, - 365, 364, 367, 366, 369, 368, 371, 370, 372, 372, - 373, 373, 375, 374, 377, 376, 378, 378, 379, 379, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 380, 380, 380, 380, 380, 382, 381, 384, 383, 386, - 385, 388, 387, 390, 389, 392, 391, 394, 393, 396, - 395, 398, 397, 400, 399, 402, 401, 404, 403, 406, - 405, 408, 407, 409, 409, 411, 410, 412, 412, 413, - 413, 414, 414, 414, 414, 414, 414, 414, 414, 414, - 414, 415, 417, 416, 418, 420, 419, 421, 421, 422, - 422, 422, 422, 422, 424, 423, 426, 425, 428, 427, - 430, 429, 431, 431, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, - 432, 433, 435, 434, 437, 436, 438, 440, 439, 441, - 442, 444, 443, 445, 445, 447, 446, 448, 449, 450, - 452, 451, 453, 453, 453, 453, 453, 455, 454, 457, - 456, 459, 458, 461, 460, 463, 462, 465, 464, 466, - 466, 467, 469, 468, 470, 470, 472, 471, 473, 473, - 474, 474, 474, 474, 474, 474, 474, 475, 477, 476, - 479, 478, 480, 480, 482, 481, 483, 483, 484, 484, - 484, 484, 486, 485, 487, 488, 489 + 0, 153, 155, 154, 156, 154, 157, 154, 158, 154, + 159, 154, 160, 154, 161, 154, 162, 154, 163, 154, + 164, 154, 165, 154, 166, 154, 167, 154, 168, 168, + 168, 168, 168, 168, 168, 169, 171, 170, 172, 173, + 173, 174, 174, 176, 175, 177, 177, 178, 178, 180, + 179, 181, 181, 182, 182, 183, 185, 184, 186, 186, + 187, 187, 187, 187, 187, 187, 189, 188, 191, 190, + 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, + 195, 196, 197, 198, 199, 201, 200, 202, 202, 203, + 203, 203, 203, 203, 203, 203, 205, 204, 207, 206, + 209, 208, 210, 210, 212, 211, 213, 213, 214, 216, + 215, 218, 217, 220, 219, 221, 221, 222, 222, 224, + 223, 225, 225, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 228, 227, 229, 229, + 229, 229, 231, 230, 233, 232, 235, 234, 236, 238, + 237, 239, 240, 241, 242, 244, 243, 246, 245, 248, + 247, 249, 249, 250, 250, 250, 250, 250, 251, 252, + 253, 254, 255, 257, 256, 258, 258, 259, 259, 261, + 260, 263, 262, 264, 264, 264, 265, 265, 267, 266, + 269, 268, 271, 270, 272, 272, 273, 273, 273, 273, + 273, 273, 274, 275, 276, 277, 278, 279, 281, 280, + 282, 282, 283, 283, 285, 284, 287, 286, 288, 288, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 291, 290, 293, 292, 295, 294, + 297, 296, 299, 298, 301, 300, 303, 302, 305, 304, + 306, 306, 306, 307, 308, 310, 309, 311, 311, 312, + 312, 314, 313, 315, 315, 316, 316, 316, 316, 316, + 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, + 316, 316, 318, 317, 320, 319, 321, 321, 322, 322, + 324, 323, 326, 325, 327, 327, 328, 328, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 330, 331, + 332, 334, 333, 336, 335, 338, 337, 339, 341, 340, + 342, 344, 343, 345, 345, 346, 346, 348, 347, 350, + 349, 351, 351, 352, 352, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 354, 356, 355, 357, 358, 359, + 360, 362, 361, 363, 363, 364, 364, 366, 365, 368, + 367, 369, 369, 370, 370, 370, 370, 370, 370, 372, + 371, 374, 373, 376, 375, 378, 377, 379, 379, 380, + 380, 382, 381, 384, 383, 385, 385, 386, 386, 387, + 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, + 387, 387, 387, 387, 389, 388, 391, 390, 393, 392, + 395, 394, 397, 396, 399, 398, 401, 400, 403, 402, + 405, 404, 407, 406, 409, 408, 411, 410, 413, 412, + 415, 414, 416, 416, 418, 417, 419, 419, 420, 420, + 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, + 422, 424, 423, 425, 427, 426, 428, 428, 429, 429, + 429, 429, 429, 431, 430, 433, 432, 435, 434, 437, + 436, 438, 438, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 440, 442, 441, 444, 443, 445, 447, 446, 448, 449, + 451, 450, 452, 452, 454, 453, 455, 456, 457, 459, + 458, 460, 460, 460, 460, 460, 462, 461, 464, 463, + 466, 465, 468, 467, 470, 469, 472, 471, 473, 473, + 474, 476, 475, 477, 477, 479, 478, 480, 480, 481, + 481, 481, 481, 481, 481, 481, 482, 484, 483, 486, + 485, 487, 487, 489, 488, 490, 490, 491, 491, 491, + 491, 493, 492, 494, 495, 496 }; const unsigned char @@ -4208,56 +4261,57 @@ namespace isc { namespace dhcp { 1, 1, 1, 1, 1, 1, 0, 6, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 3, 3, 0, 6, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 1, 1, 0, 4, 1, 1, 3, 0, 6, - 0, 6, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 3, - 0, 4, 3, 3, 3, 3, 0, 4, 0, 4, - 0, 6, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 6, 0, 1, 1, 3, - 0, 4, 0, 4, 1, 3, 1, 1, 1, 0, - 4, 0, 4, 0, 6, 1, 3, 1, 1, 1, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 0, - 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 3, 3, 3, 0, 6, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 1, 1, 0, 4, 1, 1, 3, 0, + 6, 0, 6, 0, 6, 0, 1, 1, 3, 0, + 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, + 1, 1, 0, 4, 0, 4, 0, 4, 3, 0, + 4, 3, 3, 3, 3, 0, 4, 0, 4, 0, + 6, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 6, 0, 1, 1, 3, 0, + 4, 0, 4, 1, 3, 1, 1, 1, 0, 4, + 0, 4, 0, 6, 1, 3, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 0, 6, + 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 1, 1, 1, 3, 3, 0, 6, 0, 1, - 1, 3, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 6, 0, 4, 0, 1, 1, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, + 1, 1, 1, 3, 3, 0, 6, 0, 1, 1, + 3, 0, 4, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 6, 0, 4, 0, 1, 1, 3, + 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 0, 4, 0, 4, 0, 4, 1, 0, 4, + 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, + 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 4, 1, 1, 3, + 3, 0, 6, 0, 1, 1, 3, 0, 4, 0, + 4, 1, 3, 1, 1, 1, 1, 1, 1, 0, + 4, 0, 4, 0, 4, 0, 6, 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 0, 4, 0, 4, 0, 4, 1, 0, - 4, 3, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, - 3, 3, 0, 6, 0, 1, 1, 3, 0, 4, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, - 0, 4, 0, 4, 0, 4, 0, 6, 0, 1, - 1, 3, 0, 4, 0, 4, 0, 1, 1, 3, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 6, 0, 4, + 0, 6, 1, 3, 0, 4, 0, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, - 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 4, 3, 0, 6, 1, 3, 1, - 1, 1, 1, 1, 0, 4, 0, 4, 0, 6, - 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 0, 4, 3, 0, 6, 1, 3, 1, 1, + 1, 1, 1, 0, 4, 0, 4, 0, 6, 0, + 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 0, 4, 0, 4, 3, 0, 4, 3, - 3, 0, 4, 1, 1, 0, 4, 3, 3, 3, - 0, 4, 1, 1, 1, 1, 1, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 6, 0, 4, 1, - 3, 1, 0, 6, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 3, 0, 4, - 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, - 1, 1, 0, 4, 3, 3, 3 + 3, 0, 4, 0, 4, 3, 0, 4, 3, 3, + 0, 4, 1, 1, 0, 4, 3, 3, 3, 0, + 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, + 1, 0, 6, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 3, 0, 4, 0, + 6, 1, 3, 0, 4, 1, 3, 1, 1, 1, + 1, 0, 4, 3, 3, 3 }; @@ -4274,188 +4328,190 @@ namespace isc { namespace dhcp { "\"use-routing\"", "\"re-detect\"", "\"echo-client-id\"", "\"match-client-id\"", "\"next-server\"", "\"server-hostname\"", "\"boot-file-name\"", "\"lease-database\"", "\"hosts-database\"", - "\"type\"", "\"memfile\"", "\"mysql\"", "\"postgresql\"", "\"cql\"", - "\"user\"", "\"password\"", "\"host\"", "\"port\"", "\"persist\"", - "\"lfc-interval\"", "\"readonly\"", "\"connect-timeout\"", - "\"contact-points\"", "\"keyspace\"", "\"valid-lifetime\"", - "\"renew-timer\"", "\"rebind-timer\"", "\"decline-probation-period\"", - "\"subnet4\"", "\"4o6-interface\"", "\"4o6-interface-id\"", - "\"4o6-subnet\"", "\"option-def\"", "\"option-data\"", "\"name\"", - "\"data\"", "\"code\"", "\"space\"", "\"csv-format\"", "\"always-send\"", - "\"record-types\"", "\"encapsulate\"", "\"array\"", - "\"shared-networks\"", "\"pools\"", "\"pool\"", "\"user-context\"", - "\"comment\"", "\"subnet\"", "\"interface\"", "\"interface-id\"", - "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", - "\"out-of-pool\"", "\"all\"", "\"host-reservation-identifiers\"", - "\"client-classes\"", "\"test\"", "\"client-class\"", "\"reservations\"", - "\"duid\"", "\"hw-address\"", "\"circuit-id\"", "\"client-id\"", - "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", - "\"hooks-libraries\"", "\"library\"", "\"parameters\"", - "\"expired-leases-processing\"", "\"reclaim-timer-wait-time\"", - "\"flush-reclaimed-timer-wait-time\"", "\"hold-reclaimed-time\"", - "\"max-reclaim-leases\"", "\"max-reclaim-time\"", - "\"unwarned-reclaim-cycles\"", "\"dhcp4o6-port\"", "\"control-socket\"", - "\"socket-type\"", "\"socket-name\"", "\"dhcp-ddns\"", - "\"enable-updates\"", "\"qualifying-suffix\"", "\"server-ip\"", - "\"server-port\"", "\"sender-ip\"", "\"sender-port\"", - "\"max-queue-size\"", "\"ncr-protocol\"", "\"ncr-format\"", - "\"always-include-fqdn\"", "\"override-no-update\"", - "\"override-client-update\"", "\"replace-client-name\"", - "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", "\"when-present\"", - "\"never\"", "\"always\"", "\"when-not-present\"", "\"Logging\"", - "\"loggers\"", "\"output_options\"", "\"output\"", "\"debuglevel\"", - "\"severity\"", "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp6\"", - "\"DhcpDdns\"", "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", - "SUB_DHCP4", "SUB_INTERFACES4", "SUB_SUBNET4", "SUB_POOL4", - "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", - "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", "SUB_LOGGING", - "\"constant string\"", "\"integer\"", "\"floating point\"", - "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", - "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", "value", - "sub_json", "map2", "$@14", "map_value", "map_content", "not_empty_map", - "list_generic", "$@15", "list_content", "not_empty_list", "list_strings", - "$@16", "list_strings_content", "not_empty_list_strings", - "unknown_map_entry", "syntax_map", "$@17", "global_objects", - "global_object", "dhcp4_object", "$@18", "sub_dhcp4", "$@19", - "global_params", "global_param", "valid_lifetime", "renew_timer", + "\"hosts-databases\"", "\"type\"", "\"memfile\"", "\"mysql\"", + "\"postgresql\"", "\"cql\"", "\"user\"", "\"password\"", "\"host\"", + "\"port\"", "\"persist\"", "\"lfc-interval\"", "\"readonly\"", + "\"connect-timeout\"", "\"contact-points\"", "\"keyspace\"", + "\"valid-lifetime\"", "\"renew-timer\"", "\"rebind-timer\"", + "\"decline-probation-period\"", "\"subnet4\"", "\"4o6-interface\"", + "\"4o6-interface-id\"", "\"4o6-subnet\"", "\"option-def\"", + "\"option-data\"", "\"name\"", "\"data\"", "\"code\"", "\"space\"", + "\"csv-format\"", "\"always-send\"", "\"record-types\"", + "\"encapsulate\"", "\"array\"", "\"shared-networks\"", "\"pools\"", + "\"pool\"", "\"user-context\"", "\"comment\"", "\"subnet\"", + "\"interface\"", "\"interface-id\"", "\"id\"", "\"rapid-commit\"", + "\"reservation-mode\"", "\"disabled\"", "\"out-of-pool\"", "\"all\"", + "\"host-reservation-identifiers\"", "\"client-classes\"", "\"test\"", + "\"client-class\"", "\"reservations\"", "\"duid\"", "\"hw-address\"", + "\"circuit-id\"", "\"client-id\"", "\"hostname\"", "\"flex-id\"", + "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", "\"library\"", + "\"parameters\"", "\"expired-leases-processing\"", + "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"", + "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"", + "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"", + "\"dhcp4o6-port\"", "\"control-socket\"", "\"socket-type\"", + "\"socket-name\"", "\"dhcp-ddns\"", "\"enable-updates\"", + "\"qualifying-suffix\"", "\"server-ip\"", "\"server-port\"", + "\"sender-ip\"", "\"sender-port\"", "\"max-queue-size\"", + "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", + "\"override-no-update\"", "\"override-client-update\"", + "\"replace-client-name\"", "\"generated-prefix\"", "\"tcp\"", "\"JSON\"", + "\"when-present\"", "\"never\"", "\"always\"", "\"when-not-present\"", + "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", + "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", + "\"maxver\"", "\"Dhcp6\"", "\"DhcpDdns\"", "\"Control-agent\"", + "TOPLEVEL_JSON", "TOPLEVEL_DHCP4", "SUB_DHCP4", "SUB_INTERFACES4", + "SUB_SUBNET4", "SUB_POOL4", "SUB_RESERVATION", "SUB_OPTION_DEFS", + "SUB_OPTION_DEF", "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", + "SUB_DHCP_DDNS", "SUB_LOGGING", "\"constant string\"", "\"integer\"", + "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2", + "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", + "$@13", "value", "sub_json", "map2", "$@14", "map_value", "map_content", + "not_empty_map", "list_generic", "$@15", "list_content", + "not_empty_list", "list_strings", "$@16", "list_strings_content", + "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@17", + "global_objects", "global_object", "dhcp4_object", "$@18", "sub_dhcp4", + "$@19", "global_params", "global_param", "valid_lifetime", "renew_timer", "rebind_timer", "decline_probation_period", "echo_client_id", "match_client_id", "interfaces_config", "$@20", "interfaces_config_params", "interfaces_config_param", "sub_interfaces4", "$@21", "interfaces_list", "$@22", "dhcp_socket_type", "$@23", "socket_type", "outbound_interface", "$@24", "outbound_interface_value", "re_detect", "lease_database", "$@25", "hosts_database", "$@26", - "database_map_params", "database_map_param", "database_type", "$@27", - "db_type", "user", "$@28", "password", "$@29", "host", "$@30", "port", - "name", "$@31", "persist", "lfc_interval", "readonly", "connect_timeout", - "contact_points", "$@32", "keyspace", "$@33", - "host_reservation_identifiers", "$@34", + "hosts_databases", "$@27", "database_list", "not_empty_database_list", + "database", "$@28", "database_map_params", "database_map_param", + "database_type", "$@29", "db_type", "user", "$@30", "password", "$@31", + "host", "$@32", "port", "name", "$@33", "persist", "lfc_interval", + "readonly", "connect_timeout", "contact_points", "$@34", "keyspace", + "$@35", "host_reservation_identifiers", "$@36", "host_reservation_identifiers_list", "host_reservation_identifier", "duid_id", "hw_address_id", "circuit_id", "client_id", "flex_id", - "hooks_libraries", "$@35", "hooks_libraries_list", - "not_empty_hooks_libraries_list", "hooks_library", "$@36", - "sub_hooks_library", "$@37", "hooks_params", "hooks_param", "library", - "$@38", "parameters", "$@39", "expired_leases_processing", "$@40", + "hooks_libraries", "$@37", "hooks_libraries_list", + "not_empty_hooks_libraries_list", "hooks_library", "$@38", + "sub_hooks_library", "$@39", "hooks_params", "hooks_param", "library", + "$@40", "parameters", "$@41", "expired_leases_processing", "$@42", "expired_leases_params", "expired_leases_param", "reclaim_timer_wait_time", "flush_reclaimed_timer_wait_time", "hold_reclaimed_time", "max_reclaim_leases", "max_reclaim_time", - "unwarned_reclaim_cycles", "subnet4_list", "$@41", - "subnet4_list_content", "not_empty_subnet4_list", "subnet4", "$@42", - "sub_subnet4", "$@43", "subnet4_params", "subnet4_param", "subnet", - "$@44", "subnet_4o6_interface", "$@45", "subnet_4o6_interface_id", - "$@46", "subnet_4o6_subnet", "$@47", "interface", "$@48", "interface_id", - "$@49", "client_class", "$@50", "reservation_mode", "$@51", "hr_mode", - "id", "rapid_commit", "shared_networks", "$@52", + "unwarned_reclaim_cycles", "subnet4_list", "$@43", + "subnet4_list_content", "not_empty_subnet4_list", "subnet4", "$@44", + "sub_subnet4", "$@45", "subnet4_params", "subnet4_param", "subnet", + "$@46", "subnet_4o6_interface", "$@47", "subnet_4o6_interface_id", + "$@48", "subnet_4o6_subnet", "$@49", "interface", "$@50", "interface_id", + "$@51", "client_class", "$@52", "reservation_mode", "$@53", "hr_mode", + "id", "rapid_commit", "shared_networks", "$@54", "shared_networks_content", "shared_networks_list", "shared_network", - "$@53", "shared_network_params", "shared_network_param", - "option_def_list", "$@54", "sub_option_def_list", "$@55", + "$@55", "shared_network_params", "shared_network_param", + "option_def_list", "$@56", "sub_option_def_list", "$@57", "option_def_list_content", "not_empty_option_def_list", - "option_def_entry", "$@56", "sub_option_def", "$@57", + "option_def_entry", "$@58", "sub_option_def", "$@59", "option_def_params", "not_empty_option_def_params", "option_def_param", - "option_def_name", "code", "option_def_code", "option_def_type", "$@58", - "option_def_record_types", "$@59", "space", "$@60", "option_def_space", - "option_def_encapsulate", "$@61", "option_def_array", "option_data_list", - "$@62", "option_data_list_content", "not_empty_option_data_list", - "option_data_entry", "$@63", "sub_option_data", "$@64", + "option_def_name", "code", "option_def_code", "option_def_type", "$@60", + "option_def_record_types", "$@61", "space", "$@62", "option_def_space", + "option_def_encapsulate", "$@63", "option_def_array", "option_data_list", + "$@64", "option_data_list_content", "not_empty_option_data_list", + "option_data_entry", "$@65", "sub_option_data", "$@66", "option_data_params", "not_empty_option_data_params", - "option_data_param", "option_data_name", "option_data_data", "$@65", + "option_data_param", "option_data_name", "option_data_data", "$@67", "option_data_code", "option_data_space", "option_data_csv_format", - "option_data_always_send", "pools_list", "$@66", "pools_list_content", - "not_empty_pools_list", "pool_list_entry", "$@67", "sub_pool4", "$@68", - "pool_params", "pool_param", "pool_entry", "$@69", "user_context", - "$@70", "comment", "$@71", "reservations", "$@72", "reservations_list", - "not_empty_reservations_list", "reservation", "$@73", "sub_reservation", - "$@74", "reservation_params", "not_empty_reservation_params", - "reservation_param", "next_server", "$@75", "server_hostname", "$@76", - "boot_file_name", "$@77", "ip_address", "$@78", "duid", "$@79", - "hw_address", "$@80", "client_id_value", "$@81", "circuit_id_value", - "$@82", "flex_id_value", "$@83", "hostname", "$@84", - "reservation_client_classes", "$@85", "relay", "$@86", "relay_map", - "$@87", "client_classes", "$@88", "client_classes_list", - "client_class_entry", "$@89", "client_class_params", + "option_data_always_send", "pools_list", "$@68", "pools_list_content", + "not_empty_pools_list", "pool_list_entry", "$@69", "sub_pool4", "$@70", + "pool_params", "pool_param", "pool_entry", "$@71", "user_context", + "$@72", "comment", "$@73", "reservations", "$@74", "reservations_list", + "not_empty_reservations_list", "reservation", "$@75", "sub_reservation", + "$@76", "reservation_params", "not_empty_reservation_params", + "reservation_param", "next_server", "$@77", "server_hostname", "$@78", + "boot_file_name", "$@79", "ip_address", "$@80", "duid", "$@81", + "hw_address", "$@82", "client_id_value", "$@83", "circuit_id_value", + "$@84", "flex_id_value", "$@85", "hostname", "$@86", + "reservation_client_classes", "$@87", "relay", "$@88", "relay_map", + "$@89", "client_classes", "$@90", "client_classes_list", + "client_class_entry", "$@91", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@90", "dhcp4o6_port", - "control_socket", "$@91", "control_socket_params", - "control_socket_param", "control_socket_type", "$@92", - "control_socket_name", "$@93", "dhcp_ddns", "$@94", "sub_dhcp_ddns", - "$@95", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", - "qualifying_suffix", "$@96", "server_ip", "$@97", "server_port", - "sender_ip", "$@98", "sender_port", "max_queue_size", "ncr_protocol", - "$@99", "ncr_protocol_value", "ncr_format", "$@100", + "client_class_name", "client_class_test", "$@92", "dhcp4o6_port", + "control_socket", "$@93", "control_socket_params", + "control_socket_param", "control_socket_type", "$@94", + "control_socket_name", "$@95", "dhcp_ddns", "$@96", "sub_dhcp_ddns", + "$@97", "dhcp_ddns_params", "dhcp_ddns_param", "enable_updates", + "qualifying_suffix", "$@98", "server_ip", "$@99", "server_port", + "sender_ip", "$@100", "sender_port", "max_queue_size", "ncr_protocol", + "$@101", "ncr_protocol_value", "ncr_format", "$@102", "always_include_fqdn", "override_no_update", "override_client_update", - "replace_client_name", "$@101", "replace_client_name_value", - "generated_prefix", "$@102", "dhcp6_json_object", "$@103", - "dhcpddns_json_object", "$@104", "control_agent_json_object", "$@105", - "logging_object", "$@106", "sub_logging", "$@107", "logging_params", - "logging_param", "loggers", "$@108", "loggers_entries", "logger_entry", - "$@109", "logger_params", "logger_param", "debuglevel", "severity", - "$@110", "output_options_list", "$@111", "output_options_list_content", - "output_entry", "$@112", "output_params_list", "output_params", "output", - "$@113", "flush", "maxsize", "maxver", YY_NULLPTR + "replace_client_name", "$@103", "replace_client_name_value", + "generated_prefix", "$@104", "dhcp6_json_object", "$@105", + "dhcpddns_json_object", "$@106", "control_agent_json_object", "$@107", + "logging_object", "$@108", "sub_logging", "$@109", "logging_params", + "logging_param", "loggers", "$@110", "loggers_entries", "logger_entry", + "$@111", "logger_params", "logger_param", "debuglevel", "severity", + "$@112", "output_options_list", "$@113", "output_options_list_content", + "output_entry", "$@114", "output_params_list", "output_params", "output", + "$@115", "flush", "maxsize", "maxver", YY_NULLPTR }; #if PARSER4_DEBUG const unsigned short int Dhcp4Parser::yyrline_[] = { - 0, 235, 235, 235, 236, 236, 237, 237, 238, 238, - 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, - 244, 244, 245, 245, 246, 246, 247, 247, 255, 256, - 257, 258, 259, 260, 261, 264, 269, 269, 280, 283, - 284, 287, 291, 298, 298, 305, 306, 309, 313, 320, - 320, 327, 328, 331, 335, 346, 356, 356, 372, 373, - 377, 378, 379, 380, 381, 382, 385, 385, 400, 400, - 409, 410, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 443, 448, - 453, 458, 463, 468, 474, 474, 485, 486, 489, 490, - 491, 492, 493, 494, 495, 498, 498, 507, 507, 517, - 517, 524, 525, 528, 528, 535, 537, 541, 547, 547, - 559, 559, 571, 572, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 590, 590, 597, - 598, 599, 600, 603, 603, 611, 611, 619, 619, 627, - 632, 632, 640, 645, 650, 655, 660, 660, 668, 668, - 677, 677, 687, 688, 691, 692, 693, 694, 695, 698, - 703, 708, 713, 718, 723, 723, 733, 734, 737, 738, - 741, 741, 751, 751, 761, 762, 763, 766, 767, 770, - 770, 778, 778, 786, 786, 797, 798, 801, 802, 803, - 804, 805, 806, 809, 814, 819, 824, 829, 834, 842, - 842, 855, 856, 859, 860, 867, 867, 893, 893, 904, - 905, 909, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 930, 931, 932, 935, 935, 943, 943, 951, - 951, 959, 959, 967, 967, 975, 975, 983, 983, 991, - 991, 998, 999, 1000, 1003, 1008, 1015, 1015, 1026, 1027, - 1031, 1032, 1035, 1035, 1043, 1044, 1047, 1048, 1049, 1050, - 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, - 1061, 1062, 1063, 1070, 1070, 1083, 1083, 1092, 1093, 1096, - 1097, 1102, 1102, 1117, 1117, 1131, 1132, 1135, 1136, 1139, - 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1151, - 1153, 1158, 1160, 1160, 1168, 1168, 1176, 1176, 1184, 1186, - 1186, 1194, 1203, 1203, 1215, 1216, 1221, 1222, 1227, 1227, - 1239, 1239, 1251, 1252, 1257, 1258, 1263, 1264, 1265, 1266, - 1267, 1268, 1269, 1270, 1271, 1274, 1276, 1276, 1284, 1286, - 1288, 1293, 1301, 1301, 1313, 1314, 1317, 1318, 1321, 1321, - 1331, 1331, 1341, 1342, 1345, 1346, 1347, 1348, 1349, 1350, - 1353, 1353, 1361, 1361, 1386, 1386, 1416, 1416, 1426, 1427, - 1430, 1431, 1434, 1434, 1443, 1443, 1452, 1453, 1456, 1457, - 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, - 1471, 1472, 1473, 1474, 1475, 1478, 1478, 1486, 1486, 1494, - 1494, 1502, 1502, 1510, 1510, 1518, 1518, 1526, 1526, 1534, - 1534, 1542, 1542, 1550, 1550, 1558, 1558, 1571, 1571, 1581, - 1581, 1592, 1592, 1602, 1603, 1606, 1606, 1616, 1617, 1620, - 1621, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, - 1633, 1636, 1638, 1638, 1650, 1657, 1657, 1667, 1668, 1671, - 1672, 1673, 1674, 1675, 1678, 1678, 1686, 1686, 1696, 1696, - 1708, 1708, 1718, 1719, 1722, 1723, 1724, 1725, 1726, 1727, - 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, - 1738, 1741, 1746, 1746, 1754, 1754, 1762, 1767, 1767, 1775, - 1780, 1785, 1785, 1793, 1794, 1797, 1797, 1805, 1810, 1815, - 1820, 1820, 1828, 1831, 1834, 1837, 1840, 1846, 1846, 1856, - 1856, 1863, 1863, 1870, 1870, 1882, 1882, 1892, 1892, 1903, - 1904, 1908, 1912, 1912, 1924, 1925, 1929, 1929, 1937, 1938, - 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1950, 1955, 1955, - 1963, 1963, 1973, 1974, 1977, 1977, 1985, 1986, 1989, 1990, - 1991, 1992, 1995, 1995, 2003, 2008, 2013 + 0, 236, 236, 236, 237, 237, 238, 238, 239, 239, + 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, + 245, 245, 246, 246, 247, 247, 248, 248, 256, 257, + 258, 259, 260, 261, 262, 265, 270, 270, 281, 284, + 285, 288, 292, 299, 299, 306, 307, 310, 314, 321, + 321, 328, 329, 332, 336, 347, 357, 357, 373, 374, + 378, 379, 380, 381, 382, 383, 386, 386, 401, 401, + 410, 411, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 445, + 450, 455, 460, 465, 470, 476, 476, 487, 488, 491, + 492, 493, 494, 495, 496, 497, 500, 500, 509, 509, + 519, 519, 526, 527, 530, 530, 537, 539, 543, 549, + 549, 561, 561, 573, 573, 583, 584, 587, 588, 591, + 591, 601, 602, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 620, 620, 627, 628, + 629, 630, 633, 633, 641, 641, 649, 649, 657, 662, + 662, 670, 675, 680, 685, 690, 690, 698, 698, 707, + 707, 717, 718, 721, 722, 723, 724, 725, 728, 733, + 738, 743, 748, 753, 753, 763, 764, 767, 768, 771, + 771, 781, 781, 791, 792, 793, 796, 797, 800, 800, + 808, 808, 816, 816, 827, 828, 831, 832, 833, 834, + 835, 836, 839, 844, 849, 854, 859, 864, 872, 872, + 885, 886, 889, 890, 897, 897, 923, 923, 934, 935, + 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 965, 965, 973, 973, 981, 981, + 989, 989, 997, 997, 1005, 1005, 1013, 1013, 1021, 1021, + 1028, 1029, 1030, 1033, 1038, 1045, 1045, 1056, 1057, 1061, + 1062, 1065, 1065, 1073, 1074, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1100, 1100, 1113, 1113, 1122, 1123, 1126, 1127, + 1132, 1132, 1147, 1147, 1161, 1162, 1165, 1166, 1169, 1170, + 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1181, 1183, + 1188, 1190, 1190, 1198, 1198, 1206, 1206, 1214, 1216, 1216, + 1224, 1233, 1233, 1245, 1246, 1251, 1252, 1257, 1257, 1269, + 1269, 1281, 1282, 1287, 1288, 1293, 1294, 1295, 1296, 1297, + 1298, 1299, 1300, 1301, 1304, 1306, 1306, 1314, 1316, 1318, + 1323, 1331, 1331, 1343, 1344, 1347, 1348, 1351, 1351, 1361, + 1361, 1371, 1372, 1375, 1376, 1377, 1378, 1379, 1380, 1383, + 1383, 1391, 1391, 1416, 1416, 1446, 1446, 1456, 1457, 1460, + 1461, 1464, 1464, 1473, 1473, 1482, 1483, 1486, 1487, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1508, 1508, 1516, 1516, 1524, 1524, + 1532, 1532, 1540, 1540, 1548, 1548, 1556, 1556, 1564, 1564, + 1572, 1572, 1580, 1580, 1588, 1588, 1601, 1601, 1611, 1611, + 1622, 1622, 1632, 1633, 1636, 1636, 1646, 1647, 1650, 1651, + 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, + 1666, 1668, 1668, 1680, 1687, 1687, 1697, 1698, 1701, 1702, + 1703, 1704, 1705, 1708, 1708, 1716, 1716, 1726, 1726, 1738, + 1738, 1748, 1749, 1752, 1753, 1754, 1755, 1756, 1757, 1758, + 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, + 1771, 1776, 1776, 1784, 1784, 1792, 1797, 1797, 1805, 1810, + 1815, 1815, 1823, 1824, 1827, 1827, 1835, 1840, 1845, 1850, + 1850, 1858, 1861, 1864, 1867, 1870, 1876, 1876, 1886, 1886, + 1893, 1893, 1900, 1900, 1912, 1912, 1922, 1922, 1933, 1934, + 1938, 1942, 1942, 1954, 1955, 1959, 1959, 1967, 1968, 1971, + 1972, 1973, 1974, 1975, 1976, 1977, 1980, 1985, 1985, 1993, + 1993, 2003, 2004, 2007, 2007, 2015, 2016, 2019, 2020, 2021, + 2022, 2025, 2025, 2033, 2038, 2043 }; // Print the state stack on the debug stream. @@ -4490,8 +4546,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4494 "dhcp4_parser.cc" // lalr1.cc:1167 -#line 2018 "dhcp4_parser.yy" // lalr1.cc:1168 +#line 4550 "dhcp4_parser.cc" // lalr1.cc:1167 +#line 2048 "dhcp4_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp4/dhcp4_parser.h b/src/bin/dhcp4/dhcp4_parser.h index 456b8b3b1d..f385014e71 100644 --- a/src/bin/dhcp4/dhcp4_parser.h +++ b/src/bin/dhcp4/dhcp4_parser.h @@ -372,131 +372,132 @@ namespace isc { namespace dhcp { TOKEN_BOOT_FILE_NAME = 279, TOKEN_LEASE_DATABASE = 280, TOKEN_HOSTS_DATABASE = 281, - TOKEN_TYPE = 282, - TOKEN_MEMFILE = 283, - TOKEN_MYSQL = 284, - TOKEN_POSTGRESQL = 285, - TOKEN_CQL = 286, - TOKEN_USER = 287, - TOKEN_PASSWORD = 288, - TOKEN_HOST = 289, - TOKEN_PORT = 290, - TOKEN_PERSIST = 291, - TOKEN_LFC_INTERVAL = 292, - TOKEN_READONLY = 293, - TOKEN_CONNECT_TIMEOUT = 294, - TOKEN_CONTACT_POINTS = 295, - TOKEN_KEYSPACE = 296, - TOKEN_VALID_LIFETIME = 297, - TOKEN_RENEW_TIMER = 298, - TOKEN_REBIND_TIMER = 299, - TOKEN_DECLINE_PROBATION_PERIOD = 300, - TOKEN_SUBNET4 = 301, - TOKEN_SUBNET_4O6_INTERFACE = 302, - TOKEN_SUBNET_4O6_INTERFACE_ID = 303, - TOKEN_SUBNET_4O6_SUBNET = 304, - TOKEN_OPTION_DEF = 305, - TOKEN_OPTION_DATA = 306, - TOKEN_NAME = 307, - TOKEN_DATA = 308, - TOKEN_CODE = 309, - TOKEN_SPACE = 310, - TOKEN_CSV_FORMAT = 311, - TOKEN_ALWAYS_SEND = 312, - TOKEN_RECORD_TYPES = 313, - TOKEN_ENCAPSULATE = 314, - TOKEN_ARRAY = 315, - TOKEN_SHARED_NETWORKS = 316, - TOKEN_POOLS = 317, - TOKEN_POOL = 318, - TOKEN_USER_CONTEXT = 319, - TOKEN_COMMENT = 320, - TOKEN_SUBNET = 321, - TOKEN_INTERFACE = 322, - TOKEN_INTERFACE_ID = 323, - TOKEN_ID = 324, - TOKEN_RAPID_COMMIT = 325, - TOKEN_RESERVATION_MODE = 326, - TOKEN_DISABLED = 327, - TOKEN_OUT_OF_POOL = 328, - TOKEN_ALL = 329, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 330, - TOKEN_CLIENT_CLASSES = 331, - TOKEN_TEST = 332, - TOKEN_CLIENT_CLASS = 333, - TOKEN_RESERVATIONS = 334, - TOKEN_DUID = 335, - TOKEN_HW_ADDRESS = 336, - TOKEN_CIRCUIT_ID = 337, - TOKEN_CLIENT_ID = 338, - TOKEN_HOSTNAME = 339, - TOKEN_FLEX_ID = 340, - TOKEN_RELAY = 341, - TOKEN_IP_ADDRESS = 342, - TOKEN_HOOKS_LIBRARIES = 343, - TOKEN_LIBRARY = 344, - TOKEN_PARAMETERS = 345, - TOKEN_EXPIRED_LEASES_PROCESSING = 346, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 347, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 348, - TOKEN_HOLD_RECLAIMED_TIME = 349, - TOKEN_MAX_RECLAIM_LEASES = 350, - TOKEN_MAX_RECLAIM_TIME = 351, - TOKEN_UNWARNED_RECLAIM_CYCLES = 352, - TOKEN_DHCP4O6_PORT = 353, - TOKEN_CONTROL_SOCKET = 354, - TOKEN_SOCKET_TYPE = 355, - TOKEN_SOCKET_NAME = 356, - TOKEN_DHCP_DDNS = 357, - TOKEN_ENABLE_UPDATES = 358, - TOKEN_QUALIFYING_SUFFIX = 359, - TOKEN_SERVER_IP = 360, - TOKEN_SERVER_PORT = 361, - TOKEN_SENDER_IP = 362, - TOKEN_SENDER_PORT = 363, - TOKEN_MAX_QUEUE_SIZE = 364, - TOKEN_NCR_PROTOCOL = 365, - TOKEN_NCR_FORMAT = 366, - TOKEN_ALWAYS_INCLUDE_FQDN = 367, - TOKEN_OVERRIDE_NO_UPDATE = 368, - TOKEN_OVERRIDE_CLIENT_UPDATE = 369, - TOKEN_REPLACE_CLIENT_NAME = 370, - TOKEN_GENERATED_PREFIX = 371, - TOKEN_TCP = 372, - TOKEN_JSON = 373, - TOKEN_WHEN_PRESENT = 374, - TOKEN_NEVER = 375, - TOKEN_ALWAYS = 376, - TOKEN_WHEN_NOT_PRESENT = 377, - TOKEN_LOGGING = 378, - TOKEN_LOGGERS = 379, - TOKEN_OUTPUT_OPTIONS = 380, - TOKEN_OUTPUT = 381, - TOKEN_DEBUGLEVEL = 382, - TOKEN_SEVERITY = 383, - TOKEN_FLUSH = 384, - TOKEN_MAXSIZE = 385, - TOKEN_MAXVER = 386, - TOKEN_DHCP6 = 387, - TOKEN_DHCPDDNS = 388, - TOKEN_CONTROL_AGENT = 389, - TOKEN_TOPLEVEL_JSON = 390, - TOKEN_TOPLEVEL_DHCP4 = 391, - TOKEN_SUB_DHCP4 = 392, - TOKEN_SUB_INTERFACES4 = 393, - TOKEN_SUB_SUBNET4 = 394, - TOKEN_SUB_POOL4 = 395, - TOKEN_SUB_RESERVATION = 396, - TOKEN_SUB_OPTION_DEFS = 397, - TOKEN_SUB_OPTION_DEF = 398, - TOKEN_SUB_OPTION_DATA = 399, - TOKEN_SUB_HOOKS_LIBRARY = 400, - TOKEN_SUB_DHCP_DDNS = 401, - TOKEN_SUB_LOGGING = 402, - TOKEN_STRING = 403, - TOKEN_INTEGER = 404, - TOKEN_FLOAT = 405, - TOKEN_BOOLEAN = 406 + TOKEN_HOSTS_DATABASES = 282, + TOKEN_TYPE = 283, + TOKEN_MEMFILE = 284, + TOKEN_MYSQL = 285, + TOKEN_POSTGRESQL = 286, + TOKEN_CQL = 287, + TOKEN_USER = 288, + TOKEN_PASSWORD = 289, + TOKEN_HOST = 290, + TOKEN_PORT = 291, + TOKEN_PERSIST = 292, + TOKEN_LFC_INTERVAL = 293, + TOKEN_READONLY = 294, + TOKEN_CONNECT_TIMEOUT = 295, + TOKEN_CONTACT_POINTS = 296, + TOKEN_KEYSPACE = 297, + TOKEN_VALID_LIFETIME = 298, + TOKEN_RENEW_TIMER = 299, + TOKEN_REBIND_TIMER = 300, + TOKEN_DECLINE_PROBATION_PERIOD = 301, + TOKEN_SUBNET4 = 302, + TOKEN_SUBNET_4O6_INTERFACE = 303, + TOKEN_SUBNET_4O6_INTERFACE_ID = 304, + TOKEN_SUBNET_4O6_SUBNET = 305, + TOKEN_OPTION_DEF = 306, + TOKEN_OPTION_DATA = 307, + TOKEN_NAME = 308, + TOKEN_DATA = 309, + TOKEN_CODE = 310, + TOKEN_SPACE = 311, + TOKEN_CSV_FORMAT = 312, + TOKEN_ALWAYS_SEND = 313, + TOKEN_RECORD_TYPES = 314, + TOKEN_ENCAPSULATE = 315, + TOKEN_ARRAY = 316, + TOKEN_SHARED_NETWORKS = 317, + TOKEN_POOLS = 318, + TOKEN_POOL = 319, + TOKEN_USER_CONTEXT = 320, + TOKEN_COMMENT = 321, + TOKEN_SUBNET = 322, + TOKEN_INTERFACE = 323, + TOKEN_INTERFACE_ID = 324, + TOKEN_ID = 325, + TOKEN_RAPID_COMMIT = 326, + TOKEN_RESERVATION_MODE = 327, + TOKEN_DISABLED = 328, + TOKEN_OUT_OF_POOL = 329, + TOKEN_ALL = 330, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 331, + TOKEN_CLIENT_CLASSES = 332, + TOKEN_TEST = 333, + TOKEN_CLIENT_CLASS = 334, + TOKEN_RESERVATIONS = 335, + TOKEN_DUID = 336, + TOKEN_HW_ADDRESS = 337, + TOKEN_CIRCUIT_ID = 338, + TOKEN_CLIENT_ID = 339, + TOKEN_HOSTNAME = 340, + TOKEN_FLEX_ID = 341, + TOKEN_RELAY = 342, + TOKEN_IP_ADDRESS = 343, + TOKEN_HOOKS_LIBRARIES = 344, + TOKEN_LIBRARY = 345, + TOKEN_PARAMETERS = 346, + TOKEN_EXPIRED_LEASES_PROCESSING = 347, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 348, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 349, + TOKEN_HOLD_RECLAIMED_TIME = 350, + TOKEN_MAX_RECLAIM_LEASES = 351, + TOKEN_MAX_RECLAIM_TIME = 352, + TOKEN_UNWARNED_RECLAIM_CYCLES = 353, + TOKEN_DHCP4O6_PORT = 354, + TOKEN_CONTROL_SOCKET = 355, + TOKEN_SOCKET_TYPE = 356, + TOKEN_SOCKET_NAME = 357, + TOKEN_DHCP_DDNS = 358, + TOKEN_ENABLE_UPDATES = 359, + TOKEN_QUALIFYING_SUFFIX = 360, + TOKEN_SERVER_IP = 361, + TOKEN_SERVER_PORT = 362, + TOKEN_SENDER_IP = 363, + TOKEN_SENDER_PORT = 364, + TOKEN_MAX_QUEUE_SIZE = 365, + TOKEN_NCR_PROTOCOL = 366, + TOKEN_NCR_FORMAT = 367, + TOKEN_ALWAYS_INCLUDE_FQDN = 368, + TOKEN_OVERRIDE_NO_UPDATE = 369, + TOKEN_OVERRIDE_CLIENT_UPDATE = 370, + TOKEN_REPLACE_CLIENT_NAME = 371, + TOKEN_GENERATED_PREFIX = 372, + TOKEN_TCP = 373, + TOKEN_JSON = 374, + TOKEN_WHEN_PRESENT = 375, + TOKEN_NEVER = 376, + TOKEN_ALWAYS = 377, + TOKEN_WHEN_NOT_PRESENT = 378, + TOKEN_LOGGING = 379, + TOKEN_LOGGERS = 380, + TOKEN_OUTPUT_OPTIONS = 381, + TOKEN_OUTPUT = 382, + TOKEN_DEBUGLEVEL = 383, + TOKEN_SEVERITY = 384, + TOKEN_FLUSH = 385, + TOKEN_MAXSIZE = 386, + TOKEN_MAXVER = 387, + TOKEN_DHCP6 = 388, + TOKEN_DHCPDDNS = 389, + TOKEN_CONTROL_AGENT = 390, + TOKEN_TOPLEVEL_JSON = 391, + TOKEN_TOPLEVEL_DHCP4 = 392, + TOKEN_SUB_DHCP4 = 393, + TOKEN_SUB_INTERFACES4 = 394, + TOKEN_SUB_SUBNET4 = 395, + TOKEN_SUB_POOL4 = 396, + TOKEN_SUB_RESERVATION = 397, + TOKEN_SUB_OPTION_DEFS = 398, + TOKEN_SUB_OPTION_DEF = 399, + TOKEN_SUB_OPTION_DATA = 400, + TOKEN_SUB_HOOKS_LIBRARY = 401, + TOKEN_SUB_DHCP_DDNS = 402, + TOKEN_SUB_LOGGING = 403, + TOKEN_STRING = 404, + TOKEN_INTEGER = 405, + TOKEN_FLOAT = 406, + TOKEN_BOOLEAN = 407 }; }; @@ -711,6 +712,10 @@ namespace isc { namespace dhcp { symbol_type make_HOSTS_DATABASE (const location_type& l); + static inline + symbol_type + make_HOSTS_DATABASES (const location_type& l); + static inline symbol_type make_TYPE (const location_type& l); @@ -1416,12 +1421,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 886, ///< Last index in yytable_. - yynnts_ = 338, ///< Number of nonterminal symbols. + yylast_ = 903, ///< Last index in yytable_. + yynnts_ = 344, ///< Number of nonterminal symbols. yyfinal_ = 28, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 152 ///< Number of tokens. + yyntokens_ = 153 ///< Number of tokens. }; @@ -1478,9 +1483,9 @@ namespace isc { namespace dhcp { 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151 + 145, 146, 147, 148, 149, 150, 151, 152 }; - const unsigned int user_token_number_max_ = 406; + const unsigned int user_token_number_max_ = 407; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1513,30 +1518,30 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 151: // "boolean" + case 152: // "boolean" value.copy< bool > (other.value); break; - case 150: // "floating point" + case 151: // "floating point" value.copy< double > (other.value); break; - case 149: // "integer" + case 150: // "integer" value.copy< int64_t > (other.value); break; - case 148: // "constant string" + case 149: // "constant string" value.copy< std::string > (other.value); break; @@ -1557,30 +1562,30 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 151: // "boolean" + case 152: // "boolean" value.copy< bool > (v); break; - case 150: // "floating point" + case 151: // "floating point" value.copy< double > (v); break; - case 149: // "integer" + case 150: // "integer" value.copy< int64_t > (v); break; - case 148: // "constant string" + case 149: // "constant string" value.copy< std::string > (v); break; @@ -1660,30 +1665,30 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 151: // "boolean" + case 152: // "boolean" value.template destroy< bool > (); break; - case 150: // "floating point" + case 151: // "floating point" value.template destroy< double > (); break; - case 149: // "integer" + case 150: // "integer" value.template destroy< int64_t > (); break; - case 148: // "constant string" + case 149: // "constant string" value.template destroy< std::string > (); break; @@ -1710,30 +1715,30 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 167: // value - case 171: // map_value - case 209: // socket_type - case 212: // outbound_interface_value - case 222: // db_type - case 299: // hr_mode - case 445: // ncr_protocol_value - case 453: // replace_client_name_value + case 168: // value + case 172: // map_value + case 210: // socket_type + case 213: // outbound_interface_value + case 229: // db_type + case 306: // hr_mode + case 452: // ncr_protocol_value + case 460: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 151: // "boolean" + case 152: // "boolean" value.move< bool > (s.value); break; - case 150: // "floating point" + case 151: // "floating point" value.move< double > (s.value); break; - case 149: // "integer" + case 150: // "integer" value.move< int64_t > (s.value); break; - case 148: // "constant string" + case 149: // "constant string" value.move< std::string > (s.value); break; @@ -1807,7 +1812,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406 + 405, 406, 407 }; return static_cast (yytoken_number_[type]); } @@ -1962,6 +1967,12 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_HOSTS_DATABASE, l); } + Dhcp4Parser::symbol_type + Dhcp4Parser::make_HOSTS_DATABASES (const location_type& l) + { + return symbol_type (token::TOKEN_HOSTS_DATABASES, l); + } + Dhcp4Parser::symbol_type Dhcp4Parser::make_TYPE (const location_type& l) { @@ -2715,7 +2726,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp4_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2719 "dhcp4_parser.h" // lalr1.cc:377 +#line 2730 "dhcp4_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp4/location.hh b/src/bin/dhcp4/location.hh index 5920ce03e6..cbe8b8e7c0 100644 --- a/src/bin/dhcp4/location.hh +++ b/src/bin/dhcp4/location.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp4/position.hh b/src/bin/dhcp4/position.hh index 15f123a94b..91dc89c8f2 100644 --- a/src/bin/dhcp4/position.hh +++ b/src/bin/dhcp4/position.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp4/stack.hh b/src/bin/dhcp4/stack.hh index 83b9db2632..871a7bc780 100644 --- a/src/bin/dhcp4/stack.hh +++ b/src/bin/dhcp4/stack.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ diff --git a/src/bin/dhcp6/dhcp6_lexer.cc b/src/bin/dhcp6/dhcp6_lexer.cc index 4b86a5428d..1ed3fe94cb 100644 --- a/src/bin/dhcp6/dhcp6_lexer.cc +++ b/src/bin/dhcp6/dhcp6_lexer.cc @@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\ (yy_c_buf_p) = yy_cp; /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */ -#define YY_NUM_RULES 162 -#define YY_END_OF_BUFFER 163 +#define YY_NUM_RULES 163 +#define YY_END_OF_BUFFER 164 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -700,148 +700,148 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1272] = +static const flex_int16_t yy_accept[1274] = { 0, - 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, - 163, 161, 10, 11, 161, 1, 155, 152, 155, 155, - 161, 154, 153, 161, 161, 161, 161, 161, 148, 149, - 161, 161, 161, 150, 151, 5, 5, 5, 161, 161, - 161, 10, 11, 0, 0, 144, 0, 0, 0, 0, + 156, 156, 0, 0, 0, 0, 0, 0, 0, 0, + 164, 162, 10, 11, 162, 1, 156, 153, 156, 156, + 162, 155, 154, 162, 162, 162, 162, 162, 149, 150, + 162, 162, 162, 151, 152, 5, 5, 5, 162, 162, + 162, 10, 11, 0, 0, 145, 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, 1, 155, - 155, 0, 154, 155, 3, 2, 6, 0, 155, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 156, + 156, 0, 155, 156, 3, 2, 6, 0, 156, 0, 0, 0, 0, 0, 0, 4, 0, 0, 9, 0, - 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 123, 0, 0, 124, 0, - 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, + 8, 0, 0, 0, 0, 124, 0, 0, 125, 0, + 0, 0, 0, 0, 0, 0, 0, 147, 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, 81, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, - 158, 0, 157, 156, 0, 0, 0, 0, 0, 0, - 0, 122, 0, 0, 27, 0, 26, 0, 0, 87, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, + 159, 0, 158, 157, 0, 0, 0, 0, 0, 0, + 0, 123, 0, 0, 27, 0, 26, 0, 0, 88, - 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 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, 159, 156, 0, 0, 0, 0, 0, 0, + 0, 0, 160, 157, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 30, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 0, 0, 66, 0, 0, - 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 67, 0, 0, + 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 75, 0, 50, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 76, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103, 127, 42, 0, 47, 0, 0, 0, 0, - 0, 0, 141, 35, 0, 32, 0, 31, 0, 0, + 0, 104, 128, 43, 0, 48, 0, 0, 0, 0, + 0, 0, 142, 35, 0, 32, 0, 31, 0, 0, - 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 0, 0, 0, 0, 126, 0, + 97, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 7, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, - 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, - 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, + 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 78, 0, 0, 0, 0, 0, 0, 92, 0, - 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, + 0, 79, 0, 0, 0, 0, 0, 0, 93, 0, + 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 120, 93, 0, 0, 0, - 97, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 94, 0, 0, 0, + 98, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, - 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 69, 0, 0, + 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 70, 0, 0, - 0, 106, 0, 0, 0, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, + 0, 107, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 140, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 121, 14, 0, 0, + 0, 0, 0, 0, 16, 0, 122, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 112, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 113, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 125, 0, 37, 0, 117, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 63, 0, 0, 0, 0, - 119, 45, 0, 71, 0, 0, 0, 0, 0, 0, + 109, 126, 0, 37, 0, 118, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 64, 0, 0, 0, 0, + 120, 46, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, - 0, 0, 0, 64, 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 0, 0, 0, 65, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 58, 0, 0, 0, 17, - 15, 0, 139, 138, 0, 0, 0, 0, 0, 29, - 0, 102, 0, 0, 0, 0, 0, 0, 136, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, - 0, 105, 0, 52, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 82, 59, 0, 113, 0, 0, 0, - 104, 0, 0, 76, 0, 143, 0, 0, 0, 0, - 0, 0, 0, 74, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 59, 0, 0, 0, 17, + 15, 0, 140, 139, 0, 0, 0, 0, 0, 29, + 0, 103, 0, 0, 0, 0, 0, 0, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 106, 0, 53, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 83, 60, 0, 114, 0, 0, 0, + 105, 0, 0, 77, 0, 144, 0, 0, 0, 0, + 0, 0, 0, 75, 0, 129, 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, 101, 0, 55, 137, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 39, 18, - 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 57, 0, 0, 53, 0, 72, 0, - 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 0, 34, - 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, - 134, 0, 0, 0, 0, 0, 0, 0, 83, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 0, 56, 138, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 39, + 18, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 0, 0, 54, 0, 73, + 0, 0, 0, 0, 0, 119, 0, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 34, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 133, 0, 22, 56, 0, 0, - 0, 0, 21, 0, 73, 0, 0, 132, 0, 0, - 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 134, 0, 22, 57, + 0, 0, 0, 0, 21, 0, 74, 0, 0, 133, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 0, 90, 0, 0, 0, - 0, 0, 130, 135, 60, 0, 0, 0, 129, 0, - 0, 0, 0, 0, 0, 0, 91, 0, 0, 131, - 0 + 0, 0, 0, 0, 0, 0, 23, 0, 91, 0, + 0, 0, 0, 0, 131, 136, 61, 0, 0, 0, + 130, 0, 0, 0, 0, 0, 0, 0, 92, 0, + 0, 132, 0 } ; static const YY_CHAR yy_ec[256] = @@ -888,301 +888,301 @@ static const YY_CHAR yy_meta[72] = 3 } ; -static const flex_int16_t yy_base[1284] = +static const flex_int16_t yy_base[1286] = { 0, 0, 70, 19, 29, 41, 49, 52, 58, 87, 95, - 1633, 1634, 32, 1629, 141, 0, 201, 1634, 206, 88, - 11, 213, 1634, 1611, 114, 25, 2, 6, 1634, 1634, - 73, 11, 17, 1634, 1634, 1634, 104, 1617, 1572, 0, - 1609, 107, 1624, 217, 241, 1634, 185, 1568, 1574, 1594, + 1635, 1636, 32, 1631, 141, 0, 201, 1636, 206, 88, + 11, 213, 1636, 1613, 114, 25, 2, 6, 1636, 1636, + 73, 11, 17, 1636, 1636, 1636, 104, 1619, 1574, 0, + 1611, 107, 1626, 217, 241, 1636, 185, 1570, 1576, 1596, 93, 58, 190, 91, 211, 200, 14, 267, 213, 175, - 269, 64, 231, 1575, 187, 75, 1574, 274, 188, 290, - 276, 295, 1557, 195, 296, 325, 305, 1576, 0, 349, - 354, 367, 373, 376, 1634, 0, 1634, 267, 295, 290, - 317, 339, 351, 355, 358, 1634, 1573, 1612, 1634, 308, + 269, 64, 231, 1577, 187, 75, 1576, 274, 188, 290, + 276, 295, 1559, 195, 296, 325, 305, 1578, 0, 349, + 354, 367, 373, 376, 1636, 0, 1636, 267, 295, 290, + 317, 339, 351, 355, 358, 1636, 1575, 1614, 1636, 308, - 1634, 394, 357, 1560, 1570, 1609, 370, 220, 249, 1564, - 367, 377, 369, 379, 302, 1607, 0, 445, 374, 1551, - 1559, 361, 1555, 1544, 1545, 382, 1561, 1544, 1553, 400, - 200, 366, 1547, 358, 1535, 1591, 425, 1538, 1589, 1531, - 1554, 1551, 1551, 1545, 380, 1538, 1531, 1536, 1530, 1541, - 1526, 1525, 1539, 380, 1575, 1524, 387, 1536, 1539, 1523, - 441, 415, 1537, 1534, 1535, 1533, 1515, 1520, 1516, 1508, - 1525, 1517, 0, 400, 424, 371, 416, 427, 429, 1516, - 1634, 0, 444, 1507, 1510, 1634, 440, 451, 1634, 1562, - 1517, 458, 1560, 459, 1559, 465, 1558, 1634, 509, 1557, + 1636, 394, 357, 1562, 1572, 1611, 370, 220, 249, 1566, + 367, 377, 369, 379, 302, 1609, 0, 445, 374, 1553, + 1561, 361, 1557, 1546, 1547, 382, 1563, 1546, 1555, 400, + 200, 366, 1549, 358, 1537, 1593, 425, 1540, 1591, 1533, + 1556, 1553, 1553, 1547, 380, 1540, 1533, 1538, 1532, 1543, + 1528, 1527, 1541, 380, 1577, 1526, 387, 1538, 1541, 1525, + 441, 415, 1539, 1536, 1537, 1535, 1517, 1522, 1518, 1510, + 1527, 1519, 0, 400, 424, 371, 416, 427, 429, 1518, + 1636, 0, 444, 1509, 1512, 1636, 440, 451, 1636, 1564, + 1519, 458, 1562, 459, 1561, 465, 1560, 1636, 509, 1559, - 476, 1518, 1513, 1512, 1503, 294, 1552, 1546, 1512, 1491, - 1499, 1505, 1493, 1507, 1503, 1504, 1504, 1499, 1491, 1493, - 1477, 1481, 1494, 1494, 1486, 1476, 1479, 1493, 1634, 1479, - 1487, 1490, 1471, 1470, 1520, 1469, 1479, 1517, 453, 1478, - 1466, 1477, 1513, 1517, 1470, 9, 1460, 1476, 1457, 1459, - 1455, 1461, 1452, 1451, 1464, 1457, 1459, 1463, 1462, 1456, - 80, 1463, 1458, 1450, 1456, 1456, 1437, 1453, 1439, 1445, - 1452, 1440, 1433, 1447, 1446, 1449, 1431, 1439, 479, 1634, - 1634, 480, 1634, 1634, 1426, 0, 470, 1428, 495, 488, - 1482, 1634, 1435, 468, 1634, 1480, 1634, 1474, 545, 1634, + 476, 1520, 1515, 1514, 1505, 294, 1554, 1548, 1514, 1493, + 1501, 1507, 1495, 1509, 1505, 1506, 1506, 1501, 1493, 1495, + 1479, 1483, 1496, 1496, 1488, 1478, 1481, 1495, 1636, 1481, + 1489, 1492, 1473, 1472, 1522, 1471, 1481, 1519, 453, 1480, + 1468, 1479, 1515, 1519, 1472, 9, 1462, 1478, 1459, 1461, + 1457, 1463, 1454, 1453, 1466, 1459, 1461, 1465, 1464, 1458, + 80, 1465, 1460, 1452, 1458, 1458, 1439, 1455, 1441, 1447, + 1454, 1442, 1435, 1449, 1448, 1451, 1433, 1441, 479, 1636, + 1636, 480, 1636, 1636, 1428, 0, 470, 1430, 495, 488, + 1484, 1636, 1437, 468, 1636, 1482, 1636, 1476, 545, 1636, - 473, 1416, 1426, 1476, 1433, 1432, 455, 1634, 1430, 1472, - 1427, 1424, 1425, 506, 1429, 1467, 1417, 1412, 1409, 1405, - 1407, 1456, 1415, 1404, 1453, 1401, 538, 1414, 1414, 1397, - 1398, 1411, 1398, 1408, 1403, 1410, 1405, 1390, 479, 1399, - 1402, 1397, 1393, 1441, 488, 1634, 1388, 1387, 1380, 1382, - 1386, 1375, 1382, 1387, 353, 1432, 1387, 494, 1384, 1388, - 1386, 1375, 1375, 1387, 1369, 1361, 1362, 1383, 1365, 1377, - 1376, 1362, 1374, 1373, 1372, 1371, 1412, 1411, 1410, 1354, - 537, 1367, 1634, 1634, 1366, 0, 511, 1354, 1405, 1404, - 1362, 1402, 1634, 1350, 1400, 1634, 520, 587, 542, 1399, + 473, 1418, 1428, 1478, 1435, 1434, 455, 1636, 1432, 1474, + 1429, 1426, 1427, 506, 1431, 1469, 1419, 1414, 1411, 1407, + 1409, 1458, 1417, 1406, 1455, 1403, 538, 1416, 1416, 1399, + 1400, 1413, 1400, 1410, 1405, 1412, 1407, 1392, 479, 1401, + 1404, 1399, 1395, 1443, 488, 1636, 1390, 1389, 1382, 1384, + 1388, 1377, 1384, 1389, 353, 1434, 1389, 494, 1386, 1390, + 1388, 1377, 1377, 1389, 1371, 1363, 1364, 1385, 1367, 1379, + 1378, 1364, 1376, 1375, 1374, 1373, 1414, 1413, 1412, 1356, + 537, 1369, 1636, 1636, 1368, 0, 511, 1356, 1407, 1406, + 1364, 1404, 1636, 1352, 1402, 1636, 520, 587, 542, 1401, - 1341, 1634, 1346, 1356, 1355, 1342, 1341, 1634, 1343, 1340, - 1352, 1348, 1336, 1338, 1634, 1344, 1329, 1331, 1342, 1340, - 1335, 569, 1342, 1324, 1373, 1634, 1322, 1338, 1370, 1374, - 1332, 1326, 1328, 1329, 1331, 1363, 1316, 1311, 1310, 1312, - 1305, 1320, 1298, 1305, 1310, 1358, 1634, 1305, 1301, 1304, - 1311, 1296, 1306, 1309, 1298, 1297, 1292, 1634, 1347, 1634, - 1291, 1290, 1283, 1300, 1337, 1284, 1289, 1298, 1292, 1296, - 572, 1331, 1295, 1275, 1278, 1277, 1285, 1289, 1272, 1328, - 1270, 1634, 1634, 1634, 1275, 1634, 1285, 1319, 1281, 0, - 1322, 1272, 1634, 1634, 1269, 1634, 1275, 1634, 541, 553, + 1343, 1636, 1348, 1358, 1357, 1344, 1343, 1636, 1345, 1342, + 1354, 1350, 1338, 1340, 1636, 1346, 1331, 1333, 1344, 1342, + 1337, 569, 1344, 1326, 1375, 1636, 1324, 1340, 1372, 1376, + 1334, 1328, 1330, 1331, 1333, 1365, 1318, 1313, 1312, 1314, + 1307, 1322, 1300, 1307, 1312, 1360, 1636, 1307, 1303, 1306, + 1313, 1298, 1308, 1311, 1300, 1299, 1294, 1636, 1349, 1636, + 1293, 1292, 1285, 1302, 1339, 1286, 1291, 1300, 1294, 1298, + 572, 1333, 1297, 1277, 1280, 1279, 1287, 1291, 1274, 1330, + 1272, 1636, 1636, 1636, 1277, 1636, 1287, 1321, 1283, 0, + 1324, 1274, 1636, 1636, 1271, 1636, 1277, 1636, 541, 553, - 576, 1634, 1313, 1260, 1259, 1258, 1265, 1258, 1270, 1269, - 1253, 1268, 1298, 1265, 1301, 1247, 1249, 1261, 1261, 1260, - 1634, 1245, 1242, 1256, 1248, 1254, 1245, 1253, 1634, 1238, - 1249, 1253, 1235, 1249, 1247, 1230, 1224, 1229, 1226, 1241, - 1242, 1239, 1280, 1237, 1634, 1223, 1225, 1271, 1270, 508, - 1233, 1216, 1217, 1222, 1213, 1634, 1227, 1213, 609, 1205, - 1226, 1223, 1215, 1258, 1212, 1256, 1634, 1204, 1202, 1216, - 1219, 1251, 1250, 1197, 1248, 1247, 1634, 558, 1209, 1198, - 1200, 1634, 1634, 1243, 1191, 1246, 553, 537, 544, 1205, - 1244, 1238, 1237, 1236, 1190, 1180, 1233, 1195, 1185, 1230, + 576, 1636, 1315, 1262, 1261, 1260, 1267, 1260, 1272, 1271, + 1255, 1270, 1300, 1267, 1303, 1249, 1251, 1263, 1263, 1262, + 1636, 1247, 1244, 1258, 1250, 1256, 1247, 1255, 1636, 1240, + 1251, 1255, 1237, 1251, 1249, 1232, 1226, 1231, 1228, 1243, + 1244, 1241, 1282, 1239, 1636, 1225, 1227, 1273, 1272, 508, + 1235, 1218, 1219, 1224, 1215, 1636, 1229, 1215, 609, 1207, + 1228, 1225, 1217, 1260, 1214, 1258, 1636, 1206, 1204, 1218, + 1221, 1253, 1252, 1199, 1250, 1249, 1636, 558, 1211, 1200, + 1202, 1636, 1636, 1245, 1193, 1248, 553, 537, 544, 1207, + 1246, 1240, 1239, 1238, 1192, 1182, 1235, 1197, 1187, 1232, - 1193, 1175, 1183, 1185, 1189, 1224, 1228, 1185, 1184, 1185, - 1178, 1167, 1180, 1183, 1178, 1173, 1178, 1175, 1174, 1177, - 1172, 1213, 1212, 1156, 1152, 1160, 1208, 1634, 1207, 1156, - 1148, 1163, 1150, 1634, 1150, 1159, 1158, 1158, 1142, 1197, - 1140, 1153, 1634, 1145, 1137, 1146, 1139, 1150, 1127, 1131, - 1182, 1129, 1127, 1138, 1178, 1125, 546, 565, 1119, 1129, - 562, 1634, 1179, 1137, 1126, 1130, 1137, 1174, 1634, 1168, - 584, 1121, 1129, 1121, 1634, 1112, 1115, 1111, 1128, 1123, - 1111, 1122, 1106, 1108, 1160, 1106, 1120, 1101, 1151, 1106, - 1634, 1114, 1112, 1103, 1112, 1108, 1149, 1091, 1091, 1104, + 1195, 1177, 1185, 1187, 1191, 1226, 1230, 1187, 1186, 1187, + 1180, 1169, 1182, 1185, 1180, 1175, 1180, 1177, 1176, 1179, + 1174, 1215, 1214, 1158, 1154, 1162, 1210, 1636, 1209, 1158, + 1150, 1165, 1152, 1636, 1152, 1161, 1160, 1160, 1144, 1199, + 1142, 1155, 1636, 1147, 1139, 1148, 1141, 1152, 1129, 1133, + 1184, 1131, 1129, 1140, 1180, 1127, 546, 565, 1121, 1131, + 562, 1636, 1181, 1139, 1128, 1132, 1139, 1176, 1636, 1170, + 584, 1123, 1131, 1123, 1636, 1114, 1117, 1113, 1130, 1125, + 1113, 1124, 1108, 1110, 1162, 1108, 1122, 1103, 1153, 1108, + 1636, 1116, 1114, 1105, 1114, 1110, 1151, 1093, 1093, 1106, - 1103, 1088, 1143, 1085, 1086, 1634, 1634, 1100, 1097, 1100, - 1634, 1634, 1099, 1084, 578, 1083, 1081, 1128, 1077, 1131, - 1130, 1634, 1075, 12, 76, 120, 184, 204, 200, 312, + 1105, 1090, 1145, 1087, 1088, 1636, 1636, 1102, 1099, 1102, + 1636, 1636, 1101, 1086, 578, 1085, 1083, 1130, 1079, 1133, + 1132, 1636, 1077, 12, 76, 120, 184, 204, 200, 312, 285, 298, 407, 467, 507, 519, 529, 525, 539, 580, - 549, 615, 575, 584, 561, 1634, 619, 574, 589, 590, - 1634, 609, 617, 597, 587, 601, 595, 590, 591, 587, - 596, 591, 642, 648, 597, 1634, 609, 595, 611, 601, - 613, 607, 652, 620, 605, 606, 1634, 625, 608, 610, - 666, 611, 1634, 630, 610, 628, 667, 627, 617, 635, - 619, 634, 626, 622, 640, 625, 1634, 1634, 633, 678, + 549, 615, 575, 584, 561, 1636, 619, 574, 589, 590, + 1636, 609, 617, 597, 587, 601, 595, 590, 591, 587, + 596, 591, 642, 648, 597, 1636, 609, 595, 611, 601, + 613, 607, 652, 620, 605, 606, 1636, 625, 608, 610, + 666, 611, 1636, 630, 610, 628, 667, 627, 617, 635, + 619, 634, 626, 622, 640, 625, 1636, 1636, 633, 678, - 633, 1634, 641, 636, 687, 1634, 638, 643, 637, 639, - 651, 645, 643, 696, 642, 698, 699, 645, 1634, 644, + 633, 1636, 641, 636, 687, 1636, 638, 643, 637, 639, + 651, 645, 643, 696, 642, 698, 699, 645, 1636, 644, 652, 650, 649, 663, 664, 665, 681, 686, 660, 670, - 656, 663, 668, 675, 716, 717, 666, 670, 1634, 665, + 656, 663, 668, 675, 716, 717, 666, 670, 1636, 665, 683, 681, 719, 670, 688, 689, 675, 683, 692, 672, - 693, 733, 734, 1634, 689, 738, 739, 701, 703, 686, + 693, 733, 734, 1636, 689, 738, 739, 701, 703, 686, 688, 695, 746, 695, 710, 749, 701, 705, 703, 701, - 754, 755, 707, 757, 753, 713, 1634, 718, 711, 720, - 714, 709, 719, 715, 1634, 710, 1634, 1634, 711, 709, + 754, 755, 707, 757, 753, 713, 1636, 718, 711, 720, + 714, 709, 719, 715, 1636, 710, 1636, 1636, 711, 709, 728, 729, 730, 712, 717, 724, 757, 748, 720, 779, - 724, 740, 732, 736, 1634, 1634, 746, 744, 730, 731, + 724, 740, 732, 736, 1636, 1636, 746, 744, 730, 731, 789, 744, 749, 736, 747, 739, 745, 741, 759, 760, - 1634, 1634, 759, 1634, 761, 1634, 746, 765, 755, 806, - 761, 803, 1634, 760, 810, 1634, 811, 760, 767, 809, - 1634, 1634, 769, 1634, 760, 760, 763, 777, 764, 775, + 1636, 1636, 759, 1636, 761, 1636, 746, 765, 755, 806, + 761, 803, 1636, 760, 810, 1636, 811, 760, 767, 809, + 1636, 1636, 769, 1636, 760, 760, 763, 777, 764, 775, 822, 781, 819, 825, 826, 775, 828, 829, 790, 774, - 786, 776, 806, 835, 795, 1634, 837, 786, 782, 798, - 803, 791, 843, 802, 1634, 804, 803, 805, 798, 807, - 808, 805, 795, 797, 854, 803, 856, 801, 858, 1634, - 796, 811, 861, 1634, 1634, 812, 822, 807, 823, 809, + 786, 776, 806, 835, 795, 1636, 837, 786, 782, 798, + 803, 791, 843, 802, 1636, 804, 803, 805, 798, 807, + 808, 805, 795, 797, 854, 803, 856, 801, 858, 1636, + 796, 811, 861, 1636, 1636, 812, 822, 807, 823, 809, - 869, 870, 816, 872, 831, 1634, 823, 826, 877, 1634, - 1634, 823, 1634, 1634, 831, 881, 832, 883, 865, 1634, - 843, 1634, 830, 829, 832, 832, 833, 891, 1634, 836, - 893, 848, 839, 854, 854, 857, 857, 854, 859, 1634, - 851, 1634, 861, 1634, 862, 863, 860, 1634, 852, 858, - 857, 869, 869, 1634, 1634, 908, 1634, 873, 858, 864, - 1634, 869, 880, 1634, 877, 1634, 896, 916, 922, 866, - 924, 925, 880, 1634, 927, 1634, 867, 924, 889, 885, + 869, 870, 816, 872, 831, 1636, 823, 826, 877, 1636, + 1636, 823, 1636, 1636, 831, 881, 832, 883, 865, 1636, + 843, 1636, 830, 829, 832, 832, 833, 891, 1636, 836, + 893, 848, 839, 854, 854, 857, 857, 854, 859, 1636, + 851, 1636, 861, 1636, 862, 863, 860, 1636, 852, 858, + 857, 869, 869, 1636, 1636, 908, 1636, 873, 858, 864, + 1636, 869, 880, 1636, 877, 1636, 896, 916, 922, 866, + 924, 925, 880, 1636, 927, 1636, 867, 924, 889, 885, 927, 877, 882, 935, 893, 937, 938, 901, 890, 941, 885, 902, 887, 902, 886, 943, 944, 909, 895, 906, - 953, 925, 912, 1634, 956, 1634, 1634, 905, 1634, 958, - 906, 955, 900, 905, 964, 914, 1634, 920, 1634, 1634, - 911, 926, 1634, 964, 932, 925, 926, 935, 922, 924, - 934, 977, 928, 1634, 979, 926, 1634, 930, 1634, 934, - 929, 928, 986, 941, 1634, 983, 945, 948, 991, 934, - 936, 944, 934, 950, 944, 960, 999, 1634, 995, 1634, - 960, 997, 961, 952, 959, 1634, 956, 961, 1008, 953, - 1634, 957, 969, 970, 1013, 957, 958, 966, 1634, 977, - 967, 966, 969, 981, 972, 981, 983, 1634, 1025, 985, - 1027, 1028, 1634, 1024, 984, 989, 970, 1033, 992, 1035, + 953, 925, 912, 1636, 956, 1636, 1636, 905, 1636, 958, + 906, 955, 900, 905, 964, 914, 1636, 966, 921, 1636, + 1636, 912, 927, 1636, 965, 933, 926, 927, 936, 923, + 925, 935, 978, 929, 1636, 980, 927, 1636, 932, 1636, + 935, 930, 929, 987, 942, 1636, 984, 1636, 946, 950, + 993, 936, 938, 946, 936, 952, 946, 962, 1001, 1636, + 997, 1636, 962, 999, 963, 954, 961, 1636, 958, 963, + 1010, 955, 1636, 959, 971, 972, 1015, 959, 960, 968, + 1636, 979, 969, 968, 971, 983, 974, 983, 985, 1636, + 1027, 987, 1029, 1030, 1636, 1026, 986, 991, 972, 1035, - 994, 995, 1038, 997, 1634, 1002, 1634, 1634, 984, 990, - 1043, 1004, 1634, 990, 1634, 990, 992, 1634, 997, 992, - 1004, 1000, 1634, 1003, 1007, 998, 1050, 999, 1015, 1008, - 1003, 1018, 1009, 1016, 1003, 1018, 1065, 1024, 1067, 1012, - 1028, 1019, 1033, 1029, 1634, 1073, 1634, 1074, 1075, 1032, - 1031, 1032, 1634, 1634, 1634, 1079, 1023, 1039, 1634, 1077, - 1028, 1027, 1029, 1040, 1087, 1038, 1634, 1047, 1090, 1634, - 1634, 1096, 1101, 1106, 1111, 1116, 1121, 1126, 1129, 1103, - 1108, 1110, 1123 + 994, 1037, 996, 997, 1040, 999, 1636, 1004, 1636, 1636, + 986, 992, 1045, 1006, 1636, 992, 1636, 992, 994, 1636, + 999, 994, 1006, 1002, 1636, 1005, 1009, 1000, 1052, 1001, + 1017, 1010, 1005, 1020, 1011, 1018, 1005, 1020, 1067, 1026, + 1069, 1014, 1030, 1021, 1035, 1031, 1636, 1075, 1636, 1076, + 1077, 1034, 1033, 1034, 1636, 1636, 1636, 1081, 1025, 1041, + 1636, 1079, 1030, 1029, 1031, 1042, 1089, 1040, 1636, 1049, + 1092, 1636, 1636, 1098, 1103, 1108, 1113, 1118, 1123, 1128, + 1131, 1105, 1110, 1112, 1125 } ; -static const flex_int16_t yy_def[1284] = +static const flex_int16_t yy_def[1286] = { 0, - 1272, 1272, 1273, 1273, 1272, 1272, 1272, 1272, 1272, 1272, - 1271, 1271, 1271, 1271, 1271, 1274, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1275, - 1271, 1271, 1271, 1276, 15, 1271, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1277, 45, 45, + 1274, 1274, 1275, 1275, 1274, 1274, 1274, 1274, 1274, 1274, + 1273, 1273, 1273, 1273, 1273, 1276, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1277, + 1273, 1273, 1273, 1278, 15, 1273, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1279, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1274, 1271, - 1271, 1271, 1271, 1271, 1271, 1278, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1275, 1271, 1276, + 45, 45, 45, 45, 45, 45, 45, 45, 1276, 1273, + 1273, 1273, 1273, 1273, 1273, 1280, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1277, 1273, 1278, - 1271, 1271, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1279, 45, 1277, 45, 45, + 1273, 1273, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1281, 45, 1279, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1278, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1280, 45, 45, 45, 1271, 45, 45, 1271, 45, - 45, 45, 45, 45, 45, 45, 1279, 1271, 1277, 45, + 45, 45, 1280, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1282, 45, 45, 45, 1273, 45, 45, 1273, 45, + 45, 45, 45, 45, 45, 45, 1281, 1273, 1279, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1271, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1281, 45, 45, 45, 45, - 45, 1271, 45, 45, 1271, 45, 1271, 45, 1277, 1271, + 45, 45, 45, 45, 45, 45, 45, 45, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1283, 45, 45, 45, 45, + 45, 1273, 45, 45, 1273, 45, 1273, 45, 1279, 1273, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 1271, 1271, 1271, 1282, 45, 45, 45, 45, - 45, 45, 1271, 45, 45, 1271, 45, 1277, 45, 45, + 45, 45, 1273, 1273, 1273, 1284, 45, 45, 45, 45, + 45, 45, 1273, 45, 45, 1273, 45, 1279, 45, 45, - 45, 1271, 45, 45, 45, 45, 45, 1271, 45, 45, - 45, 45, 45, 45, 1271, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, + 45, 1273, 45, 45, 45, 45, 45, 1273, 45, 45, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 1271, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1273, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1271, 1271, 1271, 45, 1271, 45, 45, 1271, 1283, - 45, 45, 1271, 1271, 45, 1271, 45, 1271, 45, 45, + 45, 1273, 1273, 1273, 45, 1273, 45, 45, 1273, 1285, + 45, 45, 1273, 1273, 45, 1273, 45, 1273, 45, 45, - 45, 1271, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1271, 45, 45, 45, 45, 45, 45, 45, 1271, 45, + 1273, 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1271, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 45, - 45, 1271, 1271, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, + 45, 1273, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 45, - 45, 45, 45, 1271, 45, 45, 45, 45, 45, 45, - 45, 45, 1271, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, + 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, + 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1271, 45, 45, 45, 45, 45, 45, 1271, 45, - 45, 45, 45, 45, 1271, 45, 45, 45, 45, 45, + 45, 1273, 45, 45, 45, 45, 45, 45, 1273, 45, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1271, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 1271, 45, 45, 45, - 1271, 1271, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 1271, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 1273, 45, 45, 45, + 1273, 1273, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, - 1271, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 45, - 45, 45, 1271, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 1271, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, + 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, + 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 1273, 45, 45, - 45, 1271, 45, 45, 45, 1271, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1271, 45, + 45, 1273, 45, 45, 45, 1273, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 1271, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1271, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 45, - 45, 45, 45, 45, 1271, 45, 1271, 1271, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 45, + 45, 45, 45, 45, 1273, 45, 1273, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1271, 1271, 45, 45, 45, 45, + 45, 45, 45, 45, 1273, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 1271, 1271, 45, 1271, 45, 1271, 45, 45, 45, 45, - 45, 45, 1271, 45, 45, 1271, 45, 45, 45, 45, - 1271, 1271, 45, 1271, 45, 45, 45, 45, 45, 45, + 1273, 1273, 45, 1273, 45, 1273, 45, 45, 45, 45, + 45, 45, 1273, 45, 45, 1273, 45, 45, 45, 45, + 1273, 1273, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, - 45, 45, 45, 45, 1271, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1271, - 45, 45, 45, 1271, 1271, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 45, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1273, + 45, 45, 45, 1273, 1273, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 1271, - 1271, 45, 1271, 1271, 45, 45, 45, 45, 45, 1271, - 45, 1271, 45, 45, 45, 45, 45, 45, 1271, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 1271, - 45, 1271, 45, 1271, 45, 45, 45, 1271, 45, 45, - 45, 45, 45, 1271, 1271, 45, 1271, 45, 45, 45, - 1271, 45, 45, 1271, 45, 1271, 45, 45, 45, 45, - 45, 45, 45, 1271, 45, 1271, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1273, 45, 45, 45, 1273, + 1273, 45, 1273, 1273, 45, 45, 45, 45, 45, 1273, + 45, 1273, 45, 45, 45, 45, 45, 45, 1273, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1273, + 45, 1273, 45, 1273, 45, 45, 45, 1273, 45, 45, + 45, 45, 45, 1273, 1273, 45, 1273, 45, 45, 45, + 1273, 45, 45, 1273, 45, 1273, 45, 45, 45, 45, + 45, 45, 45, 1273, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1271, 45, 1271, 1271, 45, 1271, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 1271, 1271, - 45, 45, 1271, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 1271, 45, 45, 1271, 45, 1271, 45, - 45, 45, 45, 45, 1271, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 1271, - 45, 45, 45, 45, 45, 1271, 45, 45, 45, 45, - 1271, 45, 45, 45, 45, 45, 45, 45, 1271, 45, - 45, 45, 45, 45, 45, 45, 45, 1271, 45, 45, - 45, 45, 1271, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1273, 45, 1273, 1273, 45, 1273, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 45, 1273, + 1273, 45, 45, 1273, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1273, 45, 45, 1273, 45, 1273, + 45, 45, 45, 45, 45, 1273, 45, 1273, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1273, + 45, 1273, 45, 45, 45, 45, 45, 1273, 45, 45, + 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, + 1273, 45, 45, 45, 45, 45, 45, 45, 45, 1273, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1271, 45, 1271, 1271, 45, 45, - 45, 45, 1271, 45, 1271, 45, 45, 1271, 45, 45, - 45, 45, 1271, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 1273, 45, 1273, 1273, + 45, 45, 45, 45, 1273, 45, 1273, 45, 45, 1273, + 45, 45, 45, 45, 1273, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1271, 45, 1271, 45, 45, 45, - 45, 45, 1271, 1271, 1271, 45, 45, 45, 1271, 45, - 45, 45, 45, 45, 45, 45, 1271, 45, 45, 1271, - 0, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271 + 45, 45, 45, 45, 45, 45, 1273, 45, 1273, 45, + 45, 45, 45, 45, 1273, 1273, 1273, 45, 45, 45, + 1273, 45, 45, 45, 45, 45, 45, 45, 1273, 45, + 45, 1273, 0, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273 } ; -static const flex_int16_t yy_nxt[1706] = +static const flex_int16_t yy_nxt[1708] = { 0, - 1271, 13, 14, 13, 1271, 15, 16, 1271, 17, 18, + 1273, 13, 14, 13, 1273, 15, 16, 1273, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 85, 348, - 37, 14, 37, 86, 25, 26, 38, 1271, 1271, 27, + 37, 14, 37, 86, 25, 26, 38, 1273, 1273, 27, 37, 14, 37, 42, 28, 42, 38, 91, 92, 29, 115, 30, 13, 14, 13, 90, 91, 25, 31, 92, 13, 14, 13, 13, 14, 13, 32, 40, 800, 13, @@ -1283,12 +1283,12 @@ static const flex_int16_t yy_nxt[1706] = 1088, 1089, 1067, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, - 1127, 1128, 1102, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1139, 1141, 1142, 1143, 1144, 1140, 1145, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, - 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1135, 1163, 1164, - 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, + 1117, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, + 1128, 1129, 1102, 1130, 1131, 1132, 1133, 1134, 1135, 1136, + 1137, 1138, 1139, 1140, 1142, 1143, 1144, 1145, 1141, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1136, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1118, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, @@ -1299,78 +1299,78 @@ static const flex_int16_t yy_nxt[1706] = 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, - 1265, 1266, 1267, 1268, 1269, 1270, 12, 12, 12, 12, + 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 12, 12, - 12, 36, 36, 36, 36, 36, 79, 286, 79, 79, - 79, 98, 386, 98, 490, 98, 100, 100, 100, 100, - 100, 116, 116, 116, 116, 116, 173, 100, 173, 173, - 173, 197, 197, 197, 799, 798, 797, 796, 795, 794, - 793, 790, 789, 788, 787, 786, 785, 784, 783, 782, - 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, - 771, 770, 769, 768, 767, 766, 765, 764, 763, 762, - 761, 760, 759, 758, 757, 756, 755, 754, 752, 751, - 750, 749, 748, 747, 746, 743, 742, 737, 736, 735, - 734, 733, 732, 731, 730, 729, 728, 727, 726, 725, + 12, 12, 12, 36, 36, 36, 36, 36, 79, 286, + 79, 79, 79, 98, 386, 98, 490, 98, 100, 100, + 100, 100, 100, 116, 116, 116, 116, 116, 173, 100, + 173, 173, 173, 197, 197, 197, 799, 798, 797, 796, + 795, 794, 793, 790, 789, 788, 787, 786, 785, 784, + 783, 782, 781, 780, 779, 778, 777, 776, 775, 774, + 773, 772, 771, 770, 769, 768, 767, 766, 765, 764, + 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, + 752, 751, 750, 749, 748, 747, 746, 743, 742, 737, + 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, - 724, 723, 722, 721, 720, 719, 718, 717, 716, 715, - 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, - 704, 703, 702, 701, 700, 699, 698, 697, 696, 695, - 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, - 684, 683, 682, 681, 680, 679, 678, 677, 676, 675, - 674, 669, 668, 667, 666, 665, 664, 661, 660, 659, - 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, - 648, 647, 646, 642, 641, 640, 639, 638, 637, 636, - 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, - 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, + 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, + 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, + 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, + 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, + 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, + 676, 675, 674, 669, 668, 667, 666, 665, 664, 661, + 660, 659, 658, 657, 656, 655, 654, 653, 652, 651, + 650, 649, 648, 647, 646, 642, 641, 640, 639, 638, + 637, 636, 633, 632, 631, 630, 629, 628, 627, 626, + 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, - 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, - 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, - 593, 592, 591, 590, 586, 585, 584, 583, 582, 581, - 580, 579, 578, 577, 576, 575, 574, 573, 572, 571, - 570, 569, 566, 565, 564, 563, 562, 561, 560, 559, - 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, - 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, - 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, - 528, 527, 526, 525, 524, 523, 520, 519, 518, 517, - 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, + 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, + 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, + 595, 594, 593, 592, 591, 590, 586, 585, 584, 583, + 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, + 572, 571, 570, 569, 566, 565, 564, 563, 562, 561, + 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, + 550, 549, 548, 547, 546, 545, 544, 543, 542, 541, + 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, + 530, 529, 528, 527, 526, 525, 524, 523, 520, 519, + 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, - 506, 505, 504, 503, 502, 498, 497, 496, 495, 494, - 493, 492, 489, 488, 485, 484, 483, 482, 481, 480, - 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, - 469, 468, 467, 466, 465, 464, 461, 460, 457, 456, - 455, 454, 453, 452, 451, 450, 447, 446, 445, 444, - 443, 440, 439, 438, 437, 436, 435, 434, 433, 432, - 431, 430, 425, 424, 423, 422, 421, 420, 419, 418, - 417, 416, 415, 414, 411, 410, 409, 408, 407, 404, - 403, 402, 401, 400, 397, 396, 394, 393, 388, 385, - 382, 381, 380, 379, 378, 377, 376, 375, 374, 373, + 508, 507, 506, 505, 504, 503, 502, 498, 497, 496, + 495, 494, 493, 492, 489, 488, 485, 484, 483, 482, + 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, + 471, 470, 469, 468, 467, 466, 465, 464, 461, 460, + 457, 456, 455, 454, 453, 452, 451, 450, 447, 446, + 445, 444, 443, 440, 439, 438, 437, 436, 435, 434, + 433, 432, 431, 430, 425, 424, 423, 422, 421, 420, + 419, 418, 417, 416, 415, 414, 411, 410, 409, 408, + 407, 404, 403, 402, 401, 400, 397, 396, 394, 393, + 388, 385, 382, 381, 380, 379, 378, 377, 376, 375, - 372, 371, 370, 369, 368, 367, 366, 363, 362, 361, - 360, 359, 358, 357, 356, 355, 354, 353, 352, 351, - 350, 347, 346, 345, 344, 343, 342, 338, 337, 336, - 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, - 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, - 315, 314, 313, 312, 311, 310, 309, 308, 305, 304, - 303, 302, 300, 198, 297, 295, 293, 292, 289, 288, - 285, 278, 277, 276, 275, 274, 273, 272, 271, 270, - 269, 257, 256, 255, 251, 250, 247, 246, 245, 244, - 243, 242, 241, 240, 237, 236, 235, 234, 233, 232, + 374, 373, 372, 371, 370, 369, 368, 367, 366, 363, + 362, 361, 360, 359, 358, 357, 356, 355, 354, 353, + 352, 351, 350, 347, 346, 345, 344, 343, 342, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, + 305, 304, 303, 302, 300, 198, 297, 295, 293, 292, + 289, 288, 285, 278, 277, 276, 275, 274, 273, 272, + 271, 270, 269, 257, 256, 255, 251, 250, 247, 246, + 245, 244, 243, 242, 241, 240, 237, 236, 235, 234, - 231, 228, 227, 223, 215, 214, 213, 209, 208, 207, - 203, 202, 198, 191, 186, 185, 184, 181, 180, 172, - 159, 140, 133, 106, 105, 104, 43, 99, 97, 96, - 87, 43, 1271, 11, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, + 233, 232, 231, 228, 227, 223, 215, 214, 213, 209, + 208, 207, 203, 202, 198, 191, 186, 185, 184, 181, + 180, 172, 159, 140, 133, 106, 105, 104, 43, 99, + 97, 96, 87, 43, 1273, 11, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, - 1271, 1271, 1271, 1271, 1271 + 1273, 1273, 1273, 1273, 1273, 1273, 1273 } ; -static const flex_int16_t yy_chk[1706] = +static const flex_int16_t yy_chk[1708] = { 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 246, @@ -1478,88 +1478,88 @@ static const flex_int16_t yy_chk[1706] = 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1067, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1105, 1108, 1110, 1111, 1112, 1113, 1114, 1110, 1115, - 1116, 1118, 1121, 1122, 1124, 1125, 1126, 1127, 1128, 1129, - 1130, 1131, 1132, 1133, 1135, 1136, 1138, 1102, 1140, 1141, - 1142, 1143, 1144, 1146, 1147, 1148, 1149, 1150, 1151, 1152, + 1116, 1118, 1119, 1122, 1123, 1125, 1126, 1127, 1128, 1129, + 1130, 1131, 1132, 1133, 1134, 1136, 1137, 1102, 1139, 1141, + 1142, 1143, 1144, 1145, 1147, 1149, 1084, 1150, 1151, 1152, - 1153, 1154, 1155, 1156, 1157, 1159, 1161, 1162, 1163, 1164, - 1165, 1167, 1168, 1169, 1170, 1172, 1173, 1174, 1175, 1176, - 1177, 1178, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, - 1189, 1190, 1191, 1192, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 1201, 1202, 1203, 1204, 1206, 1209, 1210, 1211, 1212, - 1214, 1216, 1217, 1219, 1220, 1221, 1222, 1224, 1225, 1226, + 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1161, 1163, 1164, + 1165, 1166, 1167, 1169, 1170, 1171, 1172, 1174, 1175, 1176, + 1177, 1178, 1179, 1180, 1182, 1183, 1184, 1185, 1186, 1187, + 1188, 1189, 1191, 1192, 1193, 1194, 1196, 1197, 1198, 1199, + 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1208, 1211, 1212, + 1213, 1214, 1216, 1218, 1219, 1221, 1222, 1223, 1224, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, - 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1246, 1248, - 1249, 1250, 1251, 1252, 1256, 1257, 1258, 1260, 1261, 1262, - 1263, 1264, 1265, 1266, 1268, 1269, 1272, 1272, 1272, 1272, + 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, + 1248, 1250, 1251, 1252, 1253, 1254, 1258, 1259, 1260, 1262, + 1263, 1264, 1265, 1266, 1267, 1268, 1270, 1271, 1274, 1274, - 1272, 1273, 1273, 1273, 1273, 1273, 1274, 1280, 1274, 1274, - 1274, 1275, 1281, 1275, 1282, 1275, 1276, 1276, 1276, 1276, - 1276, 1277, 1277, 1277, 1277, 1277, 1278, 1283, 1278, 1278, - 1278, 1279, 1279, 1279, 723, 721, 720, 719, 718, 717, - 716, 714, 713, 710, 709, 708, 705, 704, 703, 702, - 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, - 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, - 680, 679, 678, 677, 676, 674, 673, 672, 670, 668, - 667, 666, 665, 664, 663, 660, 659, 656, 655, 654, - 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, + 1274, 1274, 1274, 1275, 1275, 1275, 1275, 1275, 1276, 1282, + 1276, 1276, 1276, 1277, 1283, 1277, 1284, 1277, 1278, 1278, + 1278, 1278, 1278, 1279, 1279, 1279, 1279, 1279, 1280, 1285, + 1280, 1280, 1280, 1281, 1281, 1281, 723, 721, 720, 719, + 718, 717, 716, 714, 713, 710, 709, 708, 705, 704, + 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, + 693, 692, 690, 689, 688, 687, 686, 685, 684, 683, + 682, 681, 680, 679, 678, 677, 676, 674, 673, 672, + 670, 668, 667, 666, 665, 664, 663, 660, 659, 656, + 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, - 642, 641, 640, 639, 638, 637, 636, 635, 633, 632, - 631, 630, 629, 627, 626, 625, 624, 623, 622, 621, - 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, - 610, 609, 608, 607, 606, 605, 604, 603, 602, 601, - 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, - 590, 586, 585, 584, 581, 580, 579, 576, 575, 574, - 573, 572, 571, 570, 569, 568, 566, 565, 564, 563, - 562, 561, 560, 558, 557, 555, 554, 553, 552, 551, - 549, 548, 547, 546, 544, 543, 542, 541, 540, 539, - 538, 537, 536, 535, 534, 533, 532, 531, 530, 528, + 645, 644, 642, 641, 640, 639, 638, 637, 636, 635, + 633, 632, 631, 630, 629, 627, 626, 625, 624, 623, + 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, + 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, + 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, + 592, 591, 590, 586, 585, 584, 581, 580, 579, 576, + 575, 574, 573, 572, 571, 570, 569, 568, 566, 565, + 564, 563, 562, 561, 560, 558, 557, 555, 554, 553, + 552, 551, 549, 548, 547, 546, 544, 543, 542, 541, + 540, 539, 538, 537, 536, 535, 534, 533, 532, 531, - 527, 526, 525, 524, 523, 522, 520, 519, 518, 517, - 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, - 506, 505, 504, 503, 497, 495, 492, 491, 489, 488, - 487, 485, 481, 480, 479, 478, 477, 476, 475, 474, - 473, 472, 470, 469, 468, 467, 466, 465, 464, 463, - 462, 461, 459, 457, 456, 455, 454, 453, 452, 451, - 450, 449, 448, 446, 445, 444, 443, 442, 441, 440, - 439, 438, 437, 436, 435, 434, 433, 432, 431, 430, - 429, 428, 427, 425, 424, 423, 421, 420, 419, 418, - 417, 416, 414, 413, 412, 411, 410, 409, 407, 406, + 530, 528, 527, 526, 525, 524, 523, 522, 520, 519, + 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, + 508, 507, 506, 505, 504, 503, 497, 495, 492, 491, + 489, 488, 487, 485, 481, 480, 479, 478, 477, 476, + 475, 474, 473, 472, 470, 469, 468, 467, 466, 465, + 464, 463, 462, 461, 459, 457, 456, 455, 454, 453, + 452, 451, 450, 449, 448, 446, 445, 444, 443, 442, + 441, 440, 439, 438, 437, 436, 435, 434, 433, 432, + 431, 430, 429, 428, 427, 425, 424, 423, 421, 420, + 419, 418, 417, 416, 414, 413, 412, 411, 410, 409, - 405, 404, 403, 401, 400, 395, 394, 392, 391, 390, - 389, 388, 385, 382, 380, 379, 378, 377, 376, 375, - 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, - 364, 363, 362, 361, 360, 359, 357, 356, 354, 353, - 352, 351, 350, 349, 348, 347, 344, 343, 342, 341, - 340, 338, 337, 336, 335, 334, 333, 332, 331, 330, - 329, 328, 326, 325, 324, 323, 322, 321, 320, 319, - 318, 317, 316, 315, 313, 312, 311, 310, 309, 306, - 305, 304, 303, 302, 298, 296, 293, 291, 288, 285, - 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, + 407, 406, 405, 404, 403, 401, 400, 395, 394, 392, + 391, 390, 389, 388, 385, 382, 380, 379, 378, 377, + 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, + 366, 365, 364, 363, 362, 361, 360, 359, 357, 356, + 354, 353, 352, 351, 350, 349, 348, 347, 344, 343, + 342, 341, 340, 338, 337, 336, 335, 334, 333, 332, + 331, 330, 329, 328, 326, 325, 324, 323, 322, 321, + 320, 319, 318, 317, 316, 315, 313, 312, 311, 310, + 309, 306, 305, 304, 303, 302, 298, 296, 293, 291, + 288, 285, 278, 277, 276, 275, 274, 273, 272, 271, - 268, 267, 266, 265, 264, 263, 262, 260, 259, 258, - 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, - 247, 245, 244, 243, 242, 241, 240, 238, 237, 236, - 235, 234, 233, 232, 231, 230, 228, 227, 226, 225, - 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, - 214, 213, 212, 211, 210, 209, 208, 207, 205, 204, - 203, 202, 200, 197, 195, 193, 191, 190, 185, 184, - 180, 172, 171, 170, 169, 168, 167, 166, 165, 164, - 163, 160, 159, 158, 156, 155, 153, 152, 151, 150, - 149, 148, 147, 146, 144, 143, 142, 141, 140, 139, + 270, 269, 268, 267, 266, 265, 264, 263, 262, 260, + 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, + 249, 248, 247, 245, 244, 243, 242, 241, 240, 238, + 237, 236, 235, 234, 233, 232, 231, 230, 228, 227, + 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, + 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, + 205, 204, 203, 202, 200, 197, 195, 193, 191, 190, + 185, 184, 180, 172, 171, 170, 169, 168, 167, 166, + 165, 164, 163, 160, 159, 158, 156, 155, 153, 152, + 151, 150, 149, 148, 147, 146, 144, 143, 142, 141, - 138, 136, 135, 133, 129, 128, 127, 125, 124, 123, - 121, 120, 116, 110, 106, 105, 104, 98, 97, 78, - 73, 67, 64, 50, 49, 48, 43, 41, 39, 38, - 24, 14, 11, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, + 140, 139, 138, 136, 135, 133, 129, 128, 127, 125, + 124, 123, 121, 120, 116, 110, 106, 105, 104, 98, + 97, 78, 73, 67, 64, 50, 49, 48, 43, 41, + 39, 38, 24, 14, 11, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, + 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, - 1271, 1271, 1271, 1271, 1271 + 1273, 1273, 1273, 1273, 1273, 1273, 1273 } ; static yy_state_type yy_last_accepting_state; @@ -1568,26 +1568,26 @@ static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 1; -static const flex_int16_t yy_rule_linenum[162] = +static const flex_int16_t yy_rule_linenum[163] = { 0, 147, 149, 151, 156, 157, 162, 163, 164, 176, 179, 184, 191, 200, 209, 218, 227, 236, 245, 254, 263, 272, 281, 290, 299, 308, 317, 327, 337, 347, 357, 367, 377, 387, 397, 407, 416, 425, 434, 443, 452, - 461, 470, 482, 491, 500, 509, 518, 528, 538, 548, - 558, 569, 579, 589, 599, 609, 620, 631, 642, 653, - 662, 672, 681, 690, 706, 722, 731, 740, 749, 758, - 767, 776, 785, 794, 803, 812, 834, 856, 865, 875, - 885, 894, 904, 914, 923, 932, 941, 950, 960, 969, - 978, 987, 996, 1005, 1014, 1023, 1032, 1041, 1051, 1060, + 461, 470, 479, 491, 500, 509, 518, 527, 537, 547, + 557, 567, 578, 588, 598, 608, 618, 629, 640, 651, + 662, 671, 681, 690, 699, 715, 731, 740, 749, 758, + 767, 776, 785, 794, 803, 812, 821, 843, 865, 874, + 884, 894, 903, 913, 923, 932, 941, 950, 959, 969, + 978, 987, 996, 1005, 1014, 1023, 1032, 1041, 1050, 1060, - 1069, 1079, 1092, 1102, 1111, 1120, 1129, 1140, 1150, 1159, - 1169, 1179, 1188, 1197, 1206, 1215, 1225, 1234, 1244, 1253, + 1069, 1078, 1088, 1101, 1111, 1120, 1129, 1138, 1149, 1159, + 1168, 1178, 1188, 1197, 1206, 1215, 1224, 1234, 1243, 1253, 1262, 1271, 1280, 1289, 1298, 1307, 1316, 1325, 1334, 1343, 1352, 1361, 1370, 1379, 1388, 1397, 1406, 1415, 1424, 1433, - 1442, 1451, 1460, 1470, 1569, 1574, 1579, 1584, 1585, 1586, - 1587, 1588, 1589, 1591, 1609, 1622, 1627, 1631, 1633, 1635, - 1637 + 1442, 1451, 1460, 1469, 1479, 1578, 1583, 1588, 1593, 1594, + 1595, 1596, 1597, 1598, 1600, 1618, 1631, 1636, 1640, 1642, + 1644, 1646 } ; /* The intent behind this definition is that it'll catch @@ -1599,7 +1599,7 @@ static const flex_int16_t yy_rule_linenum[162] = #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "dhcp6_lexer.ll" -/* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this @@ -2026,13 +2026,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1272 ) + if ( yy_current_state >= 1274 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1271 ); + while ( yy_current_state != 1273 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -2051,13 +2051,13 @@ do_action: /* This label is used only to access EOF actions. */ { if ( yy_act == 0 ) fprintf( stderr, "--scanner backing up\n" ); - else if ( yy_act < 162 ) + else if ( yy_act < 163 ) fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n", (long)yy_rule_linenum[yy_act], yytext ); - else if ( yy_act == 162 ) + else if ( yy_act == 163 ) fprintf( stderr, "--accepting default rule (\"%s\")\n", yytext ); - else if ( yy_act == 163 ) + else if ( yy_act == 164 ) fprintf( stderr, "--(end of buffer or a NUL)\n" ); else fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); @@ -2521,6 +2521,18 @@ YY_RULE_SETUP case 41: YY_RULE_SETUP #line 461 "dhcp6_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::DHCP6: + return isc::dhcp::Dhcp6Parser::make_HOSTS_DATABASES(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("hosts-databases", driver.loc_); + } +} + YY_BREAK +case 42: +YY_RULE_SETUP +#line 470 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOSTS_DATABASE: @@ -2530,9 +2542,9 @@ YY_RULE_SETUP } } YY_BREAK -case 42: +case 43: YY_RULE_SETUP -#line 470 "dhcp6_lexer.ll" +#line 479 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2545,9 +2557,9 @@ YY_RULE_SETUP } } YY_BREAK -case 43: +case 44: YY_RULE_SETUP -#line 482 "dhcp6_lexer.ll" +#line 491 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2557,9 +2569,9 @@ YY_RULE_SETUP } } YY_BREAK -case 44: +case 45: YY_RULE_SETUP -#line 491 "dhcp6_lexer.ll" +#line 500 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2569,9 +2581,9 @@ YY_RULE_SETUP } } YY_BREAK -case 45: +case 46: YY_RULE_SETUP -#line 500 "dhcp6_lexer.ll" +#line 509 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2581,9 +2593,9 @@ YY_RULE_SETUP } } YY_BREAK -case 46: +case 47: YY_RULE_SETUP -#line 509 "dhcp6_lexer.ll" +#line 518 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DATABASE_TYPE: @@ -2593,9 +2605,9 @@ YY_RULE_SETUP } } YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 518 "dhcp6_lexer.ll" +#line 527 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2606,9 +2618,9 @@ YY_RULE_SETUP } } YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 528 "dhcp6_lexer.ll" +#line 537 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2619,9 +2631,9 @@ YY_RULE_SETUP } } YY_BREAK -case 49: +case 50: YY_RULE_SETUP -#line 538 "dhcp6_lexer.ll" +#line 547 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2632,9 +2644,9 @@ YY_RULE_SETUP } } YY_BREAK -case 50: +case 51: YY_RULE_SETUP -#line 548 "dhcp6_lexer.ll" +#line 557 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2645,9 +2657,9 @@ YY_RULE_SETUP } } YY_BREAK -case 51: +case 52: YY_RULE_SETUP -#line 558 "dhcp6_lexer.ll" +#line 567 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2659,9 +2671,9 @@ YY_RULE_SETUP } } YY_BREAK -case 52: +case 53: YY_RULE_SETUP -#line 569 "dhcp6_lexer.ll" +#line 578 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2672,9 +2684,9 @@ YY_RULE_SETUP } } YY_BREAK -case 53: +case 54: YY_RULE_SETUP -#line 579 "dhcp6_lexer.ll" +#line 588 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2685,9 +2697,9 @@ YY_RULE_SETUP } } YY_BREAK -case 54: +case 55: YY_RULE_SETUP -#line 589 "dhcp6_lexer.ll" +#line 598 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2698,9 +2710,9 @@ YY_RULE_SETUP } } YY_BREAK -case 55: +case 56: YY_RULE_SETUP -#line 599 "dhcp6_lexer.ll" +#line 608 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2711,9 +2723,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 57: YY_RULE_SETUP -#line 609 "dhcp6_lexer.ll" +#line 618 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2725,9 +2737,9 @@ YY_RULE_SETUP } } YY_BREAK -case 57: +case 58: YY_RULE_SETUP -#line 620 "dhcp6_lexer.ll" +#line 629 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2739,9 +2751,9 @@ YY_RULE_SETUP } } YY_BREAK -case 58: +case 59: YY_RULE_SETUP -#line 631 "dhcp6_lexer.ll" +#line 640 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2753,9 +2765,9 @@ YY_RULE_SETUP } } YY_BREAK -case 59: +case 60: YY_RULE_SETUP -#line 642 "dhcp6_lexer.ll" +#line 651 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2767,9 +2779,9 @@ YY_RULE_SETUP } } YY_BREAK -case 60: +case 61: YY_RULE_SETUP -#line 653 "dhcp6_lexer.ll" +#line 662 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2779,9 +2791,9 @@ YY_RULE_SETUP } } YY_BREAK -case 61: +case 62: YY_RULE_SETUP -#line 662 "dhcp6_lexer.ll" +#line 671 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2792,9 +2804,9 @@ YY_RULE_SETUP } } YY_BREAK -case 62: +case 63: YY_RULE_SETUP -#line 672 "dhcp6_lexer.ll" +#line 681 "dhcp6_lexer.ll" { switch (driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2804,9 +2816,9 @@ YY_RULE_SETUP } } YY_BREAK -case 63: +case 64: YY_RULE_SETUP -#line 681 "dhcp6_lexer.ll" +#line 690 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2816,9 +2828,9 @@ YY_RULE_SETUP } } YY_BREAK -case 64: +case 65: YY_RULE_SETUP -#line 690 "dhcp6_lexer.ll" +#line 699 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2835,9 +2847,9 @@ YY_RULE_SETUP } } YY_BREAK -case 65: +case 66: YY_RULE_SETUP -#line 706 "dhcp6_lexer.ll" +#line 715 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LEASE_DATABASE: @@ -2854,9 +2866,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 67: YY_RULE_SETUP -#line 722 "dhcp6_lexer.ll" +#line 731 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2866,9 +2878,9 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 68: YY_RULE_SETUP -#line 731 "dhcp6_lexer.ll" +#line 740 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -2878,9 +2890,9 @@ YY_RULE_SETUP } } YY_BREAK -case 68: +case 69: YY_RULE_SETUP -#line 740 "dhcp6_lexer.ll" +#line 749 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2890,9 +2902,9 @@ YY_RULE_SETUP } } YY_BREAK -case 69: +case 70: YY_RULE_SETUP -#line 749 "dhcp6_lexer.ll" +#line 758 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -2902,9 +2914,9 @@ YY_RULE_SETUP } } YY_BREAK -case 70: +case 71: YY_RULE_SETUP -#line 758 "dhcp6_lexer.ll" +#line 767 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2914,9 +2926,9 @@ YY_RULE_SETUP } } YY_BREAK -case 71: +case 72: YY_RULE_SETUP -#line 767 "dhcp6_lexer.ll" +#line 776 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2926,9 +2938,9 @@ YY_RULE_SETUP } } YY_BREAK -case 72: +case 73: YY_RULE_SETUP -#line 776 "dhcp6_lexer.ll" +#line 785 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2938,9 +2950,9 @@ YY_RULE_SETUP } } YY_BREAK -case 73: +case 74: YY_RULE_SETUP -#line 785 "dhcp6_lexer.ll" +#line 794 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2950,9 +2962,9 @@ YY_RULE_SETUP } } YY_BREAK -case 74: +case 75: YY_RULE_SETUP -#line 794 "dhcp6_lexer.ll" +#line 803 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::PD_POOLS: @@ -2962,9 +2974,9 @@ YY_RULE_SETUP } } YY_BREAK -case 75: +case 76: YY_RULE_SETUP -#line 803 "dhcp6_lexer.ll" +#line 812 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::POOLS: @@ -2974,9 +2986,9 @@ YY_RULE_SETUP } } YY_BREAK -case 76: +case 77: YY_RULE_SETUP -#line 812 "dhcp6_lexer.ll" +#line 821 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -2999,9 +3011,9 @@ YY_RULE_SETUP } } YY_BREAK -case 77: +case 78: YY_RULE_SETUP -#line 834 "dhcp6_lexer.ll" +#line 843 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3024,9 +3036,9 @@ YY_RULE_SETUP } } YY_BREAK -case 78: +case 79: YY_RULE_SETUP -#line 856 "dhcp6_lexer.ll" +#line 865 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3036,9 +3048,9 @@ YY_RULE_SETUP } } YY_BREAK -case 79: +case 80: YY_RULE_SETUP -#line 865 "dhcp6_lexer.ll" +#line 874 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3049,9 +3061,9 @@ YY_RULE_SETUP } } YY_BREAK -case 80: +case 81: YY_RULE_SETUP -#line 875 "dhcp6_lexer.ll" +#line 884 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3062,9 +3074,9 @@ YY_RULE_SETUP } } YY_BREAK -case 81: +case 82: YY_RULE_SETUP -#line 885 "dhcp6_lexer.ll" +#line 894 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3074,9 +3086,9 @@ YY_RULE_SETUP } } YY_BREAK -case 82: +case 83: YY_RULE_SETUP -#line 894 "dhcp6_lexer.ll" +#line 903 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3087,9 +3099,9 @@ YY_RULE_SETUP } } YY_BREAK -case 83: +case 84: YY_RULE_SETUP -#line 904 "dhcp6_lexer.ll" +#line 913 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3100,18 +3112,6 @@ YY_RULE_SETUP } } YY_BREAK -case 84: -YY_RULE_SETUP -#line 914 "dhcp6_lexer.ll" -{ - switch(driver.ctx_) { - case isc::dhcp::Parser6Context::RESERVATION_MODE: - return isc::dhcp::Dhcp6Parser::make_DISABLED(driver.loc_); - default: - return isc::dhcp::Dhcp6Parser::make_STRING("disabled", driver.loc_); - } -} - YY_BREAK case 85: YY_RULE_SETUP #line 923 "dhcp6_lexer.ll" @@ -3120,7 +3120,7 @@ YY_RULE_SETUP case isc::dhcp::Parser6Context::RESERVATION_MODE: return isc::dhcp::Dhcp6Parser::make_DISABLED(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("off", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("disabled", driver.loc_); } } YY_BREAK @@ -3130,9 +3130,9 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: - return isc::dhcp::Dhcp6Parser::make_OUT_OF_POOL(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_DISABLED(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("out-of-pool", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("off", driver.loc_); } } YY_BREAK @@ -3142,15 +3142,27 @@ YY_RULE_SETUP { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATION_MODE: - return isc::dhcp::Dhcp6Parser::make_ALL(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_OUT_OF_POOL(driver.loc_); default: - return isc::dhcp::Dhcp6Parser::make_STRING("all", driver.loc_); + return isc::dhcp::Dhcp6Parser::make_STRING("out-of-pool", driver.loc_); } } YY_BREAK case 88: YY_RULE_SETUP #line 950 "dhcp6_lexer.ll" +{ + switch(driver.ctx_) { + case isc::dhcp::Parser6Context::RESERVATION_MODE: + return isc::dhcp::Dhcp6Parser::make_ALL(driver.loc_); + default: + return isc::dhcp::Dhcp6Parser::make_STRING("all", driver.loc_); + } +} + YY_BREAK +case 89: +YY_RULE_SETUP +#line 959 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3161,9 +3173,9 @@ YY_RULE_SETUP } } YY_BREAK -case 89: +case 90: YY_RULE_SETUP -#line 960 "dhcp6_lexer.ll" +#line 969 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3173,9 +3185,9 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 91: YY_RULE_SETUP -#line 969 "dhcp6_lexer.ll" +#line 978 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3185,9 +3197,9 @@ YY_RULE_SETUP } } YY_BREAK -case 91: +case 92: YY_RULE_SETUP -#line 978 "dhcp6_lexer.ll" +#line 987 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3197,9 +3209,9 @@ YY_RULE_SETUP } } YY_BREAK -case 92: +case 93: YY_RULE_SETUP -#line 987 "dhcp6_lexer.ll" +#line 996 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3209,9 +3221,9 @@ YY_RULE_SETUP } } YY_BREAK -case 93: +case 94: YY_RULE_SETUP -#line 996 "dhcp6_lexer.ll" +#line 1005 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGING: @@ -3221,9 +3233,9 @@ YY_RULE_SETUP } } YY_BREAK -case 94: +case 95: YY_RULE_SETUP -#line 1005 "dhcp6_lexer.ll" +#line 1014 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3233,9 +3245,9 @@ YY_RULE_SETUP } } YY_BREAK -case 95: +case 96: YY_RULE_SETUP -#line 1014 "dhcp6_lexer.ll" +#line 1023 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3245,9 +3257,9 @@ YY_RULE_SETUP } } YY_BREAK -case 96: +case 97: YY_RULE_SETUP -#line 1023 "dhcp6_lexer.ll" +#line 1032 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3257,9 +3269,9 @@ YY_RULE_SETUP } } YY_BREAK -case 97: +case 98: YY_RULE_SETUP -#line 1032 "dhcp6_lexer.ll" +#line 1041 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3269,9 +3281,9 @@ YY_RULE_SETUP } } YY_BREAK -case 98: +case 99: YY_RULE_SETUP -#line 1041 "dhcp6_lexer.ll" +#line 1050 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OUTPUT_OPTIONS: @@ -3281,9 +3293,9 @@ YY_RULE_SETUP } } YY_BREAK -case 99: +case 100: YY_RULE_SETUP -#line 1051 "dhcp6_lexer.ll" +#line 1060 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3293,9 +3305,9 @@ YY_RULE_SETUP } } YY_BREAK -case 100: +case 101: YY_RULE_SETUP -#line 1060 "dhcp6_lexer.ll" +#line 1069 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::LOGGERS: @@ -3305,9 +3317,9 @@ YY_RULE_SETUP } } YY_BREAK -case 101: +case 102: YY_RULE_SETUP -#line 1069 "dhcp6_lexer.ll" +#line 1078 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3318,9 +3330,9 @@ YY_RULE_SETUP } } YY_BREAK -case 102: +case 103: YY_RULE_SETUP -#line 1079 "dhcp6_lexer.ll" +#line 1088 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3334,9 +3346,9 @@ YY_RULE_SETUP } } YY_BREAK -case 103: +case 104: YY_RULE_SETUP -#line 1092 "dhcp6_lexer.ll" +#line 1101 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CLIENT_CLASSES: @@ -3347,9 +3359,9 @@ YY_RULE_SETUP } } YY_BREAK -case 104: +case 105: YY_RULE_SETUP -#line 1102 "dhcp6_lexer.ll" +#line 1111 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3359,9 +3371,9 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 106: YY_RULE_SETUP -#line 1111 "dhcp6_lexer.ll" +#line 1120 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3371,9 +3383,9 @@ YY_RULE_SETUP } } YY_BREAK -case 106: +case 107: YY_RULE_SETUP -#line 1120 "dhcp6_lexer.ll" +#line 1129 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3383,9 +3395,9 @@ YY_RULE_SETUP } } YY_BREAK -case 107: +case 108: YY_RULE_SETUP -#line 1129 "dhcp6_lexer.ll" +#line 1138 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::MAC_SOURCES: @@ -3397,9 +3409,9 @@ YY_RULE_SETUP } } YY_BREAK -case 108: +case 109: YY_RULE_SETUP -#line 1140 "dhcp6_lexer.ll" +#line 1149 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3410,9 +3422,9 @@ YY_RULE_SETUP } } YY_BREAK -case 109: +case 110: YY_RULE_SETUP -#line 1150 "dhcp6_lexer.ll" +#line 1159 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RESERVATIONS: @@ -3422,9 +3434,9 @@ YY_RULE_SETUP } } YY_BREAK -case 110: +case 111: YY_RULE_SETUP -#line 1159 "dhcp6_lexer.ll" +#line 1168 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS: @@ -3435,9 +3447,9 @@ YY_RULE_SETUP } } YY_BREAK -case 111: +case 112: YY_RULE_SETUP -#line 1169 "dhcp6_lexer.ll" +#line 1178 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3448,9 +3460,9 @@ YY_RULE_SETUP } } YY_BREAK -case 112: +case 113: YY_RULE_SETUP -#line 1179 "dhcp6_lexer.ll" +#line 1188 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DATA: @@ -3460,9 +3472,9 @@ YY_RULE_SETUP } } YY_BREAK -case 113: +case 114: YY_RULE_SETUP -#line 1188 "dhcp6_lexer.ll" +#line 1197 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3472,9 +3484,9 @@ YY_RULE_SETUP } } YY_BREAK -case 114: +case 115: YY_RULE_SETUP -#line 1197 "dhcp6_lexer.ll" +#line 1206 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3484,9 +3496,9 @@ YY_RULE_SETUP } } YY_BREAK -case 115: +case 116: YY_RULE_SETUP -#line 1206 "dhcp6_lexer.ll" +#line 1215 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::OPTION_DEF: @@ -3496,9 +3508,9 @@ YY_RULE_SETUP } } YY_BREAK -case 116: +case 117: YY_RULE_SETUP -#line 1215 "dhcp6_lexer.ll" +#line 1224 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SUBNET6: @@ -3509,9 +3521,9 @@ YY_RULE_SETUP } } YY_BREAK -case 117: +case 118: YY_RULE_SETUP -#line 1225 "dhcp6_lexer.ll" +#line 1234 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::RELAY: @@ -3521,9 +3533,9 @@ YY_RULE_SETUP } } YY_BREAK -case 118: +case 119: YY_RULE_SETUP -#line 1234 "dhcp6_lexer.ll" +#line 1243 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3533,9 +3545,9 @@ YY_RULE_SETUP } } YY_BREAK -case 119: +case 120: YY_RULE_SETUP -#line 1244 "dhcp6_lexer.ll" +#line 1253 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3545,9 +3557,9 @@ YY_RULE_SETUP } } YY_BREAK -case 120: +case 121: YY_RULE_SETUP -#line 1253 "dhcp6_lexer.ll" +#line 1262 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::HOOKS_LIBRARIES: @@ -3557,9 +3569,9 @@ YY_RULE_SETUP } } YY_BREAK -case 121: +case 122: YY_RULE_SETUP -#line 1262 "dhcp6_lexer.ll" +#line 1271 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3569,9 +3581,9 @@ YY_RULE_SETUP } } YY_BREAK -case 122: +case 123: YY_RULE_SETUP -#line 1271 "dhcp6_lexer.ll" +#line 1280 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3581,9 +3593,9 @@ YY_RULE_SETUP } } YY_BREAK -case 123: +case 124: YY_RULE_SETUP -#line 1280 "dhcp6_lexer.ll" +#line 1289 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3593,9 +3605,9 @@ YY_RULE_SETUP } } YY_BREAK -case 124: +case 125: YY_RULE_SETUP -#line 1289 "dhcp6_lexer.ll" +#line 1298 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DUID_TYPE: @@ -3605,9 +3617,9 @@ YY_RULE_SETUP } } YY_BREAK -case 125: +case 126: YY_RULE_SETUP -#line 1298 "dhcp6_lexer.ll" +#line 1307 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3617,9 +3629,9 @@ YY_RULE_SETUP } } YY_BREAK -case 126: +case 127: YY_RULE_SETUP -#line 1307 "dhcp6_lexer.ll" +#line 1316 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3629,9 +3641,9 @@ YY_RULE_SETUP } } YY_BREAK -case 127: +case 128: YY_RULE_SETUP -#line 1316 "dhcp6_lexer.ll" +#line 1325 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3641,9 +3653,9 @@ YY_RULE_SETUP } } YY_BREAK -case 128: +case 129: YY_RULE_SETUP -#line 1325 "dhcp6_lexer.ll" +#line 1334 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::SERVER_ID: @@ -3653,9 +3665,9 @@ YY_RULE_SETUP } } YY_BREAK -case 129: +case 130: YY_RULE_SETUP -#line 1334 "dhcp6_lexer.ll" +#line 1343 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3665,9 +3677,9 @@ YY_RULE_SETUP } } YY_BREAK -case 130: +case 131: YY_RULE_SETUP -#line 1343 "dhcp6_lexer.ll" +#line 1352 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3677,9 +3689,9 @@ YY_RULE_SETUP } } YY_BREAK -case 131: +case 132: YY_RULE_SETUP -#line 1352 "dhcp6_lexer.ll" +#line 1361 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3689,9 +3701,9 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 133: YY_RULE_SETUP -#line 1361 "dhcp6_lexer.ll" +#line 1370 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3701,9 +3713,9 @@ YY_RULE_SETUP } } YY_BREAK -case 133: +case 134: YY_RULE_SETUP -#line 1370 "dhcp6_lexer.ll" +#line 1379 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3713,9 +3725,9 @@ YY_RULE_SETUP } } YY_BREAK -case 134: +case 135: YY_RULE_SETUP -#line 1379 "dhcp6_lexer.ll" +#line 1388 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3725,9 +3737,9 @@ YY_RULE_SETUP } } YY_BREAK -case 135: +case 136: YY_RULE_SETUP -#line 1388 "dhcp6_lexer.ll" +#line 1397 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING: @@ -3737,9 +3749,9 @@ YY_RULE_SETUP } } YY_BREAK -case 136: +case 137: YY_RULE_SETUP -#line 1397 "dhcp6_lexer.ll" +#line 1406 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3749,9 +3761,9 @@ YY_RULE_SETUP } } YY_BREAK -case 137: +case 138: YY_RULE_SETUP -#line 1406 "dhcp6_lexer.ll" +#line 1415 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3761,9 +3773,9 @@ YY_RULE_SETUP } } YY_BREAK -case 138: +case 139: YY_RULE_SETUP -#line 1415 "dhcp6_lexer.ll" +#line 1424 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3773,9 +3785,9 @@ YY_RULE_SETUP } } YY_BREAK -case 139: +case 140: YY_RULE_SETUP -#line 1424 "dhcp6_lexer.ll" +#line 1433 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONTROL_SOCKET: @@ -3785,9 +3797,9 @@ YY_RULE_SETUP } } YY_BREAK -case 140: +case 141: YY_RULE_SETUP -#line 1433 "dhcp6_lexer.ll" +#line 1442 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::DHCP6: @@ -3797,9 +3809,9 @@ YY_RULE_SETUP } } YY_BREAK -case 141: +case 142: YY_RULE_SETUP -#line 1442 "dhcp6_lexer.ll" +#line 1451 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3809,9 +3821,9 @@ YY_RULE_SETUP } } YY_BREAK -case 142: +case 143: YY_RULE_SETUP -#line 1451 "dhcp6_lexer.ll" +#line 1460 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3821,9 +3833,9 @@ YY_RULE_SETUP } } YY_BREAK -case 143: +case 144: YY_RULE_SETUP -#line 1460 "dhcp6_lexer.ll" +#line 1469 "dhcp6_lexer.ll" { switch(driver.ctx_) { case isc::dhcp::Parser6Context::CONFIG: @@ -3833,9 +3845,9 @@ YY_RULE_SETUP } } YY_BREAK -case 144: +case 145: YY_RULE_SETUP -#line 1470 "dhcp6_lexer.ll" +#line 1479 "dhcp6_lexer.ll" { /* A string has been matched. It contains the actual string and single quotes. We need to get those quotes out of the way and just use its content, e.g. @@ -3935,65 +3947,65 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_); } YY_BREAK -case 145: -/* rule 145 can match eol */ +case 146: +/* rule 146 can match eol */ YY_RULE_SETUP -#line 1569 "dhcp6_lexer.ll" +#line 1578 "dhcp6_lexer.ll" { /* Bad string with a forbidden control character inside */ driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); } YY_BREAK -case 146: -/* rule 146 can match eol */ +case 147: +/* rule 147 can match eol */ YY_RULE_SETUP -#line 1574 "dhcp6_lexer.ll" +#line 1583 "dhcp6_lexer.ll" { /* Bad string with a bad escape inside */ driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); } YY_BREAK -case 147: +case 148: YY_RULE_SETUP -#line 1579 "dhcp6_lexer.ll" +#line 1588 "dhcp6_lexer.ll" { /* Bad string with an open escape at the end */ driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); } YY_BREAK -case 148: -YY_RULE_SETUP -#line 1584 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } - YY_BREAK case 149: YY_RULE_SETUP -#line 1585 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } +#line 1593 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); } YY_BREAK case 150: YY_RULE_SETUP -#line 1586 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } +#line 1594 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); } YY_BREAK case 151: YY_RULE_SETUP -#line 1587 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } +#line 1595 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); } YY_BREAK case 152: YY_RULE_SETUP -#line 1588 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } +#line 1596 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); } YY_BREAK case 153: YY_RULE_SETUP -#line 1589 "dhcp6_lexer.ll" -{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } +#line 1597 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); } YY_BREAK case 154: YY_RULE_SETUP -#line 1591 "dhcp6_lexer.ll" +#line 1598 "dhcp6_lexer.ll" +{ return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 1600 "dhcp6_lexer.ll" { /* An integer was found. */ std::string tmp(yytext); @@ -4012,9 +4024,9 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_); } YY_BREAK -case 155: +case 156: YY_RULE_SETUP -#line 1609 "dhcp6_lexer.ll" +#line 1618 "dhcp6_lexer.ll" { /* A floating point was found. */ std::string tmp(yytext); @@ -4028,43 +4040,43 @@ YY_RULE_SETUP return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_); } YY_BREAK -case 156: +case 157: YY_RULE_SETUP -#line 1622 "dhcp6_lexer.ll" +#line 1631 "dhcp6_lexer.ll" { string tmp(yytext); return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_); } YY_BREAK -case 157: +case 158: YY_RULE_SETUP -#line 1627 "dhcp6_lexer.ll" +#line 1636 "dhcp6_lexer.ll" { return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_); } YY_BREAK -case 158: -YY_RULE_SETUP -#line 1631 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); - YY_BREAK case 159: YY_RULE_SETUP -#line 1633 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); +#line 1640 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON true reserved keyword is lower case only"); YY_BREAK case 160: YY_RULE_SETUP -#line 1635 "dhcp6_lexer.ll" -driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); +#line 1642 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON false reserved keyword is lower case only"); YY_BREAK case 161: YY_RULE_SETUP -#line 1637 "dhcp6_lexer.ll" +#line 1644 "dhcp6_lexer.ll" +driver.error (driver.loc_, "JSON null reserved keyword is lower case only"); + YY_BREAK +case 162: +YY_RULE_SETUP +#line 1646 "dhcp6_lexer.ll" driver.error (driver.loc_, "Invalid character: " + std::string(yytext)); YY_BREAK case YY_STATE_EOF(INITIAL): -#line 1639 "dhcp6_lexer.ll" +#line 1648 "dhcp6_lexer.ll" { if (driver.states_.empty()) { return isc::dhcp::Dhcp6Parser::make_END(driver.loc_); @@ -4088,12 +4100,12 @@ case YY_STATE_EOF(INITIAL): BEGIN(DIR_EXIT); } YY_BREAK -case 162: +case 163: YY_RULE_SETUP -#line 1662 "dhcp6_lexer.ll" +#line 1671 "dhcp6_lexer.ll" ECHO; YY_BREAK -#line 4096 "dhcp6_lexer.cc" +#line 4108 "dhcp6_lexer.cc" case YY_END_OF_BUFFER: { @@ -4412,7 +4424,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1272 ) + if ( yy_current_state >= 1274 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4445,11 +4457,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1272 ) + if ( yy_current_state >= 1274 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1271); + yy_is_jam = (yy_current_state == 1273); return yy_is_jam ? 0 : yy_current_state; } @@ -5198,7 +5210,7 @@ void yyfree (void * ptr ) /* %ok-for-header */ -#line 1662 "dhcp6_lexer.ll" +#line 1671 "dhcp6_lexer.ll" using namespace isc::dhcp; diff --git a/src/bin/dhcp6/dhcp6_parser.cc b/src/bin/dhcp6/dhcp6_parser.cc index 8bc1713414..66bd478a51 100644 --- a/src/bin/dhcp6/dhcp6_parser.cc +++ b/src/bin/dhcp6/dhcp6_parser.cc @@ -253,29 +253,29 @@ namespace isc { namespace dhcp { { switch (that.type_get ()) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.move< ElementPtr > (that.value); break; - case 156: // "boolean" + case 157: // "boolean" value.move< bool > (that.value); break; - case 155: // "floating point" + case 156: // "floating point" value.move< double > (that.value); break; - case 154: // "integer" + case 155: // "integer" value.move< int64_t > (that.value); break; - case 153: // "constant string" + case 154: // "constant string" value.move< std::string > (that.value); break; @@ -294,29 +294,29 @@ namespace isc { namespace dhcp { state = that.state; switch (that.type_get ()) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.copy< ElementPtr > (that.value); break; - case 156: // "boolean" + case 157: // "boolean" value.copy< bool > (that.value); break; - case 155: // "floating point" + case 156: // "floating point" value.copy< double > (that.value); break; - case 154: // "integer" + case 155: // "integer" value.copy< int64_t > (that.value); break; - case 153: // "constant string" + case 154: // "constant string" value.copy< std::string > (that.value); break; @@ -356,79 +356,79 @@ namespace isc { namespace dhcp { << yysym.location << ": "; switch (yytype) { - case 153: // "constant string" + case 154: // "constant string" -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } #line 364 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 154: // "integer" + case 155: // "integer" -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< int64_t > (); } #line 371 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 155: // "floating point" + case 156: // "floating point" -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< double > (); } #line 378 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 156: // "boolean" + case 157: // "boolean" -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< bool > (); } #line 385 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 173: // value + case 174: // value -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 392 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 177: // map_value + case 178: // map_value -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 399 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 221: // db_type + case 228: // db_type -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 406 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 297: // hr_mode + case 304: // hr_mode -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 413 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 431: // duid_type + case 438: // duid_type -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 420 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 464: // ncr_protocol_value + case 471: // ncr_protocol_value -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 427 "dhcp6_parser.cc" // lalr1.cc:636 break; - case 472: // replace_client_name_value + case 479: // replace_client_name_value -#line 229 "dhcp6_parser.yy" // lalr1.cc:636 +#line 230 "dhcp6_parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< ElementPtr > (); } #line 434 "dhcp6_parser.cc" // lalr1.cc:636 break; @@ -630,29 +630,29 @@ namespace isc { namespace dhcp { when using variants. */ switch (yyr1_[yyn]) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value yylhs.value.build< ElementPtr > (); break; - case 156: // "boolean" + case 157: // "boolean" yylhs.value.build< bool > (); break; - case 155: // "floating point" + case 156: // "floating point" yylhs.value.build< double > (); break; - case 154: // "integer" + case 155: // "integer" yylhs.value.build< int64_t > (); break; - case 153: // "constant string" + case 154: // "constant string" yylhs.value.build< std::string > (); break; @@ -674,133 +674,133 @@ namespace isc { namespace dhcp { switch (yyn) { case 2: -#line 238 "dhcp6_parser.yy" // lalr1.cc:859 +#line 239 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.NO_KEYWORD; } #line 680 "dhcp6_parser.cc" // lalr1.cc:859 break; case 4: -#line 239 "dhcp6_parser.yy" // lalr1.cc:859 +#line 240 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.CONFIG; } #line 686 "dhcp6_parser.cc" // lalr1.cc:859 break; case 6: -#line 240 "dhcp6_parser.yy" // lalr1.cc:859 +#line 241 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } #line 692 "dhcp6_parser.cc" // lalr1.cc:859 break; case 8: -#line 241 "dhcp6_parser.yy" // lalr1.cc:859 +#line 242 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.INTERFACES_CONFIG; } #line 698 "dhcp6_parser.cc" // lalr1.cc:859 break; case 10: -#line 242 "dhcp6_parser.yy" // lalr1.cc:859 +#line 243 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.SUBNET6; } #line 704 "dhcp6_parser.cc" // lalr1.cc:859 break; case 12: -#line 243 "dhcp6_parser.yy" // lalr1.cc:859 +#line 244 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.POOLS; } #line 710 "dhcp6_parser.cc" // lalr1.cc:859 break; case 14: -#line 244 "dhcp6_parser.yy" // lalr1.cc:859 +#line 245 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.PD_POOLS; } #line 716 "dhcp6_parser.cc" // lalr1.cc:859 break; case 16: -#line 245 "dhcp6_parser.yy" // lalr1.cc:859 +#line 246 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.RESERVATIONS; } #line 722 "dhcp6_parser.cc" // lalr1.cc:859 break; case 18: -#line 246 "dhcp6_parser.yy" // lalr1.cc:859 +#line 247 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP6; } #line 728 "dhcp6_parser.cc" // lalr1.cc:859 break; case 20: -#line 247 "dhcp6_parser.yy" // lalr1.cc:859 +#line 248 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DEF; } #line 734 "dhcp6_parser.cc" // lalr1.cc:859 break; case 22: -#line 248 "dhcp6_parser.yy" // lalr1.cc:859 +#line 249 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.OPTION_DATA; } #line 740 "dhcp6_parser.cc" // lalr1.cc:859 break; case 24: -#line 249 "dhcp6_parser.yy" // lalr1.cc:859 +#line 250 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.HOOKS_LIBRARIES; } #line 746 "dhcp6_parser.cc" // lalr1.cc:859 break; case 26: -#line 250 "dhcp6_parser.yy" // lalr1.cc:859 +#line 251 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.DHCP_DDNS; } #line 752 "dhcp6_parser.cc" // lalr1.cc:859 break; case 28: -#line 251 "dhcp6_parser.yy" // lalr1.cc:859 +#line 252 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.ctx_ = ctx.LOGGING; } #line 758 "dhcp6_parser.cc" // lalr1.cc:859 break; case 30: -#line 259 "dhcp6_parser.yy" // lalr1.cc:859 +#line 260 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); } #line 764 "dhcp6_parser.cc" // lalr1.cc:859 break; case 31: -#line 260 "dhcp6_parser.yy" // lalr1.cc:859 +#line 261 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); } #line 770 "dhcp6_parser.cc" // lalr1.cc:859 break; case 32: -#line 261 "dhcp6_parser.yy" // lalr1.cc:859 +#line 262 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); } #line 776 "dhcp6_parser.cc" // lalr1.cc:859 break; case 33: -#line 262 "dhcp6_parser.yy" // lalr1.cc:859 +#line 263 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); } #line 782 "dhcp6_parser.cc" // lalr1.cc:859 break; case 34: -#line 263 "dhcp6_parser.yy" // lalr1.cc:859 +#line 264 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); } #line 788 "dhcp6_parser.cc" // lalr1.cc:859 break; case 35: -#line 264 "dhcp6_parser.yy" // lalr1.cc:859 +#line 265 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 794 "dhcp6_parser.cc" // lalr1.cc:859 break; case 36: -#line 265 "dhcp6_parser.yy" // lalr1.cc:859 +#line 266 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 800 "dhcp6_parser.cc" // lalr1.cc:859 break; case 37: -#line 268 "dhcp6_parser.yy" // lalr1.cc:859 +#line 269 "dhcp6_parser.yy" // lalr1.cc:859 { // Push back the JSON value on the stack ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ()); @@ -809,7 +809,7 @@ namespace isc { namespace dhcp { break; case 38: -#line 273 "dhcp6_parser.yy" // lalr1.cc:859 +#line 274 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -820,7 +820,7 @@ namespace isc { namespace dhcp { break; case 39: -#line 278 "dhcp6_parser.yy" // lalr1.cc:859 +#line 279 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -830,13 +830,13 @@ namespace isc { namespace dhcp { break; case 40: -#line 284 "dhcp6_parser.yy" // lalr1.cc:859 +#line 285 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); } #line 836 "dhcp6_parser.cc" // lalr1.cc:859 break; case 43: -#line 291 "dhcp6_parser.yy" // lalr1.cc:859 +#line 292 "dhcp6_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 > ()); @@ -845,7 +845,7 @@ namespace isc { namespace dhcp { break; case 44: -#line 295 "dhcp6_parser.yy" // lalr1.cc:859 +#line 296 "dhcp6_parser.yy" // lalr1.cc:859 { // map consisting of a shorter map followed by // comma and string:value @@ -855,7 +855,7 @@ namespace isc { namespace dhcp { break; case 45: -#line 302 "dhcp6_parser.yy" // lalr1.cc:859 +#line 303 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(l); @@ -864,7 +864,7 @@ namespace isc { namespace dhcp { break; case 46: -#line 305 "dhcp6_parser.yy" // lalr1.cc:859 +#line 306 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here } @@ -872,7 +872,7 @@ namespace isc { namespace dhcp { break; case 49: -#line 313 "dhcp6_parser.yy" // lalr1.cc:859 +#line 314 "dhcp6_parser.yy" // lalr1.cc:859 { // List consisting of a single element. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -881,7 +881,7 @@ namespace isc { namespace dhcp { break; case 50: -#line 317 "dhcp6_parser.yy" // lalr1.cc:859 +#line 318 "dhcp6_parser.yy" // lalr1.cc:859 { // List ending with , and a value. ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ()); @@ -890,7 +890,7 @@ namespace isc { namespace dhcp { break; case 51: -#line 324 "dhcp6_parser.yy" // lalr1.cc:859 +#line 325 "dhcp6_parser.yy" // lalr1.cc:859 { // List parsing about to start } @@ -898,7 +898,7 @@ namespace isc { namespace dhcp { break; case 52: -#line 326 "dhcp6_parser.yy" // lalr1.cc:859 +#line 327 "dhcp6_parser.yy" // lalr1.cc:859 { // list parsing complete. Put any sanity checking here //ctx.stack_.pop_back(); @@ -907,7 +907,7 @@ namespace isc { namespace dhcp { break; case 55: -#line 335 "dhcp6_parser.yy" // lalr1.cc:859 +#line 336 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -916,7 +916,7 @@ namespace isc { namespace dhcp { break; case 56: -#line 339 "dhcp6_parser.yy" // lalr1.cc:859 +#line 340 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(s); @@ -925,7 +925,7 @@ namespace isc { namespace dhcp { break; case 57: -#line 350 "dhcp6_parser.yy" // lalr1.cc:859 +#line 351 "dhcp6_parser.yy" // lalr1.cc:859 { const std::string& where = ctx.contextName(); const std::string& keyword = yystack_[1].value.as< std::string > (); @@ -936,7 +936,7 @@ namespace isc { namespace dhcp { break; case 58: -#line 360 "dhcp6_parser.yy" // lalr1.cc:859 +#line 361 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -947,7 +947,7 @@ namespace isc { namespace dhcp { break; case 59: -#line 365 "dhcp6_parser.yy" // lalr1.cc:859 +#line 366 "dhcp6_parser.yy" // lalr1.cc:859 { // map parsing completed. If we ever want to do any wrap up // (maybe some sanity checking), this would be the best place @@ -960,7 +960,7 @@ namespace isc { namespace dhcp { break; case 68: -#line 388 "dhcp6_parser.yy" // lalr1.cc:859 +#line 389 "dhcp6_parser.yy" // lalr1.cc:859 { // This code is executed when we're about to start parsing // the content of the map @@ -973,7 +973,7 @@ namespace isc { namespace dhcp { break; case 69: -#line 395 "dhcp6_parser.yy" // lalr1.cc:859 +#line 396 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required ctx.stack_.pop_back(); @@ -983,7 +983,7 @@ namespace isc { namespace dhcp { break; case 70: -#line 403 "dhcp6_parser.yy" // lalr1.cc:859 +#line 404 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Dhcp6 map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -993,7 +993,7 @@ namespace isc { namespace dhcp { break; case 71: -#line 407 "dhcp6_parser.yy" // lalr1.cc:859 +#line 408 "dhcp6_parser.yy" // lalr1.cc:859 { // No global parameter is required // parsing completed @@ -1001,8 +1001,8 @@ namespace isc { namespace dhcp { #line 1002 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 99: -#line 445 "dhcp6_parser.yy" // lalr1.cc:859 + case 100: +#line 447 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("preferred-lifetime", prf); @@ -1010,8 +1010,8 @@ namespace isc { namespace dhcp { #line 1011 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 100: -#line 450 "dhcp6_parser.yy" // lalr1.cc:859 + case 101: +#line 452 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("valid-lifetime", prf); @@ -1019,8 +1019,8 @@ namespace isc { namespace dhcp { #line 1020 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 101: -#line 455 "dhcp6_parser.yy" // lalr1.cc:859 + case 102: +#line 457 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("renew-timer", prf); @@ -1028,8 +1028,8 @@ namespace isc { namespace dhcp { #line 1029 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 102: -#line 460 "dhcp6_parser.yy" // lalr1.cc:859 + case 103: +#line 462 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rebind-timer", prf); @@ -1037,8 +1037,8 @@ namespace isc { namespace dhcp { #line 1038 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 103: -#line 465 "dhcp6_parser.yy" // lalr1.cc:859 + case 104: +#line 467 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("decline-probation-period", dpp); @@ -1046,8 +1046,8 @@ namespace isc { namespace dhcp { #line 1047 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 104: -#line 470 "dhcp6_parser.yy" // lalr1.cc:859 + case 105: +#line 472 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces-config", i); @@ -1057,8 +1057,8 @@ namespace isc { namespace dhcp { #line 1058 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 105: -#line 475 "dhcp6_parser.yy" // lalr1.cc:859 + case 106: +#line 477 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required ctx.stack_.pop_back(); @@ -1067,8 +1067,8 @@ namespace isc { namespace dhcp { #line 1068 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 106: -#line 481 "dhcp6_parser.yy" // lalr1.cc:859 + case 107: +#line 483 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the interfaces-config map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); @@ -1077,8 +1077,8 @@ namespace isc { namespace dhcp { #line 1078 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 107: -#line 485 "dhcp6_parser.yy" // lalr1.cc:859 + case 108: +#line 487 "dhcp6_parser.yy" // lalr1.cc:859 { // No interfaces config param is required // parsing completed @@ -1086,8 +1086,8 @@ namespace isc { namespace dhcp { #line 1087 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 115: -#line 501 "dhcp6_parser.yy" // lalr1.cc:859 + case 116: +#line 503 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interfaces", l); @@ -1097,8 +1097,8 @@ namespace isc { namespace dhcp { #line 1098 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 116: -#line 506 "dhcp6_parser.yy" // lalr1.cc:859 + case 117: +#line 508 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); @@ -1106,8 +1106,8 @@ namespace isc { namespace dhcp { #line 1107 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 117: -#line 511 "dhcp6_parser.yy" // lalr1.cc:859 + case 118: +#line 513 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("re-detect", b); @@ -1115,8 +1115,8 @@ namespace isc { namespace dhcp { #line 1116 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 118: -#line 517 "dhcp6_parser.yy" // lalr1.cc:859 + case 119: +#line 519 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lease-database", i); @@ -1126,8 +1126,8 @@ namespace isc { namespace dhcp { #line 1127 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 119: -#line 522 "dhcp6_parser.yy" // lalr1.cc:859 + case 120: +#line 524 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1137,8 +1137,8 @@ namespace isc { namespace dhcp { #line 1138 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 120: -#line 529 "dhcp6_parser.yy" // lalr1.cc:859 + case 121: +#line 531 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hosts-database", i); @@ -1148,8 +1148,8 @@ namespace isc { namespace dhcp { #line 1149 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 121: -#line 534 "dhcp6_parser.yy" // lalr1.cc:859 + case 122: +#line 536 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); @@ -1159,498 +1159,538 @@ namespace isc { namespace dhcp { #line 1160 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 137: -#line 560 "dhcp6_parser.yy" // lalr1.cc:859 + case 123: +#line 543 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("hosts-databases", l); + ctx.stack_.push_back(l); + ctx.enter(ctx.HOSTS_DATABASE); +} +#line 1171 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 124: +#line 548 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.pop_back(); + ctx.leave(); +} +#line 1180 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 129: +#line 561 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); +} +#line 1190 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 130: +#line 565 "dhcp6_parser.yy" // lalr1.cc:859 + { + // The type parameter is required + ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 1200 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 146: +#line 590 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.DATABASE_TYPE); } -#line 1168 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1208 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 138: -#line 562 "dhcp6_parser.yy" // lalr1.cc:859 + case 147: +#line 592 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1177 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1217 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 139: -#line 567 "dhcp6_parser.yy" // lalr1.cc:859 + case 148: +#line 597 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); } -#line 1183 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1223 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 140: -#line 568 "dhcp6_parser.yy" // lalr1.cc:859 + case 149: +#line 598 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); } -#line 1189 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1229 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 141: -#line 569 "dhcp6_parser.yy" // lalr1.cc:859 + case 150: +#line 599 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); } -#line 1195 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1235 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 142: -#line 570 "dhcp6_parser.yy" // lalr1.cc:859 + case 151: +#line 600 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); } -#line 1201 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1241 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 143: -#line 573 "dhcp6_parser.yy" // lalr1.cc:859 + case 152: +#line 603 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1209 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1249 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 144: -#line 575 "dhcp6_parser.yy" // lalr1.cc:859 + case 153: +#line 605 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("user", user); ctx.leave(); } -#line 1219 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1259 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 145: -#line 581 "dhcp6_parser.yy" // lalr1.cc:859 + case 154: +#line 611 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1227 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1267 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 146: -#line 583 "dhcp6_parser.yy" // lalr1.cc:859 + case 155: +#line 613 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("password", pwd); ctx.leave(); } -#line 1237 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1277 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 147: -#line 589 "dhcp6_parser.yy" // lalr1.cc:859 + case 156: +#line 619 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1245 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1285 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 148: -#line 591 "dhcp6_parser.yy" // lalr1.cc:859 + case 157: +#line 621 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host", h); ctx.leave(); } -#line 1255 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1295 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 149: -#line 597 "dhcp6_parser.yy" // lalr1.cc:859 + case 158: +#line 627 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("port", p); } -#line 1264 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1304 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 150: -#line 602 "dhcp6_parser.yy" // lalr1.cc:859 + case 159: +#line 632 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1272 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1312 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 151: -#line 604 "dhcp6_parser.yy" // lalr1.cc:859 + case 160: +#line 634 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("name", name); ctx.leave(); } -#line 1282 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1322 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 152: -#line 610 "dhcp6_parser.yy" // lalr1.cc:859 + case 161: +#line 640 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("persist", n); } -#line 1291 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1331 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 153: -#line 615 "dhcp6_parser.yy" // lalr1.cc:859 + case 162: +#line 645 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("lfc-interval", n); } -#line 1300 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1340 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 154: -#line 620 "dhcp6_parser.yy" // lalr1.cc:859 + case 163: +#line 650 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("readonly", n); } -#line 1309 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1349 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 155: -#line 625 "dhcp6_parser.yy" // lalr1.cc:859 + case 164: +#line 655 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("connect-timeout", n); } -#line 1318 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1358 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 156: -#line 630 "dhcp6_parser.yy" // lalr1.cc:859 + case 165: +#line 660 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1326 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1366 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 157: -#line 632 "dhcp6_parser.yy" // lalr1.cc:859 + case 166: +#line 662 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("contact-points", cp); ctx.leave(); } -#line 1336 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1376 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 158: -#line 638 "dhcp6_parser.yy" // lalr1.cc:859 + case 167: +#line 668 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1344 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1384 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 159: -#line 640 "dhcp6_parser.yy" // lalr1.cc:859 + case 168: +#line 670 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("keyspace", ks); ctx.leave(); } -#line 1354 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1394 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 160: -#line 647 "dhcp6_parser.yy" // lalr1.cc:859 + case 169: +#line 677 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("mac-sources", l); ctx.stack_.push_back(l); ctx.enter(ctx.MAC_SOURCES); } -#line 1365 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1405 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 161: -#line 652 "dhcp6_parser.yy" // lalr1.cc:859 + case 170: +#line 682 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1374 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1414 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 166: -#line 665 "dhcp6_parser.yy" // lalr1.cc:859 + case 175: +#line 695 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1383 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1423 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 167: -#line 670 "dhcp6_parser.yy" // lalr1.cc:859 + case 176: +#line 700 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(duid); } -#line 1392 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1432 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 168: -#line 675 "dhcp6_parser.yy" // lalr1.cc:859 + case 177: +#line 705 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); } -#line 1403 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1443 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 169: -#line 680 "dhcp6_parser.yy" // lalr1.cc:859 + case 178: +#line 710 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1412 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1452 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 175: -#line 694 "dhcp6_parser.yy" // lalr1.cc:859 + case 184: +#line 724 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(hwaddr); } -#line 1421 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1461 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 176: -#line 699 "dhcp6_parser.yy" // lalr1.cc:859 + case 185: +#line 729 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(flex_id); } -#line 1430 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1470 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 177: -#line 706 "dhcp6_parser.yy" // lalr1.cc:859 + case 186: +#line 736 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay-supplied-options", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 1441 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1481 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 178: -#line 711 "dhcp6_parser.yy" // lalr1.cc:859 + case 187: +#line 741 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1450 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1490 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 179: -#line 716 "dhcp6_parser.yy" // lalr1.cc:859 + case 188: +#line 746 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); } -#line 1461 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1501 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 180: -#line 721 "dhcp6_parser.yy" // lalr1.cc:859 + case 189: +#line 751 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1470 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 185: -#line 734 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->add(m); - ctx.stack_.push_back(m); -} -#line 1480 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 186: -#line 738 "dhcp6_parser.yy" // lalr1.cc:859 - { - // The library hooks parameter is required - ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.stack_.pop_back(); -} -#line 1490 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 187: -#line 744 "dhcp6_parser.yy" // lalr1.cc:859 - { - // Parse the hooks-libraries list entry map - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.push_back(m); -} -#line 1500 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 188: -#line 748 "dhcp6_parser.yy" // lalr1.cc:859 - { - // The library hooks parameter is required - ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - // parsing completed -} #line 1510 "dhcp6_parser.cc" // lalr1.cc:859 break; case 194: -#line 763 "dhcp6_parser.yy" // lalr1.cc:859 +#line 764 "dhcp6_parser.yy" // lalr1.cc:859 { - ctx.enter(ctx.NO_KEYWORD); + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); } -#line 1518 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1520 "dhcp6_parser.cc" // lalr1.cc:859 break; case 195: -#line 765 "dhcp6_parser.yy" // lalr1.cc:859 +#line 768 "dhcp6_parser.yy" // lalr1.cc:859 + { + // The library hooks parameter is required + ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 1530 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 196: +#line 774 "dhcp6_parser.yy" // lalr1.cc:859 + { + // Parse the hooks-libraries list entry map + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.push_back(m); +} +#line 1540 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 197: +#line 778 "dhcp6_parser.yy" // lalr1.cc:859 + { + // The library hooks parameter is required + ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + // parsing completed +} +#line 1550 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 203: +#line 793 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 1558 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 204: +#line 795 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("library", lib); ctx.leave(); } -#line 1528 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1568 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 196: -#line 771 "dhcp6_parser.yy" // lalr1.cc:859 + case 205: +#line 801 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1536 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1576 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 197: -#line 773 "dhcp6_parser.yy" // lalr1.cc:859 + case 206: +#line 803 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1545 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1585 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 198: -#line 779 "dhcp6_parser.yy" // lalr1.cc:859 + case 207: +#line 809 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.EXPIRED_LEASES_PROCESSING); } -#line 1556 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1596 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 199: -#line 784 "dhcp6_parser.yy" // lalr1.cc:859 + case 208: +#line 814 "dhcp6_parser.yy" // lalr1.cc:859 { // No expired lease parameter is required ctx.stack_.pop_back(); ctx.leave(); } -#line 1566 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1606 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 208: -#line 802 "dhcp6_parser.yy" // lalr1.cc:859 + case 217: +#line 832 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reclaim-timer-wait-time", value); } -#line 1575 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1615 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 209: -#line 807 "dhcp6_parser.yy" // lalr1.cc:859 + case 218: +#line 837 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value); } -#line 1584 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1624 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 210: -#line 812 "dhcp6_parser.yy" // lalr1.cc:859 + case 219: +#line 842 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hold-reclaimed-time", value); } -#line 1593 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1633 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 211: -#line 817 "dhcp6_parser.yy" // lalr1.cc:859 + case 220: +#line 847 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-leases", value); } -#line 1602 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1642 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 212: -#line 822 "dhcp6_parser.yy" // lalr1.cc:859 + case 221: +#line 852 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-reclaim-time", value); } -#line 1611 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1651 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 213: -#line 827 "dhcp6_parser.yy" // lalr1.cc:859 + case 222: +#line 857 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("unwarned-reclaim-cycles", value); } -#line 1620 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1660 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 214: -#line 835 "dhcp6_parser.yy" // lalr1.cc:859 + case 223: +#line 865 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet6", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET6); } -#line 1631 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1671 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 215: -#line 840 "dhcp6_parser.yy" // lalr1.cc:859 + case 224: +#line 870 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1640 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1680 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 220: -#line 860 "dhcp6_parser.yy" // lalr1.cc:859 + case 229: +#line 890 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1650 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1690 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 221: -#line 864 "dhcp6_parser.yy" // lalr1.cc:859 + case 230: +#line 894 "dhcp6_parser.yy" // lalr1.cc:859 { // Once we reached this place, the subnet parsing is now complete. // If we want to, we can implement default values here. @@ -1672,263 +1712,263 @@ namespace isc { namespace dhcp { ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 1676 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1716 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 222: -#line 886 "dhcp6_parser.yy" // lalr1.cc:859 + case 231: +#line 916 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the subnet6 list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1686 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1726 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 223: -#line 890 "dhcp6_parser.yy" // lalr1.cc:859 + case 232: +#line 920 "dhcp6_parser.yy" // lalr1.cc:859 { // The subnet subnet6 parameter is required ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1696 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1736 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 245: -#line 923 "dhcp6_parser.yy" // lalr1.cc:859 + case 254: +#line 953 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1704 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1744 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 246: -#line 925 "dhcp6_parser.yy" // lalr1.cc:859 + case 255: +#line 955 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); } -#line 1714 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1754 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 247: -#line 931 "dhcp6_parser.yy" // lalr1.cc:859 + case 256: +#line 961 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1722 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1762 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 248: -#line 933 "dhcp6_parser.yy" // lalr1.cc:859 + case 257: +#line 963 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface", iface); ctx.leave(); } -#line 1732 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1772 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 249: -#line 939 "dhcp6_parser.yy" // lalr1.cc:859 + case 258: +#line 969 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1740 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1780 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 250: -#line 941 "dhcp6_parser.yy" // lalr1.cc:859 + case 259: +#line 971 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("interface-id", iface); ctx.leave(); } -#line 1750 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1790 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 251: -#line 947 "dhcp6_parser.yy" // lalr1.cc:859 + case 260: +#line 977 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.CLIENT_CLASS); } -#line 1758 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1798 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 252: -#line 949 "dhcp6_parser.yy" // lalr1.cc:859 + case 261: +#line 979 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); } -#line 1768 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1808 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 253: -#line 955 "dhcp6_parser.yy" // lalr1.cc:859 + case 262: +#line 985 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.RESERVATION_MODE); } -#line 1776 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1816 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 254: -#line 957 "dhcp6_parser.yy" // lalr1.cc:859 + case 263: +#line 987 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 1785 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1825 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 255: -#line 962 "dhcp6_parser.yy" // lalr1.cc:859 + case 264: +#line 992 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); } -#line 1791 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1831 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 256: -#line 963 "dhcp6_parser.yy" // lalr1.cc:859 + case 265: +#line 993 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); } -#line 1797 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1837 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 257: -#line 964 "dhcp6_parser.yy" // lalr1.cc:859 + case 266: +#line 994 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); } -#line 1803 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1843 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 258: -#line 967 "dhcp6_parser.yy" // lalr1.cc:859 + case 267: +#line 997 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("id", id); } -#line 1812 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1852 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 259: -#line 972 "dhcp6_parser.yy" // lalr1.cc:859 + case 268: +#line 1002 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("rapid-commit", rc); } -#line 1821 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1861 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 260: -#line 980 "dhcp6_parser.yy" // lalr1.cc:859 + case 269: +#line 1010 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("shared-networks", l); ctx.stack_.push_back(l); ctx.enter(ctx.SHARED_NETWORK); } -#line 1832 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1872 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 261: -#line 985 "dhcp6_parser.yy" // lalr1.cc:859 + case 270: +#line 1015 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1841 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1881 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 266: -#line 1000 "dhcp6_parser.yy" // lalr1.cc:859 + case 275: +#line 1030 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 1851 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1891 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 267: -#line 1004 "dhcp6_parser.yy" // lalr1.cc:859 + case 276: +#line 1034 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 1859 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1899 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 286: -#line 1034 "dhcp6_parser.yy" // lalr1.cc:859 + case 295: +#line 1064 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-def", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DEF); } -#line 1870 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1910 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 287: -#line 1039 "dhcp6_parser.yy" // lalr1.cc:859 + case 296: +#line 1069 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 1879 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1919 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 288: -#line 1047 "dhcp6_parser.yy" // lalr1.cc:859 + case 297: +#line 1077 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 1888 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 289: -#line 1050 "dhcp6_parser.yy" // lalr1.cc:859 - { - // parsing completed -} -#line 1896 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 294: -#line 1066 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->add(m); - ctx.stack_.push_back(m); -} -#line 1906 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 295: -#line 1070 "dhcp6_parser.yy" // lalr1.cc:859 - { - // The name, code and type option def parameters are required. - ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); - ctx.stack_.pop_back(); -} -#line 1918 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 296: -#line 1081 "dhcp6_parser.yy" // lalr1.cc:859 - { - // Parse the option-def list entry map - ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); - ctx.stack_.push_back(m); -} #line 1928 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 297: -#line 1085 "dhcp6_parser.yy" // lalr1.cc:859 + case 298: +#line 1080 "dhcp6_parser.yy" // lalr1.cc:859 + { + // parsing completed +} +#line 1936 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 303: +#line 1096 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->add(m); + ctx.stack_.push_back(m); +} +#line 1946 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 304: +#line 1100 "dhcp6_parser.yy" // lalr1.cc:859 + { + // The name, code and type option def parameters are required. + ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.require("code", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); + ctx.stack_.pop_back(); +} +#line 1958 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 305: +#line 1111 "dhcp6_parser.yy" // lalr1.cc:859 + { + // Parse the option-def list entry map + ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); + ctx.stack_.push_back(m); +} +#line 1968 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 306: +#line 1115 "dhcp6_parser.yy" // lalr1.cc:859 { // The name, code and type option def parameters are required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -1936,280 +1976,280 @@ namespace isc { namespace dhcp { ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 1940 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1980 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 313: -#line 1117 "dhcp6_parser.yy" // lalr1.cc:859 + case 322: +#line 1147 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("code", code); } -#line 1949 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1989 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 315: -#line 1124 "dhcp6_parser.yy" // lalr1.cc:859 + case 324: +#line 1154 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1957 "dhcp6_parser.cc" // lalr1.cc:859 +#line 1997 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 316: -#line 1126 "dhcp6_parser.yy" // lalr1.cc:859 + case 325: +#line 1156 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("type", prf); ctx.leave(); } -#line 1967 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2007 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 317: -#line 1132 "dhcp6_parser.yy" // lalr1.cc:859 + case 326: +#line 1162 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1975 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2015 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 318: -#line 1134 "dhcp6_parser.yy" // lalr1.cc:859 + case 327: +#line 1164 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("record-types", rtypes); ctx.leave(); } -#line 1985 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2025 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 319: -#line 1140 "dhcp6_parser.yy" // lalr1.cc:859 + case 328: +#line 1170 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 1993 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2033 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 320: -#line 1142 "dhcp6_parser.yy" // lalr1.cc:859 + case 329: +#line 1172 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("space", space); ctx.leave(); } -#line 2003 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2043 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 322: -#line 1150 "dhcp6_parser.yy" // lalr1.cc:859 + case 331: +#line 1180 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2011 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2051 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 323: -#line 1152 "dhcp6_parser.yy" // lalr1.cc:859 + case 332: +#line 1182 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("encapsulate", encap); ctx.leave(); } -#line 2021 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2061 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 324: -#line 1158 "dhcp6_parser.yy" // lalr1.cc:859 + case 333: +#line 1188 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("array", array); } -#line 2030 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2070 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 325: -#line 1167 "dhcp6_parser.yy" // lalr1.cc:859 + case 334: +#line 1197 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); } -#line 2041 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2081 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 326: -#line 1172 "dhcp6_parser.yy" // lalr1.cc:859 + case 335: +#line 1202 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2050 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2090 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 331: -#line 1191 "dhcp6_parser.yy" // lalr1.cc:859 + case 340: +#line 1221 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2060 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2100 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 332: -#line 1195 "dhcp6_parser.yy" // lalr1.cc:859 + case 341: +#line 1225 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. ctx.stack_.pop_back(); } -#line 2069 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2109 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 333: -#line 1203 "dhcp6_parser.yy" // lalr1.cc:859 + case 342: +#line 1233 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the option-data list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2079 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2119 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 334: -#line 1207 "dhcp6_parser.yy" // lalr1.cc:859 + case 343: +#line 1237 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: the code or name parameters are required. // parsing completed } -#line 2088 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2128 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 349: -#line 1240 "dhcp6_parser.yy" // lalr1.cc:859 + case 358: +#line 1270 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2096 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2136 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 350: -#line 1242 "dhcp6_parser.yy" // lalr1.cc:859 + case 359: +#line 1272 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("data", data); ctx.leave(); } -#line 2106 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2146 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 353: -#line 1252 "dhcp6_parser.yy" // lalr1.cc:859 + case 362: +#line 1282 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("csv-format", space); } -#line 2115 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2155 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 354: -#line 1257 "dhcp6_parser.yy" // lalr1.cc:859 + case 363: +#line 1287 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-send", persist); } -#line 2124 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2164 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 355: -#line 1265 "dhcp6_parser.yy" // lalr1.cc:859 + case 364: +#line 1295 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); } -#line 2135 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2175 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 356: -#line 1270 "dhcp6_parser.yy" // lalr1.cc:859 + case 365: +#line 1300 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2144 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2184 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 361: -#line 1285 "dhcp6_parser.yy" // lalr1.cc:859 + case 370: +#line 1315 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2154 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2194 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 362: -#line 1289 "dhcp6_parser.yy" // lalr1.cc:859 + case 371: +#line 1319 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2164 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2204 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 363: -#line 1295 "dhcp6_parser.yy" // lalr1.cc:859 + case 372: +#line 1325 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2174 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2214 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 364: -#line 1299 "dhcp6_parser.yy" // lalr1.cc:859 + case 373: +#line 1329 "dhcp6_parser.yy" // lalr1.cc:859 { // The pool parameter is required. ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); } -#line 2183 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2223 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 373: -#line 1316 "dhcp6_parser.yy" // lalr1.cc:859 + case 382: +#line 1346 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2191 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2231 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 374: -#line 1318 "dhcp6_parser.yy" // lalr1.cc:859 + case 383: +#line 1348 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pool", pool); ctx.leave(); } -#line 2201 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2241 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 375: -#line 1324 "dhcp6_parser.yy" // lalr1.cc:859 + case 384: +#line 1354 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2209 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2249 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 376: -#line 1326 "dhcp6_parser.yy" // lalr1.cc:859 + case 385: +#line 1356 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context = yystack_[0].value.as< ElementPtr > (); @@ -2232,19 +2272,19 @@ namespace isc { namespace dhcp { parent->set("user-context", user_context); ctx.leave(); } -#line 2236 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2276 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 377: -#line 1349 "dhcp6_parser.yy" // lalr1.cc:859 + case 386: +#line 1379 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2244 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 378: -#line 1351 "dhcp6_parser.yy" // lalr1.cc:859 + case 387: +#line 1381 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr parent = ctx.stack_.back(); ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location))); @@ -2269,41 +2309,41 @@ namespace isc { namespace dhcp { parent->set("user-context", user_context); ctx.leave(); } -#line 2273 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2313 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 379: -#line 1379 "dhcp6_parser.yy" // lalr1.cc:859 + case 388: +#line 1409 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("pd-pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.PD_POOLS); } -#line 2284 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2324 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 380: -#line 1384 "dhcp6_parser.yy" // lalr1.cc:859 + case 389: +#line 1414 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2293 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2333 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 385: -#line 1399 "dhcp6_parser.yy" // lalr1.cc:859 + case 394: +#line 1429 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2303 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2343 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 386: -#line 1403 "dhcp6_parser.yy" // lalr1.cc:859 + case 395: +#line 1433 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2311,21 +2351,21 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2315 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2355 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 387: -#line 1411 "dhcp6_parser.yy" // lalr1.cc:859 + case 396: +#line 1441 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the pd-pool list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2325 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2365 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 388: -#line 1415 "dhcp6_parser.yy" // lalr1.cc:859 + case 397: +#line 1445 "dhcp6_parser.yy" // lalr1.cc:859 { // The prefix, prefix len and delegated len parameters are required. ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); @@ -2333,1046 +2373,1046 @@ namespace isc { namespace dhcp { ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2337 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2377 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 401: -#line 1439 "dhcp6_parser.yy" // lalr1.cc:859 + case 410: +#line 1469 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2345 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2385 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 402: -#line 1441 "dhcp6_parser.yy" // lalr1.cc:859 + case 411: +#line 1471 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix", prf); ctx.leave(); } -#line 2355 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2395 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 403: -#line 1447 "dhcp6_parser.yy" // lalr1.cc:859 + case 412: +#line 1477 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefix-len", prf); } -#line 2364 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2404 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 404: -#line 1452 "dhcp6_parser.yy" // lalr1.cc:859 + case 413: +#line 1482 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2372 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2412 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 405: -#line 1454 "dhcp6_parser.yy" // lalr1.cc:859 + case 414: +#line 1484 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix", prf); ctx.leave(); } -#line 2382 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2422 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 406: -#line 1460 "dhcp6_parser.yy" // lalr1.cc:859 + case 415: +#line 1490 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("excluded-prefix-len", prf); } -#line 2391 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2431 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 407: -#line 1465 "dhcp6_parser.yy" // lalr1.cc:859 + case 416: +#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("delegated-len", deleg); } -#line 2400 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2440 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 408: -#line 1473 "dhcp6_parser.yy" // lalr1.cc:859 + case 417: +#line 1503 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); } -#line 2411 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2451 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 409: -#line 1478 "dhcp6_parser.yy" // lalr1.cc:859 + case 418: +#line 1508 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2420 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2460 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 414: -#line 1491 "dhcp6_parser.yy" // lalr1.cc:859 + case 423: +#line 1521 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2430 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2470 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 415: -#line 1495 "dhcp6_parser.yy" // lalr1.cc:859 + case 424: +#line 1525 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. ctx.stack_.pop_back(); } -#line 2439 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2479 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 416: -#line 1500 "dhcp6_parser.yy" // lalr1.cc:859 + case 425: +#line 1530 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the reservations list entry map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2449 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2489 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 417: -#line 1504 "dhcp6_parser.yy" // lalr1.cc:859 + case 426: +#line 1534 "dhcp6_parser.yy" // lalr1.cc:859 { /// @todo: an identifier parameter is required. // parsing completed } -#line 2458 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2498 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 433: -#line 1531 "dhcp6_parser.yy" // lalr1.cc:859 + case 442: +#line 1561 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-addresses", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2469 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2509 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 434: -#line 1536 "dhcp6_parser.yy" // lalr1.cc:859 + case 443: +#line 1566 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2478 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2518 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 435: -#line 1541 "dhcp6_parser.yy" // lalr1.cc:859 + case 444: +#line 1571 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("prefixes", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); } -#line 2489 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2529 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 436: -#line 1546 "dhcp6_parser.yy" // lalr1.cc:859 + case 445: +#line 1576 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2498 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2538 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 437: -#line 1551 "dhcp6_parser.yy" // lalr1.cc:859 + case 446: +#line 1581 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2506 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2546 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 438: -#line 1553 "dhcp6_parser.yy" // lalr1.cc:859 + case 447: +#line 1583 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("duid", d); ctx.leave(); } -#line 2516 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2556 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 439: -#line 1559 "dhcp6_parser.yy" // lalr1.cc:859 + case 448: +#line 1589 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2524 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2564 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 440: -#line 1561 "dhcp6_parser.yy" // lalr1.cc:859 + case 449: +#line 1591 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); } -#line 2534 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2574 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 441: -#line 1567 "dhcp6_parser.yy" // lalr1.cc:859 + case 450: +#line 1597 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2542 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2582 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 442: -#line 1569 "dhcp6_parser.yy" // lalr1.cc:859 + case 451: +#line 1599 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } -#line 2552 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2592 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 443: -#line 1575 "dhcp6_parser.yy" // lalr1.cc:859 + case 452: +#line 1605 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2560 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2600 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 444: -#line 1577 "dhcp6_parser.yy" // lalr1.cc:859 + case 453: +#line 1607 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flex-id", hw); ctx.leave(); } -#line 2570 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2610 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 445: -#line 1583 "dhcp6_parser.yy" // lalr1.cc:859 + case 454: +#line 1613 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); } -#line 2581 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2621 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 446: -#line 1588 "dhcp6_parser.yy" // lalr1.cc:859 + case 455: +#line 1618 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2590 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2630 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 447: -#line 1596 "dhcp6_parser.yy" // lalr1.cc:859 + case 456: +#line 1626 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("relay", m); ctx.stack_.push_back(m); ctx.enter(ctx.RELAY); } -#line 2601 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2641 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 448: -#line 1601 "dhcp6_parser.yy" // lalr1.cc:859 + case 457: +#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2610 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2650 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 449: -#line 1606 "dhcp6_parser.yy" // lalr1.cc:859 + case 458: +#line 1636 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2618 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2658 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 450: -#line 1608 "dhcp6_parser.yy" // lalr1.cc:859 + case 459: +#line 1638 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr ip(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ip-address", ip); ctx.leave(); } -#line 2628 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2668 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 451: -#line 1617 "dhcp6_parser.yy" // lalr1.cc:859 + case 460: +#line 1647 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); } -#line 2639 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2679 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 452: -#line 1622 "dhcp6_parser.yy" // lalr1.cc:859 + case 461: +#line 1652 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2648 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2688 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 455: -#line 1631 "dhcp6_parser.yy" // lalr1.cc:859 + case 464: +#line 1661 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 2658 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2698 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 456: -#line 1635 "dhcp6_parser.yy" // lalr1.cc:859 + case 465: +#line 1665 "dhcp6_parser.yy" // lalr1.cc:859 { // The name client class parameter is required. ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); } -#line 2668 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2708 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 468: -#line 1659 "dhcp6_parser.yy" // lalr1.cc:859 + case 477: +#line 1689 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2676 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2716 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 469: -#line 1661 "dhcp6_parser.yy" // lalr1.cc:859 + case 478: +#line 1691 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("test", test); ctx.leave(); } -#line 2686 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2726 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 470: -#line 1670 "dhcp6_parser.yy" // lalr1.cc:859 + case 479: +#line 1700 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-id", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER_ID); } -#line 2697 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2737 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 471: -#line 1675 "dhcp6_parser.yy" // lalr1.cc:859 + case 480: +#line 1705 "dhcp6_parser.yy" // lalr1.cc:859 { // The type parameter is required. ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2708 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 483: -#line 1697 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.DUID_TYPE); -} -#line 2716 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 484: -#line 1699 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); - ctx.leave(); -} -#line 2725 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 485: -#line 1704 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } -#line 2731 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 486: -#line 1705 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } -#line 2737 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 487: -#line 1706 "dhcp6_parser.yy" // lalr1.cc:859 - { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } -#line 2743 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 488: -#line 1709 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("htype", htype); -} -#line 2752 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 489: -#line 1714 "dhcp6_parser.yy" // lalr1.cc:859 - { - ctx.enter(ctx.NO_KEYWORD); -} -#line 2760 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 490: -#line 1716 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("identifier", id); - ctx.leave(); -} -#line 2770 "dhcp6_parser.cc" // lalr1.cc:859 - break; - - case 491: -#line 1722 "dhcp6_parser.yy" // lalr1.cc:859 - { - ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("time", time); -} -#line 2779 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2748 "dhcp6_parser.cc" // lalr1.cc:859 break; case 492: #line 1727 "dhcp6_parser.yy" // lalr1.cc:859 { - ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); - ctx.stack_.back()->set("enterprise-id", time); + ctx.enter(ctx.DUID_TYPE); } -#line 2788 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2756 "dhcp6_parser.cc" // lalr1.cc:859 break; case 493: +#line 1729 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ()); + ctx.leave(); +} +#line 2765 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 494: #line 1734 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); } +#line 2771 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 495: +#line 1735 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); } +#line 2777 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 496: +#line 1736 "dhcp6_parser.yy" // lalr1.cc:859 + { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); } +#line 2783 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 497: +#line 1739 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("htype", htype); +} +#line 2792 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 498: +#line 1744 "dhcp6_parser.yy" // lalr1.cc:859 + { + ctx.enter(ctx.NO_KEYWORD); +} +#line 2800 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 499: +#line 1746 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("identifier", id); + ctx.leave(); +} +#line 2810 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 500: +#line 1752 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("time", time); +} +#line 2819 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 501: +#line 1757 "dhcp6_parser.yy" // lalr1.cc:859 + { + ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); + ctx.stack_.back()->set("enterprise-id", time); +} +#line 2828 "dhcp6_parser.cc" // lalr1.cc:859 + break; + + case 502: +#line 1764 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp4o6-port", time); } -#line 2797 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2837 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 494: -#line 1741 "dhcp6_parser.yy" // lalr1.cc:859 + case 503: +#line 1771 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("control-socket", m); ctx.stack_.push_back(m); ctx.enter(ctx.CONTROL_SOCKET); } -#line 2808 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2848 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 495: -#line 1746 "dhcp6_parser.yy" // lalr1.cc:859 + case 504: +#line 1776 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 2817 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2857 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 503: -#line 1762 "dhcp6_parser.yy" // lalr1.cc:859 + case 512: +#line 1792 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2825 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2865 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 504: -#line 1764 "dhcp6_parser.yy" // lalr1.cc:859 + case 513: +#line 1794 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-type", stype); ctx.leave(); } -#line 2835 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2875 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 505: -#line 1770 "dhcp6_parser.yy" // lalr1.cc:859 + case 514: +#line 1800 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2843 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2883 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 506: -#line 1772 "dhcp6_parser.yy" // lalr1.cc:859 + case 515: +#line 1802 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("socket-name", name); ctx.leave(); } -#line 2853 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2893 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 507: -#line 1780 "dhcp6_parser.yy" // lalr1.cc:859 + case 516: +#line 1810 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); } -#line 2864 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2904 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 508: -#line 1785 "dhcp6_parser.yy" // lalr1.cc:859 + case 517: +#line 1815 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location)); ctx.stack_.pop_back(); ctx.leave(); } -#line 2875 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2915 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 509: -#line 1792 "dhcp6_parser.yy" // lalr1.cc:859 + case 518: +#line 1822 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the dhcp-ddns map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 2885 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2925 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 510: -#line 1796 "dhcp6_parser.yy" // lalr1.cc:859 + case 519: +#line 1826 "dhcp6_parser.yy" // lalr1.cc:859 { // The enable updates DHCP DDNS parameter is required. ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location)); // parsing completed } -#line 2895 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2935 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 530: -#line 1825 "dhcp6_parser.yy" // lalr1.cc:859 + case 539: +#line 1855 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("enable-updates", b); } -#line 2904 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2944 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 531: -#line 1830 "dhcp6_parser.yy" // lalr1.cc:859 + case 540: +#line 1860 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2912 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2952 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 532: -#line 1832 "dhcp6_parser.yy" // lalr1.cc:859 + case 541: +#line 1862 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("qualifying-suffix", s); ctx.leave(); } -#line 2922 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2962 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 533: -#line 1838 "dhcp6_parser.yy" // lalr1.cc:859 + case 542: +#line 1868 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2930 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2970 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 534: -#line 1840 "dhcp6_parser.yy" // lalr1.cc:859 + case 543: +#line 1870 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-ip", s); ctx.leave(); } -#line 2940 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2980 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 535: -#line 1846 "dhcp6_parser.yy" // lalr1.cc:859 + case 544: +#line 1876 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("server-port", i); } -#line 2949 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2989 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 536: -#line 1851 "dhcp6_parser.yy" // lalr1.cc:859 + case 545: +#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 2957 "dhcp6_parser.cc" // lalr1.cc:859 +#line 2997 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 537: -#line 1853 "dhcp6_parser.yy" // lalr1.cc:859 + case 546: +#line 1883 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-ip", s); ctx.leave(); } -#line 2967 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3007 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 538: -#line 1859 "dhcp6_parser.yy" // lalr1.cc:859 + case 547: +#line 1889 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("sender-port", i); } -#line 2976 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3016 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 539: -#line 1864 "dhcp6_parser.yy" // lalr1.cc:859 + case 548: +#line 1894 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("max-queue-size", i); } -#line 2985 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3025 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 540: -#line 1869 "dhcp6_parser.yy" // lalr1.cc:859 + case 549: +#line 1899 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_PROTOCOL); } -#line 2993 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3033 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 541: -#line 1871 "dhcp6_parser.yy" // lalr1.cc:859 + case 550: +#line 1901 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3002 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3042 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 542: -#line 1877 "dhcp6_parser.yy" // lalr1.cc:859 + case 551: +#line 1907 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); } -#line 3008 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3048 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 543: -#line 1878 "dhcp6_parser.yy" // lalr1.cc:859 + case 552: +#line 1908 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); } -#line 3014 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3054 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 544: -#line 1881 "dhcp6_parser.yy" // lalr1.cc:859 + case 553: +#line 1911 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NCR_FORMAT); } -#line 3022 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3062 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 545: -#line 1883 "dhcp6_parser.yy" // lalr1.cc:859 + case 554: +#line 1913 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("ncr-format", json); ctx.leave(); } -#line 3032 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3072 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 546: -#line 1889 "dhcp6_parser.yy" // lalr1.cc:859 + case 555: +#line 1919 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("always-include-fqdn", b); } -#line 3041 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3081 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 547: -#line 1894 "dhcp6_parser.yy" // lalr1.cc:859 + case 556: +#line 1924 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-no-update", b); } -#line 3050 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3090 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 548: -#line 1899 "dhcp6_parser.yy" // lalr1.cc:859 + case 557: +#line 1929 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("override-client-update", b); } -#line 3059 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3099 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 549: -#line 1904 "dhcp6_parser.yy" // lalr1.cc:859 + case 558: +#line 1934 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.REPLACE_CLIENT_NAME); } -#line 3067 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3107 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 550: -#line 1906 "dhcp6_parser.yy" // lalr1.cc:859 + case 559: +#line 1936 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3076 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3116 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 551: -#line 1912 "dhcp6_parser.yy" // lalr1.cc:859 + case 560: +#line 1942 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location))); } -#line 3084 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3124 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 552: -#line 1915 "dhcp6_parser.yy" // lalr1.cc:859 + case 561: +#line 1945 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location))); } -#line 3092 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3132 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 553: -#line 1918 "dhcp6_parser.yy" // lalr1.cc:859 + case 562: +#line 1948 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location))); } -#line 3100 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3140 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 554: -#line 1921 "dhcp6_parser.yy" // lalr1.cc:859 + case 563: +#line 1951 "dhcp6_parser.yy" // lalr1.cc:859 { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location))); } -#line 3108 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3148 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 555: -#line 1924 "dhcp6_parser.yy" // lalr1.cc:859 + case 564: +#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 { error(yystack_[0].location, "boolean values for the replace-client-name are " "no longer supported"); } -#line 3117 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3157 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 556: -#line 1930 "dhcp6_parser.yy" // lalr1.cc:859 + case 565: +#line 1960 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3125 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3165 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 557: -#line 1932 "dhcp6_parser.yy" // lalr1.cc:859 + case 566: +#line 1962 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("generated-prefix", s); ctx.leave(); } -#line 3135 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3175 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 558: -#line 1940 "dhcp6_parser.yy" // lalr1.cc:859 + case 567: +#line 1970 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3143 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3183 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 559: -#line 1942 "dhcp6_parser.yy" // lalr1.cc:859 + case 568: +#line 1972 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3152 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3192 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 560: -#line 1947 "dhcp6_parser.yy" // lalr1.cc:859 + case 569: +#line 1977 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3160 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3200 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 561: -#line 1949 "dhcp6_parser.yy" // lalr1.cc:859 + case 570: +#line 1979 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3169 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3209 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 562: -#line 1954 "dhcp6_parser.yy" // lalr1.cc:859 + case 571: +#line 1984 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3177 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3217 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 563: -#line 1956 "dhcp6_parser.yy" // lalr1.cc:859 + case 572: +#line 1986 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ()); ctx.leave(); } -#line 3186 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3226 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 564: -#line 1967 "dhcp6_parser.yy" // lalr1.cc:859 + case 573: +#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); } -#line 3197 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3237 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 565: -#line 1972 "dhcp6_parser.yy" // lalr1.cc:859 + case 574: +#line 2002 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3206 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3246 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 566: -#line 1977 "dhcp6_parser.yy" // lalr1.cc:859 + case 575: +#line 2007 "dhcp6_parser.yy" // lalr1.cc:859 { // Parse the Logging map ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.push_back(m); } -#line 3216 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3256 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 567: -#line 1981 "dhcp6_parser.yy" // lalr1.cc:859 + case 576: +#line 2011 "dhcp6_parser.yy" // lalr1.cc:859 { // parsing completed } -#line 3224 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3264 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 571: -#line 1997 "dhcp6_parser.yy" // lalr1.cc:859 + case 580: +#line 2027 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); } -#line 3235 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3275 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 572: -#line 2002 "dhcp6_parser.yy" // lalr1.cc:859 + case 581: +#line 2032 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3244 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3284 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 575: -#line 2014 "dhcp6_parser.yy" // lalr1.cc:859 + case 584: +#line 2044 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } -#line 3254 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3294 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 576: -#line 2018 "dhcp6_parser.yy" // lalr1.cc:859 + case 585: +#line 2048 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3262 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3302 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 586: -#line 2035 "dhcp6_parser.yy" // lalr1.cc:859 + case 595: +#line 2065 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("debuglevel", dl); } -#line 3271 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3311 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 587: -#line 2040 "dhcp6_parser.yy" // lalr1.cc:859 + case 596: +#line 2070 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3279 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3319 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 588: -#line 2042 "dhcp6_parser.yy" // lalr1.cc:859 + case 597: +#line 2072 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("severity", sev); ctx.leave(); } -#line 3289 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3329 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 589: -#line 2048 "dhcp6_parser.yy" // lalr1.cc:859 + case 598: +#line 2078 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); } -#line 3300 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3340 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 590: -#line 2053 "dhcp6_parser.yy" // lalr1.cc:859 + case 599: +#line 2083 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); ctx.leave(); } -#line 3309 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3349 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 593: -#line 2062 "dhcp6_parser.yy" // lalr1.cc:859 + case 602: +#line 2092 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } -#line 3319 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3359 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 594: -#line 2066 "dhcp6_parser.yy" // lalr1.cc:859 + case 603: +#line 2096 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.stack_.pop_back(); } -#line 3327 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3367 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 601: -#line 2080 "dhcp6_parser.yy" // lalr1.cc:859 + case 610: +#line 2110 "dhcp6_parser.yy" // lalr1.cc:859 { ctx.enter(ctx.NO_KEYWORD); } -#line 3335 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3375 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 602: -#line 2082 "dhcp6_parser.yy" // lalr1.cc:859 + case 611: +#line 2112 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("output", sev); ctx.leave(); } -#line 3345 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3385 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 603: -#line 2088 "dhcp6_parser.yy" // lalr1.cc:859 + case 612: +#line 2118 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("flush", flush); } -#line 3354 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3394 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 604: -#line 2093 "dhcp6_parser.yy" // lalr1.cc:859 + case 613: +#line 2123 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxsize", maxsize); } -#line 3363 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3403 "dhcp6_parser.cc" // lalr1.cc:859 break; - case 605: -#line 2098 "dhcp6_parser.yy" // lalr1.cc:859 + case 614: +#line 2128 "dhcp6_parser.yy" // lalr1.cc:859 { ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); ctx.stack_.back()->set("maxver", maxver); } -#line 3372 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3412 "dhcp6_parser.cc" // lalr1.cc:859 break; -#line 3376 "dhcp6_parser.cc" // lalr1.cc:859 +#line 3416 "dhcp6_parser.cc" // lalr1.cc:859 default: break; } @@ -3627,111 +3667,113 @@ namespace isc { namespace dhcp { } - const short int Dhcp6Parser::yypact_ninf_ = -750; + const short int Dhcp6Parser::yypact_ninf_ = -759; const signed char Dhcp6Parser::yytable_ninf_ = -1; const short int Dhcp6Parser::yypact_[] = { - 406, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, 51, 27, 42, 115, 123, - 140, 159, 160, 170, 180, 194, 207, 208, 215, 221, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, 27, -88, - 36, 49, 32, 200, 150, 72, 141, 103, 92, 236, - -46, 351, 109, -750, 67, 240, 264, 279, 241, -750, - -750, -750, -750, -750, 285, -750, 34, -750, -750, -750, - -750, -750, -750, -750, -750, -750, 303, 319, 329, 339, - 341, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, 342, -750, -750, -750, 40, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, 344, -750, 54, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, 346, 352, - -750, -750, -750, -750, -750, -750, -750, -750, -750, 63, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, 71, - -750, -750, -750, -750, -750, 359, -750, 363, 364, -750, - -750, -750, -750, -750, 133, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, 290, 315, -750, -750, -750, -750, -750, -750, - -750, -750, 347, -750, -750, 366, -750, -750, -750, 369, - -750, -750, 370, 368, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, 371, 373, -750, - -750, -750, -750, 372, 378, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, 161, -750, -750, - -750, 379, -750, -750, 380, -750, 381, 383, -750, -750, - 386, 387, 389, -750, -750, -750, -750, -750, 162, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, 183, -750, -750, -750, 27, - 27, -750, 242, 390, 398, 400, 405, 407, -750, 36, - -750, 408, 409, 410, 220, 265, 266, 267, 268, 411, - 413, 414, 421, 424, 427, 428, 429, 430, 431, 432, - 433, 434, 288, 435, 437, 49, -750, 439, 289, 32, - -750, 440, 442, 443, 445, 446, 302, 295, 451, 467, - 468, 469, 200, -750, 473, 150, -750, 474, 325, 476, - 327, 328, 72, -750, 479, 480, 481, 482, 483, 484, - 485, -750, 141, -750, 489, 490, 343, 491, 494, 495, - 345, -750, 92, 496, 349, 350, -750, 236, 498, 499, - 7, -750, 353, 503, 504, 356, 507, 361, 362, 513, - 514, 365, 374, 375, 515, 518, 351, -750, 519, 109, - -750, -750, -750, 522, 520, 521, 27, 27, 27, -750, - 525, 526, 527, -750, -750, -750, -750, -750, 524, 530, - 531, 536, 384, 554, 555, 556, 557, 558, 559, 560, - 561, -750, 562, 563, -750, 566, -750, -750, 567, 568, - 412, 422, 423, -750, -750, 189, 425, 569, 570, -750, - 426, -750, 436, -750, 438, -750, -750, -750, 566, 566, - 566, 441, 444, 447, 448, -750, 449, 450, -750, 452, - 453, 454, -750, -750, 455, -750, -750, -750, 456, 27, - -750, -750, 457, 458, -750, 459, -750, -750, -43, 460, - -750, -750, -750, 116, 461, -750, 575, -750, 27, 49, - 109, -750, -750, -750, 32, 74, 74, 574, 576, 577, - -750, -750, -750, 578, -42, 27, 66, 579, 580, 68, - 96, 58, 351, -750, -750, 581, 583, -750, -750, -750, - -750, -750, -750, -750, -750, 585, 511, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, 588, - -750, 205, 227, 243, -750, -750, -750, -750, 592, 594, - 595, 600, 609, -750, -750, -750, 244, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - 262, -750, 610, 612, -750, -750, 611, 615, -750, -750, - 613, 617, -750, -750, 616, 618, -750, -750, -750, 44, - -750, -750, -750, 619, -750, -750, -750, 223, -750, -750, - -750, -750, 261, -750, -750, 620, 621, -750, 623, 624, - 625, 626, 627, 628, 263, -750, -750, -750, -750, -750, - -750, -750, -750, -750, 629, 630, 631, -750, -750, -750, - -750, 280, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, 283, -750, -750, -750, 287, 470, -750, - 632, 633, -750, -750, 634, 636, -750, -750, 635, 639, - -750, -750, 637, -750, 314, -750, -750, -750, -750, 640, - 642, 643, 644, 497, 487, 500, 493, 501, 646, 648, - 74, -750, -750, 200, -750, 574, 92, -750, 576, 236, - -750, 577, 367, -750, 578, -42, -750, -750, 66, -750, - 37, 579, -750, -46, -750, 580, 502, 505, 506, 508, - 509, 510, 68, -750, 649, 653, 512, 516, 517, 96, - -750, 654, 657, 58, -750, -750, -750, 659, 664, 150, - -750, 581, 72, -750, 583, 141, -750, 585, 665, -750, - 153, 588, -750, 321, 523, 529, 532, -750, -750, -750, - -750, -750, 534, 535, -750, 293, -750, 660, -750, 666, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, 294, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, 667, 669, - -750, -750, -750, -750, 297, -750, -750, -750, -750, -750, - -750, -750, -750, 235, 538, -750, -750, -750, -750, 540, - 543, -750, -750, 548, 301, -750, 305, -750, 670, -750, - 549, -750, 673, -750, -750, -750, -750, -750, 308, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, 367, -750, 675, - -750, 37, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, 680, 564, 705, 153, -750, - -750, 571, -750, 668, -750, 572, -750, -750, 703, -750, - -750, 322, -750, 70, 703, -750, -750, 708, 709, 711, - 311, -750, -750, -750, -750, -750, -750, 712, 565, 573, - 584, 70, -750, 591, -750, -750, -750, -750, -750 + 312, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, 41, 40, 27, 37, 39, + 55, 102, 116, 139, 143, 162, 169, 216, 230, 266, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, 40, 36, + 19, 49, 38, 217, 185, 18, 87, 231, 82, 176, + -46, 441, 153, -759, 294, 290, 327, 321, 331, -759, + -759, -759, -759, -759, 334, -759, 86, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, 337, 338, 342, + 347, 349, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, 354, -759, -759, -759, 90, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, 357, -759, 108, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + 358, 360, -759, -759, -759, -759, -759, -759, -759, -759, + -759, 124, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, 145, -759, -759, -759, -759, -759, 362, -759, 366, + 370, -759, -759, -759, -759, -759, 146, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, 365, 374, -759, -759, -759, -759, + -759, -759, -759, -759, 371, -759, -759, 376, -759, -759, + -759, 382, -759, -759, 379, 386, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, 388, + 389, -759, -759, -759, -759, 391, 387, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, 167, + -759, -759, -759, 390, -759, -759, 392, -759, 393, 401, + -759, -759, 403, 406, 407, -759, -759, -759, -759, -759, + 183, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, 190, -759, -759, + -759, 40, 40, -759, 258, 409, 410, 411, 412, 413, + -759, 19, -759, 414, 416, 417, 418, 268, 269, 270, + 273, 276, 430, 431, 432, 433, 434, 435, 440, 442, + 443, 444, 445, 446, 462, 313, 463, 465, 49, -759, + 466, 288, 38, -759, 467, 468, 470, 471, 472, 322, + 323, 475, 477, 478, 479, 217, -759, 480, 185, -759, + 481, 332, 482, 333, 335, 18, -759, 485, 487, 488, + 489, 490, 497, 498, -759, 87, -759, 499, 500, 350, + 502, 503, 504, 352, -759, 82, 506, 355, 356, -759, + 176, 507, 511, 129, -759, 359, 516, 517, 367, 520, + 372, 375, 521, 522, 377, 378, 380, 525, 527, 441, + -759, 528, 153, -759, -759, -759, 532, 531, 533, 40, + 40, 40, -759, 534, 535, 536, 539, -759, -759, -759, + -759, -759, 557, 558, 559, 560, 385, 561, 563, 564, + 565, 566, 567, 568, 569, -759, 570, 571, -759, 574, + -759, -759, 575, 576, 419, 420, 428, -759, -759, 95, + 429, 579, 578, -759, 436, -759, 437, -759, 438, -759, + -759, -759, 574, 574, 574, 439, 447, 448, 449, -759, + 450, 451, -759, 452, 453, 454, -759, -759, 455, -759, + -759, -759, 456, 40, -759, -759, 457, 458, -759, 459, + -759, -759, 198, 464, -759, -759, -759, -22, 460, -759, + 581, -759, 40, 49, 153, -759, -759, -759, 38, 182, + 182, 582, 587, 589, 590, -759, -759, -759, 591, -40, + 40, 34, 592, 593, 215, 84, 33, 441, -759, -759, + 608, 609, -759, -759, -759, -759, -759, -759, -759, -759, + 610, 505, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, 611, -759, 222, 223, 236, -759, + -759, -759, -759, 615, 616, 617, 618, 619, -759, -759, + -759, 237, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, 250, -759, 620, 562, -759, + -759, 621, 622, -759, -759, 623, 625, -759, -759, 624, + 628, -759, -759, 626, 630, -759, -759, -759, 94, -759, + -759, -759, 629, -759, -759, -759, 128, -759, -759, -759, + -759, 251, -759, -759, 631, 633, -759, 634, 635, 636, + 637, 638, 639, 252, -759, -759, -759, -759, -759, -759, + -759, -759, -759, 640, 641, 642, -759, -759, -759, -759, + 262, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, 264, -759, -759, -759, 281, 493, -759, 643, + 645, -759, -759, 644, 648, -759, -759, 646, 650, -759, + -759, 647, -759, 291, -759, -759, -759, -759, 652, 653, + 654, 655, 469, 508, 509, 510, 513, 656, 657, 182, + -759, -759, 182, -759, 582, 217, -759, 587, 82, -759, + 589, 176, -759, 590, 369, -759, 591, -40, -759, -759, + 34, -759, 189, 592, -759, -46, -759, 593, 514, 515, + 518, 519, 523, 524, 215, -759, 658, 659, 526, 529, + 530, 84, -759, 662, 667, 33, -759, -759, -759, 666, + 651, 185, -759, 608, 18, -759, 609, 87, -759, 610, + 671, -759, 131, 611, -759, 59, 537, 538, 540, -759, + -759, -759, -759, -759, 542, 543, -759, 287, -759, 293, + -759, 668, -759, 669, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, 306, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, 672, 679, -759, -759, -759, -759, 308, -759, + -759, -759, -759, -759, -759, -759, -759, 105, 545, -759, + -759, -759, -759, 546, 548, -759, -759, 549, 309, -759, + 318, -759, 675, -759, 551, -759, 682, -759, -759, -759, + -759, -759, 324, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, 369, -759, 683, -759, 189, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + 684, 553, 685, 131, -759, -759, 555, -759, 688, -759, + 585, -759, -759, 627, -759, -759, 307, -759, 152, 627, + -759, -759, 686, 707, 710, 325, -759, -759, -759, -759, + -759, -759, 712, 573, 577, 588, 152, -759, 596, -759, + -759, -759, -759, -759 }; const unsigned short int @@ -3741,141 +3783,143 @@ namespace isc { namespace dhcp { 20, 22, 24, 26, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45, 38, 34, 33, 30, 31, 32, 37, 3, - 35, 36, 58, 5, 70, 7, 106, 9, 222, 11, - 363, 13, 387, 15, 416, 17, 288, 19, 296, 21, - 333, 23, 187, 25, 509, 27, 566, 29, 47, 41, - 0, 0, 0, 0, 0, 0, 418, 0, 298, 335, + 35, 36, 58, 5, 70, 7, 107, 9, 231, 11, + 372, 13, 396, 15, 425, 17, 297, 19, 305, 21, + 342, 23, 196, 25, 518, 27, 575, 29, 47, 41, + 0, 0, 0, 0, 0, 0, 427, 0, 307, 344, 0, 0, 0, 49, 0, 48, 0, 0, 42, 68, - 564, 558, 560, 562, 0, 67, 0, 60, 62, 64, - 65, 66, 63, 104, 118, 120, 0, 0, 0, 0, - 0, 214, 286, 325, 375, 377, 260, 160, 177, 168, - 451, 179, 198, 470, 0, 494, 507, 98, 0, 72, - 74, 75, 76, 77, 78, 81, 82, 83, 84, 86, - 85, 90, 91, 79, 80, 88, 89, 96, 97, 87, - 92, 93, 94, 95, 115, 0, 114, 0, 108, 110, - 111, 112, 113, 355, 379, 245, 247, 249, 0, 0, - 253, 251, 408, 447, 244, 226, 227, 228, 229, 0, - 224, 233, 234, 235, 238, 240, 236, 237, 230, 231, - 242, 243, 232, 239, 241, 373, 372, 369, 368, 0, - 365, 367, 370, 371, 401, 0, 404, 0, 0, 400, - 395, 394, 398, 399, 0, 389, 391, 392, 396, 397, - 393, 445, 433, 435, 437, 439, 441, 443, 432, 429, - 430, 431, 0, 419, 420, 424, 425, 422, 426, 427, - 428, 423, 0, 315, 150, 0, 319, 317, 322, 0, - 311, 312, 0, 299, 300, 302, 314, 303, 304, 305, - 321, 306, 307, 308, 309, 310, 349, 0, 0, 347, - 348, 351, 352, 0, 336, 337, 339, 340, 341, 342, - 343, 344, 345, 346, 194, 196, 191, 0, 189, 192, - 193, 0, 531, 533, 0, 536, 0, 0, 540, 544, - 0, 0, 0, 549, 556, 529, 527, 528, 0, 511, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 571, 0, 568, 570, 46, 0, - 0, 39, 0, 0, 0, 0, 0, 0, 57, 0, - 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 573, 567, 569, 571, 0, 67, 0, 60, 62, 64, + 65, 66, 63, 105, 119, 121, 123, 0, 0, 0, + 0, 0, 223, 295, 334, 384, 386, 269, 169, 186, + 177, 460, 188, 207, 479, 0, 503, 516, 99, 0, + 72, 74, 75, 76, 77, 78, 81, 82, 83, 84, + 85, 87, 86, 91, 92, 79, 80, 89, 90, 97, + 98, 88, 93, 94, 95, 96, 116, 0, 115, 0, + 109, 111, 112, 113, 114, 364, 388, 254, 256, 258, + 0, 0, 262, 260, 417, 456, 253, 235, 236, 237, + 238, 0, 233, 242, 243, 244, 247, 249, 245, 246, + 239, 240, 251, 252, 241, 248, 250, 382, 381, 378, + 377, 0, 374, 376, 379, 380, 410, 0, 413, 0, + 0, 409, 404, 403, 407, 408, 0, 398, 400, 401, + 405, 406, 402, 454, 442, 444, 446, 448, 450, 452, + 441, 438, 439, 440, 0, 428, 429, 433, 434, 431, + 435, 436, 437, 432, 0, 324, 159, 0, 328, 326, + 331, 0, 320, 321, 0, 308, 309, 311, 323, 312, + 313, 314, 330, 315, 316, 317, 318, 319, 358, 0, + 0, 356, 357, 360, 361, 0, 345, 346, 348, 349, + 350, 351, 352, 353, 354, 355, 203, 205, 200, 0, + 198, 201, 202, 0, 540, 542, 0, 545, 0, 0, + 549, 553, 0, 0, 0, 558, 565, 538, 536, 537, + 0, 520, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 580, 0, 577, 579, + 46, 0, 0, 39, 0, 0, 0, 0, 0, 0, + 57, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, - 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 223, 0, 0, 364, 0, 0, 0, - 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, - 0, 417, 0, 289, 0, 0, 0, 0, 0, 0, - 0, 297, 0, 0, 0, 0, 334, 0, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 510, 0, 0, - 567, 50, 43, 0, 0, 0, 0, 0, 0, 61, - 0, 0, 0, 99, 100, 101, 102, 103, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, + 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 232, 0, 0, 373, + 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, + 0, 0, 0, 0, 426, 0, 298, 0, 0, 0, + 0, 0, 0, 0, 306, 0, 0, 0, 0, 343, + 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 493, 0, 0, 73, 0, 117, 109, 0, 0, - 0, 0, 0, 258, 259, 0, 0, 0, 0, 225, - 0, 366, 0, 403, 0, 406, 407, 390, 0, 0, - 0, 0, 0, 0, 0, 421, 0, 0, 313, 0, - 0, 0, 324, 301, 0, 353, 354, 338, 0, 0, - 190, 530, 0, 0, 535, 0, 538, 539, 0, 0, - 546, 547, 548, 0, 0, 512, 0, 569, 0, 0, - 0, 559, 561, 563, 0, 0, 0, 216, 290, 327, - 40, 376, 378, 262, 0, 47, 0, 0, 181, 0, - 0, 0, 0, 51, 116, 357, 381, 246, 248, 250, - 255, 256, 257, 254, 252, 410, 0, 374, 402, 405, - 446, 434, 436, 438, 440, 442, 444, 316, 151, 320, - 318, 323, 350, 195, 197, 532, 534, 537, 542, 543, - 541, 545, 551, 552, 553, 554, 555, 550, 557, 0, - 44, 0, 0, 0, 137, 143, 145, 147, 0, 0, - 0, 0, 0, 156, 158, 136, 0, 122, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 0, 220, 0, 217, 218, 294, 0, 291, 292, 331, - 0, 328, 329, 266, 0, 263, 264, 166, 167, 0, - 162, 164, 165, 0, 175, 176, 172, 0, 170, 173, - 174, 455, 0, 453, 185, 0, 182, 183, 0, 0, - 0, 0, 0, 0, 0, 200, 202, 203, 204, 205, - 206, 207, 483, 489, 0, 0, 0, 482, 479, 480, - 481, 0, 472, 474, 477, 475, 476, 478, 503, 505, - 502, 500, 501, 0, 496, 498, 499, 0, 53, 361, - 0, 358, 359, 385, 0, 382, 383, 414, 0, 411, - 412, 449, 0, 575, 0, 573, 69, 565, 105, 0, + 519, 0, 0, 576, 50, 43, 0, 0, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 100, 101, 102, + 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 502, 0, 0, 73, 0, + 118, 110, 0, 0, 0, 0, 0, 267, 268, 0, + 0, 0, 0, 234, 0, 375, 0, 412, 0, 415, + 416, 399, 0, 0, 0, 0, 0, 0, 0, 430, + 0, 0, 322, 0, 0, 0, 333, 310, 0, 362, + 363, 347, 0, 0, 199, 539, 0, 0, 544, 0, + 547, 548, 0, 0, 555, 556, 557, 0, 0, 521, + 0, 578, 0, 0, 0, 568, 570, 572, 0, 0, + 0, 125, 225, 299, 336, 40, 385, 387, 271, 0, + 47, 0, 0, 190, 0, 0, 0, 0, 51, 117, + 366, 390, 255, 257, 259, 264, 265, 266, 263, 261, + 419, 0, 383, 411, 414, 455, 443, 445, 447, 449, + 451, 453, 325, 160, 329, 327, 332, 359, 204, 206, + 541, 543, 546, 551, 552, 550, 554, 560, 561, 562, + 563, 564, 559, 566, 0, 44, 0, 0, 0, 146, + 152, 154, 156, 0, 0, 0, 0, 0, 165, 167, + 145, 0, 131, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 0, 129, 0, 126, 127, + 229, 0, 226, 227, 303, 0, 300, 301, 340, 0, + 337, 338, 275, 0, 272, 273, 175, 176, 0, 171, + 173, 174, 0, 184, 185, 181, 0, 179, 182, 183, + 464, 0, 462, 194, 0, 191, 192, 0, 0, 0, + 0, 0, 0, 0, 209, 211, 212, 213, 214, 215, + 216, 492, 498, 0, 0, 0, 491, 488, 489, 490, + 0, 481, 483, 486, 484, 485, 487, 512, 514, 511, + 509, 510, 0, 505, 507, 508, 0, 53, 370, 0, + 367, 368, 394, 0, 391, 392, 423, 0, 420, 421, + 458, 0, 584, 0, 582, 69, 574, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 121, 0, 215, 0, 298, 287, 0, 335, - 326, 0, 0, 261, 0, 0, 161, 178, 0, 169, - 457, 0, 452, 0, 180, 0, 0, 0, 0, 0, - 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, - 471, 0, 0, 0, 495, 508, 55, 0, 54, 0, - 356, 0, 0, 380, 0, 418, 409, 0, 0, 448, - 0, 0, 572, 0, 0, 0, 0, 149, 152, 153, - 154, 155, 0, 0, 123, 0, 219, 0, 293, 0, - 330, 285, 280, 282, 274, 275, 270, 271, 272, 273, - 279, 278, 281, 0, 268, 276, 283, 284, 277, 265, - 163, 171, 468, 466, 467, 463, 464, 465, 0, 458, - 459, 461, 462, 454, 0, 184, 208, 209, 210, 211, - 212, 213, 201, 0, 0, 488, 491, 492, 473, 0, - 0, 497, 52, 0, 0, 360, 0, 384, 0, 413, - 0, 589, 0, 587, 585, 579, 583, 584, 0, 577, - 581, 582, 580, 574, 139, 140, 141, 142, 138, 144, - 146, 148, 157, 159, 221, 295, 332, 0, 267, 0, - 456, 0, 186, 485, 486, 487, 484, 490, 504, 506, - 56, 362, 386, 415, 450, 0, 0, 0, 0, 576, - 269, 0, 460, 0, 586, 0, 578, 469, 0, 588, - 593, 0, 591, 0, 0, 590, 601, 0, 0, 0, - 0, 595, 597, 598, 599, 600, 592, 0, 0, 0, - 0, 0, 594, 0, 603, 604, 605, 596, 602 + 120, 122, 0, 124, 0, 0, 224, 0, 307, 296, + 0, 344, 335, 0, 0, 270, 0, 0, 170, 187, + 0, 178, 466, 0, 461, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 208, 0, 0, 0, 0, + 0, 0, 480, 0, 0, 0, 504, 517, 55, 0, + 54, 0, 365, 0, 0, 389, 0, 427, 418, 0, + 0, 457, 0, 0, 581, 0, 0, 0, 0, 158, + 161, 162, 163, 164, 0, 0, 132, 0, 128, 0, + 228, 0, 302, 0, 339, 294, 289, 291, 283, 284, + 279, 280, 281, 282, 288, 287, 290, 0, 277, 285, + 292, 293, 286, 274, 172, 180, 477, 475, 476, 472, + 473, 474, 0, 467, 468, 470, 471, 463, 0, 193, + 217, 218, 219, 220, 221, 222, 210, 0, 0, 497, + 500, 501, 482, 0, 0, 506, 52, 0, 0, 369, + 0, 393, 0, 422, 0, 598, 0, 596, 594, 588, + 592, 593, 0, 586, 590, 591, 589, 583, 148, 149, + 150, 151, 147, 153, 155, 157, 166, 168, 130, 230, + 304, 341, 0, 276, 0, 465, 0, 195, 494, 495, + 496, 493, 499, 513, 515, 56, 371, 395, 424, 459, + 0, 0, 0, 0, 585, 278, 0, 469, 0, 595, + 0, 587, 478, 0, 597, 602, 0, 600, 0, 0, + 599, 610, 0, 0, 0, 0, 604, 606, 607, 608, + 609, 601, 0, 0, 0, 0, 0, 603, 0, 612, + 613, 614, 605, 611 }; const short int Dhcp6Parser::yypgoto_[] = { - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, 6, -750, 105, -750, - -750, -750, -750, -750, -750, 82, -750, -139, -750, -750, - -750, -70, -750, -750, -750, 391, -750, -750, -750, -750, - 178, 355, -72, -58, -56, -55, -750, -750, -750, -750, - -750, 182, 377, -750, -750, -750, -750, -750, -750, -750, - 185, -16, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -7, -750, -553, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -28, -544, -750, -750, -750, - -750, -19, -750, -750, -750, -750, -750, -750, -750, -750, - -27, -750, -750, -750, -15, 333, -750, -750, -750, -750, - -750, -750, -750, -23, -750, -750, -750, -750, -750, -750, - -749, -750, -750, -750, 5, -750, -750, -750, 8, 385, - -750, -750, -746, -750, -742, -750, -34, -750, -741, -750, - -750, -750, -739, -750, -750, -750, -750, 2, -750, -750, - -147, 694, -750, -750, -750, -750, -750, 14, -750, -750, - -750, 18, -750, 376, -750, -65, -750, -750, -750, -750, - -750, -60, -750, -750, -750, -750, -750, -6, -750, -750, - -750, 15, -750, -750, -750, 16, -750, 360, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -21, - -750, -750, -750, -18, 393, -750, -750, -48, -750, -20, - -750, -750, -750, -750, -750, -17, -750, -750, -750, -13, - 392, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -24, -750, -750, -750, -14, -750, 395, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -733, -750, -750, -750, -750, -750, -750, - 21, -750, -750, -750, -135, -750, -750, -750, -750, -750, - -750, 9, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, 1, -750, -750, -750, -750, -750, - -750, -750, -750, 233, 382, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, -750, -750, - -750, -750, -750, -750, -750, -750, -750, -750, 260, 388, - -750, -750, -750, -10, -750, -750, -136, -750, -750, -750, - -750, -750, -750, -150, -750, -750, -166, -750, -750, -750, - -750, -750 + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -9, -759, 253, -759, + -759, -759, -759, -759, -759, 159, -759, -120, -759, -759, + -759, -70, -759, -759, -759, 381, -759, -759, -759, -759, + 193, 396, -41, -37, -36, -25, -759, -759, -759, -759, + -759, 177, 383, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -18, -759, -535, -3, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -61, -759, + -553, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -17, -548, -759, -759, -759, -759, -21, -759, -759, + -759, -759, -759, -759, -759, -759, -19, -759, -759, -759, + -15, 348, -759, -759, -759, -759, -759, -759, -759, -29, + -759, -759, -759, -759, -759, -759, -758, -759, -759, -759, + 5, -759, -759, -759, 8, 395, -759, -759, -755, -759, + -754, -759, -32, -759, -753, -759, -759, -759, -752, -759, + -759, -759, -759, 0, -759, -759, -155, 701, -759, -759, + -759, -759, -759, 13, -759, -759, -759, 16, -759, 373, + -759, -65, -759, -759, -759, -759, -759, -44, -759, -759, + -759, -759, -759, -7, -759, -759, -759, 14, -759, -759, + -759, 15, -759, 394, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -24, -759, -759, -759, -16, + 402, -759, -759, -48, -759, -20, -759, -759, -759, -759, + -759, -23, -759, -759, -759, -14, 397, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -13, -759, + -759, -759, -12, -759, 398, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -751, + -759, -759, -759, -759, -759, -759, 25, -759, -759, -759, + -140, -759, -759, -759, -759, -759, -759, -2, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -4, -759, -759, -759, -759, -759, -759, -759, -759, 242, + 384, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, -759, -759, -759, -759, -759, -759, + -759, -759, -759, -759, 254, 399, -759, -759, -759, -11, + -759, -759, -142, -759, -759, -759, -759, -759, -759, -156, + -759, -759, -171, -759, -759, -759, -759, -759 }; const short int @@ -3883,407 +3927,410 @@ namespace isc { namespace dhcp { { -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 83, 39, 40, 69, - 551, 87, 88, 41, 68, 84, 85, 564, 718, 797, - 798, 127, 43, 70, 96, 97, 98, 333, 45, 71, - 128, 129, 130, 131, 132, 133, 134, 135, 341, 47, - 72, 157, 158, 159, 367, 160, 136, 342, 137, 343, - 626, 627, 628, 739, 908, 629, 740, 630, 741, 631, - 742, 632, 251, 405, 634, 635, 636, 637, 638, 748, - 639, 749, 138, 355, 659, 660, 661, 662, 139, 357, - 667, 668, 669, 670, 140, 356, 141, 359, 675, 676, - 677, 773, 63, 80, 287, 288, 289, 418, 290, 419, - 142, 360, 684, 685, 686, 687, 688, 689, 690, 691, - 143, 349, 642, 643, 644, 753, 49, 73, 179, 180, - 181, 373, 182, 374, 183, 375, 184, 379, 185, 378, - 573, 186, 187, 144, 354, 654, 655, 656, 762, 843, - 844, 145, 350, 57, 77, 646, 647, 648, 756, 59, - 78, 252, 253, 254, 255, 256, 257, 258, 404, 259, - 408, 260, 407, 261, 262, 409, 263, 146, 351, 650, - 651, 652, 759, 61, 79, 273, 274, 275, 276, 277, - 413, 278, 279, 280, 281, 189, 371, 720, 721, 722, - 799, 51, 74, 199, 200, 201, 384, 147, 352, 148, - 353, 192, 372, 724, 725, 726, 802, 53, 75, 214, - 215, 216, 387, 217, 218, 389, 219, 220, 193, 380, - 728, 729, 730, 805, 55, 76, 232, 233, 234, 235, - 395, 236, 396, 237, 397, 238, 398, 239, 399, 240, - 400, 241, 394, 194, 381, 732, 808, 149, 358, 672, - 673, 770, 858, 859, 860, 861, 862, 919, 150, 361, - 701, 702, 703, 784, 926, 704, 705, 785, 706, 707, - 151, 152, 363, 713, 714, 715, 791, 716, 792, 153, - 364, 65, 81, 308, 309, 310, 311, 423, 312, 424, - 313, 314, 426, 315, 316, 317, 429, 600, 318, 430, - 319, 320, 321, 322, 434, 607, 323, 435, 99, 335, - 100, 336, 101, 337, 102, 334, 67, 82, 325, 326, - 327, 438, 734, 735, 810, 898, 899, 900, 901, 937, - 902, 935, 951, 952, 953, 960, 961, 962, 967, 963, - 964, 965 + 556, 87, 88, 41, 68, 84, 85, 569, 727, 809, + 810, 630, 43, 70, 96, 97, 98, 335, 45, 71, + 129, 130, 131, 132, 133, 134, 135, 136, 343, 47, + 72, 159, 160, 161, 370, 162, 137, 344, 138, 345, + 139, 346, 647, 648, 649, 762, 631, 632, 633, 748, + 922, 634, 749, 635, 750, 636, 751, 637, 638, 408, + 639, 640, 641, 642, 643, 757, 644, 758, 140, 358, + 668, 669, 670, 671, 141, 360, 676, 677, 678, 679, + 142, 359, 143, 362, 684, 685, 686, 785, 63, 80, + 289, 290, 291, 421, 292, 422, 144, 363, 693, 694, + 695, 696, 697, 698, 699, 700, 145, 352, 651, 652, + 653, 765, 49, 73, 181, 182, 183, 376, 184, 377, + 185, 378, 186, 382, 187, 381, 578, 188, 189, 146, + 357, 663, 664, 665, 774, 857, 858, 147, 353, 57, + 77, 655, 656, 657, 768, 59, 78, 254, 255, 256, + 257, 258, 259, 260, 407, 261, 411, 262, 410, 263, + 264, 412, 265, 148, 354, 659, 660, 661, 771, 61, + 79, 275, 276, 277, 278, 279, 416, 280, 281, 282, + 283, 191, 374, 729, 730, 731, 811, 51, 74, 201, + 202, 203, 387, 149, 355, 150, 356, 194, 375, 733, + 734, 735, 814, 53, 75, 216, 217, 218, 390, 219, + 220, 392, 221, 222, 195, 383, 737, 738, 739, 817, + 55, 76, 234, 235, 236, 237, 398, 238, 399, 239, + 400, 240, 401, 241, 402, 242, 403, 243, 397, 196, + 384, 741, 820, 151, 361, 681, 682, 782, 872, 873, + 874, 875, 876, 934, 152, 364, 710, 711, 712, 796, + 941, 713, 714, 797, 715, 716, 153, 154, 366, 722, + 723, 724, 803, 725, 804, 155, 367, 65, 81, 310, + 311, 312, 313, 426, 314, 427, 315, 316, 429, 317, + 318, 319, 432, 605, 320, 433, 321, 322, 323, 324, + 437, 612, 325, 438, 99, 337, 100, 338, 101, 339, + 102, 336, 67, 82, 327, 328, 329, 441, 743, 744, + 822, 912, 913, 914, 915, 952, 916, 950, 966, 967, + 968, 975, 976, 977, 982, 978, 979, 980 }; const unsigned short int Dhcp6Parser::yytable_[] = { - 95, 175, 156, 174, 196, 209, 228, 698, 250, 269, - 286, 305, 666, 837, 271, 176, 838, 177, 178, 272, - 839, 841, 38, 842, 161, 190, 202, 212, 230, 848, - 264, 282, 31, 306, 32, 657, 33, 339, 284, 285, - 197, 210, 340, 365, 154, 155, 89, 765, 366, 42, - 766, 30, 162, 191, 203, 213, 231, 369, 265, 283, - 103, 307, 370, 104, 105, 86, 382, 188, 198, 211, - 229, 383, 270, 328, 385, 113, 244, 598, 599, 386, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 614, 284, 285, 114, 115, 615, 616, 617, 618, 619, - 620, 621, 622, 623, 624, 114, 115, 94, 243, 852, - 113, 658, 692, 244, 114, 115, 116, 117, 118, 119, - 120, 619, 44, 204, 205, 206, 207, 208, 114, 115, - 46, 244, 121, 245, 246, 122, 392, 247, 248, 249, - 112, 393, 123, 657, 664, 171, 665, 48, 114, 115, - 124, 125, 114, 115, 126, 678, 679, 680, 681, 682, - 683, 708, 709, 90, 420, 436, 50, 52, 837, 421, - 437, 838, 91, 92, 93, 839, 841, 54, 842, 113, - 34, 35, 36, 37, 848, 94, 439, 56, 113, 94, - 94, 440, 244, 693, 694, 695, 696, 114, 115, 195, - 956, 58, 94, 957, 958, 959, 114, 115, 365, 114, - 115, 94, 221, 736, 60, 62, 222, 223, 224, 225, - 226, 227, 64, 171, 666, 94, 768, 94, 66, 769, - 439, 106, 107, 108, 109, 737, 698, 324, 113, 602, - 603, 604, 605, 329, 332, 94, 369, 750, 163, 94, - 164, 738, 751, 570, 571, 572, 114, 115, 165, 166, - 167, 168, 169, 170, 771, 750, 782, 772, 330, 95, - 752, 783, 606, 171, 172, 244, 266, 245, 246, 267, - 268, 173, 891, 789, 892, 893, 793, 331, 790, 338, - 436, 794, 114, 115, 94, 795, 382, 917, 401, 156, - 420, 914, 918, 94, 385, 922, 94, 344, 392, 931, - 175, 938, 174, 932, 971, 196, 939, 811, 402, 972, - 812, 161, 209, 345, 176, 954, 177, 178, 955, 923, - 924, 925, 228, 346, 190, 441, 442, 202, 904, 905, - 906, 907, 250, 347, 212, 348, 362, 269, 368, 162, - 376, 197, 271, 94, 230, 403, 377, 272, 210, 580, - 581, 582, 191, 388, 264, 203, 305, 390, 391, 282, - 406, 412, 213, 410, 453, 414, 188, 415, 411, 198, - 416, 417, 231, 422, 425, 427, 211, 428, 306, 94, - 431, 432, 265, 433, 444, 443, 229, 283, 106, 107, - 108, 109, 445, 111, 446, 113, 244, 114, 115, 447, - 270, 448, 450, 451, 452, 458, 307, 459, 460, 454, - 455, 456, 457, 114, 115, 461, 166, 167, 462, 169, - 170, 463, 464, 465, 466, 467, 468, 469, 470, 472, - 171, 473, 471, 475, 478, 476, 479, 480, 173, 481, - 482, 484, 541, 542, 543, 485, 483, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 486, 487, 488, 156, 625, 625, 490, 492, 493, - 494, 495, 496, 498, 499, 500, 501, 502, 503, 504, - 697, 710, 305, 506, 507, 509, 161, 508, 510, 511, - 514, 512, 518, 519, 94, 515, 516, 522, 523, 521, - 524, 525, 699, 711, 306, 526, 527, 528, 529, 533, - 94, 530, 534, 536, 162, 594, 538, 539, 540, 547, - 531, 532, 544, 545, 546, 548, 549, 552, 633, 633, - 700, 712, 307, 32, 610, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 553, - 554, 555, 556, 557, 558, 567, 550, 559, 560, 561, - 562, 563, 565, 566, 575, 568, 569, 576, 574, 577, - 609, 641, 601, 645, 649, 653, 671, 674, 719, 578, - 723, 579, 727, 731, 583, 733, 743, 584, 744, 745, - 585, 586, 587, 588, 746, 589, 590, 591, 592, 593, - 595, 596, 597, 747, 608, 755, 754, 757, 758, 760, - 761, 764, 763, 796, 775, 767, 774, 776, 777, 778, - 779, 780, 781, 786, 787, 788, 801, 663, 800, 804, - 803, 806, 807, 818, 813, 809, 814, 815, 816, 820, - 822, 817, 823, 873, 819, 821, 866, 874, 879, 867, - 868, 880, 869, 870, 871, 882, 875, 883, 915, 890, - 876, 877, 921, 948, 916, 920, 909, 936, 933, 941, - 625, 175, 910, 174, 943, 911, 250, 912, 913, 269, - 832, 927, 831, 928, 271, 176, 929, 177, 178, 272, - 853, 930, 934, 286, 833, 190, 834, 835, 264, 945, - 950, 282, 968, 969, 846, 970, 973, 611, 944, 697, - 474, 974, 856, 710, 947, 949, 613, 975, 840, 196, - 449, 640, 209, 191, 824, 228, 265, 850, 976, 283, - 894, 699, 847, 633, 978, 711, 477, 188, 865, 851, - 857, 202, 270, 520, 212, 836, 845, 230, 864, 872, - 826, 825, 896, 854, 855, 197, 849, 489, 210, 700, - 940, 242, 828, 712, 827, 829, 830, 517, 491, 203, - 885, 884, 213, 889, 497, 231, 942, 887, 513, 886, - 897, 888, 863, 198, 881, 717, 211, 505, 878, 229, - 612, 903, 946, 895, 966, 977, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 535, 0, - 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, + 95, 128, 158, 176, 198, 211, 230, 38, 252, 271, + 288, 307, 707, 675, 273, 645, 851, 253, 272, 852, + 853, 855, 856, 862, 163, 192, 204, 214, 232, 89, + 266, 284, 177, 308, 42, 274, 178, 179, 666, 286, + 287, 30, 199, 212, 44, 31, 46, 32, 180, 33, + 156, 157, 164, 193, 205, 215, 233, 114, 267, 285, + 103, 309, 48, 104, 105, 106, 190, 200, 213, 231, + 206, 207, 208, 209, 210, 115, 116, 918, 919, 920, + 921, 107, 108, 109, 110, 111, 112, 113, 114, 341, + 115, 116, 173, 368, 342, 115, 116, 777, 369, 245, + 778, 701, 607, 608, 609, 610, 115, 116, 94, 50, + 624, 372, 666, 673, 667, 674, 373, 117, 118, 119, + 120, 121, 246, 52, 247, 248, 114, 385, 249, 250, + 251, 780, 386, 122, 781, 611, 123, 717, 718, 115, + 116, 115, 116, 124, 115, 116, 54, 90, 388, 395, + 56, 125, 126, 389, 396, 127, 91, 92, 93, 223, + 575, 576, 577, 224, 225, 226, 227, 228, 229, 58, + 423, 246, 94, 94, 851, 424, 60, 852, 853, 855, + 856, 862, 702, 703, 704, 705, 439, 94, 115, 116, + 86, 440, 94, 442, 34, 35, 36, 37, 443, 619, + 938, 939, 940, 94, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 286, 287, 246, 268, 247, 248, + 269, 270, 246, 62, 114, 368, 442, 837, 114, 246, + 745, 746, 675, 115, 116, 197, 94, 64, 94, 372, + 759, 94, 115, 116, 747, 760, 115, 116, 707, 107, + 108, 109, 110, 759, 783, 794, 114, 784, 761, 173, + 795, 905, 866, 906, 907, 801, 165, 805, 166, 113, + 802, 95, 806, 66, 115, 116, 167, 168, 169, 170, + 171, 172, 326, 971, 439, 94, 972, 973, 974, 807, + 759, 173, 174, 331, 823, 928, 385, 824, 128, 175, + 330, 929, 158, 687, 688, 689, 690, 691, 692, 932, + 969, 423, 388, 970, 933, 176, 937, 946, 198, 603, + 604, 395, 444, 445, 163, 211, 947, 953, 986, 333, + 94, 332, 954, 987, 334, 230, 94, 192, 340, 94, + 204, 347, 348, 94, 177, 252, 349, 214, 178, 179, + 271, 350, 164, 351, 253, 273, 199, 232, 365, 272, + 180, 371, 379, 212, 380, 193, 391, 266, 205, 307, + 393, 94, 284, 404, 394, 215, 274, 405, 190, 406, + 409, 200, 585, 586, 587, 233, 413, 414, 213, 415, + 420, 308, 417, 418, 425, 267, 428, 430, 231, 419, + 285, 107, 108, 109, 110, 431, 112, 434, 114, 246, + 435, 436, 446, 447, 448, 449, 450, 451, 453, 309, + 454, 455, 456, 457, 458, 459, 115, 116, 460, 168, + 169, 461, 171, 172, 462, 463, 464, 465, 466, 467, + 545, 546, 547, 173, 468, 480, 469, 470, 471, 472, + 473, 175, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 474, 476, 475, 477, + 479, 482, 483, 128, 484, 485, 486, 487, 158, 489, + 488, 490, 491, 492, 494, 496, 498, 497, 499, 502, + 500, 503, 504, 505, 506, 706, 719, 307, 115, 116, + 163, 507, 508, 510, 511, 512, 513, 514, 515, 516, + 518, 522, 519, 520, 599, 523, 525, 708, 720, 308, + 526, 527, 528, 94, 529, 532, 533, 530, 164, 537, + 531, 538, 540, 615, 534, 535, 542, 536, 543, 557, + 544, 548, 549, 550, 551, 709, 721, 309, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 552, 553, 554, 764, 558, 32, 559, 560, + 561, 562, 563, 572, 573, 564, 565, 566, 567, 568, + 570, 571, 574, 579, 580, 581, 614, 606, 740, 646, + 582, 583, 584, 588, 650, 94, 654, 658, 662, 680, + 683, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 600, 601, 602, 613, 728, 732, 736, 742, 752, + 753, 754, 755, 756, 829, 767, 763, 766, 770, 769, + 772, 773, 775, 776, 965, 779, 787, 786, 788, 789, + 790, 791, 792, 793, 798, 799, 800, 808, 813, 812, + 815, 816, 818, 819, 897, 821, 825, 826, 827, 828, + 834, 835, 887, 888, 831, 830, 893, 832, 833, 880, + 881, 894, 896, 882, 883, 904, 930, 931, 884, 885, + 935, 889, 936, 948, 890, 891, 951, 956, 958, 960, + 983, 923, 924, 963, 925, 176, 926, 927, 252, 942, + 943, 271, 944, 945, 845, 949, 273, 253, 959, 962, + 272, 984, 867, 850, 985, 288, 988, 192, 555, 672, + 266, 868, 452, 284, 177, 618, 860, 274, 178, 179, + 989, 706, 990, 846, 870, 719, 616, 847, 848, 964, + 180, 198, 854, 991, 211, 193, 838, 230, 267, 849, + 993, 285, 908, 708, 861, 481, 836, 720, 190, 865, + 864, 909, 871, 204, 478, 886, 214, 859, 879, 232, + 878, 524, 840, 839, 910, 869, 863, 955, 244, 199, + 493, 709, 212, 842, 841, 721, 843, 844, 517, 899, + 495, 205, 501, 901, 215, 898, 957, 233, 617, 892, + 900, 895, 911, 509, 200, 902, 903, 213, 877, 726, + 231, 961, 917, 981, 521, 992, 0, 0, 0, 0, + 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 832, 0, 831, 0, 0, - 0, 853, 0, 0, 0, 0, 0, 0, 0, 833, - 0, 834, 835, 0, 0, 0, 0, 0, 894, 846, - 0, 0, 0, 856, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 840, 0, 0, 0, 0, 0, 0, - 896, 0, 0, 0, 0, 0, 0, 847, 0, 0, - 0, 857, 0, 0, 0, 0, 0, 0, 0, 0, - 836, 845, 0, 0, 854, 855, 0, 0, 897, 0, + 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 895 + 0, 0, 845, 0, 0, 0, 867, 0, 0, 0, + 0, 850, 0, 0, 0, 868, 0, 0, 0, 0, + 0, 0, 0, 908, 860, 0, 0, 0, 870, 0, + 0, 846, 909, 0, 0, 847, 848, 0, 0, 0, + 854, 0, 0, 0, 0, 910, 0, 849, 0, 0, + 0, 0, 861, 0, 0, 0, 871, 0, 0, 0, + 0, 0, 0, 0, 0, 859, 0, 0, 0, 869, + 0, 0, 0, 911 }; const short int Dhcp6Parser::yycheck_[] = { - 70, 73, 72, 73, 74, 75, 76, 560, 78, 79, - 80, 81, 556, 762, 79, 73, 762, 73, 73, 79, - 762, 762, 16, 762, 72, 73, 74, 75, 76, 762, - 78, 79, 5, 81, 7, 77, 9, 3, 84, 85, - 74, 75, 8, 3, 12, 13, 10, 3, 8, 7, - 6, 0, 72, 73, 74, 75, 76, 3, 78, 79, - 11, 81, 8, 14, 15, 153, 3, 73, 74, 75, - 76, 8, 79, 6, 3, 38, 39, 120, 121, 8, - 31, 32, 33, 34, 35, 36, 37, 38, 56, 57, - 16, 84, 85, 56, 57, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 56, 57, 153, 16, 72, - 38, 153, 16, 39, 56, 57, 67, 68, 69, 70, - 71, 25, 7, 51, 52, 53, 54, 55, 56, 57, - 7, 39, 83, 41, 42, 86, 3, 45, 46, 47, - 37, 8, 93, 77, 78, 73, 80, 7, 56, 57, - 101, 102, 56, 57, 105, 87, 88, 89, 90, 91, - 92, 103, 104, 127, 3, 3, 7, 7, 917, 8, - 8, 917, 136, 137, 138, 917, 917, 7, 917, 38, - 153, 154, 155, 156, 917, 153, 3, 7, 38, 153, - 153, 8, 39, 97, 98, 99, 100, 56, 57, 49, - 130, 7, 153, 133, 134, 135, 56, 57, 3, 56, - 57, 153, 71, 8, 7, 7, 75, 76, 77, 78, - 79, 80, 7, 73, 768, 153, 3, 153, 7, 6, - 3, 31, 32, 33, 34, 8, 789, 128, 38, 123, - 124, 125, 126, 3, 3, 153, 3, 3, 48, 153, - 50, 8, 8, 64, 65, 66, 56, 57, 58, 59, - 60, 61, 62, 63, 3, 3, 3, 6, 4, 339, - 8, 8, 156, 73, 74, 39, 40, 41, 42, 43, - 44, 81, 129, 3, 131, 132, 3, 8, 8, 4, - 3, 8, 56, 57, 153, 8, 3, 3, 8, 369, - 3, 8, 8, 153, 3, 8, 153, 4, 3, 8, - 382, 3, 382, 8, 3, 385, 8, 3, 3, 8, - 6, 369, 392, 4, 382, 3, 382, 382, 6, 94, - 95, 96, 402, 4, 382, 329, 330, 385, 17, 18, - 19, 20, 412, 4, 392, 4, 4, 417, 4, 369, - 4, 385, 417, 153, 402, 8, 4, 417, 392, 498, - 499, 500, 382, 4, 412, 385, 436, 4, 4, 417, - 4, 3, 392, 4, 154, 4, 382, 4, 8, 385, - 8, 3, 402, 4, 4, 4, 392, 4, 436, 153, - 4, 4, 412, 4, 4, 153, 402, 417, 31, 32, - 33, 34, 4, 36, 4, 38, 39, 56, 57, 4, - 417, 4, 4, 4, 4, 4, 436, 4, 4, 154, - 154, 154, 154, 56, 57, 4, 59, 60, 4, 62, - 63, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 73, 4, 154, 4, 4, 156, 4, 4, 81, 4, - 4, 156, 446, 447, 448, 4, 154, 106, 107, 108, + 70, 71, 72, 73, 74, 75, 76, 16, 78, 79, + 80, 81, 565, 561, 79, 550, 774, 78, 79, 774, + 774, 774, 774, 774, 72, 73, 74, 75, 76, 10, + 78, 79, 73, 81, 7, 79, 73, 73, 78, 85, + 86, 0, 74, 75, 7, 5, 7, 7, 73, 9, + 12, 13, 72, 73, 74, 75, 76, 39, 78, 79, + 11, 81, 7, 14, 15, 16, 73, 74, 75, 76, + 52, 53, 54, 55, 56, 57, 58, 18, 19, 20, + 21, 32, 33, 34, 35, 36, 37, 38, 39, 3, + 57, 58, 74, 3, 8, 57, 58, 3, 8, 17, + 6, 17, 124, 125, 126, 127, 57, 58, 154, 7, + 26, 3, 78, 79, 154, 81, 8, 68, 69, 70, + 71, 72, 40, 7, 42, 43, 39, 3, 46, 47, + 48, 3, 8, 84, 6, 157, 87, 104, 105, 57, + 58, 57, 58, 94, 57, 58, 7, 128, 3, 3, + 7, 102, 103, 8, 8, 106, 137, 138, 139, 72, + 65, 66, 67, 76, 77, 78, 79, 80, 81, 7, + 3, 40, 154, 154, 932, 8, 7, 932, 932, 932, + 932, 932, 98, 99, 100, 101, 3, 154, 57, 58, + 154, 8, 154, 3, 154, 155, 156, 157, 8, 17, + 95, 96, 97, 154, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 85, 86, 40, 41, 42, 43, + 44, 45, 40, 7, 39, 3, 3, 762, 39, 40, + 8, 8, 780, 57, 58, 50, 154, 7, 154, 3, + 3, 154, 57, 58, 8, 8, 57, 58, 801, 32, + 33, 34, 35, 3, 3, 3, 39, 6, 8, 74, + 8, 130, 73, 132, 133, 3, 49, 3, 51, 38, + 8, 341, 8, 7, 57, 58, 59, 60, 61, 62, + 63, 64, 129, 131, 3, 154, 134, 135, 136, 8, + 3, 74, 75, 3, 3, 8, 3, 6, 368, 82, + 6, 8, 372, 88, 89, 90, 91, 92, 93, 3, + 3, 3, 3, 6, 8, 385, 8, 8, 388, 121, + 122, 3, 331, 332, 372, 395, 8, 3, 3, 8, + 154, 4, 8, 8, 3, 405, 154, 385, 4, 154, + 388, 4, 4, 154, 385, 415, 4, 395, 385, 385, + 420, 4, 372, 4, 415, 420, 388, 405, 4, 420, + 385, 4, 4, 395, 4, 385, 4, 415, 388, 439, + 4, 154, 420, 8, 4, 395, 420, 3, 385, 8, + 4, 388, 502, 503, 504, 405, 4, 8, 395, 3, + 3, 439, 4, 4, 4, 415, 4, 4, 405, 8, + 420, 32, 33, 34, 35, 4, 37, 4, 39, 40, + 4, 4, 154, 4, 4, 4, 4, 4, 4, 439, + 4, 4, 4, 155, 155, 155, 57, 58, 155, 60, + 61, 155, 63, 64, 4, 4, 4, 4, 4, 4, + 449, 450, 451, 74, 4, 157, 4, 4, 4, 4, + 4, 82, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 4, 4, 155, 4, + 4, 4, 4, 543, 4, 4, 4, 155, 548, 4, + 157, 4, 4, 4, 4, 4, 4, 155, 155, 4, + 155, 4, 4, 4, 4, 565, 566, 567, 57, 58, + 548, 4, 4, 4, 4, 155, 4, 4, 4, 157, + 4, 4, 157, 157, 523, 4, 157, 565, 566, 567, + 4, 4, 155, 154, 4, 4, 4, 155, 548, 4, + 155, 4, 4, 542, 157, 157, 4, 157, 7, 154, + 7, 7, 7, 7, 5, 565, 566, 567, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 4, 4, 4, 544, 545, 546, 4, 4, 154, - 4, 154, 154, 4, 4, 4, 4, 4, 4, 4, - 560, 561, 562, 4, 4, 4, 544, 154, 4, 4, - 4, 156, 4, 4, 153, 156, 156, 4, 4, 156, - 154, 4, 560, 561, 562, 154, 154, 4, 4, 4, - 153, 156, 4, 4, 544, 519, 4, 7, 7, 5, - 156, 156, 7, 7, 7, 5, 5, 153, 545, 546, - 560, 561, 562, 7, 538, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 5, - 5, 5, 5, 5, 5, 153, 461, 7, 7, 7, - 7, 5, 5, 5, 5, 153, 153, 7, 153, 153, - 5, 7, 122, 7, 7, 7, 7, 7, 7, 153, - 7, 153, 7, 82, 153, 7, 4, 153, 4, 4, - 153, 153, 153, 153, 4, 153, 153, 153, 153, 153, - 153, 153, 153, 4, 153, 3, 6, 6, 3, 6, - 3, 3, 6, 153, 3, 6, 6, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 3, 555, 6, 3, - 6, 6, 3, 156, 4, 8, 4, 4, 4, 156, - 4, 154, 4, 4, 154, 154, 154, 4, 4, 154, - 154, 4, 154, 154, 154, 6, 154, 3, 8, 4, - 154, 154, 3, 5, 8, 8, 153, 4, 8, 4, - 750, 753, 153, 753, 4, 153, 756, 153, 153, 759, - 762, 153, 762, 153, 759, 753, 153, 753, 753, 759, - 770, 153, 153, 773, 762, 753, 762, 762, 756, 4, - 7, 759, 4, 4, 762, 4, 4, 539, 154, 789, - 365, 156, 770, 793, 153, 153, 544, 154, 762, 799, - 339, 546, 802, 753, 750, 805, 756, 765, 154, 759, - 810, 789, 762, 750, 153, 793, 369, 753, 775, 768, - 770, 799, 759, 420, 802, 762, 762, 805, 773, 782, - 755, 753, 810, 770, 770, 799, 764, 382, 802, 789, - 917, 77, 758, 793, 756, 759, 761, 417, 385, 799, - 801, 799, 802, 807, 392, 805, 921, 804, 412, 802, - 810, 805, 771, 799, 793, 562, 802, 402, 789, 805, - 540, 811, 938, 810, 954, 971, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 436, -1, - -1, -1, -1, -1, -1, -1, -1, 439, -1, -1, + 119, 120, 5, 5, 5, 3, 5, 7, 5, 5, + 5, 5, 5, 154, 154, 7, 7, 7, 7, 5, + 5, 5, 154, 154, 5, 7, 5, 123, 83, 7, + 154, 154, 154, 154, 7, 154, 7, 7, 7, 7, + 7, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 155, 3, 6, 6, 3, 6, + 6, 3, 6, 3, 7, 6, 3, 6, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 154, 3, 6, + 6, 3, 6, 3, 3, 8, 4, 4, 4, 4, + 4, 4, 4, 4, 155, 157, 4, 157, 155, 155, + 155, 4, 6, 155, 155, 4, 8, 8, 155, 155, + 8, 155, 3, 8, 155, 155, 4, 4, 4, 4, + 4, 154, 154, 5, 154, 765, 154, 154, 768, 154, + 154, 771, 154, 154, 774, 154, 771, 768, 155, 154, + 771, 4, 782, 774, 4, 785, 4, 765, 465, 560, + 768, 782, 341, 771, 765, 548, 774, 771, 765, 765, + 157, 801, 155, 774, 782, 805, 543, 774, 774, 154, + 765, 811, 774, 155, 814, 765, 764, 817, 768, 774, + 154, 771, 822, 801, 774, 372, 759, 805, 765, 780, + 777, 822, 782, 811, 368, 794, 814, 774, 787, 817, + 785, 423, 767, 765, 822, 782, 776, 932, 77, 811, + 385, 801, 814, 770, 768, 805, 771, 773, 415, 813, + 388, 811, 395, 816, 814, 811, 936, 817, 544, 801, + 814, 805, 822, 405, 811, 817, 819, 814, 783, 567, + 817, 953, 823, 969, 420, 986, -1, -1, -1, -1, + -1, -1, -1, 439, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 917, -1, 917, -1, -1, - -1, 921, -1, -1, -1, -1, -1, -1, -1, 917, - -1, 917, 917, -1, -1, -1, -1, -1, 938, 917, - -1, -1, -1, 921, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 917, -1, -1, -1, -1, -1, -1, - 938, -1, -1, -1, -1, -1, -1, 917, -1, -1, - -1, 921, -1, -1, -1, -1, -1, -1, -1, -1, - 917, 917, -1, -1, 921, 921, -1, -1, 938, -1, + -1, 442, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 938 + -1, -1, 932, -1, -1, -1, 936, -1, -1, -1, + -1, 932, -1, -1, -1, 936, -1, -1, -1, -1, + -1, -1, -1, 953, 932, -1, -1, -1, 936, -1, + -1, 932, 953, -1, -1, 932, 932, -1, -1, -1, + 932, -1, -1, -1, -1, 953, -1, 932, -1, -1, + -1, -1, 932, -1, -1, -1, 936, -1, -1, -1, + -1, -1, -1, -1, -1, 932, -1, -1, -1, 936, + -1, -1, -1, 953 }; const unsigned short int Dhcp6Parser::yystos_[] = { - 0, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 0, 5, 7, 9, 153, 154, 155, 156, 173, 174, - 175, 180, 7, 189, 7, 195, 7, 206, 7, 283, - 7, 358, 7, 374, 7, 391, 7, 310, 7, 316, - 7, 340, 7, 259, 7, 448, 7, 483, 181, 176, - 190, 196, 207, 284, 359, 375, 392, 311, 317, 341, - 260, 449, 484, 173, 182, 183, 153, 178, 179, 10, - 127, 136, 137, 138, 153, 188, 191, 192, 193, 475, - 477, 479, 481, 11, 14, 15, 31, 32, 33, 34, - 35, 36, 37, 38, 56, 57, 67, 68, 69, 70, - 71, 83, 86, 93, 101, 102, 105, 188, 197, 198, - 199, 200, 201, 202, 203, 204, 213, 215, 239, 245, - 251, 253, 267, 277, 300, 308, 334, 364, 366, 414, - 425, 437, 438, 446, 12, 13, 188, 208, 209, 210, - 212, 364, 366, 48, 50, 58, 59, 60, 61, 62, - 63, 73, 74, 81, 188, 199, 200, 201, 202, 285, - 286, 287, 289, 291, 293, 295, 298, 299, 334, 352, - 364, 366, 368, 385, 410, 49, 188, 293, 334, 360, - 361, 362, 364, 366, 51, 52, 53, 54, 55, 188, - 293, 334, 364, 366, 376, 377, 378, 380, 381, 383, - 384, 71, 75, 76, 77, 78, 79, 80, 188, 334, - 364, 366, 393, 394, 395, 396, 398, 400, 402, 404, - 406, 408, 308, 16, 39, 41, 42, 45, 46, 47, - 188, 229, 318, 319, 320, 321, 322, 323, 324, 326, - 328, 330, 331, 333, 364, 366, 40, 43, 44, 188, - 229, 322, 328, 342, 343, 344, 345, 346, 348, 349, - 350, 351, 364, 366, 84, 85, 188, 261, 262, 263, - 265, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 188, 364, 366, 450, 451, - 452, 453, 455, 457, 458, 460, 461, 462, 465, 467, - 468, 469, 470, 473, 128, 485, 486, 487, 6, 3, - 4, 8, 3, 194, 482, 476, 478, 480, 4, 3, - 8, 205, 214, 216, 4, 4, 4, 4, 4, 278, - 309, 335, 365, 367, 301, 240, 252, 246, 415, 254, - 268, 426, 4, 439, 447, 3, 8, 211, 4, 3, - 8, 353, 369, 288, 290, 292, 4, 4, 296, 294, - 386, 411, 3, 8, 363, 3, 8, 379, 4, 382, - 4, 4, 3, 8, 409, 397, 399, 401, 403, 405, - 407, 8, 3, 8, 325, 230, 4, 329, 327, 332, - 4, 8, 3, 347, 4, 4, 8, 3, 264, 266, - 3, 8, 4, 454, 456, 4, 459, 4, 4, 463, - 466, 4, 4, 4, 471, 474, 3, 8, 488, 3, - 8, 173, 173, 153, 4, 4, 4, 4, 4, 192, - 4, 4, 4, 154, 154, 154, 154, 154, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 154, 4, 4, 198, 4, 156, 209, 4, 4, - 4, 4, 4, 154, 156, 4, 4, 4, 4, 286, - 4, 361, 4, 154, 4, 154, 154, 377, 4, 4, - 4, 4, 4, 4, 4, 395, 4, 4, 154, 4, - 4, 4, 156, 320, 4, 156, 156, 344, 4, 4, - 262, 156, 4, 4, 154, 4, 154, 154, 4, 4, - 156, 156, 156, 4, 4, 451, 4, 486, 4, 7, - 7, 173, 173, 173, 7, 7, 7, 5, 5, 5, - 175, 177, 153, 5, 5, 5, 5, 5, 5, 7, - 7, 7, 7, 5, 184, 5, 5, 153, 153, 153, - 64, 65, 66, 297, 153, 5, 7, 153, 153, 153, - 184, 184, 184, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 173, 153, 153, 153, 120, 121, - 464, 122, 123, 124, 125, 126, 156, 472, 153, 5, - 173, 197, 485, 208, 16, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 188, 217, 218, 219, 222, - 224, 226, 228, 229, 231, 232, 233, 234, 235, 237, - 217, 7, 279, 280, 281, 7, 312, 313, 314, 7, - 336, 337, 338, 7, 302, 303, 304, 77, 153, 241, - 242, 243, 244, 182, 78, 80, 243, 247, 248, 249, - 250, 7, 416, 417, 7, 255, 256, 257, 87, 88, - 89, 90, 91, 92, 269, 270, 271, 272, 273, 274, - 275, 276, 16, 97, 98, 99, 100, 188, 231, 364, - 366, 427, 428, 429, 432, 433, 435, 436, 103, 104, - 188, 364, 366, 440, 441, 442, 444, 450, 185, 7, - 354, 355, 356, 7, 370, 371, 372, 7, 387, 388, - 389, 82, 412, 7, 489, 490, 8, 8, 8, 220, - 223, 225, 227, 4, 4, 4, 4, 4, 236, 238, - 3, 8, 8, 282, 6, 3, 315, 6, 3, 339, - 6, 3, 305, 6, 3, 3, 6, 6, 3, 6, - 418, 3, 6, 258, 6, 3, 4, 4, 4, 4, - 4, 4, 3, 8, 430, 434, 4, 4, 4, 3, - 8, 443, 445, 3, 8, 8, 153, 186, 187, 357, - 6, 3, 373, 6, 3, 390, 6, 3, 413, 8, - 491, 3, 6, 4, 4, 4, 4, 154, 156, 154, - 156, 154, 4, 4, 218, 285, 281, 318, 314, 342, - 338, 188, 199, 200, 201, 202, 229, 277, 289, 291, - 293, 295, 299, 306, 307, 334, 364, 366, 410, 304, - 242, 248, 72, 188, 229, 334, 364, 366, 419, 420, - 421, 422, 423, 417, 261, 257, 154, 154, 154, 154, - 154, 154, 270, 4, 4, 154, 154, 154, 428, 4, - 4, 441, 6, 3, 360, 356, 376, 372, 393, 389, - 4, 129, 131, 132, 188, 229, 364, 366, 492, 493, - 494, 495, 497, 490, 17, 18, 19, 20, 221, 153, - 153, 153, 153, 153, 8, 8, 8, 3, 8, 424, - 8, 3, 8, 94, 95, 96, 431, 153, 153, 153, - 153, 8, 8, 8, 153, 498, 4, 496, 3, 8, - 307, 4, 421, 4, 154, 4, 493, 153, 5, 153, - 7, 499, 500, 501, 3, 6, 130, 133, 134, 135, - 502, 503, 504, 506, 507, 508, 500, 505, 4, 4, - 4, 3, 8, 4, 156, 154, 154, 503, 153 + 0, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 0, 5, 7, 9, 154, 155, 156, 157, 174, 175, + 176, 181, 7, 190, 7, 196, 7, 207, 7, 290, + 7, 365, 7, 381, 7, 398, 7, 317, 7, 323, + 7, 347, 7, 266, 7, 455, 7, 490, 182, 177, + 191, 197, 208, 291, 366, 382, 399, 318, 324, 348, + 267, 456, 491, 174, 183, 184, 154, 179, 180, 10, + 128, 137, 138, 139, 154, 189, 192, 193, 194, 482, + 484, 486, 488, 11, 14, 15, 16, 32, 33, 34, + 35, 36, 37, 38, 39, 57, 58, 68, 69, 70, + 71, 72, 84, 87, 94, 102, 103, 106, 189, 198, + 199, 200, 201, 202, 203, 204, 205, 214, 216, 218, + 246, 252, 258, 260, 274, 284, 307, 315, 341, 371, + 373, 421, 432, 444, 445, 453, 12, 13, 189, 209, + 210, 211, 213, 371, 373, 49, 51, 59, 60, 61, + 62, 63, 64, 74, 75, 82, 189, 200, 201, 202, + 203, 292, 293, 294, 296, 298, 300, 302, 305, 306, + 341, 359, 371, 373, 375, 392, 417, 50, 189, 300, + 341, 367, 368, 369, 371, 373, 52, 53, 54, 55, + 56, 189, 300, 341, 371, 373, 383, 384, 385, 387, + 388, 390, 391, 72, 76, 77, 78, 79, 80, 81, + 189, 341, 371, 373, 400, 401, 402, 403, 405, 407, + 409, 411, 413, 415, 315, 17, 40, 42, 43, 46, + 47, 48, 189, 236, 325, 326, 327, 328, 329, 330, + 331, 333, 335, 337, 338, 340, 371, 373, 41, 44, + 45, 189, 236, 329, 335, 349, 350, 351, 352, 353, + 355, 356, 357, 358, 371, 373, 85, 86, 189, 268, + 269, 270, 272, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 189, 371, 373, + 457, 458, 459, 460, 462, 464, 465, 467, 468, 469, + 472, 474, 475, 476, 477, 480, 129, 492, 493, 494, + 6, 3, 4, 8, 3, 195, 489, 483, 485, 487, + 4, 3, 8, 206, 215, 217, 219, 4, 4, 4, + 4, 4, 285, 316, 342, 372, 374, 308, 247, 259, + 253, 422, 261, 275, 433, 4, 446, 454, 3, 8, + 212, 4, 3, 8, 360, 376, 295, 297, 299, 4, + 4, 303, 301, 393, 418, 3, 8, 370, 3, 8, + 386, 4, 389, 4, 4, 3, 8, 416, 404, 406, + 408, 410, 412, 414, 8, 3, 8, 332, 237, 4, + 336, 334, 339, 4, 8, 3, 354, 4, 4, 8, + 3, 271, 273, 3, 8, 4, 461, 463, 4, 466, + 4, 4, 470, 473, 4, 4, 4, 478, 481, 3, + 8, 495, 3, 8, 174, 174, 154, 4, 4, 4, + 4, 4, 193, 4, 4, 4, 4, 155, 155, 155, + 155, 155, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 155, 4, 4, 199, 4, + 157, 210, 4, 4, 4, 4, 4, 155, 157, 4, + 4, 4, 4, 293, 4, 368, 4, 155, 4, 155, + 155, 384, 4, 4, 4, 4, 4, 4, 4, 402, + 4, 4, 155, 4, 4, 4, 157, 327, 4, 157, + 157, 351, 4, 4, 269, 157, 4, 4, 155, 4, + 155, 155, 4, 4, 157, 157, 157, 4, 4, 458, + 4, 493, 4, 7, 7, 174, 174, 174, 7, 7, + 7, 5, 5, 5, 5, 176, 178, 154, 5, 5, + 5, 5, 5, 5, 7, 7, 7, 7, 5, 185, + 5, 5, 154, 154, 154, 65, 66, 67, 304, 154, + 5, 7, 154, 154, 154, 185, 185, 185, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 174, + 154, 154, 154, 121, 122, 471, 123, 124, 125, 126, + 127, 157, 479, 154, 5, 174, 198, 492, 209, 17, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 189, 224, 225, 226, 229, 231, 233, 235, 236, 238, + 239, 240, 241, 242, 244, 224, 7, 220, 221, 222, + 7, 286, 287, 288, 7, 319, 320, 321, 7, 343, + 344, 345, 7, 309, 310, 311, 78, 154, 248, 249, + 250, 251, 183, 79, 81, 250, 254, 255, 256, 257, + 7, 423, 424, 7, 262, 263, 264, 88, 89, 90, + 91, 92, 93, 276, 277, 278, 279, 280, 281, 282, + 283, 17, 98, 99, 100, 101, 189, 238, 371, 373, + 434, 435, 436, 439, 440, 442, 443, 104, 105, 189, + 371, 373, 447, 448, 449, 451, 457, 186, 7, 361, + 362, 363, 7, 377, 378, 379, 7, 394, 395, 396, + 83, 419, 7, 496, 497, 8, 8, 8, 227, 230, + 232, 234, 4, 4, 4, 4, 4, 243, 245, 3, + 8, 8, 223, 6, 3, 289, 6, 3, 322, 6, + 3, 346, 6, 3, 312, 6, 3, 3, 6, 6, + 3, 6, 425, 3, 6, 265, 6, 3, 4, 4, + 4, 4, 4, 4, 3, 8, 437, 441, 4, 4, + 4, 3, 8, 450, 452, 3, 8, 8, 154, 187, + 188, 364, 6, 3, 380, 6, 3, 397, 6, 3, + 420, 8, 498, 3, 6, 4, 4, 4, 4, 155, + 157, 155, 157, 155, 4, 4, 225, 224, 222, 292, + 288, 325, 321, 349, 345, 189, 200, 201, 202, 203, + 236, 284, 296, 298, 300, 302, 306, 313, 314, 341, + 371, 373, 417, 311, 249, 255, 73, 189, 236, 341, + 371, 373, 426, 427, 428, 429, 430, 424, 268, 264, + 155, 155, 155, 155, 155, 155, 277, 4, 4, 155, + 155, 155, 435, 4, 4, 448, 6, 3, 367, 363, + 383, 379, 400, 396, 4, 130, 132, 133, 189, 236, + 371, 373, 499, 500, 501, 502, 504, 497, 18, 19, + 20, 21, 228, 154, 154, 154, 154, 154, 8, 8, + 8, 8, 3, 8, 431, 8, 3, 8, 95, 96, + 97, 438, 154, 154, 154, 154, 8, 8, 8, 154, + 505, 4, 503, 3, 8, 314, 4, 428, 4, 155, + 4, 500, 154, 5, 154, 7, 506, 507, 508, 3, + 6, 131, 134, 135, 136, 509, 510, 511, 513, 514, + 515, 507, 512, 4, 4, 4, 3, 8, 4, 157, + 155, 155, 510, 154 }; const unsigned short int Dhcp6Parser::yyr1_[] = { - 0, 157, 159, 158, 160, 158, 161, 158, 162, 158, - 163, 158, 164, 158, 165, 158, 166, 158, 167, 158, - 168, 158, 169, 158, 170, 158, 171, 158, 172, 158, - 173, 173, 173, 173, 173, 173, 173, 174, 176, 175, - 177, 178, 178, 179, 179, 181, 180, 182, 182, 183, - 183, 185, 184, 186, 186, 187, 187, 188, 190, 189, - 191, 191, 192, 192, 192, 192, 192, 192, 194, 193, - 196, 195, 197, 197, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, - 200, 201, 202, 203, 205, 204, 207, 206, 208, 208, - 209, 209, 209, 209, 209, 211, 210, 212, 214, 213, - 216, 215, 217, 217, 218, 218, 218, 218, 218, 218, - 218, 218, 218, 218, 218, 218, 218, 220, 219, 221, - 221, 221, 221, 223, 222, 225, 224, 227, 226, 228, - 230, 229, 231, 232, 233, 234, 236, 235, 238, 237, - 240, 239, 241, 241, 242, 242, 243, 244, 246, 245, - 247, 247, 248, 248, 248, 249, 250, 252, 251, 254, - 253, 255, 255, 256, 256, 258, 257, 260, 259, 261, - 261, 261, 262, 262, 264, 263, 266, 265, 268, 267, - 269, 269, 270, 270, 270, 270, 270, 270, 271, 272, - 273, 274, 275, 276, 278, 277, 279, 279, 280, 280, - 282, 281, 284, 283, 285, 285, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 288, 287, 290, 289, 292, - 291, 294, 293, 296, 295, 297, 297, 297, 298, 299, - 301, 300, 302, 302, 303, 303, 305, 304, 306, 306, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 309, 308, 311, 310, - 312, 312, 313, 313, 315, 314, 317, 316, 318, 318, - 319, 319, 320, 320, 320, 320, 320, 320, 320, 320, - 320, 320, 321, 322, 323, 325, 324, 327, 326, 329, - 328, 330, 332, 331, 333, 335, 334, 336, 336, 337, - 337, 339, 338, 341, 340, 342, 342, 343, 343, 344, - 344, 344, 344, 344, 344, 344, 344, 344, 345, 347, - 346, 348, 349, 350, 351, 353, 352, 354, 354, 355, - 355, 357, 356, 359, 358, 360, 360, 361, 361, 361, - 361, 361, 361, 363, 362, 365, 364, 367, 366, 369, - 368, 370, 370, 371, 371, 373, 372, 375, 374, 376, - 376, 377, 377, 377, 377, 377, 377, 377, 377, 377, - 377, 379, 378, 380, 382, 381, 383, 384, 386, 385, - 387, 387, 388, 388, 390, 389, 392, 391, 393, 393, - 394, 394, 395, 395, 395, 395, 395, 395, 395, 395, - 395, 395, 395, 397, 396, 399, 398, 401, 400, 403, - 402, 405, 404, 407, 406, 409, 408, 411, 410, 413, - 412, 415, 414, 416, 416, 418, 417, 419, 419, 420, - 420, 421, 421, 421, 421, 421, 421, 422, 424, 423, - 426, 425, 427, 427, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 430, 429, 431, 431, 431, 432, 434, - 433, 435, 436, 437, 439, 438, 440, 440, 441, 441, - 441, 441, 441, 443, 442, 445, 444, 447, 446, 449, - 448, 450, 450, 451, 451, 451, 451, 451, 451, 451, - 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, - 452, 454, 453, 456, 455, 457, 459, 458, 460, 461, - 463, 462, 464, 464, 466, 465, 467, 468, 469, 471, - 470, 472, 472, 472, 472, 472, 474, 473, 476, 475, - 478, 477, 480, 479, 482, 481, 484, 483, 485, 485, - 486, 488, 487, 489, 489, 491, 490, 492, 492, 493, - 493, 493, 493, 493, 493, 493, 494, 496, 495, 498, - 497, 499, 499, 501, 500, 502, 502, 503, 503, 503, - 503, 505, 504, 506, 507, 508 + 0, 158, 160, 159, 161, 159, 162, 159, 163, 159, + 164, 159, 165, 159, 166, 159, 167, 159, 168, 159, + 169, 159, 170, 159, 171, 159, 172, 159, 173, 159, + 174, 174, 174, 174, 174, 174, 174, 175, 177, 176, + 178, 179, 179, 180, 180, 182, 181, 183, 183, 184, + 184, 186, 185, 187, 187, 188, 188, 189, 191, 190, + 192, 192, 193, 193, 193, 193, 193, 193, 195, 194, + 197, 196, 198, 198, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 200, 201, 202, 203, 204, 206, 205, 208, 207, 209, + 209, 210, 210, 210, 210, 210, 212, 211, 213, 215, + 214, 217, 216, 219, 218, 220, 220, 221, 221, 223, + 222, 224, 224, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 227, 226, 228, 228, + 228, 228, 230, 229, 232, 231, 234, 233, 235, 237, + 236, 238, 239, 240, 241, 243, 242, 245, 244, 247, + 246, 248, 248, 249, 249, 250, 251, 253, 252, 254, + 254, 255, 255, 255, 256, 257, 259, 258, 261, 260, + 262, 262, 263, 263, 265, 264, 267, 266, 268, 268, + 268, 269, 269, 271, 270, 273, 272, 275, 274, 276, + 276, 277, 277, 277, 277, 277, 277, 278, 279, 280, + 281, 282, 283, 285, 284, 286, 286, 287, 287, 289, + 288, 291, 290, 292, 292, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 293, 295, 294, 297, 296, 299, 298, + 301, 300, 303, 302, 304, 304, 304, 305, 306, 308, + 307, 309, 309, 310, 310, 312, 311, 313, 313, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 314, 314, 316, 315, 318, 317, 319, + 319, 320, 320, 322, 321, 324, 323, 325, 325, 326, + 326, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 327, 328, 329, 330, 332, 331, 334, 333, 336, 335, + 337, 339, 338, 340, 342, 341, 343, 343, 344, 344, + 346, 345, 348, 347, 349, 349, 350, 350, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 352, 354, 353, + 355, 356, 357, 358, 360, 359, 361, 361, 362, 362, + 364, 363, 366, 365, 367, 367, 368, 368, 368, 368, + 368, 368, 370, 369, 372, 371, 374, 373, 376, 375, + 377, 377, 378, 378, 380, 379, 382, 381, 383, 383, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 386, 385, 387, 389, 388, 390, 391, 393, 392, 394, + 394, 395, 395, 397, 396, 399, 398, 400, 400, 401, + 401, 402, 402, 402, 402, 402, 402, 402, 402, 402, + 402, 402, 404, 403, 406, 405, 408, 407, 410, 409, + 412, 411, 414, 413, 416, 415, 418, 417, 420, 419, + 422, 421, 423, 423, 425, 424, 426, 426, 427, 427, + 428, 428, 428, 428, 428, 428, 429, 431, 430, 433, + 432, 434, 434, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 437, 436, 438, 438, 438, 439, 441, 440, + 442, 443, 444, 446, 445, 447, 447, 448, 448, 448, + 448, 448, 450, 449, 452, 451, 454, 453, 456, 455, + 457, 457, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 459, + 461, 460, 463, 462, 464, 466, 465, 467, 468, 470, + 469, 471, 471, 473, 472, 474, 475, 476, 478, 477, + 479, 479, 479, 479, 479, 481, 480, 483, 482, 485, + 484, 487, 486, 489, 488, 491, 490, 492, 492, 493, + 495, 494, 496, 496, 498, 497, 499, 499, 500, 500, + 500, 500, 500, 500, 500, 501, 503, 502, 505, 504, + 506, 506, 508, 507, 509, 509, 510, 510, 510, 510, + 512, 511, 513, 514, 515 }; const unsigned char @@ -4298,58 +4345,59 @@ namespace isc { namespace dhcp { 1, 3, 1, 1, 1, 1, 1, 1, 0, 6, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 3, 3, 0, 6, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 0, 4, 3, 0, 6, - 0, 6, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 3, - 0, 4, 3, 3, 3, 3, 0, 4, 0, 4, - 0, 6, 1, 3, 1, 1, 1, 1, 0, 6, - 1, 3, 1, 1, 1, 1, 1, 0, 6, 0, - 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, - 3, 1, 1, 1, 0, 4, 0, 4, 0, 6, - 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 3, 3, 0, 6, 0, 1, 1, 3, - 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 1, 1, 1, 3, 3, - 0, 6, 0, 1, 1, 3, 0, 4, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 6, 0, 4, - 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 0, 4, 0, 4, 0, - 4, 1, 0, 4, 3, 0, 6, 0, 1, 1, - 3, 0, 4, 0, 4, 0, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 4, 1, 1, 3, 3, 0, 6, 0, 1, 1, - 3, 0, 4, 0, 4, 1, 3, 1, 1, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, - 6, 0, 1, 1, 3, 0, 4, 0, 4, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 4, 3, 0, 4, 3, 3, 0, 6, - 0, 1, 1, 3, 0, 4, 0, 4, 0, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 6, 0, - 4, 0, 6, 1, 3, 0, 4, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 0, 4, - 0, 6, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 4, 1, 1, 1, 3, 0, - 4, 3, 3, 3, 0, 6, 1, 3, 1, 1, - 1, 1, 1, 0, 4, 0, 4, 0, 6, 0, + 3, 3, 3, 3, 3, 0, 6, 0, 4, 1, + 3, 1, 1, 1, 1, 1, 0, 4, 3, 0, + 6, 0, 6, 0, 6, 0, 1, 1, 3, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 1, 1, + 1, 1, 0, 4, 0, 4, 0, 4, 3, 0, + 4, 3, 3, 3, 3, 0, 4, 0, 4, 0, + 6, 1, 3, 1, 1, 1, 1, 0, 6, 1, + 3, 1, 1, 1, 1, 1, 0, 6, 0, 6, + 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, + 1, 1, 1, 0, 4, 0, 4, 0, 6, 1, + 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 0, 6, 0, 1, 1, 3, 0, + 4, 0, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 0, 4, 0, 4, 3, 0, 4, 3, 3, - 0, 4, 1, 1, 0, 4, 3, 3, 3, 0, - 4, 1, 1, 1, 1, 1, 0, 4, 0, 4, - 0, 4, 0, 4, 0, 6, 0, 4, 1, 3, - 1, 0, 6, 1, 3, 0, 4, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 3, 0, 4, 0, - 6, 1, 3, 0, 4, 1, 3, 1, 1, 1, - 1, 0, 4, 3, 3, 3 + 1, 1, 1, 1, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 1, 1, 1, 3, 3, 0, + 6, 0, 1, 1, 3, 0, 4, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 6, 0, 4, 0, + 1, 1, 3, 0, 4, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 0, 4, 0, 4, 0, 4, + 1, 0, 4, 3, 0, 6, 0, 1, 1, 3, + 0, 4, 0, 4, 0, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 1, 1, 3, 3, 0, 6, 0, 1, 1, 3, + 0, 4, 0, 4, 1, 3, 1, 1, 1, 1, + 1, 1, 0, 4, 0, 4, 0, 4, 0, 6, + 0, 1, 1, 3, 0, 4, 0, 4, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 4, 3, 0, 4, 3, 3, 0, 6, 0, + 1, 1, 3, 0, 4, 0, 4, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 4, 0, 4, 0, 4, 0, 4, + 0, 4, 0, 4, 0, 4, 0, 6, 0, 4, + 0, 6, 1, 3, 0, 4, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, + 6, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 4, 1, 1, 1, 3, 0, 4, + 3, 3, 3, 0, 6, 1, 3, 1, 1, 1, + 1, 1, 0, 4, 0, 4, 0, 6, 0, 4, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 0, 4, 0, 4, 3, 0, 4, 3, 3, 0, + 4, 1, 1, 0, 4, 3, 3, 3, 0, 4, + 1, 1, 1, 1, 1, 0, 4, 0, 4, 0, + 4, 0, 4, 0, 6, 0, 4, 1, 3, 1, + 0, 6, 1, 3, 0, 4, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 4, 0, 6, + 1, 3, 0, 4, 1, 3, 1, 1, 1, 1, + 0, 4, 3, 3, 3 }; @@ -4362,46 +4410,46 @@ namespace isc { namespace dhcp { "\"end of file\"", "error", "$undefined", "\",\"", "\":\"", "\"[\"", "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Dhcp6\"", "\"interfaces-config\"", "\"interfaces\"", "\"re-detect\"", - "\"lease-database\"", "\"hosts-database\"", "\"type\"", "\"memfile\"", - "\"mysql\"", "\"postgresql\"", "\"cql\"", "\"user\"", "\"password\"", - "\"host\"", "\"port\"", "\"persist\"", "\"lfc-interval\"", - "\"readonly\"", "\"connect-timeout\"", "\"contact-points\"", - "\"keyspace\"", "\"preferred-lifetime\"", "\"valid-lifetime\"", - "\"renew-timer\"", "\"rebind-timer\"", "\"decline-probation-period\"", - "\"subnet6\"", "\"option-def\"", "\"option-data\"", "\"name\"", - "\"data\"", "\"code\"", "\"space\"", "\"csv-format\"", "\"always-send\"", - "\"record-types\"", "\"encapsulate\"", "\"array\"", "\"pools\"", - "\"pool\"", "\"pd-pools\"", "\"prefix\"", "\"prefix-len\"", - "\"excluded-prefix\"", "\"excluded-prefix-len\"", "\"delegated-len\"", - "\"user-context\"", "\"comment\"", "\"subnet\"", "\"interface\"", - "\"interface-id\"", "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", - "\"disabled\"", "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", - "\"mac-sources\"", "\"relay-supplied-options\"", - "\"host-reservation-identifiers\"", "\"client-classes\"", "\"test\"", - "\"client-class\"", "\"reservations\"", "\"ip-addresses\"", - "\"prefixes\"", "\"duid\"", "\"hw-address\"", "\"hostname\"", - "\"flex-id\"", "\"relay\"", "\"ip-address\"", "\"hooks-libraries\"", - "\"library\"", "\"parameters\"", "\"expired-leases-processing\"", - "\"reclaim-timer-wait-time\"", "\"flush-reclaimed-timer-wait-time\"", - "\"hold-reclaimed-time\"", "\"max-reclaim-leases\"", - "\"max-reclaim-time\"", "\"unwarned-reclaim-cycles\"", "\"server-id\"", - "\"LLT\"", "\"EN\"", "\"LL\"", "\"identifier\"", "\"htype\"", "\"time\"", - "\"enterprise-id\"", "\"dhcp4o6-port\"", "\"control-socket\"", - "\"socket-type\"", "\"socket-name\"", "\"dhcp-ddns\"", - "\"enable-updates\"", "\"qualifying-suffix\"", "\"server-ip\"", - "\"server-port\"", "\"sender-ip\"", "\"sender-port\"", - "\"max-queue-size\"", "\"ncr-protocol\"", "\"ncr-format\"", - "\"always-include-fqdn\"", "\"override-no-update\"", - "\"override-client-update\"", "\"replace-client-name\"", - "\"generated-prefix\"", "\"UDP\"", "\"TCP\"", "\"JSON\"", - "\"when-present\"", "\"never\"", "\"always\"", "\"when-not-present\"", - "\"Logging\"", "\"loggers\"", "\"output_options\"", "\"output\"", - "\"debuglevel\"", "\"severity\"", "\"flush\"", "\"maxsize\"", - "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", "\"Control-agent\"", - "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", "SUB_INTERFACES6", - "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", "SUB_RESERVATION", - "SUB_OPTION_DEFS", "SUB_OPTION_DEF", "SUB_OPTION_DATA", - "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", "SUB_LOGGING", + "\"lease-database\"", "\"hosts-database\"", "\"hosts-databases\"", + "\"type\"", "\"memfile\"", "\"mysql\"", "\"postgresql\"", "\"cql\"", + "\"user\"", "\"password\"", "\"host\"", "\"port\"", "\"persist\"", + "\"lfc-interval\"", "\"readonly\"", "\"connect-timeout\"", + "\"contact-points\"", "\"keyspace\"", "\"preferred-lifetime\"", + "\"valid-lifetime\"", "\"renew-timer\"", "\"rebind-timer\"", + "\"decline-probation-period\"", "\"subnet6\"", "\"option-def\"", + "\"option-data\"", "\"name\"", "\"data\"", "\"code\"", "\"space\"", + "\"csv-format\"", "\"always-send\"", "\"record-types\"", + "\"encapsulate\"", "\"array\"", "\"pools\"", "\"pool\"", "\"pd-pools\"", + "\"prefix\"", "\"prefix-len\"", "\"excluded-prefix\"", + "\"excluded-prefix-len\"", "\"delegated-len\"", "\"user-context\"", + "\"comment\"", "\"subnet\"", "\"interface\"", "\"interface-id\"", + "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"", + "\"out-of-pool\"", "\"all\"", "\"shared-networks\"", "\"mac-sources\"", + "\"relay-supplied-options\"", "\"host-reservation-identifiers\"", + "\"client-classes\"", "\"test\"", "\"client-class\"", "\"reservations\"", + "\"ip-addresses\"", "\"prefixes\"", "\"duid\"", "\"hw-address\"", + "\"hostname\"", "\"flex-id\"", "\"relay\"", "\"ip-address\"", + "\"hooks-libraries\"", "\"library\"", "\"parameters\"", + "\"expired-leases-processing\"", "\"reclaim-timer-wait-time\"", + "\"flush-reclaimed-timer-wait-time\"", "\"hold-reclaimed-time\"", + "\"max-reclaim-leases\"", "\"max-reclaim-time\"", + "\"unwarned-reclaim-cycles\"", "\"server-id\"", "\"LLT\"", "\"EN\"", + "\"LL\"", "\"identifier\"", "\"htype\"", "\"time\"", "\"enterprise-id\"", + "\"dhcp4o6-port\"", "\"control-socket\"", "\"socket-type\"", + "\"socket-name\"", "\"dhcp-ddns\"", "\"enable-updates\"", + "\"qualifying-suffix\"", "\"server-ip\"", "\"server-port\"", + "\"sender-ip\"", "\"sender-port\"", "\"max-queue-size\"", + "\"ncr-protocol\"", "\"ncr-format\"", "\"always-include-fqdn\"", + "\"override-no-update\"", "\"override-client-update\"", + "\"replace-client-name\"", "\"generated-prefix\"", "\"UDP\"", "\"TCP\"", + "\"JSON\"", "\"when-present\"", "\"never\"", "\"always\"", + "\"when-not-present\"", "\"Logging\"", "\"loggers\"", + "\"output_options\"", "\"output\"", "\"debuglevel\"", "\"severity\"", + "\"flush\"", "\"maxsize\"", "\"maxver\"", "\"Dhcp4\"", "\"DhcpDdns\"", + "\"Control-agent\"", "TOPLEVEL_JSON", "TOPLEVEL_DHCP6", "SUB_DHCP6", + "SUB_INTERFACES6", "SUB_SUBNET6", "SUB_POOL6", "SUB_PD_POOL", + "SUB_RESERVATION", "SUB_OPTION_DEFS", "SUB_OPTION_DEF", + "SUB_OPTION_DATA", "SUB_HOOKS_LIBRARY", "SUB_DHCP_DDNS", "SUB_LOGGING", "\"constant string\"", "\"integer\"", "\"floating point\"", "\"boolean\"", "$accept", "start", "$@1", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", "$@14", @@ -4415,78 +4463,79 @@ namespace isc { namespace dhcp { "decline_probation_period", "interfaces_config", "$@21", "sub_interfaces6", "$@22", "interfaces_config_params", "interfaces_config_param", "interfaces_list", "$@23", "re_detect", - "lease_database", "$@24", "hosts_database", "$@25", - "database_map_params", "database_map_param", "database_type", "$@26", - "db_type", "user", "$@27", "password", "$@28", "host", "$@29", "port", - "name", "$@30", "persist", "lfc_interval", "readonly", "connect_timeout", - "contact_points", "$@31", "keyspace", "$@32", "mac_sources", "$@33", + "lease_database", "$@24", "hosts_database", "$@25", "hosts_databases", + "$@26", "database_list", "not_empty_database_list", "database", "$@27", + "database_map_params", "database_map_param", "database_type", "$@28", + "db_type", "user", "$@29", "password", "$@30", "host", "$@31", "port", + "name", "$@32", "persist", "lfc_interval", "readonly", "connect_timeout", + "contact_points", "$@33", "keyspace", "$@34", "mac_sources", "$@35", "mac_sources_list", "mac_sources_value", "duid_id", "string_id", - "host_reservation_identifiers", "$@34", + "host_reservation_identifiers", "$@36", "host_reservation_identifiers_list", "host_reservation_identifier", - "hw_address_id", "flex_id", "relay_supplied_options", "$@35", - "hooks_libraries", "$@36", "hooks_libraries_list", - "not_empty_hooks_libraries_list", "hooks_library", "$@37", - "sub_hooks_library", "$@38", "hooks_params", "hooks_param", "library", - "$@39", "parameters", "$@40", "expired_leases_processing", "$@41", + "hw_address_id", "flex_id", "relay_supplied_options", "$@37", + "hooks_libraries", "$@38", "hooks_libraries_list", + "not_empty_hooks_libraries_list", "hooks_library", "$@39", + "sub_hooks_library", "$@40", "hooks_params", "hooks_param", "library", + "$@41", "parameters", "$@42", "expired_leases_processing", "$@43", "expired_leases_params", "expired_leases_param", "reclaim_timer_wait_time", "flush_reclaimed_timer_wait_time", "hold_reclaimed_time", "max_reclaim_leases", "max_reclaim_time", - "unwarned_reclaim_cycles", "subnet6_list", "$@42", - "subnet6_list_content", "not_empty_subnet6_list", "subnet6", "$@43", - "sub_subnet6", "$@44", "subnet6_params", "subnet6_param", "subnet", - "$@45", "interface", "$@46", "interface_id", "$@47", "client_class", - "$@48", "reservation_mode", "$@49", "hr_mode", "id", "rapid_commit", - "shared_networks", "$@50", "shared_networks_content", - "shared_networks_list", "shared_network", "$@51", + "unwarned_reclaim_cycles", "subnet6_list", "$@44", + "subnet6_list_content", "not_empty_subnet6_list", "subnet6", "$@45", + "sub_subnet6", "$@46", "subnet6_params", "subnet6_param", "subnet", + "$@47", "interface", "$@48", "interface_id", "$@49", "client_class", + "$@50", "reservation_mode", "$@51", "hr_mode", "id", "rapid_commit", + "shared_networks", "$@52", "shared_networks_content", + "shared_networks_list", "shared_network", "$@53", "shared_network_params", "shared_network_param", "option_def_list", - "$@52", "sub_option_def_list", "$@53", "option_def_list_content", - "not_empty_option_def_list", "option_def_entry", "$@54", - "sub_option_def", "$@55", "option_def_params", + "$@54", "sub_option_def_list", "$@55", "option_def_list_content", + "not_empty_option_def_list", "option_def_entry", "$@56", + "sub_option_def", "$@57", "option_def_params", "not_empty_option_def_params", "option_def_param", "option_def_name", - "code", "option_def_code", "option_def_type", "$@56", - "option_def_record_types", "$@57", "space", "$@58", "option_def_space", - "option_def_encapsulate", "$@59", "option_def_array", "option_data_list", - "$@60", "option_data_list_content", "not_empty_option_data_list", - "option_data_entry", "$@61", "sub_option_data", "$@62", + "code", "option_def_code", "option_def_type", "$@58", + "option_def_record_types", "$@59", "space", "$@60", "option_def_space", + "option_def_encapsulate", "$@61", "option_def_array", "option_data_list", + "$@62", "option_data_list_content", "not_empty_option_data_list", + "option_data_entry", "$@63", "sub_option_data", "$@64", "option_data_params", "not_empty_option_data_params", - "option_data_param", "option_data_name", "option_data_data", "$@63", + "option_data_param", "option_data_name", "option_data_data", "$@65", "option_data_code", "option_data_space", "option_data_csv_format", - "option_data_always_send", "pools_list", "$@64", "pools_list_content", - "not_empty_pools_list", "pool_list_entry", "$@65", "sub_pool6", "$@66", - "pool_params", "pool_param", "pool_entry", "$@67", "user_context", - "$@68", "comment", "$@69", "pd_pools_list", "$@70", + "option_data_always_send", "pools_list", "$@66", "pools_list_content", + "not_empty_pools_list", "pool_list_entry", "$@67", "sub_pool6", "$@68", + "pool_params", "pool_param", "pool_entry", "$@69", "user_context", + "$@70", "comment", "$@71", "pd_pools_list", "$@72", "pd_pools_list_content", "not_empty_pd_pools_list", "pd_pool_entry", - "$@71", "sub_pd_pool", "$@72", "pd_pool_params", "pd_pool_param", - "pd_prefix", "$@73", "pd_prefix_len", "excluded_prefix", "$@74", - "excluded_prefix_len", "pd_delegated_len", "reservations", "$@75", + "$@73", "sub_pd_pool", "$@74", "pd_pool_params", "pd_pool_param", + "pd_prefix", "$@75", "pd_prefix_len", "excluded_prefix", "$@76", + "excluded_prefix_len", "pd_delegated_len", "reservations", "$@77", "reservations_list", "not_empty_reservations_list", "reservation", - "$@76", "sub_reservation", "$@77", "reservation_params", + "$@78", "sub_reservation", "$@79", "reservation_params", "not_empty_reservation_params", "reservation_param", "ip_addresses", - "$@78", "prefixes", "$@79", "duid", "$@80", "hw_address", "$@81", - "hostname", "$@82", "flex_id_value", "$@83", - "reservation_client_classes", "$@84", "relay", "$@85", "relay_map", - "$@86", "client_classes", "$@87", "client_classes_list", - "client_class_entry", "$@88", "client_class_params", + "$@80", "prefixes", "$@81", "duid", "$@82", "hw_address", "$@83", + "hostname", "$@84", "flex_id_value", "$@85", + "reservation_client_classes", "$@86", "relay", "$@87", "relay_map", + "$@88", "client_classes", "$@89", "client_classes_list", + "client_class_entry", "$@90", "client_class_params", "not_empty_client_class_params", "client_class_param", - "client_class_name", "client_class_test", "$@89", "server_id", "$@90", - "server_id_params", "server_id_param", "server_id_type", "$@91", - "duid_type", "htype", "identifier", "$@92", "time", "enterprise_id", - "dhcp4o6_port", "control_socket", "$@93", "control_socket_params", - "control_socket_param", "socket_type", "$@94", "socket_name", "$@95", - "dhcp_ddns", "$@96", "sub_dhcp_ddns", "$@97", "dhcp_ddns_params", - "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@98", - "server_ip", "$@99", "server_port", "sender_ip", "$@100", "sender_port", - "max_queue_size", "ncr_protocol", "$@101", "ncr_protocol_value", - "ncr_format", "$@102", "always_include_fqdn", "override_no_update", - "override_client_update", "replace_client_name", "$@103", - "replace_client_name_value", "generated_prefix", "$@104", - "dhcp4_json_object", "$@105", "dhcpddns_json_object", "$@106", - "control_agent_json_object", "$@107", "logging_object", "$@108", - "sub_logging", "$@109", "logging_params", "logging_param", "loggers", - "$@110", "loggers_entries", "logger_entry", "$@111", "logger_params", - "logger_param", "debuglevel", "severity", "$@112", "output_options_list", - "$@113", "output_options_list_content", "output_entry", "$@114", - "output_params_list", "output_params", "output", "$@115", "flush", + "client_class_name", "client_class_test", "$@91", "server_id", "$@92", + "server_id_params", "server_id_param", "server_id_type", "$@93", + "duid_type", "htype", "identifier", "$@94", "time", "enterprise_id", + "dhcp4o6_port", "control_socket", "$@95", "control_socket_params", + "control_socket_param", "socket_type", "$@96", "socket_name", "$@97", + "dhcp_ddns", "$@98", "sub_dhcp_ddns", "$@99", "dhcp_ddns_params", + "dhcp_ddns_param", "enable_updates", "qualifying_suffix", "$@100", + "server_ip", "$@101", "server_port", "sender_ip", "$@102", "sender_port", + "max_queue_size", "ncr_protocol", "$@103", "ncr_protocol_value", + "ncr_format", "$@104", "always_include_fqdn", "override_no_update", + "override_client_update", "replace_client_name", "$@105", + "replace_client_name_value", "generated_prefix", "$@106", + "dhcp4_json_object", "$@107", "dhcpddns_json_object", "$@108", + "control_agent_json_object", "$@109", "logging_object", "$@110", + "sub_logging", "$@111", "logging_params", "logging_param", "loggers", + "$@112", "loggers_entries", "logger_entry", "$@113", "logger_params", + "logger_param", "debuglevel", "severity", "$@114", "output_options_list", + "$@115", "output_options_list_content", "output_entry", "$@116", + "output_params_list", "output_params", "output", "$@117", "flush", "maxsize", "maxver", YY_NULLPTR }; @@ -4494,67 +4543,68 @@ namespace isc { namespace dhcp { const unsigned short int Dhcp6Parser::yyrline_[] = { - 0, 238, 238, 238, 239, 239, 240, 240, 241, 241, - 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, - 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, - 259, 260, 261, 262, 263, 264, 265, 268, 273, 273, - 284, 287, 288, 291, 295, 302, 302, 309, 310, 313, - 317, 324, 324, 331, 332, 335, 339, 350, 360, 360, - 375, 376, 380, 381, 382, 383, 384, 385, 388, 388, - 403, 403, 412, 413, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 445, - 450, 455, 460, 465, 470, 470, 481, 481, 490, 491, - 494, 495, 496, 497, 498, 501, 501, 511, 517, 517, - 529, 529, 541, 542, 545, 546, 547, 548, 549, 550, - 551, 552, 553, 554, 555, 556, 557, 560, 560, 567, - 568, 569, 570, 573, 573, 581, 581, 589, 589, 597, - 602, 602, 610, 615, 620, 625, 630, 630, 638, 638, - 647, 647, 657, 658, 661, 662, 665, 670, 675, 675, - 685, 686, 689, 690, 691, 694, 699, 706, 706, 716, - 716, 726, 727, 730, 731, 734, 734, 744, 744, 754, - 755, 756, 759, 760, 763, 763, 771, 771, 779, 779, - 790, 791, 794, 795, 796, 797, 798, 799, 802, 807, - 812, 817, 822, 827, 835, 835, 848, 849, 852, 853, - 860, 860, 886, 886, 897, 898, 902, 903, 904, 905, - 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, - 916, 917, 918, 919, 920, 923, 923, 931, 931, 939, - 939, 947, 947, 955, 955, 962, 963, 964, 967, 972, - 980, 980, 991, 992, 996, 997, 1000, 1000, 1008, 1009, - 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, - 1022, 1023, 1024, 1025, 1026, 1027, 1034, 1034, 1047, 1047, - 1056, 1057, 1060, 1061, 1066, 1066, 1081, 1081, 1095, 1096, - 1099, 1100, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, - 1111, 1112, 1115, 1117, 1122, 1124, 1124, 1132, 1132, 1140, - 1140, 1148, 1150, 1150, 1158, 1167, 1167, 1179, 1180, 1185, - 1186, 1191, 1191, 1203, 1203, 1215, 1216, 1221, 1222, 1227, - 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1238, 1240, - 1240, 1248, 1250, 1252, 1257, 1265, 1265, 1277, 1278, 1281, - 1282, 1285, 1285, 1295, 1295, 1304, 1305, 1308, 1309, 1310, - 1311, 1312, 1313, 1316, 1316, 1324, 1324, 1349, 1349, 1379, - 1379, 1391, 1392, 1395, 1396, 1399, 1399, 1411, 1411, 1423, - 1424, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, - 1436, 1439, 1439, 1447, 1452, 1452, 1460, 1465, 1473, 1473, - 1483, 1484, 1487, 1488, 1491, 1491, 1500, 1500, 1509, 1510, - 1513, 1514, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, - 1526, 1527, 1528, 1531, 1531, 1541, 1541, 1551, 1551, 1559, - 1559, 1567, 1567, 1575, 1575, 1583, 1583, 1596, 1596, 1606, - 1606, 1617, 1617, 1627, 1628, 1631, 1631, 1641, 1642, 1645, - 1646, 1649, 1650, 1651, 1652, 1653, 1654, 1657, 1659, 1659, - 1670, 1670, 1682, 1683, 1686, 1687, 1688, 1689, 1690, 1691, - 1692, 1693, 1694, 1697, 1697, 1704, 1705, 1706, 1709, 1714, - 1714, 1722, 1727, 1734, 1741, 1741, 1751, 1752, 1755, 1756, - 1757, 1758, 1759, 1762, 1762, 1770, 1770, 1780, 1780, 1792, - 1792, 1802, 1803, 1806, 1807, 1808, 1809, 1810, 1811, 1812, - 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, - 1825, 1830, 1830, 1838, 1838, 1846, 1851, 1851, 1859, 1864, - 1869, 1869, 1877, 1878, 1881, 1881, 1889, 1894, 1899, 1904, - 1904, 1912, 1915, 1918, 1921, 1924, 1930, 1930, 1940, 1940, - 1947, 1947, 1954, 1954, 1967, 1967, 1977, 1977, 1988, 1989, - 1993, 1997, 1997, 2009, 2010, 2014, 2014, 2022, 2023, 2026, - 2027, 2028, 2029, 2030, 2031, 2032, 2035, 2040, 2040, 2048, - 2048, 2058, 2059, 2062, 2062, 2070, 2071, 2074, 2075, 2076, - 2077, 2080, 2080, 2088, 2093, 2098 + 0, 239, 239, 239, 240, 240, 241, 241, 242, 242, + 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, + 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, + 260, 261, 262, 263, 264, 265, 266, 269, 274, 274, + 285, 288, 289, 292, 296, 303, 303, 310, 311, 314, + 318, 325, 325, 332, 333, 336, 340, 351, 361, 361, + 376, 377, 381, 382, 383, 384, 385, 386, 389, 389, + 404, 404, 413, 414, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 447, 452, 457, 462, 467, 472, 472, 483, 483, 492, + 493, 496, 497, 498, 499, 500, 503, 503, 513, 519, + 519, 531, 531, 543, 543, 553, 554, 557, 558, 561, + 561, 571, 572, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 590, 590, 597, 598, + 599, 600, 603, 603, 611, 611, 619, 619, 627, 632, + 632, 640, 645, 650, 655, 660, 660, 668, 668, 677, + 677, 687, 688, 691, 692, 695, 700, 705, 705, 715, + 716, 719, 720, 721, 724, 729, 736, 736, 746, 746, + 756, 757, 760, 761, 764, 764, 774, 774, 784, 785, + 786, 789, 790, 793, 793, 801, 801, 809, 809, 820, + 821, 824, 825, 826, 827, 828, 829, 832, 837, 842, + 847, 852, 857, 865, 865, 878, 879, 882, 883, 890, + 890, 916, 916, 927, 928, 932, 933, 934, 935, 936, + 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, + 947, 948, 949, 950, 953, 953, 961, 961, 969, 969, + 977, 977, 985, 985, 992, 993, 994, 997, 1002, 1010, + 1010, 1021, 1022, 1026, 1027, 1030, 1030, 1038, 1039, 1042, + 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1064, 1064, 1077, 1077, 1086, + 1087, 1090, 1091, 1096, 1096, 1111, 1111, 1125, 1126, 1129, + 1130, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 1142, 1145, 1147, 1152, 1154, 1154, 1162, 1162, 1170, 1170, + 1178, 1180, 1180, 1188, 1197, 1197, 1209, 1210, 1215, 1216, + 1221, 1221, 1233, 1233, 1245, 1246, 1251, 1252, 1257, 1258, + 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1268, 1270, 1270, + 1278, 1280, 1282, 1287, 1295, 1295, 1307, 1308, 1311, 1312, + 1315, 1315, 1325, 1325, 1334, 1335, 1338, 1339, 1340, 1341, + 1342, 1343, 1346, 1346, 1354, 1354, 1379, 1379, 1409, 1409, + 1421, 1422, 1425, 1426, 1429, 1429, 1441, 1441, 1453, 1454, + 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, + 1469, 1469, 1477, 1482, 1482, 1490, 1495, 1503, 1503, 1513, + 1514, 1517, 1518, 1521, 1521, 1530, 1530, 1539, 1540, 1543, + 1544, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, + 1557, 1558, 1561, 1561, 1571, 1571, 1581, 1581, 1589, 1589, + 1597, 1597, 1605, 1605, 1613, 1613, 1626, 1626, 1636, 1636, + 1647, 1647, 1657, 1658, 1661, 1661, 1671, 1672, 1675, 1676, + 1679, 1680, 1681, 1682, 1683, 1684, 1687, 1689, 1689, 1700, + 1700, 1712, 1713, 1716, 1717, 1718, 1719, 1720, 1721, 1722, + 1723, 1724, 1727, 1727, 1734, 1735, 1736, 1739, 1744, 1744, + 1752, 1757, 1764, 1771, 1771, 1781, 1782, 1785, 1786, 1787, + 1788, 1789, 1792, 1792, 1800, 1800, 1810, 1810, 1822, 1822, + 1832, 1833, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1855, + 1860, 1860, 1868, 1868, 1876, 1881, 1881, 1889, 1894, 1899, + 1899, 1907, 1908, 1911, 1911, 1919, 1924, 1929, 1934, 1934, + 1942, 1945, 1948, 1951, 1954, 1960, 1960, 1970, 1970, 1977, + 1977, 1984, 1984, 1997, 1997, 2007, 2007, 2018, 2019, 2023, + 2027, 2027, 2039, 2040, 2044, 2044, 2052, 2053, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2065, 2070, 2070, 2078, 2078, + 2088, 2089, 2092, 2092, 2100, 2101, 2104, 2105, 2106, 2107, + 2110, 2110, 2118, 2123, 2128 }; // Print the state stack on the debug stream. @@ -4589,8 +4639,8 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:1167 } } // isc::dhcp -#line 4593 "dhcp6_parser.cc" // lalr1.cc:1167 -#line 2103 "dhcp6_parser.yy" // lalr1.cc:1168 +#line 4643 "dhcp6_parser.cc" // lalr1.cc:1167 +#line 2133 "dhcp6_parser.yy" // lalr1.cc:1168 void diff --git a/src/bin/dhcp6/dhcp6_parser.h b/src/bin/dhcp6/dhcp6_parser.h index 9634f42983..d5d1b4cc0f 100644 --- a/src/bin/dhcp6/dhcp6_parser.h +++ b/src/bin/dhcp6/dhcp6_parser.h @@ -360,147 +360,148 @@ namespace isc { namespace dhcp { TOKEN_RE_DETECT = 268, TOKEN_LEASE_DATABASE = 269, TOKEN_HOSTS_DATABASE = 270, - TOKEN_TYPE = 271, - TOKEN_MEMFILE = 272, - TOKEN_MYSQL = 273, - TOKEN_POSTGRESQL = 274, - TOKEN_CQL = 275, - TOKEN_USER = 276, - TOKEN_PASSWORD = 277, - TOKEN_HOST = 278, - TOKEN_PORT = 279, - TOKEN_PERSIST = 280, - TOKEN_LFC_INTERVAL = 281, - TOKEN_READONLY = 282, - TOKEN_CONNECT_TIMEOUT = 283, - TOKEN_CONTACT_POINTS = 284, - TOKEN_KEYSPACE = 285, - TOKEN_PREFERRED_LIFETIME = 286, - TOKEN_VALID_LIFETIME = 287, - TOKEN_RENEW_TIMER = 288, - TOKEN_REBIND_TIMER = 289, - TOKEN_DECLINE_PROBATION_PERIOD = 290, - TOKEN_SUBNET6 = 291, - TOKEN_OPTION_DEF = 292, - TOKEN_OPTION_DATA = 293, - TOKEN_NAME = 294, - TOKEN_DATA = 295, - TOKEN_CODE = 296, - TOKEN_SPACE = 297, - TOKEN_CSV_FORMAT = 298, - TOKEN_ALWAYS_SEND = 299, - TOKEN_RECORD_TYPES = 300, - TOKEN_ENCAPSULATE = 301, - TOKEN_ARRAY = 302, - TOKEN_POOLS = 303, - TOKEN_POOL = 304, - TOKEN_PD_POOLS = 305, - TOKEN_PREFIX = 306, - TOKEN_PREFIX_LEN = 307, - TOKEN_EXCLUDED_PREFIX = 308, - TOKEN_EXCLUDED_PREFIX_LEN = 309, - TOKEN_DELEGATED_LEN = 310, - TOKEN_USER_CONTEXT = 311, - TOKEN_COMMENT = 312, - TOKEN_SUBNET = 313, - TOKEN_INTERFACE = 314, - TOKEN_INTERFACE_ID = 315, - TOKEN_ID = 316, - TOKEN_RAPID_COMMIT = 317, - TOKEN_RESERVATION_MODE = 318, - TOKEN_DISABLED = 319, - TOKEN_OUT_OF_POOL = 320, - TOKEN_ALL = 321, - TOKEN_SHARED_NETWORKS = 322, - TOKEN_MAC_SOURCES = 323, - TOKEN_RELAY_SUPPLIED_OPTIONS = 324, - TOKEN_HOST_RESERVATION_IDENTIFIERS = 325, - TOKEN_CLIENT_CLASSES = 326, - TOKEN_TEST = 327, - TOKEN_CLIENT_CLASS = 328, - TOKEN_RESERVATIONS = 329, - TOKEN_IP_ADDRESSES = 330, - TOKEN_PREFIXES = 331, - TOKEN_DUID = 332, - TOKEN_HW_ADDRESS = 333, - TOKEN_HOSTNAME = 334, - TOKEN_FLEX_ID = 335, - TOKEN_RELAY = 336, - TOKEN_IP_ADDRESS = 337, - TOKEN_HOOKS_LIBRARIES = 338, - TOKEN_LIBRARY = 339, - TOKEN_PARAMETERS = 340, - TOKEN_EXPIRED_LEASES_PROCESSING = 341, - TOKEN_RECLAIM_TIMER_WAIT_TIME = 342, - TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 343, - TOKEN_HOLD_RECLAIMED_TIME = 344, - TOKEN_MAX_RECLAIM_LEASES = 345, - TOKEN_MAX_RECLAIM_TIME = 346, - TOKEN_UNWARNED_RECLAIM_CYCLES = 347, - TOKEN_SERVER_ID = 348, - TOKEN_LLT = 349, - TOKEN_EN = 350, - TOKEN_LL = 351, - TOKEN_IDENTIFIER = 352, - TOKEN_HTYPE = 353, - TOKEN_TIME = 354, - TOKEN_ENTERPRISE_ID = 355, - TOKEN_DHCP4O6_PORT = 356, - TOKEN_CONTROL_SOCKET = 357, - TOKEN_SOCKET_TYPE = 358, - TOKEN_SOCKET_NAME = 359, - TOKEN_DHCP_DDNS = 360, - TOKEN_ENABLE_UPDATES = 361, - TOKEN_QUALIFYING_SUFFIX = 362, - TOKEN_SERVER_IP = 363, - TOKEN_SERVER_PORT = 364, - TOKEN_SENDER_IP = 365, - TOKEN_SENDER_PORT = 366, - TOKEN_MAX_QUEUE_SIZE = 367, - TOKEN_NCR_PROTOCOL = 368, - TOKEN_NCR_FORMAT = 369, - TOKEN_ALWAYS_INCLUDE_FQDN = 370, - TOKEN_OVERRIDE_NO_UPDATE = 371, - TOKEN_OVERRIDE_CLIENT_UPDATE = 372, - TOKEN_REPLACE_CLIENT_NAME = 373, - TOKEN_GENERATED_PREFIX = 374, - TOKEN_UDP = 375, - TOKEN_TCP = 376, - TOKEN_JSON = 377, - TOKEN_WHEN_PRESENT = 378, - TOKEN_NEVER = 379, - TOKEN_ALWAYS = 380, - TOKEN_WHEN_NOT_PRESENT = 381, - TOKEN_LOGGING = 382, - TOKEN_LOGGERS = 383, - TOKEN_OUTPUT_OPTIONS = 384, - TOKEN_OUTPUT = 385, - TOKEN_DEBUGLEVEL = 386, - TOKEN_SEVERITY = 387, - TOKEN_FLUSH = 388, - TOKEN_MAXSIZE = 389, - TOKEN_MAXVER = 390, - TOKEN_DHCP4 = 391, - TOKEN_DHCPDDNS = 392, - TOKEN_CONTROL_AGENT = 393, - TOKEN_TOPLEVEL_JSON = 394, - TOKEN_TOPLEVEL_DHCP6 = 395, - TOKEN_SUB_DHCP6 = 396, - TOKEN_SUB_INTERFACES6 = 397, - TOKEN_SUB_SUBNET6 = 398, - TOKEN_SUB_POOL6 = 399, - TOKEN_SUB_PD_POOL = 400, - TOKEN_SUB_RESERVATION = 401, - TOKEN_SUB_OPTION_DEFS = 402, - TOKEN_SUB_OPTION_DEF = 403, - TOKEN_SUB_OPTION_DATA = 404, - TOKEN_SUB_HOOKS_LIBRARY = 405, - TOKEN_SUB_DHCP_DDNS = 406, - TOKEN_SUB_LOGGING = 407, - TOKEN_STRING = 408, - TOKEN_INTEGER = 409, - TOKEN_FLOAT = 410, - TOKEN_BOOLEAN = 411 + TOKEN_HOSTS_DATABASES = 271, + TOKEN_TYPE = 272, + TOKEN_MEMFILE = 273, + TOKEN_MYSQL = 274, + TOKEN_POSTGRESQL = 275, + TOKEN_CQL = 276, + TOKEN_USER = 277, + TOKEN_PASSWORD = 278, + TOKEN_HOST = 279, + TOKEN_PORT = 280, + TOKEN_PERSIST = 281, + TOKEN_LFC_INTERVAL = 282, + TOKEN_READONLY = 283, + TOKEN_CONNECT_TIMEOUT = 284, + TOKEN_CONTACT_POINTS = 285, + TOKEN_KEYSPACE = 286, + TOKEN_PREFERRED_LIFETIME = 287, + TOKEN_VALID_LIFETIME = 288, + TOKEN_RENEW_TIMER = 289, + TOKEN_REBIND_TIMER = 290, + TOKEN_DECLINE_PROBATION_PERIOD = 291, + TOKEN_SUBNET6 = 292, + TOKEN_OPTION_DEF = 293, + TOKEN_OPTION_DATA = 294, + TOKEN_NAME = 295, + TOKEN_DATA = 296, + TOKEN_CODE = 297, + TOKEN_SPACE = 298, + TOKEN_CSV_FORMAT = 299, + TOKEN_ALWAYS_SEND = 300, + TOKEN_RECORD_TYPES = 301, + TOKEN_ENCAPSULATE = 302, + TOKEN_ARRAY = 303, + TOKEN_POOLS = 304, + TOKEN_POOL = 305, + TOKEN_PD_POOLS = 306, + TOKEN_PREFIX = 307, + TOKEN_PREFIX_LEN = 308, + TOKEN_EXCLUDED_PREFIX = 309, + TOKEN_EXCLUDED_PREFIX_LEN = 310, + TOKEN_DELEGATED_LEN = 311, + TOKEN_USER_CONTEXT = 312, + TOKEN_COMMENT = 313, + TOKEN_SUBNET = 314, + TOKEN_INTERFACE = 315, + TOKEN_INTERFACE_ID = 316, + TOKEN_ID = 317, + TOKEN_RAPID_COMMIT = 318, + TOKEN_RESERVATION_MODE = 319, + TOKEN_DISABLED = 320, + TOKEN_OUT_OF_POOL = 321, + TOKEN_ALL = 322, + TOKEN_SHARED_NETWORKS = 323, + TOKEN_MAC_SOURCES = 324, + TOKEN_RELAY_SUPPLIED_OPTIONS = 325, + TOKEN_HOST_RESERVATION_IDENTIFIERS = 326, + TOKEN_CLIENT_CLASSES = 327, + TOKEN_TEST = 328, + TOKEN_CLIENT_CLASS = 329, + TOKEN_RESERVATIONS = 330, + TOKEN_IP_ADDRESSES = 331, + TOKEN_PREFIXES = 332, + TOKEN_DUID = 333, + TOKEN_HW_ADDRESS = 334, + TOKEN_HOSTNAME = 335, + TOKEN_FLEX_ID = 336, + TOKEN_RELAY = 337, + TOKEN_IP_ADDRESS = 338, + TOKEN_HOOKS_LIBRARIES = 339, + TOKEN_LIBRARY = 340, + TOKEN_PARAMETERS = 341, + TOKEN_EXPIRED_LEASES_PROCESSING = 342, + TOKEN_RECLAIM_TIMER_WAIT_TIME = 343, + TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 344, + TOKEN_HOLD_RECLAIMED_TIME = 345, + TOKEN_MAX_RECLAIM_LEASES = 346, + TOKEN_MAX_RECLAIM_TIME = 347, + TOKEN_UNWARNED_RECLAIM_CYCLES = 348, + TOKEN_SERVER_ID = 349, + TOKEN_LLT = 350, + TOKEN_EN = 351, + TOKEN_LL = 352, + TOKEN_IDENTIFIER = 353, + TOKEN_HTYPE = 354, + TOKEN_TIME = 355, + TOKEN_ENTERPRISE_ID = 356, + TOKEN_DHCP4O6_PORT = 357, + TOKEN_CONTROL_SOCKET = 358, + TOKEN_SOCKET_TYPE = 359, + TOKEN_SOCKET_NAME = 360, + TOKEN_DHCP_DDNS = 361, + TOKEN_ENABLE_UPDATES = 362, + TOKEN_QUALIFYING_SUFFIX = 363, + TOKEN_SERVER_IP = 364, + TOKEN_SERVER_PORT = 365, + TOKEN_SENDER_IP = 366, + TOKEN_SENDER_PORT = 367, + TOKEN_MAX_QUEUE_SIZE = 368, + TOKEN_NCR_PROTOCOL = 369, + TOKEN_NCR_FORMAT = 370, + TOKEN_ALWAYS_INCLUDE_FQDN = 371, + TOKEN_OVERRIDE_NO_UPDATE = 372, + TOKEN_OVERRIDE_CLIENT_UPDATE = 373, + TOKEN_REPLACE_CLIENT_NAME = 374, + TOKEN_GENERATED_PREFIX = 375, + TOKEN_UDP = 376, + TOKEN_TCP = 377, + TOKEN_JSON = 378, + TOKEN_WHEN_PRESENT = 379, + TOKEN_NEVER = 380, + TOKEN_ALWAYS = 381, + TOKEN_WHEN_NOT_PRESENT = 382, + TOKEN_LOGGING = 383, + TOKEN_LOGGERS = 384, + TOKEN_OUTPUT_OPTIONS = 385, + TOKEN_OUTPUT = 386, + TOKEN_DEBUGLEVEL = 387, + TOKEN_SEVERITY = 388, + TOKEN_FLUSH = 389, + TOKEN_MAXSIZE = 390, + TOKEN_MAXVER = 391, + TOKEN_DHCP4 = 392, + TOKEN_DHCPDDNS = 393, + TOKEN_CONTROL_AGENT = 394, + TOKEN_TOPLEVEL_JSON = 395, + TOKEN_TOPLEVEL_DHCP6 = 396, + TOKEN_SUB_DHCP6 = 397, + TOKEN_SUB_INTERFACES6 = 398, + TOKEN_SUB_SUBNET6 = 399, + TOKEN_SUB_POOL6 = 400, + TOKEN_SUB_PD_POOL = 401, + TOKEN_SUB_RESERVATION = 402, + TOKEN_SUB_OPTION_DEFS = 403, + TOKEN_SUB_OPTION_DEF = 404, + TOKEN_SUB_OPTION_DATA = 405, + TOKEN_SUB_HOOKS_LIBRARY = 406, + TOKEN_SUB_DHCP_DDNS = 407, + TOKEN_SUB_LOGGING = 408, + TOKEN_STRING = 409, + TOKEN_INTEGER = 410, + TOKEN_FLOAT = 411, + TOKEN_BOOLEAN = 412 }; }; @@ -671,6 +672,10 @@ namespace isc { namespace dhcp { symbol_type make_HOSTS_DATABASE (const location_type& l); + static inline + symbol_type + make_HOSTS_DATABASES (const location_type& l); + static inline symbol_type make_TYPE (const location_type& l); @@ -1440,12 +1445,12 @@ namespace isc { namespace dhcp { enum { yyeof_ = 0, - yylast_ = 931, ///< Last index in yytable_. - yynnts_ = 352, ///< Number of nonterminal symbols. + yylast_ = 933, ///< Last index in yytable_. + yynnts_ = 358, ///< Number of nonterminal symbols. yyfinal_ = 30, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 157 ///< Number of tokens. + yyntokens_ = 158 ///< Number of tokens. }; @@ -1503,9 +1508,9 @@ namespace isc { namespace dhcp { 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156 + 155, 156, 157 }; - const unsigned int user_token_number_max_ = 411; + const unsigned int user_token_number_max_ = 412; const token_number_type undef_token_ = 2; if (static_cast(t) <= yyeof_) @@ -1538,29 +1543,29 @@ namespace isc { namespace dhcp { { switch (other.type_get ()) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.copy< ElementPtr > (other.value); break; - case 156: // "boolean" + case 157: // "boolean" value.copy< bool > (other.value); break; - case 155: // "floating point" + case 156: // "floating point" value.copy< double > (other.value); break; - case 154: // "integer" + case 155: // "integer" value.copy< int64_t > (other.value); break; - case 153: // "constant string" + case 154: // "constant string" value.copy< std::string > (other.value); break; @@ -1581,29 +1586,29 @@ namespace isc { namespace dhcp { (void) v; switch (this->type_get ()) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.copy< ElementPtr > (v); break; - case 156: // "boolean" + case 157: // "boolean" value.copy< bool > (v); break; - case 155: // "floating point" + case 156: // "floating point" value.copy< double > (v); break; - case 154: // "integer" + case 155: // "integer" value.copy< int64_t > (v); break; - case 153: // "constant string" + case 154: // "constant string" value.copy< std::string > (v); break; @@ -1683,29 +1688,29 @@ namespace isc { namespace dhcp { // Type destructor. switch (yytype) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.template destroy< ElementPtr > (); break; - case 156: // "boolean" + case 157: // "boolean" value.template destroy< bool > (); break; - case 155: // "floating point" + case 156: // "floating point" value.template destroy< double > (); break; - case 154: // "integer" + case 155: // "integer" value.template destroy< int64_t > (); break; - case 153: // "constant string" + case 154: // "constant string" value.template destroy< std::string > (); break; @@ -1732,29 +1737,29 @@ namespace isc { namespace dhcp { super_type::move(s); switch (this->type_get ()) { - case 173: // value - case 177: // map_value - case 221: // db_type - case 297: // hr_mode - case 431: // duid_type - case 464: // ncr_protocol_value - case 472: // replace_client_name_value + case 174: // value + case 178: // map_value + case 228: // db_type + case 304: // hr_mode + case 438: // duid_type + case 471: // ncr_protocol_value + case 479: // replace_client_name_value value.move< ElementPtr > (s.value); break; - case 156: // "boolean" + case 157: // "boolean" value.move< bool > (s.value); break; - case 155: // "floating point" + case 156: // "floating point" value.move< double > (s.value); break; - case 154: // "integer" + case 155: // "integer" value.move< int64_t > (s.value); break; - case 153: // "constant string" + case 154: // "constant string" value.move< std::string > (s.value); break; @@ -1828,7 +1833,7 @@ namespace isc { namespace dhcp { 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411 + 405, 406, 407, 408, 409, 410, 411, 412 }; return static_cast (yytoken_number_[type]); } @@ -1917,6 +1922,12 @@ namespace isc { namespace dhcp { return symbol_type (token::TOKEN_HOSTS_DATABASE, l); } + Dhcp6Parser::symbol_type + Dhcp6Parser::make_HOSTS_DATABASES (const location_type& l) + { + return symbol_type (token::TOKEN_HOSTS_DATABASES, l); + } + Dhcp6Parser::symbol_type Dhcp6Parser::make_TYPE (const location_type& l) { @@ -2766,7 +2777,7 @@ namespace isc { namespace dhcp { #line 14 "dhcp6_parser.yy" // lalr1.cc:377 } } // isc::dhcp -#line 2770 "dhcp6_parser.h" // lalr1.cc:377 +#line 2781 "dhcp6_parser.h" // lalr1.cc:377 diff --git a/src/bin/dhcp6/location.hh b/src/bin/dhcp6/location.hh index 2e2812ac18..5bb488a094 100644 --- a/src/bin/dhcp6/location.hh +++ b/src/bin/dhcp6/location.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Locations for Bison parsers in C++ diff --git a/src/bin/dhcp6/position.hh b/src/bin/dhcp6/position.hh index fa6f9d4722..14c9478d56 100644 --- a/src/bin/dhcp6/position.hh +++ b/src/bin/dhcp6/position.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Positions for Bison parsers in C++ diff --git a/src/bin/dhcp6/stack.hh b/src/bin/dhcp6/stack.hh index ee6210af0f..8152d09a1e 100644 --- a/src/bin/dhcp6/stack.hh +++ b/src/bin/dhcp6/stack.hh @@ -1,4 +1,4 @@ -// Generated 201801182315 +// Generated 201802120036 // A Bison parser, made by GNU Bison 3.0.4. // Stack handling for Bison parsers in C++ From 0b223d0364bf762ba4ecd7b48fe7a985b3309d77 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 12 Feb 2018 06:09:55 +0100 Subject: [PATCH 06/18] [5531] Done --- doc/examples/kea4/pgsql-reservations.json | 18 ++-- doc/examples/kea6/pgsql-reservations.json | 18 ++-- doc/guide/dhcp4-srv.xml | 18 +++- doc/guide/dhcp6-srv.xml | 18 +++- doc/guide/hooks.xml | 10 +- src/bin/dhcp4/json_config_parser.cc | 14 ++- src/bin/dhcp4/tests/config_parser_unittest.cc | 44 ++++++++- src/bin/dhcp4/tests/get_config_unittest.cc | 83 ++++++++++++++++- .../dhcp4/tests/get_config_unittest.cc.skel | 10 +- src/bin/dhcp6/json_config_parser.cc | 13 ++- src/bin/dhcp6/tests/config_parser_unittest.cc | 43 ++++++++- src/bin/dhcp6/tests/get_config_unittest.cc | 93 ++++++++++++++++++- .../dhcp6/tests/get_config_unittest.cc.skel | 8 +- src/lib/dhcpsrv/cfg_db_access.cc | 24 +++-- src/lib/dhcpsrv/cfg_db_access.h | 44 ++++++--- src/lib/dhcpsrv/parsers/dbaccess_parser.cc | 13 ++- src/lib/dhcpsrv/parsers/dbaccess_parser.h | 12 +-- src/lib/dhcpsrv/srv_config.cc | 11 +-- .../dhcpsrv/tests/cfg_db_access_unittest.cc | 39 +++++++- .../dhcpsrv/tests/dbaccess_parser_unittest.cc | 70 +++++++++----- 20 files changed, 491 insertions(+), 112 deletions(-) diff --git a/doc/examples/kea4/pgsql-reservations.json b/doc/examples/kea4/pgsql-reservations.json index d01b966a30..a7c3edb4a3 100644 --- a/doc/examples/kea4/pgsql-reservations.json +++ b/doc/examples/kea4/pgsql-reservations.json @@ -54,13 +54,17 @@ // reservations list, within the subnet (configuration file). If there are // no reservations there, the server will try to retrieve reservations // from this database. - "hosts-database": { - "type": "postgresql", - "name": "kea", - "user": "kea", - "password": "kea", - "host": "localhost" - }, +// The database specification can go into one hosts-database entry for +// backward compatibility or be listed in hosts-databases list. + "hosts-databases": [ + { + "type": "postgresql", + "name": "kea", + "user": "kea", + "password": "kea", + "host": "localhost" + } + ], // Define a subnet with a single pool of dynamic addresses. Addresses from // this pool will be assigned to clients which don't have reservations in the diff --git a/doc/examples/kea6/pgsql-reservations.json b/doc/examples/kea6/pgsql-reservations.json index 7f7f70369c..6f930753df 100644 --- a/doc/examples/kea6/pgsql-reservations.json +++ b/doc/examples/kea6/pgsql-reservations.json @@ -41,13 +41,17 @@ // reservations list, within the subnet (configuration file). If there are // no reservations there, the server will try to retrieve reservations // from this database. - "hosts-database": { - "type": "postgresql", - "name": "kea", - "user": "kea", - "password": "kea", - "host": "localhost" - }, +// The database specification can go into one hosts-database entry for +// backward compatibility or be listed in hosts-databases list. + "hosts-databases": [ + { + "type": "postgresql", + "name": "kea", + "user": "kea", + "password": "kea", + "host": "localhost" + } + ], // Define a subnet with a pool of dynamic addresses and a pool of dynamic // prefixes. Addresses and prefixes from those pools will be assigned to diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml index 83de4dadb9..dc0743542b 100644 --- a/doc/guide/dhcp4-srv.xml +++ b/doc/guide/dhcp4-srv.xml @@ -529,7 +529,13 @@ If a timeout is given though, it should be an integer greater than zero. from the configuration file are checked first and external storage is checked later, if necessary. -
+ Version 1.4 extends the host storage to multiple storages. Operations + are performed on host storages in the configuration order with a special + case for addition: read-only storages must be configured after a + required read-write storage, or host reservation addition will + always fail. + +
DHCPv4 Hosts Database Configuration Hosts database configuration is controlled through the Dhcp4/hosts-database @@ -572,6 +578,16 @@ If a timeout is given though, it should be an integer greater than zero. If there is no password to the account, set the password to the empty string "". (This is also the default.) + + The multiple storage extension uses a similar syntax: a configuration + is placed into a "hosts-databases" list instead of into a "hosts-database" + entry as in: + +"Dhcp4": { "hosts-databases": [ { "type": "mysql", ... }, ... ], ... } + + + +
diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml index f5e1ae340e..8a7df130df 100644 --- a/doc/guide/dhcp6-srv.xml +++ b/doc/guide/dhcp6-srv.xml @@ -525,7 +525,13 @@ If a timeout is given though, it should be an integer greater than zero. from the configuration file are checked first and external storage is checked later, if necessary. -
+ Version 1.4 extends the host storage to multiple storages. Operations + are performed on host storages in the configuration order with a special + case for addition: read-only storages must be configured after a + required read-write storage, or host reservation addition will + always fail. + +
DHCPv6 Hosts Database Configuration Hosts database configuration is controlled through the Dhcp6/hosts-database @@ -565,6 +571,16 @@ If a timeout is given though, it should be an integer greater than zero. If there is no password to the account, set the password to the empty string "". (This is also the default.) + + The multiple storage extension uses a similar syntax: a configuration + is placed into a "hosts-databases" list instead of into a "hosts-database" + entry as in: + +"Dhcp6": { "hosts-databases": [ { "type": "mysql", ... }, ... ], ... } + + + +
diff --git a/doc/guide/hooks.xml b/doc/guide/hooks.xml index 50115e3106..0115a00e24 100644 --- a/doc/guide/hooks.xml +++ b/doc/guide/hooks.xml @@ -1025,9 +1025,9 @@ Administrator deleted a lease for a device identified by: duid of 1a:1b:1c:1d:1e criteria). To use commands that change the reservation information (currently these are reservation-add and reservation-del, but this rule applies to other commands that may be implemented in the future), - hosts database must be specified (see hosts-database description in - and ) and it must not operate in - read-only mode. If the hosts-database is not specified or is running + hosts database must be specified (see hosts-databases description in + and ) and it must not operate in + read-only mode. If the hosts-databases are not specified or are running in read-only mode, the host_cmds library will load, but any attempts to use reservation-add or reservation-del will fail. @@ -1146,8 +1146,8 @@ Here is an example of complex IPv6 reservation: As reservation-add is expected to store the host, - hosts-database parameter must be specified in your configuration and - the database must not run in read-only mode. In the future versions + hosts-databases parameter must be specified in your configuration and + databases must not run in read-only mode. In the future versions it will be possible to modify the reservations read from a configuration file. Please contact ISC if you are interested in this functionality. diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index ea009f5a58..5d39d1cb2c 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -412,27 +412,25 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set, // Please move at the end when migration will be finished. if (config_pair.first == "lease-database") { - DbAccessParser parser(DbAccessParser::LEASE_DB); + DbAccessParser parser(CfgDbAccess::LEASE_DB); CfgDbAccessPtr cfg_db_access = srv_cfg->getCfgDbAccess(); parser.parse(cfg_db_access, config_pair.second); continue; } if (config_pair.first == "hosts-database") { - DbAccessParser parser(DbAccessParser::HOSTS_DB); + DbAccessParser parser(CfgDbAccess::HOSTS_DB); CfgDbAccessPtr cfg_db_access = srv_cfg->getCfgDbAccess(); parser.parse(cfg_db_access, config_pair.second); continue; } - // For now only support empty or singleton, ignoring extra entries. if (config_pair.first == "hosts-databases") { - if (config_pair.second->size() == 0) { - continue; - } - DbAccessParser parser(DbAccessParser::HOSTS_DB); CfgDbAccessPtr cfg_db_access = srv_cfg->getCfgDbAccess(); - parser.parse(cfg_db_access, config_pair.second->get(0)); + for (size_t i = 0; i < config_pair.second->size(); ++i) { + DbAccessParser parser(CfgDbAccess::HOSTS_DB + i); + parser.parse(cfg_db_access, config_pair.second->get(i)); + } continue; } diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index da4b250be7..ae70f42cac 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -131,6 +131,28 @@ const char* PARSER_CONFIGS[] = { " } ]" "}", + // Configuration 4: two host databases + "{" + " \"interfaces-config\": {" + " \"interfaces\": [\"*\" ]" + " }," + " \"valid-lifetime\": 4000," + " \"rebind-timer\": 2000," + " \"renew-timer\": 1000," + " \"hosts-databases\": [ {" + " \"type\": \"mysql\"," + " \"name\": \"keatest1\"," + " \"user\": \"keatest\"," + " \"password\": \"keatest\"" + " },{" + " \"type\": \"mysql\"," + " \"name\": \"keatest2\"," + " \"user\": \"keatest\"," + " \"password\": \"keatest\"" + " }" + " ]" + "}", + // Last Configuration for comments "{" " \"comment\": \"A DHCPv4 server\"," @@ -5757,10 +5779,28 @@ TEST_F(Dhcp4ParserTest, sharedNetworksDeriveClientClass) { EXPECT_TRUE(classes.empty()); } +// This test checks multiple host data sources. +TEST_F(Dhcp4ParserTest, hostsDatabases) { + + string config = PARSER_CONFIGS[4]; + extractConfig(config); + configure(config, CONTROL_RESULT_SUCCESS, ""); + + // Check database config + ConstCfgDbAccessPtr cfgdb = + CfgMgr::instance().getStagingCfg()->getCfgDbAccess(); + ASSERT_TRUE(cfgdb); + const std::vector& hal = cfgdb->getHostDbAccessStringList(); + ASSERT_EQ(2, hal.size()); + // Keywords are in alphabetical order + EXPECT_EQ("name=keatest1 password=keatest type=mysql user=keatest", hal[0]); + EXPECT_EQ("name=keatest2 password=keatest type=mysql user=keatest", hal[1]); +} + // This test checks comments. Please keep it last. TEST_F(Dhcp4ParserTest, comments) { - string config = PARSER_CONFIGS[4]; + string config = PARSER_CONFIGS[5]; extractConfig(config); configure(config, CONTROL_RESULT_SUCCESS, ""); diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index be47e2599d..f82269eb80 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -1719,6 +1719,30 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 60 "{\n" +" \"hosts-databases\": [\n" +" {\n" +" \"name\": \"keatest1\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" },\n" +" {\n" +" \"name\": \"keatest2\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" }\n" +" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 61 +"{\n" " \"comment\": \"A DHCPv4 server\",\n" " \"client-classes\": [\n" " {\n" @@ -6683,6 +6707,63 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 60 "{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"echo-client-id\": true,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n" +" \"hosts-databases\": [\n" +" {\n" +" \"name\": \"keatest1\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" },\n" +" {\n" +" \"name\": \"keatest2\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" }\n" +" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"shared-networks\": [ ],\n" +" \"subnet4\": [ ]\n" +" }\n", + // CONFIGURATION 61 +"{\n" " \"comment\": \"A DHCPv4 server\",\n" " \"client-classes\": [\n" " {\n" diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc.skel b/src/bin/dhcp4/tests/get_config_unittest.cc.skel index b295974557..0f764b31fc 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc.skel +++ b/src/bin/dhcp4/tests/get_config_unittest.cc.skel @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -124,7 +124,7 @@ outputFormatted(const std::string& config) { } } -}; +} // namespace namespace isc { namespace dhcp { @@ -155,9 +155,9 @@ extractConfig(const std::string& config) { ++extract_count; } -}; -}; -}; +} // namespace test +} // namespace dhcp +} // namespace isc namespace { diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index a999ebe407..f7d31980c2 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -525,14 +525,14 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set, // Please move at the end when migration will be finished. if (config_pair.first == "lease-database") { - DbAccessParser parser(DbAccessParser::LEASE_DB); + DbAccessParser parser(CfgDbAccess::LEASE_DB); CfgDbAccessPtr cfg_db_access = srv_config->getCfgDbAccess(); parser.parse(cfg_db_access, config_pair.second); continue; } if (config_pair.first == "hosts-database") { - DbAccessParser parser(DbAccessParser::HOSTS_DB); + DbAccessParser parser(CfgDbAccess::HOSTS_DB); CfgDbAccessPtr cfg_db_access = srv_config->getCfgDbAccess(); parser.parse(cfg_db_access, config_pair.second); continue; @@ -540,12 +540,11 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set, // For now only support empty or singleton, ignoring extra entries. if (config_pair.first == "hosts-databases") { - if (config_pair.second->size() == 0) { - continue; - } - DbAccessParser parser(DbAccessParser::HOSTS_DB); CfgDbAccessPtr cfg_db_access = srv_config->getCfgDbAccess(); - parser.parse(cfg_db_access, config_pair.second->get(0)); + for (size_t i = 0; i < config_pair.second->size(); ++i) { + DbAccessParser parser(CfgDbAccess::HOSTS_DB + i); + parser.parse(cfg_db_access, config_pair.second->get(i)); + } continue; } diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index ead3a0d958..8910f69a7b 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -208,6 +208,29 @@ const char* PARSER_CONFIGS[] = { " } ]" "}", + // Configuration 7: two host databases + "{" + " \"interfaces-config\": {" + " \"interfaces\": [\"*\" ]" + " }," + " \"valid-lifetime\": 4000," + " \"preferred-lifetime\": 3000," + " \"rebind-timer\": 2000," + " \"renew-timer\": 1000," + " \"hosts-databases\": [ {" + " \"type\": \"mysql\"," + " \"name\": \"keatest1\"," + " \"user\": \"keatest\"," + " \"password\": \"keatest\"" + " },{" + " \"type\": \"mysql\"," + " \"name\": \"keatest2\"," + " \"user\": \"keatest\"," + " \"password\": \"keatest\"" + " }" + " ]" + "}", + // Last configuration for comments "{" " \"comment\": \"A DHCPv6 server\"," @@ -6314,10 +6337,28 @@ TEST_F(Dhcp6ParserTest, sharedNetworksRapidCommitMix) { "shared-network or the shared-network itself used rapid-commit true"); } +// This test checks multiple host data sources. +TEST_F(Dhcp6ParserTest, hostsDatabases) { + + string config = PARSER_CONFIGS[7]; + extractConfig(config); + configure(config, CONTROL_RESULT_SUCCESS, ""); + + // Check database config + ConstCfgDbAccessPtr cfgdb = + CfgMgr::instance().getStagingCfg()->getCfgDbAccess(); + ASSERT_TRUE(cfgdb); + const std::vector& hal = cfgdb->getHostDbAccessStringList(); + ASSERT_EQ(2, hal.size()); + // Keywords are in alphabetical order + EXPECT_EQ("name=keatest1 password=keatest type=mysql user=keatest", hal[0]); + EXPECT_EQ("name=keatest2 password=keatest type=mysql user=keatest", hal[1]); +} + // This test checks comments. Please keep it last. TEST_F(Dhcp6ParserTest, comments) { - string config = PARSER_CONFIGS[7]; + string config = PARSER_CONFIGS[8]; extractConfig(config); configure(config, CONTROL_RESULT_SUCCESS, ""); diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc b/src/bin/dhcp6/tests/get_config_unittest.cc index 36a54a330b..77e5ad4604 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc +++ b/src/bin/dhcp6/tests/get_config_unittest.cc @@ -1584,6 +1584,31 @@ const char* EXTRACTED_CONFIGS[] = { " }\n", // CONFIGURATION 53 "{\n" +" \"hosts-databases\": [\n" +" {\n" +" \"name\": \"keatest1\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" },\n" +" {\n" +" \"name\": \"keatest2\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" }\n" +" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"preferred-lifetime\": 3000,\n" +" \"rebind-timer\": 2000,\n" +" \"renew-timer\": 1000,\n" +" \"valid-lifetime\": 4000\n" +" }\n", + // CONFIGURATION 54 +"{\n" " \"comment\": \"A DHCPv6 server\",\n" " \"client-classes\": [\n" " {\n" @@ -6240,6 +6265,72 @@ const char* UNPARSED_CONFIGS[] = { " }\n", // CONFIGURATION 53 "{\n" +" \"decline-probation-period\": 86400,\n" +" \"dhcp-ddns\": {\n" +" \"always-include-fqdn\": false,\n" +" \"enable-updates\": false,\n" +" \"generated-prefix\": \"myhost\",\n" +" \"max-queue-size\": 1024,\n" +" \"ncr-format\": \"JSON\",\n" +" \"ncr-protocol\": \"UDP\",\n" +" \"override-client-update\": false,\n" +" \"override-no-update\": false,\n" +" \"qualifying-suffix\": \"\",\n" +" \"replace-client-name\": \"never\",\n" +" \"sender-ip\": \"0.0.0.0\",\n" +" \"sender-port\": 0,\n" +" \"server-ip\": \"127.0.0.1\",\n" +" \"server-port\": 53001\n" +" },\n" +" \"dhcp4o6-port\": 0,\n" +" \"expired-leases-processing\": {\n" +" \"flush-reclaimed-timer-wait-time\": 25,\n" +" \"hold-reclaimed-time\": 3600,\n" +" \"max-reclaim-leases\": 100,\n" +" \"max-reclaim-time\": 250,\n" +" \"reclaim-timer-wait-time\": 10,\n" +" \"unwarned-reclaim-cycles\": 5\n" +" },\n" +" \"hooks-libraries\": [ ],\n" +" \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n" +" \"hosts-databases\": [\n" +" {\n" +" \"name\": \"keatest1\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" },\n" +" {\n" +" \"name\": \"keatest2\",\n" +" \"password\": \"keatest\",\n" +" \"type\": \"mysql\",\n" +" \"user\": \"keatest\"\n" +" }\n" +" ],\n" +" \"interfaces-config\": {\n" +" \"interfaces\": [ \"*\" ],\n" +" \"re-detect\": false\n" +" },\n" +" \"lease-database\": {\n" +" \"type\": \"memfile\"\n" +" },\n" +" \"mac-sources\": [ \"any\" ],\n" +" \"option-data\": [ ],\n" +" \"option-def\": [ ],\n" +" \"relay-supplied-options\": [ \"65\" ],\n" +" \"server-id\": {\n" +" \"enterprise-id\": 0,\n" +" \"htype\": 0,\n" +" \"identifier\": \"\",\n" +" \"persist\": true,\n" +" \"time\": 0,\n" +" \"type\": \"LLT\"\n" +" },\n" +" \"shared-networks\": [ ],\n" +" \"subnet6\": [ ]\n" +" }\n", + // CONFIGURATION 54 +"{\n" " \"comment\": \"A DHCPv6 server\",\n" " \"client-classes\": [\n" " {\n" @@ -6459,7 +6550,7 @@ outputFormatted(const std::string& config) { } } -} +} // namespace namespace isc { namespace dhcp { diff --git a/src/bin/dhcp6/tests/get_config_unittest.cc.skel b/src/bin/dhcp6/tests/get_config_unittest.cc.skel index bd08eae7ce..3ac9a3216a 100644 --- a/src/bin/dhcp6/tests/get_config_unittest.cc.skel +++ b/src/bin/dhcp6/tests/get_config_unittest.cc.skel @@ -125,7 +125,7 @@ outputFormatted(const std::string& config) { } } -}; +} // namespace namespace isc { namespace dhcp { @@ -156,9 +156,9 @@ extractConfig(const std::string& config) { ++extract_count; } -}; -}; -}; +} // namespace test +} // namespace dhcp +} // namespace isc namespace { diff --git a/src/lib/dhcpsrv/cfg_db_access.cc b/src/lib/dhcpsrv/cfg_db_access.cc index 44c4b67040..ad6c396587 100644 --- a/src/lib/dhcpsrv/cfg_db_access.cc +++ b/src/lib/dhcpsrv/cfg_db_access.cc @@ -21,21 +21,31 @@ namespace isc { namespace dhcp { CfgDbAccess::CfgDbAccess() - : appended_parameters_(), lease_db_access_("type=memfile"), - host_db_access_() { + : appended_parameters_(), db_access_(2) { + db_access_[LEASE_DB] = "type=memfile"; } std::string CfgDbAccess::getLeaseDbAccessString() const { - return (getAccessString(lease_db_access_)); + return (getAccessString(db_access_[LEASE_DB])); } std::string CfgDbAccess::getHostDbAccessString() const { - return (getAccessString(host_db_access_)); + return (getAccessString(db_access_[HOSTS_DB])); } +std::vector +CfgDbAccess::getHostDbAccessStringList() const { + std::vector ret; + for (size_t idx = HOSTS_DB; idx < db_access_.size(); ++idx) { + if (!db_access_[idx].empty()) { + ret.push_back(getAccessString(db_access_[idx])); + } + } + return (ret); +} void CfgDbAccess::createManagers() const { @@ -45,8 +55,10 @@ CfgDbAccess::createManagers() const { // Recreate host data source. HostMgr::create(); - if (!host_db_access_.empty()) { - HostMgr::addSource(getHostDbAccessString()); + auto host_db_access_list = getHostDbAccessStringList(); + for (auto it = host_db_access_list.begin(); + it != host_db_access_list.end(); ++it) { + HostMgr::addSource(*it); } } diff --git a/src/lib/dhcpsrv/cfg_db_access.h b/src/lib/dhcpsrv/cfg_db_access.h index 2c87e4dafc..2f8f95ea46 100644 --- a/src/lib/dhcpsrv/cfg_db_access.h +++ b/src/lib/dhcpsrv/cfg_db_access.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -10,6 +10,7 @@ #include #include #include +#include namespace isc { namespace dhcp { @@ -21,6 +22,9 @@ namespace dhcp { /// passed to the @ref isc::dhcp::LeaseMgrFactory::create function. class CfgDbAccess { public: + /// @brief Specifies the database types + static const size_t LEASE_DB = 0; + static const size_t HOSTS_DB = 1; /// @brief Constructor. CfgDbAccess(); @@ -44,7 +48,7 @@ public: /// /// @param lease_db_access New lease database access string. void setLeaseDbAccessString(const std::string& lease_db_access) { - lease_db_access_ = lease_db_access; + db_access_[LEASE_DB] = lease_db_access; } /// @brief Retrieves host database access string. @@ -57,10 +61,23 @@ public: /// /// @param host_db_access New host database access string. void setHostDbAccessString(const std::string& host_db_access) { - host_db_access_ = host_db_access; + db_access_[HOSTS_DB] = host_db_access; } - /// @brief Creates instance of lease manager and host data source + /// @brief Retrieves host database access string. + /// + /// @return Database access strings with additional parameters + /// specified with @ref CfgDbAccess::setAppendedParameters + std::vector getHostDbAccessStringList() const; + + /// @brief Pushes host database access string. + /// + /// @param db_access New host database access string. + void pushHostDbAccessString(const std::string& db_access) { + db_access_.push_back(db_access); + } + + /// @brief Creates instance of lease manager and host data sources /// according to the configuration specified. void createManagers() const; @@ -82,11 +99,8 @@ protected: /// strings. std::string appended_parameters_; - /// @brief Holds lease database access string. - std::string lease_db_access_; - - /// @brief Holds host database access string. - std::string host_db_access_; + /// @brief Holds database access strings. + std::vector db_access_; }; @@ -107,7 +121,7 @@ struct CfgLeaseDbAccess : public CfgDbAccess, public isc::data::CfgToElement { /// /// @result a pointer to a configuration virtual isc::data::ElementPtr toElement() const { - return (CfgDbAccess::toElementDbAccessString(lease_db_access_)); + return (CfgDbAccess::toElementDbAccessString(db_access_[LEASE_DB])); } }; @@ -121,7 +135,15 @@ struct CfgHostDbAccess : public CfgDbAccess, public isc::data::CfgToElement { /// /// @result a pointer to a configuration virtual isc::data::ElementPtr toElement() const { - return (CfgDbAccess::toElementDbAccessString(host_db_access_)); + isc::data::ElementPtr result = isc::data::Element::createList(); + for (size_t idx = HOSTS_DB; idx < db_access_.size(); ++idx) { + isc::data::ElementPtr entry = + CfgDbAccess::toElementDbAccessString(db_access_[idx]); + if (entry->size() > 0) { + result->add(entry); + } + } + return (result); } }; diff --git a/src/lib/dhcpsrv/parsers/dbaccess_parser.cc b/src/lib/dhcpsrv/parsers/dbaccess_parser.cc index 5fb6434c0e..cd7b4e4179 100644 --- a/src/lib/dhcpsrv/parsers/dbaccess_parser.cc +++ b/src/lib/dhcpsrv/parsers/dbaccess_parser.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -30,7 +30,7 @@ namespace dhcp { // Factory function to build the parser -DbAccessParser::DbAccessParser(DBType db_type) +DbAccessParser::DbAccessParser(size_t db_type) : values_(), type_(db_type) { } @@ -110,7 +110,8 @@ DbAccessParser::parse(CfgDbAccessPtr& cfg_db, // a. Check if the "type" keyword exists and thrown an exception if not. StringPairMap::const_iterator type_ptr = values_copy.find("type"); if (type_ptr == values_copy.end()) { - isc_throw(DhcpConfigError, (type_ == LEASE_DB ? "lease" : "host") + isc_throw(DhcpConfigError, + (type_ == CfgDbAccess::LEASE_DB ? "lease" : "host") << " database access parameters must " "include the keyword 'type' to determine type of database " "to be accessed (" << database_config->getPosition() << ")"); @@ -167,10 +168,12 @@ DbAccessParser::parse(CfgDbAccessPtr& cfg_db, values_.swap(values_copy); // 5. Save the database access string in the Configuration Manager. - if (type_ == LEASE_DB) { + if (type_ == CfgDbAccess::LEASE_DB) { cfg_db->setLeaseDbAccessString(getDbAccessString()); - } else if (type_ == HOSTS_DB) { + } else if (type_ == CfgDbAccess::HOSTS_DB) { cfg_db->setHostDbAccessString(getDbAccessString()); + } else if (type_ > CfgDbAccess::HOSTS_DB) { + cfg_db->pushHostDbAccessString(getDbAccessString()); } } diff --git a/src/lib/dhcpsrv/parsers/dbaccess_parser.h b/src/lib/dhcpsrv/parsers/dbaccess_parser.h index 4e662d43f1..94943ce154 100644 --- a/src/lib/dhcpsrv/parsers/dbaccess_parser.h +++ b/src/lib/dhcpsrv/parsers/dbaccess_parser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -28,12 +28,6 @@ namespace dhcp { class DbAccessParser: public isc::data::SimpleParser { public: - /// @brief Specifies the database type - typedef enum { - LEASE_DB = 1, - HOSTS_DB = 2 - } DBType; - /// @brief Keyword and associated value typedef std::pair StringPair; @@ -43,7 +37,7 @@ public: /// @brief Constructor /// /// @param db_type Specifies database type (lease or hosts) - explicit DbAccessParser(DBType db_type); + explicit DbAccessParser(size_t db_type); /// The destructor. virtual ~DbAccessParser() @@ -98,7 +92,7 @@ private: std::map values_; ///< Stored parameter values - DBType type_; ///< Database type (leases or hosts) + size_t type_; ///< Database type (leases or hosts) }; }; // namespace dhcp diff --git a/src/lib/dhcpsrv/srv_config.cc b/src/lib/dhcpsrv/srv_config.cc index fef466d19f..473310c53f 100644 --- a/src/lib/dhcpsrv/srv_config.cc +++ b/src/lib/dhcpsrv/srv_config.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -342,12 +342,11 @@ SrvConfig::toElement() const { // Set lease-database CfgLeaseDbAccess lease_db(*cfg_db_access_); dhcp->set("lease-database", lease_db.toElement()); - // Set hosts-database + // Set hosts-databases CfgHostDbAccess host_db(*cfg_db_access_); - // @todo accept empty map - ConstElementPtr hosts_database = host_db.toElement(); - if (hosts_database->size() > 0) { - dhcp->set("hosts-database", hosts_database); + ConstElementPtr hosts_databases = host_db.toElement(); + if (hosts_databases->size() > 0) { + dhcp->set("hosts-databases", hosts_databases); } // Set host-reservation-identifiers ConstElementPtr host_ids; diff --git a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc index cc8361ae50..1e931ea073 100644 --- a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -30,7 +30,7 @@ TEST(CfgDbAccessTest, defaults) { runToElementTest(expected, CfgLeaseDbAccess(cfg)); EXPECT_TRUE(cfg.getHostDbAccessString().empty()); - runToElementTest("{ }", CfgHostDbAccess(cfg)); + runToElementTest("[ ]", CfgHostDbAccess(cfg)); } // This test verifies that it is possible to set the lease database @@ -65,7 +65,7 @@ TEST(CfgDbAccessTest, setHostDbAccessString) { EXPECT_EQ("type=mysql", cfg.getHostDbAccessString()); // Check unparse - std::string expected = "{ \"type\": \"mysql\" }"; + std::string expected = "[ { \"type\": \"mysql\" } ]"; runToElementTest(expected, CfgHostDbAccess(cfg)); // Append additional parameter. @@ -80,6 +80,39 @@ TEST(CfgDbAccessTest, setHostDbAccessString) { EXPECT_TRUE(cfg.getHostDbAccessString().empty()); } +// This test verifies that it is possible to set multiple host +// database string. +TEST(CfgDbAccessTest, pushHostDbAccessString) { + CfgDbAccess cfg; + ASSERT_NO_THROW(cfg.setHostDbAccessString("type=mysql")); + EXPECT_EQ("type=mysql", cfg.getHostDbAccessString()); + + // Push two other strings + ASSERT_NO_THROW(cfg.pushHostDbAccessString("type=foo")); + ASSERT_NO_THROW(cfg.pushHostDbAccessString("type=bar")); + + // Check unparse + std::string expected = "[ { \"type\": \"mysql\" }, "; + expected += "{ \"type\": \"foo\" }, { \"type\": \"bar\" } ]"; + runToElementTest(expected, CfgHostDbAccess(cfg)); + + // Check access strings + std::vector hal = cfg.getHostDbAccessStringList(); + ASSERT_EQ(3, hal.size()); + EXPECT_EQ("type=mysql", hal[0]); + EXPECT_EQ("type=foo", hal[1]); + EXPECT_EQ("type=bar", hal[2]); + + // Reset the first string so it will be ignored. + ASSERT_NO_THROW(cfg.setHostDbAccessString("")); + expected = "[ { \"type\": \"foo\" }, { \"type\": \"bar\" } ]"; + runToElementTest(expected, CfgHostDbAccess(cfg)); + hal = cfg.getHostDbAccessStringList(); + ASSERT_EQ(2, hal.size()); + EXPECT_EQ("type=foo", hal[0]); + EXPECT_EQ("type=bar", hal[1]); +} + // Tests that lease manager can be created from a specified configuration. TEST(CfgDbAccessTest, createLeaseMgr) { CfgDbAccess cfg; diff --git a/src/lib/dhcpsrv/tests/dbaccess_parser_unittest.cc b/src/lib/dhcpsrv/tests/dbaccess_parser_unittest.cc index 0fe421c902..052b881101 100644 --- a/src/lib/dhcpsrv/tests/dbaccess_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/dbaccess_parser_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -195,7 +195,7 @@ public: /// @brief Constructor /// /// @brief Keyword/value collection of database access parameters - TestDbAccessParser(DbAccessParser::DBType type) + TestDbAccessParser(size_t type) : DbAccessParser(type) {} @@ -243,7 +243,7 @@ TEST_F(DbAccessParserTest, validTypeMemfile) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid memfile", parser.getDbAccessParameters(), config); } @@ -257,7 +257,7 @@ TEST_F(DbAccessParserTest, hosts) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::HOSTS_DB); + TestDbAccessParser parser(CfgDbAccess::HOSTS_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid memfile", parser.getDbAccessParameters(), config); } @@ -273,7 +273,7 @@ TEST_F(DbAccessParserTest, emptyKeyword) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid memfile", parser.getDbAccessParameters(), config); } @@ -290,7 +290,7 @@ TEST_F(DbAccessParserTest, persistV4Memfile) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid memfile", parser.getDbAccessParameters(), @@ -309,7 +309,7 @@ TEST_F(DbAccessParserTest, persistV6Memfile) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid memfile", parser.getDbAccessParameters(), @@ -328,7 +328,7 @@ TEST_F(DbAccessParserTest, validLFCInterval) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid LFC Interval", parser.getDbAccessParameters(), config); @@ -346,7 +346,7 @@ TEST_F(DbAccessParserTest, negativeLFCInterval) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -362,7 +362,7 @@ TEST_F(DbAccessParserTest, largeLFCInterval) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -378,7 +378,7 @@ TEST_F(DbAccessParserTest, validTimeout) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid timeout", parser.getDbAccessParameters(), config); @@ -396,7 +396,7 @@ TEST_F(DbAccessParserTest, negativeTimeout) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -412,7 +412,7 @@ TEST_F(DbAccessParserTest, largeTimeout) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -428,7 +428,7 @@ TEST_F(DbAccessParserTest, validPort) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid port", parser.getDbAccessParameters(), config); @@ -446,7 +446,7 @@ TEST_F(DbAccessParserTest, negativePort) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -462,7 +462,7 @@ TEST_F(DbAccessParserTest, largePort) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -480,7 +480,7 @@ TEST_F(DbAccessParserTest, validTypeMysql) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid mysql", parser.getDbAccessParameters(), config); } @@ -498,7 +498,7 @@ TEST_F(DbAccessParserTest, missingTypeKeyword) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } @@ -549,7 +549,7 @@ TEST_F(DbAccessParserTest, incrementalChanges) { "name", "keatest", NULL}; - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); // First configuration string should cause a representation of that string // to be held. @@ -613,7 +613,7 @@ TEST_F(DbAccessParserTest, getDbAccessString) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); // Get the database access string @@ -639,7 +639,7 @@ TEST_F(DbAccessParserTest, validReadOnly) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_NO_THROW(parser.parse(json_elements)); checkAccessString("Valid readonly parameter", @@ -661,9 +661,35 @@ TEST_F(DbAccessParserTest, invalidReadOnly) { ConstElementPtr json_elements = Element::fromJSON(json_config); EXPECT_TRUE(json_elements); - TestDbAccessParser parser(DbAccessParser::LEASE_DB); + TestDbAccessParser parser(CfgDbAccess::LEASE_DB); EXPECT_THROW(parser.parse(json_elements), DhcpConfigError); } +// Check that multiple host storages are correctly parsed. +TEST_F(DbAccessParserTest, multipleHost) { + const char* config1[] = {"type", "mysql", + "name", "keatest1", + NULL}; + const char* config2[] = {"type", "mysql", + "name", "keatest2", + NULL}; + + string json_config1 = toJson(config1); + string json_config2 = toJson(config2); + ConstElementPtr json_elements1 = Element::fromJSON(json_config1); + ConstElementPtr json_elements2 = Element::fromJSON(json_config2); + + TestDbAccessParser parser1(2); + TestDbAccessParser parser2(3); + EXPECT_NO_THROW(parser1.parse(json_elements1)); + EXPECT_NO_THROW(parser2.parse(json_elements2)); + + checkAccessString("First config", + parser1.getDbAccessParameters(), + config1); + checkAccessString("Second config", + parser2.getDbAccessParameters(), + config2); +} }; // Anonymous namespace From 34a73321649335e3f893733f002a4c17c29f2ed6 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 15 Feb 2018 14:00:55 +0100 Subject: [PATCH 07/18] [5532] Checkpoint: added start/stop --- .gitmodules | 3 +++ premium | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 premium diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..e4730c1e82 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "premium"] + path = premium + url = ssh://fdupont@repo.isc.org/proj/git/prod/kea-premium.git diff --git a/premium b/premium new file mode 160000 index 0000000000..78aaaded3b --- /dev/null +++ b/premium @@ -0,0 +1 @@ +Subproject commit 78aaaded3b633f0060339e8427efadf368dfbbda From 9b0bbc56c6a8bde9612b9f6c22845ec5fcfe6486 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 16 Feb 2018 00:26:21 +0100 Subject: [PATCH 08/18] [5532] Reported trac5531 changes --- premium | 2 +- .../host_data_source_factory_unittest.cc | 208 ++++++------------ src/lib/dhcpsrv/testutils/Makefile.am | 1 + 3 files changed, 71 insertions(+), 140 deletions(-) diff --git a/premium b/premium index 78aaaded3b..d970735ad4 160000 --- a/premium +++ b/premium @@ -1 +1 @@ -Subproject commit 78aaaded3b633f0060339e8427efadf368dfbbda +Subproject commit d970735ad4f02de4cb736dc47669061048610412 diff --git a/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc b/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc index 0ff2a34e2e..6d401b6d48 100644 --- a/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_data_source_factory_unittest.cc @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -17,122 +18,51 @@ using namespace std; using namespace isc; using namespace isc::dhcp; +using namespace isc::dhcp::test; namespace { -// @brief Names of test backends -enum Names { FOOBAR, FOO, BAR }; - -// @brief Convert a name to a string -string toString(Names name) { - switch (name) { - case FOOBAR: - return ("foobar"); - case FOO: - return ("foo"); - default: - return ("bar"); - } +// @brief Register memFactory +bool registerFactory() { + return (HostDataSourceFactory::registerFactory("mem", memFactory)); } -// A host data source -template -class FakeHostDataSource : public BaseHostDataSource { +// @brief Derive mem1 class +class Mem1HostDataSource : public MemHostDataSource { public: - // @brief Constructor - FakeHostDataSource(const DatabaseConnection::ParameterMap&) { } - - virtual ~FakeHostDataSource() { } - - // The base class is abstract so we need to define methods - - virtual ConstHostCollection - getAll(const HWAddrPtr&, const DuidPtr&) const { - return (ConstHostCollection()); - } - - virtual ConstHostCollection - getAll(const Host::IdentifierType&, const uint8_t*, const size_t) const { - return (ConstHostCollection()); - } - - virtual ConstHostCollection - getAll4(const asiolink::IOAddress&) const { - return (ConstHostCollection()); - } - - virtual ConstHostPtr - get4(const SubnetID&, const HWAddrPtr&, const DuidPtr&) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get4(const SubnetID&, const Host::IdentifierType&, - const uint8_t*, const size_t) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get4(const SubnetID&, const asiolink::IOAddress&) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get6(const SubnetID&, const DuidPtr&, const HWAddrPtr&) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get6(const SubnetID&, const Host::IdentifierType&, - const uint8_t*, const size_t) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get6(const asiolink::IOAddress&, const uint8_t) const { - return (ConstHostPtr()); - } - - virtual ConstHostPtr - get6(const SubnetID&, const asiolink::IOAddress&) const { - return (ConstHostPtr()); - } - - virtual bool add(const HostPtr&) { - return (false); - } - - virtual bool del(const SubnetID&, const asiolink::IOAddress&) { - return (false); - } - - virtual bool del4(const SubnetID&, const Host::IdentifierType&, - const uint8_t*, const size_t) { - return (false); - } - - virtual bool del6(const SubnetID&, const Host::IdentifierType&, - const uint8_t*, const size_t) { - return (false); - } - virtual string getType() const { - return (toString(NAME)); + return ("mem1"); } }; -// @brief Factory function template -template +// @brief Factory of mem1 BaseHostDataSource* -factory(const DatabaseConnection::ParameterMap& parameters) { - return (new FakeHostDataSource(parameters)); +mem1Factory(const DatabaseConnection::ParameterMap&) { + return (new Mem1HostDataSource()); } -// @brief Register factory template -template -bool registerFactory() { - return (HostDataSourceFactory::registerFactory(toString(NAME), - factory)); +// @brief Register mem1Factory +bool registerFactory1() { + return (HostDataSourceFactory::registerFactory("mem1", mem1Factory)); +} + +// @brief Derive mem2 class +class Mem2HostDataSource : public MemHostDataSource { +public: + virtual string getType() const { + return ("mem2"); + } +}; + +// @brief Factory of mem2 +BaseHostDataSource* +mem2Factory(const DatabaseConnection::ParameterMap&) { + return (new Mem2HostDataSource()); +} + +// @brief Register mem2Factory +bool registerFactory2() { + return (HostDataSourceFactory::registerFactory("mem2", mem2Factory)); } // @brief Factory function returning 0 @@ -150,9 +80,9 @@ private: // @brief Cleans up after the test. virtual void TearDown() { sources_.clear(); - HostDataSourceFactory::deregisterFactory("foobar"); - HostDataSourceFactory::deregisterFactory("foo"); - HostDataSourceFactory::deregisterFactory("bar"); + HostDataSourceFactory::deregisterFactory("mem"); + HostDataSourceFactory::deregisterFactory("mem1"); + HostDataSourceFactory::deregisterFactory("mem2"); } public: HostDataSourceList sources_; @@ -160,89 +90,89 @@ public: // Verify a factory can be registered and only once. TEST_F(HostDataSourceFactoryTest, registerFactory) { - EXPECT_TRUE(registerFactory()); + EXPECT_TRUE(registerFactory()); // Only once - EXPECT_FALSE(registerFactory()); + EXPECT_FALSE(registerFactory()); } // Verify a factory can be registered and deregistered TEST_F(HostDataSourceFactoryTest, deregisterFactory) { // Does not exist at the beginning - EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("foobar")); + EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("mem")); // Register and deregister - EXPECT_TRUE(registerFactory()); - EXPECT_TRUE(HostDataSourceFactory::deregisterFactory("foobar")); + EXPECT_TRUE(registerFactory()); + EXPECT_TRUE(HostDataSourceFactory::deregisterFactory("mem")); // No longer exists - EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("foobar")); + EXPECT_FALSE(HostDataSourceFactory::deregisterFactory("mem")); } // Verify a registered factory can be called TEST_F(HostDataSourceFactoryTest, add) { - EXPECT_TRUE(registerFactory()); - EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foobar")); + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=mem")); ASSERT_EQ(1, sources_.size()); - EXPECT_EQ("foobar", sources_[0]->getType()); + EXPECT_EQ("mem", sources_[0]->getType()); } // Verify that type is required TEST_F(HostDataSourceFactoryTest, notype) { - EXPECT_THROW(HostDataSourceFactory::add(sources_, "tp=foobar"), + EXPECT_THROW(HostDataSourceFactory::add(sources_, "tp=mem"), InvalidParameter); - EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=foobar"), + EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=mem"), InvalidType); } // Verify that factory must not return NULL TEST_F(HostDataSourceFactoryTest, null) { - EXPECT_TRUE(HostDataSourceFactory::registerFactory("foobar", factory0)); - EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=foobar"), + EXPECT_TRUE(HostDataSourceFactory::registerFactory("mem", factory0)); + EXPECT_THROW(HostDataSourceFactory::add(sources_, "type=mem"), Unexpected); } // Verify del class method TEST_F(HostDataSourceFactoryTest, del) { // No sources at the beginning - EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foobar")); + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "mem")); - // Add foobar - EXPECT_TRUE(registerFactory()); - EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foobar")); + // Add mem + EXPECT_TRUE(registerFactory()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=mem")); ASSERT_EQ(1, sources_.size()); // Delete another EXPECT_FALSE(HostDataSourceFactory::del(sources_, "another")); - // Delete foobar - EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foobar")); + // Delete mem + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "mem")); - // No longer foobar in sources - EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foobar")); + // No longer mem in sources + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "mem")); } // Verify add and del class method on multiple backends TEST_F(HostDataSourceFactoryTest, multiple) { // Add foo twice - EXPECT_TRUE(registerFactory()); - EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foo")); - EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=foo")); + EXPECT_TRUE(registerFactory1()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=mem1")); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=mem1")); - // Add bar once - EXPECT_TRUE(registerFactory()); - EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=bar")); + // Add mem2 once + EXPECT_TRUE(registerFactory2()); + EXPECT_NO_THROW(HostDataSourceFactory::add(sources_, "type=mem2")); // Delete them - EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foo")); - EXPECT_TRUE(HostDataSourceFactory::del(sources_, "bar")); - // Second instance of foo - EXPECT_TRUE(HostDataSourceFactory::del(sources_, "foo")); + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "mem1")); + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "mem2")); + // Second instance of mem1 + EXPECT_TRUE(HostDataSourceFactory::del(sources_, "mem1")); // No more sources EXPECT_EQ(0, sources_.size()); - EXPECT_FALSE(HostDataSourceFactory::del(sources_, "foo")); - EXPECT_FALSE(HostDataSourceFactory::del(sources_, "bar")); + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "mem1")); + EXPECT_FALSE(HostDataSourceFactory::del(sources_, "mem2")); } }; // end of anonymous namespace diff --git a/src/lib/dhcpsrv/testutils/Makefile.am b/src/lib/dhcpsrv/testutils/Makefile.am index de4b15a898..dfdaebd93b 100644 --- a/src/lib/dhcpsrv/testutils/Makefile.am +++ b/src/lib/dhcpsrv/testutils/Makefile.am @@ -14,6 +14,7 @@ noinst_LTLIBRARIES = libdhcpsrvtest.la libdhcpsrvtest_la_SOURCES = config_result_check.cc config_result_check.h libdhcpsrvtest_la_SOURCES += dhcp4o6_test_ipc.cc dhcp4o6_test_ipc.h +libdhcpsrvtest_la_SOURCES += memory_host_data_source.cc memory_host_data_source.h libdhcpsrvtest_la_SOURCES += schema.cc schema.h From bed79e2e73e494a3e722aeb9ce57f80a107a1dd7 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 16 Feb 2018 00:26:56 +0100 Subject: [PATCH 09/18] [5532] Reported trac5531 changes --- .../testutils/memory_host_data_source.cc | 233 +++++++++++++++++ .../testutils/memory_host_data_source.h | 235 ++++++++++++++++++ 2 files changed, 468 insertions(+) create mode 100644 src/lib/dhcpsrv/testutils/memory_host_data_source.cc create mode 100644 src/lib/dhcpsrv/testutils/memory_host_data_source.h diff --git a/src/lib/dhcpsrv/testutils/memory_host_data_source.cc b/src/lib/dhcpsrv/testutils/memory_host_data_source.cc new file mode 100644 index 0000000000..d15717f3fb --- /dev/null +++ b/src/lib/dhcpsrv/testutils/memory_host_data_source.cc @@ -0,0 +1,233 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +#include + +using namespace std; + +namespace isc { +namespace dhcp { +namespace test { + +ConstHostCollection +MemHostDataSource::getAll(const HWAddrPtr& /*hwaddr*/, + const DuidPtr& /*duid*/) const { + return (ConstHostCollection()); +} + +ConstHostCollection +MemHostDataSource::getAll(const Host::IdentifierType& /*identifier_type*/, + const uint8_t* /*identifier_begin*/, + const size_t /*identifier_len*/) const { + return (ConstHostCollection()); +} + +ConstHostCollection +MemHostDataSource::getAll4(const asiolink::IOAddress& /*address*/) const { + return (ConstHostCollection()); +} + +ConstHostPtr +MemHostDataSource::get4(const SubnetID& /*subnet_id*/, + const HWAddrPtr& /*hwaddr*/, + const DuidPtr& /*duid*/) const { + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get4(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { + vector ident(identifier_begin, identifier_begin + identifier_len); + for (auto h = store_.begin(); h != store_.end(); ++h) { + // If either subnet-id or identifier type do not match, + // it's not our host + if (((*h)->getIPv4SubnetID() != subnet_id) || + ((*h)->getIdentifierType() != identifier_type)) { + continue; + } + // If the identifier matches, we found it! + if ((*h)->getIdentifier() == ident) { + return (*h); + } + } + + // Nothing found + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get6(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { + vector ident(identifier_begin, identifier_begin + identifier_len); + for (auto h = store_.begin(); h != store_.end(); ++h) { + // If either subnet-id or identifier type do not match, + // it's not our host + if (((*h)->getIPv6SubnetID() != subnet_id) || + ((*h)->getIdentifierType() != identifier_type)) { + continue; + } + // If the identifier matches, we found it! + if ((*h)->getIdentifier() == ident) { + return (*h); + } + } + + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get4(const SubnetID& subnet_id, + const asiolink::IOAddress& address) const { + for (auto h = store_.begin(); h != store_.end(); ++h) { + if ((*h)->getIPv4SubnetID() == subnet_id && + (*h)->getIPv4Reservation() == address) { + return (*h); + } + } + + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get6(const SubnetID& /*subnet_id*/, + const DuidPtr& /*duid*/, + const HWAddrPtr& /*hwaddr*/) const { + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get6(const asiolink::IOAddress& /*prefix*/, + const uint8_t /*prefix_len*/) const { + return (ConstHostPtr()); +} + +ConstHostPtr +MemHostDataSource::get6(const SubnetID& subnet_id, + const asiolink::IOAddress& address) const { + for (auto h = store_.begin(); h != store_.end(); ++h) { + + // Naive approach: check hosts one by one + + // First check: subnet-id must match. + if ((*h)->getIPv6SubnetID() != subnet_id) { + // wrong subnet-id? ok, skip this one + continue; + } + + // Second check: the v6 reservation must much. This is very simple + // as we ignore the reservation type. + auto resrvs = (*h)->getIPv6Reservations(); + for (auto r = resrvs.first; r != resrvs.second; ++r) { + if ((*r).second.getPrefix() == address) { + return (*h); + } + } + } + + return (ConstHostPtr()); +} + +bool +MemHostDataSource::add(const HostPtr& host) { + store_.push_back(host); + return (true); +} + +bool +MemHostDataSource::del(const SubnetID& subnet_id, + const asiolink::IOAddress& addr) { + for (auto h = store_.begin(); h != store_.end(); ++h) { + if (addr.isV4()) { + if ((*h)->getIPv4SubnetID() == subnet_id && + (*h)->getIPv4Reservation() == addr) { + store_.erase(h); + return (true); + } + } else { + + if ((*h)->getIPv6SubnetID() != subnet_id) { + continue; + } + + // Second check: the v6 reservation must much. This is very simple + // as we ignore the reservation type. + auto resrvs = (*h)->getIPv6Reservations(); + for (auto r = resrvs.first; r != resrvs.second; ++r) { + if ((*r).second.getPrefix() == addr) { + store_.erase(h); + return (true); + } + } + } + } + + return (false); +} + +bool +MemHostDataSource::del4(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) { + vector ident(identifier_begin, identifier_begin + identifier_len); + for (auto h = store_.begin(); h != store_.end(); ++h) { + // If either subnet-id or identifier type do not match, + // it's not our host + if (((*h)->getIPv4SubnetID() != subnet_id) || + ((*h)->getIdentifierType() != identifier_type)) { + continue; + } + // If the identifier matches, we found it! + if ((*h)->getIdentifier() == ident) { + store_.erase(h); + return (true); + } + } + + return (false); +} + +bool +MemHostDataSource::del6(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) { + vector ident(identifier_begin, identifier_begin + identifier_len); + for (auto h = store_.begin(); h != store_.end(); ++h) { + // If either subnet-id or identifier type do not match, + // it's not our host + if (((*h)->getIPv6SubnetID() != subnet_id) || + ((*h)->getIdentifierType() != identifier_type)) { + continue; + } + // If the identifier matches, we found it! + if ((*h)->getIdentifier() == ident) { + store_.erase(h); + return (true); + } + } + return (false); +} + +size_t +MemHostDataSource::size() const { + return (store_.size()); +} + +BaseHostDataSource* +memFactory(const DatabaseConnection::ParameterMap& /*parameters*/) { + return (new MemHostDataSource()); +} + +} // namespace isc::dhcp::test +} // namespace isc::dhcp +} // namespace isc diff --git a/src/lib/dhcpsrv/testutils/memory_host_data_source.h b/src/lib/dhcpsrv/testutils/memory_host_data_source.h new file mode 100644 index 0000000000..648a9b99de --- /dev/null +++ b/src/lib/dhcpsrv/testutils/memory_host_data_source.h @@ -0,0 +1,235 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef MEMORY_HOST_DATA_SOURCE_H +#define MEMORY_HOST_DATA_SOURCE_H + +#include +#include +#include +#include + +namespace isc { +namespace dhcp { +namespace test { + +/// @brief Simple host data source implementation for tests. +/// +/// It used vector as a storage and iterates through all hosts when +/// conducting operations. Most operations are skeleton methods that don't +/// work, just several are implemented. Those are used in the tests. +class MemHostDataSource : public BaseHostDataSource { +public: + + /// @brief Destructor. + virtual ~MemHostDataSource() { } + + /// BaseHostDataSource methods. + + /// @brief Return all hosts for the specified HW address or DUID. + /// + /// @param hwaddr HW address of the client or NULL if no HW address + /// available. + /// @param duid client id or NULL if not available, e.g. DHCPv4 client case. + /// @return Empty collection of const @c Host objects. + virtual ConstHostCollection + getAll(const HWAddrPtr& hwaddr, const DuidPtr& duid = DuidPtr()) const; + + /// @brief Return all hosts connected to any subnet for which reservations + /// have been made using a specified identifier. + /// + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// @return Empty collection of const @c Host objects. + virtual ConstHostCollection + getAll(const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + + /// @brief Returns a collection of hosts using the specified IPv4 address. + /// + /// @param address IPv4 address for which the @c Host object is searched. + /// @return Empty collection of const @c Host objects. + virtual ConstHostCollection + getAll4(const asiolink::IOAddress& address) const; + + /// @brief Returns a host connected to the IPv4 subnet. + /// + /// @param subnet_id Subnet identifier. + /// @param hwaddr HW address of the client or NULL if no HW address + /// available. + /// @param duid client id or NULL if not available. + /// @return Const @c Host object using a specified HW address or DUID. + virtual ConstHostPtr + get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, + const DuidPtr& duid = DuidPtr()) const; + + + /// @brief Returns a host connected to the IPv4 subnet. + /// + /// @param subnet_id Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// @return Const @c Host object for which reservation has been made using + /// the specified identifier. + virtual ConstHostPtr + get4(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + + /// @brief Returns a host connected to the IPv4 subnet and having + /// a reservation for a specified IPv4 address. + /// + /// @param subnet_id Subnet identifier. + /// @param address reserved IPv4 address. + /// @return Const @c Host object using a specified IPv4 address. + virtual ConstHostPtr + get4(const SubnetID& subnet_id, + const asiolink::IOAddress& address) const; + + /// @brief Returns a host connected to the IPv6 subnet. + /// + /// @param subnet_id Subnet identifier. + /// @param hwaddr HW address of the client or NULL if no HW address + /// available. + /// @param duid DUID or NULL if not available. + /// @return Const @c Host object using a specified HW address or DUID. + virtual ConstHostPtr + get6(const SubnetID& subnet_id, const DuidPtr& duid, + const HWAddrPtr& hwaddr = HWAddrPtr()) const; + + /// @brief Returns a host connected to the IPv6 subnet. + /// + /// @param subnet_id Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// @return Const @c Host object for which reservation has been made using + /// the specified identifier. + virtual ConstHostPtr + get6(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + + /// @brief Returns a host using the specified IPv6 prefix. + /// + /// @param prefix IPv6 prefix for which the @c Host object is searched. + /// @param prefix_len IPv6 prefix length. + /// @return Const @c Host object using a specified HW address or DUID. + virtual ConstHostPtr + get6(const asiolink::IOAddress& prefix, const uint8_t prefix_len) const; + + /// @brief Returns a host connected to the IPv6 subnet and having + /// a reservation for a specified IPv6 address or prefix. + /// + /// @param subnet_id Subnet identifier. + /// @param address reserved IPv6 address/prefix. + /// @return Const @c Host object using a specified IPv6 address/prefix. + virtual ConstHostPtr + get6(const SubnetID& subnet_id, const asiolink::IOAddress& address) const; + + /// @brief Adds a new host to the collection. + /// + /// @param host Pointer to the new @c Host object being added. + /// @return true if addition was successful. + virtual bool add(const HostPtr& host); + + /// @brief Attempts to delete a host by (subnet-id, address) + /// + /// @param subnet_id subnet identifier. + /// @param addr specified address. + /// @return true if deletion was successful, false if the host was not there. + /// @throw various exceptions in case of errors + virtual bool del(const SubnetID& subnet_id, const asiolink::IOAddress& addr); + + /// @brief Attempts to delete a host by (subnet-id4, identifier, identifier-type) + /// + /// @param subnet_id IPv4 Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// @return true if deletion was successful, false if the host was not there. + /// @throw various exceptions in case of errors + virtual bool del4(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, const size_t identifier_len); + + /// @brief Attempts to delete a host by (subnet-id6, identifier, identifier-type) + /// + /// @param subnet_id IPv6 Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// @return true if deletion was successful, false if the host was not there. + /// @throw various exceptions in case of errors + virtual bool del6(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, const size_t identifier_len); + + /// @brief Return backend type + /// + /// Returns the type of the backend (e.g. "mysql", "memfile" etc.) + /// + /// @return Type of the backend. + virtual std::string getType() const { + return ("mem"); + } + + /// More lease backend? + + /// @brief Returns name of the database or file used by the backend + /// @return "mem" string" + virtual std::string getName() const { + return (std::string("mem")); + } + + /// @brief Returns description of the backend. + /// @return description + virtual std::string getDescription() const { + return (std::string("In memory storage, mostly useful for testing.")); + } + + /// @brief Returns version this backend + /// @return two numbers that each represent practical value of this backend. + virtual std::pair getVersion() const { + return (std::make_pair(0,0)); + } + + /// @brief Returns store size. + /// @return number of hosts in the store. + virtual size_t size() const; + +protected: + // This is very simple storage. + + /// @brief Store + std::vector store_; +}; + +/// Pointer to the Mem host data source. +typedef boost::shared_ptr MemHostDataSourcePtr; + +/// @brief Factory function. +/// +/// @param parameters +/// @return A pointer to a base host data source instance. +BaseHostDataSource* +memFactory(const DatabaseConnection::ParameterMap& /*parameters*/); + +} // namespace isc::dhcp::test +} // namespace isc::dhcp +} // namespace isc + +#endif From d2932074b39154232f432f5a4670b7e07c1fe914 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sat, 17 Feb 2018 00:27:03 +0100 Subject: [PATCH 10/18] [5532] Moved generic host data source tests to testutils --- src/lib/dhcpsrv/tests/Makefile.am | 1 - src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc | 2 +- src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc | 2 +- src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc | 2 +- src/lib/dhcpsrv/testutils/Makefile.am | 1 + .../generic_host_data_source_unittest.cc | 5 +++-- .../{tests => testutils}/generic_host_data_source_unittest.h | 0 7 files changed, 7 insertions(+), 6 deletions(-) rename src/lib/dhcpsrv/{tests => testutils}/generic_host_data_source_unittest.cc (99%) rename src/lib/dhcpsrv/{tests => testutils}/generic_host_data_source_unittest.h (100%) diff --git a/src/lib/dhcpsrv/tests/Makefile.am b/src/lib/dhcpsrv/tests/Makefile.am index 95c5c4f753..ec6db96568 100644 --- a/src/lib/dhcpsrv/tests/Makefile.am +++ b/src/lib/dhcpsrv/tests/Makefile.am @@ -105,7 +105,6 @@ libdhcpsrv_unittests_SOURCES += lease_mgr_unittest.cc libdhcpsrv_unittests_SOURCES += logging_unittest.cc libdhcpsrv_unittests_SOURCES += logging_info_unittest.cc libdhcpsrv_unittests_SOURCES += generic_lease_mgr_unittest.cc generic_lease_mgr_unittest.h -libdhcpsrv_unittests_SOURCES += generic_host_data_source_unittest.cc generic_host_data_source_unittest.h libdhcpsrv_unittests_SOURCES += memfile_lease_mgr_unittest.cc libdhcpsrv_unittests_SOURCES += dhcp_parsers_unittest.cc if HAVE_MYSQL diff --git a/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc index 59af1339e1..4707760656 100644 --- a/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/cql_host_data_source_unittest.cc @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc index ccad94341a..c073dda088 100644 --- a/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc index d9e422259f..42fbf3dc7d 100644 --- a/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/lib/dhcpsrv/testutils/Makefile.am b/src/lib/dhcpsrv/testutils/Makefile.am index dfdaebd93b..10a7e3d890 100644 --- a/src/lib/dhcpsrv/testutils/Makefile.am +++ b/src/lib/dhcpsrv/testutils/Makefile.am @@ -15,6 +15,7 @@ noinst_LTLIBRARIES = libdhcpsrvtest.la libdhcpsrvtest_la_SOURCES = config_result_check.cc config_result_check.h libdhcpsrvtest_la_SOURCES += dhcp4o6_test_ipc.cc dhcp4o6_test_ipc.h libdhcpsrvtest_la_SOURCES += memory_host_data_source.cc memory_host_data_source.h +libdhcpsrvtest_la_SOURCES += generic_host_data_source_unittest.cc generic_host_data_source_unittest.h libdhcpsrvtest_la_SOURCES += schema.cc schema.h diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc similarity index 99% rename from src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc rename to src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc index a66d5e2c9e..eca29b18b6 100644 --- a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc @@ -16,9 +16,10 @@ #include #include #include -#include -#include +#include #include +#include + #include #include #include diff --git a/src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h similarity index 100% rename from src/lib/dhcpsrv/tests/generic_host_data_source_unittest.h rename to src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h From 9095ca3d14f79e481899f867951041315f17fd6c Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Sun, 18 Feb 2018 01:44:41 +0100 Subject: [PATCH 11/18] [5532] Updated tests using add to check return --- .../generic_host_data_source_unittest.cc | 180 +++++++++++++----- 1 file changed, 131 insertions(+), 49 deletions(-) diff --git a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc index eca29b18b6..e81f6fd75f 100644 --- a/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc +++ b/src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc @@ -572,7 +572,9 @@ GenericHostDataSourceTest::testReadOnlyDatabase(const char* valid_db_type) { // insert some data to the database. HostPtr host = initializeHost6("2001:db8::1", Host::IDENT_DUID, false); ASSERT_TRUE(host); - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv6SubnetID(); @@ -621,7 +623,9 @@ GenericHostDataSourceTest::testBasic4(const Host::IdentifierType& id) { SubnetID subnet = host->getIPv4SubnetID(); // Try to add it to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // This should not return anything ConstHostPtr from_hds = hdsptr_->get4(subnet, IOAddress("10.10.10.10")); @@ -647,10 +651,15 @@ GenericHostDataSourceTest::testGetByIPv4(const Host::IdentifierType& id) { HostPtr host4 = initializeHost4("192.0.2.4", id); // ... and add them to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); - ASSERT_NO_THROW(hdsptr_->add(host3)); - ASSERT_NO_THROW(hdsptr_->add(host4)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host3)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host4)); + EXPECT_TRUE(added); SubnetID subnet1 = host1->getIPv4SubnetID(); SubnetID subnet2 = host2->getIPv4SubnetID(); @@ -693,8 +702,11 @@ GenericHostDataSourceTest::testGet4ByIdentifier( ASSERT_FALSE(host1->getIdentifier() == host2->getIdentifier()); // Try to add both of them to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); SubnetID subnet1 = host1->getIPv4SubnetID(); SubnetID subnet2 = host2->getIPv4SubnetID(); @@ -725,7 +737,9 @@ GenericHostDataSourceTest::testHWAddrNotClientId() { ASSERT_FALSE(host->getDuid()); // Try to add it to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); SubnetID subnet = host->getIPv4SubnetID(); @@ -757,7 +771,9 @@ GenericHostDataSourceTest::testClientIdNotHWAddr() { ASSERT_TRUE(host->getDuid()); // Try to add it to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); SubnetID subnet = host->getIPv4SubnetID(); @@ -810,7 +826,9 @@ GenericHostDataSourceTest::testHostname(std::string name, int num) { for (vector::const_iterator it = hosts.begin(); it != hosts.end(); ++it) { // Try to add both of the to the host data source. - ASSERT_NO_THROW(hdsptr_->add(*it)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(*it)); + EXPECT_TRUE(added); } // And finally retrieve them one by one and check @@ -839,7 +857,9 @@ GenericHostDataSourceTest::testUserContext(ConstElementPtr user_context) { SubnetID subnet = host->getIPv4SubnetID(); // Try to add it to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Retrieve it. ConstHostPtr from_hds = hdsptr_->get4(subnet, IOAddress("192.0.2.1")); @@ -856,7 +876,8 @@ GenericHostDataSourceTest::testUserContext(ConstElementPtr user_context) { host->setHostname("foo.example.com"); subnet = host->getIPv6SubnetID(); - ASSERT_NO_THROW(hdsptr_->add(host)); + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); from_hds = hdsptr_->get6(subnet, Host::IDENT_HWADDR, &host->getIdentifier()[0], @@ -879,7 +900,9 @@ GenericHostDataSourceTest::testMultipleSubnets(int subnets, host->setIPv4SubnetID(i + 1000); // Check that the same host can have reservations in multiple subnets. - EXPECT_NO_THROW(hdsptr_->add(host)); + bool added = false; + EXPECT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); } // Now check that the reservations can be retrieved by IPv4 address from @@ -953,8 +976,11 @@ GenericHostDataSourceTest::testGet6ByHWAddr() { compareHwaddrs(host1, host2, false); // Try to add both of them to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); SubnetID subnet1 = host1->getIPv6SubnetID(); SubnetID subnet2 = host2->getIPv6SubnetID(); @@ -990,8 +1016,11 @@ GenericHostDataSourceTest::testGet6ByClientId() { compareDuids(host1, host2, false); // Try to add both of them to the host data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); SubnetID subnet1 = host1->getIPv6SubnetID(); SubnetID subnet2 = host2->getIPv6SubnetID(); @@ -1027,7 +1056,9 @@ GenericHostDataSourceTest::testSubnetId6(int subnets, Host::IdentifierType id) { host->setIPv6SubnetID(i + 1000); // Check that the same host can have reservations in multiple subnets. - EXPECT_NO_THROW(hdsptr_->add(host)); + bool added = false; + EXPECT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Increase address to make sure we don't assign the same address // in different subnets. @@ -1075,10 +1106,15 @@ GenericHostDataSourceTest::testGetByIPv6(Host::IdentifierType id, bool prefix) { HostPtr host4 = initializeHost6("2001:db8::4", id, prefix); // ... and add them to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); - ASSERT_NO_THROW(hdsptr_->add(host3)); - ASSERT_NO_THROW(hdsptr_->add(host4)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host3)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host4)); + EXPECT_TRUE(added); // Are we talking about addresses or prefixes? uint8_t len = prefix ? 64 : 128; @@ -1118,10 +1154,15 @@ GenericHostDataSourceTest::testGetBySubnetIPv6() { HostPtr host4 = initializeHost6("2001:db8:4::", Host::IDENT_DUID, true); // ... and add them to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); - ASSERT_NO_THROW(hdsptr_->add(host2)); - ASSERT_NO_THROW(hdsptr_->add(host3)); - ASSERT_NO_THROW(hdsptr_->add(host4)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host3)); + EXPECT_TRUE(added); + ASSERT_NO_THROW(added = hdsptr_->add(host4)); + EXPECT_TRUE(added); // And then try to retrieve them back. ConstHostPtr from_hds1 = hdsptr_->get6(host1->getIPv6SubnetID(), IOAddress("2001:db8:1::")); @@ -1151,7 +1192,9 @@ GenericHostDataSourceTest::testAddDuplicate6WithSameDUID() { HostPtr host = initializeHost6("2001:db8::1", Host::IDENT_DUID, true); // Add this reservation once. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Then try to add it again, it should throw an exception. ASSERT_THROW(hdsptr_->add(host), DuplicateEntry); @@ -1166,7 +1209,9 @@ GenericHostDataSourceTest::testAddDuplicate6WithSameHWAddr() { HostPtr host = initializeHost6("2001:db8::1", Host::IDENT_HWADDR, true); // Add this reservation once. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Then try to add it again, it should throw an exception. ASSERT_THROW(hdsptr_->add(host), DuplicateEntry); @@ -1181,7 +1226,9 @@ GenericHostDataSourceTest::testAddDuplicate4() { HostPtr host = initializeHost4("192.0.2.1", Host::IDENT_DUID); // Add this reservation once. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Then try to add it again, it should throw an exception. ASSERT_THROW(hdsptr_->add(host), DuplicateEntry); @@ -1195,7 +1242,8 @@ GenericHostDataSourceTest::testAddDuplicate4() { // Modify address to avoid its duplication and make sure // we can now add the host. ASSERT_NO_THROW(host->setIPv4Reservation(IOAddress("192.0.2.3"))); - EXPECT_NO_THROW(hdsptr_->add(host)); + EXPECT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); } void @@ -1211,7 +1259,9 @@ GenericHostDataSourceTest::testAddr6AndPrefix() { host->addReservation(resv); // Add this reservation - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Get this host by DUID ConstHostPtr from_hds = @@ -1245,7 +1295,9 @@ GenericHostDataSourceTest::testMultipleReservations() { host->addReservation(resv3); host->addReservation(resv4); - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); ConstHostPtr from_hds = hdsptr_->get6(IOAddress("2001:db8::1"), len); @@ -1292,7 +1344,9 @@ void GenericHostDataSourceTest::testOptionsReservations4(const bool formatted, // Add a bunch of DHCPv4 and DHCPv6 options for the host. ASSERT_NO_THROW(addTestOptions(host, formatted, DHCP4_ONLY, user_context)); // Insert host and the options into respective tables. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv4SubnetID(); @@ -1320,7 +1374,9 @@ void GenericHostDataSourceTest::testOptionsReservations6(const bool formatted, // Add a bunch of DHCPv4 and DHCPv6 options for the host. ASSERT_NO_THROW(addTestOptions(host, formatted, DHCP6_ONLY, user_context)); // Insert host, options and IPv6 reservations into respective tables. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv6SubnetID(); @@ -1342,7 +1398,9 @@ GenericHostDataSourceTest::testOptionsReservations46(const bool formatted) { // Add a bunch of DHCPv4 and DHCPv6 options for the host. ASSERT_NO_THROW(addTestOptions(host, formatted, DHCP4_AND_DHCP6)); // Insert host, options and IPv6 reservations into respective tables. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // getAll(identifier_type, identifier, identifier_size) ConstHostCollection hosts_by_id = @@ -1367,7 +1425,9 @@ GenericHostDataSourceTest::testMultipleClientClasses4() { } // Add the host. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv4SubnetID(); @@ -1432,7 +1492,9 @@ GenericHostDataSourceTest::testMultipleClientClasses6() { } // Add the host. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv6SubnetID(); @@ -1501,7 +1563,9 @@ GenericHostDataSourceTest::testMultipleClientClassesBoth() { } // Add the host. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv6SubnetID(); @@ -1530,7 +1594,9 @@ GenericHostDataSourceTest::testMessageFields4() { }); // Add the host. - ASSERT_NO_THROW(hdsptr_->add(host)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host)); + EXPECT_TRUE(added); // Subnet id will be used in queries to the database. SubnetID subnet_id = host->getIPv4SubnetID(); @@ -1589,7 +1655,9 @@ void GenericHostDataSourceTest::testDeleteByAddr4() { SubnetID subnet1 = host1->getIPv4SubnetID(); // ... and add it to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // And then try to retrieve it back. ConstHostPtr before = hdsptr_->get4(subnet1, IOAddress("192.0.2.1")); @@ -1616,7 +1684,9 @@ void GenericHostDataSourceTest::testDeleteById4() { SubnetID subnet1 = host1->getIPv4SubnetID(); // ... and add it to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // And then try to retrieve it back. ConstHostPtr before = hdsptr_->get4(subnet1, @@ -1657,7 +1727,9 @@ void GenericHostDataSourceTest::testDeleteById4Options() { SubnetID subnet1 = host1->getIPv4SubnetID(); // ... and add it to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // There must be some options EXPECT_NE(0, countDBOptions4()); @@ -1698,7 +1770,9 @@ void GenericHostDataSourceTest::testDeleteById6() { SubnetID subnet1 = host1->getIPv6SubnetID(); // ... and add it to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // And then try to retrieve it back. ConstHostPtr before = hdsptr_->get6(subnet1, @@ -1734,7 +1808,9 @@ void GenericHostDataSourceTest::testDeleteById6Options() { ASSERT_NO_THROW(addTestOptions(host1, true, DHCP6_ONLY)); // ... and add it to the data source. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // Check that the options are stored... EXPECT_NE(0, countDBOptions6()); @@ -1782,7 +1858,9 @@ GenericHostDataSourceTest::testMultipleHostsNoAddress4() { host1->setIPv4SubnetID(1); host1->setIPv6SubnetID(0); // Add the host to the database. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // An attempt to add this host again should fail due to client identifier // duplication. @@ -1794,7 +1872,8 @@ GenericHostDataSourceTest::testMultipleHostsNoAddress4() { HostPtr host2 = initializeHost4("0.0.0.0", Host::IDENT_HWADDR); host2->setIPv4SubnetID(1); host2->setIPv6SubnetID(0); - ASSERT_NO_THROW(hdsptr_->add(host2)); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); } void @@ -1807,7 +1886,9 @@ GenericHostDataSourceTest::testMultipleHosts6() { host1->setIPv4SubnetID(0); host1->setIPv6SubnetID(1); // Add the host to the database. - ASSERT_NO_THROW(hdsptr_->add(host1)); + bool added = false; + ASSERT_NO_THROW(added = hdsptr_->add(host1)); + EXPECT_TRUE(added); // An attempt to add this host again should fail due to client identifier // duplication. @@ -1817,7 +1898,8 @@ GenericHostDataSourceTest::testMultipleHosts6() { host2->setIPv4SubnetID(0); host2->setIPv6SubnetID(1); // Add the host to the database. - ASSERT_NO_THROW(hdsptr_->add(host2)); + ASSERT_NO_THROW(added = hdsptr_->add(host2)); + EXPECT_TRUE(added); } } // namespace test From 2716808a0f794adf4cbb887158535c349bd34f6c Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Mon, 19 Feb 2018 22:05:37 +0100 Subject: [PATCH 12/18] [5532] Reported master build fixes --- src/lib/dhcpsrv/cql_host_data_source.cc | 15 ++++++--------- src/lib/dhcpsrv/cql_host_data_source.h | 6 +++--- src/lib/dhcpsrv/cql_lease_mgr.h | 4 ++-- src/lib/dhcpsrv/host_data_source_factory.cc | 6 +++--- src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc | 8 ++++---- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/lib/dhcpsrv/cql_host_data_source.cc b/src/lib/dhcpsrv/cql_host_data_source.cc index 38d0bb84b5..f0f2f2f43b 100644 --- a/src/lib/dhcpsrv/cql_host_data_source.cc +++ b/src/lib/dhcpsrv/cql_host_data_source.cc @@ -143,7 +143,7 @@ public: /// /// Specifies table columns. /// @param connection specifies the connection to conduct this exchange on - CqlHostExchange(CqlConnection& connection); + CqlHostExchange(); /// @brief Virtual destructor. virtual ~CqlHostExchange(); @@ -272,9 +272,6 @@ private: /// Pointer to Host object holding information being inserted into database. HostPtr host_; - /// @brief Connection to the Cassandra database - CqlConnection& connection_; - /// @brief Primary key. Aggregates: host_identifier, host_identifier_type, /// reserved_ipv6_prefix_address, reserved_ipv6_prefix_length, option_code, /// option_space. @@ -602,9 +599,9 @@ StatementMap CqlHostExchange::tagged_statements_ = { }; -CqlHostExchange::CqlHostExchange(CqlConnection& connection) - : host_(NULL), connection_(connection), id_(0), host_identifier_type_(0), - host_ipv4_subnet_id_(0), host_ipv6_subnet_id_(0), host_ipv4_address_(0), +CqlHostExchange::CqlHostExchange() + : host_(NULL), id_(0), host_identifier_type_(0), host_ipv4_subnet_id_(0), + host_ipv6_subnet_id_(0), host_ipv4_address_(0), reserved_ipv6_prefix_length_(NULL_RESERVED_IPV6_PREFIX_LENGTH), reserved_ipv6_prefix_address_type_(NULL_RESERVED_IPV6_PREFIX_ADDRESS_TYPE), iaid_(NULL_IAID), option_universe_(NULL_OPTION_UNIVERSE), @@ -1733,7 +1730,7 @@ CqlHostDataSourceImpl::getHostCollection(StatementTag statement_tag, AnyArray& where_values) const { // Run statement. - std::unique_ptr host_exchange(new CqlHostExchange(dbconn_)); + std::unique_ptr host_exchange(new CqlHostExchange()); AnyArray collection = host_exchange->executeSelect(dbconn_, where_values, statement_tag, false); @@ -1774,7 +1771,7 @@ CqlHostDataSourceImpl::insertHost(const HostPtr& host, const OptionDescriptor& option_descriptor) { AnyArray assigned_values; - std::unique_ptr host_exchange(new CqlHostExchange(dbconn_)); + std::unique_ptr host_exchange(new CqlHostExchange()); try { host_exchange->createBindForMutation( diff --git a/src/lib/dhcpsrv/cql_host_data_source.h b/src/lib/dhcpsrv/cql_host_data_source.h index ceb721bd98..82d9929e64 100644 --- a/src/lib/dhcpsrv/cql_host_data_source.h +++ b/src/lib/dhcpsrv/cql_host_data_source.h @@ -275,7 +275,7 @@ public: /// there. /// @throw various exceptions in case of errors virtual bool del(const SubnetID& subnet_id, - const asiolink::IOAddress& addr); + const asiolink::IOAddress& addr) override; /// @brief Attempts to delete a host by (subnet-id4, identifier-type, /// identifier). @@ -293,7 +293,7 @@ public: virtual bool del4(const SubnetID& subnet_id, const Host::IdentifierType& identifier_type, const uint8_t* identifier_begin, - const size_t identifier_len); + const size_t identifier_len) override; /// @brief Attempts to delete a host by (subnet-id6, identifier-type, /// identifier). @@ -311,7 +311,7 @@ public: virtual bool del6(const SubnetID& subnet_id, const Host::IdentifierType& identifier_type, const uint8_t* identifier_begin, - const size_t identifier_len); + const size_t identifier_len) override; /// @brief Returns textual description of the backend. /// diff --git a/src/lib/dhcpsrv/cql_lease_mgr.h b/src/lib/dhcpsrv/cql_lease_mgr.h index 5be75b6666..eea08c6398 100644 --- a/src/lib/dhcpsrv/cql_lease_mgr.h +++ b/src/lib/dhcpsrv/cql_lease_mgr.h @@ -203,12 +203,12 @@ public: /// @param subnet_id subnet identifier. /// /// @return Lease collection (may be empty if no IPv4 lease found). - virtual Lease4Collection getLeases4(SubnetID subnet_id) const; + virtual Lease4Collection getLeases4(SubnetID subnet_id) const override; /// @brief Returns all IPv4 leases. /// /// @return Lease collection (may be empty if no IPv4 lease found). - virtual Lease4Collection getLeases4() const; + virtual Lease4Collection getLeases4() const override; /// @brief Returns existing IPv6 lease for a given IPv6 address. /// diff --git a/src/lib/dhcpsrv/host_data_source_factory.cc b/src/lib/dhcpsrv/host_data_source_factory.cc index 3bb700be81..1ed8108191 100644 --- a/src/lib/dhcpsrv/host_data_source_factory.cc +++ b/src/lib/dhcpsrv/host_data_source_factory.cc @@ -143,7 +143,7 @@ struct MySqlHostDataSourceInit { }; // Database backend will be registered at object initialization -MySqlHostDataSourceInit mysql_init; +MySqlHostDataSourceInit mysql_init_; #endif #ifdef HAVE_PGSQL @@ -168,7 +168,7 @@ struct PgSqlHostDataSourceInit { }; // Database backend will be registered at object initialization -PgSqlHostDataSourceInit mysql_init; +PgSqlHostDataSourceInit pgsql_init_; #endif #ifdef HAVE_CQL @@ -193,7 +193,7 @@ struct CqlHostDataSourceInit { }; // Database backend will be registered at object initialization -CqlHostDataSourceInit mysql_init; +CqlHostDataSourceInit cql_init_; #endif } // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc index 1e931ea073..ed04ee4a7b 100644 --- a/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_db_access_unittest.cc @@ -162,8 +162,8 @@ TEST_F(CfgMySQLDbAccessTest, createManagers) { }); ASSERT_NO_THROW({ - HostDataSourcePtr& host_data_source = - HostDataSourceFactory::getHostDataSourcePtr(); + const HostDataSourcePtr& host_data_source = + HostMgr::instance().getHostDataSource(); ASSERT_TRUE(host_data_source); EXPECT_EQ("mysql", host_data_source->getType()); }); @@ -175,8 +175,8 @@ TEST_F(CfgMySQLDbAccessTest, createManagers) { ASSERT_NO_THROW(HostMgr::instance()); ASSERT_NO_THROW({ - HostDataSourcePtr& host_data_source = - HostDataSourceFactory::getHostDataSourcePtr(); + const HostDataSourcePtr& host_data_source = + HostMgr::instance().getHostDataSource(); ASSERT_TRUE(host_data_source); EXPECT_EQ("mysql", host_data_source->getType()); }); From a9a6b71982058a03788643fbe26a37556cf3d6e5 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Tue, 20 Feb 2018 12:13:49 +0100 Subject: [PATCH 13/18] [5532] Removed premium from the index --- .gitmodules | 3 --- premium | 1 - 2 files changed, 4 deletions(-) delete mode 160000 premium diff --git a/.gitmodules b/.gitmodules index e4730c1e82..e69de29bb2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "premium"] - path = premium - url = ssh://fdupont@repo.isc.org/proj/git/prod/kea-premium.git diff --git a/premium b/premium deleted file mode 160000 index d970735ad4..0000000000 --- a/premium +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d970735ad4f02de4cb736dc47669061048610412 From 87d41d9184394800084502c1a3b80cc056325d03 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Wed, 21 Feb 2018 17:48:01 +0100 Subject: [PATCH 14/18] [5533] Added a negative cache flag (host manager tests to do) --- src/lib/dhcpsrv/host.cc | 13 ++++++++++--- src/lib/dhcpsrv/host.h | 17 ++++++++++++++++- src/lib/dhcpsrv/host_mgr.cc | 22 ++++++++++++++++++++++ src/lib/dhcpsrv/tests/host_unittest.cc | 11 +++++++++-- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/lib/dhcpsrv/host.cc b/src/lib/dhcpsrv/host.cc index 562bfb4702..134c0acc58 100644 --- a/src/lib/dhcpsrv/host.cc +++ b/src/lib/dhcpsrv/host.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -92,7 +92,8 @@ Host::Host(const uint8_t* identifier, const size_t identifier_len, dhcp6_client_classes_(dhcp6_client_classes), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()), server_host_name_(server_host_name), boot_file_name_(boot_file_name), - host_id_(0), cfg_option4_(new CfgOption()), cfg_option6_(new CfgOption()) { + host_id_(0), cfg_option4_(new CfgOption()), + cfg_option6_(new CfgOption()), negative_(false) { // Initialize host identifier. setIdentifier(identifier, identifier_len, identifier_type); @@ -125,7 +126,8 @@ Host::Host(const std::string& identifier, const std::string& identifier_name, dhcp6_client_classes_(dhcp6_client_classes), next_server_(asiolink::IOAddress::IPV4_ZERO_ADDRESS()), server_host_name_(server_host_name), boot_file_name_(boot_file_name), - host_id_(0), cfg_option4_(new CfgOption()), cfg_option6_(new CfgOption()) { + host_id_(0), cfg_option4_(new CfgOption()), + cfg_option6_(new CfgOption()), negative_(false) { // Initialize host identifier. setIdentifier(identifier, identifier_name); @@ -589,6 +591,11 @@ Host::toText() const { << "=" << *cclass; } + // Add negative cached. + if (negative_) { + s << " negative cached"; + } + return (s.str()); } diff --git a/src/lib/dhcpsrv/host.h b/src/lib/dhcpsrv/host.h index cf3466924b..20d8e4e554 100644 --- a/src/lib/dhcpsrv/host.h +++ b/src/lib/dhcpsrv/host.h @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -546,6 +546,18 @@ public: return (host_id_); } + /// @brief Sets the negative cached flag. + /// + /// @param negative New valie for negative cache flag. + void setNegative(bool negative) { + negative_ = negative; + } + + /// @brief Return the negative cache flag value. + bool getNegative() const { + return (negative_); + } + /// @brief Unparses (converts to Element representation) IPv4 host /// /// @return Element representation of the host @@ -604,6 +616,9 @@ private: CfgOptionPtr cfg_option4_; /// @brief Pointer to the DHCPv6 option data configuration for this host. CfgOptionPtr cfg_option6_; + + /// @brief Negative cached flag. + bool negative_; }; /// @brief Pointer to the @c Host object. diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index 8b62d54235..5892e480f5 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -133,6 +133,9 @@ HostMgr::get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, host = (*it)->get4(subnet_id, hwaddr, DuidPtr()); } } + if (host && host->getNegative()) { + return (ConstHostPtr()); + } return (host); } @@ -168,6 +171,9 @@ HostMgr::get4(const SubnetID& subnet_id, .arg((*it)->getType()) .arg(host->toText()); + if (host->getNegative()) { + return (ConstHostPtr()); + } return (host); } } @@ -194,6 +200,9 @@ HostMgr::get4(const SubnetID& subnet_id, !host && it != alternate_sources_.end(); ++it) { host = (*it)->get4(subnet_id, address); } + if (host && host->getNegative()) { + return (ConstHostPtr()); + } return (host); } @@ -220,6 +229,9 @@ HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, host = (*it)->get6(subnet_id, DuidPtr(), hwaddr); } } + if (host && host->getNegative()) { + return (ConstHostPtr()); + } return (host); } @@ -237,6 +249,9 @@ HostMgr::get6(const IOAddress& prefix, const uint8_t prefix_len) const { !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(prefix, prefix_len); } + if (host && host->getNegative()) { + return (ConstHostPtr()); + } return (host); } @@ -272,6 +287,10 @@ HostMgr::get6(const SubnetID& subnet_id, identifier_len)) .arg((*it)->getType()) .arg(host->toText()); + + if (host->getNegative()) { + return (ConstHostPtr()); + } return (host); } } @@ -300,6 +319,9 @@ HostMgr::get6(const SubnetID& subnet_id, !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(subnet_id, addr); } + if (host && host->getNegative()) { + return (ConstHostPtr()); + } return (host); } diff --git a/src/lib/dhcpsrv/tests/host_unittest.cc b/src/lib/dhcpsrv/tests/host_unittest.cc index d3603fbae7..88216ed548 100644 --- a/src/lib/dhcpsrv/tests/host_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -669,6 +669,7 @@ TEST_F(HostTest, setValues) { ASSERT_EQ("192.0.2.3", host->getIPv4Reservation().toText()); ASSERT_EQ("some-host.example.org", host->getHostname()); ASSERT_FALSE(host->getContext()); + ASSERT_FALSE(host->getNegative()); host->setIPv4SubnetID(SubnetID(123)); host->setIPv6SubnetID(SubnetID(234)); @@ -679,6 +680,7 @@ TEST_F(HostTest, setValues) { host->setBootFileName("bootfile.efi"); std::string user_context = "{ \"foo\": \"bar\" }"; host->setContext(Element::fromJSON(user_context)); + host->setNegative(true); EXPECT_EQ(123, host->getIPv4SubnetID()); EXPECT_EQ(234, host->getIPv6SubnetID()); @@ -689,6 +691,7 @@ TEST_F(HostTest, setValues) { EXPECT_EQ("bootfile.efi", host->getBootFileName()); ASSERT_TRUE(host->getContext()); EXPECT_EQ(user_context, host->getContext()->str()); + EXPECT_TRUE(host->getNegative()); // Remove IPv4 reservation. host->removeIPv4Reservation(); @@ -981,6 +984,7 @@ TEST_F(HostTest, toText) { host->setHostname(""); host->removeIPv4Reservation(); host->setIPv4SubnetID(0); + host->setNegative(true); EXPECT_EQ("hwaddr=010203040506 ipv6_subnet_id=2" " hostname=(empty) ipv4_reservation=(no)" @@ -990,7 +994,8 @@ TEST_F(HostTest, toText) { " ipv6_reservation0=2001:db8:1::cafe" " ipv6_reservation1=2001:db8:1::1" " ipv6_reservation2=2001:db8:1:1::/64" - " ipv6_reservation3=2001:db8:1:2::/64", + " ipv6_reservation3=2001:db8:1:2::/64" + " negative cached", host->toText()); // Create host identified by DUID, instead of HWADDR, with a very @@ -1139,6 +1144,8 @@ TEST_F(HostTest, unparse) { // Add some classes. host->addClientClass4("modem"); host->addClientClass4("router"); + // Set invisible negative cache. + host->setNegative(true); EXPECT_EQ("{ " "\"boot-file-name\": \"\", " From 9f94ec2fc6d9b42f89dfacc8e332eed8a5a54134 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Wed, 21 Feb 2018 22:45:55 +0100 Subject: [PATCH 15/18] [5533] Introduce get[46]Any and add tests --- .gitmodules | 3 +++ premium | 1 + 2 files changed, 4 insertions(+) create mode 160000 premium diff --git a/.gitmodules b/.gitmodules index e69de29bb2..e4730c1e82 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "premium"] + path = premium + url = ssh://fdupont@repo.isc.org/proj/git/prod/kea-premium.git diff --git a/premium b/premium new file mode 160000 index 0000000000..16181d80e3 --- /dev/null +++ b/premium @@ -0,0 +1 @@ +Subproject commit 16181d80e33bab062dcd22c523be3676659a38cc From f922c7d1b1ad9f8c62ec9d8af0c087b33ec82bf2 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Wed, 21 Feb 2018 22:46:09 +0100 Subject: [PATCH 16/18] [5533] Introduce get[46]Any and add tests --- src/lib/dhcpsrv/host_mgr.cc | 50 ++++++--- src/lib/dhcpsrv/host_mgr.h | 44 ++++++++ src/lib/dhcpsrv/tests/host_mgr_unittest.cc | 119 +++++++++++++++++++++ 3 files changed, 198 insertions(+), 15 deletions(-) diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index 5892e480f5..1cb45c2ddb 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -140,10 +140,10 @@ HostMgr::get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, } ConstHostPtr -HostMgr::get4(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len) const { +HostMgr::get4Any(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get4(subnet_id, identifier_type, identifier_begin, identifier_len); if (host || alternate_sources_.empty()) { @@ -170,10 +170,7 @@ HostMgr::get4(const SubnetID& subnet_id, identifier_len)) .arg((*it)->getType()) .arg(host->toText()); - - if (host->getNegative()) { - return (ConstHostPtr()); - } + return (host); } } @@ -185,6 +182,19 @@ HostMgr::get4(const SubnetID& subnet_id, return (host); } +ConstHostPtr +HostMgr::get4(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { + ConstHostPtr host = get4Any(subnet_id, identifier_type, + identifier_begin, identifier_len); + if (host && host->getNegative()) { + return (ConstHostPtr()); + } + return (host); +} + ConstHostPtr HostMgr::get4(const SubnetID& subnet_id, const asiolink::IOAddress& address) const { @@ -256,10 +266,10 @@ HostMgr::get6(const IOAddress& prefix, const uint8_t prefix_len) const { } ConstHostPtr -HostMgr::get6(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len) const { +HostMgr::get6Any(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { ConstHostPtr host = getCfgHosts()->get6(subnet_id, identifier_type, identifier_begin, identifier_len); if (host || alternate_sources_.empty()) { @@ -288,9 +298,6 @@ HostMgr::get6(const SubnetID& subnet_id, .arg((*it)->getType()) .arg(host->toText()); - if (host->getNegative()) { - return (ConstHostPtr()); - } return (host); } } @@ -304,6 +311,19 @@ HostMgr::get6(const SubnetID& subnet_id, return (host); } +ConstHostPtr +HostMgr::get6(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { + ConstHostPtr host = get6Any(subnet_id, identifier_type, + identifier_begin, identifier_len); + if (host && host->getNegative()) { + return (ConstHostPtr()); + } + return (host); +} + ConstHostPtr HostMgr::get6(const SubnetID& subnet_id, const asiolink::IOAddress& addr) const { diff --git a/src/lib/dhcpsrv/host_mgr.h b/src/lib/dhcpsrv/host_mgr.h index dca2697efa..fa003ac22d 100644 --- a/src/lib/dhcpsrv/host_mgr.h +++ b/src/lib/dhcpsrv/host_mgr.h @@ -170,6 +170,28 @@ public: get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, const DuidPtr& duid = DuidPtr()) const; + /// @brief Returns any host connected to the IPv4 subnet. + /// + /// This method returns a single reservation for a particular host as + /// documented in the @c BaseHostDataSource::get4 even when the + /// reservation is marked as from negative caching. This allows to + /// overload negative caching with extra information in the user + /// context. + /// + /// @param subnet_id Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// + /// @return Const @c Host object for which reservation has been made using + /// the specified identifier. + virtual ConstHostPtr + get4Any(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + /// @brief Returns a host connected to the IPv4 subnet. /// /// This method returns a single reservation for a particular host as @@ -217,6 +239,28 @@ public: get6(const SubnetID& subnet_id, const DuidPtr& duid, const HWAddrPtr& hwaddr = HWAddrPtr()) const; + /// @brief Returns any host connected to the IPv6 subnet. + /// + /// This method returns a host connected to the IPv6 subnet as described + /// in the @c BaseHostDataSource::get6 even when the + /// reservation is marked as from negative caching. This allows to + /// overload negative caching with extra information in the user + /// context. + /// + /// @param subnet_id Subnet identifier. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of a buffer containing + /// an identifier. + /// @param identifier_len Identifier length. + /// + /// @return Const @c Host object for which reservation has been made using + /// the specified identifier. + virtual ConstHostPtr + get6Any(const SubnetID& subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + /// @brief Returns a host connected to the IPv6 subnet. /// /// This method returns a host connected to the IPv6 subnet as described diff --git a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc index 0a42513c02..b05ea47438 100644 --- a/src/lib/dhcpsrv/tests/host_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/host_mgr_unittest.cc @@ -109,6 +109,10 @@ protected: /// from which it will be retrieved. void testGet4(BaseHostDataSource& data_source); + /// @brief This test verifies that it is possible to retrieve negative + /// cached reservation with and only with get4Any, + void testGet4Any(); + /// @brief This test verifies that it is possible to retrieve an IPv6 /// reservation for the particular host using HostMgr. /// @@ -116,6 +120,10 @@ protected: /// from which it will be retrieved. void testGet6(BaseHostDataSource& data_source); + /// @brief This test verifies that it is possible to retrieve negative + /// cached reservation with and only with get6Any, + void testGet6Any(); + /// @brief This test verifies that it is possible to retrieve an IPv6 /// prefix reservation for the particular host using HostMgr. /// @@ -297,6 +305,53 @@ HostMgrTest::testGet4(BaseHostDataSource& data_source) { EXPECT_EQ("192.0.2.5", host->getIPv4Reservation().toText()); } +void +HostMgrTest::testGet4Any() { + // Initially, no host should be present. + ConstHostPtr host = HostMgr::instance().get4(SubnetID(1), Host::IDENT_DUID, + &duids_[0]->getDuid()[0], + duids_[0]->getDuid().size()); + ASSERT_FALSE(host); + HostMgr::instance().get4Any(SubnetID(1), Host::IDENT_DUID, + &duids_[0]->getDuid()[0], + duids_[0]->getDuid().size()); + ASSERT_FALSE(host); + + // Add new host to the database. + HostPtr new_host(new Host(duids_[0]->toText(), "duid", SubnetID(1), + SubnetID(0), IOAddress("192.0.2.5"))); + // Abuse of the server's configuration. + getCfgHosts()->add(new_host); + + CfgMgr::instance().commit(); + + // Retrieve the host from the database and expect that the parameters match. + host = HostMgr::instance().get4(SubnetID(1), Host::IDENT_DUID, + &duids_[0]->getDuid()[0], + duids_[0]->getDuid().size()); + ASSERT_TRUE(host); + EXPECT_EQ(1, host->getIPv4SubnetID()); + EXPECT_EQ("192.0.2.5", host->getIPv4Reservation().toText()); + + // Set the negative cache flag on the host. + new_host->setNegative(true); + + // Get4 can't get it. + host = HostMgr::instance().get4(SubnetID(1), Host::IDENT_DUID, + &duids_[0]->getDuid()[0], + duids_[0]->getDuid().size()); + EXPECT_FALSE(host); + + // But Get4Any can. + host = HostMgr::instance().get4Any(SubnetID(1), Host::IDENT_DUID, + &duids_[0]->getDuid()[0], + duids_[0]->getDuid().size()); + ASSERT_TRUE(host); + EXPECT_EQ(1, host->getIPv4SubnetID()); + EXPECT_EQ("192.0.2.5", host->getIPv4Reservation().toText()); + EXPECT_TRUE(host->getNegative()); +} + void HostMgrTest::testGet6(BaseHostDataSource& data_source) { // Initially, no host should be present. @@ -313,10 +368,64 @@ HostMgrTest::testGet6(BaseHostDataSource& data_source) { &duids_[0]->getDuid()[0], duids_[0]->getDuid().size()); ASSERT_TRUE(host); + EXPECT_EQ(2, host->getIPv6SubnetID()); EXPECT_TRUE(host->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_NA, IOAddress("2001:db8:1::1")))); } +void +HostMgrTest::testGet6Any() { + // Initially, no host should be present. + ConstHostPtr host = HostMgr::instance().get6(SubnetID(2), + Host::IDENT_HWADDR, + &hwaddrs_[0]->hwaddr_[0], + hwaddrs_[0]->hwaddr_.size()); + ASSERT_FALSE(host); + host = HostMgr::instance().get6Any(SubnetID(2), Host::IDENT_HWADDR, + &hwaddrs_[0]->hwaddr_[0], + hwaddrs_[0]->hwaddr_.size()); + ASSERT_FALSE(host); + + // Add new host to the database. + HostPtr new_host(new Host(hwaddrs_[0]->toText(false), "hw-address", + SubnetID(1), SubnetID(2), + IOAddress::IPV4_ZERO_ADDRESS())); + new_host->addReservation(IPv6Resrv(IPv6Resrv::TYPE_NA, + IOAddress("2001:db8:1::1"), 128)); + // Abuse of the server's configuration. + getCfgHosts()->add(new_host); + + CfgMgr::instance().commit(); + + // Retrieve the host from the database and expect that the parameters match. + host = HostMgr::instance().get6(SubnetID(2), Host::IDENT_HWADDR, + &hwaddrs_[0]->hwaddr_[0], + hwaddrs_[0]->hwaddr_.size()); + ASSERT_TRUE(host); + EXPECT_EQ(2, host->getIPv6SubnetID()); + EXPECT_TRUE(host->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_NA, + IOAddress("2001:db8:1::1")))); + + // Set the negative cache flag on the host. + new_host->setNegative(true); + + // Get6 can't get it. + host = HostMgr::instance().get6(SubnetID(2), Host::IDENT_HWADDR, + &hwaddrs_[0]->hwaddr_[0], + hwaddrs_[0]->hwaddr_.size()); + EXPECT_FALSE(host); + + // But Get4Any can. + host = HostMgr::instance().get6Any(SubnetID(2), Host::IDENT_HWADDR, + &hwaddrs_[0]->hwaddr_[0], + hwaddrs_[0]->hwaddr_.size()); + ASSERT_TRUE(host); + EXPECT_EQ(2, host->getIPv6SubnetID()); + EXPECT_TRUE(host->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_NA, + IOAddress("2001:db8:1::1")))); + EXPECT_TRUE(host->getNegative()); +} + void HostMgrTest::testGet6ByPrefix(BaseHostDataSource& data_source1, BaseHostDataSource& data_source2) { @@ -375,6 +484,11 @@ TEST_F(HostMgrTest, get4) { testGet4(*getCfgHosts()); } +// This test verifies handling of negative caching by get4/get4Any. +TEST_F(HostMgrTest, get4Any) { + testGet4Any(); +} + // This test verifies that it is possible to retrieve IPv6 reservations for // the particular host using HostMgr. The reservation is specified in the // server's configuration. @@ -382,6 +496,11 @@ TEST_F(HostMgrTest, get6) { testGet6(*getCfgHosts()); } +// This test verifies handling of negative caching by get4/get4Any. +TEST_F(HostMgrTest, get6Any) { + testGet6Any(); +} + // This test verifies that it is possible to retrieve the reservation of the // particular IPv6 prefix using HostMgr. TEST_F(HostMgrTest, get6ByPrefix) { From d2bad4f7e32491c36d741642a2bb0baa040a7e67 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 23 Feb 2018 16:45:46 +0100 Subject: [PATCH 17/18] [5533] Checkpoint: added code, test todo (where?) --- src/lib/dhcpsrv/Makefile.am | 2 + src/lib/dhcpsrv/cache_host_data_source.h | 64 +++++++++++++ src/lib/dhcpsrv/cfg_db_access.cc | 3 + src/lib/dhcpsrv/host_mgr.cc | 77 ++++++++++++++++ src/lib/dhcpsrv/host_mgr.h | 110 +++++++++++++++-------- 5 files changed, 217 insertions(+), 39 deletions(-) create mode 100644 src/lib/dhcpsrv/cache_host_data_source.h diff --git a/src/lib/dhcpsrv/Makefile.am b/src/lib/dhcpsrv/Makefile.am index a9c5ea7c36..34fd3a88e6 100644 --- a/src/lib/dhcpsrv/Makefile.am +++ b/src/lib/dhcpsrv/Makefile.am @@ -89,6 +89,7 @@ libkea_dhcpsrv_la_SOURCES += alloc_engine.cc alloc_engine.h libkea_dhcpsrv_la_SOURCES += alloc_engine_log.cc alloc_engine_log.h libkea_dhcpsrv_la_SOURCES += assignable_network.h libkea_dhcpsrv_la_SOURCES += base_host_data_source.h +libkea_dhcpsrv_la_SOURCES += cache_host_data_source.h libkea_dhcpsrv_la_SOURCES += callout_handle_store.h libkea_dhcpsrv_la_SOURCES += cfg_4o6.cc cfg_4o6.h libkea_dhcpsrv_la_SOURCES += cfg_db_access.cc cfg_db_access.h @@ -246,6 +247,7 @@ libkea_dhcpsrv_include_HEADERS = \ alloc_engine_log.h \ assignable_network.h \ base_host_data_source.h \ + cache_host_data_source.h \ callout_handle_store.h \ cfg_4o6.h \ cfg_db_access.h \ diff --git a/src/lib/dhcpsrv/cache_host_data_source.h b/src/lib/dhcpsrv/cache_host_data_source.h new file mode 100644 index 0000000000..d6d84bc38a --- /dev/null +++ b/src/lib/dhcpsrv/cache_host_data_source.h @@ -0,0 +1,64 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the End User License +// Agreement. See COPYING file in the premium/ directory. + +#ifndef CACHE_HOST_DATA_SOURCE_H +#define CACHE_HOST_DATA_SOURCE_H + +#include + +namespace isc { +namespace dhcp { + +/// @brief Abstract interface extending base simple data source for host +/// reservations to host cache. +/// Only the insert() method is required to use the cache. +class CacheHostDataSource : public BaseHostDataSource { +public: + + /// @brief Default destructor implementation. + virtual ~CacheHostDataSource() { } + + /// @brief Insert a host into the cache. + /// + /// Does the same than @c add() but with a different purpose. + /// + /// @param host Pointer to the new @c Host object being inserted. + /// @param[in,out] overwrite -1 if accepting conflicts, 0 if removing + /// conflicting entries, set to the number of removed entries. + /// @return true when succeeded. + virtual bool insert(const ConstHostPtr& host, int& overwrite) = 0; + + /// @brief Remove a host from the cache. + /// + /// Does the same than @c del, @c del4 or @c del6 but with + /// a more uniform interface and a different purpose. + /// + /// @param host Pointer to the existing @c Host object being removed. + /// @return true when found and removed. + virtual bool remove(const HostPtr& host) = 0; + + /// @brief Flush entries. + /// + /// @param count number of entries to remove, 0 means all. + virtual void flush(size_t count) = 0; + + /// @brief Return the number of entries. + /// + /// @return the current number of active entries in the cache. + virtual size_t size() const = 0; + + /// @brief Return the maximum number of entries. + /// + /// @return the maximum number of entries, 0 means unbound. + virtual size_t capacity() const = 0; +}; + +/// @brief CacheHostDataSource pointer. +typedef boost::shared_ptr CacheHostDataSourcePtr; + +} // end of namespace isc::dhcp +} // end of namespace isc + +#endif // CACHE_HOST_DATA_SOURCE_H diff --git a/src/lib/dhcpsrv/cfg_db_access.cc b/src/lib/dhcpsrv/cfg_db_access.cc index ad6c396587..2163f1ec96 100644 --- a/src/lib/dhcpsrv/cfg_db_access.cc +++ b/src/lib/dhcpsrv/cfg_db_access.cc @@ -60,6 +60,9 @@ CfgDbAccess::createManagers() const { it != host_db_access_list.end(); ++it) { HostMgr::addSource(*it); } + + // Check for a host cache. + HostMgr::checkCacheSource(); } std::string diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index 1cb45c2ddb..c776d90444 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -64,6 +64,24 @@ HostMgr::getHostDataSource() const { return (alternate_sources_[0]); } +bool +HostMgr::checkCacheSource() { + if (getHostMgrPtr()->cache_ptr_) { + return (true); + } + HostDataSourceList& sources = getHostMgrPtr()->alternate_sources_; + if (sources.empty()) { + return (false); + } + CacheHostDataSourcePtr cache_ptr = + boost::dynamic_pointer_cast(sources[0]); + if (cache_ptr) { + getHostMgrPtr()->cache_ptr_ = cache_ptr; + return (true); + } + return (false); +} + HostMgr& HostMgr::instance() { boost::scoped_ptr& host_mgr_ptr = getHostMgrPtr(); @@ -132,6 +150,9 @@ HostMgr::get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr, if (!host && hwaddr) { host = (*it)->get4(subnet_id, hwaddr, DuidPtr()); } + if (host && cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } } if (host && host->getNegative()) { return (ConstHostPtr()); @@ -171,6 +192,9 @@ HostMgr::get4Any(const SubnetID& subnet_id, .arg((*it)->getType()) .arg(host->toText()); + if (cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } return (host); } } @@ -179,6 +203,10 @@ HostMgr::get4Any(const SubnetID& subnet_id, .arg(subnet_id) .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, identifier_len)); + if (negative_caching_) { + cacheNegative(subnet_id, SubnetID(0), + identifier_type, identifier_begin, identifier_len); + } return (host); } @@ -209,6 +237,9 @@ HostMgr::get4(const SubnetID& subnet_id, for (auto it = alternate_sources_.begin(); !host && it != alternate_sources_.end(); ++it) { host = (*it)->get4(subnet_id, address); + if (host && cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } } if (host && host->getNegative()) { return (ConstHostPtr()); @@ -238,6 +269,9 @@ HostMgr::get6(const SubnetID& subnet_id, const DuidPtr& duid, if (!host && hwaddr) { host = (*it)->get6(subnet_id, DuidPtr(), hwaddr); } + if (host && cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } } if (host && host->getNegative()) { return (ConstHostPtr()); @@ -258,6 +292,9 @@ HostMgr::get6(const IOAddress& prefix, const uint8_t prefix_len) const { for (auto it = alternate_sources_.begin(); !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(prefix, prefix_len); + if (host && cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } } if (host && host->getNegative()) { return (ConstHostPtr()); @@ -298,6 +335,9 @@ HostMgr::get6Any(const SubnetID& subnet_id, .arg((*it)->getType()) .arg(host->toText()); + if (cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } return (host); } } @@ -308,6 +348,11 @@ HostMgr::get6Any(const SubnetID& subnet_id, .arg(Host::getIdentifierAsText(identifier_type, identifier_begin, identifier_len)); + if (negative_caching_) { + cacheNegative(SubnetID(0), subnet_id, + identifier_type, identifier_begin, identifier_len); + } + return (host); } @@ -338,6 +383,9 @@ HostMgr::get6(const SubnetID& subnet_id, for (auto it = alternate_sources_.begin(); !host && it != alternate_sources_.end(); ++it) { host = (*it)->get6(subnet_id, addr); + if (host && cache_ptr_ && (it != alternate_sources_.begin())) { + cache(host); + } } if (host && host->getNegative()) { return (ConstHostPtr()); @@ -413,5 +461,34 @@ HostMgr::del6(const SubnetID& subnet_id, const Host::IdentifierType& identifier_ return (false); } +void +HostMgr::cache(ConstHostPtr host) const { + if (cache_ptr_) { + // Replace any existing value. + int overwrite = 0; + // Don't check the result as it does not matter? + cache_ptr_->insert(host, overwrite); + } +} + +void +HostMgr::cacheNegative(const SubnetID& ipv4_subnet_id, + const SubnetID& ipv6_subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const { + if (cache_ptr_ && negative_caching_) { + HostPtr host(new Host(identifier_begin, identifier_len, + identifier_type, + ipv4_subnet_id, ipv6_subnet_id, + IOAddress::IPV4_ZERO_ADDRESS())); + host->setNegative(true); + // Don't replace any existing value. + int overwrite = -1; + // nor matter if it fails. + cache_ptr_->insert(host, overwrite); + } +} + } // end of isc::dhcp namespace } // end of isc namespace diff --git a/src/lib/dhcpsrv/host_mgr.h b/src/lib/dhcpsrv/host_mgr.h index fa003ac22d..e7392172cf 100644 --- a/src/lib/dhcpsrv/host_mgr.h +++ b/src/lib/dhcpsrv/host_mgr.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -81,6 +82,12 @@ public: /// @brief Delete all alternate host data source. static void delAllSources(); + /// @brief Check for the cache host data source. + /// + /// Checks if the first host data source implements + /// the cache abstract class and sets cache_ptr_. + static bool checkCacheSource(); + /// @brief Returns a sole instance of the @c HostMgr. /// /// This method should be used to retrieve an instance of the @c HostMgr @@ -308,44 +315,6 @@ public: /// @return true if addition was successful. virtual bool add(const HostPtr& host); - /// @brief Return backend type - /// - /// Returns the type of the backend (e.g. "mysql", "memfile" etc.) - /// - /// @return Type of the backend. - virtual std::string getType() const { - return (std::string("host_mgr")); - } - - /// @brief Returns the host data source list. - /// - /// @return reference to the host data source list. - HostDataSourceList& getHostDataSourceList() { - return (alternate_sources_); - } - - /// @brief Returns the fist host data source. - /// - /// May return NULL if the host data source list is empty. - /// @return pointer to the first host data source (or NULL) - HostDataSourcePtr getHostDataSource() const; - - /// @brief Sets alternate host data source list. - /// - /// Note: This should be used only for testing. Do not use - /// in production. Normal control flow assumes that - /// HostMgr::create() and HostMgr::add() is called and it instantiates - /// appropriate host data sources. However, some tests - /// (e.g. host_cmds) implement their own very simple - /// data source. It's not production ready by any means, - /// so it does not belong in host_data_source_factory.cc. - /// The testing nature of this method is reflected in its name. - /// - /// @param sources new source list to be set - void setTestHostDataSourceList(const HostDataSourceList& sources) { - alternate_sources_ = sources; - } - /// @brief Attempts to delete a host by address. /// /// This method supports both v4 and v6. @@ -383,14 +352,77 @@ public: del6(const SubnetID& subnet_id, const Host::IdentifierType& identifier_type, const uint8_t* identifier_begin, const size_t identifier_len); + /// @brief Return backend type + /// + /// Returns the type of the backend (e.g. "mysql", "memfile" etc.) + /// + /// @return Type of the backend. + virtual std::string getType() const { + return (std::string("host_mgr")); + } + + /// @brief Returns the host data source list. + /// + /// @return reference to the host data source list. + HostDataSourceList& getHostDataSourceList() { + return (alternate_sources_); + } + + /// @brief Returns the first host data source. + /// + /// May return NULL if the host data source list is empty. + /// @return pointer to the first host data source (or NULL). + HostDataSourcePtr getHostDataSource() const; + + /// @brief Returns the negative caching flag. + /// + /// @return the negative caching flag. + bool getNegativeCaching() const { + return (negative_caching_); + } + + /// @brief Sets the negative caching flag. + /// + void setNegativeCaching(bool negative_caching) { + negative_caching_ = negative_caching; + } + +protected: + /// @brief The negative caching flag. + /// + /// When true and the first data source is a cache negative answers + /// to get[46] for aubnet and identifier are cached. + bool negative_caching_; + + /// @brief Cache an answer. + /// + /// @param host Pointer to the missied host. + virtual void cache(ConstHostPtr host) const; + + /// @brief Cache a negative answer. + /// + /// @param ipv4_subnet_id Identifier of the IPv4 subnet. + /// @param ipv6_subnet_id Identifier of the IPv6 subnet. + /// @param identifier_type Identifier type. + /// @param identifier_begin Pointer to a beginning of the Identifier. + /// @param identifier_len Identifier length. + virtual void cacheNegative(const SubnetID& ipv4_subnet_id, + const SubnetID& ipv6_subnet_id, + const Host::IdentifierType& identifier_type, + const uint8_t* identifier_begin, + const size_t identifier_len) const; + private: /// @brief Private default constructor. - HostMgr() { } + HostMgr() : negative_caching_(false) { } /// @brief List of alternate host data sources. HostDataSourceList alternate_sources_; + /// @brief Pointer to the cache. + CacheHostDataSourcePtr cache_ptr_; + /// @brief Returns a pointer to the currently used instance of the /// @c HostMgr. static boost::scoped_ptr& getHostMgrPtr(); From 48088cdb7c61fc584a11e944d61f46098e7356c4 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Fri, 23 Feb 2018 22:43:15 +0100 Subject: [PATCH 18/18] [5533] Prepared rebase before adding tests --- premium | 2 +- src/lib/dhcpsrv/cache_host_data_source.h | 2 +- src/lib/dhcpsrv/cfg_db_access.cc | 2 +- src/lib/dhcpsrv/host_mgr.cc | 6 +++++- src/lib/dhcpsrv/host_mgr.h | 5 ++++- src/lib/dhcpsrv/hosts_messages.mes | 4 ++++ src/lib/dhcpsrv/testutils/memory_host_data_source.h | 2 +- 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/premium b/premium index 16181d80e3..7eae81e92f 160000 --- a/premium +++ b/premium @@ -1 +1 @@ -Subproject commit 16181d80e33bab062dcd22c523be3676659a38cc +Subproject commit 7eae81e92f9ea28349f0c933a5123c20483bc078 diff --git a/src/lib/dhcpsrv/cache_host_data_source.h b/src/lib/dhcpsrv/cache_host_data_source.h index d6d84bc38a..3b82fcba7b 100644 --- a/src/lib/dhcpsrv/cache_host_data_source.h +++ b/src/lib/dhcpsrv/cache_host_data_source.h @@ -14,7 +14,7 @@ namespace dhcp { /// @brief Abstract interface extending base simple data source for host /// reservations to host cache. /// Only the insert() method is required to use the cache. -class CacheHostDataSource : public BaseHostDataSource { +class CacheHostDataSource : public virtual BaseHostDataSource { public: /// @brief Default destructor implementation. diff --git a/src/lib/dhcpsrv/cfg_db_access.cc b/src/lib/dhcpsrv/cfg_db_access.cc index 2163f1ec96..ff31f16a2a 100644 --- a/src/lib/dhcpsrv/cfg_db_access.cc +++ b/src/lib/dhcpsrv/cfg_db_access.cc @@ -62,7 +62,7 @@ CfgDbAccess::createManagers() const { } // Check for a host cache. - HostMgr::checkCacheSource(); + HostMgr::checkCacheSource(true); } std::string diff --git a/src/lib/dhcpsrv/host_mgr.cc b/src/lib/dhcpsrv/host_mgr.cc index c776d90444..e08b1288f8 100644 --- a/src/lib/dhcpsrv/host_mgr.cc +++ b/src/lib/dhcpsrv/host_mgr.cc @@ -65,7 +65,7 @@ HostMgr::getHostDataSource() const { } bool -HostMgr::checkCacheSource() { +HostMgr::checkCacheSource(bool logging) { if (getHostMgrPtr()->cache_ptr_) { return (true); } @@ -77,6 +77,10 @@ HostMgr::checkCacheSource() { boost::dynamic_pointer_cast(sources[0]); if (cache_ptr) { getHostMgrPtr()->cache_ptr_ = cache_ptr; + if (logging) { + LOG_INFO(hosts_logger, HOSTS_CFG_CACHE_HOST_DATA_SOURCE) + .arg(cache_ptr->getType()); + } return (true); } return (false); diff --git a/src/lib/dhcpsrv/host_mgr.h b/src/lib/dhcpsrv/host_mgr.h index e7392172cf..1e7110adb3 100644 --- a/src/lib/dhcpsrv/host_mgr.h +++ b/src/lib/dhcpsrv/host_mgr.h @@ -86,7 +86,10 @@ public: /// /// Checks if the first host data source implements /// the cache abstract class and sets cache_ptr_. - static bool checkCacheSource(); + /// + /// @param logging When true (not the default) emit an informational log. + /// @return true if the first host data source is a cache. + static bool checkCacheSource(bool logging = false); /// @brief Returns a sole instance of the @c HostMgr. /// diff --git a/src/lib/dhcpsrv/hosts_messages.mes b/src/lib/dhcpsrv/hosts_messages.mes index d47c582623..f939c115d0 100644 --- a/src/lib/dhcpsrv/hosts_messages.mes +++ b/src/lib/dhcpsrv/hosts_messages.mes @@ -11,6 +11,10 @@ This debug message is issued when new host (with reservations) is added to the server's configuration. The argument describes the host and its reservations in detail. +% HOSTS_CFG_CACHE_HOST_DATA_SOURCE get host cache data source: %1 +This informational message is issued when a host cache data source is +detected by the host manager. + % HOSTS_CFG_CLOSE_HOST_DATA_SOURCE Closing host data source: %1 This is a normal message being printed when the server closes host data source connection. diff --git a/src/lib/dhcpsrv/testutils/memory_host_data_source.h b/src/lib/dhcpsrv/testutils/memory_host_data_source.h index 648a9b99de..80736c5323 100644 --- a/src/lib/dhcpsrv/testutils/memory_host_data_source.h +++ b/src/lib/dhcpsrv/testutils/memory_host_data_source.h @@ -21,7 +21,7 @@ namespace test { /// It used vector as a storage and iterates through all hosts when /// conducting operations. Most operations are skeleton methods that don't /// work, just several are implemented. Those are used in the tests. -class MemHostDataSource : public BaseHostDataSource { +class MemHostDataSource : public virtual BaseHostDataSource { public: /// @brief Destructor.