Kea
1.9.9-git
|
DHCPv4 server service. More...
#include <dhcp4_srv.h>
Public Types | |
enum | RequirementLevel { FORBIDDEN, MANDATORY, OPTIONAL } |
defines if certain option may, must or must not appear More... | |
Public Member Functions | |
Dhcpv4Srv (uint16_t server_port=DHCP4_SERVER_PORT, uint16_t client_port=0, const bool use_bcast=true, const bool direct_response_desired=true) | |
Default constructor. More... | |
virtual | ~Dhcpv4Srv () |
Destructor. Used during DHCPv4 service shutdown. More... | |
void | classifyByVendor (const Pkt4Ptr &pkt) |
Assign class using vendor-class-identifier option. More... | |
virtual void | d2ClientErrorHandler (const dhcp_ddns::NameChangeSender::Result result, dhcp_ddns::NameChangeRequestPtr &ncr) |
Implements the error handler for DHCP_DDNS IO errors. More... | |
void | declineLease (const Lease4Ptr &lease, const Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context) |
Marks lease as declined. More... | |
void | discardPackets () |
Discards parked packets Clears the packet parking lots of all packets. More... | |
CBControlDHCPv4Ptr | getCBControl () const |
Returns an object which controls access to the configuration backends. More... | |
asiolink::IOServicePtr & | getIOService () |
Returns pointer to the IO service used by the server. More... | |
NetworkStatePtr & | getNetworkState () |
Returns pointer to the network state used by the server. More... | |
bool | getSendResponsesToSource () const |
Returns value of the test_send_responses_to_source_ flag. More... | |
bool | inTestMode () const |
Checks if the server is running in unit test mode. More... | |
std::list< std::list< std::string > > | jsonPathsToRedact () const finaloverride |
Return a list of all paths that contain passwords or secrets for kea-dhcp4. More... | |
void | processDhcp4Query (Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park) |
Process a single incoming DHCPv4 query. More... | |
void | processDhcp4QueryAndSendResponse (Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park) |
Process a single incoming DHCPv4 query. More... | |
void | processPacket (Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park=true) |
Process a single incoming DHCPv4 packet. More... | |
void | processPacketAndSendResponse (Pkt4Ptr &query) |
Process a single incoming DHCPv4 packet and sends the response. More... | |
void | processPacketAndSendResponseNoThrow (Pkt4Ptr &query) |
Process a single incoming DHCPv4 packet and sends the response. More... | |
int | run () |
Main server processing loop. More... | |
void | run_one () |
Main server processing step. More... | |
void | sendResponseNoThrow (hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp) |
Process an unparked DHCPv4 packet and sends the response. More... | |
void | shutdown () override |
Instructs the server to shut down. More... | |
void | startD2 () |
Starts DHCP_DDNS client IO if DDNS updates are enabled. More... | |
void | stopD2 () |
Stops DHCP_DDNS client IO if DDNS updates are enabled. More... | |
Public accessors returning values required to (re)open sockets. | |
uint16_t | getServerPort () const |
Get UDP port on which server should listen. More... | |
bool | useBroadcast () const |
Return bool value indicating that broadcast flags should be set on sockets. More... | |
Public Member Functions inherited from isc::process::Daemon | |
Daemon () | |
Default constructor. More... | |
virtual | ~Daemon () |
Destructor. More... | |
void | checkConfigFile () const |
Checks the configuration file name. More... | |
virtual void | cleanup () |
Performs final deconfiguration. More... | |
void | createPIDFile (int pid=0) |
Creates the PID file. More... | |
std::string | getConfigFile () const |
Returns config file name. More... | |
int | getExitValue () |
Fetches the exit value. More... | |
std::string | getPIDFileDir () const |
Returns the directory used when forming default PID file name. More... | |
std::string | getPIDFileName () const |
Returns the current PID file name. More... | |
isc::data::ConstElementPtr | redactConfig (isc::data::ConstElementPtr const &config) |
Redact a configuration. More... | |
void | setConfigFile (const std::string &config_file) |
Sets the configuration file name. More... | |
void | setExitValue (int value) |
Sets the exit value. More... | |
void | setPIDFileDir (const std::string &pid_file_dir) |
Sets the PID file directory. More... | |
void | setPIDFileName (const std::string &pid_file_name) |
Sets PID file name. More... | |
virtual size_t | writeConfigFile (const std::string &config_file, isc::data::ConstElementPtr cfg=isc::data::ConstElementPtr()) const |
Writes current configuration to specified file. More... | |
Static Public Member Functions | |
static int | getHookIndexBuffer4Receive () |
Returns the index for "buffer4_receive" hook point. More... | |
static int | getHookIndexBuffer4Send () |
Returns the index for "buffer4_send" hook point. More... | |
static int | getHookIndexLease4Decline () |
Returns the index for "lease4_decline" hook point. More... | |
static int | getHookIndexLease4Release () |
Returns the index for "lease4_release" hook point. More... | |
static int | getHookIndexPkt4Receive () |
Returns the index for "pkt4_receive" hook point. More... | |
static int | getHookIndexPkt4Send () |
Returns the index for "pkt4_send" hook point. More... | |
static int | getHookIndexSubnet4Select () |
Returns the index for "subnet4_select" hook point. More... | |
static std::string | getVersion (bool extended) |
returns Kea version on stdout and exit. More... | |
static void | processStatsReceived (const Pkt4Ptr &query) |
Class methods for DHCPv4-over-DHCPv6 handler. More... | |
static void | processStatsSent (const Pkt4Ptr &response) |
Updates statistics for transmitted packets. More... | |
Static Public Member Functions inherited from isc::process::Daemon | |
static void | configureLogger (const isc::data::ConstElementPtr &log_config, const isc::process::ConfigPtr &storage) |
Configures logger. More... | |
static std::string | getDefaultLoggerName () |
Returns default logger name. More... | |
static std::string | getProcName () |
returns the process name This value is used as when forming the default PID file name More... | |
static bool | getVerbose () |
Returns if running in verbose mode. More... | |
static std::string | getVersion (bool extended) |
returns Kea version on stdout and exits. More... | |
static void | loggerInit (const char *log_name, bool verbose) |
Initializes logger. More... | |
static void | setDefaultLoggerName (const std::string &logger) |
Sets the default logger name. More... | |
static void | setProcName (const std::string &proc_name) |
Sets the process name. More... | |
static void | setVerbose (const bool verbose) |
Sets or clears verbose mode. More... | |
Static Public Attributes | |
static const std::string | VENDOR_CLASS_PREFIX |
this is a prefix added to the content of vendor-class option More... | |
Protected Member Functions | |
void | adjustIfaceData (Dhcpv4Exchange &ex) |
Set IP/UDP and interface parameters for the DHCPv4 response. More... | |
void | adjustRemoteAddr (Dhcpv4Exchange &ex) |
Sets remote addresses for outgoing packet. More... | |
void | appendBasicOptions (Dhcpv4Exchange &ex) |
Append basic options if they are not present. More... | |
void | appendRequestedOptions (Dhcpv4Exchange &ex) |
Appends options requested by client. More... | |
void | appendRequestedVendorOptions (Dhcpv4Exchange &ex) |
Appends requested vendor options as requested by client. More... | |
void | assignLease (Dhcpv4Exchange &ex) |
Assigns a lease and appends corresponding options. More... | |
void | buildCfgOptionList (Dhcpv4Exchange &ex) |
Build the configured option list. More... | |
void | classifyPacket (const Pkt4Ptr &pkt) |
Assigns incoming packet to zero or more classes. More... | |
void | createNameChangeRequests (const Lease4Ptr &lease, const Lease4Ptr &old_lease, const DdnsParams &ddns_params) |
Creates NameChangeRequests which correspond to the lease which has been acquired. More... | |
void | deferredUnpack (Pkt4Ptr &query) |
Perform deferred option unpacking. More... | |
void | postAllocateNameUpdate (const AllocEngine::ClientContext4Ptr &ctx, const Lease4Ptr &lease, const Pkt4Ptr &query, const Pkt4Ptr &resp, bool client_name_changed) |
Update client name and DNS flags in the lease and response. More... | |
void | processClientName (Dhcpv4Exchange &ex) |
Processes Client FQDN and Hostname Options sent by a client. More... | |
void | processDecline (Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context) |
Process incoming DHCPDECLINE messages. More... | |
Pkt4Ptr | processDiscover (Pkt4Ptr &discover) |
Processes incoming DISCOVER and returns response. More... | |
Pkt4Ptr | processInform (Pkt4Ptr &inform) |
Processes incoming DHCPINFORM messages. More... | |
void | processPacketBufferSend (hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &rsp) |
Executes buffer4_send callout and sends the response. More... | |
void | processPacketPktSend (hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp) |
Executes pkt4_send callout. More... | |
void | processRelease (Pkt4Ptr &release, AllocEngine::ClientContext4Ptr &context) |
Processes incoming DHCPRELEASE messages. More... | |
Pkt4Ptr | processRequest (Pkt4Ptr &request, AllocEngine::ClientContext4Ptr &context) |
Processes incoming REQUEST and returns REPLY response. More... | |
virtual Pkt4Ptr | receivePacket (int timeout) |
dummy wrapper around IfaceMgr::receive4 More... | |
void | renewLease (const Pkt4Ptr &renew, Pkt4Ptr &reply) |
Attempts to renew received addresses. More... | |
void | requiredClassify (Dhcpv4Exchange &ex) |
Assigns incoming packet to zero or more classes (required pass). More... | |
isc::dhcp::Subnet4Ptr | selectSubnet (const Pkt4Ptr &query, bool &drop, bool sanity_only=false) const |
Selects a subnet for a given client's packet. More... | |
isc::dhcp::Subnet4Ptr | selectSubnet4o6 (const Pkt4Ptr &query, bool &drop, bool sanity_only=false) const |
Selects a subnet for a given client's DHCP4o6 packet. More... | |
virtual void | sendPacket (const Pkt4Ptr &pkt) |
dummy wrapper around IfaceMgr::send() More... | |
void | setFixedFields (Dhcpv4Exchange &ex) |
Sets fixed fields of the outgoing packet. More... | |
void | setPacketStatisticsDefaults () |
This function sets statistics related to DHCPv4 packets processing to their initial values. More... | |
void | setSendResponsesToSource (bool value) |
Sets value of the test_send_responses_to_source_ flag. More... | |
void | setTeeTimes (const Lease4Ptr &lease, const Subnet4Ptr &subnet, Pkt4Ptr resp) |
Adds the T1 and T2 timers to the outbound response as appropriate. More... | |
Functions filtering and sanity-checking received messages. | |
| |
bool | accept (const Pkt4Ptr &query) const |
Checks whether received message should be processed or discarded. More... | |
bool | acceptDirectRequest (const Pkt4Ptr &query) const |
Check if a message sent by directly connected client should be accepted or discarded. More... | |
bool | acceptMessageType (const Pkt4Ptr &query) const |
Check if received message type is valid for the server to process. More... | |
bool | acceptServerId (const Pkt4Ptr &pkt) const |
Verifies if the server id belongs to our server. More... | |
Protected Member Functions inherited from isc::process::Daemon | |
std::string | makePIDFileName () const |
Manufacture the pid file name. More... | |
Static Protected Member Functions | |
static void | appendServerID (Dhcpv4Exchange &ex) |
Adds server identifier option to the server's response. More... | |
static uint16_t | checkRelayPort (const Dhcpv4Exchange &ex) |
Check if the relay port RAI sub-option was set in the query. More... | |
static void | sanityCheck (const Pkt4Ptr &query, RequirementLevel serverid) |
Verifies if specified packet meets RFC requirements. More... | |
static std::string | srvidToString (const OptionPtr &opt) |
converts server-id to text Converts content of server-id option to a text representation, e.g. More... | |
Protected Attributes | |
boost::shared_ptr< AllocEngine > | alloc_engine_ |
Allocation Engine. More... | |
CBControlDHCPv4Ptr | cb_control_ |
Controls access to the configuration backends. More... | |
uint16_t | client_port_ |
UDP port number to which server sends all responses. More... | |
NetworkStatePtr | network_state_ |
Holds information about disabled DHCP service and/or disabled subnet/network scopes. More... | |
uint16_t | server_port_ |
UDP port number on which server listens. More... | |
volatile bool | shutdown_ |
Indicates if shutdown is in progress. More... | |
bool | use_bcast_ |
Should broadcast be enabled on sockets (if true). More... | |
Protected Attributes inherited from isc::process::Daemon | |
isc::asiolink::IOSignalSetPtr | signal_set_ |
A pointer to the object installing custom signal handlers. More... | |
boost::posix_time::ptime | start_ |
Timestamp of the start of the daemon. More... | |
DHCPv4 server service.
This singleton class represents DHCPv4 server. It contains all top-level methods and routines necessary for server operation. In particular, it instantiates IfaceMgr, loads or generates DUID that is going to be used as server-identifier, receives incoming packets, processes them, manages leases assignment and generates appropriate responses.
This class does not support any controlling mechanisms directly. See the derived ControlledDhcpv4Srv class for support for command and configuration updates over msgq.
Definition at line 241 of file dhcp4_srv.h.
defines if certain option may, must or must not appear
Enumerator | |
---|---|
FORBIDDEN | |
MANDATORY | |
OPTIONAL |
Definition at line 250 of file dhcp4_srv.h.
isc::dhcp::Dhcpv4Srv::Dhcpv4Srv | ( | uint16_t | server_port = DHCP4_SERVER_PORT , |
uint16_t | client_port = 0 , |
||
const bool | use_bcast = true , |
||
const bool | direct_response_desired = true |
||
) |
Default constructor.
Instantiates necessary services, required to run DHCPv4 server. In particular, creates IfaceMgr that will be responsible for network interaction. Will instantiate lease manager, and load old or create new DUID. It is possible to specify alternate port on which DHCPv4 server will listen on and alternate port where DHCPv4 server sends all responses to. Those are mostly useful for testing purposes. The Last two arguments of the constructor should be left at default values for normal server operation. They should be set to 'false' when creating an instance of this class for unit testing because features they enable require root privileges.
server_port | specifies port number to listen on |
client_port | specifies port number to send to |
use_bcast | configure sockets to support broadcast messages. |
direct_response_desired | specifies if it is desired to use direct V4 traffic. |
Definition at line 611 of file dhcp4_srv.cc.
References alloc_engine_, isc::dhcp::AllocEngine::ALLOC_ITERATIVE, isc::dhcp::DBG_DHCP4_START, isc::dhcp::dhcp4_logger, isc::dhcp::DHCP4_OPEN_SOCKET, isc::dhcp::DHCP4_SRV_CONSTRUCT_ERROR, isc::dhcp::DHCP4_TESTING_MODE_SEND_TO_SOURCE_ENABLED, isc::dhcp::IfaceMgr::instance(), LOG_DEBUG, LOG_ERROR, LOG_WARN, isc::dhcp::IfaceMgr::setMatchingPacketFilter(), setPacketStatisticsDefaults(), and shutdown_.
|
virtual |
Destructor. Used during DHCPv4 service shutdown.
Definition at line 673 of file dhcp4_srv.cc.
References isc::dhcp::Dhcp4o6IpcBase::close(), isc::dhcp::IfaceMgr::closeSockets(), isc::dhcp::LeaseMgrFactory::destroy(), isc::dhcp::dhcp4_logger, isc::dhcp::DHCP4_SRV_D2STOP_ERROR, isc::dhcp::DHCP4_SRV_DHCP4O6_ERROR, isc::dhcp::DHCP4_SRV_UNLOAD_LIBRARIES_ERROR, discardPackets(), isc::dhcp::Dhcp4to6Ipc::instance(), isc::dhcp::IfaceMgr::instance(), LOG_ERROR, and stopD2().
|
protected |
Checks whether received message should be processed or discarded.
This function checks whether received message should be processed or discarded. It should be called on the beginning of message processing (just after the message has been decoded). This message calls a number of other functions which check whether message should be processed, using different criteria.
This function should be extended when new criteria for accepting received message have to be implemented. This function is meant to aggregate all early filtering checks on the received message. By having a single function like this, we are avoiding bloat of the server's main loop.
query | Received message. |
Definition at line 3474 of file dhcp4_srv.cc.
References acceptDirectRequest(), acceptMessageType(), acceptServerId(), isc::dhcp::bad_packet4_logger, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_PACKET_DROP_0002, isc::dhcp::DHCP4_PACKET_DROP_0003, and LOG_DEBUG.
Referenced by processPacket().
|
protected |
Check if a message sent by directly connected client should be accepted or discarded.
This function checks if the received message is from directly connected client. If it is, it checks that it should be processed or discarded.
Note that this function doesn't validate all addresses being carried in the message. The primary purpose of this function is to filter out direct messages in the local network for which there is no suitable subnet configured. For example, this function accepts unicast messages because unicasts may be used by clients located in remote networks to to renew existing leases. If their notion of address is wrong, the server will have to sent a NAK, instead of dropping the message. Detailed validation of such messages is performed at later stage of processing.
This function accepts the following messages:
query | Message sent by a client. |
Definition at line 3502 of file dhcp4_srv.cc.
References isc::dhcp::DHCPINFORM, and selectSubnet().
Referenced by accept().
|
protected |
Check if received message type is valid for the server to process.
This function checks that the received message type belongs to the range of types recognized by the server and that the message of this type should be processed by the server.
The messages types accepted for processing are:
query | Message sent by a client. |
Definition at line 3540 of file dhcp4_srv.cc.
References isc::dhcp::bad_packet4_logger, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_PACKET_DROP_0004, isc::dhcp::DHCP4_PACKET_DROP_0005, isc::dhcp::DHCP4_PACKET_DROP_0006, isc::dhcp::DHCP4_PACKET_DROP_0009, isc::dhcp::DHCP_NOTYPE, isc::dhcp::DHCP_TYPES_EOF, isc::dhcp::DHCPDECLINE, isc::dhcp::DHCPDISCOVER, isc::dhcp::DHCPINFORM, isc::dhcp::DHCPRELEASE, isc::dhcp::DHCPREQUEST, LOG_DEBUG, and LOG_INFO.
Referenced by accept().
|
protected |
Verifies if the server id belongs to our server.
This function checks if the server identifier carried in the specified DHCPv4 message belongs to this server. If the server identifier option is absent or the value carried by this option is equal to one of the server identifiers used by the server, the true is returned. If the server identifier option is present, but it doesn't match any server identifier used by this server, the false value is returned.
pkt | DHCPv4 message which server identifier is to be checked. |
Definition at line 3596 of file dhcp4_srv.cc.
References DHCP4_OPTION_SPACE, isc::dhcp::DHO_DHCP_SERVER_IDENTIFIER, isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::IfaceMgr::hasOpenSocket(), isc::dhcp::CfgMgr::instance(), isc::dhcp::IfaceMgr::instance(), and isc::asiolink::IOAddress::isV4().
Referenced by accept().
|
protected |
Set IP/UDP and interface parameters for the DHCPv4 response.
This method sets the following parameters for the DHCPv4 message being sent to a client:
Internally it calls the Dhcpv4Srv::adjustRemoteAddr
to figure out the destination address (client unicast address or broadcast address).
The destination port is always DHCPv4 client (68) or relay (67) port, depending if the response will be sent directly to a client, unless a client port was enforced from the command line.
The source port is always set to DHCPv4 server port (67).
The interface selected for the response is always the same as the one through which the query has been received.
The source address for the response is the IPv4 address assigned to the interface being used to send the response. This function uses IfaceMgr
to get the socket bound to the IPv4 address on the particular interface.
ex | The exchange holding both the client's message and the server's response. |
Definition at line 2682 of file dhcp4_srv.cc.
References adjustRemoteAddr(), checkRelayPort(), client_port_, isc::dhcp::DHCPINFORM, isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::IfaceMgr::getSocket(), isc::dhcp::CfgMgr::instance(), isc::dhcp::IfaceMgr::instance(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), isc::asiolink::IOAddress::isV4Bcast(), server_port_, isc::dhcp::CfgIface::SOCKET_UDP, and isc::dhcp::CfgIface::USE_ROUTING.
Referenced by processDiscover(), processInform(), and processRequest().
|
protected |
Sets remote addresses for outgoing packet.
This method sets the local and remote addresses on outgoing packet. The addresses being set depend on the following conditions:
ex | The exchange holding both the client's message and the server's response. |
Definition at line 2770 of file dhcp4_srv.cc.
References isc::dhcp::DHCPINFORM, isc::dhcp::DHCPNAK, isc::dhcp::Pkt4::FLAG_BROADCAST_MASK, isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), getSendResponsesToSource(), isc::dhcp::IfaceMgr::instance(), isc::asiolink::IOAddress::IPV4_BCAST_ADDRESS(), and isc::dhcp::IfaceMgr::isDirectResponseSupported().
Referenced by adjustIfaceData().
|
protected |
Append basic options if they are not present.
This function adds the following basic options if they are not yet added to the response message:
ex | DHCPv4 exchange holding the client's message to be checked. |
Definition at line 1881 of file dhcp4_srv.cc.
References DHCP4_OPTION_SPACE, isc::dhcp::DHO_DHCP_SERVER_IDENTIFIER, isc::dhcp::DHO_DOMAIN_NAME, isc::dhcp::DHO_DOMAIN_NAME_SERVERS, isc::dhcp::DHO_ROUTERS, isc::dhcp::Dhcpv4Exchange::getCfgOptionList(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::Dhcpv4Exchange::getResponse(), and isc::dhcp::OptionDescriptor::option_.
Referenced by processDiscover(), processInform(), and processRequest().
|
protected |
Appends options requested by client.
This method assigns options that were requested by client (sent in PRL) or are enforced by server.
ex | The exchange holding both the client's message and the server's response. |
Definition at line 1693 of file dhcp4_srv.cc.
References DHCP4_OPTION_SPACE, isc::dhcp::DHO_DHCP_PARAMETER_REQUEST_LIST, isc::dhcp::Dhcpv4Exchange::getCfgOptionList(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), and isc::dhcp::OptionDescriptor::option_.
Referenced by processDiscover(), processInform(), and processRequest().
|
protected |
Appends requested vendor options as requested by client.
This method is similar to appendRequestedOptions(), but uses vendor options. The major difference is that vendor-options use its own option spaces (there may be more than one distinct set of vendor options, each with unique vendor-id). Vendor options are requested using separate options within their respective vendor-option spaces.
ex | The exchange holding both the client's message and the server's response. |
Definition at line 1764 of file dhcp4_srv.cc.
References isc::dhcp::DHO_VIVSO_SUBOPTIONS, DOCSIS3_V4_ORO, isc::dhcp::Dhcpv4Exchange::getCfgOptionList(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::OptionVendor::getVendorId(), isc::dhcp::OptionDescriptor::option_, and isc::dhcp::Option::V4.
Referenced by processDiscover(), processInform(), and processRequest().
|
staticprotected |
Adds server identifier option to the server's response.
This method adds a server identifier to the DHCPv4 message if it doesn't exist yet. This is set to the local address on which the client's query has been received with the exception of broadcast traffic and DHCPv4o6 query for which a socket on the particular interface is found and its address is used as server id.
Dhcpv4Srv
class.ex | The exchange holding both the client's message and the server's response. |
Definition at line 1594 of file dhcp4_srv.cc.
References isc::dhcp::DHO_DHCP_SERVER_IDENTIFIER, isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::IfaceMgr::getSocket(), isc::dhcp::IfaceMgr::instance(), and isc::asiolink::IOAddress::isV4Bcast().
Referenced by processDiscover(), processInform(), and processRequest().
|
protected |
Assigns a lease and appends corresponding options.
This method chooses the most appropriate lease for requesting client and assigning it. Options corresponding to the lease are added to specific message.
This method may reset the pointer to the response in the ex
object to indicate that the response should not be sent to the client. The caller must check if the response is is null after calling this method.
The response type in the ex
object may be set to DHCPACK or DHCPNAK.
ex | DHCPv4 exchange holding the client's message to be checked. |
Definition at line 2236 of file dhcp4_srv.cc.
References alloc_engine_, isc::dhcp::bad_packet4_logger, createNameChangeRequests(), isc::dhcp::DBG_DHCP4_BASIC_DATA, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::ddns4_logger, isc::dhcp::Dhcpv4Exchange::deleteResponse(), isc::dhcp::DHCP4_CLIENTID_IGNORED_FOR_LEASES, isc::dhcp::DHCP4_INIT_REBOOT, isc::dhcp::DHCP4_LEASE_ADVERT, isc::dhcp::DHCP4_LEASE_ALLOC, isc::dhcp::DHCP4_LEASE_REUSE, isc::dhcp::dhcp4_logger, isc::dhcp::DHCP4_NCR_CREATE, isc::dhcp::DHCP4_NCR_CREATION_FAILED, isc::dhcp::DHCP4_NO_LEASE_INIT_REBOOT, isc::dhcp::DHCP4_PACKET_NAK_0001, isc::dhcp::DHCP4_PACKET_NAK_0002, isc::dhcp::DHCP4_PACKET_NAK_0003, isc::dhcp::DHCP4_PACKET_NAK_0004, isc::dhcp::DHCP4_SUBNET_DYNAMICALLY_CHANGED, isc::dhcp::DHCPDISCOVER, isc::dhcp::DHCPNAK, isc::dhcp::DHO_DHCP_LEASE_TIME, isc::dhcp::DHO_DHCP_REQUESTED_ADDRESS, isc::dhcp::DHO_DHCP_SERVER_IDENTIFIER, isc::dhcp::DHO_FQDN, isc::dhcp::DHO_HOST_NAME, isc::dhcp::getCalloutHandle(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::LeaseMgr::getLease4(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::LeaseMgrFactory::instance(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), isc::dhcp::lease4_logger, isc::dhcp::Lease::lifetimeToText(), LOG_DEBUG, LOG_ERROR, LOG_INFO, isc::dhcp::packet4_logger, postAllocateNameUpdate(), processClientName(), setTeeTimes(), isc::dhcp::Option::V4, and isc::Exception::what().
Referenced by processDiscover(), and processRequest().
|
protected |
Build the configured option list.
CfgOption
objects used to append options to the response.ex | The exchange where the configured option list is cached |
Definition at line 1618 of file dhcp4_srv.cc.
References isc::dhcp::ClientClasses::cbegin(), isc::dhcp::ClientClasses::cend(), isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::DHCP4_CLASS_UNCONFIGURED, isc::dhcp::dhcp4_logger, isc::dhcp::Dhcpv4Exchange::getCfgOptionList(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::CfgMgr::instance(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), isc::dhcp::isClientClassBuiltIn(), isc::asiolink::IOAddress::isV4Zero(), LOG_DEBUG, and isc::dhcp::Lease::TYPE_V4.
Referenced by processDiscover(), processInform(), and processRequest().
|
staticprotected |
Check if the relay port RAI sub-option was set in the query.
ex | The exchange holding the client's message |
Definition at line 2669 of file dhcp4_srv.cc.
References isc::dhcp::DHO_DHCP_AGENT_OPTIONS, and isc::dhcp::Dhcpv4Exchange::getQuery().
Referenced by adjustIfaceData().
void isc::dhcp::Dhcpv4Srv::classifyByVendor | ( | const Pkt4Ptr & | pkt | ) |
Assign class using vendor-class-identifier option.
pkt | packet to be classified |
|
protected |
Assigns incoming packet to zero or more classes.
pkt | packet to be classified |
Definition at line 3734 of file dhcp4_srv.cc.
References isc::dhcp::Dhcpv4Exchange::classifyPacket().
Referenced by processPacket().
|
protected |
Creates NameChangeRequests which correspond to the lease which has been acquired.
If this function is called when an existing lease is renewed, it may generate NameChangeRequest to remove existing DNS entries which correspond to the old lease instance. This function may cease to generate NameChangeRequests if the notion of the client's FQDN hasn't changed between an old and new lease.
lease | A pointer to the new lease which has been acquired. |
old_lease | A pointer to the instance of the old lease which has |
ddns_params | DDNS configuration parameters been replaced by the new lease passed in the first argument. The NULL value indicates that the new lease has been allocated, rather than lease being renewed. |
Definition at line 2209 of file dhcp4_srv.cc.
References isc::dhcp_ddns::CHG_ADD, isc::dhcp_ddns::CHG_REMOVE, isc::dhcp::DdnsParams::getEnableUpdates(), isc::dhcp::DdnsParams::getUpdateOnRenew(), isc_throw, and isc::dhcp::queueNCR().
Referenced by assignLease().
|
virtual |
Implements the error handler for DHCP_DDNS IO errors.
Invoked when a NameChangeRequest send to kea-dhcp-ddns completes with a failed status. These are communications errors, not data related failures.
This method logs the failure and then suspends all further updates. Updating can only be restored by reconfiguration or restarting the server. There is currently no retry logic so the first IO error that occurs will suspend updates.
result | Result code of the send operation. |
ncr | NameChangeRequest which failed to send. |
Definition at line 3922 of file dhcp4_srv.cc.
References isc::dhcp::ddns4_logger, isc::dhcp::DHCP4_DDNS_REQUEST_SEND_FAILED, isc::dhcp::CfgMgr::getD2ClientMgr(), isc::dhcp::CfgMgr::instance(), LOG_ERROR, and isc::dhcp::D2ClientMgr::suspendUpdates().
Referenced by startD2().
void isc::dhcp::Dhcpv4Srv::declineLease | ( | const Lease4Ptr & | lease, |
const Pkt4Ptr & | decline, | ||
AllocEngine::ClientContext4Ptr & | context | ||
) |
Marks lease as declined.
This method moves a lease to declined state with all the steps involved:
lease | lease to be declined |
decline | client's message |
context | reference to a client context |
Definition at line 3325 of file dhcp4_srv.cc.
References isc::dhcp_ddns::CHG_REMOVE, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_DECLINE_FAIL, isc::dhcp::DHCP4_DECLINE_LEASE, isc::dhcp::DHCP4_HOOK_DECLINE_SKIP, isc::dhcp::getCalloutHandle(), isc::hooks::hooks_logger, isc::dhcp::CfgMgr::instance(), isc::dhcp::LeaseMgrFactory::instance(), isc::dhcp::lease4_logger, LOG_DEBUG, LOG_ERROR, LOG_INFO, isc::dhcp::queueNCR(), isc::dhcp::LeaseMgr::updateLease4(), and isc::Exception::what().
Referenced by processDecline().
|
protected |
Perform deferred option unpacking.
query | Pointer to the client message. |
Definition at line 3830 of file dhcp4_srv.cc.
References isc::dhcp::bad_packet4_logger, isc::dhcp::ClientClasses::cbegin(), isc::dhcp::ClientClasses::cend(), isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_DEFERRED_OPTION_MISSING, isc::dhcp::DHCP4_DEFERRED_OPTION_UNPACK_FAIL, DHCP4_OPTION_SPACE, isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::LibDHCP::getLastResortOptionDef(), isc::dhcp::LibDHCP::getOptionDef(), isc::dhcp::LibDHCP::getRuntimeOptionDef(), isc::dhcp::CfgMgr::instance(), LOG_DEBUG, and isc::dhcp::Option::V4.
Referenced by processPacket().
void isc::dhcp::Dhcpv4Srv::discardPackets | ( | ) |
Discards parked packets Clears the packet parking lots of all packets.
Called during reconfigure and shutdown.
Definition at line 4067 of file dhcp4_srv.cc.
Referenced by isc::dhcp::configureDhcp4Server(), and ~Dhcpv4Srv().
|
inline |
Returns an object which controls access to the configuration backends.
Definition at line 306 of file dhcp4_srv.h.
References cb_control_.
Referenced by isc::dhcp::configureDhcp4Server().
|
static |
Returns the index for "buffer4_receive" hook point.
Definition at line 4039 of file dhcp4_srv.cc.
|
static |
Returns the index for "buffer4_send" hook point.
Definition at line 4059 of file dhcp4_srv.cc.
Referenced by isc::dhcp::Dhcp4to6Ipc::handler().
|
static |
Returns the index for "lease4_decline" hook point.
Definition at line 4063 of file dhcp4_srv.cc.
|
static |
Returns the index for "lease4_release" hook point.
Definition at line 4051 of file dhcp4_srv.cc.
|
static |
Returns the index for "pkt4_receive" hook point.
Definition at line 4043 of file dhcp4_srv.cc.
|
static |
Returns the index for "pkt4_send" hook point.
Definition at line 4055 of file dhcp4_srv.cc.
|
static |
Returns the index for "subnet4_select" hook point.
Definition at line 4047 of file dhcp4_srv.cc.
|
inline |
Returns pointer to the IO service used by the server.
Definition at line 292 of file dhcp4_srv.h.
Referenced by isc::dhcp::ControlledDhcpv4Srv::ControlledDhcpv4Srv(), isc::dhcp::ControlledDhcpv4Srv::processConfig(), run(), and isc::dhcp::ControlledDhcpv4Srv::shutdownServer().
|
inline |
Returns pointer to the network state used by the server.
Definition at line 297 of file dhcp4_srv.h.
References network_state_.
Referenced by isc::dhcp::ControlledDhcpv4Srv::processConfig().
|
inline |
Returns value of the test_send_responses_to_source_ flag.
Definition at line 452 of file dhcp4_srv.h.
Referenced by adjustRemoteAddr().
|
inline |
Get UDP port on which server should listen.
Typically, server listens on UDP port number 67. Other ports are used for testing purposes only.
Definition at line 399 of file dhcp4_srv.h.
Referenced by isc::dhcp::ControlledDhcpv4Srv::processConfig().
|
static |
returns Kea version on stdout and exit.
redeclaration/redefinition. isc::process::Daemon::getVersion()
Definition at line 3937 of file dhcp4_srv.cc.
References isc::dhcp::CqlLeaseMgr::getDBVersion(), isc::dhcp::Memfile_LeaseMgr::getDBVersion(), isc::dhcp::PgSqlLeaseMgr::getDBVersion(), and isc::dhcp::MySqlLeaseMgr::getDBVersion().
|
inline |
Checks if the server is running in unit test mode.
Definition at line 287 of file dhcp4_srv.h.
References server_port_.
|
finaloverridevirtual |
Return a list of all paths that contain passwords or secrets for kea-dhcp4.
Reimplemented from isc::process::Daemon.
Definition at line 4072 of file dhcp4_srv.cc.
|
protected |
Update client name and DNS flags in the lease and response.
There are two cases when the client name (FQDN or hostname) and DNS flags need to updated after the lease has been allocated:
In the first case this function will generate the name from the lease address. In either case, the name and DNS flags are updated in the lease and in the response packet.
ctx | reference to the client context |
lease | reference to the client lease |
query | reference to the client query |
resp | reference to the client response |
client_name_changed | - true if the new values are already in the lease |
Definition at line 2563 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::ddns4_logger, isc::dhcp::DHCP4_POST_ALLOCATION_NAME_UPDATE_FAIL, isc::dhcp::DHCP4_RESPONSE_HOSTNAME_GENERATE, isc::dhcp::DHO_FQDN, isc::dhcp::DHO_HOST_NAME, isc::dhcp::Option4ClientFqdn::FULL, isc::dhcp::D2ClientMgr::generateFqdn(), isc::dhcp::CfgMgr::getD2ClientMgr(), isc::dhcp::CfgMgr::instance(), isc::dhcp::LeaseMgrFactory::instance(), LOG_DEBUG, LOG_ERROR, isc::dhcp::LeaseMgr::updateLease4(), and isc::Exception::what().
Referenced by assignLease().
|
protected |
Processes Client FQDN and Hostname Options sent by a client.
Client may send Client FQDN or Hostname option to communicate its name to the server. Server may use this name to perform DNS update for the lease being assigned to a client. If server takes responsibility for updating DNS for a client it may communicate it by sending the Client FQDN or Hostname Option back to the client. Server select a different name than requested by a client to update DNS. In such case, the server stores this different name in its response.
Client should not send both Client FQDN and Hostname options. However, if client sends both options, server should prefer Client FQDN option and ignore the Hostname option. If Client FQDN option is not present, the Hostname option is processed.
The Client FQDN Option is processed by this function as described in RFC4702.
In response to a Hostname Option sent by a client, the server may send Hostname option with the same or different hostname. If different hostname is sent, it is an indication to the client that server has overridden the client's preferred name and will rather use this different name to update DNS. However, since Hostname option doesn't carry an information whether DNS update will be carried by the server or not, the client is responsible for checking whether DNS update has been performed.
After successful processing options stored in the first parameter, this function may add Client FQDN or Hostname option to the response message. In some cases, server may cease to add any options to the response, i.e. when server doesn't support DNS updates.
This function does not throw. It simply logs the debug message if the processing of the FQDN or Hostname failed.
ex | The exchange holding both the client's message and the server's response. |
Definition at line 1927 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_DETAIL_DATA, isc::dhcp::ddns4_logger, isc::dhcp::DHCP4_CLIENT_FQDN_PROCESS, isc::dhcp::DHCP4_CLIENT_HOSTNAME_PROCESS, isc::dhcp::DHCP4_CLIENT_NAME_PROC_FAIL, isc::dhcp::DHO_FQDN, isc::dhcp::DHO_HOST_NAME, isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::CfgMgr::getD2ClientMgr(), isc::dhcp::Option4ClientFqdn::getDomainName(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::D2ClientMgr::getUpdateDirections(), isc::dhcp::OptionString::getValue(), isc::dhcp::CfgMgr::instance(), LOG_DEBUG, and isc::Exception::what().
Referenced by assignLease().
|
protected |
Process incoming DHCPDECLINE messages.
This method processes incoming DHCPDECLINE. In particular, it extracts Requested IP Address option, checks that the address really belongs to the client and if it does, calls declineLease.
decline | message received from client | |
[out] | context | pointer to the client context where declined lease is stored. |
Definition at line 3252 of file dhcp4_srv.cc.
References declineLease(), isc::dhcp::DHCP4_DECLINE_LEASE_MISMATCH, isc::dhcp::DHCP4_DECLINE_LEASE_NOT_FOUND, isc::dhcp::dhcp4_logger, isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::dhcp::DHO_DHCP_REQUESTED_ADDRESS, isc::dhcp::LeaseMgr::getLease4(), isc::dhcp::LeaseMgrFactory::instance(), isc_throw, LOG_WARN, OPTIONAL, and sanityCheck().
Referenced by processDhcp4Query().
void isc::dhcp::Dhcpv4Srv::processDhcp4Query | ( | Pkt4Ptr & | query, |
Pkt4Ptr & | rsp, | ||
bool | allow_packet_park | ||
) |
Process a single incoming DHCPv4 query.
It calls per-type processXXX methods, generates appropriate answer.
query | A pointer to the packet to be processed. |
rsp | A pointer to the response. |
allow_packet_park | Indicates if parking a packet is allowed. |
Definition at line 1262 of file dhcp4_srv.cc.
References isc::stats::StatsMgr::addValue(), isc::dhcp::bad_packet4_logger, isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_HOOK_LEASES4_COMMITTED_DROP, isc::dhcp::DHCP4_HOOK_LEASES4_COMMITTED_PARK, isc::dhcp::DHCP4_PACKET_DROP_0007, isc::dhcp::DHCPDECLINE, isc::dhcp::DHCPDISCOVER, isc::dhcp::DHCPINFORM, isc::dhcp::DHCPRELEASE, isc::dhcp::DHCPREQUEST, isc::dhcp::getCalloutHandle(), isc::hooks::hooks_logger, isc::stats::StatsMgr::instance(), LOG_DEBUG, isc::dhcp::makeContinuation(), processDecline(), processDhcp4QueryAndSendResponse(), processDiscover(), processInform(), processPacketBufferSend(), processPacketPktSend(), processRelease(), processRequest(), sendResponseNoThrow(), and isc::dhcp::ClientHandler::tryLock().
Referenced by processDhcp4QueryAndSendResponse(), and processPacket().
void isc::dhcp::Dhcpv4Srv::processDhcp4QueryAndSendResponse | ( | Pkt4Ptr & | query, |
Pkt4Ptr & | rsp, | ||
bool | allow_packet_park | ||
) |
Process a single incoming DHCPv4 query.
It calls per-type processXXX methods, generates appropriate answer, sends the answer to the client.
query | A pointer to the packet to be processed. |
rsp | A pointer to the response. |
allow_packet_park | Indicates if parking a packet is allowed. |
Definition at line 1243 of file dhcp4_srv.cc.
References isc::dhcp::DHCP4_PACKET_PROCESS_EXCEPTION, isc::dhcp::DHCP4_PACKET_PROCESS_STD_EXCEPTION, isc::dhcp::getCalloutHandle(), LOG_ERROR, isc::dhcp::packet4_logger, processDhcp4Query(), and processPacketBufferSend().
Referenced by processDhcp4Query().
Processes incoming DISCOVER and returns response.
Processes received DISCOVER message and verifies that its sender should be served. In particular, a lease is selected and sent as an offer to a client if it should be served.
discover | DISCOVER message received from client |
Definition at line 2989 of file dhcp4_srv.cc.
References adjustIfaceData(), alloc_engine_, appendBasicOptions(), appendRequestedOptions(), appendRequestedVendorOptions(), appendServerID(), assignLease(), buildCfgOptionList(), isc::dhcp::Dhcpv4Exchange::conditionallySetReservedClientClasses(), FORBIDDEN, isc::dhcp::Dhcpv4Exchange::getResponse(), requiredClassify(), sanityCheck(), selectSubnet(), and setFixedFields().
Referenced by processDhcp4Query().
Processes incoming DHCPINFORM messages.
inform | message received from client |
Definition at line 3414 of file dhcp4_srv.cc.
References adjustIfaceData(), alloc_engine_, appendBasicOptions(), appendRequestedOptions(), appendRequestedVendorOptions(), appendServerID(), buildCfgOptionList(), isc::dhcp::Dhcpv4Exchange::conditionallySetReservedClientClasses(), isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_INFORM_DIRECT_REPLY, isc::dhcp::DHO_DHCP_AGENT_OPTIONS, isc::dhcp::Dhcpv4Exchange::getResponse(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), LOG_DEBUG, OPTIONAL, isc::dhcp::packet4_logger, requiredClassify(), sanityCheck(), selectSubnet(), and setFixedFields().
Referenced by processDhcp4Query().
void isc::dhcp::Dhcpv4Srv::processPacket | ( | Pkt4Ptr & | query, |
Pkt4Ptr & | rsp, | ||
bool | allow_packet_park = true |
||
) |
Process a single incoming DHCPv4 packet.
It verifies correctness of the passed packet, calls per-type processXXX methods, generates appropriate answer.
query | A pointer to the packet to be processed. |
rsp | A pointer to the response. |
allow_packet_park | Indicates if parking a packet is allowed. |
Definition at line 1070 of file dhcp4_srv.cc.
References accept(), isc::stats::StatsMgr::addValue(), isc::dhcp::bad_packet4_logger, classifyPacket(), isc::dhcp::DBG_DHCP4_BASIC_DATA, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_DETAIL_DATA, isc::dhcp::DBG_DHCP4_HOOKS, isc::log::DBGLVL_TRACE_BASIC, deferredUnpack(), isc::dhcp::DHCP4_BUFFER_UNPACK, isc::dhcp::DHCP4_HOOK_BUFFER_RCVD_DROP, isc::dhcp::DHCP4_HOOK_BUFFER_RCVD_SKIP, isc::dhcp::DHCP4_HOOK_PACKET_RCVD_SKIP, isc::dhcp::DHCP4_PACKET_DROP_0001, isc::dhcp::DHCP4_PACKET_DROP_0010, isc::dhcp::DHCP4_PACKET_OPTIONS_SKIPPED, isc::dhcp::DHCP4_PACKET_RECEIVED, isc::dhcp::DHCP4_QUERY_DATA, isc::dhcp::getCalloutHandle(), isc::hooks::hooks_logger, isc::stats::StatsMgr::instance(), LOG_DEBUG, isc::dhcp::options4_logger, isc::dhcp::packet4_logger, processDhcp4Query(), processStatsReceived(), and isc::Exception::what().
Referenced by isc::dhcp::Dhcp4to6Ipc::handler(), and processPacketAndSendResponse().
void isc::dhcp::Dhcpv4Srv::processPacketAndSendResponse | ( | Pkt4Ptr & | query | ) |
Process a single incoming DHCPv4 packet and sends the response.
It verifies correctness of the passed packet, calls per-type processXXX methods, generates appropriate answer, sends the answer to the client.
query | A pointer to the packet to be processed. |
Definition at line 1058 of file dhcp4_srv.cc.
References isc::dhcp::getCalloutHandle(), processPacket(), and processPacketBufferSend().
Referenced by processPacketAndSendResponseNoThrow(), and run_one().
void isc::dhcp::Dhcpv4Srv::processPacketAndSendResponseNoThrow | ( | Pkt4Ptr & | query | ) |
Process a single incoming DHCPv4 packet and sends the response.
It verifies correctness of the passed packet, calls per-type processXXX methods, generates appropriate answer, sends the answer to the client.
query | A pointer to the packet to be processed. |
Definition at line 1046 of file dhcp4_srv.cc.
References isc::dhcp::DHCP4_PACKET_PROCESS_EXCEPTION, isc::dhcp::DHCP4_PACKET_PROCESS_STD_EXCEPTION, LOG_ERROR, isc::dhcp::packet4_logger, and processPacketAndSendResponse().
Referenced by run_one().
|
protected |
Executes buffer4_send callout and sends the response.
callout_handle | pointer to the callout handle. |
rsp | pointer to a response. |
Definition at line 1501 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::DBG_DHCP4_DETAIL_DATA, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_HOOK_BUFFER_SEND_SKIP, isc::dhcp::DHCP4_PACKET_SEND, isc::dhcp::DHCP4_PACKET_SEND_FAIL, isc::dhcp::DHCP4_RESPONSE_DATA, isc::hooks::hooks_logger, LOG_DEBUG, LOG_ERROR, isc::dhcp::packet4_logger, processStatsSent(), and sendPacket().
Referenced by processDhcp4Query(), processDhcp4QueryAndSendResponse(), processPacketAndSendResponse(), and sendResponseNoThrow().
|
protected |
Executes pkt4_send callout.
callout_handle | pointer to the callout handle. |
query | Pointer to a query. |
rsp | Pointer to a response. |
Callouts decided to drop the packet.
Definition at line 1435 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_HOOK_PACKET_SEND_DROP, isc::dhcp::DHCP4_HOOK_PACKET_SEND_SKIP, isc::dhcp::DHCP4_PACKET_PACK, isc::dhcp::DHCP4_PACKET_PACK_FAIL, isc::hooks::hooks_logger, LOG_DEBUG, LOG_ERROR, and isc::dhcp::options4_logger.
Referenced by processDhcp4Query(), and sendResponseNoThrow().
|
protected |
Processes incoming DHCPRELEASE messages.
In DHCPv4, server does not respond to RELEASE messages, therefore this function does not return anything.
release | message received from client | |
[out] | context | pointer to the client context where released lease is stored. |
Definition at line 3136 of file dhcp4_srv.cc.
References isc::dhcp_ddns::CHG_REMOVE, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::LeaseMgr::deleteLease(), isc::dhcp::DHCP4_HOOK_LEASE4_RELEASE_SKIP, isc::dhcp::DHCP4_RELEASE, isc::dhcp::DHCP4_RELEASE_EXCEPTION, isc::dhcp::DHCP4_RELEASE_FAIL, isc::dhcp::DHCP4_RELEASE_FAIL_NO_LEASE, isc::dhcp::DHCP4_RELEASE_FAIL_WRONG_CLIENT, isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::dhcp::getCalloutHandle(), isc::dhcp::LeaseMgr::getLease4(), isc::hooks::hooks_logger, isc::dhcp::LeaseMgrFactory::instance(), isc::dhcp::lease4_logger, LOG_DEBUG, LOG_ERROR, LOG_INFO, OPTIONAL, isc::dhcp::queueNCR(), sanityCheck(), and isc::Exception::what().
Referenced by processDhcp4Query().
|
protected |
Processes incoming REQUEST and returns REPLY response.
Processes incoming REQUEST message and verifies that its sender should be served. In particular, verifies that requested lease is valid, not expired, not reserved, not used by other client and that requesting client is allowed to use it.
Returns ACK message, NAK message, or NULL
request | a message received from client | |
[out] | context | pointer to the client context where allocated and deleted leases are stored. |
Definition at line 3059 of file dhcp4_srv.cc.
References adjustIfaceData(), alloc_engine_, appendBasicOptions(), appendRequestedOptions(), appendRequestedVendorOptions(), appendServerID(), assignLease(), buildCfgOptionList(), isc::dhcp::Dhcpv4Exchange::conditionallySetReservedClientClasses(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::Dhcpv4Exchange::getResponse(), OPTIONAL, requiredClassify(), sanityCheck(), selectSubnet(), and setFixedFields().
Referenced by processDhcp4Query().
|
static |
Class methods for DHCPv4-over-DHCPv6 handler.
Updates statistics for received packets
query | packet received |
Definition at line 3964 of file dhcp4_srv.cc.
References isc::stats::StatsMgr::addValue(), isc::dhcp::DHCPACK, isc::dhcp::DHCPDECLINE, isc::dhcp::DHCPDISCOVER, isc::dhcp::DHCPINFORM, isc::dhcp::DHCPNAK, isc::dhcp::DHCPOFFER, isc::dhcp::DHCPRELEASE, isc::dhcp::DHCPREQUEST, and isc::stats::StatsMgr::instance().
Referenced by processPacket().
|
static |
Updates statistics for transmitted packets.
response | packet transmitted |
Definition at line 4013 of file dhcp4_srv.cc.
References isc::stats::StatsMgr::addValue(), isc::dhcp::DHCPACK, isc::dhcp::DHCPNAK, isc::dhcp::DHCPOFFER, and isc::stats::StatsMgr::instance().
Referenced by isc::dhcp::Dhcp4to6Ipc::handler(), and processPacketBufferSend().
|
protectedvirtual |
dummy wrapper around IfaceMgr::receive4
This method is useful for testing purposes, where its replacement simulates reception of a packet. For that purpose it is protected.
Definition at line 923 of file dhcp4_srv.cc.
References isc::dhcp::IfaceMgr::instance().
Referenced by run_one().
Attempts to renew received addresses.
Attempts to renew existing lease. This typically includes finding a lease that corresponds to the received address. If no such lease is found, a status code response is generated.
renew | client's message asking for renew |
reply | server's response (ACK or NAK) |
|
protected |
Assigns incoming packet to zero or more classes (required pass).
ex | The exchange holding needed information. |
Definition at line 3738 of file dhcp4_srv.cc.
References isc::dhcp::ClientClasses::cbegin(), isc::dhcp::ClientClasses::cend(), isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_CLASS_UNDEFINED, isc::dhcp::DHCP4_CLASS_UNTESTABLE, isc::dhcp::dhcp4_logger, isc::dhcp::EVAL_RESULT, isc::dhcp::evaluateBool(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::ClientClasses::insert(), isc::dhcp::CfgMgr::instance(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), isc::asiolink::IOAddress::isV4Zero(), LOG_DEBUG, LOG_ERROR, LOG_INFO, isc::dhcp::options4_logger, isc::dhcp::Lease::TYPE_V4, and isc::Exception::what().
Referenced by processDiscover(), processInform(), and processRequest().
int isc::dhcp::Dhcpv4Srv::run | ( | ) |
Main server processing loop.
Main server processing loop. Call the processing step routine until shut down.
Daemon::getExitValue()
. Definition at line 933 of file dhcp4_srv.cc.
References isc::dhcp::DHCP4_PACKET_PROCESS_EXCEPTION, isc::dhcp::DHCP4_PACKET_PROCESS_STD_EXCEPTION, isc::process::Daemon::getExitValue(), getIOService(), LOG_ERROR, isc::dhcp::packet4_logger, run_one(), server_port_, and shutdown_.
Referenced by main().
void isc::dhcp::Dhcpv4Srv::run_one | ( | ) |
Main server processing step.
Main server processing step. Receives one incoming packet, calls the processing packet routing and (if necessary) transmits a response.
Definition at line 973 of file dhcp4_srv.cc.
References isc::dhcp::bad_packet4_logger, isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DHCP4_BUFFER_RECEIVE_FAIL, isc::dhcp::DHCP4_BUFFER_RECEIVED, isc::dhcp::DHCP4_BUFFER_WAIT_SIGNAL, isc::dhcp::dhcp4_logger, isc::dhcp::DHCP4_PACKET_DROP_0008, isc::dhcp::DHCP4_PACKET_QUEUE_FULL, LOG_DEBUG, LOG_ERROR, network_state_, isc::dhcp::packet4_logger, processPacketAndSendResponse(), processPacketAndSendResponseNoThrow(), and receivePacket().
Referenced by run().
|
staticprotected |
Verifies if specified packet meets RFC requirements.
Checks if mandatory option is really there, that forbidden option is not there, and that client-id or server-id appears only once.
query | Pointer to the client's message. |
serverid | expectation regarding server-id option |
RFCViolation | if any issues are detected |
Definition at line 3693 of file dhcp4_srv.cc.
References isc::dhcp::DHO_DHCP_CLIENT_IDENTIFIER, isc::dhcp::DHO_DHCP_SERVER_IDENTIFIER, FORBIDDEN, isc_throw, MANDATORY, and OPTIONAL.
Referenced by processDecline(), processDiscover(), processInform(), processRelease(), and processRequest().
|
protected |
Selects a subnet for a given client's packet.
If selectSubnet is called to simply do sanity checks (check if a subnet would be selected), then there is no need to call hooks, as this will happen later (when selectSubnet is called again). In such case the sanity_only should be set to true.
query | client's message |
drop | if it is true the packet will be dropped |
sanity_only | if it is true the callout won't be called |
Definition at line 719 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_BASIC_DATA, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_DETAIL_DATA, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_HOOK_SUBNET4_SELECT_DROP, isc::dhcp::DHCP4_HOOK_SUBNET4_SELECT_SKIP, isc::dhcp::DHCP4_SUBNET_DATA, isc::dhcp::DHCP4_SUBNET_SELECTED, isc::dhcp::DHCP4_SUBNET_SELECTION_FAILED, isc::dhcp::getCalloutHandle(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::hooks::hooks_logger, isc::dhcp::CfgSubnets4::initSelector(), isc::dhcp::CfgMgr::instance(), LOG_DEBUG, isc::dhcp::packet4_logger, and selectSubnet4o6().
Referenced by acceptDirectRequest(), processDiscover(), processInform(), and processRequest().
|
protected |
Selects a subnet for a given client's DHCP4o6 packet.
If selectSubnet is called to simply do sanity checks (check if a subnet would be selected), then there is no need to call hooks, as this will happen later (when selectSubnet is called again). In such case the sanity_only should be set to true.
query | client's message |
drop | if it is true the packet will be dropped |
sanity_only | if it is true the callout won't be called |
Definition at line 805 of file dhcp4_srv.cc.
References isc::dhcp::SubnetSelector::ciaddr_, isc::dhcp::SubnetSelector::client_classes_, D6O_INTERFACE_ID, isc::dhcp::DBG_DHCP4_BASIC_DATA, isc::dhcp::DBG_DHCP4_DETAIL, isc::dhcp::DBG_DHCP4_DETAIL_DATA, isc::dhcp::DBG_DHCP4_HOOKS, isc::dhcp::DHCP4_HOOK_SUBNET4_SELECT_DROP, isc::dhcp::DHCP4_HOOK_SUBNET4_SELECT_SKIP, isc::dhcp::DHCP4_SUBNET_DATA, isc::dhcp::DHCP4_SUBNET_SELECTED, isc::dhcp::DHCP4_SUBNET_SELECTION_FAILED, isc::dhcp::SubnetSelector::dhcp4o6_, isc::dhcp::DHO_SUBNET_SELECTION, isc::dhcp::SubnetSelector::first_relay_linkaddr_, isc::dhcp::getCalloutHandle(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::SubnetSelector::giaddr_, isc::hooks::hooks_logger, isc::dhcp::SubnetSelector::iface_name_, isc::dhcp::CfgMgr::instance(), isc::dhcp::SubnetSelector::interface_id_, isc_throw, isc::asiolink::IOAddress::isV6LinkLocal(), isc::asiolink::IOAddress::isV6Zero(), isc::dhcp::Pkt6::RelayInfo::linkaddr_, isc::dhcp::SubnetSelector::local_address_, LOG_DEBUG, isc::dhcp::SubnetSelector::option_select_, isc::dhcp::packet4_logger, isc::dhcp::Pkt6::RELAY_GET_FIRST, and isc::dhcp::SubnetSelector::remote_address_.
Referenced by selectSubnet().
|
protectedvirtual |
dummy wrapper around IfaceMgr::send()
This method is useful for testing purposes, where its replacement simulates transmission of a packet. For that purpose it is protected.
Definition at line 928 of file dhcp4_srv.cc.
References isc::dhcp::IfaceMgr::instance(), and isc::dhcp::IfaceMgr::send().
Referenced by processPacketBufferSend().
void isc::dhcp::Dhcpv4Srv::sendResponseNoThrow | ( | hooks::CalloutHandlePtr & | callout_handle, |
Pkt4Ptr & | query, | ||
Pkt4Ptr & | rsp | ||
) |
Process an unparked DHCPv4 packet and sends the response.
callout_handle | pointer to the callout handle. |
query | A pointer to the packet to be processed. |
rsp | A pointer to the response. |
Definition at line 1421 of file dhcp4_srv.cc.
References isc::dhcp::DHCP4_PACKET_PROCESS_EXCEPTION, isc::dhcp::DHCP4_PACKET_PROCESS_STD_EXCEPTION, LOG_ERROR, isc::dhcp::packet4_logger, processPacketBufferSend(), and processPacketPktSend().
Referenced by processDhcp4Query().
|
protected |
Sets fixed fields of the outgoing packet.
If the incoming packets belongs to a class and that class defines next-server, server-hostname or boot-file-name, we need to set the siaddr, sname or filename fields in the outgoing packet. Also, those values can be defined for subnet or in reservations. The values defined in reservation takes precedence over class values, which in turn take precedence over subnet values.
ex | DHCPv4 exchange holding the client's message and the server's response to be adjusted. |
Definition at line 2871 of file dhcp4_srv.cc.
References isc::dhcp::ClientClasses::cbegin(), isc::dhcp::ClientClasses::cend(), isc::dhcp::ClientClasses::empty(), isc::dhcp::Dhcpv4Exchange::getContext(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::dhcp::Dhcpv4Exchange::getQuery(), isc::dhcp::Dhcpv4Exchange::getResponse(), isc::dhcp::CfgMgr::instance(), isc::asiolink::IOAddress::IPV4_ZERO_ADDRESS(), isc::asiolink::IOAddress::isV4Zero(), and isc::dhcp::Dhcpv4Exchange::setReservedMessageFields().
Referenced by processDiscover(), processInform(), and processRequest().
|
protected |
This function sets statistics related to DHCPv4 packets processing to their initial values.
All of the statistics observed by the DHCPv4 server and with the names like "pkt4-" are reset to 0. This function must be invoked in the class constructor.
Definition at line 663 of file dhcp4_srv.cc.
References isc::stats::StatsMgr::instance(), and isc::stats::StatsMgr::setValue().
Referenced by Dhcpv4Srv().
|
inlineprotected |
Sets value of the test_send_responses_to_source_ flag.
value | new value of the test_send_responses_to_source_ flag. |
Definition at line 786 of file dhcp4_srv.h.
|
protected |
Adds the T1 and T2 timers to the outbound response as appropriate.
This method determines if either of the timers T1 (option 58) and T2 (option 59) should be sent to the client. It is influenced by the lease's subnet's values for renew-timer, rebind-timer, calculate-tee-times, t1-percent, and t2-percent as follows:
By default neither T1 nor T2 will be sent.
T2:
If rebind-timer is set use its value, otherwise if calculate-tee-times is true use the value given by valid lease time * t2-percent. Either way the value will only be sent if it is less than the valid lease time.
T1:
If renew-timer is set use its value, otherwise if calculate-tee-times is true use the value given by valid lease time * t1-percent. Either way the value will only be sent if it is less than T2 when T2 is being sent, or less than the valid lease time if T2 is not being sent.
lease | lease being assigned to the client |
subnet | the subnet to which the lease belongs |
resp | outbound response for the client to which timers are added. |
Definition at line 2630 of file dhcp4_srv.cc.
References isc::dhcp::DHO_DHCP_REBINDING_TIME, isc::dhcp::DHO_DHCP_RENEWAL_TIME, and isc::dhcp::Option::V4.
Referenced by assignLease().
|
overridevirtual |
Instructs the server to shut down.
Reimplemented from isc::process::Daemon.
Definition at line 713 of file dhcp4_srv.cc.
References isc::dhcp::DBG_DHCP4_BASIC, isc::dhcp::dhcp4_logger, isc::dhcp::DHCP4_SHUTDOWN_REQUEST, LOG_DEBUG, and shutdown_.
Referenced by isc::dhcp::ControlledDhcpv4Srv::shutdownServer().
|
staticprotected |
converts server-id to text Converts content of server-id option to a text representation, e.g.
"192.0.2.1"
opt | option that contains server-id |
Definition at line 1574 of file dhcp4_srv.cc.
References isc_throw.
void isc::dhcp::Dhcpv4Srv::startD2 | ( | ) |
Starts DHCP_DDNS client IO if DDNS updates are enabled.
If updates are enabled, it instructs the D2ClientMgr singleton to enter send mode. If D2ClientMgr encounters errors it may throw D2ClientError. This method does not catch exceptions.
Definition at line 3901 of file dhcp4_srv.cc.
References d2ClientErrorHandler(), isc::dhcp::D2ClientMgr::ddnsEnabled(), isc::dhcp::CfgMgr::getD2ClientMgr(), isc::dhcp::CfgMgr::instance(), and isc::dhcp::D2ClientMgr::startSender().
Referenced by isc::dhcp::ControlledDhcpv4Srv::processConfig().
void isc::dhcp::Dhcpv4Srv::stopD2 | ( | ) |
Stops DHCP_DDNS client IO if DDNS updates are enabled.
If updates are enabled, it instructs the D2ClientMgr singleton to leave send mode. If D2ClientMgr encounters errors it may throw D2ClientError. This method does not catch exceptions.
Definition at line 3913 of file dhcp4_srv.cc.
References isc::dhcp::D2ClientMgr::ddnsEnabled(), isc::dhcp::CfgMgr::getD2ClientMgr(), isc::dhcp::CfgMgr::instance(), and isc::dhcp::D2ClientMgr::stopSender().
Referenced by ~Dhcpv4Srv().
|
inline |
Return bool value indicating that broadcast flags should be set on sockets.
Definition at line 407 of file dhcp4_srv.h.
References use_bcast_.
|
protected |
Allocation Engine.
Pointer to the allocation engine that we are currently using It must be a pointer, because we will support changing engines during normal operation (e.g. to use different allocators)
Definition at line 1107 of file dhcp4_srv.h.
Referenced by assignLease(), Dhcpv4Srv(), processDiscover(), processInform(), and processRequest().
|
protected |
Controls access to the configuration backends.
Definition at line 1117 of file dhcp4_srv.h.
Referenced by getCBControl().
|
protected |
UDP port number to which server sends all responses.
Definition at line 1097 of file dhcp4_srv.h.
Referenced by adjustIfaceData().
|
protected |
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
Definition at line 1114 of file dhcp4_srv.h.
Referenced by getNetworkState(), and run_one().
|
protected |
UDP port number on which server listens.
Definition at line 1094 of file dhcp4_srv.h.
Referenced by adjustIfaceData(), inTestMode(), and run().
|
protected |
Indicates if shutdown is in progress.
Setting it to true will initiate server shutdown procedure.
Definition at line 1101 of file dhcp4_srv.h.
Referenced by Dhcpv4Srv(), run(), and shutdown().
|
protected |
Should broadcast be enabled on sockets (if true).
Definition at line 1110 of file dhcp4_srv.h.
Referenced by useBroadcast().
|
static |
this is a prefix added to the content of vendor-class option
If incoming packet has a vendor class option, its content is prepended with this prefix and then interpreted as a class. For example, a packet that sends vendor class with value of "FOO" will cause the packet to be assigned to class VENDOR_CLASS_FOO.
Definition at line 798 of file dhcp4_srv.h.
Referenced by isc::dhcp::Dhcpv4Exchange::classifyByVendor().