diff options
Diffstat (limited to 'src/lib/dhcp/option6_pdexclude.h')
-rw-r--r-- | src/lib/dhcp/option6_pdexclude.h | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/lib/dhcp/option6_pdexclude.h b/src/lib/dhcp/option6_pdexclude.h new file mode 100644 index 0000000..bf409d8 --- /dev/null +++ b/src/lib/dhcp/option6_pdexclude.h @@ -0,0 +1,130 @@ +// Copyright (C) 2016-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 OPTION6_PDEXCLUDE_H +#define OPTION6_PDEXCLUDE_H + +#include <asiolink/io_address.h> +#include <dhcp/option.h> +#include <boost/shared_ptr.hpp> +#include <stdint.h> + +namespace isc { +namespace dhcp { + +/// @brief DHCPv6 option class representing Prefix Exclude Option (RFC 6603). +/// +/// This class represents DHCPv6 Prefix Exclude option (67). This option is +/// carried in the IA Prefix option and it conveys a single prefix which is +/// used by the delegating router to communicate with a requesting router on +/// the requesting router's uplink. This prefix is not used on the +/// requesting router's downlinks (is excluded from other delegated prefixes). +class Option6PDExclude: public Option { +public: + + /// @brief Constructor. + /// + /// @param delegated_prefix Delegated prefix. + /// @param delegated_prefix_length Delegated prefix length. + /// @param excluded_prefix Excluded prefix. + /// @param excluded_prefix_length Excluded prefix length. + /// + /// @throw BadValue if prefixes are invalid, if excluded prefix length + /// is not greater than delegated prefix length or if common parts of + /// prefixes does not match. + Option6PDExclude(const isc::asiolink::IOAddress& delegated_prefix, + const uint8_t delegated_prefix_length, + const isc::asiolink::IOAddress& excluded_prefix, + const uint8_t excluded_prefix_length); + + /// @brief Constructor, creates option instance from part of the buffer. + /// + /// This constructor is mostly used to parse Prefix Exclude options in the + /// received messages. + /// + /// @param begin Lower bound of the buffer to create option from. + /// @param end Upper bound of the buffer to create option from. + Option6PDExclude(OptionBufferConstIter begin, OptionBufferConstIter end); + + /// @brief Copies this option and returns a pointer to the copy. + virtual OptionPtr clone() const; + + /// @brief Writes option in wire-format to a buffer. + /// + /// Writes option in wire-format to buffer, returns pointer to first unused + /// byte after stored option (that is useful for writing options one after + /// another). + /// + /// The format of the option includes excluded prefix length specified as + /// a number of bits. It also includes IPv6 subnet ID field which is + /// computed from the delegated and excluded prefixes, according to the + /// section 4.2 of RFC 6603. + /// + /// @param [out] buf Pointer to a buffer. + /// @param check if set to false, allows options larger than 255 for v4 + virtual void pack(isc::util::OutputBuffer& buf, bool check = true) const; + + /// @brief Parses received buffer. + /// + /// @param begin iterator to first byte of option data + /// @param end iterator to end of option data (first byte after option end) + virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end); + + /// @brief Returns length of the complete option (data length + DHCPv6 + /// option header) + /// + /// @return length of the option + virtual uint16_t len() const; + + /// @brief Returns Prefix Exclude option in textual format. + /// + /// @param indent Number of spaces to be inserted before the text. + virtual std::string toText(int indent = 0) const; + + /// @brief Returns excluded prefix. + /// + /// Assembles excluded prefix from a delegated prefix and IPv6 subnet id + /// specified as in RFC6603, section 4.2. + /// + /// @param delegated_prefix Delegated prefix for which excluded prefix will + /// be returned. + /// @param delegated_prefix_length Delegated prefix length. + asiolink::IOAddress + getExcludedPrefix(const asiolink::IOAddress& delegated_prefix, + const uint8_t delegated_prefix_length) const; + + /// @brief Returns excluded prefix length. + uint8_t getExcludedPrefixLength() const { + return (excluded_prefix_length_); + } + + /// @brief Returns an excluded prefix in a binary format. + const std::vector<uint8_t>& getExcludedPrefixSubnetID() const { + return (subnet_id_); + } + +private: + + /// @brief Returns IPv6 subnet ID length in octets. + /// + /// The IPv6 subnet ID length is between 1 and 16 octets. + uint8_t getSubnetIDLength(const uint8_t delegated_prefix_length, + const uint8_t excluded_prefix_length) const; + + /// @brief Holds excluded prefix length. + uint8_t excluded_prefix_length_; + + /// @brief Subnet identifier as described in RFC6603, section 4.2. + std::vector<uint8_t> subnet_id_; +}; + +/// @brief Pointer to the @ref Option6PDExclude object. +typedef boost::shared_ptr<Option6PDExclude> Option6PDExcludePtr; + +} // isc::dhcp namespace +} // isc namespace + +#endif // OPTION6_PDEXCLUDE_H |