123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- // Copyright (C) 2014-2016 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 BASE_HOST_DATA_SOURCE_H
- #define BASE_HOST_DATA_SOURCE_H
- #include <asiolink/io_address.h>
- #include <dhcp/duid.h>
- #include <dhcp/hwaddr.h>
- #include <dhcpsrv/host.h>
- #include <exceptions/exceptions.h>
- #include <boost/shared_ptr.hpp>
- namespace isc {
- namespace dhcp {
- /// @brief Exception thrown when the duplicate @c Host object is detected.
- class DuplicateHost : public Exception {
- public:
- DuplicateHost(const char* file, size_t line, const char* what) :
- isc::Exception(file, line, what) { };
- };
- /// @brief Exception thrown when an address is already reserved by a @c Host
- /// object (DuplicateHost is same identity, ReservedAddress same address).
- class ReservedAddress : public Exception {
- public:
- ReservedAddress(const char* file, size_t line, const char* what) :
- isc::Exception(file, line, what) { };
- };
- /// @brief Exception thrown when invalid IP address has been specified for
- /// @c Host.
- class BadHostAddress : public isc::BadValue {
- public:
- BadHostAddress(const char* file, size_t line, const char* what) :
- isc::BadValue(file, line, what) { };
- };
- /// @brief Base interface for the classes implementing simple data source
- /// for host reservations.
- ///
- /// This abstract class defines an interface for the classes implementing
- /// basic data source for host reservations. This interface allows for
- /// adding new reservations (represented by @c Host objects) and retrieving
- /// these reservations using various parameters such as HW address or DUID,
- /// subnet identifier (either IPv4 or IPv6) or reserved IP address.
- ///
- /// This interface DOES NOT specify the methods to manage existing
- /// host reservations such as to remove one IPv6 reservation but leave
- /// other reservations. It also lacks the methods used for preparing
- /// the data to be added to the SQL database: commit, rollback etc.
- /// Such methods are declared in other interfaces.
- class BaseHostDataSource {
- public:
- /// @brief Specifies the type of an identifier.
- ///
- /// This is currently used only by MySQL host data source for now, but
- /// it is envisagad that it will be used by other host data sources
- /// in the future. Also, this list will grow over time. It is likely
- /// that we'll implement other identifiers in the future, e.g. remote-id.
- ///
- /// Those value correspond direclty to dhcp_identifier_type in hosts
- /// table in MySQL schema.
- enum IdType {
- ID_HWADDR = 0, ///< Hardware address
- ID_DUID = 1 ///< DUID/client-id
- };
- /// @brief Default destructor implementation.
- virtual ~BaseHostDataSource() { }
- /// @brief Return all hosts for the specified HW address or DUID.
- ///
- /// This method returns all @c Host objects which represent reservations
- /// for the specified HW address or DUID. Note, that this method may
- /// return multiple reservations because a particular client may have
- /// reservations in multiple subnets and the same client may be identified
- /// by HW address or DUID. The server is unable to verify that the specific
- /// DUID and HW address belong to the same client, until the client sends
- /// a DHCP message.
- ///
- /// Specifying both hardware address and DUID is allowed for this method
- /// and results in returning all objects that are associated with hardware
- /// address OR duid. For example: if one host is associated with the
- /// specified hardware address and another host is associated with the
- /// specified DUID, two hosts will be returned.
- ///
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid client id or NULL if not available, e.g. DHCPv4 client case.
- ///
- /// @return Collection of const @c Host objects.
- virtual ConstHostCollection
- getAll(const HWAddrPtr& hwaddr, const DuidPtr& duid = DuidPtr()) const = 0;
- /// @brief Return all hosts connected to any subnet for which reservations
- /// have been made using a specified identifier.
- ///
- /// This method returns all @c Host objects which represent reservations
- /// for a specified identifier. This method may return multiple hosts
- /// because a particular client may have reservations in multiple subnets.
- ///
- /// @param identifier_type Identifier type.
- /// @param identifier_begin Pointer to a begining of a buffer containing
- /// an identifier.
- /// @param identifier_len Identifier length.
- ///
- /// @return Collection of const @c Host objects.
- virtual ConstHostCollection
- getAll(const Host::IdentifierType& identifier_type,
- const uint8_t* identifier_begin,
- const size_t identifier_len) const = 0;
- /// @brief Returns a collection of hosts using the specified IPv4 address.
- ///
- /// This method may return multiple @c Host objects if they are connected
- /// to different subnets.
- ///
- /// @param address IPv4 address for which the @c Host object is searched.
- ///
- /// @return Collection of const @c Host objects.
- virtual ConstHostCollection
- getAll4(const asiolink::IOAddress& address) const = 0;
- /// @brief Returns a host connected to the IPv4 subnet.
- ///
- /// Implementations of this method should guard against the case when
- /// mutliple instances of the @c Host are present, e.g. when two
- /// @c Host objects are found, one for the DUID, another one for the
- /// HW address. In such case, an implementation of this method
- /// should throw an exception.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid client id or NULL if not available.
- ///
- /// @return Const @c Host object using a specified HW address or DUID.
- virtual ConstHostPtr
- get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr,
- const DuidPtr& duid = DuidPtr()) const = 0;
- /// @brief Returns a host connected to the IPv4 subnet.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param identifier_type Identifier type.
- /// @param identifier_begin Pointer to a begining of a buffer containing
- /// an identifier.
- /// @param identifier_len Identifier length.
- ///
- /// @return Const @c Host object for which reservation has been made using
- /// the specified identifier.
- virtual ConstHostPtr
- get4(const SubnetID& subnet_id,
- const Host::IdentifierType& identifier_type,
- const uint8_t* identifier_begin,
- const size_t identifier_len) const = 0;
- /// @brief Returns a host connected to the IPv4 subnet and having
- /// a reservation for a specified IPv4 address.
- ///
- /// One of the use cases for this method is to detect collisions between
- /// dynamically allocated addresses and reserved addresses. When the new
- /// address is assigned to a client, the allocation mechanism should check
- /// if this address is not reserved for some other host and do not allocate
- /// this address if reservation is present.
- ///
- /// Implementations of this method should guard against invalid addresses,
- /// such as IPv6 address.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param address reserved IPv4 address.
- ///
- /// @return Const @c Host object using a specified IPv4 address.
- virtual ConstHostPtr
- get4(const SubnetID& subnet_id,
- const asiolink::IOAddress& address) const = 0;
- /// @brief Returns a host connected to the IPv6 subnet.
- ///
- /// Implementations of this method should guard against the case when
- /// mutliple instances of the @c Host are present, e.g. when two
- /// @c Host objects are found, one for the DUID, another one for the
- /// HW address. In such case, an implementation of this method
- /// should throw an exception.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid DUID or NULL if not available.
- ///
- /// @return Const @c Host object using a specified HW address or DUID.
- virtual ConstHostPtr
- get6(const SubnetID& subnet_id, const DuidPtr& duid,
- const HWAddrPtr& hwaddr = HWAddrPtr()) const = 0;
- /// @brief Returns a host connected to the IPv6 subnet.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param identifier_type Identifier type.
- /// @param identifier_begin Pointer to a begining of a buffer containing
- /// an identifier.
- /// @param identifier_len Identifier length.
- ///
- /// @return Const @c Host object for which reservation has been made using
- /// the specified identifier.
- virtual ConstHostPtr
- get6(const SubnetID& subnet_id,
- const Host::IdentifierType& identifier_type,
- const uint8_t* identifier_begin,
- const size_t identifier_len) const = 0;
- /// @brief Returns a host using the specified IPv6 prefix.
- ///
- /// @param prefix IPv6 prefix for which the @c Host object is searched.
- /// @param prefix_len IPv6 prefix length.
- ///
- /// @return Const @c Host object using a specified HW address or DUID.
- virtual ConstHostPtr
- get6(const asiolink::IOAddress& prefix, const uint8_t prefix_len) const = 0;
- /// @brief Returns a host connected to the IPv6 subnet and having
- /// a reservation for a specified IPv6 address or prefix.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param address reserved IPv6 address/prefix.
- ///
- /// @return Const @c Host object using a specified IPv6 address/prefix.
- virtual ConstHostPtr
- get6(const SubnetID& subnet_id, const asiolink::IOAddress& address) const = 0;
- /// @brief Adds a new host to the collection.
- ///
- /// The implementations of this method should guard against duplicate
- /// reservations for the same host, where possible. For example, when the
- /// reservation for the same HW address and subnet id is added twice, the
- /// implementation should throw an exception. Note, that usually it is
- /// impossible to guard against adding duplicated host, where one instance
- /// is identified by HW address, another one by DUID.
- ///
- /// @param host Pointer to the new @c Host object being added.
- virtual void add(const HostPtr& host) = 0;
- /// @brief Return backend type
- ///
- /// Returns the type of the backend (e.g. "mysql", "memfile" etc.)
- ///
- /// @return Type of the backend.
- virtual std::string getType() const = 0;
- /// @brief Commit Transactions
- ///
- /// Commits all pending database operations. On databases that don't
- /// support transactions, this is a no-op.
- virtual void commit() {};
- /// @brief Rollback Transactions
- ///
- /// Rolls back all pending database operations. On databases that don't
- /// support transactions, this is a no-op.
- virtual void rollback() {};
- };
- /// @brief HostDataSource pointer
- typedef boost::shared_ptr<BaseHostDataSource> HostDataSourcePtr;
- }
- }
- #endif // BASE_HOST_DATA_SOURCE_H
|