]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3418] Remaining chapters moved to separate files.
authorTomek Mrugalski <tomasz@isc.org>
Wed, 11 Jun 2014 12:21:54 +0000 (14:21 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Wed, 11 Jun 2014 12:21:54 +0000 (14:21 +0200)
doc/guide/Makefile.am
doc/guide/ddns.xml [new file with mode: 0644]
doc/guide/dhcp4-srv.xml [new file with mode: 0644]
doc/guide/dhcp6-srv.xml [new file with mode: 0644]
doc/guide/intro.xml [new file with mode: 0644]
doc/guide/kea-guide.xml
doc/guide/libdhcp.xml [new file with mode: 0644]
doc/guide/quickstart.xml [new file with mode: 0644]

index 840f88ab9b35f81ef5afce189afe0626ed2f9add..a7e8d315ea7d277566f587b8d76b677c66eb48c7 100644 (file)
@@ -5,7 +5,8 @@ DOCS = kea-guide.txt
 dist_doc_DATA = $(DOCS)
 dist_html_DATA = $(HTMLDOCS) kea-guide.css
 
-DOCBOOK = kea-guide.xml logging.xml config.xml install.xml
+DOCBOOK = kea-guide.xml intro.xml quickstart.xml install.xml config.xml
+DOCBOOK += dhcp4-srv.xml dhcp6-srv.xml logging.xml
 
 EXTRA_DIST = $(DOCBOOK)
 DISTCLEANFILES = $(HTMLDOCS) $(DOCS) kea-messages.xml
diff --git a/doc/guide/ddns.xml b/doc/guide/ddns.xml
new file mode 100644 (file)
index 0000000..3abfc4b
--- /dev/null
@@ -0,0 +1,811 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+]>
+
+  <chapter id="dhcp-ddns-server">
+    <title>The DHCP-DDNS Server</title>
+    <para>
+    The DHCP-DDNS Server (b10-dhcp-ddns, known informally as D2) conducts the client side of
+    the DDNS protocol (defined in RFC 2136) on behalf of the DHCPv4 and DHCPv6
+    servers (b10-dhcp4 and b10-dhcp6 respectively). The DHCP servers construct
+    DDNS update requests, known as NameChangeRequests (NCRs), based upon DHCP
+    lease change events and then post these to D2. D2 attempts to match
+    each such request to the appropriate DNS server(s) and carry out the
+    necessary conversation with those servers to update the DNS data.
+    </para>
+    <para>
+    In order to match a request to appropriate DNS servers, D2 must have a
+    catalog of servers from which to select. In fact, D2 has two such catalogs,
+    one for forward DNS and one for reverse DNS; these catalogs are referred
+    to as DDNS Domain Lists.  Each list consists of one or more named DDNS
+    Domains. Further, each DDNS Domain has a list of of one or more DNS
+    servers that publish the DNS data for that domain.
+    </para>
+    <para>
+    When conducting forward domain matching, D2 will compare the FQDN in
+    the request against the name of each forward DDNS Domain. The domain
+    whose name matches the longest portion of the FQDN is considered the
+    best match.  For example, if the FQDN is "myhost.sample.example.com.",
+    and there are two forward domains in the catalog: "sample.example.com."
+    and "example.com.", the former is regarded as the best match.  In some
+    cases, it may not be possible to find a suitable match. Given the same two
+    forward domains there would be no match for the FQDN, "bogus.net", so the
+    request would be rejected.   Finally, if there are no forward DDNS Domains
+    defined, D2 will simply disregard the forward update portion of requests.
+    </para>
+    <para>
+    When conducting reverse domain matching, D2 constructs a reverse
+    FQDN from the lease address in the request and compare that against
+    the name of each reverse DDNS Domain. Again, the domain whose name matches
+    the longest portion of the FQDN is considered the best match. For instance,
+    if the lease address is "172.16.1.40" and there are two reverse domains in
+    the catalog: "1.16.172.in-addr.arpa." and "16.172.in-addr.arpa", the
+    former is the best match.  As with forward matching, it is possible to not
+    find a suitable match.  Given the same two domains, there would be no
+    match for the lease address, "192.168.1.50", and the request would be
+    rejected. Finally, if there are no reverse DDNS Domains defined, D2 will
+    simply disregard the reverse update portion of requests.
+    </para>
+    <section id="dhcp-ddns-server-start-stop">
+      <title>Starting and Stopping the DHCP-DDNS Server</title>
+      <para>
+      <command>b10-dhcp-ddns</command> is the BIND 10 DHCP-DDNS server and,
+      like other parts of BIND 10, is configured through the
+      <command>bindctl</command> program.
+      </para>
+      <para>
+      After starting BIND 10 and entering bindctl, the first step in
+      configuring the server is to add it to the list of running BIND 10
+      services.
+<screen>
+&gt; <userinput>config add Init/components b10-dhcp-ddns</userinput>
+&gt; <userinput>config set Init/components/b10-dhcp-ddns/kind dispensable</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      <para>
+      To remove <command>b10-dhcp-ddns</command> from the set of running services,
+      the <command>b10-dhcp-ddns</command> is removed from list of Init components:
+<screen>
+&gt; <userinput>config remove Init/components b10-dhcp-ddns</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      <para>
+      Note that the server was only removed from the list, so it will not be
+      automatically restarted, but the server itself is still running. Hence it
+      is usually desired to stop it:
+      </para>
+<screen>
+&gt; <userinput>DhcpDdns shutdown</userinput>
+</screen>
+      <para>
+      Upon start up the module will load its configuration and begin listening
+      for NCRs based on that configuration.
+      </para>
+    </section> <!-- end start-stop -->
+    <section id="d2-configuration">
+      <title>Configuring the DHCP-DDNS Server</title>
+      <para>
+        Once the server is started, it can be configured. To view the
+        current configuration, use the following command in <command>bindctl</command>:
+        <screen>
+&gt; <userinput>config show DhcpDdns</userinput></screen>
+        When starting b10-dhcp-ddns module for the first time, the default
+        configuration will be available. It will look similar to this:
+<screen>
+&gt; <userinput>config show DhcpDdns</userinput>
+DhcpDdns/ip_address "127.0.0.1" string  (default)
+DhcpDdns/port   53001   integer (default)
+DhcpDdns/dns_server_timeout   100   integer (default)
+DhcpDdns/ncr_protocol  "UDP"   string (default)
+DhcpDdns/ncr_format    "JSON"  string (default)
+DhcpDdns/tsig_keys  []  list    (default)
+DhcpDdns/forward_ddns/ddns_domains  []  list    (default)
+DhcpDdns/reverse_ddns/ddns_domains  []  list    (default)
+</screen>
+      <para>
+      (While displayed, the parameter "interface" is not implemented, and
+      will be removed in the near future.)
+      </para>
+      </para>
+      <para>
+      The configuration can be divided as follows, each of which is described
+      in its own section:
+      </para>
+        <itemizedlist>
+          <listitem>
+            <simpara>
+              <command>Global Server Parameters</command> &mdash;
+              values which control connectivity and global server behavior
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>TSIG Key Info</command> &mdash;
+              defines the TSIG keys used for secure traffic with DNS servers
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>Forward DDNS</command> &mdash;
+              defines the catalog of Forward DDNS Domains
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>Reverse DDNS</command> &mdash;
+              defines the catalog of Forward DDNS Domains
+            </simpara>
+          </listitem>
+        </itemizedlist>
+      <section id="d2-server-parameter-config">
+        <title>Global Server Parameters</title>
+      <orderedlist>
+      <listitem><para>
+      ip_address - IP address on which D2 listens for requests. The default is
+      the local loopback interface at address 127.0.0.1. You may specify
+      either an IPv4 or IPv6 address.
+      </para></listitem>
+      <listitem><para>
+      port - Port on which D2 listens for requests.  The default value
+      is 53001.
+      </para></listitem>
+      <listitem><para>
+      ncr_format - Socket protocol to use when sending requests to D2.
+      Currently only UDP is supported.  TCP may be available in an upcoming
+      release.
+      </para></listitem>
+      <listitem><para>
+      ncr_protocol - Packet format to use when sending requests to D2.
+      Currently only JSON format is supported.  Other formats may be available
+      in future releases.
+      </para></listitem>
+      <listitem><para>
+      dns_server_timeout - The maximum amount of time in milliseconds, that
+      D2 will wait for a response from a DNS server to a single DNS update
+      message.
+      </para></listitem>
+      </orderedlist>
+        <para>
+        D2 must listen for change requests on a known address and port.  By
+        default it listens at 127.0.0.1 on port 53001. The following example
+        illustrates how to change D2's global parameters so it will listen
+        at 192.168.1.10 port 900:
+<screen>
+&gt; <userinput>config set DhcpDdns/ip_address "192.168.1.10"</userinput>
+&gt; <userinput>config set DhcpDdns/port 900</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+        </para>
+        <warning>
+          <simpara>
+            When the DHCP-DDNS server is configured to listen at an address
+            other than the loopback address (127.0.0.1 or ::1), it is possible
+            for a malicious attacker to send bogus NameChangeRequests to it
+            and change entries in the DNS. For this reason, addresses other
+            than the IPv4 or IPv6 loopback addresses should only be used
+            for testing purposes. A future version of Kea will implement
+            authentication to guard against such attacks.
+          </simpara>
+        </warning>
+<note>
+<simpara>
+If the ip_address and port are changed, it will be necessary to change the
+corresponding values in the DHCP servers' "dhcp-ddns" configuration section.
+</simpara>
+</note>
+      </section> <!-- "d2-server-parameter-config" -->
+
+      <section id="d2-tsig-key-list-config">
+        <title>TSIG Key List</title>
+        <para>
+        A DDNS protocol exchange can be conducted with or without TSIG
+        (defined in <ulink url="http://tools.ietf/org/html/rfc2845">RFC
+        2845</ulink>). This configuration section allows the administrator
+        to define the set of TSIG keys that may be used in such
+        exchanges.</para>
+
+        <para>To use TSIG when updating entries in a DNS Domain,
+        a key must be defined in the TSIG Key List and referenced by
+        name in that domain's configuration entry.  When D2 matches a
+        change request to a domain, it checks whether the domain has
+        a TSIG key associated with it.  If so, D2 will use that key to
+        sign DNS update messages sent to and verify repsonses received
+        from the domain's DNS server(s). For each TSIG key required by
+        the DNS servers that D2 will be working with there must be a
+        corresponding TSIG key in the TSIG Key list.</para>
+
+        <para>
+        As one might gather from the name, the tsig_key section of the
+        D2 configuration lists the TSIG keys.  Each entry describes a
+        TSIG key used by one or more DNS servers to authenticate requests
+        and sign responses.  Every entry in the list has three parameters:
+        <itemizedlist>
+          <listitem>
+            <simpara>
+              <command>name</command> &mdash;
+              a unique text label used to identify this key within the
+              list.  This value is used to specify which key (if any) should be
+              used when updating a specific domain. So long as it is unique its
+              content is arbitrary, although for clarity and ease of maintenance
+              it is recommended that it match the name used on the DNS server(s).
+              It cannot be blank.
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>algorithm</command> &mdash;
+              specifies which hashing algorithm should be used with this
+              key.  This value must specify the same algorithm used for the
+              key on the DNS server(s). The supported algorithms are listed below:
+              <itemizedlist>
+                <listitem>
+                   <command>HMAC-MD5</command>
+                </listitem>
+                <listitem>
+                    <command>HMAC-SHA1</command>
+                </listitem>
+                <listitem>
+                  <command>HMAC-SHA224</command>
+              </listitem>
+              <listitem>
+                  <command>HMAC-SHA256</command>
+              </listitem>
+              <listitem>
+                  <command>HMAC-SHA384</command>
+                  </listitem>
+              <listitem>
+                  <command>HMAC-SHA512</command>
+              </listitem>
+              </itemizedlist>
+              This value is not case sensitive.
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>secret</command> &mdash;
+              is used to specify the shared secret key code for this key.  This value is
+              case sensitive and must exactly match the value specified on the DNS server(s).
+              It is a base64-encoded text value.
+            </simpara>
+          </listitem>
+        </itemizedlist>
+        </para>
+        <para>
+        As an example, suppose that a domain D2 will be updating is
+        maintained by a BIND9 DNS server which requires dynamic updates
+        to be secured with TSIG.  Suppose further that the entry for
+        the TSIG key in BIND9's named.conf file looks like this:
+<screen>
+   :
+   key "key.four.example.com." {
+       algorithm hmac-sha224;
+       secret "bZEG7Ow8OgAUPfLWV3aAUQ==";
+   };
+   :
+</screen>
+        By default, the TSIG Key list is empty:
+<screen>
+<userinput>> config show DhcpDdns/tsig_keys</userinput>
+DhcpDdns/tsig_keys  []  list  (default)
+</screen>
+        We must first create a new key in the list:
+<screen>
+<userinput>> config add DhcpDdns/tsig_keys</userinput>
+</screen>
+        Displaying the new element, reveals:
+<screen>
+<userinput>> config show DhcpDdns/tsig_keys[0]</userinput>
+DhcpDdns/tsig_keys[0]/name  ""  string  (default)
+DhcpDdns/tsig_keys[0]/algorithm "HMAC-MD5"  string  (modified)
+DhcpDdns/tsig_keys[0]/secret  ""  string  (default)
+</screen>
+        Now set all three values to match BIND9's key:
+<screen>
+<userinput>> config set DhcpDdns/tsig_keys[0]/name "key.four.example.com"</userinput>
+<userinput>> config set DhcpDdns/tsig_keys[0]/algorithm "HMAC-SHA224"</userinput>
+<userinput>> config set DhcpDdns/tsig_keys[0]/secret "bZEG7Ow8OgAUPfLWV3aAUQ=="</userinput>
+<userinput>> config commit</userinput>
+</screen>
+        </para>
+        These steps would be repeated for each TSIG key needed.  Note that the same TSIG key
+        can be used with more than one domain.
+      </section> <!-- "d2-tsig-key-list-config" -->
+
+      <section id="d2-forward-ddns-config">
+        <title>Forward DDNS</title>
+        <para>
+        The Forward DDNS section is used to configure D2's forward update
+        behavior. Currently it contains a single parameter, the catalog of
+        forward DDNS Domains:
+<screen>
+<userinput>> config show DhcpDdns/forward_ddns/</userinput>
+DhcpDdns/forward_ddns/ddns_domains  [] list  (default)
+</screen>
+        By default, this list is empty, which will cause the server to ignore
+        the forward update portions of requests.
+        </para>
+        <section id="add-forward-ddns-domain">
+          <title>Adding Forward DDNS Domains</title>
+          <para>
+          A forward DDNS Domain maps a forward DNS zone to a set of DNS servers
+          which maintain the forward DNS data for that zone.  You will need one
+          forward DDNS Domain for each zone you wish to service.  It may very
+          well be that some or all of your zones are maintained by the same
+          servers. You will still need one DDNS Domain per zone. Remember that
+          matching a request to the appropriate server(s) is done by zone and
+          a DDNS Domain only defines a single zone.
+          </para>
+          <para>
+          The section describes how to add Forward DDNS Domains. Repeat these
+          steps for each Forward DDNS Domain desired.  Each Forward DDNS Domain
+          has the following parameters:
+          <itemizedlist>
+            <listitem>
+              <simpara>
+              <command>name</command> &mdash;
+              The fully qualified domain name (or zone) that this DDNS Domain
+              can update.  This is value used to compare against the request
+              FQDN during forward matching.  It must be unique within the
+              catalog.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>key_name</command> &mdash;
+              If TSIG is used with this domain's servers, this
+              value should be the name of the key from within the TSIG Key List
+              to use.  If the value is blank (the default), TSIG will not be
+              used in DDNS conversations with this domain's servers.  Currently
+              TSIG has not been implemented, so this value is ignored.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>dns_servers</command> &mdash;
+              A list of one or more DNS servers which can conduct the server
+              side of the DDNS protocol for this domain.  The servers
+              are used in a first to last preference. In other words, when D2
+              begins to process a request for this domain it will pick the
+              first server in this list and attempt to communicate with it.
+              If that attempt fails, it will move to next one in the list and
+              so on until the it achieves success or the list is exhausted.
+              </simpara>
+            </listitem>
+          </itemizedlist>
+        To create a new forward DDNS Domain, one must first add a new domain
+        element:
+<screen>
+<userinput>> config add DhcpDdns/forward_ddns/ddns_domains</userinput>
+</screen>
+        Displaying the DDNS Domain reveals this:
+<screen>
+<userinput>> config show DhcpDdns/forward_ddns/ddns_domains[0]</userinput>
+DhcpDdns/forward_ddns/ddns_domains[0]/name  ""  string  (default)
+DhcpDdns/forward_ddns/ddns_domains[0]/key_name  ""  string  (default)
+DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers   []  list    (default)
+</screen>
+        To set the domain's name to "other.example.com":
+<screen>
+<userinput>> config set DhcpDdns/forward_ddns/ddns_domains[1]/name "other.example.com"</userinput>
+<userinput>> config commit</userinput>
+</screen>
+        It is permissible to add a domain without any servers. If that domain
+        should be matched to a request, however, the request will fail.  In
+        order to make the domain useful though, we must add at least one DNS
+        server to it.
+        </para>
+
+        <section id="add-forward-dns-servers">
+          <title>Adding Forward DNS Servers</title>
+          <para>
+          The section describes how to add DNS servers to a Forward DDNS Domain.
+          Repeat them for as many servers as desired for a each domain.
+          </para>
+          <para>
+          Forward DNS Server entries represent actual DNS servers which
+          support the server side of the DDNS protocol. Each Forward DNS Server
+          has the following parameters:
+          <itemizedlist>
+            <listitem>
+              <simpara>
+              <command>hostname</command> &mdash;
+              The resolvable host name of the DNS server. This value is not
+              yet implemented.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>ip_address</command> &mdash;
+              The IP address at which the server listens for DDNS requests.
+              This may be either an IPv4 or an IPv6 address.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>port</command> &mdash;
+              The port on which the server listens for DDNS requests. It
+              defaults to the standard DNS service port of 53.
+              </simpara>
+            </listitem>
+          </itemizedlist>
+          To create a new forward DNS Server, one must first add a new server
+          element to the domain:
+<screen>
+<userinput>> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers</userinput>
+</screen>
+         Displaying the DNS Server element should appear as follows:
+<screen>
+<userinput>> config show DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]</userinput>
+DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/hostname   ""  string  (default)
+DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address ""  string  (default)
+DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/port   53  integer(default)
+</screen>
+        As stated earlier, "hostname" is not yet supported so, the parameter
+        "ip_address" must be set to the address of the DNS server. If for
+        example the service is running at "172.88.99.10", then set it as
+        follows:
+<screen>
+<userinput>> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.88.99.10"</userinput>
+<userinput>> config commit</userinput>
+</screen>
+          </para>
+        </section> <!-- "add-forward-dns-servers" -->
+
+      </section> <!-- "add-forward-ddns-domains" -->
+
+      </section> <!-- "d2-forward-ddns-config" -->
+
+      <section id="d2-reverse-ddns-config">
+        <title>Reverse DDNS</title>
+        <para>
+        The Reverse DDNS section is used to configure D2's reverse update
+        behavior, and the concepts are the same as for the forward DDNS
+        section. Currently it contains a single parameter, the catalog of
+        reverse DDNS Domains:
+<screen>
+<userinput>> config show DhcpDdns/reverse_ddns/</userinput>
+DhcpDdns/reverse_ddns/ddns_domains  [] list  (default)
+</screen>
+        By default, this list is empty, which will cause the server to ignore
+        the reverse update portions of requests.
+        </para>
+        <section id="add-reverse-ddns-domain">
+          <title>Adding Reverse DDNS Domains</title>
+          <para>
+          A reverse DDNS Domain maps a reverse DNS zone to a set of DNS servers
+          which maintain the reverse DNS data for that zone.  You will need one
+          reverse DDNS Domain for each zone you wish to service.  It may very
+          well be that some or all of your zones are maintained by the same
+          servers; even then, you will still need one DDNS Domain entry for each
+          zone. Remember that
+          matching a request to the appropriate server(s) is done by zone and
+          a DDNS Domain only defines a single zone.
+          </para>
+          <para>
+          The section describes how to add Reverse DDNS Domains. Repeat these
+          steps for each Reverse DDNS Domain desired.  Each Reverse DDNS Domain
+          has the following parameters:
+          <itemizedlist>
+            <listitem>
+              <simpara>
+              <command>name</command> &mdash;
+              The fully qualified reverse zone that this DDNS Domain
+              can update.  This is the value used during reverse matching
+              which will compare it with a reversed version of the request's
+              lease address. The zone name should follow the appropriate
+              standards: for example, to to support the IPv4 subnet 172.16.1,
+              the name should be. "1.16.172.in-addr.arpa.".  Similarly,
+              to support an IPv6 subent of 2001:db8:1, the name should be
+              "1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa."
+              Whatever the name, it must be unique within the catalog.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>key_name</command> &mdash;
+              If TSIG should be used with this domain's servers, then this
+              value should be the name of that key from the TSIG Key List.
+              If the value is blank (the default), TSIG will not be
+              used in DDNS conversations with this domain's servers.  Currently
+              this value is not used as TSIG has not been implemented.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>dns_servers</command> &mdash;
+              a list of one or more DNS servers which can conduct the server
+              side of the DDNS protocol for this domain.  Currently the servers
+              are used in a first to last preference. In other words, when D2
+              begins to process a request for this domain it will pick the
+              first server in this list and attempt to communicate with it.
+              If that attempt fails, it will move to next one in the list and
+              so on until the it achieves success or the list is exhausted.
+              </simpara>
+            </listitem>
+          </itemizedlist>
+        To create a new reverse DDNS Domain, one must first add a new domain
+        element:
+<screen>
+<userinput>> config add DhcpDdns/reverse_ddns/ddns_domains</userinput>
+</screen>
+        Displaying the DDNS Domain reveals this:
+<screen>
+<userinput>> config show DhcpDdns/reverse_ddns/ddns_domains[0]</userinput>
+DhcpDdns/reverse_ddns/ddns_domains[0]/name  ""  string  (default)
+DhcpDdns/reverse_ddns/ddns_domains[0]/key_name  ""  string  (default)
+DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers   []  list    (default)
+</screen>
+        For domain supporting the subnet 2001:db8:1::, we would set the
+        domain's name as follows:
+<screen>
+<userinput>> config set DhcpDdns/reverse_ddns/ddns_domains[1]/name "1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa."</userinput>
+<userinput>> config commit</userinput>
+</screen>
+        It is permissible to add a domain without any servers. If that domain
+        should be matched to a request, however, the request will fail.  In
+        order to make the domain useful though, we must add at least one DNS
+        server to it.
+        </para>
+
+        <section id="add-reverse-dns-servers">
+          <title>Adding Reverse DNS Servers</title>
+          <para>
+          The section describes how to add DNS servers to a Reverse DDNS Domain.
+          Repeat them for as many servers as desired for a each domain.
+          </para>
+          <para>
+          Reverse DNS Server entries represents a actual DNS servers which
+          support the server side of the DDNS protocol. Each Reverse DNS Server
+          has the following parameters:
+          <itemizedlist>
+            <listitem>
+              <simpara>
+              <command>hostname</command> &mdash;
+              The resolvable host name of the DNS server. This value is
+              currently ignored.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>ip_address</command> &mdash;
+              The IP address at which the server listens for DDNS requests.
+              </simpara>
+            </listitem>
+            <listitem>
+              <simpara>
+              <command>port</command> &mdash;
+              The port on which the server listens for DDNS requests. It
+              defaults to the standard DNS service port of 53.
+              </simpara>
+            </listitem>
+          </itemizedlist>
+          To create a new reverse DNS Server, one must first add a new server
+          element to the domain:
+<screen>
+<userinput>> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers</userinput>
+</screen>
+         Displaying the DNS Server element should appear as follows:
+<screen>
+<userinput>> config show DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]</userinput>
+DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/hostname   ""  string  (default)
+DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address ""  string  (default)
+DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/port   53  integer(default)
+</screen>
+        As stated earlier, "hostname" is not yet supported so, the parameter
+        "ip_address" must be set to the address of the DNS server. If for
+        example the service is running at "172.88.99.10", then set it as
+        follows:
+<screen>
+<userinput>> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.88.99.10"</userinput>
+<userinput>> config commit</userinput>
+</screen>
+          </para>
+        </section> <!-- "add-reverse-dns-servers" -->
+
+      </section> <!-- "add-reverse-ddns-domains" -->
+
+      </section> <!-- "d2-reverse-ddns-config" -->
+
+      <section id="d2-exmaple-config">
+        <title>Example DHCP-DDNS Server Configuration</title>
+        <para>
+        This section provides an example DHCP-DDNS server configuration based
+        on a small example network.  Let's suppose our example network has
+        three domains, each with their own subnet.
+
+        <table>
+          <title>Our example network</title>
+          <tgroup cols='4' align='left'>
+          <colspec colname='domain'/>
+          <colspec colname='subnet'/>
+          <colspec colname='fservers'/>
+          <colspec colname='rservers'/>
+          <thead>
+            <row>
+              <entry>Domain</entry>
+              <entry>Subnet</entry>
+              <entry>Forward DNS Servers</entry>
+              <entry>Reverse DNS Servers</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry>four.example.com</entry>
+              <entry>192.0.2.0/24</entry>
+              <entry>172.16.1.5, 172.16.2.5</entry>
+              <entry>172.16.1.5, 172.16.2.5</entry>
+            </row>
+            <row>
+              <entry>six.example.com</entry>
+              <entry>2001:db8:1::/64</entry>
+              <entry>3001:1::50</entry>
+              <entry>3001:1::51</entry>
+            </row>
+            <row>
+              <entry>example.com</entry>
+              <entry>192.0.0.0/16</entry>
+              <entry>172.16.2.5</entry>
+              <entry>172.16.2.5</entry>
+            </row>
+          </tbody>
+          </tgroup>
+        </table>
+        </para>
+        <para>
+        We need to construct three forward DDNS Domains:
+        <table>
+          <title>Forward DDNS Domains Needed</title>
+          <tgroup cols='3' align='left'>
+          <colspec colname='num'/>
+          <colspec colname='name'/>
+          <colspec colname='servers'/>
+          <thead>
+            <row>
+              <entry>#</entry>
+              <entry>DDNS Domain Name</entry>
+              <entry>DNS Servers</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry>1.</entry>
+              <entry>four.example.com.</entry>
+              <entry>172.16.1.5, 172.16.2.5</entry>
+            </row>
+            <row>
+              <entry>2.</entry>
+              <entry>six.example.com.</entry>
+              <entry>3001:1::50</entry>
+            </row>
+            <row>
+              <entry>3.</entry>
+              <entry>example.com.</entry>
+              <entry>172.16.2.5</entry>
+            </row>
+          </tbody>
+          </tgroup>
+        </table>
+        As discussed earlier, FQDN to domain matching is based on the longest
+        match. The FQDN, "myhost.four.example.com.", will match the first
+        domain ("four.example.com") while "admin.example.com." will match the
+        third domain ("example.com"). The
+        FQDN, "other.example.net." will fail to match any domain and would
+        be rejected.
+        </para>
+        <para>
+        The following series of commands in bindctl will create the Forward
+        DDNS Domains.
+<screen>
+<userinput>
+> config add DhcpDdns/forward_ddns/ddns_domains
+> config set DhcpDdns/forward_ddns/ddns_domains[0]/name "four.example.com."
+> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers
+> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.16.1.5"
+> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers
+> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[1]/ip_address "172.16.2.5"
+>
+> config add DhcpDdns/forward_ddns/ddns_domains
+> config set DhcpDdns/forward_ddns/ddns_domains[1]/name "six.example.com."
+> config add DhcpDdns/forward_ddns/ddns_domains[1]/dns_servers
+> config set DhcpDdns/forward_ddns/ddns_domains[1]/dns_servers[0]/ip_address "3001:1::50:"
+>
+> config add DhcpDdns/forward_ddns/ddns_domains
+> config set DhcpDdns/forward_ddns/ddns_domains[2]/name "example.com."
+> config add DhcpDdns/forward_ddns/ddns_domains[2]/dns_servers
+> config set DhcpDdns/forward_ddns/ddns_domains[2]/dns_servers[0]/ip_address "172.16.2.5"
+>
+> config commit
+</userinput>
+</screen>
+        </para>
+        <para>
+        Similarly, we need to construct the three reverse DDNS Domains:
+        <table>
+          <title>Reverse DDNS Domains Needed</title>
+          <tgroup cols='3' align='left'>
+          <colspec colname='num'/>
+          <colspec colname='DDNS Domain name'/>
+          <colspec colname='DDNS Domain DNS Servers'/>
+          <thead>
+            <row>
+              <entry>#</entry>
+              <entry>DDNS Domain Name</entry>
+              <entry>DNS Servers</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry>1.</entry>
+              <entry>2.0.192.in-addr.arpa.</entry>
+              <entry>172.16.1.5, 172.16.2.5</entry>
+            </row>
+            <row>
+              <entry>2.</entry>
+              <entry>1.0.0.0.8.d.b.0.1.0.0.2.ip6.arpa.</entry>
+              <entry>3001:1::50</entry>
+            </row>
+            <row>
+              <entry>3.</entry>
+              <entry>0.182.in-addr.arpa.</entry>
+              <entry>172.16.2.5</entry>
+            </row>
+          </tbody>
+          </tgroup>
+        </table>
+        An address of "192.0.2.150" will match the first domain,
+        "2001:db8:1::10" will match the second domain, and "192.0.50.77"
+        the third domain.
+        </para>
+        <para>
+        The following series of commands in bindctl will create our Reverse
+        DDNS Domains.
+<screen>
+<userinput>
+> config add DhcpDdns/reverse_ddns/ddns_domains
+> config set DhcpDdns/reverse_ddns/ddns_domains[0]/name "2.0.192.in-addr.arpa."
+> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers
+> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.16.1.5"
+> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers
+> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[1]/ip_address "172.16.2.5"
+>
+> config add DhcpDdns/reverse_ddns/ddns_domains
+> config set DhcpDdns/reverse_ddns/ddns_domains[1]/name "1.0.0.0.8.d.b.0.1.0.0.2.ip6.arpa."
+> config add DhcpDdns/reverse_ddns/ddns_domains[1]/dns_servers
+> config set DhcpDdns/reverse_ddns/ddns_domains[1]/dns_servers[0]/ip_address "3001:1::50:"
+>
+> config add DhcpDdns/reverse_ddns/ddns_domains
+> config set DhcpDdns/reverse_ddns/ddns_domains[2]/name "0.192.in-addr.arpa."
+> config add DhcpDdns/reverse_ddns/ddns_domains[2]/dns_servers
+> config set DhcpDdns/reverse_ddns/ddns_domains[2]/dns_servers[0]/ip_address "172.16.2.5"
+>
+> config commit
+</userinput>
+</screen>
+        </para>
+        </section> <!-- end of "d2-example" -->
+    </section> <!-- end of section "d2-configuration" -->
+    <section>
+      <title>DHCP-DDNS Server Limitations</title>
+      <para>The following are the current limitations of the DHCP-DDNS Server.</para>
+      <itemizedlist>
+        <listitem>
+          <simpara>
+            Requests received from the DHCP servers are placed in a
+            queue until they are processed.  Currently all queued requests
+            are lost when the server shuts down.
+          </simpara>
+        </listitem>
+        <listitem>
+          <simpara>
+            TSIG Authentication (<ulink
+            url="http://tools.ietf.org/html/rfc2845">RFC 2845</ulink>)
+            is not supported yet.
+          </simpara>
+        </listitem>
+      </itemizedlist>
+    </section>
+  </chapter> <!-- DHCP-DDNS Server -->
diff --git a/doc/guide/dhcp4-srv.xml b/doc/guide/dhcp4-srv.xml
new file mode 100644 (file)
index 0000000..426f14b
--- /dev/null
@@ -0,0 +1,1554 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+]>
+
+  <chapter id="dhcp4">
+    <title>The DHCPv4 Server</title>
+
+    <section id="dhcp4-start-stop">
+      <title>Starting and Stopping the DHCPv4 Server</title>
+
+      <para>
+        <command>b10-dhcp4</command> is the Kea DHCPv4 server and is configured
+        through the <command>bindctl</command> program.
+      </para>
+      <para>
+        After starting <command>bind10</command> and entering bindctl, the first step
+        in configuring the server is to add it to the list of running services.
+<screen>
+&gt; <userinput>config add Init/components b10-dhcp4</userinput>
+&gt; <userinput>config set Init/components/b10-dhcp4/kind dispensable</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      <para>
+         To remove <command>b10-dhcp4</command> from the set of running services,
+         the <command>b10-dhcp4</command> is removed from list of Init components:
+<screen>
+&gt; <userinput>config remove Init/components b10-dhcp4</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      <para>
+        Note that the server was only removed from the list, so BIND10 will not
+        restart it, but the server itself is still running. Hence it is usually
+        desired to stop it:
+<screen>
+&gt; <userinput>Dhcp4 shutdown</userinput>
+</screen>
+      </para>
+
+      <para>
+        On start-up, the server will detect available network interfaces
+        and will attempt to open UDP sockets on all interfaces that
+        are up, running, are not loopback, and have IPv4 address
+        assigned.
+
+        The server will then listen to incoming traffic. Currently
+        supported client messages are DISCOVER and REQUEST. The server
+        will respond to them with OFFER and ACK, respectively.
+
+        Since the DHCPv4 server opens privileged ports, it requires root
+        access. Make sure you run this daemon as root.
+      </para>
+
+    </section>
+
+    <section id="dhcp4-configuration">
+      <title>Configuring the DHCPv4 Server</title>
+      <para>
+        Once the server is started, it can be configured. To view the
+        current configuration, use the following command in <command>bindctl</command>:
+        <screen>
+&gt; <userinput>config show Dhcp4</userinput></screen>
+        When starting the DHCPv4 daemon for the first time, the default configuration
+        will be available. It will look similar to this:
+<screen>
+&gt; <userinput>config show Dhcp4</userinput>
+Dhcp4/hooks-libraries  []      list    (default)
+Dhcp4/interfaces/      list
+Dhcp4/renew-timer      1800    integer
+Dhcp4/rebind-timer     2000    integer (default)
+Dhcp4/valid-lifetime   4000    integer (default)
+Dhcp4/next-server      ""      string  (default)
+Dhcp4/echo-client-id   true    boolean (default)
+Dhcp4/option-def       []      list    (default)
+Dhcp4/option-data      []      list    (default)
+Dhcp4/lease-database/type      ""      string  (default)
+Dhcp4/lease-database/name      ""      string  (default)
+Dhcp4/lease-database/user      ""      string  (default)
+Dhcp4/lease-database/host      ""      string  (default)
+Dhcp4/lease-database/password  ""      string  (default)
+Dhcp4/subnet4/ list
+Dhcp4/dhcp-ddns/enable-updates true    boolean
+Dhcp4/dhcp-ddns/server-ip      "127.0.0.1"     string
+Dhcp4/dhcp-ddns/server-port    53001   integer
+Dhcp4/dhcp-ddns/sender-ip      ""      string
+Dhcp4/dhcp-ddns/sender-port    0       integer
+Dhcp4/dhcp-ddns/max-queue-size 1024    integer
+Dhcp4/dhcp-ddns/ncr-protocol   "UDP"   string
+Dhcp4/dhcp-ddns/ncr-format     "JSON"  string
+Dhcp4/dhcp-ddns/override-no-update     false   boolean
+Dhcp4/dhcp-ddns/override-client-update false   boolean
+Dhcp4/dhcp-ddns/replace-client-name    false   boolean
+Dhcp4/dhcp-ddns/generated-prefix       "myhost"        string
+Dhcp4/dhcp-ddns/qualifying-suffix      "example.com"   string
+</screen>
+      </para>
+
+      <para>
+        To change one of the parameters, simply follow
+        the usual <command>bindctl</command> procedure. For example, to make the
+        leases longer, change their valid-lifetime parameter:
+        <screen>
+&gt; <userinput>config set Dhcp4/valid-lifetime 7200</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Please note that most Dhcp4 parameters are of global scope
+        and apply to all defined subnets, unless they are overridden on a
+        per-subnet basis.
+      </para>
+      <para>
+        The renew-timer and rebind-timer are optional. If they are not specified,
+        the DHCPv4 options 58 and 59 are not sent in the server's response to the
+        client.
+      </para>
+
+      <section>
+      <title>Default storage for leases</title>
+      <para>
+        The server is able to store lease data in different repositories. Larger deployments
+        may elect to store leases in a database.
+        <xref linkend="database-configuration4"/> describes one way to do it.
+        By default, the server will use a CSV file rather than a database to store
+        lease information. One of the advantages of using a file is that it eliminates
+        dependency on third party database software.
+      </para>
+      <para>
+        The configuration of the file backend (Memfile)
+        is controlled through the Dhcp4/lease-database parameters. When default
+        parameters are used, the Memfile backend will write leases to a disk in the
+        [bind10-install-dir]/var/bind10/kea-leases4.csv.
+      </para>
+      <para>
+        It is possible to alter the default location of the lease file. The following
+        configuration:
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/type "memfile"</userinput>
+&gt; <userinput>config set Dhcp4/lease-database/persist true</userinput>
+&gt; <userinput>config set Dhcp4/lease-database/name "/tmp/kea-leases4.csv"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+        will change the default location of the lease file to /tmp/kea-leases4.csv.
+      </para>
+      <para>
+        The "persist" parameter controls whether the leases are written to disk.
+        It is strongly recommended that this parameter is set to "true" at all times
+        during the normal operation of the server
+      </para>
+      </section>
+
+      <section id="database-configuration4">
+      <title>Database Configuration</title>
+      <para>
+      All leases issued by the server are stored in the lease database.  Currently
+      there are 3 database backends available: MySQL, PostgreSQL and memfile.
+      <footnote>
+      <para>
+      The server comes with an in-memory database ("memfile") configured as the default
+      database. This is used for internal testing and is not supported.  In addition,
+      it does not store lease information on disk: lease information will be lost if the
+      server is restarted.
+      </para>
+      </footnote>, and so the server must be configured to
+      access the correct database with the appropriate credentials.
+      </para>
+        <note>
+            <para>
+            Database access information must be configured for the DHCPv4 server, even if
+            it has already been configured for the DHCPv6 server.  The servers store their
+            information independently, so each server can use a separate
+            database or both servers can use the same database.
+            </para>
+        </note>
+      <para>
+      Database configuration is controlled through the Dhcp4/lease-database parameters.
+      The type of the database must be set to "mysql", "postgresql" or "memfile":
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/type "mysql"</userinput>
+</screen>
+      Next, the name of the database is to hold the leases must be set: this is the
+      name used when the lease database was created (see <xref linkend="dhcp-mysql-database-create"/>
+      or <xref linkend="dhcp-pgsql-database-create"/>).
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/name "<replaceable>database-name</replaceable>"</userinput>
+</screen>
+      If the database is located on a different system to the DHCPv4 server, the
+      database host name must also be specified (although note that this configuration
+      may have a severe impact on server performance):
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/host "<replaceable>remote-host-name</replaceable>"</userinput>
+</screen>
+      The usual state of affairs will be to have the database on the same machine as the
+      DHCPv4 server.  In this case, set the value to the empty string (this is the default):
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/host ""</userinput>
+</screen>
+      </para>
+      <para>
+      Finally, the credentials of the account under which the server will access the database
+      should be set:
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/user "<replaceable>user-name</replaceable>"</userinput>
+&gt; <userinput>config set Dhcp4/lease-database/password "<replaceable>password</replaceable>"</userinput>
+</screen>
+      If there is no password to the account, set the password to the empty string "". (This is also the default.)
+      </para>
+      <note>
+      <para>The password is echoed when entered and is stored in clear text in the configuration
+      database.  Improved password security will be added in a future version of Kea.</para>
+      </note>
+      </section>
+
+      <section id="dhcp4-interface-selection">
+      <title>Interface selection</title>
+      <para>
+        When DHCPv4 server starts up, by default it will listen to the DHCP
+        traffic and respond to it on all interfaces detected during startup.
+        However, in many cases it is desired to configure the server to listen and
+        respond on selected interfaces only. The sample commands in this section
+        show how to make interface selection using bindctl.
+      </para>
+      <para>
+        The default configuration can be presented with the following command:
+        <screen>
+&gt; <userinput>config show Dhcp4/interfaces</userinput>
+<userinput>Dhcp4/interfaces[0] "*" string</userinput></screen>
+        An asterisk sign plays a role of the wildcard and means "listen on all interfaces".
+      </para>
+      <para>
+        In order to override the default configuration, the existing entry can be replaced
+        with the actual interface name:
+        <screen>
+&gt; <userinput>config set Dhcp4/interfaces[0] eth1</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Other interface names can be added on one-by-one basis:
+        <screen>
+&gt; <userinput>config add Dhcp4/interfaces eth2</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Configuration will now contain two interfaces which can be presented as follows:
+        <screen>
+&gt; <userinput>config show Dhcp4/interfaces</userinput>
+<userinput>Dhcp4/interfaces[0] "eth1"  string</userinput>
+<userinput>Dhcp4/interfaces[1] "eth2"  string</userinput></screen>
+        When configuration gets committed, the server will start to listen on
+        eth1 and eth2 interfaces only.
+      </para>
+      <para>
+        It is possible to use wildcard interface name (asterisk) concurrently with explicit
+        interface names:
+        <screen>
+&gt; <userinput>config add Dhcp4/interfaces *</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        This will result in the following configuration:
+        <screen>
+&gt; <userinput>config show Dhcp4/interfaces</userinput>
+<userinput>Dhcp4/interfaces[0] "eth1"  string</userinput>
+<userinput>Dhcp4/interfaces[1] "eth2"  string</userinput>
+<userinput>Dhcp4/interfaces[2] "*"     string</userinput></screen>
+        The presence of the wildcard name implies that server will listen on all interfaces.
+        In order to fall back to the previous configuration when server listens on eth1 and eth2:
+        <screen>
+&gt; <userinput>config remove Dhcp4/interfaces[2]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+      </section>
+
+      <section id="ipv4-subnet-id">
+      <title>IPv4 Subnet Identifier</title>
+      <para>
+        Subnet identifier is a unique number associated with a particular subnet.
+        In principle, it is used to associate clients' leases with respective subnets.
+        When subnet identifier is not specified for a subnet being configured, it will
+        be automatically assigned by the configuration mechanism. The identifiers
+        are assigned from 1 and are monotonically increased for each subsequent
+        subnet: 1, 2, 3 ....
+      </para>
+      <para>
+       If there are multiple subnets configured with auto-generated identifiers and
+       one of them is removed, the subnet identifiers may be renumbered. For example:
+       if there are 4 subnets and 3rd is removed the last subnet will be assigned
+       identifier that the 3rd subnet had before removal. As a result, the leases
+       stored in the lease database for subnet 3 are now associated with the
+       subnet 4, which may have unexpected consequences. In the future it is planned
+       to implement the mechanism to preserve auto-generated subnet ids upon removal
+       of one of the subnets. Currently, the only remedy for this issue is to
+       manually specify the unique subnet identifier for each subnet.
+      </para>
+      <para>
+        The following configuration:
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/id 1024</userinput>
+&gt; <userinput>config commit</userinput>
+        </screen>
+        will assign the arbitrary subnet identifier to the newly configured subnet.
+        This identifier will not change for this subnet until "id" parameter is
+        removed or set to 0. The value of 0 forces auto-generation of subnet
+        identifier.
+      </para>
+      </section>
+
+      <section id="dhcp4-address-config">
+      <title>Configuration of IPv4 Address Pools</title>
+      <para>
+        The essential role of DHCPv4 server is address assignment. The server
+        has to be configured with at least one subnet and one pool of dynamic
+        addresses to be managed. For example, assume that the server
+        is connected to a network segment that uses the 192.0.2.0/24
+        prefix. The Administrator of that network has decided that addresses from range
+        192.0.2.10 to 192.0.2.20 are going to be managed by the Dhcp4
+        server. Such a configuration can be achieved in the following way:
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Note that subnet is defined as a simple string, but the pool parameter
+        is actually a list of pools: for this reason, the pool definition is
+        enclosed in square brackets, even though only one range of addresses
+        is specified.</para>
+        <para>It is possible to define more than one pool in a
+        subnet: continuing the previous example, further assume that
+        192.0.2.64/26 should be also be managed by the server. It could be written as
+        192.0.2.64 to 192.0.2.127. Alternatively, it can be expressed more simply as
+        192.0.2.64/26. Both formats are supported by Dhcp4 and can be mixed in the pool list.
+        For example, one could define the following pools:
+        <screen>
+&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10-192.0.2.20", "192.0.2.64/26" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        The number of pools is not limited, but for performance reasons it is recommended to
+        use as few as possible. Space and tabulations in pool definitions are ignored, so
+        spaces before and after hyphen are optional. They can be used to improve readability.
+      </para>
+      <para>
+         The server may be configured to serve more than one subnet. To add a second subnet,
+         use a command similar to the following:
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[1]/subnet "192.0.3.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[1]/pool [ "192.0.3.0/24" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Arrays are counted from 0. subnet[0] refers to the subnet defined in the
+        previous example.  The <command>config add Dhcp4/subnet4</command> command adds
+        another (second) subnet. It can be referred to as
+        <command>Dhcp4/subnet4[1]</command>. In this example, we allow server to
+        dynamically assign all addresses available in the whole subnet.
+      </para>
+      <para>
+        When configuring a DHCPv4 server using prefix/length notation, please pay
+        attention to the boundary values. When specifying that the server should use
+        a given pool, it will be able to allocate also first (typically network
+        address) and the last (typically broadcast address) address from that pool.
+        In the aforementioned example of pool 192.0.3.0/24, both 192.0.3.0 and
+        192.0.3.255 addresses may be assigned as well. This may be invalid in some
+        network configurations. If you want to avoid this, please use the "min-max" notation.
+      </para>
+      </section>
+
+    <section id="dhcp4-std-options">
+      <title>Standard DHCPv4 options</title>
+      <para>
+        One of the major features of DHCPv4 server is to provide configuration
+        options to clients. Although there are several options that require
+        special behavior, most options are sent by the server only if the client
+        explicitly requested them.  The following example shows how to
+        configure DNS servers, which is one of the most frequently used
+        options. Options specified in this way are considered global and apply
+        to all configured subnets.
+
+        <screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "domain-name-servers"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 6</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.3.1, 192.0.3.2"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+    <para>
+      The first line creates new entry in option-data table. It
+      contains information on all global options that the server is
+      supposed to configure in all subnets. The second line specifies
+      option name. For a complete list of currently supported names,
+      see <xref linkend="dhcp4-std-options-list"/> below.
+      The third line specifies option code, which must match one of the
+      values from that list. Line 4 specifies option space, which must always
+      be set to "dhcp4" as these are standard DHCPv4 options. For
+      other option spaces, including custom option spaces, see <xref
+      linkend="dhcp4-option-spaces"/>. The fifth line specifies the format in
+      which the data will be entered: use of CSV (comma
+      separated values) is recommended. The sixth line gives the actual value to
+      be sent to clients. Data is specified as a normal text, with
+      values separated by commas if more than one value is
+      allowed.
+    </para>
+
+    <para>
+      Options can also be configured as hexadecimal values. If csv-format is
+      set to false, option data must be specified as a hex string. The
+      following commands configure the domain-name-servers option for all
+      subnets with the following addresses: 192.0.3.1 and 192.0.3.2.
+      Note that csv-format is set to false.
+      <screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "domain-name-servers"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 6</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format false</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "C0 00 03 01 C0 00 03 02"</userinput>
+&gt; <userinput>config commit</userinput>
+        </screen>
+      </para>
+
+      <para>
+        It is possible to override options on a per-subnet basis.  If
+        clients connected to most of your subnets are expected to get the
+        same values of a given option, you should use global options: you
+        can then override specific values for a small number of subnets.
+        On the other hand, if you use different values in each subnet,
+        it does not make sense to specify global option values
+        (Dhcp4/option-data), rather you should set only subnet-specific values
+        (Dhcp4/subnet[X]/option-data[Y]).
+      </para>
+      <para>
+        The following commands override the global
+        DNS servers option for a particular subnet, setting a single DNS
+        server with address 192.0.2.3.
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4[0]/option-data</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/name "domain-name-servers"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/code 6</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/data "192.0.2.3"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <note>
+        <para>In a future version of Kea, it will not be necessary to specify
+        the option code, space and csv-format fields as they will be set
+        automatically.</para>
+      </note>
+
+      <para>
+        The currently supported standard DHCPv4 options are
+        listed in <xref linkend="dhcp4-std-options-list"/>
+        and <xref linkend="dhcp4-std-options-list-part2"/>.
+        The "Name" and "Code"
+        are the values that should be used as a name in the option-data
+        structures. "Type" designates the format of the data: the meanings of
+        the various types is given in <xref linkend="dhcp-types"/>.
+      </para>
+      <para>
+        Some options are designated as arrays, which means that more than one
+        value is allowed in such an option. For example the option time-servers
+        allows the specification of more than one IPv4 address, so allowing
+        clients to obtain the the addresses of multiple NTP servers.
+      </para>
+      <!-- @todo: describe record types -->
+
+      <para>
+        The <xref linkend="dhcp4-custom-options"/> describes the configuration
+        syntax to create custom option definitions (formats). It is generally not
+        allowed to create custom definitions for standard options, even if the
+        definition being created matches the actual option format defined in the
+        RFCs. There is an exception from this rule for standard options for which
+        Kea does not provide a definition yet. In order to use such options,
+        a server administrator must create a definition as described in
+        <xref linkend="dhcp4-custom-options"/> in the 'dhcp4' option space. This
+        definition should match the option format described in the relevant
+        RFC but configuration mechanism would allow any option format as it has
+        no means to validate it at the moment.
+      </para>
+
+      <para>
+        <table frame="all" id="dhcp4-std-options-list">
+          <title>List of standard DHCPv4 options</title>
+          <tgroup cols='4'>
+          <colspec colname='name'/>
+          <colspec colname='code'/>
+          <colspec colname='type'/>
+          <colspec colname='array'/>
+          <thead>
+            <row>
+              <entry>Name</entry>
+              <entry>Code</entry>
+              <entry>Type</entry>
+              <entry>Array?</entry>
+            </row>
+          </thead>
+          <tbody>
+<row><entry>subnet-mask</entry><entry>1</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>time-offset</entry><entry>2</entry><entry>int32</entry><entry>false</entry></row>
+<row><entry>routers</entry><entry>3</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>time-servers</entry><entry>4</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>name-servers</entry><entry>5</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>domain-name-servers</entry><entry>6</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>log-servers</entry><entry>7</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>cookie-servers</entry><entry>8</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>lpr-servers</entry><entry>9</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>impress-servers</entry><entry>10</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>resource-location-servers</entry><entry>11</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>host-name</entry><entry>12</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>boot-size</entry><entry>13</entry><entry>uint16</entry><entry>false</entry></row>
+<row><entry>merit-dump</entry><entry>14</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>domain-name</entry><entry>15</entry><entry>fqdn</entry><entry>false</entry></row>
+<row><entry>swap-server</entry><entry>16</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>root-path</entry><entry>17</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>extensions-path</entry><entry>18</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>ip-forwarding</entry><entry>19</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>non-local-source-routing</entry><entry>20</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>policy-filter</entry><entry>21</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>max-dgram-reassembly</entry><entry>22</entry><entry>uint16</entry><entry>false</entry></row>
+<row><entry>default-ip-ttl</entry><entry>23</entry><entry>uint8</entry><entry>false</entry></row>
+<row><entry>path-mtu-aging-timeout</entry><entry>24</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>path-mtu-plateau-table</entry><entry>25</entry><entry>uint16</entry><entry>true</entry></row>
+<row><entry>interface-mtu</entry><entry>26</entry><entry>uint16</entry><entry>false</entry></row>
+<row><entry>all-subnets-local</entry><entry>27</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>broadcast-address</entry><entry>28</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>perform-mask-discovery</entry><entry>29</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>mask-supplier</entry><entry>30</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>router-discovery</entry><entry>31</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>router-solicitation-address</entry><entry>32</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>static-routes</entry><entry>33</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>trailer-encapsulation</entry><entry>34</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>arp-cache-timeout</entry><entry>35</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>ieee802-3-encapsulation</entry><entry>36</entry><entry>boolean</entry><entry>false</entry></row>
+<row><entry>default-tcp-ttl</entry><entry>37</entry><entry>uint8</entry><entry>false</entry></row>
+<row><entry>tcp-keepalive-internal</entry><entry>38</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>tcp-keepalive-garbage</entry><entry>39</entry><entry>boolean</entry><entry>false</entry></row>
+
+          </tbody>
+          </tgroup>
+        </table>
+      </para>
+
+      <para>
+        <table frame="all" id="dhcp4-std-options-list-part2">
+          <title>List of standard DHCPv4 options (continued)</title>
+          <tgroup cols='4'>
+          <colspec colname='name'/>
+          <colspec colname='code'/>
+          <colspec colname='type'/>
+          <colspec colname='array'/>
+          <thead>
+            <row>
+              <entry>Name</entry>
+              <entry>Code</entry>
+              <entry>Type</entry>
+              <entry>Array?</entry>
+            </row>
+          </thead>
+          <tbody>
+
+<row><entry>nis-domain</entry><entry>40</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>nis-servers</entry><entry>41</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>ntp-servers</entry><entry>42</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>vendor-encapsulated-options</entry><entry>43</entry><entry>empty</entry><entry>false</entry></row>
+<row><entry>netbios-name-servers</entry><entry>44</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>netbios-dd-server</entry><entry>45</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>netbios-node-type</entry><entry>46</entry><entry>uint8</entry><entry>false</entry></row>
+<row><entry>netbios-scope</entry><entry>47</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>font-servers</entry><entry>48</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>x-display-manager</entry><entry>49</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>dhcp-requested-address</entry><entry>50</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<!-- Lease time should not be configured by a user.
+<row><entry>dhcp-lease-time</entry><entry>51</entry><entry>uint32</entry><entry>false</entry></row>
+-->
+<row><entry>dhcp-option-overload</entry><entry>52</entry><entry>uint8</entry><entry>false</entry></row>
+<!-- Message Type, Server Identifier and Parameter Request List should not be configured by a user.
+<row><entry>dhcp-message-type</entry><entry>53</entry><entry>uint8</entry><entry>false</entry></row>
+<row><entry>dhcp-server-identifier</entry><entry>54</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>dhcp-parameter-request-list</entry><entry>55</entry><entry>uint8</entry><entry>true</entry></row>
+-->
+<row><entry>dhcp-message</entry><entry>56</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>dhcp-max-message-size</entry><entry>57</entry><entry>uint16</entry><entry>false</entry></row>
+<!-- Renewal and rebinding time should not be configured by a user.
+<row><entry>dhcp-renewal-time</entry><entry>58</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>dhcp-rebinding-time</entry><entry>59</entry><entry>uint32</entry><entry>false</entry></row>
+-->
+<row><entry>vendor-class-identifier</entry><entry>60</entry><entry>binary</entry><entry>false</entry></row>
+<!-- Client identifier should not be configured by a user.
+<row><entry>dhcp-client-identifier</entry><entry>61</entry><entry>binary</entry><entry>false</entry></row>
+-->
+<row><entry>nwip-domain-name</entry><entry>62</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>nwip-suboptions</entry><entry>63</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>tftp-server-name</entry><entry>66</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>boot-file-name</entry><entry>67</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>user-class</entry><entry>77</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>fqdn</entry><entry>81</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>dhcp-agent-options</entry><entry>82</entry><entry>empty</entry><entry>false</entry></row>
+<row><entry>authenticate</entry><entry>90</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>client-last-transaction-time</entry><entry>91</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>associated-ip</entry><entry>92</entry><entry>ipv4-address</entry><entry>true</entry></row>
+<row><entry>subnet-selection</entry><entry>118</entry><entry>ipv4-address</entry><entry>false</entry></row>
+<row><entry>domain-search</entry><entry>119</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>vivco-suboptions</entry><entry>124</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>vivso-suboptions</entry><entry>125</entry><entry>binary</entry><entry>false</entry></row>
+          </tbody>
+          </tgroup>
+        </table>
+
+      </para>
+      <para>
+        <table frame="all" id="dhcp-types">
+          <title>List of standard DHCP option types</title>
+          <tgroup cols='2'>
+          <colspec colname='name'/>
+          <colspec colname='meaning'/>
+          <thead>
+            <row><entry>Name</entry><entry>Meaning</entry></row>
+          </thead>
+          <tbody>
+            <row><entry>binary</entry><entry>An arbitrary string of bytes, specified as a set of hexadecimal digits.</entry></row>
+            <row><entry>boolean</entry><entry>Boolean value with allowed values true or false</entry></row>
+            <row><entry>empty</entry><entry>No value, data is carried in suboptions</entry></row>
+            <row><entry>fqdn</entry><entry>Fully qualified domain name (e.g. www.example.com)</entry></row>
+            <row><entry>ipv4-address</entry><entry>IPv4 address in the usual dotted-decimal notation (e.g. 192.0.2.1)</entry></row>
+            <row><entry>ipv6-address</entry><entry>IPv6 address in the usual colon notation (e.g. 2001:db8::1)</entry></row>
+            <row><entry>record</entry><entry>Structured data that may comprise any types (except "record" and "empty")</entry></row>
+            <row><entry>string</entry><entry>Any text</entry></row>
+            <row><entry>uint8</entry><entry>8 bit unsigned integer with allowed values 0 to 255</entry></row>
+            <row><entry>uint16</entry><entry>16 bit unsinged integer with allowed values 0 to 65535</entry></row>
+            <row><entry>uint32</entry><entry>32 bit unsigned integer with allowed values 0 to 4294967295</entry></row>
+          </tbody>
+          </tgroup>
+       </table>
+      </para>
+    </section>
+
+    <section id="dhcp4-custom-options">
+      <title>Custom DHCPv4 options</title>
+      <para>It is also possible to define options other than the standard ones.
+      Assume that we want to define a new DHCPv4 option called "foo" which will have
+      code 222 and will convey a single unsigned 32 bit integer value. We can define
+      such an option by using the following commands:
+      <screen>
+&gt; <userinput>config add Dhcp4/option-def</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/code 222</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/type "uint32"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      The "false" value of the "array" parameter determines that the option
+      does NOT comprise an array of "uint32" values but rather a single value.
+      Two other parameters have been left blank: "record-types" and "encapsulate".
+      The former specifies the comma separated list of option data fields if the
+      option comprises a record of data fields. The "record-fields" value should
+      be non-empty if the "type" is set to "record". Otherwise it must be left
+      blank. The latter parameter specifies the name of the option space being
+      encapsulated by the particular option. If the particular option does not
+      encapsulate any option space it should be left blank.
+      Note that the above set of comments define the format of the new option and do not
+      set its values.
+      </para>
+      <note>
+        <para>
+          In the current release the default values are not propagated to the
+          parser when the new configuration is being set. Therefore, all
+          parameters must be specified at all times, even if their values are
+          left blank.
+        </para>
+      </note>
+
+      <para>Once the new option format is defined, its value is set
+      in the same way as for a standard option. For example the following
+      commands set a global value that applies to all subnets.
+        <screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 222</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "12345"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <para>New options can take more complex forms than simple use of
+      primitives (uint8, string, ipv4-address etc): it is possible to
+      define an option comprising a number of existing primitives.
+      </para>
+      <para>Assume we want to define a new option that will consist of
+      an IPv4 address, followed by unsigned 16 bit integer, followed by
+      a boolean value, followed by a text string. Such an option could
+      be defined in the following way:
+<screen>
+&gt; <userinput>config add Dhcp4/option-def</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/name "bar"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/code 223</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/type "record"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/record-types "ipv4-address, uint16, boolean, string"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
+</screen>
+      The "type" is set to "record" to indicate that the option contains
+      multiple values of different types.  These types are given as a comma-separated
+      list in the "record-types" field and should be those listed in <xref linkend="dhcp-types"/>.
+      </para>
+      <para>
+      The values of the option are set as follows:
+<screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "bar"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 223</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.100, 123, true, Hello World"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      "csv-format" is set "true" to indicate that the "data" field comprises a command-separated
+      list of values.  The values in the "data" must correspond to the types set in
+      the "record-types" field of the option definition.
+     </para>
+     <note>
+       <para>
+         It is recommended that boolean values are specified using "true" and "false"
+         strings. This helps to prevent errors when typing multiple comma separated
+         values, as it make it easier to identify the type of the value being typed,
+         and compare it with the order of data fields. Nevertheless, it is possible
+         to use integer values: "1" and "0", instead of "true" and "false"
+         accordingly. If other integer value is specified, the configuration is
+         rejected.
+       </para>
+     </note>
+    </section>
+
+    <section id="dhcp4-vendor-opts">
+      <title>DHCPv4 vendor specific options</title>
+      <para>
+      Currently there are three option spaces defined: dhcp4 (to
+      be used in DHCPv4 daemon) and dhcp6 (for the DHCPv6 daemon); there
+      is also vendor-encapsulated-options-space, which is empty by default, but options
+      can be defined in it. Those options are called vendor-specific
+      information options. The following examples show how to define
+      an option "foo" with code 1 that consists of an IPv4 address, an
+      unsigned 16 bit integer and a string. The "foo" option is conveyed
+      in a vendor specific information option.
+      </para>
+      <para>
+      The first step is to define the format of the option:
+<screen>
+&gt; <userinput>config add Dhcp4/option-def</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/space "vendor-encapsulated-options-space"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/type "record"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/record-types "ipv4-address, uint16, string"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/encapsulates ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+     (Note that the option space is set to "vendor-encapsulated-options-space".)
+     Once the option format is defined, the next step is to define actual values
+     for that option:
+     <screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "vendor-encapsulated-options-space"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.3, 123, Hello World"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+    We also set up a dummy value for vendor-opts, the option that conveys our sub-option "foo".
+    This is required else the option will not be included in messages sent to the client.
+     <screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/name "vendor-encapsulated-options"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/code 43</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/csv-format false</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/data ""</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <note>
+        <para>
+          With this version of Kea, the "vendor-encapsulated-options" option
+          must be specified in the configuration although it has no configurable
+          parameters. If it is not specified, the server will assume that it is
+          not configured and will not send it to a client. In the future there
+          will be no need to include this option in the configuration.
+        </para>
+      </note>
+
+    </section>
+
+    <section id="dhcp4-option-spaces">
+
+      <title>Nested DHCPv4 options (custom option spaces)</title>
+      <para>It is sometimes useful to define completely new option
+      space. This is the case when user creates new option in the
+      standard option space ("dhcp4 or "dhcp6") and wants this option
+      to convey sub-options. Thanks to being in the separate space,
+      sub-option codes will have a separate numbering scheme and may
+      overlap with codes of standard options.
+      </para>
+      <para>Note that creation of a new option space when defining
+      sub-options for a standard option is not required, because it is
+      created by default if the standard option is meant to convey any
+      sub-options (see <xref linkend="dhcp4-vendor-opts"/>).
+      </para>
+      <para>
+      Assume that we want to have a DHCPv4 option called "container" with
+      code 222 that conveys two sub-options with codes 1 and 2.
+      First we need to define the new sub-options:
+<screen>
+&gt; <userinput>config add Dhcp4/option-def</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/name "subopt1"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/type "ipv4-address"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput>
+
+&gt; <userinput>config add Dhcp4/option-def</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/name "subopt2"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/code 2</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/type "string"</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/array false</userinput>
+&gt; <userinput>config set Dhcp4/option-def[1]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+    Note that we have defined the options to belong to a new option space
+    (in this case, "isc").
+    </para>
+    <para>
+    The next step is to define a regular DHCPv4 option with our desired
+    code and specify that it should include options from the new option space:
+<screen>
+&gt; <userinput>add Dhcp4/option-def</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/name "container"</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/code 222</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/space "dhcp4"</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/type "empty"</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/array false</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/record-types ""</userinput>
+&gt; <userinput>set Dhcp4/option-def[2]/encapsulate "isc"</userinput>
+&gt; <userinput>commit</userinput>
+</screen>
+    The name of the option space in which the sub-options are defined
+    is set in the "encapsulate" field. The "type" field is set to "empty"
+    to indicate that this option does not carry any data other than
+    sub-options.
+    </para>
+    <para>
+    Finally, we can set values for the new options:
+<screen>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/name "subopt1"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.3"</userinput>
+&gt; <userinput>config commit</userinput>
+<userinput></userinput>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/name "subopt2"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/code 2</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[1]/data "Hello world"</userinput>
+&gt; <userinput>config commit</userinput>
+<userinput></userinput>
+&gt; <userinput>config add Dhcp4/option-data</userinput>
+&gt; <userinput>config set Dhcp4/option-data[2]/name "container"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[2]/space "dhcp4"</userinput>
+&gt; <userinput>config set Dhcp4/option-data[2]/code 222</userinput>
+&gt; <userinput>config set Dhcp4/option-data[2]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp4/option-data[2]/data ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+    Even though the "container" option does not carry any data except
+    sub-options, the "data" field must be explicitly set to an empty value.
+    This is required because in the current version of BIND 10 DHCP, the
+    default configuration values are not propagated to the configuration parsers:
+    if the "data" is not set the parser will assume that this
+    parameter is not specified and an error will be reported.
+    </para>
+    <para>Note that it is possible to create an option which carries some data
+    in addition to the sub-options defined in the encapsulated option space.  For example,
+    if the "container" option from the previous example was required to carry an uint16
+    value as well as the sub-options, the "type" value would have to be set to "uint16" in
+    the option definition. (Such an option would then have the following
+    data structure: DHCP header, uint16 value, sub-options.) The value specified
+    with the "data" parameter - which should be a valid integer enclosed in quotes,
+    e.g. "123" - would then be assigned to the uint16 field in the "container" option.
+    </para>
+    </section>
+
+    <section id="dhcp4-client-classifier">
+      <title>Client Classification in DHCPv4</title>
+      <note>
+      <para>
+        DHCPv4 server has been extended to support limited client classification.
+        Although the current capability is modest, it is expected to be expanded
+        in the future. It is envisaged that the majority of client classification
+        extensions will be using hooks extensions.
+      </para>
+      </note>
+      <para>In certain cases it is useful to differentiate between different
+      types of clients and treat them differently. The process of doing
+      classification is conducted in two steps. The first step is to assess
+      incoming packet and assign it to zero or more classes. This classification
+      is currently simple, but is expected to grow in capability soon. Currently
+      the server checks whether incoming packet has vendor class identifier
+      option (60). If it has, content of that option is prepended with
+      &quot;VENDOR_CLASS_&quot; then is interpreted as a class. For example,
+      modern cable modems will send this option with value &quot;docsis3.0&quot;
+      and as a result the packet will belong to class &quot;VENDOR_CLASS_docsis3.0&quot;.
+      </para>
+
+      <para>It is envisaged that the client classification will be used for changing
+      behavior of almost any part of the DHCP message processing, including assigning
+      leases from different pools, assigning different option (or different values of
+      the same options) etc. For now, there are only two mechanisms that are taking
+      advantage of client classification: specific processing for cable modems and
+      subnet selection.</para>
+
+      <para>
+        For clients that belong to the VENDOR_CLASS_docsis3.0 class, the siaddr
+        field is set to the value of next-server (if specified in a subnet). If
+        there is boot-file-name option specified, its value is also set in the
+        file field in the DHCPv4 packet. For eRouter1.0 class, the siaddr is
+        always set to 0.0.0.0. That capability is expected to be moved to
+        external hook library that will be dedicated to cable modems.
+      </para>
+
+      <para>
+        Kea can be instructed to limit access to given subnets based on class information.
+        This is particularly useful for cases where two types of devices share the
+        same link and are expected to be served from two different subnets. The
+        primary use case for such a scenario is cable networks. There are two
+        classes of devices: cable modem itself, which should be handled a lease
+        from subnet A and all other devices behind modems that should get a lease
+        from subnet B. That segregation is essential to prevent overly curious
+        users from playing with their cable modems. For details on how to set up
+        class restrictions on subnets, see <xref linkend="dhcp4-subnet-class"/>.
+      </para>
+
+    </section>
+
+    <section id="dhcp4-subnet-class">
+      <title>Limiting access to IPv4 subnet to certain classes</title>
+      <para>
+        In certain cases it beneficial to restrict access to certain subnets
+        only to clients that belong to a given subnet. For details on client
+        classes, see <xref linkend="dhcp4-client-classifier"/>. This is an
+        extension of a previous example from <xref linkend="dhcp4-address-config"/>.
+        Let's assume that the server is connected to a network segment that uses
+        the 192.0.2.0/24 prefix. The Administrator of that network has decided
+        that addresses from range 192.0.2.10 to 192.0.2.20 are going to be
+        managed by the Dhcp4 server. Only clients belonging to client class
+        VENDOR_CLASS_docsis3.0 are allowed to use this subnet. Such a
+        configuration can be achieved in the following way:
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/client-class "VENDOR_CLASS_docsis3.0"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <para>
+        Care should be taken with client classification as it is easy to prevent
+        clients that do not meet class criteria to be denied any service altogether.
+      </para>
+    </section>
+    <section id="dhcp4-ddns-config">
+      <title>Configuring DHCPv4 for DDNS</title>
+      <para>
+      As mentioned earlier, b10-dhcp4 can be configured to generate requests to the
+      DHCP-DDNS server to update DNS entries.  These requests are known as
+      NameChangeRequests or NCRs.  Each NCR contains the following information:
+      <orderedlist>
+      <listitem><para>
+      Whether it is a request to add (update) or remove DNS entries
+      </para></listitem>
+      <listitem><para>
+      Whether the change requests forward DNS updates (A records), reverse
+      DNS updates (PTR records), or both.
+      </para></listitem>
+      <listitem><para>
+      The FQDN, lease address, and DHCID
+      </para></listitem>
+      </orderedlist>
+      The parameters for controlling the generation of NCRs for submission to D2
+      are contained in the "dhcp-ddns" section of the b10-dhcp4 server
+      configuration. The default values for this section appears as follows:
+<screen>
+&gt; <userinput>config show Dhcp4/dhcp-ddns</userinput>
+Dhcp4/dhcp-ddns/enable-updates true    boolean
+Dhcp4/dhcp-ddns/server-ip      "127.0.0.1"     string
+Dhcp4/dhcp-ddns/server-port    53001   integer
+Dhcp4/dhcp-ddns/sender-ip      ""      string
+Dhcp4/dhcp-ddns/sender-port    0       integer
+Dhcp4/dhcp-ddns/max-queue-size 1024    integer
+Dhcp4/dhcp-ddns/ncr-protocol   "UDP"   string
+Dhcp4/dhcp-ddns/ncr-format     "JSON"  string
+Dhcp4/dhcp-ddns/override-no-update     false   boolean
+Dhcp4/dhcp-ddns/override-client-update false   boolean
+Dhcp4/dhcp-ddns/replace-client-name    false   boolean
+Dhcp4/dhcp-ddns/generated-prefix       "myhost"        string
+Dhcp4/dhcp-ddns/qualifying-suffix      "example.com"   string
+</screen>
+      </para>
+      <para>
+      The "enable-updates" parameter determines whether or not b10-dhcp4 will
+      generate NCRs.  By default, this value is false hence DDNS updates are
+      disabled.  To enable DDNS updates set this value to true:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/enable-updates true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <section id="dhcpv4-d2-io-config">
+      <title>DHCP-DDNS Server Connectivity</title>
+      <para>
+      In order for NCRs to reach the D2 server, b10-dhcp4 must be able
+      to communicate with it.  b10-dhcp4 uses the following configuration
+      parameters to control how it communications with D2:
+      <orderedlist>
+      <listitem><para>
+      server-ip - IP address on which D2 listens for requests. The default is
+      the local loopback interface at address 127.0.0.1. You may specify
+      either an IPv4 or IPv6 address.
+      </para></listitem>
+      <listitem><para>
+      server-port - port on which D2 listens for requests.  The default value
+      is 53001.
+      </para></listitem>
+      <listitem><para>
+      sender-ip - IP address which b10-dhcp4 should use to send requests to D2.
+      The default value is blank which instructs b10-dhcp4 to select a suitable
+      address.
+      </para></listitem>
+      <listitem><para>
+      sender-port - port which b10-dhcp4 should use to send requests to D2. The
+      default value of 0 instructs b10-dhcp4 to select suitable port.
+      </para></listitem>
+      <listitem><para>
+      ncr-format - Socket protocol use when sending requests to D2.  Currently
+      only UDP is supported.  TCP may be available in an upcoming release.
+      </para></listitem>
+      <listitem><para>
+      ncr-protocol - Packet format to use when sending requests to D2.
+      Currently only JSON format is supported.  Other formats may be available
+      in future releases.
+      </para></listitem>
+      <listitem><para>
+      max-queue-size - maximum number of requests allowed to queue waiting to
+      be sent to D2. This value guards against requests accumulating
+      uncontrollably if they are being generated faster than they can be
+      delivered.  If the number of requests queued for transmission reaches
+      this value, DDNS updating will be turned off until the queue backlog has
+      been sufficiently reduced.  The intent is allow the b10-dhcp4 server to
+      continue lease operations.  The default value is 1024.
+      </para></listitem>
+      </orderedlist>
+      By default, D2 is assumed to running on the same machine as b10-dhcp4, and
+      all of the default values mentioned above should be sufficient.
+      If, however, D2 has been configured to listen on a different address or
+      port, these values must altered accordingly. For example, if D2 has been
+      configured to listen on 198.162.1.10 port 900, the following commands
+      would be required:
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/server-ip "198.162.1.10"</userinput>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/server-port 900</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      </section>
+      <section id="dhcpv4-d2-rules-config">
+      <title>When does the b10-dhcp4 server generate DDNS requests?</title>
+      b10-dhcp4 follows the behavior prescribed for DHCP servers in RFC 4702.
+      It is important to keep in mind that b10-dhcp4 provides the initial decision
+      making of when and what to update and forwards that information to D2 in
+      the form of NCRs. Carrying out the actual DNS updates and dealing with
+      such things as conflict resolution are the purview of D2 (<xref linkend="dhcp-ddns-server"/>).
+      <para>
+      This section describes when b10-dhcp4 will generate NCRs and the
+      configuration parameters that can be used to influence this decision.
+      It assumes that the "enable-updates" parameter is true.
+      </para>
+      <para>
+      In general, b10-dhcp4 will generate DDNS update requests when:
+      <orderedlist>
+      <listitem><para>
+      A new lease is granted in response to a DHCP REQUEST
+      </para></listitem>
+      <listitem><para>
+      An existing lease is renewed but the FQDN associated with it has
+      changed.
+      </para></listitem>
+      <listitem><para>
+      An existing lease is released in response to a DHCP RELEASE
+      </para></listitem>
+      </orderedlist>
+      In the second case, lease renewal, two  DDNS requests will be issued: one
+      request to remove entries for the previous FQDN and a second request to
+      add entries for the new FQDN.  In the last case, a lease release, a
+      single DDNS request to remove its entries will be made.  The decision
+      making involved when granting a new lease (the first case) is more
+      involved and is discussed next.
+      </para>
+      <para>
+      When a new lease is granted, b10-dhcp4 will generate a DDNS
+      update request if the DHCP REQUEST contains either the FQDN option
+      (code 81) or the Host Name option (code 12). If both are present,
+      the server will use the FQDN option. By default b10-dhcp4
+      will respect the FQDN N and S flags specified by the client as shown
+      in the following table:
+      </para>
+        <table id="fqdn-flag-table">
+          <title>Default FQDN Flag Behavior</title>
+          <tgroup cols='4' align='left'>
+          <colspec colname='cflags'/>
+          <colspec colname='meaning'/>
+          <colspec colname='response'/>
+          <colspec colname='sflags'/>
+          <thead>
+              <row>
+                <entry>Client Flags:N-S</entry>
+                <entry>Client Intent</entry>
+                <entry>Server Response</entry>
+                <entry>Server Flags:N-S-O</entry>
+              </row>
+          </thead>
+          <tbody>
+            <row>
+                <entry>0-0</entry>
+                <entry>
+                Client wants to do forward updates, server should do reverse updates
+                </entry>
+                <entry>Server generates reverse-only request</entry>
+                <entry>1-0-0</entry>
+            </row>
+            <row>
+                <entry>0-1</entry>
+                <entry>Server should do both forward and reverse updates</entry>
+                <entry>Server generates request to update both directions</entry>
+                <entry>0-1-0</entry>
+            </row>
+            <row>
+                <entry>1-0</entry>
+                <entry>Client wants no updates done</entry>
+                <entry>Server does not generate a request</entry>
+                <entry>1-0-0</entry>
+            </row>
+          </tbody>
+          </tgroup>
+        </table>
+      <para>
+      The first row in the table above represents "client delegation". Here
+      the DHCP client states that it intends to do the forward DNS updates and
+      the server should do the reverse updates.  By default, b10-dhcp4 will honor
+      the client's wishes and generate a DDNS request to D2 to update only
+      reverse DNS data.  The parameter, "override-client-update", can be used
+      to instruct the server to override client delegation requests.  When
+      this parameter is true, b10-dhcp4 will disregard requests for client
+      delegation and generate a DDNS request to update both forward and
+      reverse DNS data.  In this case, the N-S-O flags in the server's
+      response to the client will be 0-1-1 respectively.
+      </para>
+      <para>
+      (Note that the flag combination N=1, S=1 is prohibited according to
+      RFC 4702. If such a combination is received from the client, the packet
+      will be dropped by the b10-dhcp4.)
+      </para>
+      <para>
+      To override client delegation, issue the following commands:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/override-client-update true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The third row in the table above describes the case in which the client
+      requests that no DNS updates be done. The parameter, "override-no-update",
+      can be used to instruct the server to disregard the client's wishes. When
+      this parameter is true, b10-dhcp4 will generate DDNS update request to D2
+      even if the client requests no updates be done.  The N-S-O flags in the
+      server's response to the client will be 0-1-1.
+      </para>
+      <para>
+      To override client delegation, issue the following commands:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/override-no-update true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      b10-dhcp4 will always generate DDNS update requests if the client request
+      only contains the Host Name option. In addition it will include an FQDN
+      option in the response to the client with the FQDN N-S-O flags set to
+      0-1-0 respectively. The domain name portion of the FQDN option will be
+      the name submitted to D2 in the DDNS update request.
+      </para>
+      </section>
+      <section id="dhcpv4-fqdn-name-generation">
+      <title>b10-dhcp4 name generation for DDNS update requests</title>
+      Each NameChangeRequest must of course include the fully qualified domain
+      name whose DNS entries are to be affected.  b10-dhcp4 can be configured to
+      supply a portion or all of that name based upon what it receives from
+      the client in the DHCP REQUEST.
+      <para>
+      The rules for determining the FQDN option are as follows:
+      <orderedlist>
+      <listitem><para>
+      If configured to do, so ignore the REQUEST contents and generate a
+      FQDN using a configurable prefix and suffix.
+      </para></listitem>
+      <listitem><para>
+      If the REQUEST contains the client FQDN option, the candidate
+      name is taken from there, otherwise it is taken from the Host Name option.
+      The candiate name may then be modified:
+      <orderedlist>
+      <listitem><para>
+      If the candidate name is a fully qualified domain name, use it.
+      </para></listitem>
+      <listitem><para>
+      If the candidate name is a partial (i.e. unqualified) name then
+      add a configurable suffix to the name and use the result as the FQDN.
+      </para></listitem>
+      <listitem><para>
+      If the candidate name is a empty, generate a FQDN using a
+      configurable prefix and suffix.
+      </para></listitem>
+      </orderedlist>
+      </para></listitem>
+      </orderedlist>
+      To instruct b10-dhcp4 to always generate the FQDN for a client, set the
+      parameter "replace-client-name" to true as follows:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/replace-client-name true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The prefix used in the generation of a FQDN is specified by the
+      "generated-prefix" parameter.  The default value is "myhost".  To alter
+      its value simply set it to the desired string:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/generated-prefix "another.host"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The suffix used when generating a FQDN or when qualifying a partial
+      name is specified by the "qualifying-suffix" parameter.  The default
+      value is "example.com".  To alter its value simply set it to the desired
+      string:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp4/dhcp-ddns/generated-prefix "our.net"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </section>
+      <para>
+      When generating a name, b10-dhcp4 will construct name of the format:
+      </para>
+      <para>
+        [generated-prefix]-[address-text].[qualifying-suffix].
+      </para>
+      <para>
+      where address-text is simply the lease IP address converted to a
+      hyphenated string.  For example, if lease address is 172.16.1.10 and
+      assuming default values for generated-prefix and qualifying-suffix, the
+      generated FQDN would be:
+      </para>
+      <para>
+        myhost-172-16-1-10.example.com.
+      </para>
+    </section>
+
+  </section> <!-- end of configuring b10-dhcp4 server section with many subsections -->
+
+    <section id="dhcp4-serverid">
+      <title>Server Identifier in DHCPv4</title>
+      <para>
+        The DHCPv4 protocol uses a "server identifier" for clients to be able
+        to discriminate between several servers present on the same link: this
+        value is an IPv4 address of the server. The server chooses the IPv4 address
+        of the interface on which the message from the client (or relay) has been
+        received. A single server instance will use multiple server identifiers
+        if it is receiving queries on multiple interfaces.
+      </para>
+      <para>
+        Currently there is no mechanism to override the default server identifiers
+        by an administrator. In the future, the configuration mechanism will be used
+        to specify the custom server identifier.
+      </para>
+    </section>
+
+
+    <section id="dhcp4-next-server">
+      <title>Next server (siaddr)</title>
+      <para>In some cases, clients want to obtain configuration from the TFTP server.
+      Although there is a dedicated option for it, some devices may use siaddr field
+      in the DHCPv4 packet for that purpose. That specific field can be configured
+      using next-server directive. It is possible to define it in global scope or
+      for a given subnet only. If both are defined, subnet value takes precedence.
+      The value in subnet can be set to 0.0.0.0, which means that next-server should
+      not be sent. It may also be set to empty string, which means the same as if
+      it was not defined at all - use global value.
+      </para>
+
+<screen>
+&gt; <userinput>config add Dhcp4/next-server</userinput>
+&gt; <userinput>config set Dhcp4/next-server "192.0.2.123"</userinput>
+&gt; <userinput>config commit</userinput>
+<userinput></userinput>
+&gt; <userinput>config add Dhcp4/subnet[0]/next-server</userinput>
+&gt; <userinput>config set Dhcp4/subnet[0]/next-server "192.0.2.234"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+
+    </section>
+
+    <section id="dhcp4-echo-client-id">
+      <title>Echoing client-id (RFC6842)</title>
+      <para>Original DHCPv4 spec (RFC2131) states that the DHCPv4
+      server must not send back client-id options when responding to
+      clients. However, in some cases that confused clients that did
+      not have MAC address or client-id. See RFC6842 for details. That
+      behavior has changed with the publication of RFC6842 which
+      updated RFC2131. That update now states that the server must
+      send client-id if client sent it. That is the default behaviour
+      that Kea offers. However, in some cases older devices that do
+      not support RFC6842 may refuse to accept responses that include
+      client-id option. To enable backward compatibility, an optional
+      configuration parameter has been introduced. To configure it,
+      use the following commands:</para>
+
+<screen>
+&gt; <userinput>config add Dhcp4/echo-client-id</userinput>
+&gt; <userinput>config set Dhcp4/echo-client-id False</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+
+    </section>
+
+    <section id="dhcp4-subnet-selection">
+      <title>How DHCPv4 server selects subnet for a client</title>
+      <para>
+        The DHCPv4 server differentiates between the directly connected clients,
+        clients trying to renew leases and clients sending their messages through
+        relays. For the directly connected clients the server will check the
+        configuration of the interface on which the message has been received, and
+        if the server configuration doesn't match any configured subnet the
+        message is discarded.</para>
+        <para>Assuming that the server's interface is configured with the 192.0.2.3
+        IPv4 address, the server will only process messages received through
+        this interface from the directly connected client, if there is a subnet
+        configured, to which this IPv4 address belongs, e.g. 192.0.2.0/24.
+        The server will use this subnet to assign IPv4 address for the client.
+      </para>
+      <para>
+        The rule above does not apply when the client unicasts its message, i.e.
+        is trying to renew its lease. Such message is accepted through any
+        interface. The renewing client sets ciaddr to the currently used IPv4
+        address. The server uses this address to select the subnet for the client
+        (in particular, to extend the lease using this address).
+      </para>
+      <para>
+        If the message is relayed it is accepted through any interface. The giaddr
+        set by the relay agent is used to select the subnet for the client.
+      </para>
+      <para>
+       It is also possible to specify a relay IPv4 address for a given subnet. It
+       can be used to match incoming packets into a subnet in uncommon configurations,
+       e.g. shared subnets. See <xref linkend="dhcp4-relay-override"/> for details.
+      </para>
+      <note>
+        <para>The subnet selection mechanism described in this section is based
+        on the assumption that client classification is not used. The classification
+        mechanism alters the way in which subnet is selected for the client,
+        depending on the classes that the client belongs to.</para>
+      </note>
+    </section>
+
+    <section id="dhcp4-relay-override">
+      <title>Using specific relay agent for a subnet</title>
+      <para>
+        The relay has to have an interface connected to the link on which
+        the clients are being configured. Typically the relay has an IPv4
+        address configured on that interface that belongs to the subnet that
+        the server will assign addresses from. In such typical case, the
+        server is able to use IPv4 address inserted by the relay (in GIADDR
+        field of the DHCPv4 packet) to select appropriate subnet.
+      </para>
+      <para>
+        However, that is not always the case. In certain uncommon, but
+        valid deployments, the relay address may not match the subnet. This
+        usually means that there is more than one subnet allocated for a given
+        link. Two most common examples where this is the case are long lasting
+        network renumbering (where both old and new address space is still being
+        used) and a cable network. In a cable network both cable modems and the
+        devices behind them are physically connected to the same link, yet
+        they use distinct addressing. In such case, the DHCPv4 server needs
+        additional information (IPv4 address of the relay) to properly select
+        an appropriate subnet.
+      </para>
+      <para>
+        The following example assumes that there is a subnet 192.0.2.0/24
+        that is accessible via relay that uses 10.0.0.1 as its IPv4 address.
+        The server will be able to select this subnet for any incoming packets
+        that came from a relay that has an address in 192.0.2.0/24 subnet.
+        It will also select that subnet for a relay with address 10.0.0.1.
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/relay/ip-address "10.0.0.1"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+    </section>
+
+      <section id="dhcp4-srv-example-client-class-relay">
+        <title>Segregating IPv4 clients in a cable network</title>
+        <para>
+          In certain cases, it is useful to mix relay address information,
+          introduced in <xref linkend="dhcp4-relay-override"/> with client
+          classification, explained in <xref linkend="dhcp4-subnet-class"/>.
+          One specific example is cable network, where typically modems
+          get addresses from a different subnet than all devices connected
+          behind them.
+        </para>
+        <para>
+          Let's assume that there is one CMTS (Cable Modem Termination System)
+          with one CM MAC (a physical link that modems are connected to).
+          We want the modems to get addresses from the 10.1.1.0/24 subnet, while
+          everything connected behind modems should get addresses from another
+          subnet (192.0.2.0/24). The CMTS that acts as a relay an uses address
+          10.1.1.1. The following configuration can serve that configuration:
+        <screen>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "10.1.1.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "10.1.1.2 - 10.1.1.20" ]</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/client-class "docsis3.0"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[0]/relay/ip-address "10.1.1.1"</userinput>
+&gt; <userinput>config add Dhcp4/subnet4</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[1]/subnet "192.0.2.0/24"</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[1]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
+&gt; <userinput>config set Dhcp4/subnet4[1]/relay/ip-address "10.1.1.1"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+      </section>
+
+    <section id="dhcp4-std">
+      <title>Supported Standards</title>
+      <para>The following standards and draft standards are currently
+      supported:</para>
+      <itemizedlist>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc2131">RFC 2131</ulink>: Supported messages are DISCOVER, OFFER,
+            REQUEST, RELEASE, ACK, and NAK.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc2132">RFC 2132</ulink>:
+            Supported options are: PAD (0),
+            END(255), Message Type(53), DHCP Server Identifier (54),
+            Domain Name (15), DNS Servers (6), IP Address Lease Time
+            (51), Subnet mask (1), and Routers (3).</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc3046">RFC 3046</ulink>:
+            Relay Agent Information option is supported.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc3925">RFC 3925</ulink>:
+            Vendor-Identifying Vendor Class and Vendor-Identifying Vendor-Specific
+            Information option are supported.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc6842">RFC 6842</ulink>:
+            Server by default sends back client-id option. That capability may be
+            disabled. See <xref linkend="dhcp4-echo-client-id"/> for details.
+            </simpara>
+          </listitem>
+      </itemizedlist>
+    </section>
+
+    <section id="dhcp4-limit">
+      <title>DHCPv4 Server Limitations</title>
+      <para>These are the current limitations of the DHCPv4 server
+      software. Most of them are reflections of the current stage of
+      development and should be treated as <quote>not implemented
+      yet</quote>, rather than actual limitations.</para>
+      <itemizedlist>
+          <listitem> <!-- see tickets #3234, #3281 -->
+            <simpara>
+              Removal of a subnet during server reconfiguration may cause renumbering
+              of auto-generated subnet identifiers, as described in section
+              <xref linkend="ipv4-subnet-id"/>.
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              BOOTP (<ulink url="http://tools.ietf.org/html/rfc951">RFC 951</ulink>)
+              is not supported.
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>Raw sockets operation is working on Linux
+            only. See <xref linkend="iface-detect"/> for details.</simpara>
+          </listitem>
+          <listitem>
+            <simpara>The DHCPv4 server does not  verify that
+            assigned address is unused. According to <ulink url="http://tools.ietf.org/html/rfc2131">RFC 2131</ulink>, the
+            allocating server should verify that address is not used by
+            sending ICMP echo request.</simpara>
+          </listitem>
+          <listitem>
+            <simpara>Address duplication report (DECLINE) is not supported yet.</simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              The server doesn't act upon expired leases. In particular,
+              when a lease expires, the server doesn't request the removal
+              of the DNS records associated with it.
+            </simpara>
+          </listitem>
+      </itemizedlist>
+    </section>
+
+    <!--
+    <section id="dhcp4-srv-examples">
+      <title>Kea DHCPv4 server examples</title>
+
+      <para>
+        This section provides easy to use example. Each example can be read
+        separately. It is not intended to be read sequentially as there will
+        be many repetitions between examples. They are expected to serve as
+        easy to use copy-paste solutions to many common deployments.
+      </para>
+
+      @todo: add simple configuration for direct clients
+      @todo: add configuration for relayed clients
+      @todo: add client classification example
+
+    </section> -->
+
+  </chapter>
diff --git a/doc/guide/dhcp6-srv.xml b/doc/guide/dhcp6-srv.xml
new file mode 100644 (file)
index 0000000..6dae7b7
--- /dev/null
@@ -0,0 +1,1545 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+]>
+
+  <chapter id="dhcp6">
+    <title>The DHCPv6 Server</title>
+
+    <section id="dhcp6-start-stop">
+      <title>Starting and Stopping the DHCPv6 Server</title>
+
+      <para>
+        <command>b10-dhcp6</command> is the Kea DHCPv6 server and is configured
+        through the <command>bindctl</command> program.
+      </para>
+      <para>
+        After starting <command>bind10</command> and starting <command>bindctl</command>, the first step
+        in configuring the server is to add <command>b10-dhcp6</command> to the list of running services.
+<screen>
+&gt; <userinput>config add Init/components b10-dhcp6</userinput>
+&gt; <userinput>config set Init/components/b10-dhcp6/kind dispensable</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      <para>
+         To remove <command>b10-dhcp6</command> from the set of running services,
+         the <command>b10-dhcp6</command> is removed from list of Init components:
+<screen>
+&gt; <userinput>config remove Init/components b10-dhcp6</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+
+      <para>
+        Note that the server was only removed from the list, so BIND10 will not
+        restart it, but the server itself is still running. Hence it is usually
+        desired to stop it:
+<screen>
+&gt; <userinput>Dhcp6 shutdown</userinput>
+</screen>
+      </para>
+
+      <para>
+        During start-up the server will detect available network interfaces
+        and will attempt to open UDP sockets on all interfaces that
+        are up, running, are not loopback, are multicast-capable, and
+        have IPv6 address assigned. It will then listen to incoming traffic.
+      </para>
+
+
+    </section>
+
+    <section id="dhcp6-configuration">
+      <title>DHCPv6 Server Configuration</title>
+      <para>
+        Once the server has been started, it can be configured. To view the
+        current configuration, use the following command in <command>bindctl</command>:
+        <screen>&gt; <userinput>config show Dhcp6</userinput></screen>
+        When starting the Dhcp6 daemon for the first time, the default configuration
+        will be available. It will look similar to this:
+<screen>
+&gt; <userinput>config show Dhcp6</userinput>
+Dhcp6/hooks-libraries   []  list    (default)
+Dhcp6/interfaces/   list    (default)
+Dhcp6/renew-timer   1000    integer (default)
+Dhcp6/rebind-timer  2000    integer (default)
+Dhcp6/preferred-lifetime    3000    integer (default)
+Dhcp6/valid-lifetime    4000    integer (default)
+Dhcp6/option-def    []  list    (default)
+Dhcp6/option-data   []  list    (default)
+Dhcp6/lease-database/type   ""  string  (default)
+Dhcp6/lease-database/name   ""  string  (default)
+Dhcp6/lease-database/user   ""  string  (default)
+Dhcp6/lease-database/host   ""  string  (default)
+Dhcp6/lease-database/password   ""  string  (default)
+Dhcp6/subnet6/  list
+Dhcp6/dhcp-ddns/enable-updates  true    boolean
+Dhcp6/dhcp-ddns/server-ip   "127.0.0.1" string
+Dhcp6/dhcp-ddns/server-port 53001   integer
+Dhcp6/dhcp-ddns/sender-ip      ""      string
+Dhcp6/dhcp-ddns/sender-port    0       integer
+Dhcp6/dhcp-ddns/max-queue-size 1024  integer
+Dhcp6/dhcp-ddns/ncr-protocol    "UDP"   string
+Dhcp6/dhcp-ddns/ncr-format  "JSON"  string
+Dhcp6/dhcp-ddns/always-include-fqdn false   boolean
+Dhcp6/dhcp-ddns/override-no-update  false   boolean
+Dhcp6/dhcp-ddns/override-client-update  false   boolean
+Dhcp6/dhcp-ddns/replace-client-name false   boolean
+Dhcp6/dhcp-ddns/generated-prefix    "myhost"    string
+Dhcp6/dhcp-ddns/qualifying-suffix   "example.com"   string
+</screen>
+      </para>
+      <para>
+        To change one of the parameters, simply follow
+        the usual <command>bindctl</command> procedure. For example, to make the
+        leases longer, change their valid-lifetime parameter:
+        <screen>
+&gt; <userinput>config set Dhcp6/valid-lifetime 7200</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Most Dhcp6 parameters are of global scope
+        and apply to all defined subnets, unless they are overridden on a
+        per-subnet basis.
+      </para>
+      <note>
+        <para>
+          With this version of Kea, there are a number of known limitations
+          and problems in the DHCPv6 server. See <xref linkend="dhcp6-limit"/>.
+        </para>
+      </note>
+
+      <section>
+      <title>Default storage for leases</title>
+      <para>
+        The server is able to store lease data in different repositories. Larger deployments
+        may elect to store leases in a database.
+        <xref linkend="database-configuration6"/> describes one way to do it.
+        By default, the server will use a CSV file rather than a database to store
+        lease information. One of the advantages of using a file is that it eliminates
+        dependency on third party database software.
+      </para>
+      <para>
+        The configuration of the file backend (Memfile)
+        is controlled through the Dhcp6/lease-database parameters. When default
+        parameters are left, the Memfile backend will write leases to a disk in the
+        [bind10-install-dir]/var/bind10/kea-leases6.csv.
+      </para>
+      <para>
+        It is possible to alter the default location of the lease file. The following
+        configuration:
+<screen>
+&gt; <userinput>config set Dhcp4/lease-database/type "memfile"</userinput>
+&gt; <userinput>config set Dhcp4/lease-database/persist true</userinput>
+&gt; <userinput>config set Dhcp4/lease-database/leasefile "/tmp/kea-leases6.csv"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+        will change the default location of the lease file to /tmp/kea-leases6.csv.
+      </para>
+      <para>
+        The "persist" parameter controls whether the leases are written to disk.
+        It is strongly recommended that this parameter is set to "true" at all times
+        during the normal operation of the server.
+      </para>
+      </section>
+
+      <section id="database-configuration6">
+      <title>Database Configuration</title>
+      <para>
+      All leases issued by the server are stored in the lease database. Currently
+      there are 3 database backends available: MySQL, PostgreSQL and memfile.
+      <footnote>
+      <para>
+      The server comes with an in-memory database ("memfile") configured as the default
+      database. This is used for internal testing and is not supported.  In addition,
+      it does not store lease information on disk: lease information will be lost if the
+      server is restarted.
+      </para>
+      </footnote>, and so the server must be configured to
+      access the correct database with the appropriate credentials.
+      </para>
+      <note>
+        <para>
+            Database access information must be configured for the DHCPv6 server, even if
+            it has already been configured for the DHCPv4 server.  The servers store their
+            information independently, so each server can use a separate
+            database or both servers can use the same database.
+          </para>
+        </note>
+      <para>
+      Database configuration is controlled through the Dhcp6/lease-database parameters.
+      The type of the database must be set to "mysql", "postgresql" or "memfile":
+<screen>
+&gt; <userinput>config set Dhcp6/lease-database/type "mysql"</userinput>
+</screen>
+      Next, the name of the database is to hold the leases must be set: this is the
+      name used when the lease database was created (see <xref linkend="dhcp-mysql-database-create"/>
+      or <xref linkend="dhcp-pgsql-database-create"/>).
+<screen>
+&gt; <userinput>config set Dhcp6/lease-database/name "<replaceable>database-name</replaceable>"</userinput>
+</screen>
+      If the database is located on a different system to the DHCPv6 server, the
+      database host name must also be specified (although note that this configuration
+      may have a severe impact on server performance):
+<screen>
+&gt; <userinput>config set Dhcp6/lease-database/host "<replaceable>remote-host-name</replaceable>"</userinput>
+</screen>
+      The usual state of affairs will be to have the database on the same machine as the
+      DHCPv6 server.  In this case, set the value to the empty string (this is the default):
+<screen>
+&gt; <userinput>config set Dhcp6/lease-database/host ""</userinput>
+</screen>
+      </para>
+      <para>
+      Finally, the credentials of the account under which the server will access the database
+      should be set:
+<screen>
+&gt; <userinput>config set Dhcp6/lease-database/user "<replaceable>user-name</replaceable>"</userinput>
+&gt; <userinput>config set Dhcp6/lease-database/password "<replaceable>password</replaceable>"</userinput>
+</screen>
+      If there is no password to the account, set the password to the empty string "". (This is also the default.)
+      </para>
+      <note>
+      <para>The password is echoed when entered and is stored in clear text in the configuration
+      database.  Improved password security will be added in a future version of Kea.</para>
+      </note>
+      </section>
+
+      <section id="dhcp6-interface-selection">
+      <title>Interface selection</title>
+      <para>
+        When DHCPv6 server starts up, by default it will listen to the DHCP
+        traffic and respond to it on all interfaces detected during startup.
+        However, in many cases it is desired to configure the server to listen and
+        respond on selected interfaces only. The sample commands in this section
+        show how to make interface selection using bindctl.
+      </para>
+      <para>
+        The default configuration can be presented with the following command:
+        <screen>
+&gt; <userinput>config show Dhcp6/interfaces</userinput>
+<userinput>Dhcp6/interfaces[0] "*" string</userinput></screen>
+        An asterisk sign plays a role of the wildcard and means "listen on all interfaces".
+      </para>
+      <para>
+        In order to override the default configuration, the existing entry can be replaced
+        with the actual interface name:
+        <screen>
+&gt; <userinput>config set Dhcp6/interfaces[0] eth1</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Other interface names can be added on one-by-one basis:
+        <screen>
+&gt; <userinput>config add Dhcp6/interfaces eth2</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Configuration will now contain two interfaces which can be presented as follows:
+        <screen>
+&gt; <userinput>config show Dhcp6/interfaces</userinput>
+<userinput>Dhcp6/interfaces[0] "eth1"  string</userinput>
+<userinput>Dhcp6/interfaces[1] "eth2"  string</userinput></screen>
+        When configuration gets committed, the server will start to listen on
+        eth1 and eth2 interfaces only.
+      </para>
+      <para>
+        It is possible to use wildcard interface name (asterisk) concurrently with explicit
+        interface names:
+        <screen>
+&gt; <userinput>config add Dhcp6/interfaces *</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        This will result in the following configuration:
+        <screen>
+&gt; <userinput>config show Dhcp6/interfaces</userinput>
+<userinput>Dhcp6/interfaces[0] "eth1"  string</userinput>
+<userinput>Dhcp6/interfaces[1] "eth2"  string</userinput>
+<userinput>Dhcp6/interfaces[2] "*"     string</userinput></screen>
+        The presence of the wildcard name implies that server will listen on all interfaces.
+        In order to fall back to the previous configuration when server listens on eth1 and eth2:
+        <screen>
+&gt; <userinput>config remove Dhcp6/interfaces[2]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+    </section>
+
+    <section id="ipv6-subnet-id">
+      <title>IPv6 Subnet Identifier</title>
+      <para>
+        Subnet identifier is a unique number associated with a particular subnet.
+        In principle, it is used to associate clients' leases with respective subnets.
+        When subnet identifier is not specified for a subnet being configured, it will
+        be automatically assigned by the configuration mechanism. The identifiers
+        are assigned from 1 and are monotonically increased for each subsequent
+        subnet: 1, 2, 3 ....
+      </para>
+      <para>
+       If there are multiple subnets configured with auto-generated identifiers and
+       one of them is removed, the subnet identifiers may be renumbered. For example:
+       if there are 4 subnets and 3rd is removed the last subnet will be assigned
+       identifier that the 3rd subnet had before removal. As a result, the leases
+       stored in the lease database for subnet 3 are now associated with the
+       subnet 4, which may have unexpected consequences. In the future it is planned
+       to implement the mechanism to preserve auto-generated subnet ids upon removal
+       of one of the subnets. Currently, the only remedy for this issue is to
+       manually specify the unique subnet identifier for each subnet.
+      </para>
+      <para>
+        The following configuration:
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/id 1024</userinput>
+&gt; <userinput>config commit</userinput>
+        </screen>
+        will assign the arbitrary subnet identifier to the newly configured subnet.
+        This identifier will not change for this subnet until "id" parameter is
+        removed or set to 0. The value of 0 forces auto-generation of subnet
+        identifier.
+      </para>
+    </section>
+
+    <section id="dhcp6-unicast">
+      <title>Unicast traffic support</title>
+      <para>
+        When DHCPv6 server starts up, by default it listens to the DHCP traffic
+        sent to multicast address ff02::1:2 on each interface that it is
+        configured to listen on (see <xref linkend="dhcp6-interface-selection"/>).
+        In some cases it is useful to configure a server to handle incoming
+        traffic sent to the global unicast addresses as well. The most common
+        reason for that is to have relays send their traffic to the server
+        directly. To configure server to listen on specific unicast address, a
+        notation to specify interfaces has been extended. Interface name can be
+        optionally followed by a slash, followed by global unicast address that
+        server should listen on. That will be done in addition to normal
+        link-local binding + listening on ff02::1:2 address. The sample commands
+        listed below show how to listen on 2001:db8::1 (a global address)
+        configured on the eth1 interface.
+      </para>
+      <para>
+        <screen>
+&gt; <userinput>config set Dhcp6/interfaces[0] eth1/2001:db8::1</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        When configuration gets committed, the server will start to listen on
+        eth1 on link-local address, multicast group (ff02::1:2) and 2001:db8::1.
+      </para>
+      <para>
+        It is possible to mix interface names, wildcards and interface name/addresses
+        on the Dhcp6/interface list. It is not possible to specify more than one
+        unicast address on a given interface.
+      </para>
+      <para>
+        Care should be taken to specify proper unicast addresses. The server will
+        attempt to bind to those addresses specified, without any additional checks.
+        That approach is selected on purpose, so in the software can be used to
+        communicate over uncommon addresses if the administrator desires so.
+      </para>
+    </section>
+
+    <section id="dhcp6-address-config">
+      <title>Subnet and Address Pool</title>
+      <para>
+        The essential role of a DHCPv6 server is address assignment. For this,
+        the server has to be configured with at least one subnet and one pool of dynamic
+        addresses to be managed. For example, assume that the server
+        is connected to a network segment that uses the 2001:db8:1::/64
+        prefix. The Administrator of that network has decided that addresses from range
+        2001:db8:1::1 to 2001:db8:1::ffff are going to be managed by the Dhcp6
+        server. Such a configuration can be achieved in the following way:
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::0 - 2001:db8:1::ffff" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Note that subnet is defined as a simple string, but the pool parameter
+        is actually a list of pools: for this reason, the pool definition is
+        enclosed in square brackets, even though only one range of addresses
+        is specified.</para>
+        <para>It is possible to define more than one pool in a
+        subnet: continuing the previous example, further assume that
+        2001:db8:1:0:5::/80 should be also be managed by the server. It could be written as
+        2001:db8:1:0:5:: to 2001:db8:1::5:ffff:ffff:ffff, but typing so many 'f's
+        is cumbersome. It can be expressed more simply as 2001:db8:1:0:5::/80. Both
+        formats are supported by Dhcp6 and can be mixed in the pool list.
+        For example, one could define the following pools:
+        <screen>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::1 - 2001:db8:1::ffff", "2001:db8:1:0:5::/80" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        The number of pools is not limited, but for performance reasons it is recommended to
+        use as few as possible.
+      </para>
+      <para>
+         The server may be configured to serve more than one subnet. To add a second subnet,
+         use a command similar to the following:
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:beef::/48"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:beef::/48" ]</userinput>
+&gt; <userinput>config commit</userinput></screen>
+        Arrays are counted from 0. subnet[0] refers to the subnet defined in the
+        previous example.  The <command>config add Dhcp6/subnet6</command> command adds
+        another (second) subnet. It can be referred to as
+        <command>Dhcp6/subnet6[1]</command>. In this example, we allow server to
+        dynamically assign all addresses available in the whole subnet. Although
+        very wasteful, it is certainly a valid configuration to dedicate the
+        whole /48 subnet for that purpose.
+      </para>
+      <para>
+        When configuring a DHCPv6 server using prefix/length notation, please pay
+        attention to the boundary values. When specifying that the server should use
+        a given pool, it will be able to allocate also first (typically network
+        address) address from that pool. For example for pool 2001:db8::/64 the
+        2001:db8:: address may be assigned as well. If you want to avoid this,
+        please use the "min-max" notation.
+      </para>
+    </section>
+
+    <section>
+<!-- @todo: add real meat to the prefix delegation config this is just place holder stuff -->
+      <title>Subnet and Prefix Delegation Pools</title>
+      <para>
+        Subnets may also be configured to delegate address prefixes....
+        A subnet may have one or more prefix delegation pools.  Each pool has
+        a prefixed address, which is specified as a prefix and a prefix length,
+        as well as a delegated prefix length.  A sample configuration is shown
+        below:
+      <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config show Dhcp6/subnet6[0]</userinput>
+&gt; <userinput>config add Dhcp6/subnet6[0]/pd-pools</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/prefix "2001:db8:1::"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/prefix-len 64</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/delegated-len 96</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+    </section>
+
+    <section id="dhcp6-std-options">
+      <title>Standard DHCPv6 options</title>
+      <para>
+        One of the major features of DHCPv6 server is to provide configuration
+        options to clients. Although there are several options that require
+        special behavior, most options are sent by the server only if the client
+        explicitly requested them.  The following example shows how to
+        configure DNS servers, which is one of the most frequently used
+        options. Numbers in the first column are added for easier reference and
+        will not appear on screen. Options specified in this way are considered
+        global and apply to all configured subnets.
+
+        <screen>
+1. &gt; <userinput>config add Dhcp6/option-data</userinput>
+2. &gt; <userinput>config set Dhcp6/option-data[0]/name "dns-servers"</userinput>
+3. &gt; <userinput>config set Dhcp6/option-data[0]/code 23</userinput>
+4. &gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
+5. &gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
+6. &gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8::cafe, 2001:db8::babe"</userinput>
+7. &gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+    <para>
+      The first line creates new entry in option-data table. It
+      contains information on all global options that the server is
+      supposed to configure in all subnets. The second line specifies
+      option name. For a complete list of currently supported names,
+      see <xref linkend="dhcp6-std-options-list"/>.
+      The third line specifies option code, which must match one of the
+      values from that
+      list. Line 4 specifies option space, which must always
+      be set to "dhcp6" as these are standard DHCPv6 options. For
+      other name spaces, including custom option spaces, see <xref
+      linkend="dhcp6-option-spaces"/>. The fifth line specifies the format in
+      which the data will be entered: use of CSV (comma
+      separated values) is recommended. The sixth line gives the actual value to
+      be sent to clients. Data is specified as a normal text, with
+      values separated by commas if more than one value is
+      allowed.
+    </para>
+
+    <para>
+      Options can also be configured as hexadecimal values. If csv-format is
+      set to false, the option data must be specified as a string of hexadecimal
+      numbers. The
+      following commands configure the DNS-SERVERS option for all
+      subnets with the following addresses: 2001:db8:1::cafe and
+      2001:db8:1::babe.
+      <screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/name "dns-servers"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/code 23</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/csv-format false</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/data "2001 0DB8 0001 0000 0000 0000</userinput>
+        <userinput>0000 CAFE 2001 0DB8 0001 0000 0000 0000 0000 BABE"</userinput>
+&gt; <userinput>config commit</userinput>
+        </screen>
+       (The value for the setting of the "data" element is split across two
+        lines in this document for clarity: when entering the command, the
+        whole string should be entered on the same line.)
+      </para>
+
+    <para>
+      It is possible to override options on a per-subnet basis.  If
+      clients connected to most of your subnets are expected to get the
+      same values of a given option, you should use global options: you
+      can then override specific values for a small number of subnets.
+      On the other hand, if you use different values in each subnet,
+      it does not make sense to specify global option values
+      (Dhcp6/option-data), rather you should set only subnet-specific values
+      (Dhcp6/subnet[X]/option-data[Y]).
+     </para>
+     <para>
+      The following commands override the global
+      DNS servers option for a particular subnet, setting a single DNS
+      server with address 2001:db8:1::3.
+      <screen>
+&gt; <userinput>config add Dhcp6/subnet6[0]/option-data</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/name "dns-servers"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/code 23</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/data "2001:db8:1::3"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+    </para>
+
+    <note>
+      <para>
+        In future versions of BIND 10 DHCP, it will not be necessary to specify
+        option code, space and csv-format fields, as those fields will be set
+        automatically.
+      </para>
+    </note>
+
+
+    <para>
+      The currently supported standard DHCPv6 options are
+      listed in <xref linkend="dhcp6-std-options-list"/>.
+      The "Name" and "Code"
+      are the values that should be used as a name in the option-data
+      structures. "Type" designates the format of the data: the meanings of
+      the various types is given in <xref linkend="dhcp-types"/>.
+    </para>
+    <para>
+      Some options are designated as arrays, which means that more than one
+      value is allowed in such an option. For example the option dns-servers
+      allows the specification of more than one IPv6 address, so allowing
+      clients to obtain the the addresses of multiple DNS servers.
+    </para>
+
+<!-- @todo: describe record types -->
+
+      <para>
+        The <xref linkend="dhcp6-custom-options"/> describes the configuration
+        syntax to create custom option definitions (formats). It is generally not
+        allowed to create custom definitions for standard options, even if the
+        definition being created matches the actual option format defined in the
+        RFCs. There is an exception from this rule for standard options for which
+        Kea does not provide a definition yet. In order to use such options,
+        a server administrator must create a definition as described in
+        <xref linkend="dhcp6-custom-options"/> in the 'dhcp6' option space. This
+        definition should match the option format described in the relevant
+        RFC but configuration mechanism would allow any option format as it has
+        no means to validate it at the moment.
+      </para>
+
+
+    <para>
+      <table frame="all" id="dhcp6-std-options-list">
+        <title>List of standard DHCPv6 options</title>
+        <tgroup cols='4'>
+        <colspec colname='name'/>
+        <colspec colname='code'/>
+        <colspec colname='type'/>
+        <colspec colname='array'/>
+        <thead>
+          <row><entry>Name</entry><entry>Code</entry><entry>Type</entry><entry>Array?</entry></row>
+        </thead>
+        <tbody>
+<!-- Our engine uses those options on its own, admin must not configure them on his own
+<row><entry>clientid</entry><entry>1</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>serverid</entry><entry>2</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>ia-na</entry><entry>3</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>ia-ta</entry><entry>4</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>iaaddr</entry><entry>5</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>oro</entry><entry>6</entry><entry>uint16</entry><entry>true</entry></row> -->
+<row><entry>preference</entry><entry>7</entry><entry>uint8</entry><entry>false</entry></row>
+
+<!-- Our engine uses those options on its own, admin must not configure them on his own
+<row><entry>elapsed-time</entry><entry>8</entry><entry>uint16</entry><entry>false</entry></row>
+<row><entry>relay-msg</entry><entry>9</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>auth</entry><entry>11</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>unicast</entry><entry>12</entry><entry>ipv6-address</entry><entry>false</entry></row>
+<row><entry>status-code</entry><entry>13</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>rapid-commit</entry><entry>14</entry><entry>empty</entry><entry>false</entry></row>
+<row><entry>user-class</entry><entry>15</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>vendor-class</entry><entry>16</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>vendor-opts</entry><entry>17</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>interface-id</entry><entry>18</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>reconf-msg</entry><entry>19</entry><entry>uint8</entry><entry>false</entry></row>
+<row><entry>reconf-accept</entry><entry>20</entry><entry>empty</entry><entry>false</entry></row> -->
+<row><entry>sip-server-dns</entry><entry>21</entry><entry>fqdn</entry><entry>true</entry></row>
+<row><entry>sip-server-addr</entry><entry>22</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>dns-servers</entry><entry>23</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>domain-search</entry><entry>24</entry><entry>fqdn</entry><entry>true</entry></row>
+<!-- <row><entry>ia-pd</entry><entry>25</entry><entry>record</entry><entry>false</entry></row> -->
+<!-- <row><entry>iaprefix</entry><entry>26</entry><entry>record</entry><entry>false</entry></row> -->
+<row><entry>nis-servers</entry><entry>27</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>nisp-servers</entry><entry>28</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>nis-domain-name</entry><entry>29</entry><entry>fqdn</entry><entry>true</entry></row>
+<row><entry>nisp-domain-name</entry><entry>30</entry><entry>fqdn</entry><entry>true</entry></row>
+<row><entry>sntp-servers</entry><entry>31</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>information-refresh-time</entry><entry>32</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>bcmcs-server-dns</entry><entry>33</entry><entry>fqdn</entry><entry>true</entry></row>
+<row><entry>bcmcs-server-addr</entry><entry>34</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>geoconf-civic</entry><entry>36</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>remote-id</entry><entry>37</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>subscriber-id</entry><entry>38</entry><entry>binary</entry><entry>false</entry></row>
+<row><entry>client-fqdn</entry><entry>39</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>pana-agent</entry><entry>40</entry><entry>ipv6-address</entry><entry>true</entry></row>
+<row><entry>new-posix-timezone</entry><entry>41</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>new-tzdb-timezone</entry><entry>42</entry><entry>string</entry><entry>false</entry></row>
+<row><entry>ero</entry><entry>43</entry><entry>uint16</entry><entry>true</entry></row>
+<row><entry>lq-query</entry><entry>44</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>client-data</entry><entry>45</entry><entry>empty</entry><entry>false</entry></row>
+<row><entry>clt-time</entry><entry>46</entry><entry>uint32</entry><entry>false</entry></row>
+<row><entry>lq-relay-data</entry><entry>47</entry><entry>record</entry><entry>false</entry></row>
+<row><entry>lq-client-link</entry><entry>48</entry><entry>ipv6-address</entry><entry>true</entry></row>
+        </tbody>
+        </tgroup>
+      </table>
+    </para>
+    </section>
+
+    <section id="dhcp6-custom-options">
+      <title>Custom DHCPv6 options</title>
+      <para>It is also possible to define options other than the standard ones.
+      Assume that we want to define a new DHCPv6 option called "foo" which will have
+      code 100 and will convey a single unsigned 32 bit integer value. We can define
+      such an option by using the following commands:
+      <screen>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/code 100</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/type "uint32"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      The "false" value of the "array" parameter determines that the option
+      does NOT comprise an array of "uint32" values but rather a single value.
+      Two other parameters have been left blank: "record-types" and "encapsulate".
+      The former specifies the comma separated list of option data fields if the
+      option comprises a record of data fields. The "record-fields" value should
+      be non-empty if the "type" is set to "record". Otherwise it must be left
+      blank. The latter parameter specifies the name of the option space being
+      encapsulated by the particular option. If the particular option does not
+      encapsulate any option space it should be left blank.
+      Note that the above set of comments define the format of the new option and do not
+      set its values.
+      </para>
+      <para>Once the new option format is defined, its value is set
+      in the same way as for a standard option. For example the following
+      commands set a global value that applies to all subnets.
+        <screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/code 100</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/data "12345"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <para>New options can take more complex forms than simple use of
+      primitives (uint8, string, ipv6-address etc): it is possible to
+      define an option comprising a number of existing primitives.
+      </para>
+      <para>
+      Assume we want to define a new option that will consist of an IPv6
+      address, followed by an unsigned 16 bit integer, followed by a
+      boolean value, followed by a text string. Such an option could
+      be defined in the following way:
+<screen>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/name "bar"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/code 101</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/type "record"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/record-types "ipv6-address, uint16, boolean, string"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
+</screen>
+      The "type" is set to "record" to indicate that the option contains
+      multiple values of different types.  These types are given as a comma-separated
+      list in the "record-types" field and should be those listed in <xref linkend="dhcp-types"/>.
+      </para>
+      <para>
+      The values of the option are set as follows:
+<screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/name "bar"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/code 101</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8:1::10, 123, false, Hello World"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      "csv-format" is set "true" to indicate that the "data" field comprises a command-separated
+      list of values.  The values in the "data" must correspond to the types set in
+      the "record-types" field of the option definition.
+      </para>
+      <note>
+        <para>
+          It is recommended that boolean values are specified using "true" and "false"
+          strings. This helps to prevent errors when typing multiple comma separated
+          values, as it make it easier to identify the type of the value being typed,
+          and compare it with the order of data fields. Nevertheless, it is possible
+          to use integer values: "1" and "0", instead of "true" and "false"
+          accordingly. If other integer value is specified, the configuration is
+          rejected.
+        </para>
+      </note>
+    </section>
+
+    <section id="dhcp6-vendor-opts">
+      <title>DHCPv6 vendor specific options</title>
+      <para>
+      Currently there are three option spaces defined: dhcp4 (to be used
+      in DHCPv4 daemon) and dhcp6 (for the DHCPv6 daemon); there is also
+      vendor-opts-space, which is empty by default, but options can be
+      defined in it. Those options are called vendor-specific information
+      options. The following examples show how to define an option "foo"
+      with code 1 that consists of an IPv6 address, an unsigned 16 bit integer
+      and a string. The "foo" option is conveyed in a vendor specific
+      information option. This option comprises a single uint32 value
+      that is set to "12345". The sub-option "foo" follows the data
+      field holding this value.
+      <screen>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/space "vendor-opts-space"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/type "record"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/record-types "ipv6-address, uint16, string"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/encapsulates ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+     (Note that the option space is set to "vendor-opts-space".)
+     Once the option format is defined, the next step is to define actual values
+     for that option:
+     <screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/name "foo"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/space "vendor-opts-space"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8:1::10, 123, Hello World"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+    We should also define values for the vendor-opts, that will convey our option foo.
+     <screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/name "vendor-opts"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/code 17</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/data "12345"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+    </section>
+
+    <section id="dhcp6-option-spaces">
+      <title>Nested DHCPv6 options (custom option spaces)</title>
+      <para>It is sometimes useful to define completely new option
+      spaces.  This is useful if the user wants his new option to
+      convey sub-options that use separate numbering scheme, for
+      example sub-options with codes 1 and 2. Those option codes
+      conflict with standard DHCPv6 options, so a separate option
+      space must be defined.
+      </para>
+      <para>Note that it is not required to create new option space when
+      defining sub-options for a standard option because it is by
+      default created if the standard option is meant to convey
+      any sub-options (see <xref linkend="dhcp6-vendor-opts"/>).
+      </para>
+      <para>
+      Assume that we want to have a DHCPv6 option called "container"
+      with code 102 that conveys two sub-options with codes 1 and 2.
+      First we need to define the new sub-options:
+<screen>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/name "subopt1"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/type "ipv6-address"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput>
+&gt; <userinput></userinput>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/name "subopt2"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/code 2</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/type "string"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[1]/encapsulate ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+    Note that we have defined the options to belong to a new option space
+    (in this case, "isc").
+    </para>
+    <para>
+The next step is to define a regular DHCPv6 option and specify that it
+should include options from the isc option space:
+<screen>
+&gt; <userinput>config add Dhcp6/option-def</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/name "container"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/code 102</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/type "empty"</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/array false</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/record-types ""</userinput>
+&gt; <userinput>config set Dhcp6/option-def[2]/encapsulate "isc"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+    The name of the option space in which the sub-options are defined
+    is set in the "encapsulate" field. The "type" field is set to "empty"
+    which imposes that this option does not carry any data other than
+    sub-options.
+    </para>
+    <para>
+    Finally, we can set values for the new options:
+<screen>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/name "subopt1"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/code 1</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8::abcd"</userinput>
+&gt; <userinput>config commit</userinput>
+&gt; <userinput></userinput>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/name "subopt2"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/space "isc"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/code 2</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[1]/data "Hello world"</userinput>
+&gt; <userinput>config commit</userinput>
+&gt; <userinput></userinput>
+&gt; <userinput>config add Dhcp6/option-data</userinput>
+&gt; <userinput>config set Dhcp6/option-data[2]/name "container"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[2]/space "dhcp6"</userinput>
+&gt; <userinput>config set Dhcp6/option-data[2]/code 102</userinput>
+&gt; <userinput>config set Dhcp6/option-data[2]/csv-format true</userinput>
+&gt; <userinput>config set Dhcp6/option-data[2]/data ""</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+    Even though the "container" option does not carry any data except
+    sub-options, the "data" field must be explicitly set to an empty value.
+    This is required because in the current version of BIND 10 DHCP, the
+    default configuration values are not propagated to the configuration parsers:
+    if the "data" is not set the parser will assume that this
+    parameter is not specified and an error will be reported.
+    </para>
+    <para>Note that it is possible to create an option which carries some data
+    in addition to the sub-options defined in the encapsulated option space.  For example,
+    if the "container" option from the previous example was required to carry an uint16
+    value as well as the sub-options, the "type" value would have to be set to "uint16" in
+    the option definition. (Such an option would then have the following
+    data structure: DHCP header, uint16 value, sub-options.) The value specified
+    with the "data" parameter - which should be a valid integer enclosed in quotes,
+    e.g. "123" - would then be assigned to the uint16 field in the "container" option.
+    </para>
+    </section>
+
+      <section id="dhcp6-config-subnets">
+        <title>IPv6 Subnet Selection</title>
+          <para>
+          The DHCPv6 server may receive requests from local (connected to the
+          same subnet as the server) and remote (connecting via relays) clients.
+          As server may have many subnet configurations defined, it must select
+          appropriate subnet for a given request.
+          </para>
+          <para>
+          The server can not assume which of configured subnets are local. It is
+          possible in IPv4, where there is reasonable expectation that the
+          server will have a (global) IPv4 address configured on the interface,
+          and can use that information to detect whether a subnet is local or
+          not. That assumption is not true in IPv6, as the DHCPv6 must be able
+          to operate with having link-local addresses only. Therefore an optional
+          &quot;interface&quot; parameter is available within a subnet definition
+          to designate that a given subnet is local, i.e. reachable directly over
+          specified interface. For example the server that is intended to serve
+          a local subnet over eth0 may be configured as follows:
+<screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:beef::/48"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:beef::/48" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/interface "eth0"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+        </para>
+      </section>
+
+      <section id="dhcp6-relays">
+        <title>DHCPv6 Relays</title>
+        <para>
+          A DHCPv6 server with multiple subnets defined must select the
+          appropriate subnet when it receives a request from client.  For clients
+          connected via relays, two mechanisms are used:
+        </para>
+        <para>
+          The first uses the linkaddr field in the RELAY_FORW message. The name
+          of this field is somewhat misleading in that it does not contain a link-layer
+          address: instead, it holds an address (typically a global address) that is
+          used to identify a link. The DHCPv6 server checks if the address belongs
+          to a defined subnet and, if it does, that subnet is selected for the client's
+          request.
+        </para>
+        <para>
+          The second mechanism is based on interface-id options. While forwarding a client's
+          message, relays may insert an interface-id option into the message that
+          identifies the interface on the relay that received the message. (Some
+          relays allow configuration of that parameter, but it is sometimes
+          hardcoded and may range from the very simple (e.g. "vlan100") to the very cryptic:
+          one example seen on real hardware was "ISAM144|299|ipv6|nt:vp:1:110"). The
+          server can use this information to select the appropriate subnet.
+          The information is also returned to the relay which then knows the
+          interface to use to transmit the response to the client. In order for
+          this to work successfully, the relay interface IDs must be unique within
+          the network and the server configuration must match those values.
+        </para>
+        <para>
+          When configuring the DHCPv6 server, it should be noted that two
+          similarly-named parameters can be configured for a subnet:
+          <itemizedlist>
+            <listitem><simpara>
+              "interface" defines which local network interface can be used
+              to access a given subnet.
+            </simpara></listitem>
+            <listitem><simpara>
+              "interface-id" specifies the content of the interface-id option
+              used by relays to identify the interface on the relay to which
+              the response packet is sent.
+            </simpara></listitem>
+          </itemizedlist>
+          The two are mutually exclusive: a subnet cannot be both reachable locally
+          (direct traffic) and via relays (remote traffic). Specifying both is a
+          configuration error and the DHCPv6 server will refuse such a configuration.
+        </para>
+
+        <para>
+          To specify interface-id with value "vlan123", the following commands can
+          be used:
+          <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:beef::/48"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:beef::/48" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/interface-id "vland123"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+        </para>
+      </section>
+
+    <section id="dhcp6-client-classifier">
+      <title>Client Classification in DHCPv6</title>
+      <note>
+      <para>
+        DHCPv6 server has been extended to support limited client classification.
+        Although the current capability is modest, it is expected to be expanded
+        in the future. It is envisaged that the majority of client classification
+        extensions will be using hooks extensions.
+      </para>
+      </note>
+      <para>In certain cases it is useful to differentiate between different types
+      of clients and treat them differently. The process of doing classification
+      is conducted in two steps. The first step is to assess incoming packet and
+      assign it to zero or more classes. This classification is currently simple,
+      but is expected to grow in capability soon. Currently the server checks whether
+      incoming packet has vendor class option (16). If it has, content
+      of that option is prepended with &quot;VENDOR_CLASS_&quot; interpreted as a
+      class. For example, modern cable modems will send this option with value
+      &quot;docsis3.0&quot; and as a result the packet will belong to class
+      &quot;VENDOR_CLASS_docsis3.0&quot;.
+      </para>
+
+      <para>It is envisaged that the client classification will be used for changing
+      behavior of almost any part of the DHCP engine processing, including assigning
+      leases from different pools, assigning different option (or different values of
+      the same options) etc. For now, there is only one mechanism that is taking
+      advantage of client classification: subnet selection.</para>
+
+      <para>
+        Kea can be instructed to limit access to given subnets based on class information.
+        This is particularly useful for cases where two types of devices share the
+        same link and are expected to be served from two different subnets. The
+        primary use case for such a scenario are cable networks. There are two
+        classes of devices: cable modem itself, which should be handled a lease
+        from subnet A and all other devices behind modems that should get a lease
+        from subnet B. That segregation is essential to prevent overly curious
+        users from playing with their cable modems. For details on how to set up
+        class restrictions on subnets, see <xref linkend="dhcp6-subnet-class"/>.
+      </para>
+
+    </section>
+
+    <section id="dhcp6-subnet-class">
+      <title>Limiting access to IPv6 subnet to certain classes</title>
+      <para>
+        In certain cases it beneficial to restrict access to certains subnets
+        only to clients that belong to a given subnet. For details on client
+        classes, see <xref linkend="dhcp6-client-classifier"/>. This is an
+        extension of a previous example from <xref linkend="dhcp6-address-config"/>.
+
+        Let's assume that the server is connected to a network segment that uses
+        the 2001:db8:1::/64 prefix. The Administrator of that network has
+        decided that addresses from range 2001:db8:1::1 to 2001:db8:1::ffff are
+        going to be managed by the Dhcp6 server. Only clients belonging to the
+        eRouter1.0 client class are allowed to use that pool. Such a
+        configuration can be achieved in the following way:
+
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::0 - 2001:db8:1::ffff" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/client-class "eRouter1.0"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+      <para>
+        Care should be taken with client classification as it is easy to prevent
+        clients that do not meet class criteria to be denied any service altogether.
+      </para>
+    </section>
+
+
+    <section id="dhcp6-ddns-config">
+      <title>Configuring DHCPv6 for DDNS</title>
+      <para>
+      As mentioned earlier, b10-dhcp6 can be configured to generate requests to
+      the DHCP-DDNS server (referred to here as the "D2" server) to update
+      DNS entries.  These requests are known as NameChangeRequests or NCRs.
+      Each NCR contains the following information:
+      <orderedlist>
+      <listitem><para>
+      Whether it is a request to add (update) or remove DNS entries
+      </para></listitem>
+      <listitem><para>
+      Whether the change requests forward DNS updates (AAAA records), reverse
+      DNS updates (PTR records), or both.
+      </para></listitem>
+      <listitem><para>
+      The FQDN, lease address, and DHCID
+      </para></listitem>
+      </orderedlist>
+      The parameters controlling the generation of NCRs for submission to D2
+      are contained in the "dhcp-ddns" section of b10-dhcp6
+      configuration. The default values for this section appears as follows:
+<screen>
+&gt; <userinput>config show Dhcp6/dhcp-ddns</userinput>
+Dhcp6/dhcp-ddns/enable-updates true    boolean
+Dhcp6/dhcp-ddns/server-ip      "127.0.0.1"     string
+Dhcp6/dhcp-ddns/server-port    53001   integer
+Dhcp6/dhcp-ddns/sender-ip      ""      string
+Dhcp6/dhcp-ddns/sender-port    0       integer
+Dhcp6/dhcp-ddns/max-queue-size 1024 integer
+Dhcp6/dhcp-ddns/ncr-protocol   "UDP"   string
+Dhcp6/dhcp-ddns/ncr-format     "JSON"  string
+Dhcp6/dhcp-ddns/override-no-update     false   boolean
+Dhcp6/dhcp-ddns/override-client-update false   boolean
+Dhcp6/dhcp-ddns/replace-client-name    false   boolean
+Dhcp6/dhcp-ddns/generated-prefix       "myhost"        string
+Dhcp6/dhcp-ddns/qualifying-suffix      "example.com"   string
+</screen>
+      </para>
+      <para>
+      The "enable-updates" parameter determines whether or not b10-dhcp6 will
+      generate NCRs.  By default, this value is false hence DDNS updates are
+      disabled.  To enable DDNS updates set this value to true as follows:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/enable-updates true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <section id="dhcpv6-d2-io-config">
+      <title>DHCP-DDNS Server Connectivity</title>
+      <para>
+      In order for NCRs to reach the D2 server, b10-dhcp6 must be able
+      to communicate with it.  b10-dhcp6 uses the following configuration
+      parameters to control how it communications with D2:
+      <orderedlist>
+      <listitem><para>
+      server-ip - IP address on which D2 listens for requests. The default is
+      the local loopback interface at address 127.0.0.1. You may specify
+      either an IPv4 or IPv6 address.
+      </para></listitem>
+      <listitem><para>
+      server-port - port on which D2 listens for requests.  The default value
+      is 53001.
+      </para></listitem>
+      <listitem><para>
+      sender-ip - IP address which b10-dhcp6 should use to send requests to D2.
+      The default value is blank which instructs b10-dhcp6 to select a suitable
+      address.
+      </para></listitem>
+      <listitem><para>
+      sender-port - port which b10-dhcp6 should use to send requests to D2. The
+      default value of 0 instructs b10-dhcp6 to select suitable port.
+      </para></listitem>
+      <listitem><para>
+      ncr-format - Socket protocol use when sending requests to D2.  Currently
+      only UDP is supported.  TCP may be available in an upcoming release.
+      </para></listitem>
+      <listitem><para>
+      ncr-protocol - Packet format to use when sending requests to D2.
+      Currently only JSON format is supported.  Other formats may be available
+      in future releases.
+      </para></listitem>
+      <listitem><para>
+      max-queue-size - maximum number of requests allowed to queue waiting to
+      be sent to D2. This value guards against requests accumulating
+      uncontrollably if they are being generated faster than they can be
+      delivered.  If the number of requests queued for transmission reaches
+      this value, DDNS updating will be turned off until the queue backlog has
+      been sufficiently reduced.  The intent is allow b10-dhcp6 to
+      continue lease operations.  The default value is 1024.
+      </para></listitem>
+      </orderedlist>
+      By default, D2 is assumed to running on the same machine as b10-dhcp6, and
+      all of the default values mentioned above should be sufficient.
+      If, however, D2 has been configured to listen on a different address or
+      port, these values must altered accordingly. For example, if D2 has been
+      configured to listen on 3001::5 port 900, the following commands
+      would be required:
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/server-ip "3001::5"</userinput>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/server-port 900</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </para>
+      </section>
+      <section id="dhcpv6-d2-rules-config">
+      <title>When does b10-dhcp6 generate DDNS request</title>
+      b10-dhcp6 follows the behavior prescribed for DHCP servers in RFC 4704.
+      It is important to keep in mind that b10-dhcp6 provides the initial decision
+      making of when and what to update and forwards that information to D2 in
+      the form of NCRs. Carrying out the actual DNS updates and dealing with
+      such things as conflict resolution are the purview of D2 (<xref linkend="dhcp-ddns-server"/>).
+      <para>
+      This section describes when b10-dhcp6 will generate NCRs and the
+      configuration parameters that can be used to influence this decision.
+      It assumes that the "enable-updates" parameter is true.
+      </para>
+      <note>
+        <para>
+        Currently the interface between b10-dhcp6 and D2 only supports requests
+        which update DNS entries for a single IP address.  If a lease grants
+        more than one address, b10-dhcp6 will create the DDNS update request for
+        only the first of these addresses.  Support for multiple address
+        mappings may be provided in a future release.
+        </para>
+      </note>
+      <para>
+      In general, b10-dhcp6 will generate DDNS update requests when:
+      <orderedlist>
+      <listitem><para>
+      A new lease is granted in response to a DHCP REQUEST
+      </para></listitem>
+      <listitem><para>
+      An existing lease is renewed but the FQDN associated with it has
+      changed.
+      </para></listitem>
+      <listitem><para>
+      An existing lease is released in response to a DHCP RELEASE
+      </para></listitem>
+      </orderedlist>
+      In the second case, lease renewal, two  DDNS requests will be issued: one
+      request to remove entries for the previous FQDN and a second request to
+      add entries for the new FQDN.  In the last case, a lease release, a
+      single DDNS request to remove its entries will be made.  The decision
+      making involved when granting a new lease is more involved and is
+      discussed next.
+      </para>
+      <para>
+      b10-dhcp6 will generate a DDNS update request only if the DHCP REQUEST
+      contains the FQDN option (code 39). By default b10-dhcp6 will
+      respect the FQDN N and S flags specified by the client as shown in the
+      following table:
+      </para>
+        <table id="dhcp6-fqdn-flag-table">
+          <title>Default FQDN Flag Behavior</title>
+          <tgroup cols='4' align='left'>
+          <colspec colname='cflags'/>
+          <colspec colname='meaning'/>
+          <colspec colname='response'/>
+          <colspec colname='sflags'/>
+          <thead>
+              <row>
+                <entry>Client Flags:N-S</entry>
+                <entry>Client Intent</entry>
+                <entry>Server Response</entry>
+                <entry>Server Flags:N-S-O</entry>
+              </row>
+          </thead>
+          <tbody>
+            <row>
+                <entry>0-0</entry>
+                <entry>
+                Client wants to do forward updates, server should do reverse updates
+                </entry>
+                <entry>Server generates reverse-only request</entry>
+                <entry>1-0-0</entry>
+            </row>
+            <row>
+                <entry>0-1</entry>
+                <entry>Server should do both forward and reverse updates</entry>
+                <entry>Server generates request to update both directions</entry>
+                <entry>0-1-0</entry>
+            </row>
+            <row>
+                <entry>1-0</entry>
+                <entry>Client wants no updates done</entry>
+                <entry>Server does not generate a request</entry>
+                <entry>1-0-0</entry>
+            </row>
+          </tbody>
+          </tgroup>
+        </table>
+      <para>
+      The first row in the table above represents "client delegation". Here
+      the DHCP client states that it intends to do the forward DNS updates and
+      the server should do the reverse updates.  By default, b10-dhcp6 will honor
+      the client's wishes and generate a DDNS request to D2 to update only
+      reverse DNS data.  The parameter, "override-client-update", can be used
+      to instruct the server to override client delegation requests.  When
+      this parameter is true, b10-dhcp6 will disregard requests for client
+      delegation and generate a DDNS request to update both forward and
+      reverse DNS data.  In this case, the N-S-O flags in the server's
+      response to the client will be 0-1-1 respectively.
+      </para>
+      <para>
+      (Note that the flag combination N=1, S=1 is prohibited according to
+      RFC 4702. If such a combination is received from the client, the packet
+      will be dropped by b10-dhcp6.)
+      </para>
+      <para>
+      To override client delegation, issue the following commands:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/override-client-update true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The third row in the table above describes the case in which the client
+      requests that no DNS updates be done. The parameter, "override-no-update",
+      can be used to instruct the server to disregard the client's wishes. When
+      this parameter is true, b10-dhcp6 will generate DDNS update request to D2
+      even if the client requests no updates be done.  The N-S-O flags in the
+      server's response to the client will be 0-1-1.
+      </para>
+      <para>
+      To override client delegation, issue the following commands:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/override-no-update true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </section>
+      <section id="dhcpv6-fqdn-name-generation">
+      <title>b10-dhcp6 name generation for DDNS update requests</title>
+      Each NameChangeRequest must of course include the fully qualified domain
+      name whose DNS entries are to be affected.  b10-dhcp6 can be configured to
+      supply a portion or all of that name based upon what it receives from
+      the client in the DHCP REQUEST.
+      <para>
+      The rules for determining the FQDN option are as follows:
+      <orderedlist>
+      <listitem><para>
+      If configured to do so ignore the REQUEST contents and generate a
+      FQDN using a configurable prefix and suffix.
+      </para></listitem>
+      <listitem><para>
+      Otherwise, using is the domain name value from the client FQDN option as
+      the candidate name:
+      <orderedlist>
+      <listitem><para>
+      If the candidate name is a fully qualified domain name then use it.
+      </para></listitem>
+      <listitem><para>
+      If the candidate name is a partial (i.e. unqualified) name then
+      add a configurable suffix to the name and use the result as the FQDN.
+      </para></listitem>
+      <listitem><para>
+      If the candidate name is a empty then generate a FQDN using a
+      configurable prefix and suffix.
+      </para></listitem>
+      </orderedlist>
+      </para></listitem>
+      </orderedlist>
+      To instruct b10-dhcp6 to always generate a FQDN, set the parameter
+      "replace-client-name" to true:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/replace-client-name true</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The prefix used when generating a FQDN is specified by the
+      "generated-prefix" parameter.  The default value is "myhost".  To alter
+      its value, simply set it to the desired string:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/generated-prefix "another.host"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      <para>
+      The suffix used when generating a FQDN or when qualifying a partial
+      name is specified by the "qualifying-suffix" parameter.  The default
+      value is "example.com".  To alter its value simply set it to the desired
+      string:
+      </para>
+<screen>
+&gt; <userinput>config set Dhcp6/dhcp-ddns/generated-prefix "our.net"</userinput>
+&gt; <userinput>config commit</userinput>
+</screen>
+      </section>
+      <para>
+      When qualifying a partial name, b10-dhcp6 will construct a name with the
+      format:
+      </para>
+      <para>
+        [candidate-name].[qualifying-suffix].
+      </para>
+      <para>
+      where candidate-name is the partial name supplied in the REQUEST.
+      For example, if FQDN domain name value was "some-computer" and assuming
+      the default value for qualifying-suffix, the generated FQDN would be:
+      </para>
+      <para>
+        some-computer.example.com.
+      </para>
+      <para>
+      When generating a the entire name, b10-dhcp6 will construct name of the
+      format:
+      </para>
+      <para>
+        [generated-prefix]-[address-text].[qualifying-suffix].
+      </para>
+      <para>
+      where address-text is simply the lease IP address converted to a
+      hyphenated string.  For example, if lease address is 3001:1::70E and
+      assuming default values for generated-prefix and qualifying-suffix, the
+      generated FQDN would be:
+      </para>
+      <para>
+        myhost-3001-1--70E.example.com.
+      </para>
+    </section>
+
+   </section>
+
+    <section id="dhcp6-serverid">
+      <title>Server Identifier in DHCPv6</title>
+      <para>The DHCPv6 protocol uses a "server identifier" (also known
+      as a DUID) for clients to be able to discriminate between several
+      servers present on the same link.  There are several types of
+      DUIDs defined, but <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> instructs servers to use DUID-LLT if
+      possible. This format consists of a link-layer (MAC) address and a
+      timestamp. When started for the first time, the DHCPv6 server will
+      automatically generate such a DUID and store the chosen value to
+      a file.  That file is read by the server
+      and the contained value used whenever the server is subsequently started.
+      </para>
+      <para>
+        It is unlikely that this parameter should ever need to be changed.
+        However, if such a need arises, stop the server, edit the file and restart
+        the server. (The file is named b10-dhcp6-serverid and by default is
+        stored in the "var" subdirectory of the directory in which BIND 10 is installed.
+        This can be changed when BIND 10 is built by using "--localstatedir"
+        on the "configure" command line.)  The file is a text file that contains
+        double digit hexadecimal values
+        separated by colons. This format is similar to typical MAC address
+        format. Spaces are ignored. No extra characters are allowed in this
+        file.
+      </para>
+
+    </section>
+
+    <section id="dhcp6-relay-override">
+      <title>Using specific relay agent for a subnet</title>
+      <para>
+        The relay has to have an interface connected to the link on which
+        the clients are being configured. Typically the relay has a global IPv6
+        address configured on that interface that belongs to the subnet that
+        the server will assign addresses from. In such typical case, the
+        server is able to use IPv6 address inserted by the relay (in link-addr
+        field in RELAY-FORW message) to select appropriate subnet.
+      </para>
+      <para>
+        However, that is not always the case. The relay
+        address may not match the subnet in certain deployments. This
+        usually means that there is more than one subnet allocated for a given
+        link. Two most common examples where this is the case are long lasting
+        network renumbering (where both old and new address space is still being
+        used) and a cable network. In a cable network both cable modems and the
+        devices behind them are physically connected to the same link, yet
+        they use distinct addressing. In such case, the DHCPv6 server needs
+        additional information (like the value of interface-id option or IPv6
+        address inserted in the link-addr field in RELAY-FORW message) to
+        properly select an appropriate subnet.
+      </para>
+      <para>
+        The following example assumes that there is a subnet 2001:db8:1::/64
+        that is accessible via relay that uses 3000::1 as its IPv6 address.
+        The server will be able to select this subnet for any incoming packets
+        that came from a relay that has an address in 2001:db8:1::/64 subnet.
+        It will also select that subnet for a relay with address 3000::1.
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::2 - 2001:db8:1::ffff" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/relay/ip-address "3000::1"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+
+    </section>
+
+      <section id="dhcp6-client-class-relay">
+        <title>Segregating IPv6 clients in a cable network</title>
+        <para>
+          In certain cases, it is useful to mix relay address information,
+          introduced in <xref linkend="dhcp6-relay-override"/> with client
+          classification, explained in <xref linkend="dhcp6-subnet-class"/>.
+          One specific example is cable network, where typically modems
+          get addresses from a different subnet than all devices connected
+          behind them.
+        </para>
+        <para>
+          Let's assume that there is one CMTS (Cable Modem Termination System)
+          with one CM MAC (a physical link that modems are connected to).
+          We want the modems to get addresses from the 3000::/64 subnet,
+          while everything connected behind modems should get addresses from
+          another subnet (2001:db8:1::/64). The CMTS that acts as a relay
+          an uses address 3000::1. The following configuration can serve
+          that configuration:
+        <screen>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "3000::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "3000::2 - 3000::ffff" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/client-class "docsis3.0"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[0]/relay/ip-address "3000::1"</userinput>
+&gt; <userinput>config add Dhcp6/subnet6</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:1::/64"</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:1::1 - 2001:db8:1::ffff" ]</userinput>
+&gt; <userinput>config set Dhcp6/subnet6[1]/relay/ip-address "3000::1"</userinput>
+&gt; <userinput>config commit</userinput></screen>
+      </para>
+      </section>
+
+
+    <section id="dhcp6-std">
+      <title>Supported Standards</title>
+      <para>The following standards and draft standards are currently
+      supported:</para>
+      <itemizedlist>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink>: Supported messages are SOLICIT,
+            ADVERTISE, REQUEST, RELEASE, RENEW, REBIND and REPLY.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink>: Supported options are IA_PD and
+            IA_PREFIX. Also supported is the status code NoPrefixAvail.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc3646">RFC 3646</ulink>: Supported option is DNS_SERVERS.</simpara>
+          </listitem>
+          <listitem>
+            <simpara><ulink url="http://tools.ietf.org/html/rfc4704">RFC 4704</ulink>: Supported option is CLIENT_FQDN.</simpara>
+          </listitem>
+      </itemizedlist>
+    </section>
+
+    <section id="dhcp6-limit">
+      <title>DHCPv6 Server Limitations</title>
+      <para> These are the current limitations and known problems
+      with the DHCPv6 server
+      software. Most of them are reflections of the early stage of
+      development and should be treated as <quote>not implemented
+      yet</quote>, rather than actual limitations.</para>
+      <itemizedlist>
+          <listitem> <!-- see tickets #3234, #3281 -->
+            <para>
+              On-line configuration has some limitations. Adding new subnets or
+              modifying existing ones work, as is removing the last subnet from
+              the list. However, removing non-last (e.g. removing subnet 1,2 or 3 if
+              there are 4 subnets configured) will cause issues. The problem is
+              caused by simplistic subnet-id assignment. The subnets are always
+              numbered, starting from 1. That subnet-id is then used in leases
+              that are stored in the lease database. Removing non-last subnet will
+              cause the configuration information to mismatch data in the lease
+              database. It is possible to manually update subnet-id fields in
+              MySQL or PostgreSQL database, but it is awkward and error prone
+              process. A better reconfiguration support is planned.
+            </para>
+          </listitem>
+
+        <listitem>
+          <para>
+            On startup, the DHCPv6 server does not get the full configuration from
+            BIND 10.  To remedy this, after starting BIND 10, modify any parameter
+            and commit the changes, e.g.
+            <screen>
+&gt; <userinput>config show Dhcp6/renew-timer</userinput>
+Dhcp6/renew-timer      1000    integer (default)
+&gt; <userinput>config set Dhcp6/renew-timer 1001</userinput>
+&gt; <userinput>config commit</userinput></screen>
+          </para>
+        </listitem>
+        <listitem>
+          <simpara>Temporary addresses are not supported.</simpara>
+        </listitem>
+        <listitem>
+          <simpara>
+            The server will allocate, renew or rebind a maximum of one lease
+            for a particular IA option (IA_NA or IA_PD) sent by a client.
+            <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> and
+            <ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink> allow
+            for multiple addresses or prefixes to be allocated for a single IA.
+          </simpara>
+        </listitem>
+        <listitem>
+          <simpara>Temporary addresses are not supported.</simpara>
+        </listitem>
+        <listitem>
+          <simpara>
+            Confirmation (CONFIRM), duplication report (DECLINE),
+            stateless configuration (INFORMATION-REQUEST) and client
+            reconfiguration (RECONFIGURE) are not yet supported.
+          </simpara>
+        </listitem>
+          <listitem>
+            <simpara>
+              The server doesn't act upon expired leases. In particular,
+              when a lease expires, the server doesn't request removal of
+              the DNS records associated with it.
+            </simpara>
+          </listitem>
+      </itemizedlist>
+    </section>
+
+    <!--
+    <section id="dhcp6-srv-examples">
+      <title>Kea DHCPv6 server examples</title>
+
+      <para>
+        This section provides easy to use example. Each example can be read
+        separately. It is not intended to be read sequentially as there will
+        be many repetitions between examples. They are expected to serve as
+        easy to use copy-paste solutions to many common deployments.
+      </para>
+
+      @todo: add simple configuration for direct clients
+      @todo: add configuration for relayed clients
+      @todo: add client classification example
+
+    </section> -->
+
+  </chapter>
diff --git a/doc/guide/intro.xml b/doc/guide/intro.xml
new file mode 100644 (file)
index 0000000..8472bb7
--- /dev/null
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+<!ENTITY % version SYSTEM "version.ent">
+%version;
+]>
+
+  <chapter id="intro">
+    <title>Introduction</title>
+    <para>
+      Kea is the next generation of DHCP servers developed by ISC.
+      It supports both DHCPv4 and DHCPv6 protocols along with their
+      extensions, e.g. prefix delegation and dynamic updates to DNS.
+    </para>
+
+    <para>
+      Kea has been initially developed as a part of the BIND 10 framework
+      (<ulink url="http://bind10.isc.org"/>). In early 2014, ISC
+      made the decision to discontinue active development of BIND 10 and
+      continue development of Kea as standalone DHCP servers. As a result,
+      the components and libraries related to the BIND10 framework and DNS
+      are going to be removed from the Kea source tree over time.
+      In order to remove the dependency on Python 3, the BIND 10 framework
+      will be replaced by the server startup and configuration mechanisms
+      written in C++.
+    </para>
+
+    <note>
+      <simpara>Kea has been implemented in BIND 10 framework and to certain extent
+      it still depends on various BIND 10 libraries. It also requires the BIND 10
+      framework to run, because BIND 10 configuration mechanisms are used to
+      configure Kea. As a result, this document still refers to BIND 10 in many
+      paragraphs. The term "BIND 10" in the context of this document means
+      "BIND 10 libraries and applications which are necessary for Kea to run
+      and configure". The term "Kea" means "the collection of binaries and libraries
+      which, as a whole, implement the DHCP protocols".
+      </simpara>
+    </note>
+
+    <para>
+      This guide covers Kea version &__VERSION__;.
+    </para>
+
+    <section>
+      <title>Supported Platforms</title>
+      <para>
+        Kea is officially supported on RedHat Enterprise Linux,
+       CentOS, Fedora and FreeBSD systems. It is also likely to work on many
+       other platforms: builds have been tested on (in no particular order)
+        Debian GNU/Linux 6 and unstable, Ubuntu 9.10, NetBSD 5,
+        Solaris 10 and 11, FreeBSD 7 and 8, CentOS Linux 5.3,
+        MacOS 10.6 and 10.7, and OpenBSD 5.1. Non supported systems
+       (especially non-Linux) are likely to have issues with directly
+       connected DHCPv4 clients.
+      </para>
+      <para>There are currently no plans to port Kea to Windows platforms.</para>
+    </section>
+
+    <section id="required-software">
+      <title>Required Software at Run-time</title>
+
+      <para>
+        Running Kea uses various extra software which may
+        not be provided in some operating systems' default
+        installations nor standard packages collections. You may
+        need to install this required software separately.
+        (For the build requirements, also see
+        <xref linkend="build-requirements"/>.)
+      </para>
+
+      <para>
+        Kea was developed as a collection of applications within BIND
+        10 framework and it still relies on the remaining parts of
+        this framework. In particular, the servers' configuration and
+        startup are still facilitated by the modules which originate
+        in BIND 10. These modules require at least Python 3.1 to run.
+        They also work with Python 3.2, 3.3 or 3.4 (<ulink
+        url="http://www.python.org/"/>). The dependency on Python will
+        be removed once a replacing configuration and startup
+        mechanisms are developed and released as Kea 0.9. At this
+        point Kea will be written in pure C++.
+      </para>
+
+      <para>
+        Kea uses the Botan crypto library for C++
+        (<ulink url="http://botan.randombit.net/"/>).
+        It requires at least Botan version 1.8.
+<!-- @todo 0.9/#2406: Add info about OpenSSL here -->
+      </para>
+
+      <para>
+        Kea uses the log4cplus C++ logging library
+        (<ulink url="http://log4cplus.sourceforge.net/"/>).
+        It requires at least log4cplus version 1.0.3.
+      </para>
+
+      <para>
+       Kea can use MySQL headers and libraries to build MySQL database backend
+       that can be used to store leases. This is an optional dependency. When
+       it is missing, Kea will lack the ability to store leases in MySQL
+       database.
+      </para>
+
+      <para>
+       Kea can use PostgreSQL headers and libraries to build PostgreSQL
+       database backend that can be used to store leases. This is an optional
+       dependency. When it is missing, Kea will lack the ability to store
+       leases in PostgreSQL database.
+      </para>
+    </section>
+
+    <section id="starting_stopping">
+      <title>Starting and Stopping the Server</title>
+      <!-- @todo: Rewrite this section as part of #3422-->
+      <para>
+        Kea is modular.  Part of this modularity is
+        accomplished using multiple cooperating processes which, together,
+        provide the server functionality.
+      </para>
+
+      <!-- @todo: Rename processes here, once they are renamed in the source -->
+      <para>
+        At first, running many different processes may seem confusing.
+        However, these processes are started by running a single
+       command, <command>bind10</command>.  This command starts
+       a master process, <command>b10-init</command>, which will
+       start other required processes and other processes when
+       configured.  The processes that may be started have names
+       starting with "b10-", including:
+      </para>
+
+      <para>
+
+        <itemizedlist>
+
+          <listitem>
+            <simpara>
+              <command>b10-cfgmgr</command> &mdash;
+              Configuration manager.
+              This process maintains all of the configuration for BIND 10.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-cmdctl</command> &mdash;
+              Command and control service.
+              This process allows external control of the BIND 10 system.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-dhcp4</command> &mdash;
+              DHCPv4 server process.
+              This process responds to DHCPv4 queries from clients.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-dhcp6</command> &mdash;
+              DHCPv6 server process.
+              This process responds to DHCPv6 queries from clients.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-dhcp-ddns</command> &mdash;
+              DHCP-DDNS process.
+              This process acts as an intermediary between the DHCP servers
+              and DNS server. It receives name update requests from the DHCP
+              servers and sends DNS Update messages to the DNS servers.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-msgq</command> &mdash;
+              Message bus daemon.
+              This process coordinates communication between all of the other
+              BIND 10 processes.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-sockcreator</command> &mdash;
+              Socket creator daemon.
+              This process creates sockets used by
+              network-listening BIND 10 processes.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-stats</command> &mdash;
+              Statistics collection daemon.
+              This process collects and reports statistics data.
+            </simpara>
+          </listitem>
+
+          <listitem>
+            <simpara>
+              <command>b10-stats-httpd</command> &mdash;
+              HTTP server for statistics reporting.
+              This process reports statistics data in XML format over HTTP.
+            </simpara>
+          </listitem>
+
+        </itemizedlist>
+      </para>
+
+      <para>
+        These do not need to be manually started independently.
+      </para>
+
+    </section>
+
+    <section id="managing_once_running">
+      <title>Managing BIND 10</title>
+      <!-- @todo: Rewrite this section as part of #3422 -->
+
+      <para>
+        Once BIND 10 is running, a few commands are used to interact
+        directly with the system:
+        <itemizedlist>
+          <listitem>
+            <simpara>
+              <command>bindctl</command> &mdash;
+              Interactive administration interface.
+              This is a low-level command-line tool which allows
+              a developer or an experienced administrator to control
+              Kea.
+            </simpara>
+          </listitem>
+          <listitem>
+            <simpara>
+              <command>b10-cmdctl-usermgr</command> &mdash;
+              User access control.
+              This tool allows an administrator to authorize additional users
+              to manage Kea.
+            </simpara>
+          </listitem>
+  <!-- TODO usermgr -->
+        </itemizedlist>
+      </para>
+    </section>
+
+    <para>
+      The tools and modules are covered in full detail in this guide.
+<!-- TODO point to these -->
+      In addition, manual pages are also provided in the default installation.
+    </para>
+
+<!--
+bin/
+  bindctl*
+  host*
+lib/
+  libauth
+  libdns
+  libexceptions
+  python3.1/site-packages/isc/{cc,config}
+sbin/
+  bind10
+share/
+  share/bind10/
+    auth.spec
+    b10-cmdctl.pem
+    init.spec
+    passwd.csv
+  man/
+var/
+  bind10/b10-config.db
+-->
+
+    <para>
+      BIND 10 also provides libraries and programmer interfaces
+      for C++ and Python for the message bus and configuration backend,
+      and, of course, DHCP. These include detailed developer
+      documentation and code examples.
+<!-- TODO point to this -->
+    </para>
+
+  </chapter>
index cabb9d569fb1e041008e7fad4a75e8d363dbec50..cbd5d4465641c07453bcd286b76f3e4404f05add 100644 (file)
 
   </bookinfo>
 
-  <chapter id="intro">
-    <title>Introduction</title>
-    <para>
-      Kea is the next generation of DHCP servers developed by ISC.
-      It supports both DHCPv4 and DHCPv6 protocols along with their
-      extensions, e.g. prefix delegation and dynamic updates to DNS.
-    </para>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="intro.xml" />
 
-    <para>
-      Kea has been initially developed as a part of the BIND 10 framework
-      (<ulink url="http://bind10.isc.org"/>). In early 2014, ISC
-      made the decision to discontinue active development of BIND 10 and
-      continue development of Kea as standalone DHCP servers. As a result,
-      the components and libraries related to the BIND10 framework and DNS
-      are going to be removed from the Kea source tree over time.
-      In order to remove the dependency on Python 3, the BIND 10 framework
-      will be replaced by the server startup and configuration mechanisms
-      written in C++.
-    </para>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="quickstart.xml" />
 
-    <note>
-      <simpara>Kea has been implemented in BIND 10 framework and to certain extent
-      it still depends on various BIND 10 libraries. It also requires the BIND 10
-      framework to run, because BIND 10 configuration mechanisms are used to
-      configure Kea. As a result, this document still refers to BIND 10 in many
-      paragraphs. The term "BIND 10" in the context of this document means
-      "BIND 10 libraries and applications which are necessary for Kea to run
-      and configure". The term "Kea" means "the collection of binaries and libraries
-      which, as a whole, implement the DHCP protocols".
-      </simpara>
-    </note>
-
-    <para>
-      This guide covers Kea version &__VERSION__;.
-    </para>
-
-    <section>
-      <title>Supported Platforms</title>
-      <para>
-        Kea is officially supported on RedHat Enterprise Linux,
-       CentOS, Fedora and FreeBSD systems. It is also likely to work on many
-       other platforms: builds have been tested on (in no particular order)
-        Debian GNU/Linux 6 and unstable, Ubuntu 9.10, NetBSD 5,
-        Solaris 10 and 11, FreeBSD 7 and 8, CentOS Linux 5.3,
-        MacOS 10.6 and 10.7, and OpenBSD 5.1. Non supported systems
-       (especially non-Linux) are likely to have issues with directly
-       connected DHCPv4 clients.
-      </para>
-      <para>There are currently no plans to port Kea to Windows platforms.</para>
-    </section>
-
-    <section id="required-software">
-      <title>Required Software at Run-time</title>
-
-      <para>
-        Running Kea uses various extra software which may
-        not be provided in some operating systems' default
-        installations nor standard packages collections. You may
-        need to install this required software separately.
-        (For the build requirements, also see
-        <xref linkend="build-requirements"/>.)
-      </para>
-
-      <para>
-        Kea was developed as a collection of applications within BIND
-        10 framework and it still relies on the remaining parts of
-        this framework. In particular, the servers' configuration and
-        startup are still facilitated by the modules which originate
-        in BIND 10. These modules require at least Python 3.1 to run.
-        They also work with Python 3.2, 3.3 or 3.4 (<ulink
-        url="http://www.python.org/"/>). The dependency on Python will
-        be removed once a replacing configuration and startup
-        mechanisms are developed and released as Kea 0.9. At this
-        point Kea will be written in pure C++.
-      </para>
-
-      <para>
-        Kea uses the Botan crypto library for C++
-        (<ulink url="http://botan.randombit.net/"/>).
-        It requires at least Botan version 1.8.
-<!-- @todo 0.9/#2406: Add info about OpenSSL here -->
-      </para>
-
-      <para>
-        Kea uses the log4cplus C++ logging library
-        (<ulink url="http://log4cplus.sourceforge.net/"/>).
-        It requires at least log4cplus version 1.0.3.
-      </para>
-
-      <para>
-       Kea can use MySQL headers and libraries to build MySQL database backend
-       that can be used to store leases. This is an optional dependency. When
-       it is missing, Kea will lack the ability to store leases in MySQL
-       database.
-      </para>
-
-      <para>
-       Kea can use PostgreSQL headers and libraries to build PostgreSQL
-       database backend that can be used to store leases. This is an optional
-       dependency. When it is missing, Kea will lack the ability to store
-       leases in PostgreSQL database.
-      </para>
-    </section>
-
-    <section id="starting_stopping">
-      <title>Starting and Stopping the Server</title>
-      <!-- @todo: Rewrite this section as part of #3422-->
-      <para>
-        Kea is modular.  Part of this modularity is
-        accomplished using multiple cooperating processes which, together,
-        provide the server functionality.
-      </para>
-
-      <!-- @todo: Rename processes here, once they are renamed in the source -->
-      <para>
-        At first, running many different processes may seem confusing.
-        However, these processes are started by running a single
-       command, <command>bind10</command>.  This command starts
-       a master process, <command>b10-init</command>, which will
-       start other required processes and other processes when
-       configured.  The processes that may be started have names
-       starting with "b10-", including:
-      </para>
-
-      <para>
-
-        <itemizedlist>
-
-          <listitem>
-            <simpara>
-              <command>b10-cfgmgr</command> &mdash;
-              Configuration manager.
-              This process maintains all of the configuration for BIND 10.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-cmdctl</command> &mdash;
-              Command and control service.
-              This process allows external control of the BIND 10 system.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-dhcp4</command> &mdash;
-              DHCPv4 server process.
-              This process responds to DHCPv4 queries from clients.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-dhcp6</command> &mdash;
-              DHCPv6 server process.
-              This process responds to DHCPv6 queries from clients.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-dhcp-ddns</command> &mdash;
-              DHCP-DDNS process.
-              This process acts as an intermediary between the DHCP servers
-              and DNS server. It receives name update requests from the DHCP
-              servers and sends DNS Update messages to the DNS servers.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-msgq</command> &mdash;
-              Message bus daemon.
-              This process coordinates communication between all of the other
-              BIND 10 processes.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-sockcreator</command> &mdash;
-              Socket creator daemon.
-              This process creates sockets used by
-              network-listening BIND 10 processes.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-stats</command> &mdash;
-              Statistics collection daemon.
-              This process collects and reports statistics data.
-            </simpara>
-          </listitem>
-
-          <listitem>
-            <simpara>
-              <command>b10-stats-httpd</command> &mdash;
-              HTTP server for statistics reporting.
-              This process reports statistics data in XML format over HTTP.
-            </simpara>
-          </listitem>
-
-        </itemizedlist>
-      </para>
-
-      <para>
-        These do not need to be manually started independently.
-      </para>
-
-    </section>
-
-    <section id="managing_once_running">
-      <title>Managing BIND 10</title>
-      <!-- @todo: Rewrite this section as part of #3422 -->
-
-      <para>
-        Once BIND 10 is running, a few commands are used to interact
-        directly with the system:
-        <itemizedlist>
-          <listitem>
-            <simpara>
-              <command>bindctl</command> &mdash;
-              Interactive administration interface.
-              This is a low-level command-line tool which allows
-              a developer or an experienced administrator to control
-              Kea.
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>b10-cmdctl-usermgr</command> &mdash;
-              User access control.
-              This tool allows an administrator to authorize additional users
-              to manage Kea.
-            </simpara>
-          </listitem>
-  <!-- TODO usermgr -->
-        </itemizedlist>
-      </para>
-    </section>
-
-    <para>
-      The tools and modules are covered in full detail in this guide.
-<!-- TODO point to these -->
-      In addition, manual pages are also provided in the default installation.
-    </para>
-
-<!--
-bin/
-  bindctl*
-  host*
-lib/
-  libauth
-  libdns
-  libexceptions
-  python3.1/site-packages/isc/{cc,config}
-sbin/
-  bind10
-share/
-  share/bind10/
-    auth.spec
-    b10-cmdctl.pem
-    init.spec
-    passwd.csv
-  man/
-var/
-  bind10/b10-config.db
--->
-
-    <para>
-      BIND 10 also provides libraries and programmer interfaces
-      for C++ and Python for the message bus and configuration backend,
-      and, of course, DHCP. These include detailed developer
-      documentation and code examples.
-<!-- TODO point to this -->
-    </para>
-
-  </chapter>
-
-  <chapter id="quickstart">
-    <title>Quick start</title>
-
-    <para>
-        This quickly covers the standard steps for installing and deploying Kea.
-        For further details, full customizations, and troubleshooting, see the
-        respective chapters in the Kea guide.
-    </para>
-
-    <section id="quick-start">
-      <title>Quick start guide for DHCPv4 and DHCPv6 services</title>
-
-      <orderedlist>
-
-        <listitem>
-          <simpara>
-            Install required run-time and build dependencies. See <xref
-           linkend="build-requirements"/> for details.
-          </simpara>
-        </listitem>
-
-        <!-- We may need to replace it with the link to a downloadable tarball
-        once we have it. -->
-        <listitem>
-          <simpara>
-            Checkout the latest Kea revision from the Git repository:
-            <screen>$ <userinput>git clone git://git.kea.isc.org/kea</userinput> </screen>
-          </simpara>
-        </listitem>
-
-        <listitem>
-          <para>Go into the source and run configure:
-            <screen>$ <userinput>cd kea</userinput>
-$ <userinput>autoreconf --install</userinput>
-$ <userinput>./configure [your extra parameters]</userinput></screen>
-          </para>
-        </listitem>
-
-        <listitem>
-          <para>Build it:
-            <screen>$ <userinput>make</userinput></screen>
-          </para>
-        </listitem>
-
-        <listitem>
-          <para>Install it as root (by default to prefix
-          <filename>/usr/local/</filename>):
-            <screen>$ <userinput>make install</userinput></screen>
-          </para>
-        </listitem>
-
-        <listitem>
-          <para>Edit your configuration file for DHCPv4. See doc/examples/kea4
-         for a set of examples.
-         </para>
-       </listitem>
-
-        <listitem>
-          <para>Start Kea DHCPv4 server (as root):
-            <screen># <userinput>b10-dhcp4 -c /path/to/your/kea4/config/file.json</userinput></screen>
-          </para>
-        </listitem>
-
-        <listitem>
-         <para>Test it; for example, use the
-         <ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
-         to send DHCPv4 queries to the server and verify that the client receives a
-         configuration from the server:
-            <screen>$ <userinput>dhclient -4 eth0</userinput></screen>
-         </para>
-        </listitem>
-
-        <listitem>
-          <para>Edit your configuration file for DHCPv6. See doc/examples/kea6
-         for a set of examples.
-         </para>
-       </listitem>
-
-        <listitem>
-          <para>Start Kea DHCPv6 server (as root):
-            <screen># <userinput>b10-dhcp6 -c /path/to/your/kea6/config/file.json</userinput></screen>
-          </para>
-        </listitem>
-
-        <listitem>
-         <para>Test it; for example, use the
-         <ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
-         to send DHCPv6 queries to the server and verify that the client receives a
-         configuration from the server:
-            <screen>$ <userinput>dhclient -6 eth0</userinput></screen>
-         </para>
-        </listitem>
-
-
-      </orderedlist>
-
-    </section>
-
-  </chapter>
-
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="install.xml" />
-
-  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="config.xml" />
-
-  <chapter id="dhcp4">
-    <title>The DHCPv4 Server</title>
-
-    <section id="dhcp4-start-stop">
-      <title>Starting and Stopping the DHCPv4 Server</title>
-
-      <para>
-        <command>b10-dhcp4</command> is the Kea DHCPv4 server and is configured
-        through the <command>bindctl</command> program.
-      </para>
-      <para>
-        After starting <command>bind10</command> and entering bindctl, the first step
-        in configuring the server is to add it to the list of running services.
-<screen>
-&gt; <userinput>config add Init/components b10-dhcp4</userinput>
-&gt; <userinput>config set Init/components/b10-dhcp4/kind dispensable</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      <para>
-         To remove <command>b10-dhcp4</command> from the set of running services,
-         the <command>b10-dhcp4</command> is removed from list of Init components:
-<screen>
-&gt; <userinput>config remove Init/components b10-dhcp4</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      <para>
-        Note that the server was only removed from the list, so BIND10 will not
-        restart it, but the server itself is still running. Hence it is usually
-        desired to stop it:
-<screen>
-&gt; <userinput>Dhcp4 shutdown</userinput>
-</screen>
-      </para>
-
-      <para>
-        On start-up, the server will detect available network interfaces
-        and will attempt to open UDP sockets on all interfaces that
-        are up, running, are not loopback, and have IPv4 address
-        assigned.
-
-        The server will then listen to incoming traffic. Currently
-        supported client messages are DISCOVER and REQUEST. The server
-        will respond to them with OFFER and ACK, respectively.
-
-        Since the DHCPv4 server opens privileged ports, it requires root
-        access. Make sure you run this daemon as root.
-      </para>
-
-    </section>
-
-    <section id="dhcp4-configuration">
-      <title>Configuring the DHCPv4 Server</title>
-      <para>
-        Once the server is started, it can be configured. To view the
-        current configuration, use the following command in <command>bindctl</command>:
-        <screen>
-&gt; <userinput>config show Dhcp4</userinput></screen>
-        When starting the DHCPv4 daemon for the first time, the default configuration
-        will be available. It will look similar to this:
-<screen>
-&gt; <userinput>config show Dhcp4</userinput>
-Dhcp4/hooks-libraries  []      list    (default)
-Dhcp4/interfaces/      list
-Dhcp4/renew-timer      1800    integer
-Dhcp4/rebind-timer     2000    integer (default)
-Dhcp4/valid-lifetime   4000    integer (default)
-Dhcp4/next-server      ""      string  (default)
-Dhcp4/echo-client-id   true    boolean (default)
-Dhcp4/option-def       []      list    (default)
-Dhcp4/option-data      []      list    (default)
-Dhcp4/lease-database/type      ""      string  (default)
-Dhcp4/lease-database/name      ""      string  (default)
-Dhcp4/lease-database/user      ""      string  (default)
-Dhcp4/lease-database/host      ""      string  (default)
-Dhcp4/lease-database/password  ""      string  (default)
-Dhcp4/subnet4/ list
-Dhcp4/dhcp-ddns/enable-updates true    boolean
-Dhcp4/dhcp-ddns/server-ip      "127.0.0.1"     string
-Dhcp4/dhcp-ddns/server-port    53001   integer
-Dhcp4/dhcp-ddns/sender-ip      ""      string
-Dhcp4/dhcp-ddns/sender-port    0       integer
-Dhcp4/dhcp-ddns/max-queue-size 1024    integer
-Dhcp4/dhcp-ddns/ncr-protocol   "UDP"   string
-Dhcp4/dhcp-ddns/ncr-format     "JSON"  string
-Dhcp4/dhcp-ddns/override-no-update     false   boolean
-Dhcp4/dhcp-ddns/override-client-update false   boolean
-Dhcp4/dhcp-ddns/replace-client-name    false   boolean
-Dhcp4/dhcp-ddns/generated-prefix       "myhost"        string
-Dhcp4/dhcp-ddns/qualifying-suffix      "example.com"   string
-</screen>
-      </para>
-
-      <para>
-        To change one of the parameters, simply follow
-        the usual <command>bindctl</command> procedure. For example, to make the
-        leases longer, change their valid-lifetime parameter:
-        <screen>
-&gt; <userinput>config set Dhcp4/valid-lifetime 7200</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Please note that most Dhcp4 parameters are of global scope
-        and apply to all defined subnets, unless they are overridden on a
-        per-subnet basis.
-      </para>
-      <para>
-        The renew-timer and rebind-timer are optional. If they are not specified,
-        the DHCPv4 options 58 and 59 are not sent in the server's response to the
-        client.
-      </para>
-
-      <section>
-      <title>Default storage for leases</title>
-      <para>
-        The server is able to store lease data in different repositories. Larger deployments
-        may elect to store leases in a database.
-        <xref linkend="database-configuration4"/> describes one way to do it.
-        By default, the server will use a CSV file rather than a database to store
-        lease information. One of the advantages of using a file is that it eliminates
-        dependency on third party database software.
-      </para>
-      <para>
-        The configuration of the file backend (Memfile)
-        is controlled through the Dhcp4/lease-database parameters. When default
-        parameters are used, the Memfile backend will write leases to a disk in the
-        [bind10-install-dir]/var/bind10/kea-leases4.csv.
-      </para>
-      <para>
-        It is possible to alter the default location of the lease file. The following
-        configuration:
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/type "memfile"</userinput>
-&gt; <userinput>config set Dhcp4/lease-database/persist true</userinput>
-&gt; <userinput>config set Dhcp4/lease-database/name "/tmp/kea-leases4.csv"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-        will change the default location of the lease file to /tmp/kea-leases4.csv.
-      </para>
-      <para>
-        The "persist" parameter controls whether the leases are written to disk.
-        It is strongly recommended that this parameter is set to "true" at all times
-        during the normal operation of the server
-      </para>
-      </section>
-
-      <section id="database-configuration4">
-      <title>Database Configuration</title>
-      <para>
-      All leases issued by the server are stored in the lease database.  Currently
-      there are 3 database backends available: MySQL, PostgreSQL and memfile.
-      <footnote>
-      <para>
-      The server comes with an in-memory database ("memfile") configured as the default
-      database. This is used for internal testing and is not supported.  In addition,
-      it does not store lease information on disk: lease information will be lost if the
-      server is restarted.
-      </para>
-      </footnote>, and so the server must be configured to
-      access the correct database with the appropriate credentials.
-      </para>
-        <note>
-            <para>
-            Database access information must be configured for the DHCPv4 server, even if
-            it has already been configured for the DHCPv6 server.  The servers store their
-            information independently, so each server can use a separate
-            database or both servers can use the same database.
-            </para>
-        </note>
-      <para>
-      Database configuration is controlled through the Dhcp4/lease-database parameters.
-      The type of the database must be set to "mysql", "postgresql" or "memfile":
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/type "mysql"</userinput>
-</screen>
-      Next, the name of the database is to hold the leases must be set: this is the
-      name used when the lease database was created (see <xref linkend="dhcp-mysql-database-create"/>
-      or <xref linkend="dhcp-pgsql-database-create"/>).
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/name "<replaceable>database-name</replaceable>"</userinput>
-</screen>
-      If the database is located on a different system to the DHCPv4 server, the
-      database host name must also be specified (although note that this configuration
-      may have a severe impact on server performance):
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/host "<replaceable>remote-host-name</replaceable>"</userinput>
-</screen>
-      The usual state of affairs will be to have the database on the same machine as the
-      DHCPv4 server.  In this case, set the value to the empty string (this is the default):
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/host ""</userinput>
-</screen>
-      </para>
-      <para>
-      Finally, the credentials of the account under which the server will access the database
-      should be set:
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/user "<replaceable>user-name</replaceable>"</userinput>
-&gt; <userinput>config set Dhcp4/lease-database/password "<replaceable>password</replaceable>"</userinput>
-</screen>
-      If there is no password to the account, set the password to the empty string "". (This is also the default.)
-      </para>
-      <note>
-      <para>The password is echoed when entered and is stored in clear text in the configuration
-      database.  Improved password security will be added in a future version of Kea.</para>
-      </note>
-      </section>
-
-      <section id="dhcp4-interface-selection">
-      <title>Interface selection</title>
-      <para>
-        When DHCPv4 server starts up, by default it will listen to the DHCP
-        traffic and respond to it on all interfaces detected during startup.
-        However, in many cases it is desired to configure the server to listen and
-        respond on selected interfaces only. The sample commands in this section
-        show how to make interface selection using bindctl.
-      </para>
-      <para>
-        The default configuration can be presented with the following command:
-        <screen>
-&gt; <userinput>config show Dhcp4/interfaces</userinput>
-<userinput>Dhcp4/interfaces[0] "*" string</userinput></screen>
-        An asterisk sign plays a role of the wildcard and means "listen on all interfaces".
-      </para>
-      <para>
-        In order to override the default configuration, the existing entry can be replaced
-        with the actual interface name:
-        <screen>
-&gt; <userinput>config set Dhcp4/interfaces[0] eth1</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Other interface names can be added on one-by-one basis:
-        <screen>
-&gt; <userinput>config add Dhcp4/interfaces eth2</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Configuration will now contain two interfaces which can be presented as follows:
-        <screen>
-&gt; <userinput>config show Dhcp4/interfaces</userinput>
-<userinput>Dhcp4/interfaces[0] "eth1"  string</userinput>
-<userinput>Dhcp4/interfaces[1] "eth2"  string</userinput></screen>
-        When configuration gets committed, the server will start to listen on
-        eth1 and eth2 interfaces only.
-      </para>
-      <para>
-        It is possible to use wildcard interface name (asterisk) concurrently with explicit
-        interface names:
-        <screen>
-&gt; <userinput>config add Dhcp4/interfaces *</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        This will result in the following configuration:
-        <screen>
-&gt; <userinput>config show Dhcp4/interfaces</userinput>
-<userinput>Dhcp4/interfaces[0] "eth1"  string</userinput>
-<userinput>Dhcp4/interfaces[1] "eth2"  string</userinput>
-<userinput>Dhcp4/interfaces[2] "*"     string</userinput></screen>
-        The presence of the wildcard name implies that server will listen on all interfaces.
-        In order to fall back to the previous configuration when server listens on eth1 and eth2:
-        <screen>
-&gt; <userinput>config remove Dhcp4/interfaces[2]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-      </section>
-
-      <section id="ipv4-subnet-id">
-      <title>IPv4 Subnet Identifier</title>
-      <para>
-        Subnet identifier is a unique number associated with a particular subnet.
-        In principle, it is used to associate clients' leases with respective subnets.
-        When subnet identifier is not specified for a subnet being configured, it will
-        be automatically assigned by the configuration mechanism. The identifiers
-        are assigned from 1 and are monotonically increased for each subsequent
-        subnet: 1, 2, 3 ....
-      </para>
-      <para>
-       If there are multiple subnets configured with auto-generated identifiers and
-       one of them is removed, the subnet identifiers may be renumbered. For example:
-       if there are 4 subnets and 3rd is removed the last subnet will be assigned
-       identifier that the 3rd subnet had before removal. As a result, the leases
-       stored in the lease database for subnet 3 are now associated with the
-       subnet 4, which may have unexpected consequences. In the future it is planned
-       to implement the mechanism to preserve auto-generated subnet ids upon removal
-       of one of the subnets. Currently, the only remedy for this issue is to
-       manually specify the unique subnet identifier for each subnet.
-      </para>
-      <para>
-        The following configuration:
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/id 1024</userinput>
-&gt; <userinput>config commit</userinput>
-        </screen>
-        will assign the arbitrary subnet identifier to the newly configured subnet.
-        This identifier will not change for this subnet until "id" parameter is
-        removed or set to 0. The value of 0 forces auto-generation of subnet
-        identifier.
-      </para>
-      </section>
-
-      <section id="dhcp4-address-config">
-      <title>Configuration of IPv4 Address Pools</title>
-      <para>
-        The essential role of DHCPv4 server is address assignment. The server
-        has to be configured with at least one subnet and one pool of dynamic
-        addresses to be managed. For example, assume that the server
-        is connected to a network segment that uses the 192.0.2.0/24
-        prefix. The Administrator of that network has decided that addresses from range
-        192.0.2.10 to 192.0.2.20 are going to be managed by the Dhcp4
-        server. Such a configuration can be achieved in the following way:
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Note that subnet is defined as a simple string, but the pool parameter
-        is actually a list of pools: for this reason, the pool definition is
-        enclosed in square brackets, even though only one range of addresses
-        is specified.</para>
-        <para>It is possible to define more than one pool in a
-        subnet: continuing the previous example, further assume that
-        192.0.2.64/26 should be also be managed by the server. It could be written as
-        192.0.2.64 to 192.0.2.127. Alternatively, it can be expressed more simply as
-        192.0.2.64/26. Both formats are supported by Dhcp4 and can be mixed in the pool list.
-        For example, one could define the following pools:
-        <screen>
-&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10-192.0.2.20", "192.0.2.64/26" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        The number of pools is not limited, but for performance reasons it is recommended to
-        use as few as possible. Space and tabulations in pool definitions are ignored, so
-        spaces before and after hyphen are optional. They can be used to improve readability.
-      </para>
-      <para>
-         The server may be configured to serve more than one subnet. To add a second subnet,
-         use a command similar to the following:
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[1]/subnet "192.0.3.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[1]/pool [ "192.0.3.0/24" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Arrays are counted from 0. subnet[0] refers to the subnet defined in the
-        previous example.  The <command>config add Dhcp4/subnet4</command> command adds
-        another (second) subnet. It can be referred to as
-        <command>Dhcp4/subnet4[1]</command>. In this example, we allow server to
-        dynamically assign all addresses available in the whole subnet.
-      </para>
-      <para>
-        When configuring a DHCPv4 server using prefix/length notation, please pay
-        attention to the boundary values. When specifying that the server should use
-        a given pool, it will be able to allocate also first (typically network
-        address) and the last (typically broadcast address) address from that pool.
-        In the aforementioned example of pool 192.0.3.0/24, both 192.0.3.0 and
-        192.0.3.255 addresses may be assigned as well. This may be invalid in some
-        network configurations. If you want to avoid this, please use the "min-max" notation.
-      </para>
-      </section>
-
-    <section id="dhcp4-std-options">
-      <title>Standard DHCPv4 options</title>
-      <para>
-        One of the major features of DHCPv4 server is to provide configuration
-        options to clients. Although there are several options that require
-        special behavior, most options are sent by the server only if the client
-        explicitly requested them.  The following example shows how to
-        configure DNS servers, which is one of the most frequently used
-        options. Options specified in this way are considered global and apply
-        to all configured subnets.
-
-        <screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "domain-name-servers"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 6</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.3.1, 192.0.3.2"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-    <para>
-      The first line creates new entry in option-data table. It
-      contains information on all global options that the server is
-      supposed to configure in all subnets. The second line specifies
-      option name. For a complete list of currently supported names,
-      see <xref linkend="dhcp4-std-options-list"/> below.
-      The third line specifies option code, which must match one of the
-      values from that list. Line 4 specifies option space, which must always
-      be set to "dhcp4" as these are standard DHCPv4 options. For
-      other option spaces, including custom option spaces, see <xref
-      linkend="dhcp4-option-spaces"/>. The fifth line specifies the format in
-      which the data will be entered: use of CSV (comma
-      separated values) is recommended. The sixth line gives the actual value to
-      be sent to clients. Data is specified as a normal text, with
-      values separated by commas if more than one value is
-      allowed.
-    </para>
-
-    <para>
-      Options can also be configured as hexadecimal values. If csv-format is
-      set to false, option data must be specified as a hex string. The
-      following commands configure the domain-name-servers option for all
-      subnets with the following addresses: 192.0.3.1 and 192.0.3.2.
-      Note that csv-format is set to false.
-      <screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "domain-name-servers"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 6</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format false</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "C0 00 03 01 C0 00 03 02"</userinput>
-&gt; <userinput>config commit</userinput>
-        </screen>
-      </para>
-
-      <para>
-        It is possible to override options on a per-subnet basis.  If
-        clients connected to most of your subnets are expected to get the
-        same values of a given option, you should use global options: you
-        can then override specific values for a small number of subnets.
-        On the other hand, if you use different values in each subnet,
-        it does not make sense to specify global option values
-        (Dhcp4/option-data), rather you should set only subnet-specific values
-        (Dhcp4/subnet[X]/option-data[Y]).
-      </para>
-      <para>
-        The following commands override the global
-        DNS servers option for a particular subnet, setting a single DNS
-        server with address 192.0.2.3.
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4[0]/option-data</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/name "domain-name-servers"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/code 6</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/option-data[0]/data "192.0.2.3"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <note>
-        <para>In a future version of Kea, it will not be necessary to specify
-        the option code, space and csv-format fields as they will be set
-        automatically.</para>
-      </note>
-
-      <para>
-        The currently supported standard DHCPv4 options are
-        listed in <xref linkend="dhcp4-std-options-list"/>
-        and <xref linkend="dhcp4-std-options-list-part2"/>.
-        The "Name" and "Code"
-        are the values that should be used as a name in the option-data
-        structures. "Type" designates the format of the data: the meanings of
-        the various types is given in <xref linkend="dhcp-types"/>.
-      </para>
-      <para>
-        Some options are designated as arrays, which means that more than one
-        value is allowed in such an option. For example the option time-servers
-        allows the specification of more than one IPv4 address, so allowing
-        clients to obtain the the addresses of multiple NTP servers.
-      </para>
-      <!-- @todo: describe record types -->
-
-      <para>
-        The <xref linkend="dhcp4-custom-options"/> describes the configuration
-        syntax to create custom option definitions (formats). It is generally not
-        allowed to create custom definitions for standard options, even if the
-        definition being created matches the actual option format defined in the
-        RFCs. There is an exception from this rule for standard options for which
-        Kea does not provide a definition yet. In order to use such options,
-        a server administrator must create a definition as described in
-        <xref linkend="dhcp4-custom-options"/> in the 'dhcp4' option space. This
-        definition should match the option format described in the relevant
-        RFC but configuration mechanism would allow any option format as it has
-        no means to validate it at the moment.
-      </para>
-
-      <para>
-        <table frame="all" id="dhcp4-std-options-list">
-          <title>List of standard DHCPv4 options</title>
-          <tgroup cols='4'>
-          <colspec colname='name'/>
-          <colspec colname='code'/>
-          <colspec colname='type'/>
-          <colspec colname='array'/>
-          <thead>
-            <row>
-              <entry>Name</entry>
-              <entry>Code</entry>
-              <entry>Type</entry>
-              <entry>Array?</entry>
-            </row>
-          </thead>
-          <tbody>
-<row><entry>subnet-mask</entry><entry>1</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>time-offset</entry><entry>2</entry><entry>int32</entry><entry>false</entry></row>
-<row><entry>routers</entry><entry>3</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>time-servers</entry><entry>4</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>name-servers</entry><entry>5</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>domain-name-servers</entry><entry>6</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>log-servers</entry><entry>7</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>cookie-servers</entry><entry>8</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>lpr-servers</entry><entry>9</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>impress-servers</entry><entry>10</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>resource-location-servers</entry><entry>11</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>host-name</entry><entry>12</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>boot-size</entry><entry>13</entry><entry>uint16</entry><entry>false</entry></row>
-<row><entry>merit-dump</entry><entry>14</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>domain-name</entry><entry>15</entry><entry>fqdn</entry><entry>false</entry></row>
-<row><entry>swap-server</entry><entry>16</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>root-path</entry><entry>17</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>extensions-path</entry><entry>18</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>ip-forwarding</entry><entry>19</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>non-local-source-routing</entry><entry>20</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>policy-filter</entry><entry>21</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>max-dgram-reassembly</entry><entry>22</entry><entry>uint16</entry><entry>false</entry></row>
-<row><entry>default-ip-ttl</entry><entry>23</entry><entry>uint8</entry><entry>false</entry></row>
-<row><entry>path-mtu-aging-timeout</entry><entry>24</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>path-mtu-plateau-table</entry><entry>25</entry><entry>uint16</entry><entry>true</entry></row>
-<row><entry>interface-mtu</entry><entry>26</entry><entry>uint16</entry><entry>false</entry></row>
-<row><entry>all-subnets-local</entry><entry>27</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>broadcast-address</entry><entry>28</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>perform-mask-discovery</entry><entry>29</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>mask-supplier</entry><entry>30</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>router-discovery</entry><entry>31</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>router-solicitation-address</entry><entry>32</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>static-routes</entry><entry>33</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>trailer-encapsulation</entry><entry>34</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>arp-cache-timeout</entry><entry>35</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>ieee802-3-encapsulation</entry><entry>36</entry><entry>boolean</entry><entry>false</entry></row>
-<row><entry>default-tcp-ttl</entry><entry>37</entry><entry>uint8</entry><entry>false</entry></row>
-<row><entry>tcp-keepalive-internal</entry><entry>38</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>tcp-keepalive-garbage</entry><entry>39</entry><entry>boolean</entry><entry>false</entry></row>
-
-          </tbody>
-          </tgroup>
-        </table>
-      </para>
-
-      <para>
-        <table frame="all" id="dhcp4-std-options-list-part2">
-          <title>List of standard DHCPv4 options (continued)</title>
-          <tgroup cols='4'>
-          <colspec colname='name'/>
-          <colspec colname='code'/>
-          <colspec colname='type'/>
-          <colspec colname='array'/>
-          <thead>
-            <row>
-              <entry>Name</entry>
-              <entry>Code</entry>
-              <entry>Type</entry>
-              <entry>Array?</entry>
-            </row>
-          </thead>
-          <tbody>
-
-<row><entry>nis-domain</entry><entry>40</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>nis-servers</entry><entry>41</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>ntp-servers</entry><entry>42</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>vendor-encapsulated-options</entry><entry>43</entry><entry>empty</entry><entry>false</entry></row>
-<row><entry>netbios-name-servers</entry><entry>44</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>netbios-dd-server</entry><entry>45</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>netbios-node-type</entry><entry>46</entry><entry>uint8</entry><entry>false</entry></row>
-<row><entry>netbios-scope</entry><entry>47</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>font-servers</entry><entry>48</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>x-display-manager</entry><entry>49</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>dhcp-requested-address</entry><entry>50</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<!-- Lease time should not be configured by a user.
-<row><entry>dhcp-lease-time</entry><entry>51</entry><entry>uint32</entry><entry>false</entry></row>
--->
-<row><entry>dhcp-option-overload</entry><entry>52</entry><entry>uint8</entry><entry>false</entry></row>
-<!-- Message Type, Server Identifier and Parameter Request List should not be configured by a user.
-<row><entry>dhcp-message-type</entry><entry>53</entry><entry>uint8</entry><entry>false</entry></row>
-<row><entry>dhcp-server-identifier</entry><entry>54</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>dhcp-parameter-request-list</entry><entry>55</entry><entry>uint8</entry><entry>true</entry></row>
--->
-<row><entry>dhcp-message</entry><entry>56</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>dhcp-max-message-size</entry><entry>57</entry><entry>uint16</entry><entry>false</entry></row>
-<!-- Renewal and rebinding time should not be configured by a user.
-<row><entry>dhcp-renewal-time</entry><entry>58</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>dhcp-rebinding-time</entry><entry>59</entry><entry>uint32</entry><entry>false</entry></row>
--->
-<row><entry>vendor-class-identifier</entry><entry>60</entry><entry>binary</entry><entry>false</entry></row>
-<!-- Client identifier should not be configured by a user.
-<row><entry>dhcp-client-identifier</entry><entry>61</entry><entry>binary</entry><entry>false</entry></row>
--->
-<row><entry>nwip-domain-name</entry><entry>62</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>nwip-suboptions</entry><entry>63</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>tftp-server-name</entry><entry>66</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>boot-file-name</entry><entry>67</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>user-class</entry><entry>77</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>fqdn</entry><entry>81</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>dhcp-agent-options</entry><entry>82</entry><entry>empty</entry><entry>false</entry></row>
-<row><entry>authenticate</entry><entry>90</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>client-last-transaction-time</entry><entry>91</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>associated-ip</entry><entry>92</entry><entry>ipv4-address</entry><entry>true</entry></row>
-<row><entry>subnet-selection</entry><entry>118</entry><entry>ipv4-address</entry><entry>false</entry></row>
-<row><entry>domain-search</entry><entry>119</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>vivco-suboptions</entry><entry>124</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>vivso-suboptions</entry><entry>125</entry><entry>binary</entry><entry>false</entry></row>
-          </tbody>
-          </tgroup>
-        </table>
-
-      </para>
-      <para>
-        <table frame="all" id="dhcp-types">
-          <title>List of standard DHCP option types</title>
-          <tgroup cols='2'>
-          <colspec colname='name'/>
-          <colspec colname='meaning'/>
-          <thead>
-            <row><entry>Name</entry><entry>Meaning</entry></row>
-          </thead>
-          <tbody>
-            <row><entry>binary</entry><entry>An arbitrary string of bytes, specified as a set of hexadecimal digits.</entry></row>
-            <row><entry>boolean</entry><entry>Boolean value with allowed values true or false</entry></row>
-            <row><entry>empty</entry><entry>No value, data is carried in suboptions</entry></row>
-            <row><entry>fqdn</entry><entry>Fully qualified domain name (e.g. www.example.com)</entry></row>
-            <row><entry>ipv4-address</entry><entry>IPv4 address in the usual dotted-decimal notation (e.g. 192.0.2.1)</entry></row>
-            <row><entry>ipv6-address</entry><entry>IPv6 address in the usual colon notation (e.g. 2001:db8::1)</entry></row>
-            <row><entry>record</entry><entry>Structured data that may comprise any types (except "record" and "empty")</entry></row>
-            <row><entry>string</entry><entry>Any text</entry></row>
-            <row><entry>uint8</entry><entry>8 bit unsigned integer with allowed values 0 to 255</entry></row>
-            <row><entry>uint16</entry><entry>16 bit unsinged integer with allowed values 0 to 65535</entry></row>
-            <row><entry>uint32</entry><entry>32 bit unsigned integer with allowed values 0 to 4294967295</entry></row>
-          </tbody>
-          </tgroup>
-       </table>
-      </para>
-    </section>
-
-    <section id="dhcp4-custom-options">
-      <title>Custom DHCPv4 options</title>
-      <para>It is also possible to define options other than the standard ones.
-      Assume that we want to define a new DHCPv4 option called "foo" which will have
-      code 222 and will convey a single unsigned 32 bit integer value. We can define
-      such an option by using the following commands:
-      <screen>
-&gt; <userinput>config add Dhcp4/option-def</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/code 222</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/type "uint32"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      The "false" value of the "array" parameter determines that the option
-      does NOT comprise an array of "uint32" values but rather a single value.
-      Two other parameters have been left blank: "record-types" and "encapsulate".
-      The former specifies the comma separated list of option data fields if the
-      option comprises a record of data fields. The "record-fields" value should
-      be non-empty if the "type" is set to "record". Otherwise it must be left
-      blank. The latter parameter specifies the name of the option space being
-      encapsulated by the particular option. If the particular option does not
-      encapsulate any option space it should be left blank.
-      Note that the above set of comments define the format of the new option and do not
-      set its values.
-      </para>
-      <note>
-        <para>
-          In the current release the default values are not propagated to the
-          parser when the new configuration is being set. Therefore, all
-          parameters must be specified at all times, even if their values are
-          left blank.
-        </para>
-      </note>
-
-      <para>Once the new option format is defined, its value is set
-      in the same way as for a standard option. For example the following
-      commands set a global value that applies to all subnets.
-        <screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 222</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "12345"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <para>New options can take more complex forms than simple use of
-      primitives (uint8, string, ipv4-address etc): it is possible to
-      define an option comprising a number of existing primitives.
-      </para>
-      <para>Assume we want to define a new option that will consist of
-      an IPv4 address, followed by unsigned 16 bit integer, followed by
-      a boolean value, followed by a text string. Such an option could
-      be defined in the following way:
-<screen>
-&gt; <userinput>config add Dhcp4/option-def</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/name "bar"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/code 223</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/type "record"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/record-types "ipv4-address, uint16, boolean, string"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
-</screen>
-      The "type" is set to "record" to indicate that the option contains
-      multiple values of different types.  These types are given as a comma-separated
-      list in the "record-types" field and should be those listed in <xref linkend="dhcp-types"/>.
-      </para>
-      <para>
-      The values of the option are set as follows:
-<screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "bar"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 223</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.100, 123, true, Hello World"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      "csv-format" is set "true" to indicate that the "data" field comprises a command-separated
-      list of values.  The values in the "data" must correspond to the types set in
-      the "record-types" field of the option definition.
-     </para>
-     <note>
-       <para>
-         It is recommended that boolean values are specified using "true" and "false"
-         strings. This helps to prevent errors when typing multiple comma separated
-         values, as it make it easier to identify the type of the value being typed,
-         and compare it with the order of data fields. Nevertheless, it is possible
-         to use integer values: "1" and "0", instead of "true" and "false"
-         accordingly. If other integer value is specified, the configuration is
-         rejected.
-       </para>
-     </note>
-    </section>
-
-    <section id="dhcp4-vendor-opts">
-      <title>DHCPv4 vendor specific options</title>
-      <para>
-      Currently there are three option spaces defined: dhcp4 (to
-      be used in DHCPv4 daemon) and dhcp6 (for the DHCPv6 daemon); there
-      is also vendor-encapsulated-options-space, which is empty by default, but options
-      can be defined in it. Those options are called vendor-specific
-      information options. The following examples show how to define
-      an option "foo" with code 1 that consists of an IPv4 address, an
-      unsigned 16 bit integer and a string. The "foo" option is conveyed
-      in a vendor specific information option.
-      </para>
-      <para>
-      The first step is to define the format of the option:
-<screen>
-&gt; <userinput>config add Dhcp4/option-def</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/space "vendor-encapsulated-options-space"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/type "record"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/record-types "ipv4-address, uint16, string"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/encapsulates ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-     (Note that the option space is set to "vendor-encapsulated-options-space".)
-     Once the option format is defined, the next step is to define actual values
-     for that option:
-     <screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "vendor-encapsulated-options-space"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.3, 123, Hello World"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-    We also set up a dummy value for vendor-opts, the option that conveys our sub-option "foo".
-    This is required else the option will not be included in messages sent to the client.
-     <screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/name "vendor-encapsulated-options"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/code 43</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/csv-format false</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/data ""</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <note>
-        <para>
-          With this version of Kea, the "vendor-encapsulated-options" option
-          must be specified in the configuration although it has no configurable
-          parameters. If it is not specified, the server will assume that it is
-          not configured and will not send it to a client. In the future there
-          will be no need to include this option in the configuration.
-        </para>
-      </note>
-
-    </section>
-
-    <section id="dhcp4-option-spaces">
-
-      <title>Nested DHCPv4 options (custom option spaces)</title>
-      <para>It is sometimes useful to define completely new option
-      space. This is the case when user creates new option in the
-      standard option space ("dhcp4 or "dhcp6") and wants this option
-      to convey sub-options. Thanks to being in the separate space,
-      sub-option codes will have a separate numbering scheme and may
-      overlap with codes of standard options.
-      </para>
-      <para>Note that creation of a new option space when defining
-      sub-options for a standard option is not required, because it is
-      created by default if the standard option is meant to convey any
-      sub-options (see <xref linkend="dhcp4-vendor-opts"/>).
-      </para>
-      <para>
-      Assume that we want to have a DHCPv4 option called "container" with
-      code 222 that conveys two sub-options with codes 1 and 2.
-      First we need to define the new sub-options:
-<screen>
-&gt; <userinput>config add Dhcp4/option-def</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/name "subopt1"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/type "ipv4-address"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp4/option-def[0]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput>
-
-&gt; <userinput>config add Dhcp4/option-def</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/name "subopt2"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/code 2</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/type "string"</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/array false</userinput>
-&gt; <userinput>config set Dhcp4/option-def[1]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-    Note that we have defined the options to belong to a new option space
-    (in this case, "isc").
-    </para>
-    <para>
-    The next step is to define a regular DHCPv4 option with our desired
-    code and specify that it should include options from the new option space:
-<screen>
-&gt; <userinput>add Dhcp4/option-def</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/name "container"</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/code 222</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/space "dhcp4"</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/type "empty"</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/array false</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/record-types ""</userinput>
-&gt; <userinput>set Dhcp4/option-def[2]/encapsulate "isc"</userinput>
-&gt; <userinput>commit</userinput>
-</screen>
-    The name of the option space in which the sub-options are defined
-    is set in the "encapsulate" field. The "type" field is set to "empty"
-    to indicate that this option does not carry any data other than
-    sub-options.
-    </para>
-    <para>
-    Finally, we can set values for the new options:
-<screen>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/name "subopt1"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[0]/data "192.0.2.3"</userinput>
-&gt; <userinput>config commit</userinput>
-<userinput></userinput>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/name "subopt2"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/code 2</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[1]/data "Hello world"</userinput>
-&gt; <userinput>config commit</userinput>
-<userinput></userinput>
-&gt; <userinput>config add Dhcp4/option-data</userinput>
-&gt; <userinput>config set Dhcp4/option-data[2]/name "container"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[2]/space "dhcp4"</userinput>
-&gt; <userinput>config set Dhcp4/option-data[2]/code 222</userinput>
-&gt; <userinput>config set Dhcp4/option-data[2]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp4/option-data[2]/data ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-    Even though the "container" option does not carry any data except
-    sub-options, the "data" field must be explicitly set to an empty value.
-    This is required because in the current version of BIND 10 DHCP, the
-    default configuration values are not propagated to the configuration parsers:
-    if the "data" is not set the parser will assume that this
-    parameter is not specified and an error will be reported.
-    </para>
-    <para>Note that it is possible to create an option which carries some data
-    in addition to the sub-options defined in the encapsulated option space.  For example,
-    if the "container" option from the previous example was required to carry an uint16
-    value as well as the sub-options, the "type" value would have to be set to "uint16" in
-    the option definition. (Such an option would then have the following
-    data structure: DHCP header, uint16 value, sub-options.) The value specified
-    with the "data" parameter - which should be a valid integer enclosed in quotes,
-    e.g. "123" - would then be assigned to the uint16 field in the "container" option.
-    </para>
-    </section>
-
-    <section id="dhcp4-client-classifier">
-      <title>Client Classification in DHCPv4</title>
-      <note>
-      <para>
-        DHCPv4 server has been extended to support limited client classification.
-        Although the current capability is modest, it is expected to be expanded
-        in the future. It is envisaged that the majority of client classification
-        extensions will be using hooks extensions.
-      </para>
-      </note>
-      <para>In certain cases it is useful to differentiate between different
-      types of clients and treat them differently. The process of doing
-      classification is conducted in two steps. The first step is to assess
-      incoming packet and assign it to zero or more classes. This classification
-      is currently simple, but is expected to grow in capability soon. Currently
-      the server checks whether incoming packet has vendor class identifier
-      option (60). If it has, content of that option is prepended with
-      &quot;VENDOR_CLASS_&quot; then is interpreted as a class. For example,
-      modern cable modems will send this option with value &quot;docsis3.0&quot;
-      and as a result the packet will belong to class &quot;VENDOR_CLASS_docsis3.0&quot;.
-      </para>
-
-      <para>It is envisaged that the client classification will be used for changing
-      behavior of almost any part of the DHCP message processing, including assigning
-      leases from different pools, assigning different option (or different values of
-      the same options) etc. For now, there are only two mechanisms that are taking
-      advantage of client classification: specific processing for cable modems and
-      subnet selection.</para>
-
-      <para>
-        For clients that belong to the VENDOR_CLASS_docsis3.0 class, the siaddr
-        field is set to the value of next-server (if specified in a subnet). If
-        there is boot-file-name option specified, its value is also set in the
-        file field in the DHCPv4 packet. For eRouter1.0 class, the siaddr is
-        always set to 0.0.0.0. That capability is expected to be moved to
-        external hook library that will be dedicated to cable modems.
-      </para>
-
-      <para>
-        Kea can be instructed to limit access to given subnets based on class information.
-        This is particularly useful for cases where two types of devices share the
-        same link and are expected to be served from two different subnets. The
-        primary use case for such a scenario is cable networks. There are two
-        classes of devices: cable modem itself, which should be handled a lease
-        from subnet A and all other devices behind modems that should get a lease
-        from subnet B. That segregation is essential to prevent overly curious
-        users from playing with their cable modems. For details on how to set up
-        class restrictions on subnets, see <xref linkend="dhcp4-subnet-class"/>.
-      </para>
-
-    </section>
-
-    <section id="dhcp4-subnet-class">
-      <title>Limiting access to IPv4 subnet to certain classes</title>
-      <para>
-        In certain cases it beneficial to restrict access to certain subnets
-        only to clients that belong to a given subnet. For details on client
-        classes, see <xref linkend="dhcp4-client-classifier"/>. This is an
-        extension of a previous example from <xref linkend="dhcp4-address-config"/>.
-        Let's assume that the server is connected to a network segment that uses
-        the 192.0.2.0/24 prefix. The Administrator of that network has decided
-        that addresses from range 192.0.2.10 to 192.0.2.20 are going to be
-        managed by the Dhcp4 server. Only clients belonging to client class
-        VENDOR_CLASS_docsis3.0 are allowed to use this subnet. Such a
-        configuration can be achieved in the following way:
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/client-class "VENDOR_CLASS_docsis3.0"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <para>
-        Care should be taken with client classification as it is easy to prevent
-        clients that do not meet class criteria to be denied any service altogether.
-      </para>
-    </section>
-    <section id="dhcp4-ddns-config">
-      <title>Configuring DHCPv4 for DDNS</title>
-      <para>
-      As mentioned earlier, b10-dhcp4 can be configured to generate requests to the
-      DHCP-DDNS server to update DNS entries.  These requests are known as
-      NameChangeRequests or NCRs.  Each NCR contains the following information:
-      <orderedlist>
-      <listitem><para>
-      Whether it is a request to add (update) or remove DNS entries
-      </para></listitem>
-      <listitem><para>
-      Whether the change requests forward DNS updates (A records), reverse
-      DNS updates (PTR records), or both.
-      </para></listitem>
-      <listitem><para>
-      The FQDN, lease address, and DHCID
-      </para></listitem>
-      </orderedlist>
-      The parameters for controlling the generation of NCRs for submission to D2
-      are contained in the "dhcp-ddns" section of the b10-dhcp4 server
-      configuration. The default values for this section appears as follows:
-<screen>
-&gt; <userinput>config show Dhcp4/dhcp-ddns</userinput>
-Dhcp4/dhcp-ddns/enable-updates true    boolean
-Dhcp4/dhcp-ddns/server-ip      "127.0.0.1"     string
-Dhcp4/dhcp-ddns/server-port    53001   integer
-Dhcp4/dhcp-ddns/sender-ip      ""      string
-Dhcp4/dhcp-ddns/sender-port    0       integer
-Dhcp4/dhcp-ddns/max-queue-size 1024    integer
-Dhcp4/dhcp-ddns/ncr-protocol   "UDP"   string
-Dhcp4/dhcp-ddns/ncr-format     "JSON"  string
-Dhcp4/dhcp-ddns/override-no-update     false   boolean
-Dhcp4/dhcp-ddns/override-client-update false   boolean
-Dhcp4/dhcp-ddns/replace-client-name    false   boolean
-Dhcp4/dhcp-ddns/generated-prefix       "myhost"        string
-Dhcp4/dhcp-ddns/qualifying-suffix      "example.com"   string
-</screen>
-      </para>
-      <para>
-      The "enable-updates" parameter determines whether or not b10-dhcp4 will
-      generate NCRs.  By default, this value is false hence DDNS updates are
-      disabled.  To enable DDNS updates set this value to true:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/enable-updates true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <section id="dhcpv4-d2-io-config">
-      <title>DHCP-DDNS Server Connectivity</title>
-      <para>
-      In order for NCRs to reach the D2 server, b10-dhcp4 must be able
-      to communicate with it.  b10-dhcp4 uses the following configuration
-      parameters to control how it communications with D2:
-      <orderedlist>
-      <listitem><para>
-      server-ip - IP address on which D2 listens for requests. The default is
-      the local loopback interface at address 127.0.0.1. You may specify
-      either an IPv4 or IPv6 address.
-      </para></listitem>
-      <listitem><para>
-      server-port - port on which D2 listens for requests.  The default value
-      is 53001.
-      </para></listitem>
-      <listitem><para>
-      sender-ip - IP address which b10-dhcp4 should use to send requests to D2.
-      The default value is blank which instructs b10-dhcp4 to select a suitable
-      address.
-      </para></listitem>
-      <listitem><para>
-      sender-port - port which b10-dhcp4 should use to send requests to D2. The
-      default value of 0 instructs b10-dhcp4 to select suitable port.
-      </para></listitem>
-      <listitem><para>
-      ncr-format - Socket protocol use when sending requests to D2.  Currently
-      only UDP is supported.  TCP may be available in an upcoming release.
-      </para></listitem>
-      <listitem><para>
-      ncr-protocol - Packet format to use when sending requests to D2.
-      Currently only JSON format is supported.  Other formats may be available
-      in future releases.
-      </para></listitem>
-      <listitem><para>
-      max-queue-size - maximum number of requests allowed to queue waiting to
-      be sent to D2. This value guards against requests accumulating
-      uncontrollably if they are being generated faster than they can be
-      delivered.  If the number of requests queued for transmission reaches
-      this value, DDNS updating will be turned off until the queue backlog has
-      been sufficiently reduced.  The intent is allow the b10-dhcp4 server to
-      continue lease operations.  The default value is 1024.
-      </para></listitem>
-      </orderedlist>
-      By default, D2 is assumed to running on the same machine as b10-dhcp4, and
-      all of the default values mentioned above should be sufficient.
-      If, however, D2 has been configured to listen on a different address or
-      port, these values must altered accordingly. For example, if D2 has been
-      configured to listen on 198.162.1.10 port 900, the following commands
-      would be required:
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/server-ip "198.162.1.10"</userinput>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/server-port 900</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      </section>
-      <section id="dhcpv4-d2-rules-config">
-      <title>When does the b10-dhcp4 server generate DDNS requests?</title>
-      b10-dhcp4 follows the behavior prescribed for DHCP servers in RFC 4702.
-      It is important to keep in mind that b10-dhcp4 provides the initial decision
-      making of when and what to update and forwards that information to D2 in
-      the form of NCRs. Carrying out the actual DNS updates and dealing with
-      such things as conflict resolution are the purview of D2 (<xref linkend="dhcp-ddns-server"/>).
-      <para>
-      This section describes when b10-dhcp4 will generate NCRs and the
-      configuration parameters that can be used to influence this decision.
-      It assumes that the "enable-updates" parameter is true.
-      </para>
-      <para>
-      In general, b10-dhcp4 will generate DDNS update requests when:
-      <orderedlist>
-      <listitem><para>
-      A new lease is granted in response to a DHCP REQUEST
-      </para></listitem>
-      <listitem><para>
-      An existing lease is renewed but the FQDN associated with it has
-      changed.
-      </para></listitem>
-      <listitem><para>
-      An existing lease is released in response to a DHCP RELEASE
-      </para></listitem>
-      </orderedlist>
-      In the second case, lease renewal, two  DDNS requests will be issued: one
-      request to remove entries for the previous FQDN and a second request to
-      add entries for the new FQDN.  In the last case, a lease release, a
-      single DDNS request to remove its entries will be made.  The decision
-      making involved when granting a new lease (the first case) is more
-      involved and is discussed next.
-      </para>
-      <para>
-      When a new lease is granted, b10-dhcp4 will generate a DDNS
-      update request if the DHCP REQUEST contains either the FQDN option
-      (code 81) or the Host Name option (code 12). If both are present,
-      the server will use the FQDN option. By default b10-dhcp4
-      will respect the FQDN N and S flags specified by the client as shown
-      in the following table:
-      </para>
-        <table id="fqdn-flag-table">
-          <title>Default FQDN Flag Behavior</title>
-          <tgroup cols='4' align='left'>
-          <colspec colname='cflags'/>
-          <colspec colname='meaning'/>
-          <colspec colname='response'/>
-          <colspec colname='sflags'/>
-          <thead>
-              <row>
-                <entry>Client Flags:N-S</entry>
-                <entry>Client Intent</entry>
-                <entry>Server Response</entry>
-                <entry>Server Flags:N-S-O</entry>
-              </row>
-          </thead>
-          <tbody>
-            <row>
-                <entry>0-0</entry>
-                <entry>
-                Client wants to do forward updates, server should do reverse updates
-                </entry>
-                <entry>Server generates reverse-only request</entry>
-                <entry>1-0-0</entry>
-            </row>
-            <row>
-                <entry>0-1</entry>
-                <entry>Server should do both forward and reverse updates</entry>
-                <entry>Server generates request to update both directions</entry>
-                <entry>0-1-0</entry>
-            </row>
-            <row>
-                <entry>1-0</entry>
-                <entry>Client wants no updates done</entry>
-                <entry>Server does not generate a request</entry>
-                <entry>1-0-0</entry>
-            </row>
-          </tbody>
-          </tgroup>
-        </table>
-      <para>
-      The first row in the table above represents "client delegation". Here
-      the DHCP client states that it intends to do the forward DNS updates and
-      the server should do the reverse updates.  By default, b10-dhcp4 will honor
-      the client's wishes and generate a DDNS request to D2 to update only
-      reverse DNS data.  The parameter, "override-client-update", can be used
-      to instruct the server to override client delegation requests.  When
-      this parameter is true, b10-dhcp4 will disregard requests for client
-      delegation and generate a DDNS request to update both forward and
-      reverse DNS data.  In this case, the N-S-O flags in the server's
-      response to the client will be 0-1-1 respectively.
-      </para>
-      <para>
-      (Note that the flag combination N=1, S=1 is prohibited according to
-      RFC 4702. If such a combination is received from the client, the packet
-      will be dropped by the b10-dhcp4.)
-      </para>
-      <para>
-      To override client delegation, issue the following commands:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/override-client-update true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The third row in the table above describes the case in which the client
-      requests that no DNS updates be done. The parameter, "override-no-update",
-      can be used to instruct the server to disregard the client's wishes. When
-      this parameter is true, b10-dhcp4 will generate DDNS update request to D2
-      even if the client requests no updates be done.  The N-S-O flags in the
-      server's response to the client will be 0-1-1.
-      </para>
-      <para>
-      To override client delegation, issue the following commands:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/override-no-update true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      b10-dhcp4 will always generate DDNS update requests if the client request
-      only contains the Host Name option. In addition it will include an FQDN
-      option in the response to the client with the FQDN N-S-O flags set to
-      0-1-0 respectively. The domain name portion of the FQDN option will be
-      the name submitted to D2 in the DDNS update request.
-      </para>
-      </section>
-      <section id="dhcpv4-fqdn-name-generation">
-      <title>b10-dhcp4 name generation for DDNS update requests</title>
-      Each NameChangeRequest must of course include the fully qualified domain
-      name whose DNS entries are to be affected.  b10-dhcp4 can be configured to
-      supply a portion or all of that name based upon what it receives from
-      the client in the DHCP REQUEST.
-      <para>
-      The rules for determining the FQDN option are as follows:
-      <orderedlist>
-      <listitem><para>
-      If configured to do, so ignore the REQUEST contents and generate a
-      FQDN using a configurable prefix and suffix.
-      </para></listitem>
-      <listitem><para>
-      If the REQUEST contains the client FQDN option, the candidate
-      name is taken from there, otherwise it is taken from the Host Name option.
-      The candiate name may then be modified:
-      <orderedlist>
-      <listitem><para>
-      If the candidate name is a fully qualified domain name, use it.
-      </para></listitem>
-      <listitem><para>
-      If the candidate name is a partial (i.e. unqualified) name then
-      add a configurable suffix to the name and use the result as the FQDN.
-      </para></listitem>
-      <listitem><para>
-      If the candidate name is a empty, generate a FQDN using a
-      configurable prefix and suffix.
-      </para></listitem>
-      </orderedlist>
-      </para></listitem>
-      </orderedlist>
-      To instruct b10-dhcp4 to always generate the FQDN for a client, set the
-      parameter "replace-client-name" to true as follows:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/replace-client-name true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The prefix used in the generation of a FQDN is specified by the
-      "generated-prefix" parameter.  The default value is "myhost".  To alter
-      its value simply set it to the desired string:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/generated-prefix "another.host"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The suffix used when generating a FQDN or when qualifying a partial
-      name is specified by the "qualifying-suffix" parameter.  The default
-      value is "example.com".  To alter its value simply set it to the desired
-      string:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp4/dhcp-ddns/generated-prefix "our.net"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </section>
-      <para>
-      When generating a name, b10-dhcp4 will construct name of the format:
-      </para>
-      <para>
-        [generated-prefix]-[address-text].[qualifying-suffix].
-      </para>
-      <para>
-      where address-text is simply the lease IP address converted to a
-      hyphenated string.  For example, if lease address is 172.16.1.10 and
-      assuming default values for generated-prefix and qualifying-suffix, the
-      generated FQDN would be:
-      </para>
-      <para>
-        myhost-172-16-1-10.example.com.
-      </para>
-    </section>
-
-  </section> <!-- end of configuring b10-dhcp4 server section with many subsections -->
-
-    <section id="dhcp4-serverid">
-      <title>Server Identifier in DHCPv4</title>
-      <para>
-        The DHCPv4 protocol uses a "server identifier" for clients to be able
-        to discriminate between several servers present on the same link: this
-        value is an IPv4 address of the server. The server chooses the IPv4 address
-        of the interface on which the message from the client (or relay) has been
-        received. A single server instance will use multiple server identifiers
-        if it is receiving queries on multiple interfaces.
-      </para>
-      <para>
-        Currently there is no mechanism to override the default server identifiers
-        by an administrator. In the future, the configuration mechanism will be used
-        to specify the custom server identifier.
-      </para>
-    </section>
-
-
-    <section id="dhcp4-next-server">
-      <title>Next server (siaddr)</title>
-      <para>In some cases, clients want to obtain configuration from the TFTP server.
-      Although there is a dedicated option for it, some devices may use siaddr field
-      in the DHCPv4 packet for that purpose. That specific field can be configured
-      using next-server directive. It is possible to define it in global scope or
-      for a given subnet only. If both are defined, subnet value takes precedence.
-      The value in subnet can be set to 0.0.0.0, which means that next-server should
-      not be sent. It may also be set to empty string, which means the same as if
-      it was not defined at all - use global value.
-      </para>
-
-<screen>
-&gt; <userinput>config add Dhcp4/next-server</userinput>
-&gt; <userinput>config set Dhcp4/next-server "192.0.2.123"</userinput>
-&gt; <userinput>config commit</userinput>
-<userinput></userinput>
-&gt; <userinput>config add Dhcp4/subnet[0]/next-server</userinput>
-&gt; <userinput>config set Dhcp4/subnet[0]/next-server "192.0.2.234"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-
-    </section>
-
-    <section id="dhcp4-echo-client-id">
-      <title>Echoing client-id (RFC6842)</title>
-      <para>Original DHCPv4 spec (RFC2131) states that the DHCPv4
-      server must not send back client-id options when responding to
-      clients. However, in some cases that confused clients that did
-      not have MAC address or client-id. See RFC6842 for details. That
-      behavior has changed with the publication of RFC6842 which
-      updated RFC2131. That update now states that the server must
-      send client-id if client sent it. That is the default behaviour
-      that Kea offers. However, in some cases older devices that do
-      not support RFC6842 may refuse to accept responses that include
-      client-id option. To enable backward compatibility, an optional
-      configuration parameter has been introduced. To configure it,
-      use the following commands:</para>
-
-<screen>
-&gt; <userinput>config add Dhcp4/echo-client-id</userinput>
-&gt; <userinput>config set Dhcp4/echo-client-id False</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-
-    </section>
-
-    <section id="dhcp4-subnet-selection">
-      <title>How DHCPv4 server selects subnet for a client</title>
-      <para>
-        The DHCPv4 server differentiates between the directly connected clients,
-        clients trying to renew leases and clients sending their messages through
-        relays. For the directly connected clients the server will check the
-        configuration of the interface on which the message has been received, and
-        if the server configuration doesn't match any configured subnet the
-        message is discarded.</para>
-        <para>Assuming that the server's interface is configured with the 192.0.2.3
-        IPv4 address, the server will only process messages received through
-        this interface from the directly connected client, if there is a subnet
-        configured, to which this IPv4 address belongs, e.g. 192.0.2.0/24.
-        The server will use this subnet to assign IPv4 address for the client.
-      </para>
-      <para>
-        The rule above does not apply when the client unicasts its message, i.e.
-        is trying to renew its lease. Such message is accepted through any
-        interface. The renewing client sets ciaddr to the currently used IPv4
-        address. The server uses this address to select the subnet for the client
-        (in particular, to extend the lease using this address).
-      </para>
-      <para>
-        If the message is relayed it is accepted through any interface. The giaddr
-        set by the relay agent is used to select the subnet for the client.
-      </para>
-      <para>
-       It is also possible to specify a relay IPv4 address for a given subnet. It
-       can be used to match incoming packets into a subnet in uncommon configurations,
-       e.g. shared subnets. See <xref linkend="dhcp4-relay-override"/> for details.
-      </para>
-      <note>
-        <para>The subnet selection mechanism described in this section is based
-        on the assumption that client classification is not used. The classification
-        mechanism alters the way in which subnet is selected for the client,
-        depending on the classes that the client belongs to.</para>
-      </note>
-    </section>
-
-    <section id="dhcp4-relay-override">
-      <title>Using specific relay agent for a subnet</title>
-      <para>
-        The relay has to have an interface connected to the link on which
-        the clients are being configured. Typically the relay has an IPv4
-        address configured on that interface that belongs to the subnet that
-        the server will assign addresses from. In such typical case, the
-        server is able to use IPv4 address inserted by the relay (in GIADDR
-        field of the DHCPv4 packet) to select appropriate subnet.
-      </para>
-      <para>
-        However, that is not always the case. In certain uncommon, but
-        valid deployments, the relay address may not match the subnet. This
-        usually means that there is more than one subnet allocated for a given
-        link. Two most common examples where this is the case are long lasting
-        network renumbering (where both old and new address space is still being
-        used) and a cable network. In a cable network both cable modems and the
-        devices behind them are physically connected to the same link, yet
-        they use distinct addressing. In such case, the DHCPv4 server needs
-        additional information (IPv4 address of the relay) to properly select
-        an appropriate subnet.
-      </para>
-      <para>
-        The following example assumes that there is a subnet 192.0.2.0/24
-        that is accessible via relay that uses 10.0.0.1 as its IPv4 address.
-        The server will be able to select this subnet for any incoming packets
-        that came from a relay that has an address in 192.0.2.0/24 subnet.
-        It will also select that subnet for a relay with address 10.0.0.1.
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "192.0.2.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/relay/ip-address "10.0.0.1"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-    </section>
-
-      <section id="dhcp4-srv-example-client-class-relay">
-        <title>Segregating IPv4 clients in a cable network</title>
-        <para>
-          In certain cases, it is useful to mix relay address information,
-          introduced in <xref linkend="dhcp4-relay-override"/> with client
-          classification, explained in <xref linkend="dhcp4-subnet-class"/>.
-          One specific example is cable network, where typically modems
-          get addresses from a different subnet than all devices connected
-          behind them.
-        </para>
-        <para>
-          Let's assume that there is one CMTS (Cable Modem Termination System)
-          with one CM MAC (a physical link that modems are connected to).
-          We want the modems to get addresses from the 10.1.1.0/24 subnet, while
-          everything connected behind modems should get addresses from another
-          subnet (192.0.2.0/24). The CMTS that acts as a relay an uses address
-          10.1.1.1. The following configuration can serve that configuration:
-        <screen>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/subnet "10.1.1.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/pool [ "10.1.1.2 - 10.1.1.20" ]</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/client-class "docsis3.0"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[0]/relay/ip-address "10.1.1.1"</userinput>
-&gt; <userinput>config add Dhcp4/subnet4</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[1]/subnet "192.0.2.0/24"</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[1]/pool [ "192.0.2.10 - 192.0.2.20" ]</userinput>
-&gt; <userinput>config set Dhcp4/subnet4[1]/relay/ip-address "10.1.1.1"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-      </section>
-
-    <section id="dhcp4-std">
-      <title>Supported Standards</title>
-      <para>The following standards and draft standards are currently
-      supported:</para>
-      <itemizedlist>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc2131">RFC 2131</ulink>: Supported messages are DISCOVER, OFFER,
-            REQUEST, RELEASE, ACK, and NAK.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc2132">RFC 2132</ulink>:
-            Supported options are: PAD (0),
-            END(255), Message Type(53), DHCP Server Identifier (54),
-            Domain Name (15), DNS Servers (6), IP Address Lease Time
-            (51), Subnet mask (1), and Routers (3).</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc3046">RFC 3046</ulink>:
-            Relay Agent Information option is supported.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc3925">RFC 3925</ulink>:
-            Vendor-Identifying Vendor Class and Vendor-Identifying Vendor-Specific
-            Information option are supported.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc6842">RFC 6842</ulink>:
-            Server by default sends back client-id option. That capability may be
-            disabled. See <xref linkend="dhcp4-echo-client-id"/> for details.
-            </simpara>
-          </listitem>
-      </itemizedlist>
-    </section>
-
-    <section id="dhcp4-limit">
-      <title>DHCPv4 Server Limitations</title>
-      <para>These are the current limitations of the DHCPv4 server
-      software. Most of them are reflections of the current stage of
-      development and should be treated as <quote>not implemented
-      yet</quote>, rather than actual limitations.</para>
-      <itemizedlist>
-          <listitem> <!-- see tickets #3234, #3281 -->
-            <simpara>
-              Removal of a subnet during server reconfiguration may cause renumbering
-              of auto-generated subnet identifiers, as described in section
-              <xref linkend="ipv4-subnet-id"/>.
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              BOOTP (<ulink url="http://tools.ietf.org/html/rfc951">RFC 951</ulink>)
-              is not supported.
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>Raw sockets operation is working on Linux
-            only. See <xref linkend="iface-detect"/> for details.</simpara>
-          </listitem>
-          <listitem>
-            <simpara>The DHCPv4 server does not  verify that
-            assigned address is unused. According to <ulink url="http://tools.ietf.org/html/rfc2131">RFC 2131</ulink>, the
-            allocating server should verify that address is not used by
-            sending ICMP echo request.</simpara>
-          </listitem>
-          <listitem>
-            <simpara>Address duplication report (DECLINE) is not supported yet.</simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              The server doesn't act upon expired leases. In particular,
-              when a lease expires, the server doesn't request the removal
-              of the DNS records associated with it.
-            </simpara>
-          </listitem>
-      </itemizedlist>
-    </section>
-
-    <!--
-    <section id="dhcp4-srv-examples">
-      <title>Kea DHCPv4 server examples</title>
-
-      <para>
-        This section provides easy to use example. Each example can be read
-        separately. It is not intended to be read sequentially as there will
-        be many repetitions between examples. They are expected to serve as
-        easy to use copy-paste solutions to many common deployments.
-      </para>
-
-      @todo: add simple configuration for direct clients
-      @todo: add configuration for relayed clients
-      @todo: add client classification example
-
-    </section> -->
-
-  </chapter>
-
-  <chapter id="dhcp6">
-    <title>The DHCPv6 Server</title>
-
-    <section id="dhcp6-start-stop">
-      <title>Starting and Stopping the DHCPv6 Server</title>
-
-      <para>
-        <command>b10-dhcp6</command> is the Kea DHCPv6 server and is configured
-        through the <command>bindctl</command> program.
-      </para>
-      <para>
-        After starting <command>bind10</command> and starting <command>bindctl</command>, the first step
-        in configuring the server is to add <command>b10-dhcp6</command> to the list of running services.
-<screen>
-&gt; <userinput>config add Init/components b10-dhcp6</userinput>
-&gt; <userinput>config set Init/components/b10-dhcp6/kind dispensable</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      <para>
-         To remove <command>b10-dhcp6</command> from the set of running services,
-         the <command>b10-dhcp6</command> is removed from list of Init components:
-<screen>
-&gt; <userinput>config remove Init/components b10-dhcp6</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-
-      <para>
-        Note that the server was only removed from the list, so BIND10 will not
-        restart it, but the server itself is still running. Hence it is usually
-        desired to stop it:
-<screen>
-&gt; <userinput>Dhcp6 shutdown</userinput>
-</screen>
-      </para>
-
-      <para>
-        During start-up the server will detect available network interfaces
-        and will attempt to open UDP sockets on all interfaces that
-        are up, running, are not loopback, are multicast-capable, and
-        have IPv6 address assigned. It will then listen to incoming traffic.
-      </para>
-
-
-    </section>
-
-    <section id="dhcp6-configuration">
-      <title>DHCPv6 Server Configuration</title>
-      <para>
-        Once the server has been started, it can be configured. To view the
-        current configuration, use the following command in <command>bindctl</command>:
-        <screen>&gt; <userinput>config show Dhcp6</userinput></screen>
-        When starting the Dhcp6 daemon for the first time, the default configuration
-        will be available. It will look similar to this:
-<screen>
-&gt; <userinput>config show Dhcp6</userinput>
-Dhcp6/hooks-libraries   []  list    (default)
-Dhcp6/interfaces/   list    (default)
-Dhcp6/renew-timer   1000    integer (default)
-Dhcp6/rebind-timer  2000    integer (default)
-Dhcp6/preferred-lifetime    3000    integer (default)
-Dhcp6/valid-lifetime    4000    integer (default)
-Dhcp6/option-def    []  list    (default)
-Dhcp6/option-data   []  list    (default)
-Dhcp6/lease-database/type   ""  string  (default)
-Dhcp6/lease-database/name   ""  string  (default)
-Dhcp6/lease-database/user   ""  string  (default)
-Dhcp6/lease-database/host   ""  string  (default)
-Dhcp6/lease-database/password   ""  string  (default)
-Dhcp6/subnet6/  list
-Dhcp6/dhcp-ddns/enable-updates  true    boolean
-Dhcp6/dhcp-ddns/server-ip   "127.0.0.1" string
-Dhcp6/dhcp-ddns/server-port 53001   integer
-Dhcp6/dhcp-ddns/sender-ip      ""      string
-Dhcp6/dhcp-ddns/sender-port    0       integer
-Dhcp6/dhcp-ddns/max-queue-size 1024  integer
-Dhcp6/dhcp-ddns/ncr-protocol    "UDP"   string
-Dhcp6/dhcp-ddns/ncr-format  "JSON"  string
-Dhcp6/dhcp-ddns/always-include-fqdn false   boolean
-Dhcp6/dhcp-ddns/override-no-update  false   boolean
-Dhcp6/dhcp-ddns/override-client-update  false   boolean
-Dhcp6/dhcp-ddns/replace-client-name false   boolean
-Dhcp6/dhcp-ddns/generated-prefix    "myhost"    string
-Dhcp6/dhcp-ddns/qualifying-suffix   "example.com"   string
-</screen>
-      </para>
-      <para>
-        To change one of the parameters, simply follow
-        the usual <command>bindctl</command> procedure. For example, to make the
-        leases longer, change their valid-lifetime parameter:
-        <screen>
-&gt; <userinput>config set Dhcp6/valid-lifetime 7200</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Most Dhcp6 parameters are of global scope
-        and apply to all defined subnets, unless they are overridden on a
-        per-subnet basis.
-      </para>
-      <note>
-        <para>
-          With this version of Kea, there are a number of known limitations
-          and problems in the DHCPv6 server. See <xref linkend="dhcp6-limit"/>.
-        </para>
-      </note>
-
-      <section>
-      <title>Default storage for leases</title>
-      <para>
-        The server is able to store lease data in different repositories. Larger deployments
-        may elect to store leases in a database.
-        <xref linkend="database-configuration6"/> describes one way to do it.
-        By default, the server will use a CSV file rather than a database to store
-        lease information. One of the advantages of using a file is that it eliminates
-        dependency on third party database software.
-      </para>
-      <para>
-        The configuration of the file backend (Memfile)
-        is controlled through the Dhcp6/lease-database parameters. When default
-        parameters are left, the Memfile backend will write leases to a disk in the
-        [bind10-install-dir]/var/bind10/kea-leases6.csv.
-      </para>
-      <para>
-        It is possible to alter the default location of the lease file. The following
-        configuration:
-<screen>
-&gt; <userinput>config set Dhcp4/lease-database/type "memfile"</userinput>
-&gt; <userinput>config set Dhcp4/lease-database/persist true</userinput>
-&gt; <userinput>config set Dhcp4/lease-database/leasefile "/tmp/kea-leases6.csv"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-        will change the default location of the lease file to /tmp/kea-leases6.csv.
-      </para>
-      <para>
-        The "persist" parameter controls whether the leases are written to disk.
-        It is strongly recommended that this parameter is set to "true" at all times
-        during the normal operation of the server.
-      </para>
-      </section>
-
-      <section id="database-configuration6">
-      <title>Database Configuration</title>
-      <para>
-      All leases issued by the server are stored in the lease database. Currently
-      there are 3 database backends available: MySQL, PostgreSQL and memfile.
-      <footnote>
-      <para>
-      The server comes with an in-memory database ("memfile") configured as the default
-      database. This is used for internal testing and is not supported.  In addition,
-      it does not store lease information on disk: lease information will be lost if the
-      server is restarted.
-      </para>
-      </footnote>, and so the server must be configured to
-      access the correct database with the appropriate credentials.
-      </para>
-      <note>
-        <para>
-            Database access information must be configured for the DHCPv6 server, even if
-            it has already been configured for the DHCPv4 server.  The servers store their
-            information independently, so each server can use a separate
-            database or both servers can use the same database.
-          </para>
-        </note>
-      <para>
-      Database configuration is controlled through the Dhcp6/lease-database parameters.
-      The type of the database must be set to "mysql", "postgresql" or "memfile":
-<screen>
-&gt; <userinput>config set Dhcp6/lease-database/type "mysql"</userinput>
-</screen>
-      Next, the name of the database is to hold the leases must be set: this is the
-      name used when the lease database was created (see <xref linkend="dhcp-mysql-database-create"/>
-      or <xref linkend="dhcp-pgsql-database-create"/>).
-<screen>
-&gt; <userinput>config set Dhcp6/lease-database/name "<replaceable>database-name</replaceable>"</userinput>
-</screen>
-      If the database is located on a different system to the DHCPv6 server, the
-      database host name must also be specified (although note that this configuration
-      may have a severe impact on server performance):
-<screen>
-&gt; <userinput>config set Dhcp6/lease-database/host "<replaceable>remote-host-name</replaceable>"</userinput>
-</screen>
-      The usual state of affairs will be to have the database on the same machine as the
-      DHCPv6 server.  In this case, set the value to the empty string (this is the default):
-<screen>
-&gt; <userinput>config set Dhcp6/lease-database/host ""</userinput>
-</screen>
-      </para>
-      <para>
-      Finally, the credentials of the account under which the server will access the database
-      should be set:
-<screen>
-&gt; <userinput>config set Dhcp6/lease-database/user "<replaceable>user-name</replaceable>"</userinput>
-&gt; <userinput>config set Dhcp6/lease-database/password "<replaceable>password</replaceable>"</userinput>
-</screen>
-      If there is no password to the account, set the password to the empty string "". (This is also the default.)
-      </para>
-      <note>
-      <para>The password is echoed when entered and is stored in clear text in the configuration
-      database.  Improved password security will be added in a future version of Kea.</para>
-      </note>
-      </section>
-
-      <section id="dhcp6-interface-selection">
-      <title>Interface selection</title>
-      <para>
-        When DHCPv6 server starts up, by default it will listen to the DHCP
-        traffic and respond to it on all interfaces detected during startup.
-        However, in many cases it is desired to configure the server to listen and
-        respond on selected interfaces only. The sample commands in this section
-        show how to make interface selection using bindctl.
-      </para>
-      <para>
-        The default configuration can be presented with the following command:
-        <screen>
-&gt; <userinput>config show Dhcp6/interfaces</userinput>
-<userinput>Dhcp6/interfaces[0] "*" string</userinput></screen>
-        An asterisk sign plays a role of the wildcard and means "listen on all interfaces".
-      </para>
-      <para>
-        In order to override the default configuration, the existing entry can be replaced
-        with the actual interface name:
-        <screen>
-&gt; <userinput>config set Dhcp6/interfaces[0] eth1</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Other interface names can be added on one-by-one basis:
-        <screen>
-&gt; <userinput>config add Dhcp6/interfaces eth2</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Configuration will now contain two interfaces which can be presented as follows:
-        <screen>
-&gt; <userinput>config show Dhcp6/interfaces</userinput>
-<userinput>Dhcp6/interfaces[0] "eth1"  string</userinput>
-<userinput>Dhcp6/interfaces[1] "eth2"  string</userinput></screen>
-        When configuration gets committed, the server will start to listen on
-        eth1 and eth2 interfaces only.
-      </para>
-      <para>
-        It is possible to use wildcard interface name (asterisk) concurrently with explicit
-        interface names:
-        <screen>
-&gt; <userinput>config add Dhcp6/interfaces *</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        This will result in the following configuration:
-        <screen>
-&gt; <userinput>config show Dhcp6/interfaces</userinput>
-<userinput>Dhcp6/interfaces[0] "eth1"  string</userinput>
-<userinput>Dhcp6/interfaces[1] "eth2"  string</userinput>
-<userinput>Dhcp6/interfaces[2] "*"     string</userinput></screen>
-        The presence of the wildcard name implies that server will listen on all interfaces.
-        In order to fall back to the previous configuration when server listens on eth1 and eth2:
-        <screen>
-&gt; <userinput>config remove Dhcp6/interfaces[2]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-    </section>
-
-    <section id="ipv6-subnet-id">
-      <title>IPv6 Subnet Identifier</title>
-      <para>
-        Subnet identifier is a unique number associated with a particular subnet.
-        In principle, it is used to associate clients' leases with respective subnets.
-        When subnet identifier is not specified for a subnet being configured, it will
-        be automatically assigned by the configuration mechanism. The identifiers
-        are assigned from 1 and are monotonically increased for each subsequent
-        subnet: 1, 2, 3 ....
-      </para>
-      <para>
-       If there are multiple subnets configured with auto-generated identifiers and
-       one of them is removed, the subnet identifiers may be renumbered. For example:
-       if there are 4 subnets and 3rd is removed the last subnet will be assigned
-       identifier that the 3rd subnet had before removal. As a result, the leases
-       stored in the lease database for subnet 3 are now associated with the
-       subnet 4, which may have unexpected consequences. In the future it is planned
-       to implement the mechanism to preserve auto-generated subnet ids upon removal
-       of one of the subnets. Currently, the only remedy for this issue is to
-       manually specify the unique subnet identifier for each subnet.
-      </para>
-      <para>
-        The following configuration:
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/id 1024</userinput>
-&gt; <userinput>config commit</userinput>
-        </screen>
-        will assign the arbitrary subnet identifier to the newly configured subnet.
-        This identifier will not change for this subnet until "id" parameter is
-        removed or set to 0. The value of 0 forces auto-generation of subnet
-        identifier.
-      </para>
-    </section>
-
-    <section id="dhcp6-unicast">
-      <title>Unicast traffic support</title>
-      <para>
-        When DHCPv6 server starts up, by default it listens to the DHCP traffic
-        sent to multicast address ff02::1:2 on each interface that it is
-        configured to listen on (see <xref linkend="dhcp6-interface-selection"/>).
-        In some cases it is useful to configure a server to handle incoming
-        traffic sent to the global unicast addresses as well. The most common
-        reason for that is to have relays send their traffic to the server
-        directly. To configure server to listen on specific unicast address, a
-        notation to specify interfaces has been extended. Interface name can be
-        optionally followed by a slash, followed by global unicast address that
-        server should listen on. That will be done in addition to normal
-        link-local binding + listening on ff02::1:2 address. The sample commands
-        listed below show how to listen on 2001:db8::1 (a global address)
-        configured on the eth1 interface.
-      </para>
-      <para>
-        <screen>
-&gt; <userinput>config set Dhcp6/interfaces[0] eth1/2001:db8::1</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        When configuration gets committed, the server will start to listen on
-        eth1 on link-local address, multicast group (ff02::1:2) and 2001:db8::1.
-      </para>
-      <para>
-        It is possible to mix interface names, wildcards and interface name/addresses
-        on the Dhcp6/interface list. It is not possible to specify more than one
-        unicast address on a given interface.
-      </para>
-      <para>
-        Care should be taken to specify proper unicast addresses. The server will
-        attempt to bind to those addresses specified, without any additional checks.
-        That approach is selected on purpose, so in the software can be used to
-        communicate over uncommon addresses if the administrator desires so.
-      </para>
-    </section>
-
-    <section id="dhcp6-address-config">
-      <title>Subnet and Address Pool</title>
-      <para>
-        The essential role of a DHCPv6 server is address assignment. For this,
-        the server has to be configured with at least one subnet and one pool of dynamic
-        addresses to be managed. For example, assume that the server
-        is connected to a network segment that uses the 2001:db8:1::/64
-        prefix. The Administrator of that network has decided that addresses from range
-        2001:db8:1::1 to 2001:db8:1::ffff are going to be managed by the Dhcp6
-        server. Such a configuration can be achieved in the following way:
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::0 - 2001:db8:1::ffff" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Note that subnet is defined as a simple string, but the pool parameter
-        is actually a list of pools: for this reason, the pool definition is
-        enclosed in square brackets, even though only one range of addresses
-        is specified.</para>
-        <para>It is possible to define more than one pool in a
-        subnet: continuing the previous example, further assume that
-        2001:db8:1:0:5::/80 should be also be managed by the server. It could be written as
-        2001:db8:1:0:5:: to 2001:db8:1::5:ffff:ffff:ffff, but typing so many 'f's
-        is cumbersome. It can be expressed more simply as 2001:db8:1:0:5::/80. Both
-        formats are supported by Dhcp6 and can be mixed in the pool list.
-        For example, one could define the following pools:
-        <screen>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::1 - 2001:db8:1::ffff", "2001:db8:1:0:5::/80" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        The number of pools is not limited, but for performance reasons it is recommended to
-        use as few as possible.
-      </para>
-      <para>
-         The server may be configured to serve more than one subnet. To add a second subnet,
-         use a command similar to the following:
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:beef::/48"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:beef::/48" ]</userinput>
-&gt; <userinput>config commit</userinput></screen>
-        Arrays are counted from 0. subnet[0] refers to the subnet defined in the
-        previous example.  The <command>config add Dhcp6/subnet6</command> command adds
-        another (second) subnet. It can be referred to as
-        <command>Dhcp6/subnet6[1]</command>. In this example, we allow server to
-        dynamically assign all addresses available in the whole subnet. Although
-        very wasteful, it is certainly a valid configuration to dedicate the
-        whole /48 subnet for that purpose.
-      </para>
-      <para>
-        When configuring a DHCPv6 server using prefix/length notation, please pay
-        attention to the boundary values. When specifying that the server should use
-        a given pool, it will be able to allocate also first (typically network
-        address) address from that pool. For example for pool 2001:db8::/64 the
-        2001:db8:: address may be assigned as well. If you want to avoid this,
-        please use the "min-max" notation.
-      </para>
-    </section>
-
-    <section>
-<!-- @todo: add real meat to the prefix delegation config this is just place holder stuff -->
-      <title>Subnet and Prefix Delegation Pools</title>
-      <para>
-        Subnets may also be configured to delegate address prefixes....
-        A subnet may have one or more prefix delegation pools.  Each pool has
-        a prefixed address, which is specified as a prefix and a prefix length,
-        as well as a delegated prefix length.  A sample configuration is shown
-        below:
-      <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config show Dhcp6/subnet6[0]</userinput>
-&gt; <userinput>config add Dhcp6/subnet6[0]/pd-pools</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/prefix "2001:db8:1::"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/prefix-len 64</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pd-pools[0]/delegated-len 96</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-    </section>
-
-    <section id="dhcp6-std-options">
-      <title>Standard DHCPv6 options</title>
-      <para>
-        One of the major features of DHCPv6 server is to provide configuration
-        options to clients. Although there are several options that require
-        special behavior, most options are sent by the server only if the client
-        explicitly requested them.  The following example shows how to
-        configure DNS servers, which is one of the most frequently used
-        options. Numbers in the first column are added for easier reference and
-        will not appear on screen. Options specified in this way are considered
-        global and apply to all configured subnets.
-
-        <screen>
-1. &gt; <userinput>config add Dhcp6/option-data</userinput>
-2. &gt; <userinput>config set Dhcp6/option-data[0]/name "dns-servers"</userinput>
-3. &gt; <userinput>config set Dhcp6/option-data[0]/code 23</userinput>
-4. &gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
-5. &gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
-6. &gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8::cafe, 2001:db8::babe"</userinput>
-7. &gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-    <para>
-      The first line creates new entry in option-data table. It
-      contains information on all global options that the server is
-      supposed to configure in all subnets. The second line specifies
-      option name. For a complete list of currently supported names,
-      see <xref linkend="dhcp6-std-options-list"/>.
-      The third line specifies option code, which must match one of the
-      values from that
-      list. Line 4 specifies option space, which must always
-      be set to "dhcp6" as these are standard DHCPv6 options. For
-      other name spaces, including custom option spaces, see <xref
-      linkend="dhcp6-option-spaces"/>. The fifth line specifies the format in
-      which the data will be entered: use of CSV (comma
-      separated values) is recommended. The sixth line gives the actual value to
-      be sent to clients. Data is specified as a normal text, with
-      values separated by commas if more than one value is
-      allowed.
-    </para>
-
-    <para>
-      Options can also be configured as hexadecimal values. If csv-format is
-      set to false, the option data must be specified as a string of hexadecimal
-      numbers. The
-      following commands configure the DNS-SERVERS option for all
-      subnets with the following addresses: 2001:db8:1::cafe and
-      2001:db8:1::babe.
-      <screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/name "dns-servers"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/code 23</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/csv-format false</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/data "2001 0DB8 0001 0000 0000 0000</userinput>
-        <userinput>0000 CAFE 2001 0DB8 0001 0000 0000 0000 0000 BABE"</userinput>
-&gt; <userinput>config commit</userinput>
-        </screen>
-       (The value for the setting of the "data" element is split across two
-        lines in this document for clarity: when entering the command, the
-        whole string should be entered on the same line.)
-      </para>
-
-    <para>
-      It is possible to override options on a per-subnet basis.  If
-      clients connected to most of your subnets are expected to get the
-      same values of a given option, you should use global options: you
-      can then override specific values for a small number of subnets.
-      On the other hand, if you use different values in each subnet,
-      it does not make sense to specify global option values
-      (Dhcp6/option-data), rather you should set only subnet-specific values
-      (Dhcp6/subnet[X]/option-data[Y]).
-     </para>
-     <para>
-      The following commands override the global
-      DNS servers option for a particular subnet, setting a single DNS
-      server with address 2001:db8:1::3.
-      <screen>
-&gt; <userinput>config add Dhcp6/subnet6[0]/option-data</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/name "dns-servers"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/code 23</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/option-data[0]/data "2001:db8:1::3"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-    </para>
-
-    <note>
-      <para>
-        In future versions of BIND 10 DHCP, it will not be necessary to specify
-        option code, space and csv-format fields, as those fields will be set
-        automatically.
-      </para>
-    </note>
-
-
-    <para>
-      The currently supported standard DHCPv6 options are
-      listed in <xref linkend="dhcp6-std-options-list"/>.
-      The "Name" and "Code"
-      are the values that should be used as a name in the option-data
-      structures. "Type" designates the format of the data: the meanings of
-      the various types is given in <xref linkend="dhcp-types"/>.
-    </para>
-    <para>
-      Some options are designated as arrays, which means that more than one
-      value is allowed in such an option. For example the option dns-servers
-      allows the specification of more than one IPv6 address, so allowing
-      clients to obtain the the addresses of multiple DNS servers.
-    </para>
-
-<!-- @todo: describe record types -->
-
-      <para>
-        The <xref linkend="dhcp6-custom-options"/> describes the configuration
-        syntax to create custom option definitions (formats). It is generally not
-        allowed to create custom definitions for standard options, even if the
-        definition being created matches the actual option format defined in the
-        RFCs. There is an exception from this rule for standard options for which
-        Kea does not provide a definition yet. In order to use such options,
-        a server administrator must create a definition as described in
-        <xref linkend="dhcp6-custom-options"/> in the 'dhcp6' option space. This
-        definition should match the option format described in the relevant
-        RFC but configuration mechanism would allow any option format as it has
-        no means to validate it at the moment.
-      </para>
-
-
-    <para>
-      <table frame="all" id="dhcp6-std-options-list">
-        <title>List of standard DHCPv6 options</title>
-        <tgroup cols='4'>
-        <colspec colname='name'/>
-        <colspec colname='code'/>
-        <colspec colname='type'/>
-        <colspec colname='array'/>
-        <thead>
-          <row><entry>Name</entry><entry>Code</entry><entry>Type</entry><entry>Array?</entry></row>
-        </thead>
-        <tbody>
-<!-- Our engine uses those options on its own, admin must not configure them on his own
-<row><entry>clientid</entry><entry>1</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>serverid</entry><entry>2</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>ia-na</entry><entry>3</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>ia-ta</entry><entry>4</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>iaaddr</entry><entry>5</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>oro</entry><entry>6</entry><entry>uint16</entry><entry>true</entry></row> -->
-<row><entry>preference</entry><entry>7</entry><entry>uint8</entry><entry>false</entry></row>
-
-<!-- Our engine uses those options on its own, admin must not configure them on his own
-<row><entry>elapsed-time</entry><entry>8</entry><entry>uint16</entry><entry>false</entry></row>
-<row><entry>relay-msg</entry><entry>9</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>auth</entry><entry>11</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>unicast</entry><entry>12</entry><entry>ipv6-address</entry><entry>false</entry></row>
-<row><entry>status-code</entry><entry>13</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>rapid-commit</entry><entry>14</entry><entry>empty</entry><entry>false</entry></row>
-<row><entry>user-class</entry><entry>15</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>vendor-class</entry><entry>16</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>vendor-opts</entry><entry>17</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>interface-id</entry><entry>18</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>reconf-msg</entry><entry>19</entry><entry>uint8</entry><entry>false</entry></row>
-<row><entry>reconf-accept</entry><entry>20</entry><entry>empty</entry><entry>false</entry></row> -->
-<row><entry>sip-server-dns</entry><entry>21</entry><entry>fqdn</entry><entry>true</entry></row>
-<row><entry>sip-server-addr</entry><entry>22</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>dns-servers</entry><entry>23</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>domain-search</entry><entry>24</entry><entry>fqdn</entry><entry>true</entry></row>
-<!-- <row><entry>ia-pd</entry><entry>25</entry><entry>record</entry><entry>false</entry></row> -->
-<!-- <row><entry>iaprefix</entry><entry>26</entry><entry>record</entry><entry>false</entry></row> -->
-<row><entry>nis-servers</entry><entry>27</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>nisp-servers</entry><entry>28</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>nis-domain-name</entry><entry>29</entry><entry>fqdn</entry><entry>true</entry></row>
-<row><entry>nisp-domain-name</entry><entry>30</entry><entry>fqdn</entry><entry>true</entry></row>
-<row><entry>sntp-servers</entry><entry>31</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>information-refresh-time</entry><entry>32</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>bcmcs-server-dns</entry><entry>33</entry><entry>fqdn</entry><entry>true</entry></row>
-<row><entry>bcmcs-server-addr</entry><entry>34</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>geoconf-civic</entry><entry>36</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>remote-id</entry><entry>37</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>subscriber-id</entry><entry>38</entry><entry>binary</entry><entry>false</entry></row>
-<row><entry>client-fqdn</entry><entry>39</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>pana-agent</entry><entry>40</entry><entry>ipv6-address</entry><entry>true</entry></row>
-<row><entry>new-posix-timezone</entry><entry>41</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>new-tzdb-timezone</entry><entry>42</entry><entry>string</entry><entry>false</entry></row>
-<row><entry>ero</entry><entry>43</entry><entry>uint16</entry><entry>true</entry></row>
-<row><entry>lq-query</entry><entry>44</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>client-data</entry><entry>45</entry><entry>empty</entry><entry>false</entry></row>
-<row><entry>clt-time</entry><entry>46</entry><entry>uint32</entry><entry>false</entry></row>
-<row><entry>lq-relay-data</entry><entry>47</entry><entry>record</entry><entry>false</entry></row>
-<row><entry>lq-client-link</entry><entry>48</entry><entry>ipv6-address</entry><entry>true</entry></row>
-        </tbody>
-        </tgroup>
-      </table>
-    </para>
-    </section>
-
-    <section id="dhcp6-custom-options">
-      <title>Custom DHCPv6 options</title>
-      <para>It is also possible to define options other than the standard ones.
-      Assume that we want to define a new DHCPv6 option called "foo" which will have
-      code 100 and will convey a single unsigned 32 bit integer value. We can define
-      such an option by using the following commands:
-      <screen>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/code 100</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/type "uint32"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      The "false" value of the "array" parameter determines that the option
-      does NOT comprise an array of "uint32" values but rather a single value.
-      Two other parameters have been left blank: "record-types" and "encapsulate".
-      The former specifies the comma separated list of option data fields if the
-      option comprises a record of data fields. The "record-fields" value should
-      be non-empty if the "type" is set to "record". Otherwise it must be left
-      blank. The latter parameter specifies the name of the option space being
-      encapsulated by the particular option. If the particular option does not
-      encapsulate any option space it should be left blank.
-      Note that the above set of comments define the format of the new option and do not
-      set its values.
-      </para>
-      <para>Once the new option format is defined, its value is set
-      in the same way as for a standard option. For example the following
-      commands set a global value that applies to all subnets.
-        <screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/code 100</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/data "12345"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <para>New options can take more complex forms than simple use of
-      primitives (uint8, string, ipv6-address etc): it is possible to
-      define an option comprising a number of existing primitives.
-      </para>
-      <para>
-      Assume we want to define a new option that will consist of an IPv6
-      address, followed by an unsigned 16 bit integer, followed by a
-      boolean value, followed by a text string. Such an option could
-      be defined in the following way:
-<screen>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/name "bar"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/code 101</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/type "record"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/record-types "ipv6-address, uint16, boolean, string"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
-</screen>
-      The "type" is set to "record" to indicate that the option contains
-      multiple values of different types.  These types are given as a comma-separated
-      list in the "record-types" field and should be those listed in <xref linkend="dhcp-types"/>.
-      </para>
-      <para>
-      The values of the option are set as follows:
-<screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/name "bar"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/code 101</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8:1::10, 123, false, Hello World"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      "csv-format" is set "true" to indicate that the "data" field comprises a command-separated
-      list of values.  The values in the "data" must correspond to the types set in
-      the "record-types" field of the option definition.
-      </para>
-      <note>
-        <para>
-          It is recommended that boolean values are specified using "true" and "false"
-          strings. This helps to prevent errors when typing multiple comma separated
-          values, as it make it easier to identify the type of the value being typed,
-          and compare it with the order of data fields. Nevertheless, it is possible
-          to use integer values: "1" and "0", instead of "true" and "false"
-          accordingly. If other integer value is specified, the configuration is
-          rejected.
-        </para>
-      </note>
-    </section>
-
-    <section id="dhcp6-vendor-opts">
-      <title>DHCPv6 vendor specific options</title>
-      <para>
-      Currently there are three option spaces defined: dhcp4 (to be used
-      in DHCPv4 daemon) and dhcp6 (for the DHCPv6 daemon); there is also
-      vendor-opts-space, which is empty by default, but options can be
-      defined in it. Those options are called vendor-specific information
-      options. The following examples show how to define an option "foo"
-      with code 1 that consists of an IPv6 address, an unsigned 16 bit integer
-      and a string. The "foo" option is conveyed in a vendor specific
-      information option. This option comprises a single uint32 value
-      that is set to "12345". The sub-option "foo" follows the data
-      field holding this value.
-      <screen>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/space "vendor-opts-space"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/type "record"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/record-types "ipv6-address, uint16, string"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/encapsulates ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-     (Note that the option space is set to "vendor-opts-space".)
-     Once the option format is defined, the next step is to define actual values
-     for that option:
-     <screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/name "foo"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/space "vendor-opts-space"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8:1::10, 123, Hello World"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-    We should also define values for the vendor-opts, that will convey our option foo.
-     <screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/name "vendor-opts"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/code 17</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/data "12345"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-    </section>
-
-    <section id="dhcp6-option-spaces">
-      <title>Nested DHCPv6 options (custom option spaces)</title>
-      <para>It is sometimes useful to define completely new option
-      spaces.  This is useful if the user wants his new option to
-      convey sub-options that use separate numbering scheme, for
-      example sub-options with codes 1 and 2. Those option codes
-      conflict with standard DHCPv6 options, so a separate option
-      space must be defined.
-      </para>
-      <para>Note that it is not required to create new option space when
-      defining sub-options for a standard option because it is by
-      default created if the standard option is meant to convey
-      any sub-options (see <xref linkend="dhcp6-vendor-opts"/>).
-      </para>
-      <para>
-      Assume that we want to have a DHCPv6 option called "container"
-      with code 102 that conveys two sub-options with codes 1 and 2.
-      First we need to define the new sub-options:
-<screen>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/name "subopt1"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/type "ipv6-address"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[0]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput>
-&gt; <userinput></userinput>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/name "subopt2"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/code 2</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/type "string"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[1]/encapsulate ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-    Note that we have defined the options to belong to a new option space
-    (in this case, "isc").
-    </para>
-    <para>
-The next step is to define a regular DHCPv6 option and specify that it
-should include options from the isc option space:
-<screen>
-&gt; <userinput>config add Dhcp6/option-def</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/name "container"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/code 102</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/type "empty"</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/array false</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/record-types ""</userinput>
-&gt; <userinput>config set Dhcp6/option-def[2]/encapsulate "isc"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-    The name of the option space in which the sub-options are defined
-    is set in the "encapsulate" field. The "type" field is set to "empty"
-    which imposes that this option does not carry any data other than
-    sub-options.
-    </para>
-    <para>
-    Finally, we can set values for the new options:
-<screen>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/name "subopt1"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/code 1</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[0]/data "2001:db8::abcd"</userinput>
-&gt; <userinput>config commit</userinput>
-&gt; <userinput></userinput>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/name "subopt2"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/space "isc"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/code 2</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[1]/data "Hello world"</userinput>
-&gt; <userinput>config commit</userinput>
-&gt; <userinput></userinput>
-&gt; <userinput>config add Dhcp6/option-data</userinput>
-&gt; <userinput>config set Dhcp6/option-data[2]/name "container"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[2]/space "dhcp6"</userinput>
-&gt; <userinput>config set Dhcp6/option-data[2]/code 102</userinput>
-&gt; <userinput>config set Dhcp6/option-data[2]/csv-format true</userinput>
-&gt; <userinput>config set Dhcp6/option-data[2]/data ""</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-    Even though the "container" option does not carry any data except
-    sub-options, the "data" field must be explicitly set to an empty value.
-    This is required because in the current version of BIND 10 DHCP, the
-    default configuration values are not propagated to the configuration parsers:
-    if the "data" is not set the parser will assume that this
-    parameter is not specified and an error will be reported.
-    </para>
-    <para>Note that it is possible to create an option which carries some data
-    in addition to the sub-options defined in the encapsulated option space.  For example,
-    if the "container" option from the previous example was required to carry an uint16
-    value as well as the sub-options, the "type" value would have to be set to "uint16" in
-    the option definition. (Such an option would then have the following
-    data structure: DHCP header, uint16 value, sub-options.) The value specified
-    with the "data" parameter - which should be a valid integer enclosed in quotes,
-    e.g. "123" - would then be assigned to the uint16 field in the "container" option.
-    </para>
-    </section>
-
-      <section id="dhcp6-config-subnets">
-        <title>IPv6 Subnet Selection</title>
-          <para>
-          The DHCPv6 server may receive requests from local (connected to the
-          same subnet as the server) and remote (connecting via relays) clients.
-          As server may have many subnet configurations defined, it must select
-          appropriate subnet for a given request.
-          </para>
-          <para>
-          The server can not assume which of configured subnets are local. It is
-          possible in IPv4, where there is reasonable expectation that the
-          server will have a (global) IPv4 address configured on the interface,
-          and can use that information to detect whether a subnet is local or
-          not. That assumption is not true in IPv6, as the DHCPv6 must be able
-          to operate with having link-local addresses only. Therefore an optional
-          &quot;interface&quot; parameter is available within a subnet definition
-          to designate that a given subnet is local, i.e. reachable directly over
-          specified interface. For example the server that is intended to serve
-          a local subnet over eth0 may be configured as follows:
-<screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:beef::/48"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:beef::/48" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/interface "eth0"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-        </para>
-      </section>
-
-      <section id="dhcp6-relays">
-        <title>DHCPv6 Relays</title>
-        <para>
-          A DHCPv6 server with multiple subnets defined must select the
-          appropriate subnet when it receives a request from client.  For clients
-          connected via relays, two mechanisms are used:
-        </para>
-        <para>
-          The first uses the linkaddr field in the RELAY_FORW message. The name
-          of this field is somewhat misleading in that it does not contain a link-layer
-          address: instead, it holds an address (typically a global address) that is
-          used to identify a link. The DHCPv6 server checks if the address belongs
-          to a defined subnet and, if it does, that subnet is selected for the client's
-          request.
-        </para>
-        <para>
-          The second mechanism is based on interface-id options. While forwarding a client's
-          message, relays may insert an interface-id option into the message that
-          identifies the interface on the relay that received the message. (Some
-          relays allow configuration of that parameter, but it is sometimes
-          hardcoded and may range from the very simple (e.g. "vlan100") to the very cryptic:
-          one example seen on real hardware was "ISAM144|299|ipv6|nt:vp:1:110"). The
-          server can use this information to select the appropriate subnet.
-          The information is also returned to the relay which then knows the
-          interface to use to transmit the response to the client. In order for
-          this to work successfully, the relay interface IDs must be unique within
-          the network and the server configuration must match those values.
-        </para>
-        <para>
-          When configuring the DHCPv6 server, it should be noted that two
-          similarly-named parameters can be configured for a subnet:
-          <itemizedlist>
-            <listitem><simpara>
-              "interface" defines which local network interface can be used
-              to access a given subnet.
-            </simpara></listitem>
-            <listitem><simpara>
-              "interface-id" specifies the content of the interface-id option
-              used by relays to identify the interface on the relay to which
-              the response packet is sent.
-            </simpara></listitem>
-          </itemizedlist>
-          The two are mutually exclusive: a subnet cannot be both reachable locally
-          (direct traffic) and via relays (remote traffic). Specifying both is a
-          configuration error and the DHCPv6 server will refuse such a configuration.
-        </para>
-
-        <para>
-          To specify interface-id with value "vlan123", the following commands can
-          be used:
-          <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:beef::/48"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:beef::/48" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/interface-id "vland123"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-        </para>
-      </section>
-
-    <section id="dhcp6-client-classifier">
-      <title>Client Classification in DHCPv6</title>
-      <note>
-      <para>
-        DHCPv6 server has been extended to support limited client classification.
-        Although the current capability is modest, it is expected to be expanded
-        in the future. It is envisaged that the majority of client classification
-        extensions will be using hooks extensions.
-      </para>
-      </note>
-      <para>In certain cases it is useful to differentiate between different types
-      of clients and treat them differently. The process of doing classification
-      is conducted in two steps. The first step is to assess incoming packet and
-      assign it to zero or more classes. This classification is currently simple,
-      but is expected to grow in capability soon. Currently the server checks whether
-      incoming packet has vendor class option (16). If it has, content
-      of that option is prepended with &quot;VENDOR_CLASS_&quot; interpreted as a
-      class. For example, modern cable modems will send this option with value
-      &quot;docsis3.0&quot; and as a result the packet will belong to class
-      &quot;VENDOR_CLASS_docsis3.0&quot;.
-      </para>
-
-      <para>It is envisaged that the client classification will be used for changing
-      behavior of almost any part of the DHCP engine processing, including assigning
-      leases from different pools, assigning different option (or different values of
-      the same options) etc. For now, there is only one mechanism that is taking
-      advantage of client classification: subnet selection.</para>
-
-      <para>
-        Kea can be instructed to limit access to given subnets based on class information.
-        This is particularly useful for cases where two types of devices share the
-        same link and are expected to be served from two different subnets. The
-        primary use case for such a scenario are cable networks. There are two
-        classes of devices: cable modem itself, which should be handled a lease
-        from subnet A and all other devices behind modems that should get a lease
-        from subnet B. That segregation is essential to prevent overly curious
-        users from playing with their cable modems. For details on how to set up
-        class restrictions on subnets, see <xref linkend="dhcp6-subnet-class"/>.
-      </para>
-
-    </section>
-
-    <section id="dhcp6-subnet-class">
-      <title>Limiting access to IPv6 subnet to certain classes</title>
-      <para>
-        In certain cases it beneficial to restrict access to certains subnets
-        only to clients that belong to a given subnet. For details on client
-        classes, see <xref linkend="dhcp6-client-classifier"/>. This is an
-        extension of a previous example from <xref linkend="dhcp6-address-config"/>.
-
-        Let's assume that the server is connected to a network segment that uses
-        the 2001:db8:1::/64 prefix. The Administrator of that network has
-        decided that addresses from range 2001:db8:1::1 to 2001:db8:1::ffff are
-        going to be managed by the Dhcp6 server. Only clients belonging to the
-        eRouter1.0 client class are allowed to use that pool. Such a
-        configuration can be achieved in the following way:
-
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::0 - 2001:db8:1::ffff" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/client-class "eRouter1.0"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-      <para>
-        Care should be taken with client classification as it is easy to prevent
-        clients that do not meet class criteria to be denied any service altogether.
-      </para>
-    </section>
-
-
-    <section id="dhcp6-ddns-config">
-      <title>Configuring DHCPv6 for DDNS</title>
-      <para>
-      As mentioned earlier, b10-dhcp6 can be configured to generate requests to
-      the DHCP-DDNS server (referred to here as the "D2" server) to update
-      DNS entries.  These requests are known as NameChangeRequests or NCRs.
-      Each NCR contains the following information:
-      <orderedlist>
-      <listitem><para>
-      Whether it is a request to add (update) or remove DNS entries
-      </para></listitem>
-      <listitem><para>
-      Whether the change requests forward DNS updates (AAAA records), reverse
-      DNS updates (PTR records), or both.
-      </para></listitem>
-      <listitem><para>
-      The FQDN, lease address, and DHCID
-      </para></listitem>
-      </orderedlist>
-      The parameters controlling the generation of NCRs for submission to D2
-      are contained in the "dhcp-ddns" section of b10-dhcp6
-      configuration. The default values for this section appears as follows:
-<screen>
-&gt; <userinput>config show Dhcp6/dhcp-ddns</userinput>
-Dhcp6/dhcp-ddns/enable-updates true    boolean
-Dhcp6/dhcp-ddns/server-ip      "127.0.0.1"     string
-Dhcp6/dhcp-ddns/server-port    53001   integer
-Dhcp6/dhcp-ddns/sender-ip      ""      string
-Dhcp6/dhcp-ddns/sender-port    0       integer
-Dhcp6/dhcp-ddns/max-queue-size 1024 integer
-Dhcp6/dhcp-ddns/ncr-protocol   "UDP"   string
-Dhcp6/dhcp-ddns/ncr-format     "JSON"  string
-Dhcp6/dhcp-ddns/override-no-update     false   boolean
-Dhcp6/dhcp-ddns/override-client-update false   boolean
-Dhcp6/dhcp-ddns/replace-client-name    false   boolean
-Dhcp6/dhcp-ddns/generated-prefix       "myhost"        string
-Dhcp6/dhcp-ddns/qualifying-suffix      "example.com"   string
-</screen>
-      </para>
-      <para>
-      The "enable-updates" parameter determines whether or not b10-dhcp6 will
-      generate NCRs.  By default, this value is false hence DDNS updates are
-      disabled.  To enable DDNS updates set this value to true as follows:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/enable-updates true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <section id="dhcpv6-d2-io-config">
-      <title>DHCP-DDNS Server Connectivity</title>
-      <para>
-      In order for NCRs to reach the D2 server, b10-dhcp6 must be able
-      to communicate with it.  b10-dhcp6 uses the following configuration
-      parameters to control how it communications with D2:
-      <orderedlist>
-      <listitem><para>
-      server-ip - IP address on which D2 listens for requests. The default is
-      the local loopback interface at address 127.0.0.1. You may specify
-      either an IPv4 or IPv6 address.
-      </para></listitem>
-      <listitem><para>
-      server-port - port on which D2 listens for requests.  The default value
-      is 53001.
-      </para></listitem>
-      <listitem><para>
-      sender-ip - IP address which b10-dhcp6 should use to send requests to D2.
-      The default value is blank which instructs b10-dhcp6 to select a suitable
-      address.
-      </para></listitem>
-      <listitem><para>
-      sender-port - port which b10-dhcp6 should use to send requests to D2. The
-      default value of 0 instructs b10-dhcp6 to select suitable port.
-      </para></listitem>
-      <listitem><para>
-      ncr-format - Socket protocol use when sending requests to D2.  Currently
-      only UDP is supported.  TCP may be available in an upcoming release.
-      </para></listitem>
-      <listitem><para>
-      ncr-protocol - Packet format to use when sending requests to D2.
-      Currently only JSON format is supported.  Other formats may be available
-      in future releases.
-      </para></listitem>
-      <listitem><para>
-      max-queue-size - maximum number of requests allowed to queue waiting to
-      be sent to D2. This value guards against requests accumulating
-      uncontrollably if they are being generated faster than they can be
-      delivered.  If the number of requests queued for transmission reaches
-      this value, DDNS updating will be turned off until the queue backlog has
-      been sufficiently reduced.  The intent is allow b10-dhcp6 to
-      continue lease operations.  The default value is 1024.
-      </para></listitem>
-      </orderedlist>
-      By default, D2 is assumed to running on the same machine as b10-dhcp6, and
-      all of the default values mentioned above should be sufficient.
-      If, however, D2 has been configured to listen on a different address or
-      port, these values must altered accordingly. For example, if D2 has been
-      configured to listen on 3001::5 port 900, the following commands
-      would be required:
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/server-ip "3001::5"</userinput>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/server-port 900</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      </section>
-      <section id="dhcpv6-d2-rules-config">
-      <title>When does b10-dhcp6 generate DDNS request</title>
-      b10-dhcp6 follows the behavior prescribed for DHCP servers in RFC 4704.
-      It is important to keep in mind that b10-dhcp6 provides the initial decision
-      making of when and what to update and forwards that information to D2 in
-      the form of NCRs. Carrying out the actual DNS updates and dealing with
-      such things as conflict resolution are the purview of D2 (<xref linkend="dhcp-ddns-server"/>).
-      <para>
-      This section describes when b10-dhcp6 will generate NCRs and the
-      configuration parameters that can be used to influence this decision.
-      It assumes that the "enable-updates" parameter is true.
-      </para>
-      <note>
-        <para>
-        Currently the interface between b10-dhcp6 and D2 only supports requests
-        which update DNS entries for a single IP address.  If a lease grants
-        more than one address, b10-dhcp6 will create the DDNS update request for
-        only the first of these addresses.  Support for multiple address
-        mappings may be provided in a future release.
-        </para>
-      </note>
-      <para>
-      In general, b10-dhcp6 will generate DDNS update requests when:
-      <orderedlist>
-      <listitem><para>
-      A new lease is granted in response to a DHCP REQUEST
-      </para></listitem>
-      <listitem><para>
-      An existing lease is renewed but the FQDN associated with it has
-      changed.
-      </para></listitem>
-      <listitem><para>
-      An existing lease is released in response to a DHCP RELEASE
-      </para></listitem>
-      </orderedlist>
-      In the second case, lease renewal, two  DDNS requests will be issued: one
-      request to remove entries for the previous FQDN and a second request to
-      add entries for the new FQDN.  In the last case, a lease release, a
-      single DDNS request to remove its entries will be made.  The decision
-      making involved when granting a new lease is more involved and is
-      discussed next.
-      </para>
-      <para>
-      b10-dhcp6 will generate a DDNS update request only if the DHCP REQUEST
-      contains the FQDN option (code 39). By default b10-dhcp6 will
-      respect the FQDN N and S flags specified by the client as shown in the
-      following table:
-      </para>
-        <table id="dhcp6-fqdn-flag-table">
-          <title>Default FQDN Flag Behavior</title>
-          <tgroup cols='4' align='left'>
-          <colspec colname='cflags'/>
-          <colspec colname='meaning'/>
-          <colspec colname='response'/>
-          <colspec colname='sflags'/>
-          <thead>
-              <row>
-                <entry>Client Flags:N-S</entry>
-                <entry>Client Intent</entry>
-                <entry>Server Response</entry>
-                <entry>Server Flags:N-S-O</entry>
-              </row>
-          </thead>
-          <tbody>
-            <row>
-                <entry>0-0</entry>
-                <entry>
-                Client wants to do forward updates, server should do reverse updates
-                </entry>
-                <entry>Server generates reverse-only request</entry>
-                <entry>1-0-0</entry>
-            </row>
-            <row>
-                <entry>0-1</entry>
-                <entry>Server should do both forward and reverse updates</entry>
-                <entry>Server generates request to update both directions</entry>
-                <entry>0-1-0</entry>
-            </row>
-            <row>
-                <entry>1-0</entry>
-                <entry>Client wants no updates done</entry>
-                <entry>Server does not generate a request</entry>
-                <entry>1-0-0</entry>
-            </row>
-          </tbody>
-          </tgroup>
-        </table>
-      <para>
-      The first row in the table above represents "client delegation". Here
-      the DHCP client states that it intends to do the forward DNS updates and
-      the server should do the reverse updates.  By default, b10-dhcp6 will honor
-      the client's wishes and generate a DDNS request to D2 to update only
-      reverse DNS data.  The parameter, "override-client-update", can be used
-      to instruct the server to override client delegation requests.  When
-      this parameter is true, b10-dhcp6 will disregard requests for client
-      delegation and generate a DDNS request to update both forward and
-      reverse DNS data.  In this case, the N-S-O flags in the server's
-      response to the client will be 0-1-1 respectively.
-      </para>
-      <para>
-      (Note that the flag combination N=1, S=1 is prohibited according to
-      RFC 4702. If such a combination is received from the client, the packet
-      will be dropped by b10-dhcp6.)
-      </para>
-      <para>
-      To override client delegation, issue the following commands:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/override-client-update true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The third row in the table above describes the case in which the client
-      requests that no DNS updates be done. The parameter, "override-no-update",
-      can be used to instruct the server to disregard the client's wishes. When
-      this parameter is true, b10-dhcp6 will generate DDNS update request to D2
-      even if the client requests no updates be done.  The N-S-O flags in the
-      server's response to the client will be 0-1-1.
-      </para>
-      <para>
-      To override client delegation, issue the following commands:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/override-no-update true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </section>
-      <section id="dhcpv6-fqdn-name-generation">
-      <title>b10-dhcp6 name generation for DDNS update requests</title>
-      Each NameChangeRequest must of course include the fully qualified domain
-      name whose DNS entries are to be affected.  b10-dhcp6 can be configured to
-      supply a portion or all of that name based upon what it receives from
-      the client in the DHCP REQUEST.
-      <para>
-      The rules for determining the FQDN option are as follows:
-      <orderedlist>
-      <listitem><para>
-      If configured to do so ignore the REQUEST contents and generate a
-      FQDN using a configurable prefix and suffix.
-      </para></listitem>
-      <listitem><para>
-      Otherwise, using is the domain name value from the client FQDN option as
-      the candidate name:
-      <orderedlist>
-      <listitem><para>
-      If the candidate name is a fully qualified domain name then use it.
-      </para></listitem>
-      <listitem><para>
-      If the candidate name is a partial (i.e. unqualified) name then
-      add a configurable suffix to the name and use the result as the FQDN.
-      </para></listitem>
-      <listitem><para>
-      If the candidate name is a empty then generate a FQDN using a
-      configurable prefix and suffix.
-      </para></listitem>
-      </orderedlist>
-      </para></listitem>
-      </orderedlist>
-      To instruct b10-dhcp6 to always generate a FQDN, set the parameter
-      "replace-client-name" to true:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/replace-client-name true</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The prefix used when generating a FQDN is specified by the
-      "generated-prefix" parameter.  The default value is "myhost".  To alter
-      its value, simply set it to the desired string:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/generated-prefix "another.host"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      <para>
-      The suffix used when generating a FQDN or when qualifying a partial
-      name is specified by the "qualifying-suffix" parameter.  The default
-      value is "example.com".  To alter its value simply set it to the desired
-      string:
-      </para>
-<screen>
-&gt; <userinput>config set Dhcp6/dhcp-ddns/generated-prefix "our.net"</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </section>
-      <para>
-      When qualifying a partial name, b10-dhcp6 will construct a name with the
-      format:
-      </para>
-      <para>
-        [candidate-name].[qualifying-suffix].
-      </para>
-      <para>
-      where candidate-name is the partial name supplied in the REQUEST.
-      For example, if FQDN domain name value was "some-computer" and assuming
-      the default value for qualifying-suffix, the generated FQDN would be:
-      </para>
-      <para>
-        some-computer.example.com.
-      </para>
-      <para>
-      When generating a the entire name, b10-dhcp6 will construct name of the
-      format:
-      </para>
-      <para>
-        [generated-prefix]-[address-text].[qualifying-suffix].
-      </para>
-      <para>
-      where address-text is simply the lease IP address converted to a
-      hyphenated string.  For example, if lease address is 3001:1::70E and
-      assuming default values for generated-prefix and qualifying-suffix, the
-      generated FQDN would be:
-      </para>
-      <para>
-        myhost-3001-1--70E.example.com.
-      </para>
-    </section>
-
-   </section>
-
-    <section id="dhcp6-serverid">
-      <title>Server Identifier in DHCPv6</title>
-      <para>The DHCPv6 protocol uses a "server identifier" (also known
-      as a DUID) for clients to be able to discriminate between several
-      servers present on the same link.  There are several types of
-      DUIDs defined, but <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> instructs servers to use DUID-LLT if
-      possible. This format consists of a link-layer (MAC) address and a
-      timestamp. When started for the first time, the DHCPv6 server will
-      automatically generate such a DUID and store the chosen value to
-      a file.  That file is read by the server
-      and the contained value used whenever the server is subsequently started.
-      </para>
-      <para>
-        It is unlikely that this parameter should ever need to be changed.
-        However, if such a need arises, stop the server, edit the file and restart
-        the server. (The file is named b10-dhcp6-serverid and by default is
-        stored in the "var" subdirectory of the directory in which BIND 10 is installed.
-        This can be changed when BIND 10 is built by using "--localstatedir"
-        on the "configure" command line.)  The file is a text file that contains
-        double digit hexadecimal values
-        separated by colons. This format is similar to typical MAC address
-        format. Spaces are ignored. No extra characters are allowed in this
-        file.
-      </para>
-
-    </section>
-
-    <section id="dhcp6-relay-override">
-      <title>Using specific relay agent for a subnet</title>
-      <para>
-        The relay has to have an interface connected to the link on which
-        the clients are being configured. Typically the relay has a global IPv6
-        address configured on that interface that belongs to the subnet that
-        the server will assign addresses from. In such typical case, the
-        server is able to use IPv6 address inserted by the relay (in link-addr
-        field in RELAY-FORW message) to select appropriate subnet.
-      </para>
-      <para>
-        However, that is not always the case. The relay
-        address may not match the subnet in certain deployments. This
-        usually means that there is more than one subnet allocated for a given
-        link. Two most common examples where this is the case are long lasting
-        network renumbering (where both old and new address space is still being
-        used) and a cable network. In a cable network both cable modems and the
-        devices behind them are physically connected to the same link, yet
-        they use distinct addressing. In such case, the DHCPv6 server needs
-        additional information (like the value of interface-id option or IPv6
-        address inserted in the link-addr field in RELAY-FORW message) to
-        properly select an appropriate subnet.
-      </para>
-      <para>
-        The following example assumes that there is a subnet 2001:db8:1::/64
-        that is accessible via relay that uses 3000::1 as its IPv6 address.
-        The server will be able to select this subnet for any incoming packets
-        that came from a relay that has an address in 2001:db8:1::/64 subnet.
-        It will also select that subnet for a relay with address 3000::1.
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "2001:db8:1::2 - 2001:db8:1::ffff" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/relay/ip-address "3000::1"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-
-    </section>
-
-      <section id="dhcp6-client-class-relay">
-        <title>Segregating IPv6 clients in a cable network</title>
-        <para>
-          In certain cases, it is useful to mix relay address information,
-          introduced in <xref linkend="dhcp6-relay-override"/> with client
-          classification, explained in <xref linkend="dhcp6-subnet-class"/>.
-          One specific example is cable network, where typically modems
-          get addresses from a different subnet than all devices connected
-          behind them.
-        </para>
-        <para>
-          Let's assume that there is one CMTS (Cable Modem Termination System)
-          with one CM MAC (a physical link that modems are connected to).
-          We want the modems to get addresses from the 3000::/64 subnet,
-          while everything connected behind modems should get addresses from
-          another subnet (2001:db8:1::/64). The CMTS that acts as a relay
-          an uses address 3000::1. The following configuration can serve
-          that configuration:
-        <screen>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/subnet "3000::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/pool [ "3000::2 - 3000::ffff" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/client-class "docsis3.0"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[0]/relay/ip-address "3000::1"</userinput>
-&gt; <userinput>config add Dhcp6/subnet6</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/subnet "2001:db8:1::/64"</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/pool [ "2001:db8:1::1 - 2001:db8:1::ffff" ]</userinput>
-&gt; <userinput>config set Dhcp6/subnet6[1]/relay/ip-address "3000::1"</userinput>
-&gt; <userinput>config commit</userinput></screen>
-      </para>
-      </section>
-
-
-    <section id="dhcp6-std">
-      <title>Supported Standards</title>
-      <para>The following standards and draft standards are currently
-      supported:</para>
-      <itemizedlist>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink>: Supported messages are SOLICIT,
-            ADVERTISE, REQUEST, RELEASE, RENEW, REBIND and REPLY.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink>: Supported options are IA_PD and
-            IA_PREFIX. Also supported is the status code NoPrefixAvail.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc3646">RFC 3646</ulink>: Supported option is DNS_SERVERS.</simpara>
-          </listitem>
-          <listitem>
-            <simpara><ulink url="http://tools.ietf.org/html/rfc4704">RFC 4704</ulink>: Supported option is CLIENT_FQDN.</simpara>
-          </listitem>
-      </itemizedlist>
-    </section>
-
-    <section id="dhcp6-limit">
-      <title>DHCPv6 Server Limitations</title>
-      <para> These are the current limitations and known problems
-      with the DHCPv6 server
-      software. Most of them are reflections of the early stage of
-      development and should be treated as <quote>not implemented
-      yet</quote>, rather than actual limitations.</para>
-      <itemizedlist>
-          <listitem> <!-- see tickets #3234, #3281 -->
-            <para>
-              On-line configuration has some limitations. Adding new subnets or
-              modifying existing ones work, as is removing the last subnet from
-              the list. However, removing non-last (e.g. removing subnet 1,2 or 3 if
-              there are 4 subnets configured) will cause issues. The problem is
-              caused by simplistic subnet-id assignment. The subnets are always
-              numbered, starting from 1. That subnet-id is then used in leases
-              that are stored in the lease database. Removing non-last subnet will
-              cause the configuration information to mismatch data in the lease
-              database. It is possible to manually update subnet-id fields in
-              MySQL or PostgreSQL database, but it is awkward and error prone
-              process. A better reconfiguration support is planned.
-            </para>
-          </listitem>
-
-        <listitem>
-          <para>
-            On startup, the DHCPv6 server does not get the full configuration from
-            BIND 10.  To remedy this, after starting BIND 10, modify any parameter
-            and commit the changes, e.g.
-            <screen>
-&gt; <userinput>config show Dhcp6/renew-timer</userinput>
-Dhcp6/renew-timer      1000    integer (default)
-&gt; <userinput>config set Dhcp6/renew-timer 1001</userinput>
-&gt; <userinput>config commit</userinput></screen>
-          </para>
-        </listitem>
-        <listitem>
-          <simpara>Temporary addresses are not supported.</simpara>
-        </listitem>
-        <listitem>
-          <simpara>
-            The server will allocate, renew or rebind a maximum of one lease
-            for a particular IA option (IA_NA or IA_PD) sent by a client.
-            <ulink url="http://tools.ietf.org/html/rfc3315">RFC 3315</ulink> and
-            <ulink url="http://tools.ietf.org/html/rfc3633">RFC 3633</ulink> allow
-            for multiple addresses or prefixes to be allocated for a single IA.
-          </simpara>
-        </listitem>
-        <listitem>
-          <simpara>Temporary addresses are not supported.</simpara>
-        </listitem>
-        <listitem>
-          <simpara>
-            Confirmation (CONFIRM), duplication report (DECLINE),
-            stateless configuration (INFORMATION-REQUEST) and client
-            reconfiguration (RECONFIGURE) are not yet supported.
-          </simpara>
-        </listitem>
-          <listitem>
-            <simpara>
-              The server doesn't act upon expired leases. In particular,
-              when a lease expires, the server doesn't request removal of
-              the DNS records associated with it.
-            </simpara>
-          </listitem>
-      </itemizedlist>
-    </section>
-
-    <!--
-    <section id="dhcp6-srv-examples">
-      <title>Kea DHCPv6 server examples</title>
-
-      <para>
-        This section provides easy to use example. Each example can be read
-        separately. It is not intended to be read sequentially as there will
-        be many repetitions between examples. They are expected to serve as
-        easy to use copy-paste solutions to many common deployments.
-      </para>
-
-      @todo: add simple configuration for direct clients
-      @todo: add configuration for relayed clients
-      @todo: add client classification example
-
-    </section> -->
-
-  </chapter>
-
-  <chapter id="dhcp-ddns-server">
-    <title>The DHCP-DDNS Server</title>
-    <para>
-    The DHCP-DDNS Server (b10-dhcp-ddns, known informally as D2) conducts the client side of
-    the DDNS protocol (defined in RFC 2136) on behalf of the DHCPv4 and DHCPv6
-    servers (b10-dhcp4 and b10-dhcp6 respectively). The DHCP servers construct
-    DDNS update requests, known as NameChangeRequests (NCRs), based upon DHCP
-    lease change events and then post these to D2. D2 attempts to match
-    each such request to the appropriate DNS server(s) and carry out the
-    necessary conversation with those servers to update the DNS data.
-    </para>
-    <para>
-    In order to match a request to appropriate DNS servers, D2 must have a
-    catalog of servers from which to select. In fact, D2 has two such catalogs,
-    one for forward DNS and one for reverse DNS; these catalogs are referred
-    to as DDNS Domain Lists.  Each list consists of one or more named DDNS
-    Domains. Further, each DDNS Domain has a list of of one or more DNS
-    servers that publish the DNS data for that domain.
-    </para>
-    <para>
-    When conducting forward domain matching, D2 will compare the FQDN in
-    the request against the name of each forward DDNS Domain. The domain
-    whose name matches the longest portion of the FQDN is considered the
-    best match.  For example, if the FQDN is "myhost.sample.example.com.",
-    and there are two forward domains in the catalog: "sample.example.com."
-    and "example.com.", the former is regarded as the best match.  In some
-    cases, it may not be possible to find a suitable match. Given the same two
-    forward domains there would be no match for the FQDN, "bogus.net", so the
-    request would be rejected.   Finally, if there are no forward DDNS Domains
-    defined, D2 will simply disregard the forward update portion of requests.
-    </para>
-    <para>
-    When conducting reverse domain matching, D2 constructs a reverse
-    FQDN from the lease address in the request and compare that against
-    the name of each reverse DDNS Domain. Again, the domain whose name matches
-    the longest portion of the FQDN is considered the best match. For instance,
-    if the lease address is "172.16.1.40" and there are two reverse domains in
-    the catalog: "1.16.172.in-addr.arpa." and "16.172.in-addr.arpa", the
-    former is the best match.  As with forward matching, it is possible to not
-    find a suitable match.  Given the same two domains, there would be no
-    match for the lease address, "192.168.1.50", and the request would be
-    rejected. Finally, if there are no reverse DDNS Domains defined, D2 will
-    simply disregard the reverse update portion of requests.
-    </para>
-    <section id="dhcp-ddns-server-start-stop">
-      <title>Starting and Stopping the DHCP-DDNS Server</title>
-      <para>
-      <command>b10-dhcp-ddns</command> is the BIND 10 DHCP-DDNS server and,
-      like other parts of BIND 10, is configured through the
-      <command>bindctl</command> program.
-      </para>
-      <para>
-      After starting BIND 10 and entering bindctl, the first step in
-      configuring the server is to add it to the list of running BIND 10
-      services.
-<screen>
-&gt; <userinput>config add Init/components b10-dhcp-ddns</userinput>
-&gt; <userinput>config set Init/components/b10-dhcp-ddns/kind dispensable</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      <para>
-      To remove <command>b10-dhcp-ddns</command> from the set of running services,
-      the <command>b10-dhcp-ddns</command> is removed from list of Init components:
-<screen>
-&gt; <userinput>config remove Init/components b10-dhcp-ddns</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-      </para>
-      <para>
-      Note that the server was only removed from the list, so it will not be
-      automatically restarted, but the server itself is still running. Hence it
-      is usually desired to stop it:
-      </para>
-<screen>
-&gt; <userinput>DhcpDdns shutdown</userinput>
-</screen>
-      <para>
-      Upon start up the module will load its configuration and begin listening
-      for NCRs based on that configuration.
-      </para>
-    </section> <!-- end start-stop -->
-    <section id="d2-configuration">
-      <title>Configuring the DHCP-DDNS Server</title>
-      <para>
-        Once the server is started, it can be configured. To view the
-        current configuration, use the following command in <command>bindctl</command>:
-        <screen>
-&gt; <userinput>config show DhcpDdns</userinput></screen>
-        When starting b10-dhcp-ddns module for the first time, the default
-        configuration will be available. It will look similar to this:
-<screen>
-&gt; <userinput>config show DhcpDdns</userinput>
-DhcpDdns/ip_address "127.0.0.1" string  (default)
-DhcpDdns/port   53001   integer (default)
-DhcpDdns/dns_server_timeout   100   integer (default)
-DhcpDdns/ncr_protocol  "UDP"   string (default)
-DhcpDdns/ncr_format    "JSON"  string (default)
-DhcpDdns/tsig_keys  []  list    (default)
-DhcpDdns/forward_ddns/ddns_domains  []  list    (default)
-DhcpDdns/reverse_ddns/ddns_domains  []  list    (default)
-</screen>
-      <para>
-      (While displayed, the parameter "interface" is not implemented, and
-      will be removed in the near future.)
-      </para>
-      </para>
-      <para>
-      The configuration can be divided as follows, each of which is described
-      in its own section:
-      </para>
-        <itemizedlist>
-          <listitem>
-            <simpara>
-              <command>Global Server Parameters</command> &mdash;
-              values which control connectivity and global server behavior
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>TSIG Key Info</command> &mdash;
-              defines the TSIG keys used for secure traffic with DNS servers
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>Forward DDNS</command> &mdash;
-              defines the catalog of Forward DDNS Domains
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>Reverse DDNS</command> &mdash;
-              defines the catalog of Forward DDNS Domains
-            </simpara>
-          </listitem>
-        </itemizedlist>
-      <section id="d2-server-parameter-config">
-        <title>Global Server Parameters</title>
-      <orderedlist>
-      <listitem><para>
-      ip_address - IP address on which D2 listens for requests. The default is
-      the local loopback interface at address 127.0.0.1. You may specify
-      either an IPv4 or IPv6 address.
-      </para></listitem>
-      <listitem><para>
-      port - Port on which D2 listens for requests.  The default value
-      is 53001.
-      </para></listitem>
-      <listitem><para>
-      ncr_format - Socket protocol to use when sending requests to D2.
-      Currently only UDP is supported.  TCP may be available in an upcoming
-      release.
-      </para></listitem>
-      <listitem><para>
-      ncr_protocol - Packet format to use when sending requests to D2.
-      Currently only JSON format is supported.  Other formats may be available
-      in future releases.
-      </para></listitem>
-      <listitem><para>
-      dns_server_timeout - The maximum amount of time in milliseconds, that
-      D2 will wait for a response from a DNS server to a single DNS update
-      message.
-      </para></listitem>
-      </orderedlist>
-        <para>
-        D2 must listen for change requests on a known address and port.  By
-        default it listens at 127.0.0.1 on port 53001. The following example
-        illustrates how to change D2's global parameters so it will listen
-        at 192.168.1.10 port 900:
-<screen>
-&gt; <userinput>config set DhcpDdns/ip_address "192.168.1.10"</userinput>
-&gt; <userinput>config set DhcpDdns/port 900</userinput>
-&gt; <userinput>config commit</userinput>
-</screen>
-        </para>
-        <warning>
-          <simpara>
-            When the DHCP-DDNS server is configured to listen at an address
-            other than the loopback address (127.0.0.1 or ::1), it is possible
-            for a malicious attacker to send bogus NameChangeRequests to it
-            and change entries in the DNS. For this reason, addresses other
-            than the IPv4 or IPv6 loopback addresses should only be used
-            for testing purposes. A future version of Kea will implement
-            authentication to guard against such attacks.
-          </simpara>
-        </warning>
-<note>
-<simpara>
-If the ip_address and port are changed, it will be necessary to change the
-corresponding values in the DHCP servers' "dhcp-ddns" configuration section.
-</simpara>
-</note>
-      </section> <!-- "d2-server-parameter-config" -->
-
-      <section id="d2-tsig-key-list-config">
-        <title>TSIG Key List</title>
-        <para>
-        A DDNS protocol exchange can be conducted with or without TSIG
-        (defined in <ulink url="http://tools.ietf/org/html/rfc2845">RFC
-        2845</ulink>). This configuration section allows the administrator
-        to define the set of TSIG keys that may be used in such
-        exchanges.</para>
-
-        <para>To use TSIG when updating entries in a DNS Domain,
-        a key must be defined in the TSIG Key List and referenced by
-        name in that domain's configuration entry.  When D2 matches a
-        change request to a domain, it checks whether the domain has
-        a TSIG key associated with it.  If so, D2 will use that key to
-        sign DNS update messages sent to and verify repsonses received
-        from the domain's DNS server(s). For each TSIG key required by
-        the DNS servers that D2 will be working with there must be a
-        corresponding TSIG key in the TSIG Key list.</para>
-
-        <para>
-        As one might gather from the name, the tsig_key section of the
-        D2 configuration lists the TSIG keys.  Each entry describes a
-        TSIG key used by one or more DNS servers to authenticate requests
-        and sign responses.  Every entry in the list has three parameters:
-        <itemizedlist>
-          <listitem>
-            <simpara>
-              <command>name</command> &mdash;
-              a unique text label used to identify this key within the
-              list.  This value is used to specify which key (if any) should be
-              used when updating a specific domain. So long as it is unique its
-              content is arbitrary, although for clarity and ease of maintenance
-              it is recommended that it match the name used on the DNS server(s).
-              It cannot be blank.
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>algorithm</command> &mdash;
-              specifies which hashing algorithm should be used with this
-              key.  This value must specify the same algorithm used for the
-              key on the DNS server(s). The supported algorithms are listed below:
-              <itemizedlist>
-                <listitem>
-                   <command>HMAC-MD5</command>
-                </listitem>
-                <listitem>
-                    <command>HMAC-SHA1</command>
-                </listitem>
-                <listitem>
-                  <command>HMAC-SHA224</command>
-              </listitem>
-              <listitem>
-                  <command>HMAC-SHA256</command>
-              </listitem>
-              <listitem>
-                  <command>HMAC-SHA384</command>
-                  </listitem>
-              <listitem>
-                  <command>HMAC-SHA512</command>
-              </listitem>
-              </itemizedlist>
-              This value is not case sensitive.
-            </simpara>
-          </listitem>
-          <listitem>
-            <simpara>
-              <command>secret</command> &mdash;
-              is used to specify the shared secret key code for this key.  This value is
-              case sensitive and must exactly match the value specified on the DNS server(s).
-              It is a base64-encoded text value.
-            </simpara>
-          </listitem>
-        </itemizedlist>
-        </para>
-        <para>
-        As an example, suppose that a domain D2 will be updating is
-        maintained by a BIND9 DNS server which requires dynamic updates
-        to be secured with TSIG.  Suppose further that the entry for
-        the TSIG key in BIND9's named.conf file looks like this:
-<screen>
-   :
-   key "key.four.example.com." {
-       algorithm hmac-sha224;
-       secret "bZEG7Ow8OgAUPfLWV3aAUQ==";
-   };
-   :
-</screen>
-        By default, the TSIG Key list is empty:
-<screen>
-<userinput>> config show DhcpDdns/tsig_keys</userinput>
-DhcpDdns/tsig_keys  []  list  (default)
-</screen>
-        We must first create a new key in the list:
-<screen>
-<userinput>> config add DhcpDdns/tsig_keys</userinput>
-</screen>
-        Displaying the new element, reveals:
-<screen>
-<userinput>> config show DhcpDdns/tsig_keys[0]</userinput>
-DhcpDdns/tsig_keys[0]/name  ""  string  (default)
-DhcpDdns/tsig_keys[0]/algorithm "HMAC-MD5"  string  (modified)
-DhcpDdns/tsig_keys[0]/secret  ""  string  (default)
-</screen>
-        Now set all three values to match BIND9's key:
-<screen>
-<userinput>> config set DhcpDdns/tsig_keys[0]/name "key.four.example.com"</userinput>
-<userinput>> config set DhcpDdns/tsig_keys[0]/algorithm "HMAC-SHA224"</userinput>
-<userinput>> config set DhcpDdns/tsig_keys[0]/secret "bZEG7Ow8OgAUPfLWV3aAUQ=="</userinput>
-<userinput>> config commit</userinput>
-</screen>
-        </para>
-        These steps would be repeated for each TSIG key needed.  Note that the same TSIG key
-        can be used with more than one domain.
-      </section> <!-- "d2-tsig-key-list-config" -->
-
-      <section id="d2-forward-ddns-config">
-        <title>Forward DDNS</title>
-        <para>
-        The Forward DDNS section is used to configure D2's forward update
-        behavior. Currently it contains a single parameter, the catalog of
-        forward DDNS Domains:
-<screen>
-<userinput>> config show DhcpDdns/forward_ddns/</userinput>
-DhcpDdns/forward_ddns/ddns_domains  [] list  (default)
-</screen>
-        By default, this list is empty, which will cause the server to ignore
-        the forward update portions of requests.
-        </para>
-        <section id="add-forward-ddns-domain">
-          <title>Adding Forward DDNS Domains</title>
-          <para>
-          A forward DDNS Domain maps a forward DNS zone to a set of DNS servers
-          which maintain the forward DNS data for that zone.  You will need one
-          forward DDNS Domain for each zone you wish to service.  It may very
-          well be that some or all of your zones are maintained by the same
-          servers. You will still need one DDNS Domain per zone. Remember that
-          matching a request to the appropriate server(s) is done by zone and
-          a DDNS Domain only defines a single zone.
-          </para>
-          <para>
-          The section describes how to add Forward DDNS Domains. Repeat these
-          steps for each Forward DDNS Domain desired.  Each Forward DDNS Domain
-          has the following parameters:
-          <itemizedlist>
-            <listitem>
-              <simpara>
-              <command>name</command> &mdash;
-              The fully qualified domain name (or zone) that this DDNS Domain
-              can update.  This is value used to compare against the request
-              FQDN during forward matching.  It must be unique within the
-              catalog.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>key_name</command> &mdash;
-              If TSIG is used with this domain's servers, this
-              value should be the name of the key from within the TSIG Key List
-              to use.  If the value is blank (the default), TSIG will not be
-              used in DDNS conversations with this domain's servers.  Currently
-              TSIG has not been implemented, so this value is ignored.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>dns_servers</command> &mdash;
-              A list of one or more DNS servers which can conduct the server
-              side of the DDNS protocol for this domain.  The servers
-              are used in a first to last preference. In other words, when D2
-              begins to process a request for this domain it will pick the
-              first server in this list and attempt to communicate with it.
-              If that attempt fails, it will move to next one in the list and
-              so on until the it achieves success or the list is exhausted.
-              </simpara>
-            </listitem>
-          </itemizedlist>
-        To create a new forward DDNS Domain, one must first add a new domain
-        element:
-<screen>
-<userinput>> config add DhcpDdns/forward_ddns/ddns_domains</userinput>
-</screen>
-        Displaying the DDNS Domain reveals this:
-<screen>
-<userinput>> config show DhcpDdns/forward_ddns/ddns_domains[0]</userinput>
-DhcpDdns/forward_ddns/ddns_domains[0]/name  ""  string  (default)
-DhcpDdns/forward_ddns/ddns_domains[0]/key_name  ""  string  (default)
-DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers   []  list    (default)
-</screen>
-        To set the domain's name to "other.example.com":
-<screen>
-<userinput>> config set DhcpDdns/forward_ddns/ddns_domains[1]/name "other.example.com"</userinput>
-<userinput>> config commit</userinput>
-</screen>
-        It is permissible to add a domain without any servers. If that domain
-        should be matched to a request, however, the request will fail.  In
-        order to make the domain useful though, we must add at least one DNS
-        server to it.
-        </para>
-
-        <section id="add-forward-dns-servers">
-          <title>Adding Forward DNS Servers</title>
-          <para>
-          The section describes how to add DNS servers to a Forward DDNS Domain.
-          Repeat them for as many servers as desired for a each domain.
-          </para>
-          <para>
-          Forward DNS Server entries represent actual DNS servers which
-          support the server side of the DDNS protocol. Each Forward DNS Server
-          has the following parameters:
-          <itemizedlist>
-            <listitem>
-              <simpara>
-              <command>hostname</command> &mdash;
-              The resolvable host name of the DNS server. This value is not
-              yet implemented.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>ip_address</command> &mdash;
-              The IP address at which the server listens for DDNS requests.
-              This may be either an IPv4 or an IPv6 address.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>port</command> &mdash;
-              The port on which the server listens for DDNS requests. It
-              defaults to the standard DNS service port of 53.
-              </simpara>
-            </listitem>
-          </itemizedlist>
-          To create a new forward DNS Server, one must first add a new server
-          element to the domain:
-<screen>
-<userinput>> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers</userinput>
-</screen>
-         Displaying the DNS Server element should appear as follows:
-<screen>
-<userinput>> config show DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]</userinput>
-DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/hostname   ""  string  (default)
-DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address ""  string  (default)
-DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/port   53  integer(default)
-</screen>
-        As stated earlier, "hostname" is not yet supported so, the parameter
-        "ip_address" must be set to the address of the DNS server. If for
-        example the service is running at "172.88.99.10", then set it as
-        follows:
-<screen>
-<userinput>> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.88.99.10"</userinput>
-<userinput>> config commit</userinput>
-</screen>
-          </para>
-        </section> <!-- "add-forward-dns-servers" -->
-
-      </section> <!-- "add-forward-ddns-domains" -->
-
-      </section> <!-- "d2-forward-ddns-config" -->
-
-      <section id="d2-reverse-ddns-config">
-        <title>Reverse DDNS</title>
-        <para>
-        The Reverse DDNS section is used to configure D2's reverse update
-        behavior, and the concepts are the same as for the forward DDNS
-        section. Currently it contains a single parameter, the catalog of
-        reverse DDNS Domains:
-<screen>
-<userinput>> config show DhcpDdns/reverse_ddns/</userinput>
-DhcpDdns/reverse_ddns/ddns_domains  [] list  (default)
-</screen>
-        By default, this list is empty, which will cause the server to ignore
-        the reverse update portions of requests.
-        </para>
-        <section id="add-reverse-ddns-domain">
-          <title>Adding Reverse DDNS Domains</title>
-          <para>
-          A reverse DDNS Domain maps a reverse DNS zone to a set of DNS servers
-          which maintain the reverse DNS data for that zone.  You will need one
-          reverse DDNS Domain for each zone you wish to service.  It may very
-          well be that some or all of your zones are maintained by the same
-          servers; even then, you will still need one DDNS Domain entry for each
-          zone. Remember that
-          matching a request to the appropriate server(s) is done by zone and
-          a DDNS Domain only defines a single zone.
-          </para>
-          <para>
-          The section describes how to add Reverse DDNS Domains. Repeat these
-          steps for each Reverse DDNS Domain desired.  Each Reverse DDNS Domain
-          has the following parameters:
-          <itemizedlist>
-            <listitem>
-              <simpara>
-              <command>name</command> &mdash;
-              The fully qualified reverse zone that this DDNS Domain
-              can update.  This is the value used during reverse matching
-              which will compare it with a reversed version of the request's
-              lease address. The zone name should follow the appropriate
-              standards: for example, to to support the IPv4 subnet 172.16.1,
-              the name should be. "1.16.172.in-addr.arpa.".  Similarly,
-              to support an IPv6 subent of 2001:db8:1, the name should be
-              "1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa."
-              Whatever the name, it must be unique within the catalog.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>key_name</command> &mdash;
-              If TSIG should be used with this domain's servers, then this
-              value should be the name of that key from the TSIG Key List.
-              If the value is blank (the default), TSIG will not be
-              used in DDNS conversations with this domain's servers.  Currently
-              this value is not used as TSIG has not been implemented.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>dns_servers</command> &mdash;
-              a list of one or more DNS servers which can conduct the server
-              side of the DDNS protocol for this domain.  Currently the servers
-              are used in a first to last preference. In other words, when D2
-              begins to process a request for this domain it will pick the
-              first server in this list and attempt to communicate with it.
-              If that attempt fails, it will move to next one in the list and
-              so on until the it achieves success or the list is exhausted.
-              </simpara>
-            </listitem>
-          </itemizedlist>
-        To create a new reverse DDNS Domain, one must first add a new domain
-        element:
-<screen>
-<userinput>> config add DhcpDdns/reverse_ddns/ddns_domains</userinput>
-</screen>
-        Displaying the DDNS Domain reveals this:
-<screen>
-<userinput>> config show DhcpDdns/reverse_ddns/ddns_domains[0]</userinput>
-DhcpDdns/reverse_ddns/ddns_domains[0]/name  ""  string  (default)
-DhcpDdns/reverse_ddns/ddns_domains[0]/key_name  ""  string  (default)
-DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers   []  list    (default)
-</screen>
-        For domain supporting the subnet 2001:db8:1::, we would set the
-        domain's name as follows:
-<screen>
-<userinput>> config set DhcpDdns/reverse_ddns/ddns_domains[1]/name "1.0.0.0.8.B.D.0.1.0.0.2.ip6.arpa."</userinput>
-<userinput>> config commit</userinput>
-</screen>
-        It is permissible to add a domain without any servers. If that domain
-        should be matched to a request, however, the request will fail.  In
-        order to make the domain useful though, we must add at least one DNS
-        server to it.
-        </para>
-
-        <section id="add-reverse-dns-servers">
-          <title>Adding Reverse DNS Servers</title>
-          <para>
-          The section describes how to add DNS servers to a Reverse DDNS Domain.
-          Repeat them for as many servers as desired for a each domain.
-          </para>
-          <para>
-          Reverse DNS Server entries represents a actual DNS servers which
-          support the server side of the DDNS protocol. Each Reverse DNS Server
-          has the following parameters:
-          <itemizedlist>
-            <listitem>
-              <simpara>
-              <command>hostname</command> &mdash;
-              The resolvable host name of the DNS server. This value is
-              currently ignored.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>ip_address</command> &mdash;
-              The IP address at which the server listens for DDNS requests.
-              </simpara>
-            </listitem>
-            <listitem>
-              <simpara>
-              <command>port</command> &mdash;
-              The port on which the server listens for DDNS requests. It
-              defaults to the standard DNS service port of 53.
-              </simpara>
-            </listitem>
-          </itemizedlist>
-          To create a new reverse DNS Server, one must first add a new server
-          element to the domain:
-<screen>
-<userinput>> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers</userinput>
-</screen>
-         Displaying the DNS Server element should appear as follows:
-<screen>
-<userinput>> config show DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]</userinput>
-DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/hostname   ""  string  (default)
-DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address ""  string  (default)
-DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/port   53  integer(default)
-</screen>
-        As stated earlier, "hostname" is not yet supported so, the parameter
-        "ip_address" must be set to the address of the DNS server. If for
-        example the service is running at "172.88.99.10", then set it as
-        follows:
-<screen>
-<userinput>> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.88.99.10"</userinput>
-<userinput>> config commit</userinput>
-</screen>
-          </para>
-        </section> <!-- "add-reverse-dns-servers" -->
-
-      </section> <!-- "add-reverse-ddns-domains" -->
-
-      </section> <!-- "d2-reverse-ddns-config" -->
-
-      <section id="d2-exmaple-config">
-        <title>Example DHCP-DDNS Server Configuration</title>
-        <para>
-        This section provides an example DHCP-DDNS server configuration based
-        on a small example network.  Let's suppose our example network has
-        three domains, each with their own subnet.
-
-        <table>
-          <title>Our example network</title>
-          <tgroup cols='4' align='left'>
-          <colspec colname='domain'/>
-          <colspec colname='subnet'/>
-          <colspec colname='fservers'/>
-          <colspec colname='rservers'/>
-          <thead>
-            <row>
-              <entry>Domain</entry>
-              <entry>Subnet</entry>
-              <entry>Forward DNS Servers</entry>
-              <entry>Reverse DNS Servers</entry>
-            </row>
-          </thead>
-          <tbody>
-            <row>
-              <entry>four.example.com</entry>
-              <entry>192.0.2.0/24</entry>
-              <entry>172.16.1.5, 172.16.2.5</entry>
-              <entry>172.16.1.5, 172.16.2.5</entry>
-            </row>
-            <row>
-              <entry>six.example.com</entry>
-              <entry>2001:db8:1::/64</entry>
-              <entry>3001:1::50</entry>
-              <entry>3001:1::51</entry>
-            </row>
-            <row>
-              <entry>example.com</entry>
-              <entry>192.0.0.0/16</entry>
-              <entry>172.16.2.5</entry>
-              <entry>172.16.2.5</entry>
-            </row>
-          </tbody>
-          </tgroup>
-        </table>
-        </para>
-        <para>
-        We need to construct three forward DDNS Domains:
-        <table>
-          <title>Forward DDNS Domains Needed</title>
-          <tgroup cols='3' align='left'>
-          <colspec colname='num'/>
-          <colspec colname='name'/>
-          <colspec colname='servers'/>
-          <thead>
-            <row>
-              <entry>#</entry>
-              <entry>DDNS Domain Name</entry>
-              <entry>DNS Servers</entry>
-            </row>
-          </thead>
-          <tbody>
-            <row>
-              <entry>1.</entry>
-              <entry>four.example.com.</entry>
-              <entry>172.16.1.5, 172.16.2.5</entry>
-            </row>
-            <row>
-              <entry>2.</entry>
-              <entry>six.example.com.</entry>
-              <entry>3001:1::50</entry>
-            </row>
-            <row>
-              <entry>3.</entry>
-              <entry>example.com.</entry>
-              <entry>172.16.2.5</entry>
-            </row>
-          </tbody>
-          </tgroup>
-        </table>
-        As discussed earlier, FQDN to domain matching is based on the longest
-        match. The FQDN, "myhost.four.example.com.", will match the first
-        domain ("four.example.com") while "admin.example.com." will match the
-        third domain ("example.com"). The
-        FQDN, "other.example.net." will fail to match any domain and would
-        be rejected.
-        </para>
-        <para>
-        The following series of commands in bindctl will create the Forward
-        DDNS Domains.
-<screen>
-<userinput>
-> config add DhcpDdns/forward_ddns/ddns_domains
-> config set DhcpDdns/forward_ddns/ddns_domains[0]/name "four.example.com."
-> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers
-> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.16.1.5"
-> config add DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers
-> config set DhcpDdns/forward_ddns/ddns_domains[0]/dns_servers[1]/ip_address "172.16.2.5"
->
-> config add DhcpDdns/forward_ddns/ddns_domains
-> config set DhcpDdns/forward_ddns/ddns_domains[1]/name "six.example.com."
-> config add DhcpDdns/forward_ddns/ddns_domains[1]/dns_servers
-> config set DhcpDdns/forward_ddns/ddns_domains[1]/dns_servers[0]/ip_address "3001:1::50:"
->
-> config add DhcpDdns/forward_ddns/ddns_domains
-> config set DhcpDdns/forward_ddns/ddns_domains[2]/name "example.com."
-> config add DhcpDdns/forward_ddns/ddns_domains[2]/dns_servers
-> config set DhcpDdns/forward_ddns/ddns_domains[2]/dns_servers[0]/ip_address "172.16.2.5"
->
-> config commit
-</userinput>
-</screen>
-        </para>
-        <para>
-        Similarly, we need to construct the three reverse DDNS Domains:
-        <table>
-          <title>Reverse DDNS Domains Needed</title>
-          <tgroup cols='3' align='left'>
-          <colspec colname='num'/>
-          <colspec colname='DDNS Domain name'/>
-          <colspec colname='DDNS Domain DNS Servers'/>
-          <thead>
-            <row>
-              <entry>#</entry>
-              <entry>DDNS Domain Name</entry>
-              <entry>DNS Servers</entry>
-            </row>
-          </thead>
-          <tbody>
-            <row>
-              <entry>1.</entry>
-              <entry>2.0.192.in-addr.arpa.</entry>
-              <entry>172.16.1.5, 172.16.2.5</entry>
-            </row>
-            <row>
-              <entry>2.</entry>
-              <entry>1.0.0.0.8.d.b.0.1.0.0.2.ip6.arpa.</entry>
-              <entry>3001:1::50</entry>
-            </row>
-            <row>
-              <entry>3.</entry>
-              <entry>0.182.in-addr.arpa.</entry>
-              <entry>172.16.2.5</entry>
-            </row>
-          </tbody>
-          </tgroup>
-        </table>
-        An address of "192.0.2.150" will match the first domain,
-        "2001:db8:1::10" will match the second domain, and "192.0.50.77"
-        the third domain.
-        </para>
-        <para>
-        The following series of commands in bindctl will create our Reverse
-        DDNS Domains.
-<screen>
-<userinput>
-> config add DhcpDdns/reverse_ddns/ddns_domains
-> config set DhcpDdns/reverse_ddns/ddns_domains[0]/name "2.0.192.in-addr.arpa."
-> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers
-> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/ip_address "172.16.1.5"
-> config add DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers
-> config set DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[1]/ip_address "172.16.2.5"
->
-> config add DhcpDdns/reverse_ddns/ddns_domains
-> config set DhcpDdns/reverse_ddns/ddns_domains[1]/name "1.0.0.0.8.d.b.0.1.0.0.2.ip6.arpa."
-> config add DhcpDdns/reverse_ddns/ddns_domains[1]/dns_servers
-> config set DhcpDdns/reverse_ddns/ddns_domains[1]/dns_servers[0]/ip_address "3001:1::50:"
->
-> config add DhcpDdns/reverse_ddns/ddns_domains
-> config set DhcpDdns/reverse_ddns/ddns_domains[2]/name "0.192.in-addr.arpa."
-> config add DhcpDdns/reverse_ddns/ddns_domains[2]/dns_servers
-> config set DhcpDdns/reverse_ddns/ddns_domains[2]/dns_servers[0]/ip_address "172.16.2.5"
->
-> config commit
-</userinput>
-</screen>
-        </para>
-        </section> <!-- end of "d2-example" -->
-    </section> <!-- end of section "d2-configuration" -->
-    <section>
-      <title>DHCP-DDNS Server Limitations</title>
-      <para>The following are the current limitations of the DHCP-DDNS Server.</para>
-      <itemizedlist>
-        <listitem>
-          <simpara>
-            Requests received from the DHCP servers are placed in a
-            queue until they are processed.  Currently all queued requests
-            are lost when the server shuts down.
-          </simpara>
-        </listitem>
-        <listitem>
-          <simpara>
-            TSIG Authentication (<ulink
-            url="http://tools.ietf.org/html/rfc2845">RFC 2845</ulink>)
-            is not supported yet.
-          </simpara>
-        </listitem>
-      </itemizedlist>
-    </section>
-  </chapter> <!-- DHCP-DDNS Server -->
-
-  <chapter id="libdhcp">
-    <title>libdhcp++ library</title>
-    <para>
-      libdhcp++ is a common library written in C++ that handles
-      many DHCP-related tasks, including:
-      <itemizedlist>
-        <listitem>
-          <simpara>DHCPv4 and DHCPv6 packets parsing, manipulation and assembly</simpara>
-        </listitem>
-        <listitem>
-          <simpara>Option parsing, manipulation and assembly</simpara>
-        </listitem>
-        <listitem>
-          <simpara>Network interface detection</simpara>
-        </listitem>
-        <listitem>
-          <simpara>Socket operations such as creation, data transmission and reception and socket closing.</simpara>
-        </listitem>
-      </itemizedlist>
-    </para>
-
-    <para>
-    While this library is currently used by Kea, it is designed to
-    be a portable, universal library, useful for any kind of DHCP-related software.
-    </para>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="install.xml" />
 
-<!-- TODO: point to doxygen docs -->
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="config.xml" />
 
-    <section id="iface-detect">
-      <title>Interface detection and Socket handling</title>
-      <para>Both the DHCPv4 and DHCPv6 components share network
-      interface detection routines. Interface detection is
-      currently supported on Linux, all BSD family (FreeBSD, NetBSD,
-      OpenBSD), Mac OS X and Solaris 11 systems.</para>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="dhcp4-srv.xml" />
 
-      <para>DHCPv4 requires special raw socket processing to send and receive
-      packets from hosts that do not have IPv4 address assigned yet. Support
-      for this operation is implemented on Linux only, so it is likely that
-      DHCPv4 component will not work in certain cases on systems other than
-      Linux.</para>
-    </section>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="dhcp6-srv.xml" />
 
-<!--
-    <section id="packet-handling">
-      <title>DHCPv4/DHCPv6 packet handling</title>
-      <para>TODO: Describe packet handling here, with pointers to wiki</para>
-    </section>
--->
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="ddns.xml" />
 
-  </chapter>
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="libdhcp.xml" />
 
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="logging.xml" />
 
     <chapter id="acknowledgements">
       <title>Acknowledgements</title>
 
+      <para>Support for the development of the DHCPv4, DHCPv6 and
+      DHCP-DDNS  components was provided by
+      <ulink url="http://www.comcast.com/">Comcast</ulink>.</para>
+
       <para>Kea was initially implemented as a collection of applications
       within the BIND 10 framework. Hence, Kea development would not be
       possible without the generous support of BIND 10 project sponsors.</para>
@@ -4414,10 +103,6 @@ DhcpDdns/reverse_ddns/ddns_domains[0]/dns_servers[0]/port   53  integer(default)
 
 <!-- DHCP sponsorship by Comcast -->
 
-      <para>Support for the development of the DHCPv4, DHCPv6 and
-      DHCP-DDNS  components is provided by
-      <ulink url="http://www.comcast.com/">Comcast</ulink>.</para>
-
     </chapter>
 
 
diff --git a/doc/guide/libdhcp.xml b/doc/guide/libdhcp.xml
new file mode 100644 (file)
index 0000000..1d0dbfa
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+]>
+
+  <chapter id="libdhcp">
+    <title>libdhcp++ library</title>
+    <para>
+      libdhcp++ is a common library written in C++ that handles
+      many DHCP-related tasks, including:
+      <itemizedlist>
+        <listitem>
+          <simpara>DHCPv4 and DHCPv6 packets parsing, manipulation and assembly</simpara>
+        </listitem>
+        <listitem>
+          <simpara>Option parsing, manipulation and assembly</simpara>
+        </listitem>
+        <listitem>
+          <simpara>Network interface detection</simpara>
+        </listitem>
+        <listitem>
+          <simpara>Socket operations such as creation, data transmission and reception and socket closing.</simpara>
+        </listitem>
+      </itemizedlist>
+    </para>
+
+    <para>
+    While this library is currently used by Kea, it is designed to
+    be a portable, universal library, useful for any kind of DHCP-related software.
+    </para>
+
+<!-- TODO: point to doxygen docs -->
+
+    <section id="iface-detect">
+      <title>Interface detection and Socket handling</title>
+      <para>Both the DHCPv4 and DHCPv6 components share network
+      interface detection routines. Interface detection is
+      currently supported on Linux, all BSD family (FreeBSD, NetBSD,
+      OpenBSD), Mac OS X and Solaris 11 systems.</para>
+
+      <para>DHCPv4 requires special raw socket processing to send and receive
+      packets from hosts that do not have IPv4 address assigned yet. Support
+      for this operation is implemented on Linux only, so it is likely that
+      DHCPv4 component will not work in certain cases on systems other than
+      Linux.</para>
+    </section>
+
+<!--
+    <section id="packet-handling">
+      <title>DHCPv4/DHCPv6 packet handling</title>
+      <para>TODO: Describe packet handling here, with pointers to wiki</para>
+    </section>
+-->
+
+  </chapter>
diff --git a/doc/guide/quickstart.xml b/doc/guide/quickstart.xml
new file mode 100644 (file)
index 0000000..12efe32
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY mdash  "&#x2014;" >
+]>
+
+  <chapter id="quickstart">
+    <title>Quick start</title>
+
+    <para>
+        This quickly covers the standard steps for installing and deploying Kea.
+        For further details, full customizations, and troubleshooting, see the
+        respective chapters in the Kea guide.
+    </para>
+
+    <section id="quick-start">
+      <title>Quick start guide for DHCPv4 and DHCPv6 services</title>
+
+      <orderedlist>
+
+        <listitem>
+          <simpara>
+            Install required run-time and build dependencies. See <xref
+           linkend="build-requirements"/> for details.
+          </simpara>
+        </listitem>
+
+        <!-- We may need to replace it with the link to a downloadable tarball
+        once we have it. -->
+        <listitem>
+          <simpara>
+            Checkout the latest Kea revision from the Git repository:
+            <screen>$ <userinput>git clone git://git.kea.isc.org/kea</userinput> </screen>
+          </simpara>
+        </listitem>
+
+        <listitem>
+          <para>Go into the source and run configure:
+            <screen>$ <userinput>cd kea</userinput>
+$ <userinput>autoreconf --install</userinput>
+$ <userinput>./configure [your extra parameters]</userinput></screen>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>Build it:
+            <screen>$ <userinput>make</userinput></screen>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>Install it as root (by default to prefix
+          <filename>/usr/local/</filename>):
+            <screen>$ <userinput>make install</userinput></screen>
+          </para>
+        </listitem>
+
+        <listitem>
+          <para>Edit your configuration file for DHCPv4. See doc/examples/kea4
+         for a set of examples.
+         </para>
+       </listitem>
+
+        <listitem>
+          <para>Start Kea DHCPv4 server (as root):
+            <screen># <userinput>b10-dhcp4 -c /path/to/your/kea4/config/file.json</userinput></screen>
+          </para>
+        </listitem>
+
+        <listitem>
+         <para>Test it; for example, use the
+         <ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
+         to send DHCPv4 queries to the server and verify that the client receives a
+         configuration from the server:
+            <screen>$ <userinput>dhclient -4 eth0</userinput></screen>
+         </para>
+        </listitem>
+
+        <listitem>
+          <para>Edit your configuration file for DHCPv6. See doc/examples/kea6
+         for a set of examples.
+         </para>
+       </listitem>
+
+        <listitem>
+          <para>Start Kea DHCPv6 server (as root):
+            <screen># <userinput>b10-dhcp6 -c /path/to/your/kea6/config/file.json</userinput></screen>
+          </para>
+        </listitem>
+
+        <listitem>
+         <para>Test it; for example, use the
+         <ulink url="http://www.isc.org/downloads/DHCP/">ISC DHCP client</ulink>
+         to send DHCPv6 queries to the server and verify that the client receives a
+         configuration from the server:
+            <screen>$ <userinput>dhclient -6 eth0</userinput></screen>
+         </para>
+        </listitem>
+
+
+      </orderedlist>
+
+    </section>
+
+  </chapter>