123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- // Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
- //
- // Permission to use, copy, modify, and/or distribute this software for any
- // purpose with or without fee is hereby granted, provided that the above
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- #ifndef LIBDHCP_H
- #define LIBDHCP_H
- #include <dhcp/option_definition.h>
- #include <dhcp/option_space_container.h>
- #include <dhcp/pkt6.h>
- #include <util/buffer.h>
- #include <iostream>
- #include <string>
- namespace isc {
- namespace dhcp {
- class LibDHCP {
- public:
- /// Map of factory functions.
- typedef std::map<unsigned short, Option::Factory*> FactoryMap;
- /// @brief Return collection of option definitions.
- ///
- /// Method returns the collection of DHCP standard DHCP
- /// option definitions.
- /// @todo DHCPv4 option definitions are not implemented. For now
- /// this function will throw isc::NotImplemented in case of attempt
- /// to get option definitions for V4 universe.
- ///
- /// @param u universe of the options (V4 or V6).
- ///
- /// @return collection of option definitions.
- static const OptionDefContainer& getOptionDefs(const Option::Universe u);
- /// @brief Return the first option definition matching a
- /// particular option code.
- ///
- /// @param u universe (V4 or V6)
- /// @param code option code.
- ///
- /// @return reference to an option definition being requested
- /// or NULL pointer if option definition has not been found.
- static OptionDefinitionPtr getOptionDef(const Option::Universe u,
- const uint16_t code);
- /// @brief Return the definition of option having a specified name.
- ///
- /// @param u universe (v4 or V6)
- /// @param name Option name.
- ///
- /// @return Pointer to the option definition or NULL pointer if option
- /// definition has not been found.
- static OptionDefinitionPtr getOptionDef(const Option::Universe u,
- const std::string& name);
- /// @brief Returns vendor option definition for a given vendor-id and code
- ///
- /// @param u universe (V4 or V6)
- /// @param vendor_id enterprise-id for a given vendor
- /// @param code option code
- /// @return reference to an option definition being requested
- /// or NULL pointer if option definition has not been found.
- static OptionDefinitionPtr getVendorOptionDef(const Option::Universe u,
- const uint32_t vendor_id,
- const uint16_t code);
- /// @brief Returns vendor option definition for a given vendor-id and
- /// option name.
- ///
- /// @param u Universe (V4 or V6)
- /// @param vendor_id Enterprise-id for a given vendor
- /// @param name Option name.
- ///
- /// @return A pointer to an option definition or NULL pointer if
- /// no option definition found.
- static OptionDefinitionPtr getVendorOptionDef(const Option::Universe u,
- const uint32_t vendor_id,
- const std::string& name);
- /// @brief Returns runtime (non-standard) option definition by space and
- /// option code.
- ///
- /// @param space Option space name.
- /// @param code Option code.
- ///
- /// @return Pointer to option definition or NULL if it doesn't exist.
- static OptionDefinitionPtr getRuntimeOptionDef(const std::string& space,
- const uint16_t code);
- /// @brief Returns runtime (non-standard) option definition by space and
- /// option name.
- ///
- /// @param space Option space name.
- /// @param name Option name.
- ///
- /// @return Pointer to option definition or NULL if it doesn't exist.
- static OptionDefinitionPtr getRuntimeOptionDef(const std::string& space,
- const std::string& name);
- /// @brief Returns runtime (non-standard) option definitions for specified
- /// option space name.
- ///
- /// @param space Option space name.
- ///
- /// @return Pointer to the container holding option definitions or NULL.
- static OptionDefContainerPtr
- getRuntimeOptionDefs(const std::string& space);
- /// @brief Check if the specified option is a standard option.
- ///
- /// @param u universe (V4 or V6)
- /// @param code option code.
- ///
- /// @return true if the specified option is a standard option.
- /// @todo We already create option definitions for the subset if
- /// standard options. We are aiming that this function checks
- /// the presence of the standard option definition and if it finds
- /// it, then the true value is returned. However, at this point
- /// this is not doable because some of the definitions (for less
- /// important options) are not created yet.
- static bool isStandardOption(const Option::Universe u,
- const uint16_t code);
- /// @brief Factory function to create instance of option.
- ///
- /// Factory method creates instance of specified option. The option
- /// to be created has to have corresponding factory function
- /// registered with \ref LibDHCP::OptionFactoryRegister.
- ///
- /// @param u universe of the option (V4 or V6)
- /// @param type option-type
- /// @param buf option-buffer
- ///
- /// @return instance of option.
- ///
- /// @throw isc::InvalidOperation if there is no factory function registered
- /// for the specified option type.
- static isc::dhcp::OptionPtr optionFactory(isc::dhcp::Option::Universe u,
- uint16_t type,
- const OptionBuffer& buf);
- /// @brief Stores options in a buffer.
- ///
- /// Stores all options defined in options containers in a on-wire
- /// format in output buffer specified by buf.
- ///
- /// May throw different exceptions if option assembly fails. There
- /// may be different reasons (option too large, option malformed,
- /// too many options etc.)
- ///
- /// @param buf output buffer (assembled options will be stored here)
- /// @param options collection of options to store to
- static void packOptions(isc::util::OutputBuffer& buf,
- const isc::dhcp::OptionCollection& options);
- /// @brief Parses provided buffer as DHCPv6 options and creates
- /// Option objects.
- ///
- /// Parses provided buffer and stores created Option objects in
- /// options container. The last two parameters are optional and
- /// are used in relay parsing. If they are specified, relay-msg
- /// option is not created, but rather those two parameters are
- /// specified to point out where the relay-msg option resides and
- /// what is its length. This is a performance optimization that
- /// avoids unnecessary copying of potentially large relay-msg
- /// option. It is not used for anything, except in the next
- /// iteration its content will be treated as buffer to be parsed.
- ///
- /// @param buf Buffer to be parsed.
- /// @param option_space A name of the option space which holds definitions
- /// to be used to parse options in the packets.
- /// @param options Reference to option container. Options will be
- /// put here.
- /// @param relay_msg_offset reference to a size_t structure. If specified,
- /// offset to beginning of relay_msg option will be stored in it.
- /// @param relay_msg_len reference to a size_t structure. If specified,
- /// length of the relay_msg option will be stored in it.
- /// @return offset to the first byte after the last successfully
- /// parsed option
- ///
- /// @note This function throws when an option type is defined more
- /// than once, and it calls option building routines which can throw.
- /// Partial parsing does not throw: it is the responsibility of the
- /// caller to handle this condition.
- static size_t unpackOptions6(const OptionBuffer& buf,
- const std::string& option_space,
- isc::dhcp::OptionCollection& options,
- size_t* relay_msg_offset = 0,
- size_t* relay_msg_len = 0);
- /// @brief Parses provided buffer as DHCPv4 options and creates
- /// Option objects.
- ///
- /// Parses provided buffer and stores created Option objects
- /// in options container.
- ///
- /// @param buf Buffer to be parsed.
- /// @param option_space A name of the option space which holds definitions
- /// to be used to parse options in the packets.
- /// @param options Reference to option container. Options will be
- /// put here.
- /// @return offset to the first byte after the last successfully
- /// parsed option or the offset of the DHO_END option type.
- ///
- /// The unpackOptions6 note applies too.
- static size_t unpackOptions4(const OptionBuffer& buf,
- const std::string& option_space,
- isc::dhcp::OptionCollection& options);
- /// Registers factory method that produces options of specific option types.
- ///
- /// @throw isc::BadValue if provided the type is already registered, has
- /// too large a value or an invalid universe is specified.
- ///
- /// @param u universe of the option (V4 or V6)
- /// @param type option-type
- /// @param factory function pointer
- static void OptionFactoryRegister(Option::Universe u,
- uint16_t type,
- Option::Factory * factory);
- /// @brief Returns v4 option definitions for a given vendor
- ///
- /// @param vendor_id enterprise-id of a given vendor
- /// @return a container for a given vendor (or NULL if not option
- /// definitions are defined)
- static const OptionDefContainer*
- getVendorOption4Defs(const uint32_t vendor_id);
- /// @brief Returns v6 option definitions for a given vendor
- ///
- /// @param vendor_id enterprise-id of a given vendor
- /// @return a container for a given vendor (or NULL if not option
- /// definitions are defined)
- static const OptionDefContainer*
- getVendorOption6Defs(const uint32_t vendor_id);
- /// @brief Parses provided buffer as DHCPv6 vendor options and creates
- /// Option objects.
- ///
- /// Parses provided buffer and stores created Option objects
- /// in options container.
- ///
- /// @param vendor_id enterprise-id of the vendor
- /// @param buf Buffer to be parsed.
- /// @param options Reference to option container. Suboptions will be
- /// put here.
- /// @return offset to the first byte after the last successfully
- /// parsed suboption
- ///
- /// @note unpackVendorOptions6 throws when it fails to parse a suboption
- /// so the return value is currently always the buffer length.
- static size_t unpackVendorOptions6(const uint32_t vendor_id,
- const OptionBuffer& buf,
- isc::dhcp::OptionCollection& options);
- /// @brief Parses provided buffer as DHCPv4 vendor options and creates
- /// Option objects.
- ///
- /// Parses provided buffer and stores created Option objects
- /// in options container.
- ///
- /// @param vendor_id enterprise-id of the vendor
- /// @param buf Buffer to be parsed.
- /// @param options Reference to option container. Suboptions will be
- /// put here.
- /// @return offset to the first byte after the last successfully
- /// parsed suboption
- ///
- /// The unpackVendorOptions6 note applies
- static size_t unpackVendorOptions4(const uint32_t vendor_id,
- const OptionBuffer& buf,
- isc::dhcp::OptionCollection& options);
- /// @brief Copies option definitions created at runtime.
- ///
- /// Copied option definitions will be used as "runtime" option definitions.
- /// A typical use case is to set option definitions specified by the user
- /// in the server configuration. These option definitions should be removed
- /// or replaced with new option definitions upon reconfiguration.
- ///
- /// @param defs Const reference to a container holding option definitions
- /// grouped by option spaces.
- static void setRuntimeOptionDefs(const OptionDefSpaceContainer& defs);
- /// @brief Removes runtime option definitions.
- static void clearRuntimeOptionDefs();
- private:
- /// Initialize standard DHCPv4 option definitions.
- ///
- /// The method creates option definitions for all DHCPv4 options.
- /// Currently this function is not implemented.
- ///
- /// @throw std::bad alloc if system went out of memory.
- /// @throw MalformedOptionDefinition if any of the definitions
- /// are incorrect. This is programming error.
- static void initStdOptionDefs4();
- /// Initialize standard DHCPv6 option definitions.
- ///
- /// The method creates option definitions for all DHCPv6 options.
- ///
- /// @throw std::bad_alloc if system went out of memory.
- /// @throw MalformedOptionDefinition if any of the definitions
- /// is incorrect. This is a programming error.
- static void initStdOptionDefs6();
- static void initVendorOptsDocsis4();
- static void initVendorOptsDocsis6();
- /// Initialize private DHCPv6 option definitions.
- static void initVendorOptsIsc6();
- /// pointers to factories that produce DHCPv6 options
- static FactoryMap v4factories_;
- /// pointers to factories that produce DHCPv6 options
- static FactoryMap v6factories_;
- /// Container with DHCPv4 option definitions.
- static OptionDefContainer v4option_defs_;
- /// Container with DHCPv6 option definitions.
- static OptionDefContainer v6option_defs_;
- /// Container for v4 vendor option definitions
- static VendorOptionDefContainers vendor4_defs_;
- /// Container for v6 vendor option definitions
- static VendorOptionDefContainers vendor6_defs_;
- /// Container for additional option defnitions created in runtime.
- static OptionDefSpaceContainer runtime_option_defs_;
- };
- }
- }
- #endif // LIBDHCP_H
|