ctrl_dhcp6_srv.h 8.55 KB
Newer Older
1
// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC")
2
//
3 4 5
// 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/.
6 7 8 9 10

#ifndef CTRL_DHCPV6_SRV_H
#define CTRL_DHCPV6_SRV_H

#include <asiolink/asiolink.h>
11
#include <cc/data.h>
12
#include <cc/command_interpreter.h>
13
#include <dhcpsrv/timer_mgr.h>
14
#include <dhcp6/dhcp6_srv.h>
15 16 17 18 19 20

namespace isc {
namespace dhcp {

/// @brief Controlled version of the DHCPv6 server
///
21 22
/// This is a class that is responsible for DHCPv6 server being controllable,
/// by reading configuration file from disk.
23 24 25 26 27 28
class ControlledDhcpv6Srv : public isc::dhcp::Dhcpv6Srv {
public:

    /// @brief Constructor
    ///
    /// @param port UDP port to be opened for DHCP traffic
29
    ControlledDhcpv6Srv(uint16_t port = DHCP6_SERVER_PORT);
30 31

    /// @brief Destructor.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
32
    virtual ~ControlledDhcpv6Srv();
33

34
    /// @brief Initializes the server.
35
    ///
36 37 38
    /// Depending on the configuration backend, it establishes msgq session,
    /// reads the JSON file from disk or may perform any other setup
    /// operation. For specific details, see actual implementation in
Tomek Mrugalski's avatar
Tomek Mrugalski committed
39
    /// *_backend.cc
40
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
41 42
    /// This method may throw if initialization fails. Exception types may be
    /// specific to used configuration backend.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
43
    void init(const std::string& config_file);
44

Tomek Mrugalski's avatar
Tomek Mrugalski committed
45
    /// @brief Performs cleanup, immediately before termination
46
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
47
    /// This method performs final clean up, just before the Dhcpv6Srv object
48
    /// is destroyed. Currently it is a no-op.
49
    void cleanup();
50 51 52 53

    /// @brief Initiates shutdown procedure for the whole DHCPv6 server.
    void shutdown();

Tomek Mrugalski's avatar
Tomek Mrugalski committed
54 55 56 57 58 59 60
    /// @brief command processor
    ///
    /// This method is uniform for all config backends. It processes received
    /// command (as a string + JSON arguments). Internally, it's just a
    /// wrapper that calls process*Command() methods and catches exceptions
    /// in them.
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
61 62 63 64
    /// Currently supported commands are:
    /// - shutdown
    /// - libreload
    /// - config-reload
Francis Dupont's avatar
Francis Dupont committed
65
    /// - leases-reclaim
Tomek Mrugalski's avatar
Tomek Mrugalski committed
66
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
67
    /// @note It never throws.
68
    ///
69
    /// @param command Text representation of the command (e.g. "shutdown")
70
    /// @param args Optional parameters
71 72 73
    ///
    /// @return status of the command
    static isc::data::ConstElementPtr
Tomek Mrugalski's avatar
Tomek Mrugalski committed
74
    processCommand(const std::string& command, isc::data::ConstElementPtr args);
75

Tomek Mrugalski's avatar
Tomek Mrugalski committed
76
    /// @brief configuration processor
77
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
78
    /// This is a method for handling incoming configuration updates.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
79 80
    /// This method should be called by all configuration backends when the
    /// server is starting up or when configuration has changed.
81 82 83 84 85 86 87 88
    ///
    /// As pointer to this method is used a callback in ASIO used in
    /// ModuleCCSession, it has to be static.
    ///
    /// @param new_config textual representation of the new configuration
    ///
    /// @return status of the config update
    static isc::data::ConstElementPtr
Tomek Mrugalski's avatar
Tomek Mrugalski committed
89
    processConfig(isc::data::ConstElementPtr new_config);
90

Tomek Mrugalski's avatar
Tomek Mrugalski committed
91
    /// @brief returns pointer to the sole instance of Dhcpv6Srv
92
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
93
    /// @return server instance (may return NULL, if called before server is spawned)
Tomek Mrugalski's avatar
Tomek Mrugalski committed
94 95 96 97
    static ControlledDhcpv6Srv* getInstance() {
        return (server_);
    }

98
private:
99

Tomek Mrugalski's avatar
Tomek Mrugalski committed
100 101
    /// @brief Callback that will be called from iface_mgr when data
    /// is received over control socket.
102 103
    ///
    /// This static callback method is called from IfaceMgr::receive6() method,
Tomek Mrugalski's avatar
Tomek Mrugalski committed
104
    /// when there is a new command or configuration sent over control socket
105
    /// (that was sent from some yet unspecified sender).
106 107
    static void sessionReader(void);

Tomek Mrugalski's avatar
Tomek Mrugalski committed
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    /// @brief handler for processing 'shutdown' command
    ///
    /// This handler processes shutdown command, which initializes shutdown
    /// procedure.
    /// @param command (parameter ignored)
    /// @param args (parameter ignored)
    ///
    /// @return status of the command
    isc::data::ConstElementPtr
    commandShutdownHandler(const std::string& command,
                           isc::data::ConstElementPtr args);

    /// @brief handler for processing 'libreload' command
    ///
    /// This handler processes libreload command, which unloads all hook
    /// libraries and reloads them.
    ///
    /// @param command (parameter ignored)
    /// @param args (parameter ignored)
    ///
    /// @return status of the command
    isc::data::ConstElementPtr
    commandLibReloadHandler(const std::string& command,
                            isc::data::ConstElementPtr args);
132

Tomek Mrugalski's avatar
Tomek Mrugalski committed
133 134 135 136 137 138 139 140 141 142 143 144
    /// @brief handler for processing 'config-reload' command
    ///
    /// This handler processes config-reload command, which processes
    /// configuration specified in args parameter.
    ///
    /// @param command (parameter ignored)
    /// @param args configuration to be processed
    ///
    /// @return status of the command
    isc::data::ConstElementPtr
    commandConfigReloadHandler(const std::string& command,
                               isc::data::ConstElementPtr args);
145

146 147 148 149 150 151 152 153 154 155 156 157 158 159
    /// @brief handler for processing 'set-config' command
    ///
    /// This handler processes set-config command, which processes
    /// configuration specified in args parameter.
    /// @param command (parameter ignored)
    /// @param args configuration to be processed. Expected format:
    /// map containing Dhcp6 map that contains DHCPv6 server configuration.
    /// May also contain Logging map that specifies logging configuration.
    ///
    /// @return status of the command
    isc::data::ConstElementPtr
    commandSetConfigHandler(const std::string& command,
                            isc::data::ConstElementPtr args);

Francis Dupont's avatar
Francis Dupont committed
160
    /// @brief Handler for processing 'leases-reclaim' command
161 162
    ///
    /// This handler processes leases-reclaim command, which triggers
Francis Dupont's avatar
Francis Dupont committed
163 164
    /// the leases reclamation immediately.
    /// No limit for processing time or number of processed leases applies.
165 166
    ///
    /// @param command (parameter ignored)
Francis Dupont's avatar
Francis Dupont committed
167 168 169
    /// @param args arguments map { "remove": <bool> }
    ///        if true a lease is removed when it is reclaimed,
    ///        if false its state is changed to "expired-reclaimed".
170
    ///
Francis Dupont's avatar
Francis Dupont committed
171 172
    /// @return status of the command (should be success unless args
    ///         was not a Bool Element).
173 174 175 176
    isc::data::ConstElementPtr
    commandLeasesReclaimHandler(const std::string& command,
                                isc::data::ConstElementPtr args);

177 178 179 180 181 182 183 184 185 186 187 188
    /// @brief Reclaims expired IPv6 leases and reschedules timer.
    ///
    /// This is a wrapper method for @c AllocEngine::reclaimExpiredLeases6.
    /// It reschedules the timer for leases reclamation upon completion of
    /// this method.
    ///
    /// @param max_leases Maximum number of leases to be reclaimed.
    /// @param timeout Maximum amount of time that the reclaimation routine
    /// may be processing expired leases, expressed in milliseconds.
    /// @param remove_lease A boolean value indicating if the lease should
    /// be removed when it is reclaimed (if true) or it should be left in the
    /// database in the "expired-reclaimed" state (if false).
189 190 191 192
    /// @param max_unwarned_cycles A number of consecutive processing cycles
    /// of expired leases, after which the system issues a warning if there
    /// are still expired leases in the database. If this value is 0, the
    /// warning is never issued.
193
    void reclaimExpiredLeases(const size_t max_leases, const uint16_t timeout,
194 195 196
                              const bool remove_lease,
                              const uint16_t max_unwarned_cycles);

197 198 199 200 201 202 203 204 205 206 207

    /// @brief Deletes reclaimed leases and reschedules the timer.
    ///
    /// This is a wrapper method for @c AllocEngine::deleteExpiredReclaimed6.
    /// It reschedules the timer for leases reclamation upon completion of
    /// this method.
    ///
    /// @param secs Minimum number of seconds after which a lease can be
    /// deleted.
    void deleteExpiredReclaimedLeases(const uint32_t secs);

208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
    /// @brief Static pointer to the sole instance of the DHCP server.
    ///
    /// This is required for config and command handlers to gain access to
    /// the server. Some of them need to be static methods.
    static ControlledDhcpv6Srv* server_;

    /// @brief IOService object, used for all ASIO operations.
    isc::asiolink::IOService io_service_;

    /// @brief Instance of the @c TimerMgr.
    ///
    /// Shared pointer to the instance of timer @c TimerMgr is held here to
    /// make sure that the @c TimerMgr outlives instance of this class.
    TimerMgrPtr timer_mgr_;

223 224 225 226 227 228
};

}; // namespace isc::dhcp
}; // namespace isc

#endif