diff options
Diffstat (limited to 'src/lib/dhcpsrv/cfg_option_def.h')
-rw-r--r-- | src/lib/dhcpsrv/cfg_option_def.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/cfg_option_def.h b/src/lib/dhcpsrv/cfg_option_def.h new file mode 100644 index 0000000..3aa4e9f --- /dev/null +++ b/src/lib/dhcpsrv/cfg_option_def.h @@ -0,0 +1,196 @@ +// Copyright (C) 2014-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 CFG_OPTION_DEF_H +#define CFG_OPTION_DEF_H + +#include <dhcp/option_definition.h> +#include <dhcp/option_space_container.h> +#include <cc/cfg_to_element.h> +#include <string> + +namespace isc { +namespace dhcp { + +/// @brief Represents option definitions used by the DHCP server. +/// +/// This class provides methods to add and retrieve option definitions +/// specified by the administrator for the DHCP server. Option definitions +/// specify formats of the options. This class doesn't hold information +/// about the data being carried by the options. +/// +/// Option definitions are grouped by option spaces. The option space is +/// identified by the unique name which is specified as a string. The +/// following names: "dhcp4" and "dhcp6" are reserved, though. They are +/// names of option spaces used for standard top-level DHCPv4 and DHCPv6 +/// options respectively. +class CfgOptionDef : public isc::data::CfgToElement { +public: + + /// @brief Copies this configuration to a new configuration. + /// + /// This method copies the option definitions stores in the configuration + /// to an object passed as parameter. There are no shared objects or + /// pointers between the original object and a copy. + /// + /// @param [out] new_config An object to which the configuration will be + /// copied. + void copyTo(CfgOptionDef& new_config) const; + + /// @name Methods and operators used for comparing objects. + /// + //@{ + /// @brief Check if configuration is equal to other configuration. + /// + /// @param other An object holding configuration to compare to. + /// + /// @return true if configurations are equal, false otherwise. + bool equals(const CfgOptionDef& other) const; + + /// @brief Equality operator. + /// + /// @param other An object holding configuration to compare to. + /// + /// @return true if configurations are equal, false otherwise. + bool operator==(const CfgOptionDef& other) const { + return (equals(other)); + } + + /// @brief Inequality operator. + /// + /// @param other An object holding configuration to compare to. + /// + /// @return true if configurations are unequal, false otherwise. + bool operator!=(const CfgOptionDef& other) const { + return (!equals(other)); + } + + //@} + + /// @brief Add new option definition. + /// + /// @param def option definition to be added. + /// + /// @throw isc::dhcp::DuplicateOptionDefinition when the particular + /// option definition already exists. + /// @throw isc::dhcp::MalformedOptionDefinition when the pointer to + /// an option definition is NULL. + /// @throw isc::BadValue when the option space name is empty or + /// when trying to override the standard option (in dhcp4 or dhcp6 + /// option space). + void add(const OptionDefinitionPtr& def); + + /// @brief Return option definitions for particular option space. + /// + /// @param option_space option space. + /// + /// @return Pointer to the collection of option definitions for + /// the particular option space. The option collection is empty + /// if no option exists for the option space specified. + OptionDefContainerPtr getAll(const std::string& option_space) const; + + /// @brief Return option definition for a particular option space and code. + /// + /// @param option_space option space. + /// @param option_code option code. + /// + /// @return An option definition or NULL pointer if option definition + /// has not been found. + OptionDefinitionPtr get(const std::string& option_space, + const uint16_t option_code) const; + + /// @brief Return option definition for the particular option space and name. + /// + /// @param option_space option space. + /// @param option_name option name. + /// + /// @return An option definition or NULL pointer if option definition + /// has not been found. + OptionDefinitionPtr get(const std::string& option_space, + const std::string& option_name) const; + + /// @brief Deletes all option definitions having a given database id. + /// + /// Note that there are cases when there will be multiple option + /// definitions having the same id (typically id of 0). When + /// configuration backend is in use it sets the unique ids from the + /// database. In cases when the configuration backend is not used, + /// the ids default to 0. Passing the id of 0 would result in + /// deleting all option definitions that were not added via the + /// database. + /// + /// @param id Identifier of the option definitions to be deleted. + /// + /// @return Number of deleted option definitions. + uint64_t del(const uint64_t id); + + /// @brief Returns reference to container holding option definitions. + const OptionDefSpaceContainer& getContainer() const { + return (option_definitions_); + } + + /// @brief Unparse a configuration object + /// + /// @return a pointer to unparsed configuration + virtual isc::data::ElementPtr toElement() const; + + /// @brief Unparse a configuration object with optionally including + /// the metadata. + /// + /// @param include_metadata boolean value indicating if the metadata + /// should be included (if true) or not (if false). + /// + /// @return A pointer to the unparsed configuration. + isc::data::ElementPtr + toElementWithMetadata(const bool include_metadata) const; + + /// @brief Merges specified option definitions from a configuration + /// into this configuration. + /// + /// This method merges the option definitions from the @c other + /// configuration into this configuration. The merged set of + /// definitions is created as follows: + /// + /// Iterator over the definitions in each name space in this configuration: + /// If either the definition's name or code are defined in @c other + /// then skip over the definition otherwise add it to @c other. + /// + /// Replace this configuration's definitions with the definitions + /// in @c other using @c copyTo(). + /// + /// @param other option definitions to merge in. + /// + /// @warning The merge operation affects @c other. + /// Therefore, the caller must not rely on the data held in the @c other + /// object after the call to @c merge. Also, the data held in @c other must + /// not be modified after the call to @c merge because it may affect the + /// merged configuration. + void merge(CfgOptionDef& other); + +private: + + /// @brief A collection of option definitions. + /// + /// The option definitions stored in this container can be accessed + /// using the option space name they belong to. + OptionDefSpaceContainer option_definitions_; + +}; + +/// @name Pointers to the @c CfgOptionDef objects. +//@{ +/// @brief Non-const pointer. +typedef boost::shared_ptr<CfgOptionDef> CfgOptionDefPtr; + +/// @brief Const pointer. +typedef boost::shared_ptr<const CfgOptionDef> ConstCfgOptionDefPtr; + +//@} + +} +} + +#endif // CFG_OPTION_DEF_H |