// Copyright (C) 2013-2020 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 libdhcp_ddns libkea-dhcp_ddns - DHCP_DDNS Request I/O Library

@section libdhcp_ddnsIntro Introduction

This is a library of classes (in the isc::dhcp_ddns namespace) for sending
and receiving requests used by ISC's DHCP-DDNS (aka D2) service to carry
out DHCP-driven DNS updates.  Each request contains the following information:

    - change-type -  indicates if this is a request to add or remove DNS entries
    - forward-change - indicates if the forward DNS zone (the one that
      contains name to address mappings) should be updated
    - reverse-change - indicates if reverse DNS zone (which contains the
      address to name mappings) should be updated
    - fqdn - the fully qualified domain name whose DNS entries should be updated
    - ip-address - IP address (v4 or v6) leased to the client with the
      given FQDN
    - dhcid - DHCID (a form of identification) of the client to whom the IP
      address is leased
    - lease-expires-on - timestamp containing the date/time the lease expires
    - lease-length - duration in seconds for which the lease is valid.

These requests are implemented in this library by the class,
isc::dhcp_ddns::NameChangeRequest.  This class provides services for
constructing the requests as well as marshalling them to and from various
transport formats.  Currently, the only format supported is JSON, however the
design of the classes in this library is such that supporting additional
formats will be easy to add.  The JSON "schema" is documented here:
isc::dhcp_ddns::NameChangeRequest::fromJSON().

For sending and receiving NameChangeRequests, this library supplies an abstract
pair of classes, isc::dhcp_ddns::NameChangeSender and
isc::dhcp_ddns::NameChangeListener.  NameChangeSender defines the public
interface that DHCP_DDNS clients, such as DHCP servers, use for sending
requests to DHCP_DDNS.   NameChangeListener is used by request consumers,
primarily the DHCP_DDNS service, for receiving the requests.

By providing abstract interfaces, the implementation isolates the senders and
listeners from any underlying details of request transportation.  This was done
to allow support for a variety of transportation mechanisms.  Currently, the
only transport supported is via UDP Sockets.

The UDP implementation is provided by isc::dhcp_ddns::NameChangeUDPSender
and isc::dhcp_ddns::NameChangeUDPListener.  The implementation is strictly
unidirectional: there is no explicit acknowledgment of receipt of a
request so, as it is UDP, no guarantee of delivery.

@section libdhcp_ddnsMTConsiderations Multi-Threading Consideration for DHCP_DDNS Request I/O Library

By default this library is not thread safe (it uses asynchronous I/O) at
the exception of the Name Change Request sender class (@c
isc::dhcp_ddns::NameChangeSender) which is Kea thread safe (i.e. it is
thread safe when the multi-threading mode is true).

*/
