ctrl_dhcp6_srv.h 7.64 KB
Newer Older
Francis Dupont's avatar
Francis Dupont committed
1
// Copyright (C) 2012-2015  Internet Systems Consortium, Inc. ("ISC")
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//
// 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.

#ifndef CTRL_DHCPV6_SRV_H
#define CTRL_DHCPV6_SRV_H

#include <asiolink/asiolink.h>
19
#include <cc/data.h>
20
#include <cc/command_interpreter.h>
21
#include <dhcpsrv/timer_mgr.h>
22
#include <dhcp6/dhcp6_srv.h>
23 24 25 26 27 28

namespace isc {
namespace dhcp {

/// @brief Controlled version of the DHCPv6 server
///
29 30
/// This is a class that is responsible for DHCPv6 server being controllable,
/// by reading configuration file from disk.
31 32 33 34 35 36
class ControlledDhcpv6Srv : public isc::dhcp::Dhcpv6Srv {
public:

    /// @brief Constructor
    ///
    /// @param port UDP port to be opened for DHCP traffic
37
    ControlledDhcpv6Srv(uint16_t port = DHCP6_SERVER_PORT);
38 39

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

42
    /// @brief Initializes the server.
43
    ///
44 45 46
    /// 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
47
    /// *_backend.cc
48
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
49 50
    /// This method may throw if initialization fails. Exception types may be
    /// specific to used configuration backend.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
51
    void init(const std::string& config_file);
52

Tomek Mrugalski's avatar
Tomek Mrugalski committed
53
    /// @brief Performs cleanup, immediately before termination
54
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
55
    /// This method performs final clean up, just before the Dhcpv6Srv object
56
    /// is destroyed. Currently it is a no-op.
57
    void cleanup();
58 59 60 61

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

Tomek Mrugalski's avatar
Tomek Mrugalski committed
62 63 64 65 66 67 68
    /// @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
69 70 71 72 73
    /// Currently supported commands are:
    /// - shutdown
    /// - libreload
    /// - config-reload
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
74
    /// @note It never throws.
75
    ///
76
    /// @param command Text representation of the command (e.g. "shutdown")
77
    /// @param args Optional parameters
78 79 80
    ///
    /// @return status of the command
    static isc::data::ConstElementPtr
Tomek Mrugalski's avatar
Tomek Mrugalski committed
81
    processCommand(const std::string& command, isc::data::ConstElementPtr args);
82

Tomek Mrugalski's avatar
Tomek Mrugalski committed
83
    /// @brief configuration processor
84
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
85
    /// This is a method for handling incoming configuration updates.
Tomek Mrugalski's avatar
Tomek Mrugalski committed
86 87
    /// This method should be called by all configuration backends when the
    /// server is starting up or when configuration has changed.
88 89 90 91 92 93 94 95
    ///
    /// 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
96
    processConfig(isc::data::ConstElementPtr new_config);
97

Tomek Mrugalski's avatar
Tomek Mrugalski committed
98
    /// @brief returns pointer to the sole instance of Dhcpv6Srv
99
    ///
Tomek Mrugalski's avatar
Tomek Mrugalski committed
100
    /// @return server instance (may return NULL, if called before server is spawned)
Tomek Mrugalski's avatar
Tomek Mrugalski committed
101 102 103 104
    static ControlledDhcpv6Srv* getInstance() {
        return (server_);
    }

105
private:
106

Tomek Mrugalski's avatar
Tomek Mrugalski committed
107 108
    /// @brief Callback that will be called from iface_mgr when data
    /// is received over control socket.
109 110
    ///
    /// This static callback method is called from IfaceMgr::receive6() method,
Tomek Mrugalski's avatar
Tomek Mrugalski committed
111
    /// when there is a new command or configuration sent over control socket
112
    /// (that was sent from some yet unspecified sender).
113 114
    static void sessionReader(void);

Tomek Mrugalski's avatar
Tomek Mrugalski committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
    /// @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);
139

Tomek Mrugalski's avatar
Tomek Mrugalski committed
140 141 142 143 144 145 146 147 148 149 150 151
    /// @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);
152

153 154 155 156 157 158 159 160 161 162 163 164
    /// @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).
165 166 167 168
    /// @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.
169
    void reclaimExpiredLeases(const size_t max_leases, const uint16_t timeout,
170 171 172
                              const bool remove_lease,
                              const uint16_t max_unwarned_cycles);

173 174 175 176 177 178 179 180 181 182 183

    /// @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);

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
    /// @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_;

199 200 201 202 203 204
};

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

#endif