srv_config.h 13.9 KB
Newer Older
1
// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
2 3 4 5 6 7 8 9 10 11 12 13 14
//
// 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.

15 16
#ifndef DHCPSRV_CONFIG_H
#define DHCPSRV_CONFIG_H
17

18
#include <dhcpsrv/cfg_hosts.h>
19
#include <dhcpsrv/cfg_iface.h>
20
#include <dhcpsrv/cfg_option.h>
21
#include <dhcpsrv/cfg_option_def.h>
22
#include <dhcpsrv/cfg_rsoo.h>
23
#include <dhcpsrv/cfg_subnets4.h>
24
#include <dhcpsrv/cfg_subnets6.h>
Tomek Mrugalski's avatar
Tomek Mrugalski committed
25
#include <dhcpsrv/cfg_mac_source.h>
26
#include <dhcpsrv/logging_info.h>
27
#include <boost/shared_ptr.hpp>
28 29
#include <vector>
#include <stdint.h>
30 31 32 33

namespace isc {
namespace dhcp {

34 35
class CfgMgr;

36 37 38 39

/// @brief Specifies current DHCP configuration
///
/// @todo Migrate all other configuration parameters from cfgmgr.h here
40
class SrvConfig {
41
public:
42 43 44
    /// @name Constants for selection of parameters returned by @c getConfigSummary
    ///
    //@{
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    /// Nothing selected
    static const uint32_t CFGSEL_NONE    = 0x00000000;
    /// Number of IPv4 subnets
    static const uint32_t CFGSEL_SUBNET4 = 0x00000001;
    /// Number of IPv6 subnets
    static const uint32_t CFGSEL_SUBNET6 = 0x00000002;
    /// Number of enabled ifaces
    static const uint32_t CFGSEL_IFACE4  = 0x00000004;
    /// Number of v6 ifaces
    static const uint32_t CFGSEL_IFACE6  = 0x00000008;
    /// DDNS enabled/disabled
    static const uint32_t CFGSEL_DDNS    = 0x00000010;
    /// Number of all subnets
    static const uint32_t CFGSEL_SUBNET  = 0x00000003;
    /// IPv4 related config
    static const uint32_t CFGSEL_ALL4    = 0x00000015;
    /// IPv6 related config
    static const uint32_t CFGSEL_ALL6    = 0x0000001A;
    /// Whole config
    static const uint32_t CFGSEL_ALL     = 0xFFFFFFFF;
65
    //@}
66

67
    /// @brief Default constructor.
68
    ///
69
    /// This constructor sets configuration sequence number to 0.
70
    SrvConfig();
71 72 73 74

    /// @brief Constructor.
    ///
    /// Sets arbitrary configuration sequence number.
75
    SrvConfig(const uint32_t sequence);
76

77 78 79
    /// @brief Returns summary of the configuration in the textual format.
    ///
    /// This method returns the brief text describing the current configuration.
80
    /// It may be used for logging purposes, e.g. when the new configuration is
81 82 83 84 85 86
    /// committed to notify a user about the changes in configuration.
    ///
    /// @todo Currently this method uses @c CfgMgr accessors to get the
    /// configuration parameters. Once these parameters are migrated from the
    /// @c CfgMgr this method will have to be modified accordingly.
    ///
87 88 89 90
    /// @todo Implement reporting a summary of interfaces being used for
    /// receiving and sending DHCP messages. This will be implemented with
    /// ticket #3512.
    ///
91 92 93 94 95
    /// @param selection Is a bitfield which describes the parts of the
    /// configuration to be returned.
    ///
    /// @return Summary of the configuration in the textual format.
    std::string getConfigSummary(const uint32_t selection) const;
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

    /// @brief Returns configuration sequence number.
    uint32_t getSequence() const {
        return (sequence_);
    }

    /// @brief Compares configuration sequence with other sequence.
    ///
    /// This method compares sequence numbers of two configurations for
    /// equality. The sequence numbers are meant to be unique, so if
    /// they are equal it means that they point to the same configuration.
    ///
    /// @param other Configuration which sequence number should be
    /// compared with the sequence number of this configuration.
    ///
    /// @return true if sequence numbers are equal.
112
    bool sequenceEquals(const SrvConfig& other);
113

114 115 116 117 118 119 120
    /// @name Modifiers and accesors for the configuration objects.
    ///
    /// @warning References to the objects returned by accessors are only
    /// valid during the lifetime of the @c SrvConfig object which
    /// returned them.
    ///
    //@{
121 122 123 124 125 126 127 128 129 130 131 132
    /// @brief Returns logging specific configuration.
    const LoggingInfoStorage& getLoggingInfo() const {
        return (logging_info_);
    }

    /// @brief Sets logging specific configuration.
    ///
    /// @param logging_info New logging configuration.
    void addLoggingInfo(const LoggingInfo& logging_info) {
        logging_info_.push_back(logging_info);
    }

133
    /// @brief Returns non-const pointer to interface configuration.
134
    ///
135 136
    /// This function returns a non-const pointer to the interface
    /// configuration.
137
    ///
138 139
    /// @return Object representing configuration of interfaces.
    CfgIfacePtr getCfgIface() {
140 141 142
        return (cfg_iface_);
    }

143
    /// @brief Returns const pointer to interface configuration.
144
    ///
145 146 147 148 149 150
    /// This function returns a const pointer to the interface
    /// configuration.
    ///
    /// @return Object representing configuration of interfaces.
    ConstCfgIfacePtr getCfgIface() const {
        return (cfg_iface_);
151 152
    }

153 154
    /// @brief Return pointer to non-const object representing user-defined
    /// option definitions.
155
    ///
156 157 158 159 160 161 162 163 164 165 166 167
    /// This function returns a pointer to the object which represents the
    /// user defined option definitions grouped by option space name.
    ///
    /// @return Pointer to an object holding option definitions.
    CfgOptionDefPtr getCfgOptionDef() {
        return (cfg_option_def_);
    }

    /// @brief Returns pointer to the const object representing user-defined
    /// option definitions.
    ///
    /// This function returns a pointer to the object which represents the
168 169
    /// user defined option definitions grouped by option space name.
    ///
170 171
    /// @return Pointer to an object holding option definitions.
    ConstCfgOptionDefPtr getCfgOptionDef() const {
172 173 174
        return (cfg_option_def_);
    }

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
    /// @brief Returns pointer to the non-const object holding options.
    ///
    /// This method returns a pointer to the object which holds instances
    /// of the options to be returned to the clients belonging to any subnet.
    ///
    /// @return Pointer to the object holding options.
    CfgOptionPtr getCfgOption() {
        return (cfg_option_);
    }

    /// @brief Returns pointer to the const object holding options.
    ///
    /// This method returns a pointer to the object which holds instances
    /// of the options to be returned to the clients belonging to any subnet.
    ///
    /// @return Pointer to the object holding options.
    const ConstCfgOptionPtr getCfgOption() const {
        return (cfg_option_);
    }

195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
    /// @brief Returns pointer to non-const object holding subnets configuration
    /// for DHCPv4.
    ///
    /// @return Pointer to the object holding subnets configuration for DHCPv4.
    CfgSubnets4Ptr getCfgSubnets4() {
        return (cfg_subnets4_);
    }

    /// @brief Returns pointer to const object holding subnets configuration for
    /// DHCPv4.
    ///
    /// @return Pointer to the object holding subnets configuration for DHCPv4.
    ConstCfgSubnets4Ptr getCfgSubnets4() const {
        return (cfg_subnets4_);
    }

211 212 213
    /// @brief Returns pointer to non-const object holding subnets configuration
    /// for DHCPv6.
    ///
214
    /// @return Pointer to the object holding subnets configuration for DHCPv6.
215 216 217 218 219
    CfgSubnets6Ptr getCfgSubnets6() {
        return (cfg_subnets6_);
    }

    /// @brief Returns pointer to const object holding subnets configuration for
220
    /// DHCPv6.
221 222 223 224 225 226
    ///
    /// @return Pointer to the object holding subnets configuration for DHCPv6.
    ConstCfgSubnets6Ptr getCfgSubnets6() const {
        return (cfg_subnets6_);
    }

227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
    /// @brief Returns pointer to the non-const objects representing host
    /// reservations for different IPv4 and IPv6 subnets.
    ///
    /// @return Pointer to the non-const object holding host reservations.
    CfgHostsPtr getCfgHosts() {
        return (cfg_hosts_);
    }

    /// @brief Returns pointer to the const objects representing host
    /// reservations for different IPv4 and IPv6 subnets.
    ///
    /// @return Pointer to the const object holding host reservations.
    ConstCfgHostsPtr getCfgHosts() const {
        return (cfg_hosts_);
    }

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
    /// @brief Returns pointer to the non-const object representing
    /// set of RSOO-enabled options.
    ///
    /// @return Pointer to the non-const object holding RSOO-enabled
    /// options.
    CfgRSOOPtr getCfgRSOO() {
        return (cfg_rsoo_);
    }

    /// @brief Returns pointer to the const object representing set
    /// of RSOO-enabled options.
    ///
    /// @return Pointer to the const object holding RSOO-enabled
    /// options.
    ConstCfgRSOOPtr getCfgRSOO() const {
        return (cfg_rsoo_);
    }

Tomek Mrugalski's avatar
Tomek Mrugalski committed
261
    //@}
262

Tomek Mrugalski's avatar
Tomek Mrugalski committed
263 264
    /// @brief Returns non-const reference to an array that stores
    ///        MAC/hardware address sources.
265
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
266 267 268
    /// @return non-const reference to MAC/hardware address sources
    CfgMACSource& getMACSources() {
        return (cfg_mac_source_);
269 270
    }

Tomek Mrugalski's avatar
Tomek Mrugalski committed
271 272 273 274 275 276
    /// @brief Returns const reference to an array that stores
    ///        MAC/hardware address sources.
    ///
    /// @return const reference to MAC/hardware address sources
    const CfgMACSource& getMACSources() const {
        return (cfg_mac_source_);
277 278
    }

279 280 281 282 283 284
    /// @brief Copies the currnet configuration to a new configuration.
    ///
    /// This method copies the parameters stored in the configuration to
    /// an object passed as parameter. The configuration sequence is not
    /// copied.
    ///
285 286 287 288 289 290 291 292
    /// @warning Some of the configuration objects are not copied at
    /// this point, e.g. subnets. This is because they contain quite complex
    /// data structures and they make use of pointers, so in many cases
    /// the default copy constructors can't be used. Implementing this
    /// requires quite a lot of time so this is left as is for now.
    /// The lack of ability to copy the entire configuration makes
    /// revert function of the @c CfgMgr unsuable.
    ///
293 294
    /// @param [out] new_config An object to which the configuration will
    /// be copied.
295
    void copy(SrvConfig& new_config) const;
296

297 298 299
    /// @brief Apply logging configuration to log4cplus.
    void applyLoggingCfg() const;

300 301 302 303 304 305 306 307 308 309 310 311
    /// @name Methods and operators used to compare configurations.
    ///
    //@{
    ///
    /// @brief Compares two objects for equality.
    ///
    /// It ignores the configuration sequence number when checking for
    /// equality of objects.
    ///
    /// @param other An object to be compared with this object.
    ///
    /// @return true if two objects are equal, false otherwise.
312
    bool equals(const SrvConfig& other) const;
313 314 315 316 317 318 319 320 321

    /// @brief Compares two objects for inequality.
    ///
    /// It ignores the configuration sequence number when checking for
    /// inequality of objects.
    ///
    /// @param other An object to be compared with this object.
    ///
    /// @return true if two objects are not equal, false otherwise.
322
    bool nequals(const SrvConfig& other) const {
323 324 325 326 327 328 329 330 331 332 333
        return (!equals(other));
    }

    /// @brief Equality operator.
    ///
    /// It ignores the configuration sequence number when checking for
    /// equality of objects.
    ///
    /// @param other An object to be compared with this object.
    ///
    /// @return true if two objects are equal, false otherwise.
334
    bool operator==(const SrvConfig& other) const {
335 336 337 338 339 340 341 342 343 344 345
        return (equals(other));
    }

    /// @param other An object to be compared with this object.
    ///
    /// It ignores the configuration sequence number when checking for
    /// inequality of objects.
    ///
    /// @param other An object to be compared with this object.
    ///
    /// @return true if two objects are not equal, false otherwise.
346
    bool operator!=(const SrvConfig& other) const {
347 348 349 350 351
        return (nequals(other));
    }

    //@}

352

353 354 355 356 357
private:

    /// @brief Sequence number identifying the configuration.
    uint32_t sequence_;

358 359 360
    /// @brief Logging specific information.
    LoggingInfoStorage logging_info_;

361 362 363 364
    /// @brief Interface configuration.
    ///
    /// Used to select interfaces on which the DHCP server will listen to
    /// queries.
365
    CfgIfacePtr cfg_iface_;
366

367
    /// @brief Pointer to option definitions configuration.
368 369 370
    ///
    /// This object holds the user-defined option definitions grouped
    /// by option space name.
371
    CfgOptionDefPtr cfg_option_def_;
372

373 374 375 376 377 378
    /// @brief Pointer to options (data) configuration.
    ///
    /// This object holds the instances of the options to be sent to clients
    /// connected to any subnet.
    CfgOptionPtr cfg_option_;

379 380 381
    /// @brief Pointer to subnets configuration for IPv4.
    CfgSubnets4Ptr cfg_subnets4_;

382
    /// @brief Pointer to subnets configuration for IPv6.
383 384
    CfgSubnets6Ptr cfg_subnets6_;

385 386 387 388 389 390
    /// @brief Pointer to the configuration for hosts reservation.
    ///
    /// This object holds a list of @c Host objects representing host
    /// reservations for different IPv4 and IPv6 subnets.
    CfgHostsPtr cfg_hosts_;

391
    /// @brief A list of configured MAC sources.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
392
    CfgMACSource cfg_mac_source_;
393 394 395

    /// @brief Pointer to the configuration for RSOO-enabled options.
    ///
396 397
    /// This object holds a set of RSOO-enabled options. See
    /// RFC 6422 for the definition of the RSOO-enabled option.
398
    CfgRSOOPtr cfg_rsoo_;
399 400
};

401
/// @name Pointers to the @c SrvConfig object.
402 403
///
//@{
404 405
/// @brief Non-const pointer to the @c SrvConfig.
typedef boost::shared_ptr<SrvConfig> SrvConfigPtr;
406

407 408
/// @brief Const pointer to the @c SrvConfig.
typedef boost::shared_ptr<const SrvConfig> ConstSrvConfigPtr;
409 410
//@}

411 412 413
} // namespace isc::dhcp
} // namespace isc

414
#endif // DHCPSRV_CONFIG_H