diff options
Diffstat (limited to 'src/bin/dhcp6/dhcp6_hooks.dox')
-rw-r--r-- | src/bin/dhcp6/dhcp6_hooks.dox | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/src/bin/dhcp6/dhcp6_hooks.dox b/src/bin/dhcp6/dhcp6_hooks.dox new file mode 100644 index 0000000..4c5af6f --- /dev/null +++ b/src/bin/dhcp6/dhcp6_hooks.dox @@ -0,0 +1,540 @@ +// Copyright (C) 2013-2022 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +/** + @page dhcpv6Hooks The Hooks API for the DHCPv6 Server + + @section dhcpv6HooksIntroduction Introduction + Kea features an API (the "Hooks" API) that allows user-written code to + be integrated into Kea and called at specific points in its processing. + An overview of the API and a tutorial for writing such code can be found in + the @ref hooksdgDevelopersGuide. It also includes information how hooks + framework can be used to implement additional control commands for the + DHCPv6 server. Information for Kea maintainers can be found in the + @ref hooksComponentDeveloperGuide. + + This manual is more specialized and is aimed at developers of hook + code for the DHCPv6 server. It describes each hook point, what the callouts + attached to the hook are able to do, and the arguments passed to the + callouts. Each entry in this manual has the following information: + + - Name of the hook point. + - Arguments for the callout. As well as the argument name and data type, the + information includes the direction, which can be one of: + - @b in - the server passes values to the callout but ignored any data + returned. + - @b out - the callout is expected to set this value. + - <b>in/out</b> - the server passes a value to the callout and uses whatever + value the callout sends back. Note that the callout may choose not to + do any modification, in which case the server will use whatever value + it sent to the callout. + - Description of the hook. This explains where in the processing the hook + is located, the possible actions a callout attached to this hook could take, + and a description of the data passed to the callouts. + - Next step status: the action taken by the server when a callout chooses to set + status to specified value. Actions not listed explicitly are not supported. + If a callout sets status to unsupported value, this specific value will be + ignored and treated as if the status was CONTINUE. + +@section dhcpv6HooksHookPoints Hooks in the DHCPv6 Server + +The following list is roughly ordered by appearance of specific hook points during +packet processing, but the exact order depends on the actual processing. Hook points +that are not specific to packet processing (e.g. lease expiration) will be added +to the end of this list. + + @subsection dhcp6HooksDhcpv6SrvConfigured dhcp6_srv_configured + - @b Arguments: + - name: @b io_context, type: isc::asiolink::IOServicePtr, direction: <b>in</b> + - name: @b network_state, type: isc::dhcp::NetworkStatePtr, direction: <b>in</b> + - name: @b json_config, type: isc::data::ConstElementPtr, direction: <b>in</b> + - name: @b server_config, type: isc::dhcp::SrvConfigPtr, direction: <b>in</b> + + - @b Description: this callout is executed when the server has completed + its (re)configuration. The server provides received and parsed configuration + structures to the hook library. It also provides a pointer to the IOService + object which is used by the server to run asynchronous operations. The hooks + libraries can use this IOService object to schedule asynchronous tasks which + are triggered by the DHCP server's main loop. The hook library should hold the + provided pointer until the library is unloaded. The NetworkState object + provides access to the DHCP service state of the server and allows for + enabling and disabling the DHCP service from the hooks libraries. + + + - <b>Next step status</b>: If any callout sets the status to DROP, the server + will interrupt the reconfiguration process. The hook callout is expected to + have completed the cause of the interruption under the "error" handle argument + with a std::string which is then logged. Finally, this leads to the + termination of kea-dhcp6. + + @subsection dhcpv6HooksCb6Update cb6_updated + - @b Arguments: + - name: audit_entries, type isc::db::AuditEntryCollectionPtr, direction: <b>in</b> + + - @b Description: this callout is executed when the server has completed + a configuration update using the Config Backend. The server provides + the audit entries as a never null pointer to a not empty collection + copied from the update apply method argument. + + - <b>Next step status</b>: Status codes returned by the callouts installed on + this hook point are ignored. + + @subsection dhcpv6HooksBuffer6Receive buffer6_receive + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when an incoming DHCPv6 + packet is received and the data stored in a buffer. The sole argument + "query6" contains a pointer to an @c isc::dhcp::Pkt6 object that contains + the received information stored in the data_ field. Basic information + like protocol, source/destination addresses and ports are set, but + the contents of the buffer have not yet been parsed. That means that + the @c options_ field (that will eventually contain a list of objects + representing the received options) is empty, so none of the methods + that operate on it (e.g., getOption()) will work. The primary purpose + of this early call is to offer the ability to modify incoming packets + in their raw form. Unless you need to access to the raw data, it is + usually better to install your callout on the "pkt6_receive" hook point. + + - <b>Next step status</b>: If any callout sets the status to DROP, the server + will drop the packet and start processing the next one. + If any callout sets the status to SKIP, the + server will assume that the callout parsed the buffer and added the + necessary option objects to the @c options_ field; the server will not + do any parsing. If the callout sets the skip flag but does not parse + the buffer, the server will most probably drop the packet due to + the absence of mandatory options. If you want to drop the packet, + see the description of the skip flag in the "pkt6_receive" hook point. + + @subsection dhcpv6HooksPkt6Receive pkt6_receive + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when an incoming DHCPv6 + packet is received and its content is parsed. The sole argument + "query6" contains a pointer to an @c isc::dhcp::Pkt6 object that contains + all information regarding incoming packet, including its source and + destination addresses, the interface over which it was received, a list + of all options present within and relay information. All fields of + the "query6" object can be modified at this time, except data_. (data_ + contains the incoming packet as raw buffer. By the time this hook is + reached, that information has already been parsed and is available though + other fields in the Pkt6 object. For this reason, modification of the + @c data_ field would have no effect.) + + - <b>Next step status</b>: If any callout sets the status to SKIP or DROP, the server will + drop the packet and start processing the next one. The reason for the drop + will be logged if logging is set to the appropriate debug level. + +@subsection dhcpv6HooksSubnet6Select subnet6_select + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> + - name: @b subnet6, type: isc::dhcp::Subnet6Ptr, direction: <b>in/out</b> + - name: @b subnet6collection, type: const isc::dhcp::Subnet6Collection *, direction: <b>in</b> + + - @b Description: This callout is executed when a subnet is being + selected for the incoming packet. All parameters, addresses and + prefixes will be assigned from that subnet. A callout can select a + different subnet if it wishes so, the list of all subnets currently + configured being provided as "subnet6collection". The list itself must + not be modified. + + - <b>Next step status</b>: If any callout installed on "subnet6_select" sets + the status to DROP, the server will drop the packet and start processing + the next one. If any callout installed on "subnet6_select" + sets the status to SKIP, the server will not select any subnet. Packet processing + will continue, but will be severely limited. + +@subsection dhcpv6HooksHost6Identifier host6_identifier + + - @b Arguments: + - name: @b query6, type isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b id_type, type isc::dhcp::Host::IdentifierType, direction: <b>in/out</b> + - name: @b id_value, type std::vector<uint8_t>, direction: <b>out</b> + + - @b Description: this callout is executed only if flexible identifiers are + enabled, i.e. host-reservation-identifiers contain 'flex-id' value. This + callout enables external library to provide values for flexible identifiers. + To be able to use this feature, flex_id hook library is needed. + + - <b>Next step status</b>: If a callout installed on the "host6_identifier" hook + point sets the next step status to value other than NEXT_STEP_CONTINUE, the + identifier will not be used. + +When the "early-global-reservations-lookup" flag is true this callout is +called before "subnet6_select". + +@subsection dhcpv6HooksLease6Select lease6_select + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b subnet6, type: isc::dhcp::Subnet6Ptr, direction: <b>in</b> + - name: @b fake_allocation, type: bool, direction: <b>in</b> + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed after the server engine + has selected a lease for client's request but before the lease + has been inserted into the database. Any modifications made to the + "lease6" object will affect the lease's record in the database. + The callout should make sure that any modifications are sanity + checked as the server will use that data as is, with no further + checking.\n\n The server processes lease requests for SOLICIT and + REQUEST in a very similar way. The major difference is that + for SOLICIT the lease is only selected; it is not inserted into + the database. The callouts can distinguish between the SOLICIT and + REQUEST by checking the value of the "fake_allocation" flag: a value + of true means that the lease won't be inserted into the database + (SOLICIT case), a value of false means that it will (REQUEST). + + - <b>Next step status</b>: If any callout installed on "lease6_select" + sets the status to SKIP, the server will not assign that particular lease. + Packet processing will continue and the client may get other addresses + or prefixes if it requested more than one address and/or prefix. + +@subsection dhcpv6HooksLease6Renew lease6_renew + + - @b Arguments: + - name: @b query6, type: isc::dhcp::PktPtr, direction: <b>in</b> + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + - name: @b ia_na, type: isc::dhcp::Option6IAPtr direction: <b>in/out</b> + - name: @b ia_pd, type: isc::dhcp::Option6IAPtr, direction: <b>in/out</b> + + - @b Description: This callout is executed when the server engine is + about to renew an existing lease. The client's request is provided as + the "query6" argument and the existing lease with the appropriate fields + already modified is given in the "lease6" argument. The remaining two + arguments, "ia_na" and "ia_pd", are mutually exclusive and they provide + pointers to the IA_NA or IA_PD option which will be sent back to the + client. Callouts installed on the "lease6_renew" may modify the content of + the "lease6" object. Care should be taken however, as that modified + information will be written to the database without any further + checking. \n\n Although the envisaged usage assumes modification of T1, + T2, preferred and valid lifetimes only, other parameters associated + with the lease may be modified as well. The only exception is the @c addr_ + field, which must not be modified as it is used by the database to + select the existing lease to be updated. Care should also be taken to + modify the "ia_na" and "ia_pd" arguments to match any changes in the + "lease6" argument. If a client sends more than one IA (IA_NA/IA_PD) + option, callouts will be called separately for each IA instance. The + callout will be called only when the update is valid, i.e. conditions + such as an invalid addresses or invalid iaid renewal attempts will + not trigger this hook point. + + - <b>Next step status</b>: If any callout installed on "lease6_renew" + sets the status to SKIP, the server will not renew the lease. Under these + circumstances, the callout should modify the "ia_na" or "ia_pd" + argument to reflect this fact; otherwise the client will think the + lease was renewed and continue to operate under this assumption. + +@subsection dhcpv6HooksLease6Rebind lease6_rebind + + - @b Arguments: + - name: @b query6, type: isc::dhcp::PktPtr, direction: <b>in</b> + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + - name: @b ia_na, type: isc::dhcp::Option6IAPtr direction: <b>in/out</b> + - name: @b ia_pd, type: isc::dhcp::Option6IAPtr, direction: <b>in/out</b> + + - @b Description: This callout is executed when the server engine is + about to rebind an existing lease. The client's request is provided as + the "query6" argument and the existing lease with the appropriate fields + already modified is given in the "lease6" argument. The remaining two + arguments, "ia_na" and "ia_pd", are mutually exclusive and they provide + pointers to the IA_NA or IA_PD option which will be sent back to the + client. Callouts installed on the "lease6_renew" may modify the content of + the "lease6" object. Care should be taken however, as that modified + information will be written to the database without any further + checking. \n\n Although the envisaged usage assumes modification of T1, + T2, preferred and valid lifetimes only, other parameters associated + with the lease may be modified as well. The only exception is the @c addr_ + field, which must not be modified as it is used by the database to + select the existing lease to be updated. Care should also be taken to + modify the "ia_na" and "ia_pd" arguments to match any changes in the + "lease6" argument. If a client sends more than one IA (IA_NA/IA_PD) + option, callouts will be called separately for each IA instance. The + callout will be called only when the update is valid, i.e. conditions + such as an invalid addresses or invalid iaid renewal attempts will + not trigger this hook point. + + - <b>Next step status</b>: If any callout installed on "lease6_rebind" + sets the status to SKIP, the server will not rebind the lease. Under these + circumstances, the callout should modify the "ia_na" or "ia_pd" + argument to reflect this fact; otherwise the client will think the + lease was rebound and continue to operate under this assumption. + +@subsection dhcpv6HooksLease6Decline lease6_decline + + - @b Arguments: + - name: @b query6, type: isc::dhcp::PktPtr, direction: <b>in</b> + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when the server engine is + about to decline an existing lease. The client's DECLINE is provided as + the "query6" argument and the existing lease with the appropriate fields + already modified is given in the "lease6" argument. The lease contains + the lease before it is being declined. + + - <b>Next step status</b>: If any callout installed on "lease6_decline" + sets the status to SKIP, the server will not decline the lease, but will + continue processing the packet as if it did. It will send the response + that the lease was declined, but the actual database will not be + updated. If any callout installed sets the status to DROP, the packet + processing will be aborted, the lease will not be declined and the + server will not send a response. + +@subsection dhcpv6HooksLease6Release lease6_release + + - @b Arguments: + - name: @b query6, type: isc::dhcp::PktPtr, direction: <b>in</b> + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when the server engine is + about to release an existing lease. The client's request is provided + as the "query6" argument and the existing lease is given in the "lease6" + argument. Although the "lease6" structure may be modified, it doesn't + make sense to do so as it will be destroyed immediately the callouts + finish execution. + + - <b>Next step status</b>: If any callout installed on "lease6_release" + sets the status to SKIP or DROP, the server will not delete the lease, which will + remain in the database until it expires. However, the server will send out + the response back to the client as if it did. + +@subsection dhcpv6HooksDdns6Update ddns6_update + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b response6, type: isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b subnet6, type: isc::dhcp::Subnet6Ptr, direction: <b>in</b> + - name: @b hostname, type: std::string, direction: <b>in/out</b> + - name: @b fwd_update, type: bool, direction: <b>in/out</b> + - name: @b rev_update, type: bool, direction: <b>in/out</b> + - name: @b ddns_params, type: isc::dhcp::DdnsParamsPtr, direction: <b>in</b> + + - @b Description: this callout is executed after the server has selected + a lease and has formed a host name to associate with the lease and/or use + as the basis for the FQDN for DNS updates (if enabled), but before the + lease has been committed or any NameChangeRequests have been generated to + send to <b>kea-dhcp-ddns</b>. Thus it provides an opportunity to alter the + host name as well as whether or not forward and/or reverse updates are + enabled. + + Upon entry into the callout, the arguments <b>hostname</b>,<b>fwd_update</b>, + and <b>rev_update</b> have been set by the server based on the client packet, + and various configuration values (e.g host reservations, DDNS behavioral + parameters, etc). Upon return from the callout, any changes to these + values will be applied as follows: + - If <b>hostname</b> has changed it will be used to update the outbound + FQDN option (option 39) if it exists, and used as the FQDN sent in DNS + updates + - Forward DNS update(s) will be done if <b>fwd_update</b> is true (and + <b>kea-dhcp-ddns</b> connectivity is enabled) + - Reverse DNS update(s) will be done if <b>rev_update</b> is true (and + <b>kea-dhcp-ddns</b> connectivity is enabled) + + - <b>Next step status</b>: Not applicable, its value will be ignored. + +@subsection dhcpv6Leases6Committed leases6_committed + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b leases6, type: isc::dhcp::Lease6CollectionPtr, direction: <b>in</b> + - name: @b deleted_leases6, type: isc::dhcp::Lease6CollectionPtr, direction: <b>in</b> + + - @b Description: this callout is executed when the server has + applied all lease changes as a result of DHCP message + processing. This includes writing new lease into the database, + releasing an old lease for this client or declining a lease. This + callout is executed only for the DHCP client messages which may + cause lease changes, i.e. SOLICIT with Rapid Commit option included + and when Rapid Commit is enabled, REQUEST, RENEW, REBIND, RELEASE and + DECLINE. This callout is not executed for SOLICIT without Rapid Commit, + CONFIRM and INFORMATION REQUEST. If the callouts are executed as a result of + REQUEST or RENEW message, it is possible that both leases + collections hold leases to be handled. This is the case when the + new lease allocation replaces an existing lease for the client. The + "deleted_leases6" object will hold a previous lease instance and + the "leases6" object will hold the new lease for this client. The + callouts should be prepared to handle such situation. When the + callout is executed as a result RELEASE or DECLINE, the callout + will typically receive one or more leases in the "deleted_leases6" + object. Both leases collections are always provided to the callouts, + even though they may sometimes be empty. + + - <b>Next step status</b>: If any callout installed on the "leases6_committed" + sets the next step action to DROP the server will drop the processed query. + If it sets the next step action to PARK, the server will park the processed + packet (hold packet processing) until the hook libraries explicitly unpark + the packet after they are done performing asynchronous operations. + + +@subsection dhcpv6HooksPkt6Send pkt6_send + + - @b Arguments: + - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in</b> + - name: @b response6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when server's response + is about to be send back to the client. The sole argument "response6" + contains a pointer to an @c isc::dhcp::Pkt6 object that contains the + packet, with set source and destination addresses, interface over which + it will be send, list of all options and relay information. All fields + of the "response6" object can be modified at this time. It should be + noted that unless the callout sets the skip flag (see below), anything + placed in the @c buffer_out_ field will be overwritten when the callout + returns. (buffer_out_ is scratch space used for constructing the packet.) + + - <b>Next step status</b>: If any callout sets the status to SKIP, the server + will assume that the callout did pack the "transaction-id", "message type" + and option objects into the @c buffer_out_ field and will skip packing part. + Note that if the callout sets skip flag, but did not prepare the + output buffer, the server will send a zero sized message that will be + ignored by the client. If any callout sets the status to DROP, + the server will drop the prepared response. + +@subsection dhcpv6HooksBuffer6Send buffer6_send + + - @b Arguments: + - name: @b response6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> + + - @b Description: This callout is executed when server's response is + assembled into binary form and is about to be send back to the + client. The sole argument "response6" contains a pointer to an + @c isc::dhcp::Pkt6 object that contains the packet, with set source and + destination addresses, interface over which it will be sent, list of + all options and relay information. All options are already encoded + in @c buffer_out_ field. It doesn't make sense to modify anything but the + contents of buffer_out_ at this time (although if it is a requirement + to modify that data, it will probably be found easier to modify the + option objects in a callout attached to the "pkt6_send" hook). + + - <b>Next step status</b>: If any callout sets the status to SKIP or DROP, the server + will drop this response packet. However, the original request packet + from a client has been processed, so server's state has most likely changed + (e.g. lease was allocated). Setting this flag merely stops the change + being communicated to the client. + +@subsection dhcpv6HooksLease6Expire lease6_expire + +- @b Arguments: + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in/out</b> + - name: @b remove_lease, type: bool, direction: <b>in</b> + +- @b Description: this callout is executed for each expired lease when + the server performs reclamation of the expired leases. During this + process the server executes "lease6_expire" callout, removes the DNS + records associated with this lease and finally removes the lease from + the database or updates its status to "expired-reclaimed". The "lease6" + argument contains the pointer to the lease being reclaimed. The second + argument "remove_lease" indicates if the reclaimed leases should be + removed from the lease database (if true), or their state should be + set to "expired-reclaimed" in the lease database. This argument + is only used by the callout if it takes responsibility for the lease + reclamation, i.e. it sets the "skip" flag to "true". The "remove_lease" + argument is set to "true" if the "flush-reclaimed-timer-wait-time" is + set to 0 in the server configuration file. + +- <b>Next step status</b>: if the callout sets the status to SKIP, the server + will assume that the callout has fully reclaimed the lease, i.e. + performed the DNS update and updated the lease in the database. The + server will not perform any further actions on the lease for which the + skip flag has been set. It is important to note that if the callout + sets this flag but fails to reclaim the lease in the database, the + reclamation routine will repeatedly process this lease in subsequent + runs. Therefore, the implementors of this callout must make sure that + skip flag is only set when the lease has been actually reclaimed in the + database by the callout. + +@subsection dhcpv6HooksLease6Recover lease6_recover + +- @b Arguments: + - name: @b lease6, type: isc::dhcp::Lease6Ptr, direction: <b>in</b> + +- @b Description: this callout is executed for each declined lease that + has expired (was put aside for the duration of decline-probation-period) + and is being recovered. The lease has already been stripped + from any client identifying information when it was put into declined + state. In principle the callouts can modify the lease in this hook, + but it makes little sense. There's no useful data in the lease, except + the IPv6 address (which must not be modified). + +- <b>Next step status</b>: if the callout sets the next step action to SKIP, + the server will skip the lease recovery. In other words, it will keep + the lease as is. This is not recommended in general, as the declined + expired leases will remain in the database and their recovery will + be attempted during the next reclaim cycle. + +@subsection dhcpv6HooksCommandProcessed command_processed + + - @b Arguments: + - name: @b name, type: std::string, direction: <b>in</b> + - name: @b arguments type: isc::data::ConstElementPtr, direction: <b>in</b> + - name: @b response, type: isc::data::ConstElementPtr, direction: <b>in/out</b> + + - @b Description: this callout is executed after the DHCPv6 server receives + and processes a control command over the command channel (typically unix domain socket). + The "name" argument is the name of the command processed. + The "arguments" argument is a pointer to the parsed JSON structure + containing the command's input arguments. The "response" argument + is the parsed JSON structure containing the response generated by + the command processing. + + - <b>Next step status</b>: Not applicable, its value will be ignored. + +@section dhcpv6HooksOptionsAccess Accessing DHCPv6 Options within a Packet +When the server constructs a response message to a client it includes +DHCP options configured for this client in a response message. Apart +from the dynamically created options, such as IA_NA or ClientFQDN, it +typically includes many options specified in the server configuration +and held within the configuration structures by @c CfgMgr. Option +instances are created once, during server configuration, and the +@c CfgMgr holds pointers to those instances until the next server +reconfiguration. + +When the server includes an option in a response message it copies +a pointer to the instance of this option, rather than entire option. +This ensures the good performance of response message creation. However, +it also implies that any modification to the option carried in the +DHCP response will affect an instance of this option in the server +configuration structures. This is obviously not desired as it would +affect all subsequent DHCP transactions involving this option. The +DHCP server code avoids modifying the options included in the messages +so it is possible to ensure good performance without a risk of +accidentally modifying server configuration. The situation is +different with hooks libraries which purpose is, in many cases, +to modify values of options inserted by the server. + +Thus, @c Pkt class provides a mechanism to return a copy of an +option to a caller (e.g. a callout), rather than an instance +shared with the @c CfgMgr. This mechanism is enabled for all instances +of @c Pkt6 passed to the callouts, i.e. "query6" and "response6" +arguments. It is also automatically disabled when the callout +returns the control back to the server. + +At every hook point, where the server passes an instance of a packet +to the callouts, the server calls +@c isc::dhcp::Pkt6::setCopyRetrievedOptions (true) +to force copying options retrieved by @c isc::dhcp::Pkt6::getOption, +@c isc::dhcp::Pkt6::getOptions, @c isc::dhcp::Pkt6::getRelayOption +and @c isc::dhcp::Pkt6::getAnyRelayOption within callouts. The copied +option replaces an original option within the packet and any +modification to the option content by the callout would only affect +the option instance associated with the packet. + +On the other hand, copying each retrieved option may be expensive. +If performance of a hook library is a concern, it is possible for the +hook library to disable copying retrieved options by calling +@c isc::dhcp::Pkt6::setCopyRetrievedOptions (false) within a callout. +In this case however, the hook library implementer must be aware that +any modification of the option instance would affect the server +configuration and may disrupt server's operation. Thus, disabling +copying of retrieved options is not recommended unless the hook +library is not intended to modify configured options carried +within a packet. + +*/ |