%PDF- %PDF-
Direktori : /backups/router/usr/local/include/kea/dhcp/ |
Current File : //backups/router/usr/local/include/kea/dhcp/duid.h |
// Copyright (C) 2012-2024 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 DUID_H #define DUID_H #include <asiolink/io_address.h> #include <util/str.h> #include <cstdint> #include <iomanip> #include <vector> #include <boost/shared_ptr.hpp> #include <unistd.h> namespace isc { namespace dhcp { /// @brief Base type used to define a common smart pointer for all derived types. class IdentifierBaseType { protected: /// @brief Pure virtual destructor. /// /// This class can not be instantiated. virtual ~IdentifierBaseType() = 0; }; /// @brief Shared pointer to a IdentifierType typedef boost::shared_ptr<IdentifierBaseType> IdentifierBaseTypePtr; template<size_t min_size, size_t max_size> class IdentifierType : public IdentifierBaseType { public: /// @brief Constructor from vector /// /// @param data The data used to create the IdentifierType IdentifierType(const std::vector<uint8_t>& data) { if (data.size() < min_size) { isc_throw(isc::BadValue, "identifier is too short (" << data.size() << "), at least "<< min_size << " is required"); } if (data.size() > max_size) { isc_throw(isc::BadValue, "identifier is too large (" << data.size() << "), at most " << max_size << " is required"); } data_ = data; } /// @brief Constructor from array and array size /// /// @param data The data used to create the Identifier /// @param len The data len used to create the Identifier IdentifierType(const uint8_t* data, size_t len) { if (len < min_size) { isc_throw(isc::BadValue, "identifier is too short (" << len << "), at least "<< min_size << " is required"); } if (len > max_size) { isc_throw(isc::BadValue, "identifier is too large (" << len << "), at most " << max_size << " is required"); } data_ = std::vector<uint8_t>(data, data + len); } /// @brief Return the minimum size of the acceptable data. /// /// @return the minimum size of the acceptable data. static constexpr size_t getMinSize() { return (min_size); } /// @brief Return the maximum size of the acceptable data. /// /// @return the maximum size of the acceptable data. static constexpr size_t getMaxSize() { return (max_size); } /// @brief Returns textual representation of the identifier (e.g. 00:01:02:03:ff) /// /// @return textual representation of the identifier (e.g. 00:01:02:03:ff) std::string toText() const { std::stringstream tmp; tmp << std::hex; bool delim = false; for (auto const& data : data_) { if (delim) { tmp << ":"; } tmp << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(data); delim = true; } return (tmp.str()); } /// @brief This static function parses an Identifier specified in the /// textual format. /// /// @param text Identifier in the hexadecimal format with digits /// representing individual bytes separated by colons. /// @return The data resulted from parsing the textual format. static std::vector<uint8_t> fromText(const std::string& text) { std::vector<uint8_t> binary; util::str::decodeFormattedHexString(text, binary); return (binary); } /// @brief Compares two identifiers for equality /// /// @return True if the two identifiers are equal, false otherwise. bool operator==(const IdentifierType& other) const { return (data_ == other.data_); } /// @brief Compares two identifiers for inequality /// /// @return True if the two identifiers are different, false otherwise. bool operator!=(const IdentifierType& other) const { return (data_ != other.data_); } protected: /// @brief The actual content of the Identifier std::vector<uint8_t> data_; }; /// @brief Shared pointer to a DUID class DUID; typedef boost::shared_ptr<DUID> DuidPtr; /// @brief Holds DUID (DHCPv6 Unique Identifier) /// /// This class holds DUID, that is used in client-id, server-id and /// several other options. It is used to identify DHCPv6 entity. class DUID : public IdentifierType<3, 130> { public: /// @brief minimum duid size /// /// The minimal DUID size specified in RFC 8415, section 11.1 is 3: /// 2 fixed octets for the type + 1 minimum octet for the value. static constexpr size_t MIN_DUID_LEN = IdentifierType::getMinSize(); /// @brief maximum duid size /// /// The maximum DUID size specified in RFC 8415, section 11.1 is 130: /// 2 fixed octets for the type + 128 maximum octets for the value. static constexpr size_t MAX_DUID_LEN = IdentifierType::getMaxSize(); /// @brief specifies DUID type typedef enum { DUID_UNKNOWN = 0, ///< invalid/unknown type DUID_LLT = 1, ///< link-layer + time, see RFC3315, section 11.2 DUID_EN = 2, ///< enterprise-id, see RFC3315, section 11.3 DUID_LL = 3, ///< link-layer, see RFC3315, section 11.4 DUID_UUID = 4, ///< UUID, see RFC3315, section 11.5 DUID_MAX ///< not a real type, just maximum defined value + 1 } DUIDType; /// @brief Constructor from vector /// /// @param data The data used to create the DUID DUID(const std::vector<uint8_t>& data); /// @brief Constructor from array and array size /// /// @param data The data used to create the DUID /// @param len The data len used to create the DUID DUID(const uint8_t* data, size_t len); /// @brief Returns a const reference to the actual DUID value /// /// @warning Since this function returns a reference to the vector (not a /// copy) the returned object must be used with caution because it remains /// valid only for the time period when the object which returned it is /// valid. /// /// @return A reference to a vector holding a DUID. const std::vector<uint8_t>& getDuid() const; /// @brief Defines the constant "empty" DUID /// /// In general, empty DUID is not allowed. The only case where it is really /// valid is to designate declined IPv6 Leases. We have a broad assumption /// that the Lease->duid_ must always be set. However, declined lease /// doesn't have any DUID associated with it. Hence we need a way to /// indicate that fact. // /// @return reference to the static constant empty DUID static const DUID& EMPTY(); /// @brief Returns the DUID type DUIDType getType() const; /// @brief Create DUID from the textual format. /// /// This static function parses a DUID specified in the textual format. /// /// @param text DUID in the hexadecimal format with digits representing /// individual bytes separated by colons. /// /// @throw isc::BadValue if parsing the DUID failed. static DUID fromText(const std::string& text); }; /// @brief Forward declaration to the @c ClientId class. class ClientId; /// @brief Shared pointer to a Client ID. typedef boost::shared_ptr<ClientId> ClientIdPtr; /// @brief Holds Client identifier or client IPv4 address /// /// This class is intended to be a generic IPv4 client identifier. It can hold /// a client-id class ClientId : public IdentifierType<2, 255> { public: /// @brief Minimum size of a client ID /// /// Excerpt from RFC2132, section 9.14. /// The code for this option is 61, and its minimum length is 2. static constexpr size_t MIN_CLIENT_ID_LEN = IdentifierType::getMinSize(); /// @brief Maximum size of a client ID /// /// @note RFC 2131 does not specify an upper length of a client ID, but the /// byte used to specify the option size byte can only go up to 255. static constexpr size_t MAX_CLIENT_ID_LEN = IdentifierType::getMaxSize(); /// @brief Constructor based on vector<uint8_t> /// /// @param data The data used to create the ClientId ClientId(const std::vector<uint8_t>& data); /// @brief Constructor based on array and array size /// /// @param data The data used to create the ClientId /// @param len The data len used to create the ClientId ClientId(const uint8_t* data, size_t len); /// @brief Returns reference to the client-id data. /// /// @warning Since this function returns a reference to the vector (not a /// copy) the returned object must be used with caution because it remains /// valid only for the time period when the object which returned it is /// valid. /// /// @return A reference to a vector holding a client identifier. const std::vector<uint8_t>& getClientId() const; /// @brief Create client identifier from the textual format. /// /// This static function creates the instance of the @c ClientId from the /// textual format. /// /// @param text Client identifier in the textual format. /// /// @return Pointer to the instance of the @c ClientId. /// @throw isc::BadValue if parsing the client identifier failed. /// @throw isc::OutOfRange if the client identifier is truncated. static ClientIdPtr fromText(const std::string& text); }; } // namespace dhcp } // namespace isc #endif /* DUID_H */