<?xml version="1.0" encoding="US-ASCII"?>
<!-- This file is based on the template for creating an Internet Draft using
     xml2rfc, which is available here: http://xml.resource.org. -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced.
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC1350 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1350.xml">
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2396 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2396.xml">
<!ENTITY RFC2732 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2732.xml">
<!ENTITY RFC3315 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3315.xml">
<!ENTITY RFC3617 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3617.xml">
]>

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds
     might want to use. -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="3"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" docName="draft-ietf-dhc-dhcpv6-opt-netboot-00" ipr="full3978">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN"
     they will automatically be output with "(if approved)" -->

  <!-- ************************ FRONT MATTER ********************** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary
         if the full title is longer than 39 characters -->

    <title abbrev="DHCPv6 option for network boot">DHCPv6 option for network boot</title>

    <author fullname="Thomas H. Huth" initials="T.H.H." surname="Huth">
      <organization>IBM Deutschland Research &amp; Development GmbH</organization>
      <address>
        <postal>
          <street>Schoenaicher Strasse 220</street>
          <code>71032</code>
          <city>Boeblingen</city>
          <country>Germany</country>
        </postal>
        <phone>+49-7031-16-2183</phone>
        <email>thuth@de.ibm.com</email>
      </address>
    </author>

    <author fullname="Jens T. Freimann" initials="J.T.F." surname="Freimann">
      <organization>IBM Deutschland Research &amp; Development GmbH</organization>
      <address>
        <postal>
          <street>Schoenaicher Strasse 220</street>
          <code>71032</code>
          <city>Boeblingen</city>
          <country>Germany</country>
        </postal>
        <phone>+49-7031-16-1122</phone>
        <email>jfrei@de.ibm.com</email>
      </address>
    </author>

    <date year="2008" />

    <!-- Meta-data Declarations -->

    <area>General</area>

    <workgroup>DHC</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.
         If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->
    <keyword>boot</keyword>
    <keyword>IPv6</keyword>
    <keyword>DHCPv6</keyword>

    <abstract>
      <t>
       The Dynamic Host Configuration Protocol for IPv6 (DHCPv6) provides
       a framework for passing configuration information to nodes on a network.
       This document describes a new option for DHCPv6 to convey information,
       required for network booting, to the nodes.
      </t>
    </abstract>
  </front>

  <!-- ******************** THE MIDDLE ********************* -->

  <middle>

<section title="Introduction">
<t>
Network booting means that a node which should be booted fetches
the files required for booting via its network device from a server.
Network booting is, for example, very useful in environments where the
administrators have to maintain a large number of nodes.
Since all boot and configuration files are stored on a central server, the
maintenance of all nodes can be kept simple this way.
</t>
<t>
A typical boot file would be, for example, an operating system kernel or a boot
loader program. To be able to download such a file, the firmware (BIOS) running
on the client node must be provided with information such as:
the server on which the boot files can be found, the protocol to be used for the
download (for example <xref target="RFC1350">TFTP</xref>) and the name of
the boot file. Since some kernels or boot loaders need to be provided with
additional parameters, there should also be the possibility to pass additional
parameters along with the server address, the protocol and the file name.
</t>
<t>
DHCPv6 allows client nodes to ask a DHCPv6 server for configuration
parameters. Contrary to its IPv4 predecessor, DHCPv6 does not define a
way to query network boot options such as the IPv6 address of a
boot file server and boot file names. Therefore this document defines a new
DHCPv6 option which is required for network booting clients.
</t>


</section>  <!-- End of introduction -->

<section title="Conventions">
<t>
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in
<xref target="RFC2119">RFC 2119</xref>.
</t>
<t>
Terminology specific to IPv6 and DHCPv6 are used in the same way as defined
in the "Terminology" sections of <xref target="RFC3315">RFC 3315</xref>.
</t>
</section>


<section anchor="optionformat" title="Netboot option format">

<t>
  The netboot option is used as an encapsulation for suboptions
  which carry the actual information needed to boot a client.
  This option will be used by clients to request boot information
  from a server.
    <figure>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        OPT_NET_BOOT           |           option-len          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      suboption-code 1         |           subopt-len          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    subopt-data 1 (variable length)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                                                               .
.                       <multiple suboptions>                   .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      suboption-code n         |           subopt-len          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    subopt-data n (variable length)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

option-code   OPT_NET_BOOT (tbd).

option-len    Length of the netboot option in octets.
        ]]></artwork>
    </figure>
    Multiple occurences of each suboption-type can occur within
    a netboot option (for example when more than one boot server
    is available). Clients MUST process the suboptions in the order
    in which they appear in the message sent by the server.
    </t>

<t>
 So far, only one suboption has been defined, SUBOPT_BOOTFILE_URL,
 which is described in <xref target="bootfileformat"/>.
 Other suboptions might be defined in future RFCs.
</t>

</section>


<section anchor="bootfileformat"
         title="Suboption: boot file Uniform Resource Locator (URL)">

<t>
 This suboption consists of multiple null-terminated strings. It is used
 to convey an URL to a boot file together with additional parameters
 for the boot file (e.g. parameters for the kernel or boot loader program).
</t>

<t>
 Since multiple occurrences of SUBOPT_BOOTFILE_URL can be present in a
 single OPT_NETBOOT message, clients MUST process them in the order
 in which they appear within the message. For example in the case of a
 boot file URL the first file should be downloaded and executed.
 In case of a failure the process should continue with the second one
 and so on.
</t>

<t>
 <figure>
  <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       SUBOPT_BOOTFILE_URL     |           subopt-len          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| bootfile-url                                                  |
.                           (variable)                          .
|                                               |     '\0'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| parameter 1                                                   |
.                           (variable)                          .
|                                               |     '\0'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
.                                                               .
.                       <multiple Parameters>                   .
.                                                               .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| parameter n                                                   |
.                           (variable)                          .
|                                               |     '\0'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
 </figure>
</t>

<t>
Format description:
<list style="hanging" hangIndent='18'>

<t hangText="suboption-code">
  SUBOPT_BOOTFILE_URL (tbd).
</t>
<t hangText="suboption-len">
  Length of the bootfile suboption in octets.
</t>
<t hangText="bootfile-url">
 This NULL-terminated ASCII string is the URL
 (conforming to <xref target='RFC2396'/>) to a boot file.
 This string starts with the protocol which is used for downloading.
 Separated by '://', the hostname or IPv6 address of the server hosting
 the boot file (see also the note below), the path, file name and query
 parts of the URL follow.
</t>
<t hangText="parameters 1...n">
 These NULL-terminated ASCII strings are parameters needed for booting,
 e.g. kernel parameters.
 In cases where no parameters are needed, everything but the boot file URL
 can be omitted.
 Parameters following the boot file name should be directly related to the
 boot file (kernel) itself.
</t>

</list>
</t>

<t>
Note about the bootfile-url: This string can either contain a hostname
or an IPv6 address to specify the server where the boot file should be
downloaded from.
All clients which implement support for the SUBOPT_BOOTFILE_URL suboption
MUST be able to handle IPv6 addresses here.
The IPv6 address in the URL then MUST be enclosed in "[" and "]"
characters, conforming to <xref target='RFC2732'/>.
Clients SHOULD also be able to handle hostnames in the URLs. However,
in this case the firmware implementation on the client machine must support
DNS, too. Due to size limitations, this might not be possible in all firmware
implementations, so support for hostnames in the URLs is only optional.
</t>

</section>


<section anchor="Appearance" title="Appearance of these options">
<t>
	The netboot option MUST NOT appear in DHCPv6 messages other than the types
	Solicit, Advertise, Request, Renew, Rebind, Information-Request and Reply.
</t>
<t>
	The number of the netboot option MAY appear in the Option Request Option
	in the DHCPv6 message types Solicit, Request, Renew, Rebind,
	Information-Request and Reconfigure.
</t>
<t>
	The bootfile suboption MUST appear only in the netboot option.
</t>
</section>

<section anchor="Bootprotocol" title="Boot protocol considerations">
<t>
<xref target="RFC906">RFC 906</xref> suggests to use TFTP for bootstrap
loading. Because it is easy to implement this protocol in firmware (where
one has to deal with size and complexity constraints), this is still the
recommended protocol for network booting, so every firmware implementation
SHOULD at least support this protocol. The boot file URLs then must be
specified according to <xref target="RFC3617">RFC 3617</xref>.
</t>
<t>
In some cases however, it might also be useful to use other protocols
like FTP or HTTP for network booting, so a firmware implementation can
support these protocols, too. Then it is up to the network administrator
to choose the appropriate boot protocol for the network, and to
specify the right boot file URLs in the DHCPv6 configuration file.
</t>
</section>

    <!-- Possibly a 'Contributors' section ... -->

<section anchor="IANA" title="IANA considerations">

 <t>
  The following options need to be assigned by the IANA from the option number
  space defined in the chapter 22 of the <xref target="RFC3315">DHCPv6 RFC</xref>.
 </t>

 <texttable>
  <ttcol align="center">Option name</ttcol>
  <ttcol align="center">Value</ttcol>
  <ttcol align="center">Specified in</ttcol>
  <c>OPT_NET_BOOT</c>
  <c>tbd</c>
  <c><xref target="optionformat"/></c>
  <c>SUBOPT_BOOTFILE_URL</c>
  <c>tbd</c>
  <c><xref target="bootfileformat"/></c>
  </texttable>

</section>

<section anchor="Security" title="Security considerations">
<t>
The new DHCPv6 option described in this document could be sent in untrusted
networks by malicious people with a fake DHCPv6 server to confuse the booting
clients. The clients could be provided with a wrong URL so that the boot either
fails, or even worse, the client boots the wrong operating system which has been
provided by a malicious file server. To prevent this kind of attack, clients
SHOULD use authentication of DHCPv6 messages
(see chapter 21. in <xref target="RFC3315">RFC 3315</xref>).
</t>
<t>
Note also that DHCPv6 messages are sent unencrypted by default.
So the boot file URL options are sent unencrypted over the network, too.
This can become a security risk since the URLs can contain sensitive
information like user names and passwords (for example a URL like
"ftp://username:password@servername/path/file").
At the current point in time, there is no possibility to send encrypted DHCPv6
messages, so it is strongly recommended not to use sensitive information in the
URLs in untrusted networks.
</t>
</section>

<section anchor="Acknowledgements" title="Acknowledgements">
<t>
The authors would like to thank Ketan P. Pancholi for corrections and suggestions.
</t>
<t>
Vijayabhaskar Kalusivalingam and Senthil Balasubramanian published a similar
draft for IPv6 network booting some years ago (available at
http://tools.ietf.org/html/draft-ietf-dhc-dhcpv6-opt-rboot-00), which
however was abandoned for unknown reasons.
</t>
</section>

  </middle>

  <!-- ************************* BACK MATTER ********************** -->

  <back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2119; here
        (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?>
        here (for I-Ds:
	include="reference.I-D.narten-iana-considerations-rfc2434bis.xml" )

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included
     files in the same directory as the including file. You can also define the
     XML_LIBRARY environment variable with a value containing a set of
     directories to search.  These can be either in the local filing system or
     remote ones accessed by http (http://domain/dir/... ).-->

    <references title="Normative References">
      <!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
      &RFC2119;
      &RFC2396;
      &RFC2732;
      &RFC3315;
      &RFC3617;
    </references>

    <references title="Informative References">
      &RFC1350;

      <reference anchor="RFC906">
        <front>
          <title>Bootstrap Loading using TFTP</title>
          <author fullname="Ross Finlayson" initials="R.F." surname="Finlayson">
            <organization>Stanford University</organization>
          </author>
          <date month="June" year="1984"/>
        </front>
        <seriesInfo name="RFC" value="906"/>
      </reference>
    </references>

    <!--
    <section anchor="app-additional" title="Additional Stuff">
      <t>This becomes an Appendix.</t>
    </section>
    -->

    <!-- Change Log

v00 2008-08-19  THH   Initial version

     -->
  </back>
</rfc>
