diff options
Diffstat (limited to 'src/lib/dhcpsrv/parsers/client_class_def_parser.h')
-rw-r--r-- | src/lib/dhcpsrv/parsers/client_class_def_parser.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/parsers/client_class_def_parser.h b/src/lib/dhcpsrv/parsers/client_class_def_parser.h new file mode 100644 index 0000000..060ab10 --- /dev/null +++ b/src/lib/dhcpsrv/parsers/client_class_def_parser.h @@ -0,0 +1,174 @@ +// Copyright (C) 2015-2021 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 CLIENT_CLASS_DEF_PARSER_H +#define CLIENT_CLASS_DEF_PARSER_H + +#include <cc/data.h> +#include <cc/simple_parser.h> +#include <eval/eval_context.h> +#include <dhcpsrv/client_class_def.h> +#include <dhcpsrv/parsers/option_data_parser.h> +#include <functional> +#include <list> + +/// @file client_class_def_parser.h +/// +/// @brief Parsers for client class definitions +/// +/// These parsers are used to parse lists of client class definitions +/// into a ClientClassDictionary of ClientClassDef instances. Each +/// ClientClassDef consists of (at least) a name, an expression, option-def +/// and option-data. Currently only a not empty name is required. +/// +/// There parsers defined are: +/// +/// ClientClassDefListParser - creates a ClientClassDictionary from a list +/// of element maps, where each map contains the entries that specify a +/// single class. The names of the classes in the are expected to be +/// unique. Attempting to define a duplicate class will result in an +/// DhcpConfigError throw. At the end the dictionary is stored by the CfgMgr. +/// +/// ClientClassDefParser - creates a ClientClassDefinition from an element +/// map. The elements are as follows: +/// +/// -# "name" - a string containing the name of the class +/// +/// -# "test" - a string containing the logical expression used to determine +/// membership in the class. This is passed into the eval parser. +/// +/// -# "option-def" - a list which defines the options which processing +/// is deferred. This element is optional and parsed using the @ref +/// isc::dhcp::OptionDefParser. A check is done to verify definitions +/// are only for deferred processing option (DHCPv4 43 and 224-254). +/// +/// -# "option-data" - a list which defines the options that should be +/// assigned to remembers of the class. This element is optional and parsed +/// using the @ref isc::dhcp::OptionDataListParser. +/// +/// ExpressionParser - creates an eval::Expression from a string element, +/// using the Eval Parser. +/// +namespace isc { +namespace dhcp { + +/// @brief Parser for a logical expression +/// +/// This parser creates an instance of an Expression from a string. The +/// string is passed to the Eval Parser and the resultant Expression is +/// stored into the ExpressionPtr reference passed into the constructor. +class ExpressionParser : public isc::data::SimpleParser { +public: + + /// @brief Parses an expression configuration element into an Expression + /// + /// @param expression variable in which to store the new expression + /// @param expression_cfg the configuration entry to be parsed. + /// @param family the address family of the expression. + /// @param check_defined a closure to check if a client class is defined. + /// + /// @throw DhcpConfigError if parsing was unsuccessful. + void parse(ExpressionPtr& expression, + isc::data::ConstElementPtr expression_cfg, + uint16_t family, + isc::eval::EvalContext::CheckDefined check_defined = + isc::eval::EvalContext::acceptAll); +}; + +/// @brief Parser for a single client class definition. +/// +/// This parser creates an instance of a client class definition. +class ClientClassDefParser : public isc::data::SimpleParser { +public: + + /// @brief Virtual destructor. + virtual ~ClientClassDefParser() { + } + + /// @brief Parses an entry that describes single client class definition. + /// + /// Attempts to add the new class directly into the given dictionary. + /// This done here to detect duplicate classes prior to commit(). + /// @param class_dictionary dictionary into which the class should be added + /// @param client_class_def a configuration entry to be parsed. + /// @param family the address family of the client class. + /// @param append_error_position Boolean flag indicating if position + /// of the parsed string within parsed JSON should be appended. The + /// default setting is to append it, but it is typically set to false + /// when this parser is used by hooks libraries. + /// @param check_dependencies indicates if the parser should evaluate an + /// expression to see if the referenced client classes exist. + /// + /// @throw DhcpConfigError if parsing was unsuccessful. + void parse(ClientClassDictionaryPtr& class_dictionary, + isc::data::ConstElementPtr client_class_def, + uint16_t family, + bool append_error_position = true, + bool check_dependencies = true); + + /// @brief Iterates over class parameters and checks if they are supported. + /// + /// This method should be called by hooks libraries which do not use Bison + /// to validate class syntax prior to parsing the client class information. + /// + /// @param class_def_cfg class configuration entry. + /// @param family the address family of the client class. + /// + /// @throw DhcpConfigError if any of the parameters is not supported. + void checkParametersSupported(const isc::data::ConstElementPtr& class_def_cfg, + const uint16_t family); + +protected: + + /// @brief Returns an instance of the @c OptionDataListParser to + /// be used in parsing the option-data structure. + /// + /// This function can be overridden in the child classes to supply + /// a custom parser for option data. + /// + /// @param address_family @c AF_INET (for DHCPv4) or @c AF_INET6 (for DHCPv6). + /// @param cfg_option_def structure holding option definitions. + /// + /// @return an instance of the @c OptionDataListParser. + virtual boost::shared_ptr<OptionDataListParser> + createOptionDataListParser(const uint16_t address_family, + CfgOptionDefPtr cfg_option_def) const; +}; + +/// @brief Defines a pointer to a ClientClassDefParser +typedef boost::shared_ptr<ClientClassDefParser> ClientClassDefParserPtr; + +/// @brief Parser for a list of client class definitions. +/// +/// This parser iterates over all configuration entries that define +/// client classes and creates ClientClassDef instances for each. +/// When the parsing successfully completes, the collection of +/// created definitions is given to the CfgMgr. +class ClientClassDefListParser : public isc::data::SimpleParser { +public: + + /// @brief Parse configuration entries. + /// + /// This function parses configuration entries, creates instances + /// of client class definitions and tries to adds them to the + /// local dictionary. At the end the dictionary is returned. + /// + /// @param class_def_list pointer to an element that holds entries + /// for client class definitions. + /// @param family the address family of the client class definitions. + /// @param check_dependencies indicates if the parser should evaluate an + /// expression to see if the referenced client classes exist. + /// @return a pointer to the filled dictionary + /// @throw DhcpConfigError if configuration parsing fails. + ClientClassDictionaryPtr + parse(isc::data::ConstElementPtr class_def_list, uint16_t family, + bool check_dependencies = true); +}; + +} // end of namespace isc::dhcp +} // end of namespace isc + +#endif // CLIENT_CLASS_DEF_PARSER_H |