Kea 2.6.2
dhcp4_srv.h
Go to the documentation of this file.
1// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef DHCPV4_SRV_H
8#define DHCPV4_SRV_H
9
10#include <asiolink/io_service.h>
11#include <dhcp/dhcp4.h>
12#include <dhcp/option.h>
13#include <dhcp/option_string.h>
15#include <dhcp/option_custom.h>
16#include <dhcp/pkt4.h>
17#include <dhcp_ddns/ncr_msg.h>
21#include <dhcpsrv/cfg_option.h>
24#include <dhcpsrv/subnet.h>
26#include <process/daemon.h>
27
28#include <functional>
29#include <iostream>
30#include <queue>
31
32// Undefine the macro OPTIONAL which is defined in some operating
33// systems but conflicts with a member of the RequirementLevel enum in
34// the server class.
35
36#ifdef OPTIONAL
37#undef OPTIONAL
38#endif
39
40namespace isc {
41namespace dhcp {
42
63public:
78 Dhcpv4Exchange(const AllocEnginePtr& alloc_engine, const Pkt4Ptr& query,
80 const Subnet4Ptr& subnet, bool& drop);
81
88 void initResponse();
89
93 void initResponse4o6();
94
96 Pkt4Ptr getQuery() const {
97 return (query_);
98 }
99
104 return (resp_);
105 }
106
109 resp_.reset();
110 }
111
114 return (context_);
115 }
116
119 return (cfg_option_list_);
120 }
121
124 return (cfg_option_list_);
125 }
126
130
140
147 static void removeDependentEvaluatedClasses(const Pkt4Ptr& query);
148
153
162
173 static void classifyPacket(const Pkt4Ptr& pkt);
174
185 static void evaluateClasses(const Pkt4Ptr& pkt, bool depend_on_known);
186
187private:
188
195 static void classifyByVendor(const Pkt4Ptr& pkt);
196
206 void copyDefaultFields();
207
217 void copyDefaultOptions();
218
220 AllocEnginePtr alloc_engine_;
221
223 Pkt4Ptr query_;
224
226 Pkt4Ptr resp_;
227
230
234 CfgOptionList cfg_option_list_;
235};
236
238typedef boost::shared_ptr<Dhcpv4Exchange> Dhcpv4ExchangePtr;
239
240
254private:
255
257 asiolink::IOServicePtr io_service_;
258
259public:
260
267
287 Dhcpv4Srv(uint16_t server_port = DHCP4_SERVER_PORT,
288 uint16_t client_port = 0,
289 const bool use_bcast = true,
290 const bool direct_response_desired = true);
291
293 virtual ~Dhcpv4Srv();
294
299 bool inTestMode() const {
300 return (server_port_ == 0);
301 }
302
305 return (io_service_);
306 }
307
312
319 return (cb_control_);
320 }
321
324 static std::string getVersion(bool extended);
325
332 int run();
333
339 void runOne();
340
348
356
363 void sendResponseNoThrow(hooks::CalloutHandlePtr& callout_handle,
364 Pkt4Ptr& query, Pkt4Ptr& rsp, Subnet4Ptr& subnet);
365
374 Pkt4Ptr processPacket(Pkt4Ptr query, bool allow_answer_park = true);
375
384 Pkt4Ptr processDhcp4Query(Pkt4Ptr query, bool allow_answer_park);
385
394 bool allow_answer_park);
395
404 bool allow_answer_park);
405
416 bool allow_answer_park);
417
426 bool allow_answer_park);
427
429 void shutdown() override;
430
434
435
442 uint16_t getServerPort() const {
443 return (server_port_);
444 }
445
450 bool useBroadcast() const {
451 return (use_bcast_);
452 }
453
454
460 void startD2();
461
467 void stopD2();
468
483 virtual void d2ClientErrorHandler(const dhcp_ddns::
484 NameChangeSender::Result result,
486
490 void discardPackets();
491
496 return (test_send_responses_to_source_);
497 }
498
503 void initContext0(const Pkt4Ptr& query,
505
513 bool earlyGHRLookup(const Pkt4Ptr& query,
515
516protected:
517
524
525
545 bool accept(const Pkt4Ptr& query);
546
574 bool acceptDirectRequest(const Pkt4Ptr& query);
575
594 bool acceptMessageType(const Pkt4Ptr& query) const;
595
609 bool acceptServerId(const Pkt4Ptr& pkt) const;
611
621 static void sanityCheck(const Pkt4Ptr& query);
622
631 static void sanityCheck(const Pkt4Ptr& query, RequirementLevel serverid);
632
644
660
670
681
689
697
706
718
733 void assignLease(Dhcpv4Exchange& ex);
734
753 const Lease4Ptr& lease, const Pkt4Ptr& query,
754 const Pkt4Ptr& resp, bool client_name_changed);
755
781 void setTeeTimes(const Lease4Ptr& lease, const Subnet4Ptr& subnet, Pkt4Ptr resp);
782
795
808
847
855
859 void setSendResponsesToSource(bool value) {
860 test_send_responses_to_source_ = value;
861 }
862
877 void serverDecline(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr& query,
878 Lease4Ptr lease, bool lease_exists);
879
890 void serverDeclineNoThrow(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr& query,
891 Lease4Ptr lease, bool lease_exists);
892
893public:
894
901 static const std::string VENDOR_CLASS_PREFIX;
902
903private:
914 void processClientFqdnOption(Dhcpv4Exchange& ex);
915
947 void processHostnameOption(Dhcpv4Exchange& ex);
948
962 void declineLease(const Lease4Ptr& lease, const Pkt4Ptr& decline,
964
965protected:
966
982 void createNameChangeRequests(const Lease4Ptr& lease,
983 const Lease4Ptr& old_lease,
984 const DdnsParams& ddns_params);
985
994 void renewLease(const Pkt4Ptr& renew, Pkt4Ptr& reply);
995
1014 static void appendServerID(Dhcpv4Exchange& ex);
1015
1020 static uint16_t checkRelayPort(const Dhcpv4Exchange& ex);
1021
1057
1074
1081 static std::string srvidToString(const OptionPtr& opt);
1082
1096 bool& drop,
1097 bool sanity_only = false,
1098 bool allow_answer_park = true);
1099
1113 bool& drop,
1114 bool sanity_only = false,
1115 bool allow_answer_park = true);
1116
1121 virtual Pkt4Ptr receivePacket(int timeout);
1122
1127 virtual void sendPacket(const Pkt4Ptr& pkt);
1128
1139 void classifyPacket(const Pkt4Ptr& pkt);
1140
1158 void recoverStashedAgentOption(const Pkt4Ptr& query);
1159
1160protected:
1161
1173
1183 void deferredUnpack(Pkt4Ptr& query);
1184
1191 void processPacketPktSend(hooks::CalloutHandlePtr& callout_handle,
1192 Pkt4Ptr& query, Pkt4Ptr& rsp, Subnet4Ptr& subnet);
1193
1199 Pkt4Ptr& rsp);
1200
1201private:
1202
1208 void classifyByVendor(const Pkt4Ptr& pkt);
1209
1214 static OptionPtr getNetmaskOption(const Subnet4Ptr& subnet);
1215
1222 static std::tuple<bool, uint32_t> parkingLimitExceeded(std::string const& hook_label);
1223
1224protected:
1225
1228
1231
1234 volatile bool shutdown_;
1235
1240 boost::shared_ptr<AllocEngine> alloc_engine_;
1241
1244
1248
1251
1252private:
1253
1256 bool test_send_responses_to_source_;
1257
1258public:
1259
1261
1264 static void processStatsReceived(const Pkt4Ptr& query);
1265
1268 static void processStatsSent(const Pkt4Ptr& response);
1269
1272 static int getHookIndexBuffer4Receive();
1273
1276 static int getHookIndexPkt4Receive();
1277
1280 static int getHookIndexSubnet4Select();
1281
1284 static int getHookIndexLease4Release();
1285
1288 static int getHookIndexPkt4Send();
1289
1292 static int getHookIndexBuffer4Send();
1293
1296 static int getHookIndexLease4Decline();
1297
1303 std::list<std::list<std::string>> jsonPathsToRedact() const final override;
1304};
1305
1306} // namespace dhcp
1307} // namespace isc
1308
1309#endif // DHCP4_SRV_H
when the call the UDPServer carries on at the same position As a result
Definition asiodns.dox:16
boost::shared_ptr< ClientContext4 > ClientContext4Ptr
Pointer to the ClientContext4.
Convenience container for conveying DDNS behavioral parameters It is intended to be created per Packe...
Definition srv_config.h:48
DHCPv4 message exchange.
Definition dhcp4_srv.h:62
AllocEngine::ClientContext4Ptr getContext() const
Returns the copy of the context for the Allocation engine.
Definition dhcp4_srv.h:113
void deleteResponse()
Removes the response message by resetting the pointer to null.
Definition dhcp4_srv.h:108
const CfgOptionList & getCfgOptionList() const
Returns the configured option list (const version)
Definition dhcp4_srv.h:123
Pkt4Ptr getQuery() const
Returns the pointer to the query from the client.
Definition dhcp4_srv.h:96
static void setHostIdentifiers(AllocEngine::ClientContext4Ptr context)
Set host identifiers within a context.
Definition dhcp4_srv.cc:411
Dhcpv4Exchange(const AllocEnginePtr &alloc_engine, const Pkt4Ptr &query, AllocEngine::ClientContext4Ptr &context, const Subnet4Ptr &subnet, bool &drop)
Constructor.
Definition dhcp4_srv.cc:165
static void classifyByVendor(const Pkt4Ptr &pkt)
Assign class using vendor-class-identifier option.
Definition dhcp4_srv.cc:573
void initResponse()
Initializes the instance of the response message.
Definition dhcp4_srv.cc:283
void setReservedMessageFields()
Sets reserved values of siaddr, sname and file in the server's response.
Definition dhcp4_srv.cc:551
CfgOptionList & getCfgOptionList()
Returns the configured option list (non-const version)
Definition dhcp4_srv.h:118
Pkt4Ptr getResponse() const
Returns the pointer to the server's response.
Definition dhcp4_srv.h:103
static void setReservedClientClasses(AllocEngine::ClientContext4Ptr context)
Assigns classes retrieved from host reservation database.
Definition dhcp4_srv.cc:527
void initResponse4o6()
Initializes the DHCPv6 part of the response message.
Definition dhcp4_srv.cc:309
static void evaluateClasses(const Pkt4Ptr &pkt, bool depend_on_known)
Evaluate classes.
Definition dhcp4_srv.cc:596
static void classifyPacket(const Pkt4Ptr &pkt)
Assigns incoming packet to zero or more classes.
Definition dhcp4_srv.cc:585
static void removeDependentEvaluatedClasses(const Pkt4Ptr &query)
Removed evaluated client classes.
Definition dhcp4_srv.cc:512
void conditionallySetReservedClientClasses()
Assigns classes retrieved from host reservation database if they haven't been yet set.
Definition dhcp4_srv.cc:537
void initContext0(const Pkt4Ptr &query, AllocEngine::ClientContext4Ptr ctx)
Initialize client context (first part).
void setSendResponsesToSource(bool value)
Sets value of the test_send_responses_to_source_ flag.
Definition dhcp4_srv.h:859
int run()
Main server processing loop.
void declineLease(const Lease4Ptr &lease, const Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context)
Marks lease as declined.
void processPacketAndSendResponse(Pkt4Ptr query)
Process a single incoming DHCPv4 packet and sends the response.
void classifyPacket(const Pkt4Ptr &pkt)
Assigns incoming packet to zero or more classes.
void appendRequestedVendorOptions(Dhcpv4Exchange &ex)
Appends requested vendor options as requested by client.
void adjustIfaceData(Dhcpv4Exchange &ex)
Set IP/UDP and interface parameters for the DHCPv4 response.
isc::dhcp::Subnet4Ptr selectSubnet4o6(const Pkt4Ptr &query, bool &drop, bool sanity_only=false, bool allow_answer_park=true)
Selects a subnet for a given client's DHCP4o6 packet.
Definition dhcp4_srv.cc:865
static uint16_t checkRelayPort(const Dhcpv4Exchange &ex)
Check if the relay port RAI sub-option was set in the query.
virtual ~Dhcpv4Srv()
Destructor. Used during DHCPv4 service shutdown.
Definition dhcp4_srv.cc:683
virtual Pkt4Ptr receivePacket(int timeout)
dummy wrapper around IfaceMgr::receive4
bool accept(const Pkt4Ptr &query)
Checks whether received message should be processed or discarded.
static void appendServerID(Dhcpv4Exchange &ex)
Adds server identifier option to the server's response.
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.
bool use_bcast_
Should broadcast be enabled on sockets (if true).
Definition dhcp4_srv.h:1243
isc::dhcp::Subnet4Ptr selectSubnet(const Pkt4Ptr &query, bool &drop, bool sanity_only=false, bool allow_answer_park=true)
Selects a subnet for a given client's packet.
Definition dhcp4_srv.cc:731
void runOne()
Main server processing step.
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
static int getHookIndexBuffer4Receive()
Returns the index for "buffer4_receive" hook point.
Pkt4Ptr processRequest(Pkt4Ptr &request, AllocEngine::ClientContext4Ptr &context)
Processes incoming REQUEST and returns REPLY response.
static void processStatsReceived(const Pkt4Ptr &query)
Class methods for DHCPv4-over-DHCPv6 handler.
static int getHookIndexPkt4Send()
Returns the index for "pkt4_send" hook point.
void processDecline(Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context)
Process incoming DHCPDECLINE messages.
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.
Definition dhcp4_srv.cc:622
static int getHookIndexSubnet4Select()
Returns the index for "subnet4_select" hook point.
static void processStatsSent(const Pkt4Ptr &response)
Updates statistics for transmitted packets.
void shutdown() override
Instructs the server to shut down.
Definition dhcp4_srv.cc:725
static int getHookIndexLease4Release()
Returns the index for "lease4_release" hook point.
void adjustRemoteAddr(Dhcpv4Exchange &ex)
Sets remote addresses for outgoing packet.
static int getHookIndexPkt4Receive()
Returns the index for "pkt4_receive" hook point.
void assignLease(Dhcpv4Exchange &ex)
Assigns a lease and appends corresponding options.
Pkt4Ptr processDhcp4Query(Pkt4Ptr query, bool allow_answer_park)
Process a single incoming DHCPv4 query.
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
Definition dhcp4_srv.h:304
void setFixedFields(Dhcpv4Exchange &ex)
Sets fixed fields of the outgoing packet.
void appendBasicOptions(Dhcpv4Exchange &ex)
Append basic options if they are not present.
void recoverStashedAgentOption(const Pkt4Ptr &query)
Recover stashed agent options from client address lease.
void processClientName(Dhcpv4Exchange &ex)
Processes Client FQDN and Hostname Options sent by a client.
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
Definition dhcp4_srv.h:1240
void serverDecline(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Lease4Ptr lease, bool lease_exists)
Renders a lease declined after the server has detected, via ping-check or other means,...
void requiredClassify(Dhcpv4Exchange &ex)
Assigns incoming packet to zero or more classes (required pass).
Pkt4Ptr processInform(Pkt4Ptr &inform, AllocEngine::ClientContext4Ptr &context)
Processes incoming DHCPINFORM messages.
uint16_t client_port_
UDP port number to which server sends all responses.
Definition dhcp4_srv.h:1230
void serverDeclineNoThrow(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Lease4Ptr lease, bool lease_exists)
Exception safe wrapper around serverDecline()
void processPacketAndSendResponseNoThrow(Pkt4Ptr query)
Process a single incoming DHCPv4 packet and sends the response.
std::list< std::list< std::string > > jsonPathsToRedact() const final override
Return a list of all paths that contain passwords or secrets for kea-dhcp4.
static std::string srvidToString(const OptionPtr &opt)
converts server-id to text Converts content of server-id option to a text representation,...
bool acceptServerId(const Pkt4Ptr &pkt) const
Verifies if the server id belongs to our server.
static const std::string VENDOR_CLASS_PREFIX
this is a prefix added to the content of vendor-class option
Definition dhcp4_srv.h:901
bool inTestMode() const
Checks if the server is running in unit test mode.
Definition dhcp4_srv.h:299
void createNameChangeRequests(const Lease4Ptr &lease, const Lease4Ptr &old_lease, const DdnsParams &ddns_params)
Creates NameChangeRequests which correspond to the lease which has been acquired.
void sendResponseNoThrow(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp, Subnet4Ptr &subnet)
Process an unparked DHCPv4 packet and sends the response.
void appendRequestedOptions(Dhcpv4Exchange &ex)
Appends options requested by client.
void setPacketStatisticsDefaults()
This function sets statistics related to DHCPv4 packets processing to their initial values.
Definition dhcp4_srv.cc:673
void processLocalizedQuery4AndSendResponse(Pkt4Ptr query, AllocEngine::ClientContext4Ptr &ctx, bool allow_answer_park)
Process a localized incoming DHCPv4 query.
NetworkStatePtr & getNetworkState()
Returns pointer to the network state used by the server.
Definition dhcp4_srv.h:309
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
void buildCfgOptionList(Dhcpv4Exchange &ex)
Build the configured option list.
volatile bool shutdown_
Indicates if shutdown is in progress.
Definition dhcp4_srv.h:1234
bool useBroadcast() const
Return bool value indicating that broadcast flags should be set on sockets.
Definition dhcp4_srv.h:450
uint16_t server_port_
UDP port number on which server listens.
Definition dhcp4_srv.h:1227
bool earlyGHRLookup(const Pkt4Ptr &query, AllocEngine::ClientContext4Ptr ctx)
Initialize client context and perform early global reservations lookup.
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
Definition dhcp4_srv.h:1247
void setTeeTimes(const Lease4Ptr &lease, const Subnet4Ptr &subnet, Pkt4Ptr resp)
Adds the T1 and T2 timers to the outbound response as appropriate.
void renewLease(const Pkt4Ptr &renew, Pkt4Ptr &reply)
Attempts to renew received addresses.
void processDhcp4QueryAndSendResponse(Pkt4Ptr query, bool allow_answer_park)
Process a single incoming DHCPv4 query.
bool getSendResponsesToSource() const
Returns value of the test_send_responses_to_source_ flag.
Definition dhcp4_srv.h:495
Pkt4Ptr processDiscover(Pkt4Ptr &discover, AllocEngine::ClientContext4Ptr &context)
Processes incoming DISCOVER and returns response.
virtual void d2ClientErrorHandler(const dhcp_ddns::NameChangeSender::Result result, dhcp_ddns::NameChangeRequestPtr &ncr)
Implements the error handler for DHCP_DDNS IO errors.
uint16_t getServerPort() const
Get UDP port on which server should listen.
Definition dhcp4_srv.h:442
virtual void sendPacket(const Pkt4Ptr &pkt)
dummy wrapper around IfaceMgr::send()
static int getHookIndexBuffer4Send()
Returns the index for "buffer4_send" hook point.
void stopD2()
Stops DHCP_DDNS client IO if DDNS updates are enabled.
CBControlDHCPv4Ptr getCBControl() const
Returns an object which controls access to the configuration backends.
Definition dhcp4_srv.h:318
static void sanityCheck(const Pkt4Ptr &query)
Verifies if specified packet meets RFC requirements.
bool acceptMessageType(const Pkt4Ptr &query) const
Check if received message type is valid for the server to process.
void discardPackets()
Discards parked packets Clears the packet parking lots of all packets.
static int getHookIndexLease4Decline()
Returns the index for "lease4_decline" hook point.
void processRelease(Pkt4Ptr &release, AllocEngine::ClientContext4Ptr &context)
Processes incoming DHCPRELEASE messages.
void processPacketPktSend(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp, Subnet4Ptr &subnet)
Executes pkt4_send callout.
bool acceptDirectRequest(const Pkt4Ptr &query)
Check if a message sent by directly connected client should be accepted or discarded.
CBControlDHCPv4Ptr cb_control_
Controls access to the configuration backends.
Definition dhcp4_srv.h:1250
RequirementLevel
defines if certain option may, must or must not appear
Definition dhcp4_srv.h:262
Pkt4Ptr processPacket(Pkt4Ptr query, bool allow_answer_park=true)
Process a single incoming DHCPv4 packet.
void processPacketBufferSend(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &rsp)
Executes buffer4_send callout and sends the response.
void deferredUnpack(Pkt4Ptr &query)
Perform deferred option unpacking.
Pkt4Ptr processLocalizedQuery4(AllocEngine::ClientContext4Ptr &ctx, bool allow_answer_park)
Process a localized incoming DHCPv4 query.
Base class for all services.
Definition daemon.h:48
Defines the D2ClientMgr class.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
Definition ncr_msg.h:241
boost::shared_ptr< Dhcpv4Exchange > Dhcpv4ExchangePtr
Type representing the pointer to the Dhcpv4Exchange.
Definition dhcp4_srv.h:238
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
Definition subnet.h:458
boost::shared_ptr< Pkt4 > Pkt4Ptr
A pointer to Pkt4 object.
Definition pkt4.h:555
boost::shared_ptr< AllocEngine > AllocEnginePtr
A pointer to the AllocEngine object.
boost::shared_ptr< NetworkState > NetworkStatePtr
Pointer to the NetworkState object.
boost::shared_ptr< CBControlDHCPv4 > CBControlDHCPv4Ptr
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition lease.h:292
boost::shared_ptr< Option > OptionPtr
Definition option.h:37
std::list< ConstCfgOptionPtr > CfgOptionList
Const pointer list.
Definition cfg_option.h:809
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
Defines the logger used by the top-level component of kea-lfc.
This file provides the classes needed to embody, compose, and decompose DNS update requests that are ...