Kea 2.7.1
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
128 bool getIPv6OnlyPreferred() const {
129 return (ipv6_only_preferred_);
130 }
131
135 void setIPv6OnlyPreferred(bool ipv6_only_preferred) {
136 ipv6_only_preferred_ = ipv6_only_preferred;
137 }
138
142
152
159 static void removeDependentEvaluatedClasses(const Pkt4Ptr& query);
160
165
174
185 static void classifyPacket(const Pkt4Ptr& pkt);
186
197 static void evaluateClasses(const Pkt4Ptr& pkt, bool depend_on_known);
198
199private:
200
207 static void classifyByVendor(const Pkt4Ptr& pkt);
208
218 void copyDefaultFields();
219
229 void copyDefaultOptions();
230
232 AllocEnginePtr alloc_engine_;
233
235 Pkt4Ptr query_;
236
238 Pkt4Ptr resp_;
239
242
246 CfgOptionList cfg_option_list_;
247
249 bool ipv6_only_preferred_;
250};
251
253typedef boost::shared_ptr<Dhcpv4Exchange> Dhcpv4ExchangePtr;
254
255
269private:
270
272 asiolink::IOServicePtr io_service_;
273
274public:
275
282
302 Dhcpv4Srv(uint16_t server_port = DHCP4_SERVER_PORT,
303 uint16_t client_port = 0,
304 const bool use_bcast = true,
305 const bool direct_response_desired = true);
306
308 virtual ~Dhcpv4Srv();
309
314 bool inTestMode() const {
315 return (server_port_ == 0);
316 }
317
320 return (io_service_);
321 }
322
327
334 return (cb_control_);
335 }
336
339 static std::string getVersion(bool extended);
340
347 int run();
348
354 void runOne();
355
363
371
378 void sendResponseNoThrow(hooks::CalloutHandlePtr& callout_handle,
379 Pkt4Ptr& query, Pkt4Ptr& rsp, Subnet4Ptr& subnet);
380
389 Pkt4Ptr processPacket(Pkt4Ptr query, bool allow_answer_park = true);
390
399 Pkt4Ptr processDhcp4Query(Pkt4Ptr query, bool allow_answer_park);
400
409 bool allow_answer_park);
410
419 bool allow_answer_park);
420
431 bool allow_answer_park);
432
441 bool allow_answer_park);
442
444 void shutdown() override;
445
449
450
457 uint16_t getServerPort() const {
458 return (server_port_);
459 }
460
465 bool useBroadcast() const {
466 return (use_bcast_);
467 }
469
475 void startD2();
476
482 void stopD2();
483
498 virtual void d2ClientErrorHandler(const dhcp_ddns::
499 NameChangeSender::Result result,
500 dhcp_ddns::NameChangeRequestPtr& ncr);
501
505 void discardPackets();
506
511 return (test_send_responses_to_source_);
512 }
513
518 void initContext0(const Pkt4Ptr& query,
520
528 bool earlyGHRLookup(const Pkt4Ptr& query,
530
531protected:
532
539
540
560 bool accept(const Pkt4Ptr& query);
561
589 bool acceptDirectRequest(const Pkt4Ptr& query);
590
609 bool acceptMessageType(const Pkt4Ptr& query) const;
610
624 bool acceptServerId(const Pkt4Ptr& pkt) const;
626
636 static void sanityCheck(const Pkt4Ptr& query);
637
646 static void sanityCheck(const Pkt4Ptr& query, RequirementLevel serverid);
647
659
675
685
696
704
712
721
733
747 bool assignZero(Subnet4Ptr& subnet, const ClientClasses& client_classes);
748
763 void assignLease(Dhcpv4Exchange& ex);
764
783 const Lease4Ptr& lease, const Pkt4Ptr& query,
784 const Pkt4Ptr& resp, bool client_name_changed);
785
811 void setTeeTimes(const Lease4Ptr& lease, const Subnet4Ptr& subnet, Pkt4Ptr resp);
812
825
838
877
885
889 void setSendResponsesToSource(bool value) {
890 test_send_responses_to_source_ = value;
891 }
892
907 void serverDecline(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr& query,
908 Lease4Ptr lease, bool lease_exists);
909
920 void serverDeclineNoThrow(hooks::CalloutHandlePtr& callout_handle, Pkt4Ptr& query,
921 Lease4Ptr lease, bool lease_exists);
922
923public:
924
931 static const std::string VENDOR_CLASS_PREFIX;
932
933private:
944 void processClientFqdnOption(Dhcpv4Exchange& ex);
945
977 void processHostnameOption(Dhcpv4Exchange& ex);
978
992 void declineLease(const Lease4Ptr& lease, const Pkt4Ptr& decline,
994
995protected:
996
1012 void createNameChangeRequests(const Lease4Ptr& lease,
1013 const Lease4Ptr& old_lease,
1014 const DdnsParams& ddns_params);
1015
1024 void renewLease(const Pkt4Ptr& renew, Pkt4Ptr& reply);
1025
1044 static void appendServerID(Dhcpv4Exchange& ex);
1045
1050 static uint16_t checkRelayPort(const Dhcpv4Exchange& ex);
1051
1087
1104
1111 static std::string srvidToString(const OptionPtr& opt);
1112
1126 bool& drop,
1127 bool sanity_only = false,
1128 bool allow_answer_park = true);
1129
1143 bool& drop,
1144 bool sanity_only = false,
1145 bool allow_answer_park = true);
1146
1151 virtual Pkt4Ptr receivePacket(int timeout);
1152
1157 virtual void sendPacket(const Pkt4Ptr& pkt);
1158
1169 void classifyPacket(const Pkt4Ptr& pkt);
1170
1188 void recoverStashedAgentOption(const Pkt4Ptr& query);
1189
1190protected:
1191
1203
1213 void deferredUnpack(Pkt4Ptr& query);
1214
1221 void processPacketPktSend(hooks::CalloutHandlePtr& callout_handle,
1222 Pkt4Ptr& query, Pkt4Ptr& rsp, Subnet4Ptr& subnet);
1223
1229 Pkt4Ptr& rsp);
1230
1231private:
1232
1238 void classifyByVendor(const Pkt4Ptr& pkt);
1239
1244 static OptionPtr getNetmaskOption(const Subnet4Ptr& subnet);
1245
1252 static std::tuple<bool, uint32_t> parkingLimitExceeded(std::string const& hook_label);
1253
1254protected:
1255
1258
1261
1264 volatile bool shutdown_;
1265
1270 boost::shared_ptr<AllocEngine> alloc_engine_;
1271
1274
1278
1281
1282private:
1283
1286 bool test_send_responses_to_source_;
1287
1288public:
1289
1291
1294 static void processStatsReceived(const Pkt4Ptr& query);
1295
1298 static void processStatsSent(const Pkt4Ptr& response);
1299
1302 static int getHookIndexBuffer4Receive();
1303
1306 static int getHookIndexPkt4Receive();
1307
1310 static int getHookIndexSubnet4Select();
1311
1314 static int getHookIndexLease4Release();
1315
1318 static int getHookIndexPkt4Send();
1319
1322 static int getHookIndexBuffer4Send();
1323
1326 static int getHookIndexLease4Decline();
1327
1333 std::list<std::list<std::string>> jsonPathsToRedact() const final override;
1334};
1335
1336} // namespace dhcp
1337} // namespace isc
1338
1339#endif // DHCP4_SRV_H
boost::shared_ptr< ClientContext4 > ClientContext4Ptr
Pointer to the ClientContext4.
Container for storing client class names.
Definition classify.h:108
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
void setIPv6OnlyPreferred(bool ipv6_only_preferred)
Set the IPv6-Only Preferred flag.
Definition dhcp4_srv.h:135
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
bool getIPv6OnlyPreferred() const
Returns the IPv6-Only Preferred flag.
Definition dhcp4_srv.h:128
void conditionallySetReservedClientClasses()
Assigns classes retrieved from host reservation database if they haven't been yet set.
Definition dhcp4_srv.cc:537
DHCPv4 server service.
Definition dhcp4_srv.h:268
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:889
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:1273
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:319
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:1270
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:1260
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:931
bool inTestMode() const
Checks if the server is running in unit test mode.
Definition dhcp4_srv.h:314
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:324
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
bool assignZero(Subnet4Ptr &subnet, const ClientClasses &client_classes)
Assign the 0.0.0.0 address to an IPv6-Only client.
void buildCfgOptionList(Dhcpv4Exchange &ex)
Build the configured option list.
volatile bool shutdown_
Indicates if shutdown is in progress.
Definition dhcp4_srv.h:1264
bool useBroadcast() const
Return bool value indicating that broadcast flags should be set on sockets.
Definition dhcp4_srv.h:465
uint16_t server_port_
UDP port number on which server listens.
Definition dhcp4_srv.h:1257
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:1277
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:510
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:457
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:333
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:1280
RequirementLevel
defines if certain option may, must or must not appear
Definition dhcp4_srv.h:277
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< Dhcpv4Exchange > Dhcpv4ExchangePtr
Type representing the pointer to the Dhcpv4Exchange.
Definition dhcp4_srv.h:253
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:295
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 ...