This is a _very_ early DHCPv6 high-level design draft -- too drafty
even for the web page.  It doesn't go into implementation details
(much), but does give a feel for the direction I'm currently headed.
If anyone else out there is interested in DHCPv6, please feel free to
comment, either here on the list or to me personally if you prefer.

DHCPv6 Client High-Level Design

  This document describes the high-level design and system
  architectural issues involved in the DHCPv6 Client project.  A
  separate document will describe the low-level design, including the
  internal state machine operation.

  The overall goal is to add DHCPv6 into the existing Solaris DHCP
  client support.  This means extending the existing utilities as
  necessary to support the new protocol and its features, and avoiding
  gratuitous differences where possible.  In some respects, DHCPv6 is
  quite different from IPv4's DHCP, and the design must reflect those
  differences.

Configuration Syntax

  We would like to allow for configuration of the DHCPv6 client in
  much the same way as the existing IPv4 DHCP client is configured.
  This means using /etc/default/dhcpagent.

  One option would be to create a new "dhcpv6agent" file, and using a
  separate set of configuration bits there.  However, given that these
  parameters are rarely configured, and that splitting IPv4 and IPv6
  configuration interfaces has historically caused confusion, we will
  simply add a new syntax to the existing file.

  The syntax is augmented to allow a ".v6" marker to appear between
  the interface name (if any) and the parameter to be configured.  For
  example, the global IPv4 option request list would (currently) be
  set like this:

        PARAM_REQUEST_LIST=1,3,6,12,15,28,43

  An individual interface could be configured to omit the pesky
  hostname option like this:

        hme0.PARAM_REQUEST_LIST=1,3,6,15,28,43

  For DHCPv6, the global request list will be set like this (note the
  leading dot):

        .v6.PARAM_REQUEST_LIST=23,24

  or on an individual interface like this:

        hme0.v6.PARAM_REQUEST_LIST=21,22,23,24

Router Advertisements

  Unlike DHCPv4, DHCPv6 is expected to be invoked by Router
  Advertisements (RAs), rather than by manual configuration (see RFC
  2462).  When the system receives an RA with the ``M'' ("managed
  address configuration") bit set, the system should automatically
  invoke DHCPv6 on that interface and use it to get an address and
  other parameters.  The ``O'' ("other stateful configuration") bit
  indicates whether the system should only request data other than an
  address (e.g., DNS servers) via DHCPv6.

  If either bit is set, we must run DHCPv6.  When triggered by way of
  RA, we acquire an address lease only if the ``M'' bit is set.

  In addition, it's expected (per RFC 2462) that DHCPv6 will be
  invoked if no RAs are received at all on a given interface.  Running
  DHCPv6 ``should'' effectively be the system-wide default for every
  interface.

  Note that stateless and stateful address configuration are
  independent, and both may be used on a given link.  The stateless
  address configuration mechanism is controlled by the ``A'' bit in
  the Prefix Information option -- see RFC 2461 section 4.6.2.

  Two design issues to resolve here are that the ``ra_flags'' variable
  in ndp.c is implemented as a global, when the RFC specifies that it
  must be per-interface, and that in.ndpd doesn't detect and handle
  the state where no RAs are received (though it does have comments
  saying that "something" should happen).

DUID and IAID

  In DHCPv6, two identifiers are used.  The DUID is the classical
  variable-length "opaque" client identifier, and the IAID is a 32 bit
  integer.

  Normally, the DUID will be autogenerated (using Type 1) and stored
  in /var/inet/dhcpv6 in order to meet the stability requirements of
  RFC 3315.  The IAID will default to the ifIndex number for the
  physical interface being configured, as that's guaranteed by the
  kernel to be unique for all physical interfaces.

  In ordinary use, the same DUID is used on all interfaces, and the
  IAID identifies a particular physical interface being configured.

  The user may need to set these values for special purposes,
  including for software test.  In order to allow for that, we will
  use the existing CLIENT_ID variable in dhcpagent to provide override
  control of the DUID, and add a new IAID variable that can be set on
  a per-interface basis only.

  The DUID has a known structure, and we will support these types
  using a comma-separated string, as follows:

  1,<type>,<lla>        Type 1, DUID-LLT.  The <type> value is a 16
                        bit integer (0-65535), and the <lla> is either
                        a colon-separated MAC address or the name of a
                        physical interface.  The time value required
                        for this format is queried automatically and
                        kept in the /var/inet/dhcpv6 state file.

  2,<ent>,<hex>         Type 2, DUID-EN.  The <ent> value is a 32 bit
                        integer, and <hex> is an even-length string of
                        hexadecimal digits.

  3,<type>,<lla>        Type 3, DUID-LL.  This is the same as
                        DUID-LLT, except that a time stamp is not
                        used.

  *,<hex>               Any type value 0 or 4-65535 may be used with
                        an even-length hexadecimal string.

  The new (optional) IAID value will just be a simple integer.

Logical Interfaces

  In the IPv4 DHCP client, each logical interface is independent and
  is an administrative unit.  In addition to the zeroth logical
  interface (which defaults to the interface MAC address as an
  identifier), the user may configure specific logical interfaces to
  run DHCP by specifying a CLIENT_ID in the dhcpagent configuration
  file.  For example:

        hme0:1.CLIENT_ID=orangutan

  DHCPv6 will be different.  The zeroth logical interface on an IPv6
  interface, unlike IPv4, is always a link-local.  It cannot be under
  DHCP control, which means that DHCPv6 is run only on non-zero
  logical interfaces.

  In addition, the DHCPv6 server will send back a list of addresses
  for the client to configure.  In Solaris, each of these addresses
  requires a separate logical interface.  On top of that, stateless
  address configuration already creates logical interfaces as required
  (using an "ifconfig addif"-like interface).

  All of the above means that the logical interface cannot be the
  administrative unit in DHCPv6.  Instead, the administrative unit is
  known as the "Identity Association," and is a handle for the client
  identifier, physical interface, and all of the configured addresses.

  In order to allow for configurable client operation, we need to
  allow for DUIDs to be assigned as needed, even on a per-interface
  basis.  This may be used to set the global DUID as:

        .v6.CLIENT_ID=<DUID>

  or to set a particular interface to use a given DUID (and make the
  system appear to be multiple independent clients to a DHCPv6
  server):

        hme0.v6.CLIENT_ID=<DUID>

  Note that setting parameters on a single logical interface does not
  make sense with DHCPv6, thus "hme0:1.v6." isn't a valid selector.
  It would be possible to support an administrative unit that works in
  a way analogous to logical interfaces for DHCPv6.  To do this, we
  would need a way to name contexts used for separate DUIDs on a
  single physical port; perhaps using something like the logical
  interface naming scheme.  However, no known usage case exists for
  this feature, so it need not be designed in detail now.

DLPI

  Because DHCPv6 uses link-local addresses, it's not necessary for the
  agent to do any raw DLPI processing.  None of the existing DLPI
  processing in dhcpagent will be touched, nor should DLPI support be
  needed in the future.

Client Broadcast

  All messages sent to a DHCPv6 client are (currently) unicast, so
  it's not necessary to support a separate broadcast or multicast
  bound socket, as is currently done for IPv4 DHCP.  It's possible
  that some future extensions to DHCPv6 may need this support.

Standalone

  There is no DHCPv6-based install support, so none of the DHCP
  support functions need to be placed under $SRC/common.  This may be
  necessary in the future.

Interoperability

  Several different servers need to be checked out, including
  Wide-DHCP, Dibbler, and (if available) ISC's.

Comparisons

  TBD: need to check how Linux configures DHCPv6.  Based on the
  documentation, it doesn't look like it conforms with the RFCs,
  because it doesn't seem to be controlled by the RA bits.  Instead,
  it appears to be manually configured.

  Should also check other vendors (IBM, HP) if possible.

Drafts To Ponder

  draft-ietf-dhc-dhcpv6-28.txt
  draft-ietf-dhc-dhcpv6-opt-prefix-delegation-04.txt
  draft-ietf-dhc-dhcpv6-opt-dnsconfig-03.txt
  draft-ietf-dhc-dhcpv6-stateless-00.txt


-- 
James Carlson, KISS Network                    <[EMAIL PROTECTED]>
Sun Microsystems / 1 Network Drive         71.232W   Vox +1 781 442 2084
MS UBUR02-212 / Burlington MA 01803-2757   42.496N   Fax +1 781 442 1677
_______________________________________________
networking-discuss mailing list
[email protected]

Reply via email to