2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-03 23:45:27 +00:00

[3484] Updated description of hooks for DHCPv4 and DHCPv6 server.

This commit is contained in:
Marcin Siodelski
2015-07-07 13:36:47 +02:00
parent 0d9d7115b0
commit 0fcceb6b27
3 changed files with 165 additions and 160 deletions

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC")
// //
// Permission to use, copy, modify, and/or distribute this software for any // Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above // purpose with or without fee is hereby granted, provided that the above
@@ -22,7 +22,7 @@
the @ref hooksdgDevelopersGuide. Information for Kea maintainers can be the @ref hooksdgDevelopersGuide. Information for Kea maintainers can be
found in the @ref hooksComponentDeveloperGuide. found in the @ref hooksComponentDeveloperGuide.
This manual is more specialised and is aimed at developers of hook This manual is more specialized and is aimed at developers of hook
code for the DHCPv4 server. It describes each hook point, what the callouts code for the DHCPv4 server. It describes each hook point, what the callouts
attached to the hook are able to do, and the arguments passed to the attached to the hook are able to do, and the arguments passed to the
callouts. Each entry in this manual has the following information: callouts. Each entry in this manual has the following information:
@@ -54,23 +54,25 @@ packet processing. Hook points that are not specific to packet processing
- @b Arguments: - @b Arguments:
- name: @b query4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b> - name: @b query4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b>
- @b Description: this callout is executed when an incoming DHCPv4 - @b Description: this callout is executed when the server has received a
buffer is received, before its content is parsed. The sole argument buffer containing a DHCPv4 message, but the message hasn't been parsed
- query4 - contains a pointer to an isc::dhcp::Pkt4 object that yet. The sole argument "query4" contains a pointer to the isc::dhcp::Pkt4
contains raw information regarding incoming packet, including its object, which contains the source and destination address of the
source and destination addresses, interface over which it was received packet, interface over which the packet has been received, and
received, and a raw buffer stored in data_ field. None of the a raw buffer, stored in the data_ field, containing the DHCPv4 message
packet fields (op_, hlen_, chaddr_, etc.) are set yet. Callouts in the wire format. None of the packet fields (op_, hlen_, chaddr_, etc.)
installed on this hook point can modify the incoming buffer. The are set yet. Callouts installed on this hook point can modify the data
server will parse the buffer afterwards. in the received buffer. The server will parse the buffer afterwards.
- <b>Skip flag action</b>: If any callout sets the skip flag, the server will - <b>Skip flag action</b>: If any callout sets the skip flag, the server will
skip the buffer parsing. In such case there is an expectation that skip the buffer parsing. In such case there is an expectation that
the callout will parse the buffer and create option objects (see the callout will parse options carried in the buffer, create
isc::dhcp::Pkt4::addOption()). Otherwise the server will find out @c isc::dhcp::Option objects (or derived) and add them to the "query4"
that some mandatory options are missing (e.g. DHCP Message Type) and object using the @c isc::dhcp::Pkt4::addOption.
will drop the packet. If you want to have the capability to drop Otherwise the server will find out that some mandatory options are
a message, it is better to use skip flag in pkt4_receive callout. missing (e.g. DHCP Message Type) and will drop the message. If you
want to have the capability to drop a message, it is better to use
skip flag in "pkt4_receive" callout.
@subsection dhcpv4HooksPkt4Receive pkt4_receive @subsection dhcpv4HooksPkt4Receive pkt4_receive
@@ -79,15 +81,14 @@ packet processing. Hook points that are not specific to packet processing
- @b Description: this callout is executed when an incoming DHCPv4 - @b Description: this callout is executed when an incoming DHCPv4
packet is received and its content has been parsed. The sole packet is received and its content has been parsed. The sole
argument - query4 - contains a pointer to an isc::dhcp::Pkt4 object argument "query4" contains a pointer to an isc::dhcp::Pkt4 object
that contains all information regarding incoming packet, including that contains all information regarding incoming packet, including
its source and destination addresses, interface over which it was its source and destination addresses, interface over which it was
received, a list of all options present within and relay received, a list of all options present within and the relay
information. All fields of the Pkt4 object can be modified at this information. All fields of the Pkt4 object can be modified at this
time, except data_. (By the time this hook is reached, the contents time. By the time this hook is reached, the contents of the data_
of the data_ field has been already parsed and stored in other field has been already parsed and stored in other fields. Therefore,
fields. Therefore, the modification in the data_ field has no the modification in the data_ field has no effect.
effect.)
- <b>Skip flag action</b>: If any callout sets the skip flag, the server will - <b>Skip flag action</b>: If any callout sets the skip flag, the server will
drop the packet and start processing the next one. The reason for the drop drop the packet and start processing the next one. The reason for the drop
@@ -98,19 +99,19 @@ packet processing. Hook points that are not specific to packet processing
- @b Arguments: - @b Arguments:
- name: @b query4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b> - name: @b query4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b>
- name: @b subnet4, type: isc::dhcp::Subnet4Ptr, direction: <b>in/out</b> - name: @b subnet4, type: isc::dhcp::Subnet4Ptr, direction: <b>in/out</b>
- name: @b subnet4collection, type: const isc::dhcp::Subnet4Collection *, direction: <b>in</b> - name: @b subnet4collection, type: const isc::dhcp::Subnet4Collection *,
direction: <b>in</b>
- @b Description: this callout is executed when a subnet is being - @b Description: this callout is executed when a subnet is being
selected for the incoming packet. All parameters and addresses selected for the incoming packet. All parameters and addresses
will be assigned from that subnet. A callout can select a will be assigned from that subnet. A callout can select a
different subnet if it wishes so, the list of all subnets currently different subnet if it wishes so. The list of all subnets currently
configured being provided as 'subnet4collection'. The list itself must configured are provided as "subnet4collection". The list itself must
not be modified. not be modified.
- <b>Skip flag action</b>: If any callout installed on 'subnet4_select' - <b>Skip flag action</b>: If any callout, installed on "subnet4_select",
sets the skip flag, the server will not select any subnet. Packet processing sets the skip flag, the server will not select any subnet. Packet processing
will continue, but will be severely limited (i.e. only global options will continue, but will be severely limited.
will be assigned).
@subsection dhcpv4HooksLeaseSelect lease4_select @subsection dhcpv4HooksLeaseSelect lease4_select
@@ -120,22 +121,24 @@ packet processing. Hook points that are not specific to packet processing
- name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in/out</b> - name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in/out</b>
- @b Description: this callout is executed after the server engine - @b Description: this callout is executed after the server engine
has selected a lease for client's request but before the lease has has selected a lease for the client's request, but before the lease has
been inserted into the database. Any modifications made to the been inserted into the database. Any modifications made to the
isc::dhcp::Lease4 object will be stored in the lease's record in "lease4" object will affect the lease's record in the database.
the database. The callout should sanity check all modifications as The callout should sanity check all modifications as the server will
the server will use that data as is with no further checking.\n\n use that data as is, with no further checking.\n\n
The server processes lease requests for DISCOVER and REQUEST in a The server processes lease requests for DHCPDISCOVER and DHCPREQUEST in a
very similar way. The only major difference is that for DISCOVER very similar way. The only major difference is that for DHCPDISCOVER
the lease is just selected, but not inserted into the database. It the lease is only selected, but not inserted into the database. The callouts
is possible to distinguish between DISCOVER and REQUEST by checking may distinguish between DHCPDISCOVER and DHCPREQUEST by checking the
value of the fake_allocation flag: a value of true indicates that the value of the "fake_allocation" flag: a value of true indicates that the
lease won't be inserted into the database (DISCOVER), a value of lease won't be inserted into the database (DHCPDISCOVER case), a value of
false indicates that it will (REQUEST). false indicates that it will (DHCPREQUEST case).
- <b>Skip flag action</b>: If any callout installed on 'lease4_select' - <b>Skip flag action</b>: If any callout installed on "lease4_select"
sets the skip flag, the server will not assign any lease. Packet sets the skip flag, the server will not assign any lease and the callouts
processing will continue, but client will not get an address. become responsible for the lease assignment. If the callouts fail to provide
a lease, the packet processing will continue, but client will not get
an address.
@subsection dhcpv4HooksLeaseRenew lease4_renew @subsection dhcpv4HooksLeaseRenew lease4_renew
@@ -146,15 +149,15 @@ packet processing. Hook points that are not specific to packet processing
- name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in/out</b> - name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in/out</b>
- @b Description: this callout is executed when the server engine - @b Description: this callout is executed when the server engine
is about to renew a lease, as a result of receiving REQUEST/Renewing is about to renew a lease, as a result of receiving DHCPREQUEST/Renewing
packet. The lease4 argument points to Lease4 object that contains packet. The "lease4" argument points to @c isc::dhcp::Lease4 object that
the updated values. Callout can modify those values. Care should be taken contains the updated values. Callout can modify those values. Care should
as the server will attempt to update the lease in the database without be taken as the server will attempt to update the lease in the database
any additional checks. without any additional checks.
- <b>Skip flag action</b>: If any callout installed on 'lease4_renew' - <b>Skip flag action</b>: If any callout installed on "lease4_renew"
sets the skip flag, the server will not update the lease and will sets the skip flag, the server will not update the lease in the
use old values instead. database and continue using old values instead.
@subsection dhcpv4HooksLeaseRelease lease4_release @subsection dhcpv4HooksLeaseRelease lease4_release
@@ -163,11 +166,11 @@ packet processing. Hook points that are not specific to packet processing
- name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in</b> - name: @b lease4, type: isc::dhcp::Lease4Ptr, direction: <b>in</b>
- @b Description: this callout is executed when the server engine - @b Description: this callout is executed when the server engine
is about to release a lease, as a result of receiving RELEASE packet. is about to release a lease, as a result of receiving DHCPRELEASE packet.
The lease4 argument points to Lease4 object that contains the lease to The "lease4" argument points to @c Lease4 object that contains the lease to
be released. It doesn't make sense to modify it at this time. be released. It doesn't make sense to modify it at this time.
- <b>Skip flag action</b>: If any callout installed on 'lease4_release' - <b>Skip flag action</b>: If any callout installed on "lease4_release"
sets the skip flag, the server will not delete the lease. It will be sets the skip flag, the server will not delete the lease. It will be
kept in the database and will go through the regular expiration/reuse kept in the database and will go through the regular expiration/reuse
process. process.
@@ -178,17 +181,17 @@ packet processing. Hook points that are not specific to packet processing
- name: @b response4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b> - name: @b response4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b>
- @b Description: this callout is executed when server's response - @b Description: this callout is executed when server's response
is about to be sent back to the client. The sole argument - response4 - is about to be sent back to the client. The sole argument "response4"
contains a pointer to an isc::dhcp::Pkt4 object that contains the contains a pointer to an isc::dhcp::Pkt4 object carrying the
packet, with source and destination addresses set, interface over which packet, with source and destination addresses set, interface over which
it will be sent, and a list of all options and relay information. All fields it will be sent, and a list of all options and relay information. All fields
of the Pkt4 object can be modified at this time, except buffer_out_. of the @c Pkt4 object can be modified at this time, except @c buffer_out_.
(This is scratch space used for constructing the packet after all (This is scratch space used for constructing the packet after all
pkt4_send callouts are complete, so any changes to that field will pkt4_send callouts are complete, so any changes to that field will
be overwritten.) be overwritten.)
- <b>Skip flag action</b>: if any callout sets the skip flag, the server - <b>Skip flag action</b>: if any callout sets the skip flag, the server
will not construct raw buffer. The expectation is that if the callout will not construct the raw buffer. The expectation is that if the callout
set skip flag, it is responsible for constructing raw form on its own. set skip flag, it is responsible for constructing raw form on its own.
Otherwise the output packet will be sent with zero length. Otherwise the output packet will be sent with zero length.
@@ -198,17 +201,19 @@ packet processing. Hook points that are not specific to packet processing
- name: @b response4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b> - name: @b response4, type: isc::dhcp::Pkt4Ptr, direction: <b>in/out</b>
- @b Description: this callout is executed when server's response - @b Description: this callout is executed when server's response
is about to be sent back to the client. The sole argument - response4 - is about to be sent back to the client. The sole argument "response4"
contains a pointer to an isc::dhcp::Pkt4 object that contains the contains a pointer to an @c isc::dhcp::Pkt4 object that contains the
packet, with source and destination addresses set, interface over which packet, with source and destination addresses set, interface over which
it will be sent, and a list of all options and relay information. The raw it will be sent, and a list of all options and relay information. The raw
on-wire form is already prepared in buffer_out_ (see isc::dhcp::Pkt4::getBuffer()) on-wire form is already prepared in @c buffer_out_ (see
It doesn't make any sense to modify packet fields or options content @c isc::dhcp::Pkt4::getBuffer())
at this time, because they were already used to construct on-wire buffer. Callouts should not modify the packet fields or options contents at this
time, because they were already used to construct on-wire buffer. Their
modification would have no effect.
- <b>Skip flag action</b>: if any callout sets the skip flag, the server - <b>Skip flag action</b>: if any callout sets the skip flag, the server
will drop this response packet. However, the original request packet will drop this response packet. However, the original request packet
from a client was processed, so server's state was most likely changed from a client was processed, so server's state most likely has changed
(e.g. lease was allocated). Setting this flag merely stops the change (e.g. lease was allocated). Setting this flag merely stops the change
being communicated to the client. being communicated to the client.

View File

@@ -55,25 +55,25 @@ packet processing. Hook points that are not specific to packet processing
- name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b>
- @b Description: This callout is executed when an incoming DHCPv6 - @b Description: This callout is executed when an incoming DHCPv6
packet is received and the data stored in a buffer. The sole argument - packet is received and the data stored in a buffer. The sole argument
query6 - contains a pointer to an isc::dhcp::Pkt6 object that contains "query6" contains a pointer to an @c isc::dhcp::Pkt6 object that contains
the received information stored in the data_ field. Basic information the received information stored in the data_ field. Basic information
like protocol, source/destination addresses and ports are set, but like protocol, source/destination addresses and ports are set, but
the contents of the buffer have not yet been parsed. That means that the contents of the buffer have not yet been parsed. That means that
the options_ field (that will eventually contain a list of objects the @c options_ field (that will eventually contain a list of objects
representing the received options) is empty, so none of the methods representing the received options) is empty, so none of the methods
that operate on it (e.g., getOption()) will work. The primary purpose 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 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 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. usually better to install your callout on the "pkt6_receive" hook point.
- <b>Skip flag action</b>: If any callout sets the skip flag, the - <b>Skip flag action</b>: If any callout sets the skip flag, the
server will assume that the callout parsed the buffer and added then server will assume that the callout parsed the buffer and added the
necessary option objects to the options_ field; the server will not 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 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 buffer, the server will most probably drop the packet due to
the absence of mandatory options. If you want to drop the packet, 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. see the description of the skip flag in the "pkt6_receive" hook point.
@subsection dhcpv6HooksPkt6Receive pkt6_receive @subsection dhcpv6HooksPkt6Receive pkt6_receive
@@ -81,16 +81,16 @@ packet processing. Hook points that are not specific to packet processing
- name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> - name: @b query6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b>
- @b Description: This callout is executed when an incoming DHCPv6 - @b Description: This callout is executed when an incoming DHCPv6
packet is received and its content is parsed. The sole argument - packet is received and its content is parsed. The sole argument
query6 - contains a pointer to an isc::dhcp::Pkt6 object that contains "query6" contains a pointer to an @c isc::dhcp::Pkt6 object that contains
all information regarding incoming packet, including its source and all information regarding incoming packet, including its source and
destination addresses, the interface over which it was received, a list destination addresses, the interface over which it was received, a list
of all options present within and relay information. All fields of of all options present within and relay information. All fields of
the Pkt6 object can be modified at this time, except data_. (data_ 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 contains the incoming packet as raw buffer. By the time this hook is
reached, that information has already been parsed and is available though reached, that information has already been parsed and is available though
other fields in the Pkt6 object. For this reason, it doesn't make other fields in the Pkt6 object. For this reason, modification of the
sense to modify it.) @c data_ field would have no effect.)
- <b>Skip flag action</b>: If any callout sets the skip flag, the server will - <b>Skip flag action</b>: If any callout sets the skip flag, the server will
drop the packet and start processing the next one. The reason for the drop drop the packet and start processing the next one. The reason for the drop
@@ -107,13 +107,12 @@ packet processing. Hook points that are not specific to packet processing
selected for the incoming packet. All parameters, addresses and selected for the incoming packet. All parameters, addresses and
prefixes will be assigned from that subnet. A callout can select a prefixes will be assigned from that subnet. A callout can select a
different subnet if it wishes so, the list of all subnets currently different subnet if it wishes so, the list of all subnets currently
configured being provided as 'subnet6collection'. The list itself must configured being provided as "subnet6collection". The list itself must
not be modified. not be modified.
- <b>Skip flag action</b>: If any callout installed on 'subnet6_select' - <b>Skip flag action</b>: If any callout installed on "subnet6_select"
sets the skip flag, the server will not select any subnet. Packet processing sets the skip flag, the server will not select any subnet. Packet processing
will continue, but will be severely limited (i.e. only global options will continue, but will be severely limited.
will be assigned).
@subsection dhcpv6HooksLease6Select lease6_select @subsection dhcpv6HooksLease6Select lease6_select
@@ -125,18 +124,18 @@ packet processing. Hook points that are not specific to packet processing
- @b Description: This callout is executed after the server engine - @b Description: This callout is executed after the server engine
has selected a lease for client's request but before the lease has selected a lease for client's request but before the lease
has been inserted into the database. Any modifications made to the has been inserted into the database. Any modifications made to the
isc::dhcp::Lease6 object will be stored in the lease's record in the "lease6" object will affect the lease's record in the database.
database. The callout should make sure that any modifications are The callout should make sure that any modifications are sanity
sanity checked as the server will use that data as is with no further checked as the server will use that data as is, with no further
checking.\n\n The server processes lease requests for SOLICIT and checking.\n\n The server processes lease requests for SOLICIT and
REQUEST in a very similar way. The only major difference is that REQUEST in a very similar way. The major difference is that
for SOLICIT the lease is just selected; it is not inserted into for SOLICIT the lease is only selected; it is not inserted into
the database. It is possible to distinguish between SOLICIT and the database. The callouts can distinguish between the SOLICIT and
REQUEST by checking value of the fake_allocation flag: a value of true REQUEST by checking the value of the "fake_allocation" flag: a value
means that the lease won't be inserted into the database (SOLICIT), of true means that the lease won't be inserted into the database
a value of false means that it will (REQUEST). (SOLICIT case), a value of false means that it will (REQUEST).
- <b>Skip flag action</b>: If any callout installed on 'lease6_select' - <b>Skip flag action</b>: If any callout installed on "lease6_select"
sets the skip flag, the server will not assign that particular lease. sets the skip flag, the server will not assign that particular lease.
Packet processing will continue and the client may get other addresses Packet processing will continue and the client may get other addresses
or prefixes if it requested more than one address and/or prefix. or prefixes if it requested more than one address and/or prefix.
@@ -150,26 +149,26 @@ packet processing. Hook points that are not specific to packet processing
- @b Description: This callout is executed when the server engine is - @b Description: This callout is executed when the server engine is
about to renew an existing lease. The client's request is provided as about to renew an existing lease. The client's request is provided as
the query6 argument and the existing lease with the appropriate fields the "query6" argument and the existing lease with the appropriate fields
already modified is given in the lease6 argument. The final argument, already modified is given in the "lease6" argument. The final argument,
ia_na, is the IA_NA option that will be sent back to the client. ia_na, is the IA_NA option that will be sent back to the client.
Callouts installed on the lease6_renew may modify the content of Callouts installed on the "lease6_renew" may modify the content of
the lease6 object. Care should be taken however, as that modified the "lease6" object. Care should be taken however, as that modified
information will be written to the database without any further information will be written to the database without any further
checking. \n\n Although the envisaged usage assumes modification of T1, checking. \n\n Although the envisaged usage assumes modification of T1,
T2, preferred and valid lifetimes only, other parameters associated T2, preferred and valid lifetimes only, other parameters associated
with the lease may be modified as well. The only exception is the addr_ 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 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 select the existing lease to be updated. Care should also be taken to
modify the ia_na argument to match any changes in the lease6 argument. modify the "ia_na" argument to match any changes in the "lease6" argument.
If a client sends more than one IA_NA option, callouts will be called If a client sends more than one IA_NA option, callouts will be called
separately for each IA_NA instance. The callout will be called only separately for each IA_NA instance. The callout will be called only
when the update is valid, i.e. conditions such as an invalid addresses when the update is valid, i.e. conditions such as an invalid addresses
or invalid iaid renewal attempts will not trigger this hook point. or invalid iaid renewal attempts will not trigger this hook point.
- <b>Skip flag action</b>: If any callout installed on 'lease6_renew' - <b>Skip flag action</b>: If any callout installed on "lease6_renew"
sets the skip flag, the server will not renew the lease. Under these sets the skip flag, the server will not renew the lease. Under these
circumstances, the callout should modify the ia_na argument to reflect circumstances, the callout should modify the "ia_na" argument to reflect
this fact; otherwise the client will think the lease was renewed and continue this fact; otherwise the client will think the lease was renewed and continue
to operate under this assumption. to operate under this assumption.
@@ -181,12 +180,12 @@ packet processing. Hook points that are not specific to packet processing
- @b Description: This callout is executed when the server engine is - @b Description: This callout is executed when the server engine is
about to release an existing lease. The client's request is provided 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 as the "query6" argument and the existing lease is given in the "lease6"
argument. Although the lease6 structure may be modified, it doesn't argument. Although the "lease6" structure may be modified, it doesn't
make sense to do so as it will be destroyed immediately the callouts make sense to do so as it will be destroyed immediately the callouts
finish execution. finish execution.
- <b>Skip flag action</b>: If any callout installed on 'lease6_release' - <b>Skip flag action</b>: If any callout installed on "lease6_release"
sets the skip flag, the server will not delete the lease, which will sets the skip flag, the server will not delete the lease, which will
remain in the database until it expires. However, the server will send out remain in the database until it expires. However, the server will send out
the response back to the client as if it did. the response back to the client as if it did.
@@ -197,22 +196,22 @@ packet processing. Hook points that are not specific to packet processing
- name: @b response6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b> - name: @b response6, type: isc::dhcp::Pkt6Ptr, direction: <b>in/out</b>
- @b Description: This callout is executed when server's response - @b Description: This callout is executed when server's response
is about to be send back to the client. The sole argument - response6 - is about to be send back to the client. The sole argument "response6"
contains a pointer to an isc::dhcp::Pkt6 object that contains the contains a pointer to an @c isc::dhcp::Pkt6 object that contains the
packet, with set source and destination addresses, interface over which packet, with set source and destination addresses, interface over which
it will be send, list of all options and relay information. All fields it will be send, list of all options and relay information. All fields
of the Pkt6 object can be modified at this time. It should be noted that of the "response6" object can be modified at this time. It should be
unless the callout sets the skip flag (see below), anything placed in the noted that unless the callout sets the skip flag (see below), anything
bufferOut_ field will be overwritten when the callout returns. placed in the @c buffer_out_ field will be overwritten when the callout
(bufferOut_ is scratch space used for constructing the packet.) returns. (buffer_out_ is scratch space used for constructing the packet.)
- <b>Skip flag action</b>: If any callout sets the skip flag, the server - <b>Skip flag action</b>: If any callout sets the skip flag, the server
will assume that the callout did pack the transaction-id, message type and will assume that the callout did pack the "transaction-id", "message type"
option objects into the bufferOut_ field and will skip packing part. 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 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 output buffer, the server will send a zero sized message that will be
ignored by the client. If you want to drop the packet, please see ignored by the client. If you want to drop the packet, please see
skip flag in the buffer6_send hook point. skip flag in the "buffer6_send" hook point.
@subsection dhcpv6HooksBuffer6Send buffer6_send @subsection dhcpv6HooksBuffer6Send buffer6_send
@@ -221,14 +220,14 @@ packet processing. Hook points that are not specific to packet processing
- @b Description: This callout is executed when server's response is - @b Description: This callout is executed when server's response is
assembled into binary form and is about to be send back to the assembled into binary form and is about to be send back to the
client. The sole argument - response6 - contains a pointer to an client. The sole argument "response6" contains a pointer to an
isc::dhcp::Pkt6 object that contains the packet, with set source and @c isc::dhcp::Pkt6 object that contains the packet, with set source and
destination addresses, interface over which it will be sent, list of destination addresses, interface over which it will be sent, list of
all options and relay information. All options are already encoded all options and relay information. All options are already encoded
in bufferOut_ field. It doesn't make sense to modify anything but the in @c buffer_out_ field. It doesn't make sense to modify anything but the
contents of bufferOut_ at this time (although if it is a requirement 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 to modify that data, it will probably be found easier to modify the
option objects in a callout attached to the pkt6_send hook). option objects in a callout attached to the "pkt6_send" hook).
- <b>Skip flag action</b>: If any callout sets the skip flag, the server - <b>Skip flag action</b>: If any callout sets the skip flag, the server
will drop this response packet. However, the original request packet will drop this response packet. However, the original request packet

View File

@@ -100,11 +100,11 @@ shared library and loaded by Kea into its address space.
To illustrate how to write code that integrates with Kea, we will To illustrate how to write code that integrates with Kea, we will
use the following (rather contrived) example: use the following (rather contrived) example:
The Kea DHCPv4 server is used to allocate IPv4 addresses to clients <i>The Kea DHCPv4 server is used to allocate IPv4 addresses to clients
(as well as to pass them other information such as the address of DNS (as well as to pass them other information such as the address of DNS
servers). We will suppose that we need to classify clients requesting servers). We will suppose that we need to classify clients requesting
IPv4 addresses according to their hardware address, and want to log both IPv4 addresses according to their hardware address, and want to log both
the hardware address and allocated IP address for the clients of interest. the hardware address and allocated IP address for the clients of interest.</i>
The following sections describe how to implement these requirements. The following sections describe how to implement these requirements.
The code presented here is not efficient and there are better ways of The code presented here is not efficient and there are better ways of
@@ -282,11 +282,11 @@ int callout(CalloutHandle& handle);
@endcode @endcode
(As before, the callout is declared with "C" linkage.) Information is passed (As before, the callout is declared with "C" linkage.) Information is passed
between Kea and the callout through name/value pairs in the CalloutHandle between Kea and the callout through name/value pairs in the @c CalloutHandle
object. The object is also used to pass information between callouts on a object. The object is also used to pass information between callouts on a
per-request basis. (Both of these concepts are explained below.) per-request basis. (Both of these concepts are explained below.)
A callout returns an "int" as a status return. A value of 0 indicates A callout returns an @c int as a status return. A value of 0 indicates
success, anything else signifies an error. The status return has no success, anything else signifies an error. The status return has no
effect on server processing; the only difference between a success effect on server processing; the only difference between a success
and error code is that if the latter is returned, the server will and error code is that if the latter is returned, the server will
@@ -296,7 +296,7 @@ error information to the Kea logging system.
@subsubsection hooksdgArguments Callout Arguments @subsubsection hooksdgArguments Callout Arguments
The CalloutHandle object provides two methods to get and set the The @c CalloutHandle object provides two methods to get and set the
arguments passed to the callout. These methods are called (naturally arguments passed to the callout. These methods are called (naturally
enough) getArgument and SetArgument. Their usage is illustrated by the enough) getArgument and SetArgument. Their usage is illustrated by the
following code snippets. following code snippets.
@@ -336,27 +336,27 @@ In the callout
handle.setArgument("data_count", number); handle.setArgument("data_count", number);
@endcode @endcode
As can be seen "getArgument" is used to retrieve data from the As can be seen @c getArgument is used to retrieve data from the
CalloutHandle, and setArgument used to put data into it. If a callout @c CalloutHandle, and @c setArgument used to put data into it. If a callout
wishes to alter data and pass it back to the server, it should retrieve wishes to alter data and pass it back to the server, it should retrieve
the data with getArgument, modify it, and call setArgument to send the data with @c getArgument, modify it, and call @c setArgument to send
it back. it back.
There are several points to be aware of: There are several points to be aware of:
- the data type of the variable in the call to getArgument must match - the data type of the variable in the call to @c getArgument must match
the data type of the variable passed to the corresponding setArgument the data type of the variable passed to the corresponding @c setArgument
<B>exactly</B>: using what would normally be considered to be a <B>exactly</B>: using what would normally be considered to be a
"compatible" type is not enough. For example, if the server passed "compatible" type is not enough. For example, if the server passed
an argument as an "int" and the callout attempted to retrieve it as a an argument as an @c int and the callout attempted to retrieve it as a
"long", an exception would be thrown even though any value that can @c long, an exception would be thrown even though any value that can
be stored in an "int" will fit into a "long". This restriction also be stored in an @c int will fit into a @c long. This restriction also
applies the "const" attribute but only as applied to data pointed to by applies the "const" attribute but only as applied to data pointed to by
pointers, e.g. if an argument is defined as a "char*", an exception will pointers, e.g. if an argument is defined as a @c char*, an exception will
be thrown if an attempt is made to retrieve it into a variable of type be thrown if an attempt is made to retrieve it into a variable of type
"const char*". (However, if an argument is set as a "const int", it can @c const @c char*. (However, if an argument is set as a @c const @c int,
be retrieved into an "int".) The documentation of each hook point will it can be retrieved into an @c int.) The documentation of each hook
detail the data type of each argument. point will detail the data type of each argument.
- Although all arguments can be modified, some altered values may not - Although all arguments can be modified, some altered values may not
be read by the server. (These would be ones that the server considers be read by the server. (These would be ones that the server considers
"read-only".) Consult the documentation of each hook to see whether an "read-only".) Consult the documentation of each hook to see whether an
@@ -371,8 +371,8 @@ parameters can be modified. As a general rule:
- Do not alter arguments unless you mean the change to be reflected in - Do not alter arguments unless you mean the change to be reflected in
the server. the server.
- If you alter an argument, call CalloutHandle::setArgument to update the - If you alter an argument, call @c CalloutHandle::setArgument to update the
value in the CalloutHandle object. value in the @c CalloutHandle object.
@subsubsection hooksdgSkipFlag The "Skip" Flag @subsubsection hooksdgSkipFlag The "Skip" Flag
@@ -391,7 +391,7 @@ is a server where a callout inspects the hardware address of the client
sending the packet and compares it against a black list; if the address sending the packet and compares it against a black list; if the address
is on it, the callout notifies the server to drop the packet. is on it, the callout notifies the server to drop the packet.
To handle these common cases, the CalloutHandle has a "skip" flag. To handle these common cases, the @c CalloutHandle has a "skip" flag.
This is set by a callout when it wishes the server to skip normal This is set by a callout when it wishes the server to skip normal
processing. It is set false by the hooks framework before callouts on a processing. It is set false by the hooks framework before callouts on a
hook are called. If the flag is set on return, the server will take the hook are called. If the flag is set on return, the server will take the
@@ -427,7 +427,7 @@ Future developments may have the server processing multiple packets
simultaneously, or to suspend processing on a packet and resume it at simultaneously, or to suspend processing on a packet and resume it at
a later time after other packets have been processed. a later time after other packets have been processed.
As well as argument information, the CalloutHandle object can be used by As well as argument information, the @c CalloutHandle object can be used by
callouts to attach information to a packet being handled by the server. callouts to attach information to a packet being handled by the server.
This information (known as "context") is not used by the server: its purpose This information (known as "context") is not used by the server: its purpose
is to allow callouts to pass information between one another on a is to allow callouts to pass information between one another on a
@@ -441,9 +441,9 @@ simultaneously: callouts can effectively attach data to a packet that
follows the packet around the system. follows the packet around the system.
Context information is held as name/value pairs in the same way Context information is held as name/value pairs in the same way
as arguments, being accessed by the pair of methods setContext and as arguments, being accessed by the pair of methods @c setContext and
getContext. They have the same restrictions as the setArgument and @c getContext. They have the same restrictions as the @c setArgument and
getArgument methods - the type of data retrieved from context must @c getArgument methods - the type of data retrieved from context must
<B>exactly</B> match the type of the data set. <B>exactly</B> match the type of the data set.
The example in the next section illustrates their use. The example in the next section illustrates their use.
@@ -457,8 +457,9 @@ do this in one callout, for this example we'll use two:
- pkt4_receive - a callout on this hook is invoked when a packet has been - pkt4_receive - a callout on this hook is invoked when a packet has been
received and has been parsed. It is passed a single argument, "query4" received and has been parsed. It is passed a single argument, "query4"
which is an isc::dhcp::Pkt4 object (representing a DHCP v4 packet). which is an isc::dhcp::Pkt4Ptr object, holding a pointer to the
We will do the classification here. isc::dhcp::Pkt4 object (representing a DHCPv4 packet). We will do the
classification here.
- pkt4_send - called when a response is just about to be sent back to - pkt4_send - called when a response is just about to be sent back to
the client. It is passed a single argument "response4". This is the the client. It is passed a single argument "response4". This is the
@@ -521,7 +522,7 @@ int pkt4_receive(CalloutHandle& handle) {
} }
@endcode @endcode
The pkt4_receive callout placed the hardware address of an interesting client in The "pkt4_receive" callout placed the hardware address of an interesting client in
the "hwaddr" context for the packet. Turning now to the callout that will the "hwaddr" context for the packet. Turning now to the callout that will
write this information to the log file: write this information to the log file:
@@ -757,12 +758,12 @@ to initialize per-request context. The second is called after all
server-defined hooks have been processed, and is to allow a library to server-defined hooks have been processed, and is to allow a library to
tidy up. tidy up.
As an example, the pkt4_send example above required that the code As an example, the "pkt4_send" example above required that the code
check for an exception being thrown when accessing the "hwaddr" context check for an exception being thrown when accessing the "hwaddr" context
item in case it was not set. An alternative strategy would have been to item in case it was not set. An alternative strategy would have been to
provide a callout for the "context_create" hook and set the context item provide a callout for the "context_create" hook and set the context item
"hwaddr" to an empty string. Instead of needing to handle an exception, "hwaddr" to an empty string. Instead of needing to handle an exception,
pkt4_send would be guaranteed to get something when looking for "pkt4_send" would be guaranteed to get something when looking for
the hwaddr item and so could write or not write the output depending on the hwaddr item and so could write or not write the output depending on
the value. the value.
@@ -771,7 +772,7 @@ automatically deletes context. An example where it could be required
is where memory has been allocated by a callout during the processing is where memory has been allocated by a callout during the processing
of a request and a raw pointer to it stored in the context object. On of a request and a raw pointer to it stored in the context object. On
destruction of the context, that memory will not be automatically destruction of the context, that memory will not be automatically
released. Freeing in the memory in the "context_destroy callout will solve released. Freeing in the memory in the "context_destroy" callout will solve
that problem. that problem.
Actually, when the context is destroyed, the destructor Actually, when the context is destroyed, the destructor
@@ -786,8 +787,8 @@ Here it is assumed that the hooks library is performing some form of
security checking on the packet and needs to maintain information in security checking on the packet and needs to maintain information in
a user-specified "SecurityInformation" object. (The details of this a user-specified "SecurityInformation" object. (The details of this
fictitious object are of no concern here.) The object is created in fictitious object are of no concern here.) The object is created in
the context_create callout and used in both the pkt4_receive and the the "context_create" callout and used in both the "pkt4_receive" and the
pkt4_send callouts. "pkt4_send" callouts.
@code @code
// Storing information in a "raw" pointer. Assume that the // Storing information in a "raw" pointer. Assume that the
@@ -831,7 +832,7 @@ int pkt4_send(CalloutHandle& handle) {
} }
// Context destruction. We need to delete the pointed-to SecurityInformation // Context destruction. We need to delete the pointed-to SecurityInformation
// object because we will lose the pointer to it when the CalloutHandle is // object because we will lose the pointer to it when the @c CalloutHandle is
// destroyed. // destroyed.
int context_destroy(CalloutHandle& handle) { int context_destroy(CalloutHandle& handle) {
// Retrieve the pointer to the SecurityInformation object // Retrieve the pointer to the SecurityInformation object
@@ -843,7 +844,7 @@ int context_destroy(CalloutHandle& handle) {
} }
@endcode @endcode
The requirement for the context_destroy callout can be eliminated if The requirement for the "context_destroy" callout can be eliminated if
a Boost shared ptr is used to point to the allocated memory: a Boost shared ptr is used to point to the allocated memory:
@code @code
@@ -865,7 +866,7 @@ int context_create(CalloutHandle& handle) {
} }
// Other than the data type, a shared pointer has similar semantics to a "raw" // Other than the data type, a shared pointer has similar semantics to a "raw"
// pointer. Only the code from pkt4_receive is shown here. // pointer. Only the code from "pkt4_receive" is shown here.
int pkt4_receive(CalloutHandle& handle) { int pkt4_receive(CalloutHandle& handle) {
// Retrieve the pointer to the SecurityInformation object // Retrieve the pointer to the SecurityInformation object
@@ -881,7 +882,7 @@ int pkt4_receive(CalloutHandle& handle) {
} }
// No context_destroy callout is needed to delete the allocated // No context_destroy callout is needed to delete the allocated
// SecurityInformation object. When the CalloutHandle is destroyed, the shared // SecurityInformation object. When the @c CalloutHandle is destroyed, the shared
// pointer object will be destroyed. If that is the last shared pointer to the // pointer object will be destroyed. If that is the last shared pointer to the
// allocated memory, then it too will be deleted. // allocated memory, then it too will be deleted.
@endcode @endcode
@@ -915,13 +916,13 @@ registration is through the LibraryHandle object. This was briefly
introduced in the discussion of the framework functions, in that introduced in the discussion of the framework functions, in that
an object of this type is pass to the "load" function. A LibraryHandle an object of this type is pass to the "load" function. A LibraryHandle
can also be obtained from within a callout by calling the CalloutHandle's can also be obtained from within a callout by calling the CalloutHandle's
getLibraryHandle() method. @c getLibraryHandle() method.
The LibraryHandle provides three methods to manipulate callouts: The LibraryHandle provides three methods to manipulate callouts:
- registerCallout - register a callout on a hook. - @c registerCallout - register a callout on a hook.
- deregisterCallout - deregister a callout from a hook. - @c deregisterCallout - deregister a callout from a hook.
- deregisterAllCallouts - deregister all callouts on a hook. - @c deregisterAllCallouts - deregister all callouts on a hook.
The following sections cover some of the ways in which these can be used. The following sections cover some of the ways in which these can be used.
@@ -960,7 +961,7 @@ a hook point. Although it is likely to be rare for user code to need to
do this, there may be instances where it make sense. do this, there may be instances where it make sense.
To register multiple callouts on a hook, just call To register multiple callouts on a hook, just call
LibraryHandle::registerCallout multiple times on the same hook, e.g. @c LibraryHandle::registerCallout multiple times on the same hook, e.g.
@code @code
libhandle.registerCallout("pkt4_receive", classify); libhandle.registerCallout("pkt4_receive", classify);
@@ -968,7 +969,7 @@ LibraryHandle::registerCallout multiple times on the same hook, e.g.
@endcode @endcode
The hooks framework will call the callouts in the order they are The hooks framework will call the callouts in the order they are
registered. The same CalloutHandle is passed between them, so any registered. The same @c CalloutHandle is passed between them, so any
change made to the CalloutHandle's arguments, "skip" flag, or per-request change made to the CalloutHandle's arguments, "skip" flag, or per-request
context by the first is visible to the second. context by the first is visible to the second.
@@ -1036,7 +1037,7 @@ int write_data(CalloutHandle& handle) {
flush(interesting); flush(interesting);
// We've logged the data, so deregister ourself. This callout will not // We've logged the data, so deregister ourself. This callout will not
// be called again until it is registered by pkt4_receive. // be called again until it is registered by "pkt4_receive".
handle.getLibraryHandle().deregisterCallout("pkt4_send", write_data); handle.getLibraryHandle().deregisterCallout("pkt4_send", write_data);
@@ -1093,7 +1094,7 @@ request.
The vertical blue lines represent callout context. Context is The vertical blue lines represent callout context. Context is
per-packet but also per-library. When the server calls "authorize", per-packet but also per-library. When the server calls "authorize",
the CalloutHandle's getContext and setContext methods access a context the CalloutHandle's @c getContext and @c setContext methods access a context
created purely for library 1. The next callout on the hook will access created purely for library 1. The next callout on the hook will access
context created for library 2. These contexts are passed to the callouts context created for library 2. These contexts are passed to the callouts
associated with the next hook. So when "check" is called, it gets the associated with the next hook. So when "check" is called, it gets the
@@ -1132,7 +1133,7 @@ as separate elements of the hooks-libraries configuration element, e.g.
In rare cases, it is possible that one library may want to pass In rare cases, it is possible that one library may want to pass
data to another. This can be done in a limited way by means of the data to another. This can be done in a limited way by means of the
CalloutHandle's setArgument and getArgument calls. For example, in the CalloutHandle's @c setArgument and @c getArgument calls. For example, in the
above diagram, the callout "add_option" can pass a value to "putopt" above diagram, the callout "add_option" can pass a value to "putopt"
by setting a name.value pair in the hook's argument list. "putopt" by setting a name.value pair in the hook's argument list. "putopt"
would be able to read this, but would not be able to return information would be able to read this, but would not be able to return information
@@ -1185,7 +1186,7 @@ to add one.) For example:
extern "C" { extern "C" {
int version() { int version() {
return (BIND10_HOOKS_VERSION); return (KEA_HOOKS_VERSION);
} }
int load() { int load() {