diff options
Diffstat (limited to 'src/lib/yang/adaptor_option.h')
-rw-r--r-- | src/lib/yang/adaptor_option.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/lib/yang/adaptor_option.h b/src/lib/yang/adaptor_option.h new file mode 100644 index 0000000..a3842c7 --- /dev/null +++ b/src/lib/yang/adaptor_option.h @@ -0,0 +1,111 @@ +// Copyright (C) 2018-2022 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 ISC_ADAPTOR_OPTION_H +#define ISC_ADAPTOR_OPTION_H 1 + +#include <yang/adaptor.h> +#include <map> +#include <list> + +namespace isc { + +namespace dhcp { +/// @brief Forward declaration of option definition parameters. +struct OptionDefParams; +}; + +namespace yang { + +/// @brief Map for DHCP option definitions handling code and +/// an index built from space and name. +/// +/// The map is used to store space+name to code mappings so for +/// an option data without a code entry the code entry can be supplied. +typedef std::map<std::string, uint16_t> OptionCodes; + +/// @brief JSON adaptor for option data or definition setting defaults. +/// +/// Both option data and option definition lists are keyed by the code +/// and space pair so both must be available in setOptionXXX methods. +/// For space there is an implicit default so setSpace must be called +/// to add this default to option entries without space. +/// Note remaining adaptors assume this was done first. +/// +/// checkCode and checkType can be used to check if code or type is present +/// (type is mandatory in option definitions). +/// +/// A missing code can be found in standard definitions (loaded by initCodes) +/// or in configuration option definitions (at global and client classes +/// scopes). setCode uses the space+name to code map to set missing codes +/// and raises an error when it can't. +class AdaptorOption { +public: + + /// @brief Constructor. + AdaptorOption(); + + /// @brief Destructor. + virtual ~AdaptorOption(); + + /// @brief Set space. + /// + /// @param option The option. + /// @param space The default space name. + static void setSpace(isc::data::ElementPtr option, + const std::string& space); + + /// @brief Checks if type is specified in option definition. + /// + /// @param option The option. + /// @throw MissingKey if the type is not present. + static void checkType(isc::data::ConstElementPtr option); + + /// @brief Check if code is specified in option defintion. + /// + /// @param option The option. + /// @throw MissingKey if the code is not present. + static void checkCode(isc::data::ConstElementPtr option); + + /// @brief Collect definition. + /// + /// This method looks at an option definition and adds the + /// space+name to code mapping into the OptionCodes codes store + /// aka definitions. + /// + /// @param option The option definition. + /// @param codes The reference to option definitions. + static void collect(isc::data::ConstElementPtr option, OptionCodes& codes); + + /// @brief Set code from name and definitions. + /// + /// @param option The option data. + /// @param codes Option definitions. + static void setCode(isc::data::ElementPtr option, + const OptionCodes& codes); + + /// @brief Initialize code map. + /// + /// @param codes The reference to option definitions. + /// @param space The space name. + static void initCodes(OptionCodes& codes, const std::string& space); + +protected: + /// @brief Initialize code map from option definition parameters. + /// + /// @param codes The reference to option definitions. + /// @param space The space name. + /// @param params Array of option definition parameters + /// @param params_size The size of the array. + static void initCodesInternal(OptionCodes& codes, const std::string& space, + const isc::dhcp::OptionDefParams* params, + size_t params_size); +}; + +} // end of namespace isc::yang +} // end of namespace isc + +#endif // ISC_ADAPTOR_OPTION_H |