Kea 1.5.0
dhcp6_srv.h
Go to the documentation of this file.
1// Copyright (C) 2011-2018 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 DHCPV6_SRV_H
8#define DHCPV6_SRV_H
9
10#include <asiolink/io_service.h>
11#include <dhcp_ddns/ncr_msg.h>
12#include <dhcp/dhcp6.h>
13#include <dhcp/duid.h>
14#include <dhcp/option.h>
16#include <dhcp/option6_ia.h>
18#include <dhcp/pkt6.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
46public:
47 DHCPv6DiscardMessageError(const char* file, size_t line, const char* what) :
48 isc::Exception(file, line, what) { };
49};
50
59class Dhcpv6Srv : public process::Daemon {
60private:
61
63 asiolink::IOServicePtr io_service_;
64
65public:
67 typedef enum {
72
74 static const size_t MIN_MAC_LEN = 6;
75
84 Dhcpv6Srv(uint16_t port = DHCP6_SERVER_PORT);
85
87 virtual ~Dhcpv6Srv();
88
91 return (io_service_);
92 }
93
96 return (network_state_);
97 }
98
101 static std::string getVersion(bool extended);
102
107
114 bool run();
115
121 void run_one();
122
130 void processPacket(Pkt6Ptr& query, Pkt6Ptr& rsp);
131
133 void shutdown();
134
141 uint16_t getPort() const {
142 return (port_);
143 }
144
150 void startD2();
151
157 void stopD2();
158
173 virtual void d2ClientErrorHandler(const dhcp_ddns::
174 NameChangeSender::Result result,
176
180 void discardPackets();
181
182protected:
183
192 bool testServerID(const Pkt6Ptr& pkt);
193
204 bool testUnicast(const Pkt6Ptr& pkt) const;
205
214 bool sanityCheck(const Pkt6Ptr& pkt);
215
225 void sanityCheck(const Pkt6Ptr& pkt, RequirementLevel clientid,
226 RequirementLevel serverid);
227
233 void sanityCheckDUID(const OptionPtr& opt, const std::string& opt_name);
234
250
263
270
283
308
315
327
334
344 void processDhcp4Query(const Pkt6Ptr& dhcp4_query);
345
351 isc::dhcp::Subnet6Ptr selectSubnet(const Pkt6Ptr& question, bool& drop);
352
370 const isc::dhcp::Pkt6Ptr& answer,
372 Option6IAPtr ia);
373
387 OptionPtr assignIA_PD(const Pkt6Ptr& query,
388 const isc::dhcp::Pkt6Ptr& answer,
390 boost::shared_ptr<Option6IA> ia);
391
407 OptionPtr extendIA_NA(const Pkt6Ptr& query, const Pkt6Ptr& answer,
409 Option6IAPtr ia);
410
464 OptionPtr extendIA_PD(const Pkt6Ptr& query,
466 Option6IAPtr ia);
467
486 OptionPtr releaseIA_NA(const DuidPtr& duid, const Pkt6Ptr& query,
487 int& general_status,
488 boost::shared_ptr<Option6IA> ia,
489 Lease6Ptr& old_lease);
490
504 OptionPtr releaseIA_PD(const DuidPtr& duid, const Pkt6Ptr& query,
505 int& general_status,
506 boost::shared_ptr<Option6IA> ia,
507 Lease6Ptr& old_lease);
508
518 void copyClientOptions(const Pkt6Ptr& question, Pkt6Ptr& answer);
519
528 void buildCfgOptionList(const Pkt6Ptr& question,
530 CfgOptionList& co_list);
531
541 void appendDefaultOptions(const Pkt6Ptr& question, Pkt6Ptr& answer,
542 const CfgOptionList& co_list);
543
552 void appendRequestedOptions(const Pkt6Ptr& question, Pkt6Ptr& answer,
553 const CfgOptionList& co_list);
554
564 void appendRequestedVendorOptions(const Pkt6Ptr& question, Pkt6Ptr& answer,
566 const CfgOptionList& co_list);
567
578 void assignLeases(const Pkt6Ptr& question, Pkt6Ptr& answer,
580
625 void processClientFqdn(const Pkt6Ptr& question, const Pkt6Ptr& answer,
627
645 void createNameChangeRequests(const Pkt6Ptr& answer,
647
659 void extendLeases(const Pkt6Ptr& query, Pkt6Ptr& reply,
661
672 void releaseLeases(const Pkt6Ptr& release, Pkt6Ptr& reply,
674
681 static std::string duidToString(const OptionPtr& opt);
682
687 virtual Pkt6Ptr receivePacket(int timeout);
688
693 virtual void sendPacket(const Pkt6Ptr& pkt);
694
705 void classifyPacket(const Pkt6Ptr& pkt);
706
717 void evaluateClasses(const Pkt6Ptr& pkt, bool depend_on_known);
718
723 void setReservedClientClasses(const Pkt6Ptr& pkt,
724 const AllocEngine::ClientContext6& ctx);
725
738
746 static HWAddrPtr getMAC(const Pkt6Ptr& pkt);
747
756 void processRSOO(const Pkt6Ptr& query, const Pkt6Ptr& rsp);
757
778 void initContext(const Pkt6Ptr& pkt,
780 bool& drop);
781
788 static const std::string VENDOR_CLASS_PREFIX;
789
800 bool declineLeases(const Pkt6Ptr& decline, Pkt6Ptr& reply,
802
817 declineIA(const Pkt6Ptr& decline, const DuidPtr& duid, int& general_status,
818 boost::shared_ptr<Option6IA> ia, Lease6Collection& new_leases);
819
836 bool declineLease(const Pkt6Ptr& decline, const Lease6Ptr lease,
837 boost::shared_ptr<Option6IA> ia_rsp);
838
844 void setStatusCode(boost::shared_ptr<Option6IA>& container,
845 const OptionPtr& status);
846
847public:
848
850
855 static uint16_t checkRelaySourcePort(const Pkt6Ptr& query);
856
857private:
858
866 void classifyByVendor(const Pkt6Ptr& pkt, std::string& classes);
867
884 void updateReservedFqdn(const AllocEngine::ClientContext6& ctx,
885 const Pkt6Ptr& answer);
886
928 void generateFqdn(const Pkt6Ptr& answer);
929
932 static void processStatsReceived(const Pkt6Ptr& query);
933
941 bool requestedInORO(const Pkt6Ptr& query, const uint16_t code) const;
942
944 uint16_t port_;
945
946public:
948
951 static void processStatsSent(const Pkt6Ptr& response);
952
955 static int getHookIndexBuffer6Send();
956
962 Pkt6Ptr& rsp);
963
964protected:
965
968
971 volatile bool shutdown_;
972
979 Pkt6Ptr& query, Pkt6Ptr& rsp);
980
985 boost::shared_ptr<AllocEngine> alloc_engine_;
986
989 std::queue<isc::dhcp_ddns::NameChangeRequest> name_change_reqs_;
990
994
995};
996
997}; // namespace isc::dhcp
998}; // namespace isc
999
1000#endif // DHCP6_SRV_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
This exception is thrown when DHCP server hits the error which should result in discarding the messag...
Definition: dhcp6_srv.h:45
DHCPv6DiscardMessageError(const char *file, size_t line, const char *what)
Definition: dhcp6_srv.h:47
DHCPv6 server service.
Definition: dhcp6_srv.h:59
std::queue< isc::dhcp_ddns::NameChangeRequest > name_change_reqs_
Holds a list of isc::dhcp_ddns::NameChangeRequest objects, which are waiting for sending to kea-dhcp-...
Definition: dhcp6_srv.h:989
void run_one()
Main server processing step.
Definition: dhcp6_srv.cc:424
RequirementLevel
defines if certain option may, must or must not appear
Definition: dhcp6_srv.h:67
OptionPtr getServerID()
Returns server-identifier option.
Definition: dhcp6_srv.h:106
OptionPtr extendIA_PD(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Extends lifetime of the prefix.
Definition: dhcp6_srv.cc:2100
void setReservedClientClasses(const Pkt6Ptr &pkt, const AllocEngine::ClientContext6 &ctx)
Assigns classes retrieved from host reservation database.
Definition: dhcp6_srv.cc:3395
Pkt6Ptr processDecline(AllocEngine::ClientContext6 &ctx)
Process incoming Decline message.
Definition: dhcp6_srv.cc:2969
void evaluateClasses(const Pkt6Ptr &pkt, bool depend_on_known)
Evaluate classes.
Definition: dhcp6_srv.cc:3346
Pkt6Ptr processRenew(AllocEngine::ClientContext6 &ctx)
Processes incoming Renew message.
Definition: dhcp6_srv.cc:2801
static void processStatsSent(const Pkt6Ptr &response)
Updates statistics for transmitted packets.
Definition: dhcp6_srv.cc:3786
bool sanityCheck(const Pkt6Ptr &pkt)
Verifies if specified packet meets RFC requirements.
Definition: dhcp6_srv.cc:1249
static uint16_t checkRelaySourcePort(const Pkt6Ptr &query)
Used for DHCPv4-over-DHCPv6 too.
Definition: dhcp6_srv.cc:3715
void assignLeases(const Pkt6Ptr &question, Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Assigns leases.
Definition: dhcp6_srv.cc:1439
void stopD2()
Stops DHCP_DDNS client IO if DDNS updates are enabled.
Definition: dhcp6_srv.cc:3630
void copyClientOptions(const Pkt6Ptr &question, Pkt6Ptr &answer)
Copies required options from client message to server answer.
Definition: dhcp6_srv.cc:1028
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
Definition: dhcp6_srv.h:985
virtual void sendPacket(const Pkt6Ptr &pkt)
dummy wrapper around IfaceMgr::send()
Definition: dhcp6_srv.cc:254
bool testServerID(const Pkt6Ptr &pkt)
Compare received server id with our server id.
Definition: dhcp6_srv.cc:259
void processPacketPktSend(hooks::CalloutHandlePtr &callout_handle, Pkt6Ptr &query, Pkt6Ptr &rsp)
Executes pkt6_send callout.
Definition: dhcp6_srv.cc:886
virtual void d2ClientErrorHandler(const dhcp_ddns::NameChangeSender::Result result, dhcp_ddns::NameChangeRequestPtr &ncr)
Implements the error handler for DHCP_DDNS IO errors.
Definition: dhcp6_srv.cc:3639
OptionPtr assignIA_PD(const Pkt6Ptr &query, const isc::dhcp::Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, boost::shared_ptr< Option6IA > ia)
Processes IA_PD option (and assigns prefixes if necessary).
Definition: dhcp6_srv.cc:1828
OptionPtr declineIA(const Pkt6Ptr &decline, const DuidPtr &duid, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Collection &new_leases)
Declines leases in a single IA_NA option.
Definition: dhcp6_srv.cc:3042
virtual Pkt6Ptr receivePacket(int timeout)
dummy wrapper around IfaceMgr::receive6
Definition: dhcp6_srv.cc:250
void processPacketBufferSend(hooks::CalloutHandlePtr &callout_handle, Pkt6Ptr &rsp)
Executes buffer6_send callout and sends the response.
Definition: dhcp6_srv.cc:951
void requiredClassify(const Pkt6Ptr &pkt, AllocEngine::ClientContext6 &ctx)
Assigns incoming packet to zero or more classes (required pass).
Definition: dhcp6_srv.cc:3414
OptionPtr releaseIA_NA(const DuidPtr &duid, const Pkt6Ptr &query, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Ptr &old_lease)
Releases specific IA_NA option.
Definition: dhcp6_srv.cc:2383
void buildCfgOptionList(const Pkt6Ptr &question, AllocEngine::ClientContext6 &ctx, CfgOptionList &co_list)
Build the configured option list.
Definition: dhcp6_srv.cc:1051
void appendDefaultOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, const CfgOptionList &co_list)
Appends default options to server's answer.
Definition: dhcp6_srv.cc:1044
static const std::string VENDOR_CLASS_PREFIX
this is a prefix added to the content of vendor-class option
Definition: dhcp6_srv.h:788
OptionPtr serverid_
Server DUID (to be sent in server-identifier option)
Definition: dhcp6_srv.h:967
void initContext(const Pkt6Ptr &pkt, AllocEngine::ClientContext6 &ctx, bool &drop)
Initializes client context for specified packet.
Definition: dhcp6_srv.cc:303
OptionPtr extendIA_NA(const Pkt6Ptr &query, const Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Extends lifetime of the specific IA_NA option.
Definition: dhcp6_srv.cc:1942
OptionPtr releaseIA_PD(const DuidPtr &duid, const Pkt6Ptr &query, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Ptr &old_lease)
Releases specific IA_PD option.
Definition: dhcp6_srv.cc:2556
void processDhcp4Query(const Pkt6Ptr &dhcp4_query)
Processes incoming DHCPv4-query message.
Definition: dhcp6_srv.cc:3290
Pkt6Ptr processRebind(AllocEngine::ClientContext6 &ctx)
Processes incoming Rebind message.
Definition: dhcp6_srv.cc:2827
void classifyByVendor(const Pkt6Ptr &pkt, std::string &classes)
Assign class using vendor-class-identifier option.
Definition: dhcp6_srv.cc:3312
void shutdown()
Instructs the server to shut down.
Definition: dhcp6_srv.cc:245
static const size_t MIN_MAC_LEN
Minimum length of a MAC address to be used in DUID generation.
Definition: dhcp6_srv.h:74
NetworkStatePtr & getNetworkState()
Returns pointer to the network state used by the server.
Definition: dhcp6_srv.h:95
virtual ~Dhcpv6Srv()
Destructor. Used during DHCPv6 service shutdown.
Definition: dhcp6_srv.cc:221
Pkt6Ptr processRequest(AllocEngine::ClientContext6 &ctx)
Processes incoming Request and returns Reply response.
Definition: dhcp6_srv.cc:2775
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
Definition: dhcp6_srv.h:993
void processPacket(Pkt6Ptr &query, Pkt6Ptr &rsp)
Process a single incoming DHCPv6 packet.
Definition: dhcp6_srv.cc:519
bool testUnicast(const Pkt6Ptr &pkt) const
Check if the message can be sent to unicast.
Definition: dhcp6_srv.cc:282
Pkt6Ptr processRelease(AllocEngine::ClientContext6 &ctx)
Process incoming Release message.
Definition: dhcp6_srv.cc:2943
uint16_t getPort() const
Get UDP port on which server should listen.
Definition: dhcp6_srv.h:141
void processClientFqdn(const Pkt6Ptr &question, const Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Processes Client FQDN Option.
Definition: dhcp6_srv.cc:1499
void setStatusCode(boost::shared_ptr< Option6IA > &container, const OptionPtr &status)
A simple utility method that sets the status code.
Definition: dhcp6_srv.cc:3167
static int getHookIndexBuffer6Send()
Returns the index of the buffer6_send hook.
Definition: dhcp6_srv.cc:3810
void classifyPacket(const Pkt6Ptr &pkt)
Assigns incoming packet to zero or more classes.
Definition: dhcp6_srv.cc:3334
static HWAddrPtr getMAC(const Pkt6Ptr &pkt)
Attempts to get a MAC/hardware address using configured sources.
Definition: dhcp6_srv.cc:1692
bool declineLeases(const Pkt6Ptr &decline, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to decline all leases in specified Decline message.
Definition: dhcp6_srv.cc:2999
void releaseLeases(const Pkt6Ptr &release, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to release received addresses.
Definition: dhcp6_srv.cc:2324
void extendLeases(const Pkt6Ptr &query, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to extend the lifetime of IAs.
Definition: dhcp6_srv.cc:2283
void processRSOO(const Pkt6Ptr &query, const Pkt6Ptr &rsp)
Processes Relay-supplied options, if present.
Definition: dhcp6_srv.cc:3681
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
Definition: dhcp6_srv.cc:3654
Pkt6Ptr processConfirm(AllocEngine::ClientContext6 &ctx)
Processes incoming Confirm message and returns Reply.
Definition: dhcp6_srv.cc:2853
void sanityCheckDUID(const OptionPtr &opt, const std::string &opt_name)
verifies if received DUID option (client-id or server-id) is sane
Definition: dhcp6_srv.cc:1348
bool run()
Main server processing loop.
Definition: dhcp6_srv.cc:404
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
Definition: dhcp6_srv.h:90
void appendRequestedOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, const CfgOptionList &co_list)
Appends requested options to server's answer.
Definition: dhcp6_srv.cc:1120
volatile bool shutdown_
Indicates if shutdown is in progress.
Definition: dhcp6_srv.h:971
Pkt6Ptr processSolicit(AllocEngine::ClientContext6 &ctx)
Processes incoming Solicit and returns response.
Definition: dhcp6_srv.cc:2717
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
Definition: dhcp6_srv.cc:3618
static std::string duidToString(const OptionPtr &opt)
converts DUID to text Converts content of DUID option to a text representation, e....
Definition: dhcp6_srv.cc:1008
void createNameChangeRequests(const Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Creates a number of isc::dhcp_ddns::NameChangeRequest objects based on the DHCPv6 Client FQDN Option.
Definition: dhcp6_srv.cc:1572
Pkt6Ptr processInfRequest(AllocEngine::ClientContext6 &ctx)
Processes incoming Information-request message.
Definition: dhcp6_srv.cc:3259
isc::dhcp::Subnet6Ptr selectSubnet(const Pkt6Ptr &question, bool &drop)
Selects a subnet for a given client's packet.
Definition: dhcp6_srv.cc:1363
OptionPtr assignIA_NA(const isc::dhcp::Pkt6Ptr &query, const isc::dhcp::Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Processes IA_NA option (and assigns addresses if necessary).
Definition: dhcp6_srv.cc:1707
void appendRequestedVendorOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, const CfgOptionList &co_list)
Appends requested vendor options to server's answer.
Definition: dhcp6_srv.cc:1172
bool declineLease(const Pkt6Ptr &decline, const Lease6Ptr lease, boost::shared_ptr< Option6IA > ia_rsp)
Declines specific IPv6 lease.
Definition: dhcp6_srv.cc:3176
void discardPackets()
Discards cached and parked packets Clears the call_handle store and packet parking lots of all packet...
Definition: dhcp6_srv.cc:3827
Base class for all services.
Definition: daemon.h:49
Defines the D2ClientMgr class.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
Definition: ncr_msg.h:214
boost::shared_ptr< DUID > DuidPtr
Definition: duid.h:21
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:463
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
Definition: lease.h:604
boost::shared_ptr< Option6IA > Option6IAPtr
A pointer to the Option6IA object.
Definition: option6_ia.h:20
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
Definition: subnet.h:629
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
Definition: hwaddr.h:154
boost::shared_ptr< NetworkState > NetworkStatePtr
Pointer to the NetworkState object.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
Definition: pkt6.h:31
boost::shared_ptr< Option > OptionPtr
Definition: option.h:38
std::list< ConstCfgOptionPtr > CfgOptionList
Const pointer list.
Definition: cfg_option.h:503
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
Defines the logger used by the top-level component of kea-dhcp-ddns.
This file provides the classes needed to embody, compose, and decompose DNS update requests that are ...
Context information for the DHCPv6 leases allocation.
Definition: alloc_engine.h:316