<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC0768 SYSTEM "reference.RFC.0768.xml">
<!ENTITY RFC0791 SYSTEM "reference.RFC.0791.xml">
<!ENTITY RFC0792 SYSTEM "reference.RFC.0792.xml">
<!ENTITY RFC0793 SYSTEM "reference.RFC.0793.xml">
<!ENTITY RFC0959 SYSTEM "reference.RFC.0959.xml">
<!ENTITY RFC1191 SYSTEM "reference.RFC.1191.xml">
<!ENTITY RFC1918 SYSTEM "reference.RFC.1918.xml">
<!ENTITY RFC1853 SYSTEM "reference.RFC.1853.xml">
<!ENTITY RFC2003 SYSTEM "reference.RFC.2003.xml">
<!ENTITY RFC2119 SYSTEM "reference.RFC.2119.xml">
<!ENTITY RFC2460 SYSTEM "reference.RFC.2460.xml">
<!ENTITY RFC2473 SYSTEM "reference.RFC.2473.xml">
<!ENTITY RFC2474 SYSTEM "reference.RFC.2474.xml">
<!ENTITY RFC2827 SYSTEM "reference.RFC.2827.xml">
<!ENTITY RFC2983 SYSTEM "reference.RFC.2983.xml">
<!ENTITY RFC3022 SYSTEM "reference.RFC.3022.xml">
<!ENTITY RFC3168 SYSTEM "reference.RFC.3168.xml">
<!ENTITY RFC3315 SYSTEM "reference.RFC.3315.xml">
<!ENTITY RFC3550 SYSTEM "reference.RFC.3550.xml">
<!ENTITY RFC3605 SYSTEM "reference.RFC.3605.xml">
<!ENTITY RFC3704 SYSTEM "reference.RFC.3704.xml">
<!ENTITY RFC3736 SYSTEM "reference.RFC.3736.xml">
<!ENTITY RFC3769 SYSTEM "reference.RFC.3769.xml">
<!ENTITY RFC3828 SYSTEM "reference.RFC.3828.xml">
<!ENTITY RFC4214 SYSTEM "reference.RFC.4214.xml">
<!ENTITY RFC4271 SYSTEM "reference.RFC.4271.xml">
<!ENTITY RFC4291 SYSTEM "reference.RFC.4291.xml">
<!ENTITY RFC4443 SYSTEM "reference.RFC.4443.xml">
<!ENTITY RFC4821 SYSTEM "reference.RFC.4821.xml">
<!ENTITY RFC4953 SYSTEM "reference.RFC.4953.xml">
<!ENTITY RFC4862 SYSTEM "reference.RFC.4862.xml">
<!ENTITY RFC4961 SYSTEM "reference.RFC.4961.xml">
<!ENTITY RFC5082 SYSTEM "reference.RFC.5082.xml">
<!ENTITY RFC5569 SYSTEM "reference.RFC.5569.xml">
<!ENTITY RFC5595 SYSTEM "reference.RFC.5595.xml">
<!ENTITY RFC5961 SYSTEM "reference.RFC.5961.xml">
<!ENTITY RFC5969 SYSTEM "reference.RFC.5969.xml">
<!ENTITY RFC6040 SYSTEM "reference.RFC.6040.xml">
<!ENTITY RFC6052 SYSTEM "reference.RFC.6052.xml">
<!ENTITY RFC6056 SYSTEM "reference.RFC.6056.xml">
<!ENTITY RFC6145 SYSTEM "reference.RFC.6145.xml">
<!ENTITY RFC6146 SYSTEM "reference.RFC.6146.xml">
<!ENTITY RFC6147 SYSTEM "reference.RFC.6147.xml">
<!ENTITY RFC6219 SYSTEM "reference.RFC.6219.xml">
<!ENTITY RFC6324 SYSTEM "reference.RFC.6324.xml">
<!ENTITY RFC6346 SYSTEM "reference.RFC.6346.xml">
<!ENTITY RFC6437 SYSTEM "reference.RFC.6437.xml">
<!ENTITY RFC6535 SYSTEM "reference.RFC.6535.xml">
]>

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>

<rfc category="exp" number="7600" ipr="trust200902" submissionType="IETF"
  consensus="yes">

  <front>
    <title abbrev="Stateless IPv4 Residual Deployment (4rd)">IPv4 Residual
    Deployment via IPv6 - A Stateless Solution (4rd)</title>

    <author fullname="Remi Despres" initials="R" surname="Despres">
      <organization>RD-IPtech</organization>
      <address>
        <postal>
          <street>3 rue du President Wilson</street>
          <city>Levallois</city>
          <region></region>
          <code></code>
          <country>France</country>
        </postal>
        <email>despres.remi@laposte.net</email>
      </address>
    </author>

    <author fullname="Sheng Jiang" initials="S" role="editor" surname="Jiang">
      <organization>Huawei Technologies Co., Ltd</organization>
      <address>
        <postal>
          <street>Q14, Huawei Campus, No. 156 BeiQing Road</street>
          <city>Hai-Dian District, Beijing</city>
          <region></region>
          <code>100095</code>
          <country>China</country>
        </postal>
        <email>jiangsheng@huawei.com</email>
      </address>
    </author>

    <author fullname="Reinaldo Penno" initials="R" surname="Penno">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <region>CA</region>
          <code>95134</code>
          <country>United States</country>
        </postal>
        <email>repenno@cisco.com</email>
      </address>
    </author>

    <author fullname="Yiu Lee" initials="Y" surname="Lee">
      <organization>Comcast</organization>
      <address>
        <postal>
          <street>One Comcast Center</street>
          <city>Philadelphia</city>
          <region>PA</region>
          <code>19103</code>
          <country>United States</country>
        </postal>
        <email>yiu_lee@cable.comcast.com</email>
      </address>
    </author>

    <author fullname="Gang Chen" initials="G" surname="Chen">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <street>29, Jinrong Avenue</street>
          <city>Xicheng District</city>
          <region>Beijing</region>
          <code>100033</code>
          <country>China</country>
        </postal>
        <email>phdgang@gmail.com, chengang@chinamobile.com</email>
      </address>
    </author>

    <author fullname="Maoke Chen (a.k.a. Noriyuki Arai)" initials="M" surname="Chen">
      <organization>BBIX, Inc.</organization>
      <address>
        <postal>
          <street>Tokyo Shiodome Building, Higashi-Shimbashi 1-9-1</street>
          <city>Minato-ku, Tokyo</city>
          <code>105-7310</code>
          <country>Japan</country>
        </postal>
        <email>maoke@bbix.net</email>
      </address>
    </author>

    <date month="July" year="2015" />

    <keyword>Coexistence</keyword>
    <keyword>Transition</keyword>
    <keyword>Interworking</keyword>
    <keyword>Tunneling</keyword>
    <keyword>Stateless</keyword>
    <keyword>4rd</keyword>
    <keyword>IPv4</keyword>
    <keyword>IPv6</keyword>
    <keyword>Mapping</keyword>
    <keyword>Global Addressing</keyword>

    <abstract>
      <t>This document specifies a stateless solution for
      service providers to progressively deploy IPv6-only network domains
      while still offering IPv4 service to customers. The solution's
      distinctive properties are that TCP/UDP IPv4 packets are valid
      TCP/UDP IPv6 packets during domain traversal and that IPv4
      fragmentation rules are fully preserved end to end. Each customer
      can be assigned one public IPv4 address, several public IPv4 addresses,
      or a shared address with a restricted port set.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introSec" title="Introduction">
      <t>For service providers to progressively deploy IPv6-only network
      domains while still offering IPv4 service to customers, the need for a
      stateless solution, i.e., one where no per-customer state is needed in
      IPv4-IPv6 gateway nodes of the provider, has been discussed in <xref
      target="Solutions-4v6"></xref>. This document specifies one such
      solution, named "4rd" for IPv4 Residual Deployment. Its distinctive
      properties are that TCP/UDP IPv4 packets are valid TCP/UDP IPv6
      packets during domain traversal and that IPv4 fragmentation rules
      are fully preserved end to end.</t>

      <t>Using this solution, IPv4 packets are transparently tunneled across
      IPv6 networks (the reverse of IPv6 Rapid Deployment on IPv4
      Infrastructures (6rd) <xref target="RFC5969"></xref>, in which
      IPv6 packets are statelessly tunneled across IPv4 networks).</t>

      <t>While IPv6 headers are too long to be mapped into IPv4 headers
      (which is why 6rd requires encapsulation of full IPv6 packets in
      IPv4 packets), IPv4 headers can be reversibly translated into
      IPv6 headers in such a way that, during IPv6 domain traversal,
      UDP packets having checksums and TCP packets are valid IPv6 packets.
      IPv6-only middleboxes that perform deep packet inspection can
      operate on them, in particular for port inspection and web caches.</t>

      <t>In order to deal with the IPv4 address shortage, customers can be
      assigned shared public IPv4 addresses with statically assigned
      restricted port sets. As such, it is a particular application of the
      Address plus Port (A+P) approach <xref target="RFC6346"></xref>.</t>

      <t>Deploying 4rd in networks that have enough public
      IPv4 addresses, customer sites can also be assigned full
      public IPv4 addresses. &nbsp;4rd also supports scenarios where
      a set of public IPv4 addresses are assigned to customer sites.</t>

      <t>The design of 4rd builds on a number of previous proposals made for
      IPv4-via-IPv6 transition technologies
      (<xref target="prevWorkSec"></xref>).</t>

      <t>In some use cases, IPv4-only applications of 4rd-capable customer
      nodes can also work with stateful NAT64s <xref
      target="RFC6146"></xref>, provided these are upgraded to support 4rd
      tunnels in addition to their IP/ICMP translation <xref
      target="RFC6145"></xref>. The advantage is then a more complete IPv4
      transparency than with double translation.</t>

      <t>How the 4rd model fits in the Internet architecture is summarized in
      <xref target="modelSec"></xref>. The protocol specifications are
      detailed in <xref target="specSec"></xref>.
      Sections <xref target="secSec" format="counter"></xref> and
      <xref target="ianaSec" format="counter"></xref> deal with
      security considerations and IANA considerations, respectively.
      Previous proposals that influenced this specification are listed in
      <xref target="prevWorkSec"></xref>. A few typical 4rd use cases are
      presented in Appendices <xref target="TextRep" format="counter"></xref>,
      <xref target="ispSec" format="counter"></xref>,
      <xref target="add4rdSec" format="counter"></xref>,
      <xref target="Sec4Via6" format="counter"></xref>, and
      <xref target="Sec4rd-6rd" format="counter"></xref>.</t>
    </section>

    <section anchor="termSec" title="Terminology">
      <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"></xref>.</t>

      <t><list hangIndent="5" style="hanging">
          <t hangText="ISP:">Internet Service Provider. In this document, the
          service it offers can be DSL, fiber-optics, cable, or mobile. The
          ISP can also be a private-network operator.</t>

          <t hangText="4rd (IPv4 Residual Deployment):">An extension of the
          IPv4 service where public IPv4 addresses can be statically shared
          among several customer sites, each one being assigned an exclusive
          port set. This service is supported across IPv6-routing domains.</t>

          <t hangText="4rd domain (or Domain):">An ISP-operated IPv6 network
          across which 4rd is supported according to the present
          specification.</t>

          <t hangText="Tunnel packet:">An IPv6 packet that transparently
          conveys an IPv4 packet across a 4rd domain. Its header has enough
          information to reconstitute the IPv4 header at Domain exit. Its
          payload is the original IPv4 payload.</t>

          <t hangText="CE (Customer Edge):">A customer-side tunnel endpoint.
          It can be in a node that is a host, a router, or both.</t>

          <t hangText="BR (Border Relay):">An ISP-side tunnel endpoint.
          Because its operation is stateless (neither per CE nor per session
          state), it can be replicated in as many nodes as needed for
          scalability.</t>

          <t hangText="4rd IPv6 address:">IPv6 address used as the destination
          of a Tunnel packet sent to a CE or a BR.</t>

          <t hangText="NAT64+:">An ISP NAT64 <xref target="RFC6146"></xref>
          that is upgraded to support 4rd tunneling when IPv6 addresses it
          deals with are 4rd IPv6 addresses.</t>

          <t hangText="4rd IPv4 address:">A public IPv4 address or, in the
          case of a shared public IPv4 address, a public transport address
          (public IPv4 address plus port number).</t>

          <t hangText="PSID (Port-Set Identifier):">A flexible-length field
          that algorithmically identifies a port set.</t>

          <t hangText="4rd IPv4 prefix:">A flexible-length prefix that may be
          a public IPv4 prefix, a public IPv4 address, or a public IPv4
          address followed by a PSID.</t>

          <t hangText="Mapping rule:">A set of parameters that are used by BRs
          and CEs to derive 4rd IPv6 addresses from 4rd IPv4 addresses.
          Mapping rules are also used by each CE to derive a 4rd IPv4 prefix
          from an IPv6 prefix that has been delegated to it.</t>

          <t hangText="EA bits (Embedded Address bits):">Bits that are the
          same in a 4rd IPv4 address and in the 4rd IPv6 address derived from
          it.</t>

          <t hangText="BR mapping rule:">The mapping rule that is applicable to
          off-domain IPv4 addresses (addresses reachable via BRs). It can also
          apply to some or all CE-assigned IPv4 addresses.</t>

          <t hangText="CE mapping rule:">A mapping rule that is applicable
          only to CE-assigned IPv4 addresses (shared or not).</t>

          <t hangText="NAT64+ mapping rule:">The mapping rule that is
          applicable to IPv4 addresses reachable via a NAT64+.</t>

          <t hangText="CNP (Checksum Neutrality Preserver):">A field of 4rd
          IPv6 addresses that ensures that TCP-like checksums do not change
          when IPv4 addresses are replaced with 4rd IPv6 addresses.</t>

          <t hangText="4rd Tag:">A 16-bit tag whose value allows 4rd CEs,
          BRs, and NAT64+s to distinguish 4rd IPv6 addresses from other IPv6
          addresses.</t>
        </list></t>

    </section>

    <section anchor="modelSec" title="The 4rd Model">
      <figure align="center" anchor="modelFig" title="The 4rd Model in the
Internet Architecture">

        <artwork align="center"><![CDATA[                            4rd Domain
               +-----------------------------+
               |        IPv6 routing         |
               |  Enforced ingress filtering | +----------
          ...  |                             | |
               |                          +------+
Customer site  |                          |BR(s) |  IPv4
+------------+ |      BR IPv6 prefix  --> |and/or| Internet
| dual-stack | |                          |N4T64+|
|         +--+ |                          +------+
|         |CE+-+ <-- a CE IPv6 prefix        | |
|         +--+ |                             | +----------
|            | |                             |
+------------+ |     <--IPv4 tunnels-->      +------------
  => Derived   |  (Mesh or hub-and-spoke     |
4rd IPv4 prefix|         topologies)         |    IPv6
               |                             |  Internet
          ...  |                             |
               |                             +------------
               +-----------------------------+
              <== one or several Mapping rules
          (e.g., announced to CEs in stateless DHCPv6)
]]></artwork>
      </figure>

      <t>How the 4rd model fits in the Internet architecture is represented in
      <xref target="modelFig"></xref>.</t>

      <t>A 4rd domain is an IPv6 network that includes one or several 4rd BRs
      or NAT64+s at its border with the public IPv4 Internet and that can
      advertise its IPv4-IPv6 Mapping rule(s) to CEs according to <xref
      target="dhcpSec"></xref>.</t>

      <t>BRs of a 4rd Domain are all identical as far as 4rd is concerned. In
      a 4rd CE, the IPv4 packets that need to reach a BR will be
      transformed (as detailed in <xref target="packetSec"></xref>) into
      IPv6 packets that have the same anycast IPv6 prefix, which is the
      80-bit BR prefix, in their destination addresses. They are then
      routed to any of the BRs. The 80-bit BR IPv6 prefix is an
      arbitrarily chosen /64 prefix from the IPv6 address space
      of the network operator and appended with 0x0300
      (16-bit 4rd Tag; see R-9 in <xref target="v4ToV6Sec"></xref>).</t>

      <t>Using the Mapping rule that applies, each CE derives its 4rd IPv4
      prefix from its delegated IPv6 prefix, or one of them if it has several;
      see <xref target="v6ToV4Sec"></xref> for details. If the obtained
      IPv4 prefix has more than 32 bits, the assigned IPv4 address is
      shared among several CEs. Bits beyond the first 32 specify a
      set of ports whose use is reserved for the CE.</t>

      <t>IPv4 traffic is automatically tunneled across the Domain,
      in either mesh topology or hub-and-spoke topology <xref
      target="RFC4925"></xref>. By default, IPv4 traffic between two CEs
      follows a direct IPv6 route between them (mesh topology). If the ISP
      configures the hub-and-spoke option, each IPv4 packet from one CE to
      another is routed via a BR.</t>

      <t>During Domain traversal, each tunneled TCP/UDP IPv4 packet looks
      like a valid TCP/UDP IPv6 packet. Thus, TCP/UDP access control lists
      that apply to IPv6, and possibly some other functions using deep packet
      inspection, also apply to IPv4.</t>

      <t>In order for IPv4 anti-spoofing protection in CEs and BRs to remain
      effective when combined with 4rd tunneling, ingress filtering
      <xref target="RFC3704"/> has to be in effect in IPv6
      (see R-12 and <xref target="secSec"></xref>).</t>

      <t>If an ISP wishes to support dynamic IPv4 address sharing in addition
      to or in place of 4rd stateless address sharing, it can do so
      by means of a stateful NAT64. By upgrading this NAT to add
      support for 4rd tunnels, which makes it a NAT64+, CEs that are
      assigned no static IPv4 space can benefit from complete IPv4
      transparency between the CE and the NAT64. (Without this NAT64
      upgrade, IPv4 traffic is translated to IPv6 and back to IPv4,
      during which time the DF = MF&nbsp;=&nbsp;1 combination for IPv4, as
      recommended for host fragmentation in
      Section 8 of <xref target="RFC4821"></xref>, is lost.)</t>

      <t>IPv4 packets are kept unchanged by Domain traversal, except that:
      <list style="symbols">
          <t>The IPv4 Time To Live (TTL), unless it is 1 or 255 at Domain
          entry, decreases during Domain traversal by the number of traversed
          routers. This is acceptable because it is undetectable end to end
          and also because TTL values that can be used with some protocols
          to test the adjacency of communicating routers are preserved <xref
          target="RFC4271"></xref> <xref target="RFC5082"></xref>. The effect
          on the traceroute utility, which uses TTL expiry to discover routers
          of end-to-end paths, is noted in <xref target="packetSec"></xref>.</t>

          <t>IPv4 packets whose lengths are &lt;= 68 octets always have their
          "Don't Fragment" (DF) flags set to 1 at Domain exit even if they
          had DF = 0 at Domain entry. This is acceptable because these packets
          are too short to be fragmented <xref target="RFC0791"></xref>
          and so their DF bits have no meaning. Besides, both
          <xref target="RFC1191"></xref> and <xref target="RFC4821"></xref>
          recommend that sources always set DF to 1.</t>

          <t>Unless the Tunnel Traffic Class option applies to a Domain (<xref
          target="paramSec"></xref>), IPv4 packets may have their
          Type of Service (TOS) fields modified after
          Domain traversal (<xref target="dscpEcnSec"></xref>).</t>
        </list></t>
    </section>

    <section anchor="specSec" title="Protocol Specifications">
      <t>This section describes detailed 4rd protocol specifications. They are
      mainly organized by functions. As a brief summary:</t>

      <t><list style="symbols">
      <t>A 4rd CE MUST follow
      R-1, R-2, R-3, R-4, R-6, R-7, R-8, R-9, R-10, R-11, R-12, R-13, R-14,
      R-16, R-17, R-18, R-19, R-20, R-21, R-22, R-23, R-24, R-25, R-26,
      and R-27.</t>

      <t>A 4rd BR MUST follow R-2, R-3, R-4, R-5, R-6, R-9, R-12, R-13, R-14,
      R-15, R-19, R-20, R-21, R-22, and R-24.</t>
    </list></t>

      <section anchor="NAT44CE" title="NAT44 on CE">
        <t><list counter="mine" style="format R-%d:">
            <t>A CE node that is assigned a shared public IPv4 address MUST
            include a NAT44 <xref target="RFC3022"></xref>. This NAT44 MUST
            only use external ports that are in the CE-assigned port set.</t>
          </list>NOTE: This specification only concerns IPv4 communication
        between IPv4-capable endpoints. For communication between IPv4-only
        endpoints and IPv6-only remote endpoints, the "Bump-in-the-Host"
        (BIH) specification <xref target="RFC6535"></xref> can be used.
        It can coexist in a node with the CE function, including
        scenarios where the IPv4-only function is a
        NAT44 <xref target="RFC3022"></xref>.</t>
      </section>

      <section anchor="paramSec"
               title="Mapping Rules and Other Domain Parameters">
        <t><list counter="mine" style="format R-%d:">
            <t>CEs and BRs MUST be configured with the following Domain
            parameters: <list style="letters">
                <t>One or several Mapping rules, each one comprising
                   the following:
                   <list style="numbers">
                    <t>Rule IPv4 prefix</t>

                    <t>EA-bits length</t>

                    <t>Rule IPv6 prefix</t>

                    <t>Well-Known Ports (WKPs) authorized (OPTIONAL)</t>
                  </list></t>

                <t>Domain Path MTU (PMTU)</t>

                <t>Hub-and-spoke topology (Yes or No)</t>

                <t>Tunnel Traffic Class (OPTIONAL)</t>
              </list></t>
          </list></t>

        <t>"Rule IPv4 prefix" is used to find, by a longest match, which
        Mapping rule applies to a 4rd IPv4 address (<xref
        target="v4ToV6Sec"></xref>). A Mapping rule whose Rule IPv4 prefix is
        longer than /0 is a CE mapping rule. BR and NAT64+ mapping rules,
        which must apply to all off-domain IPv4 addresses, have /0 as their
        Rule IPv4 prefixes.</t>

        <t>"EA-bits length" is the number of bits that are common to 4rd IPv4
        addresses and 4rd IPv6 addresses derived from them. In a CE mapping
        rule, it is also the number of bits that are common to a CE-delegated
        IPv6 prefix and the 4rd IPv4 prefix derived from it. BR and NAT64+
        mapping rules have EA-bits lengths equal to 32.</t>

        <t>"Rule IPv6 prefix" is the prefix that is used as a substitute for
        the Rule IPv4 prefix when a 4rd IPv6 address is derived from a
        4rd IPv4 address (<xref target="v4ToV6Sec"></xref>). In a BR
        mapping rule or a NAT64+ mapping rule, it MUST be a /80 prefix
        whose bits 64-79 are the 4rd Tag.</t>

        <t>"WKPs authorized" may be set for mapping rules that assign shared
        IPv4 addresses to CEs. (These rules are those whose length of the Rule
        IPv4 prefix plus the EA-bits length exceeds 32.) If set, well-known
        ports may be assigned to some CEs having particular IPv6 prefixes. If
        not set, fairness is privileged: all IPv6 prefixes concerned with the
        Mapping rule have port sets having identical values (no port set
        includes any of the well-known ports).</t>

        <t>"Domain PMTU" is the IPv6 Path MTU that the ISP can guarantee for
        all of its IPv6 paths between CEs and between BRs and CEs. It MUST
        be at least 1280 octets <xref target="RFC2460"></xref>.</t>

        <t>"Hub-and-spoke topology", if set to Yes, requires CEs to tunnel all
        IPv4 packets via BRs. If set to No, CE-to-CE packets take the same
        routes as native IPv6 packets between the same CEs (mesh
        topology).</t>

        <t>"Tunnel Traffic Class", if provided, is the IPv6 traffic class that
        BRs and CEs MUST set in Tunnel packets. In this case, evolutions of
        the IPv6 traffic class that may occur during Domain traversal are not
        reflected in TOS fields of IPv4 packets at Domain exit (<xref
        target="dscpEcnSec"></xref>).</t>
      </section>

      <section anchor="packetSec"
               title="Reversible Packet Translations at Domain Entries and Exits">
        <t><list counter="mine" style="format R-%d:">
            <t>Domain-entry nodes that receive IPv4 packets with IPv4 options
            MUST discard these packets and return ICMPv4 error messages to
            signal IPv4-option incompatibility (Type = 12, Code = 0, Pointer =
            20) <xref target="RFC0792"></xref>. This limitation is acceptable
            because there are a lot of firewalls in the current
            IPv4 Internet that also filter IPv4 packets with IPv4 options.</t>

            <t>Domain-entry nodes that receive IPv4 packets without IPv4
            options MUST convert them to Tunnel packets, with or without IPv6
            fragment headers, depending on what is needed to ensure IPv4
            transparency (<xref target="formatFig"></xref>). Domain-exit nodes
            MUST convert them back to IPv4 packets.
            <vspace blankLines="1" />
            An IPv6 fragmentation header MUST be included at tunnel entry
            (<xref target="formatFig"></xref>) if and only if one or several
            of the following conditions hold: <list style="symbols">
                <t>The Tunnel Traffic Class option applies to the Domain.</t>

                <t>TTL = 1 OR TTL = 255.</t>

                <t>The IPv4 packet is already fragmented, or may be fragmented
                later on, i.e., if MF = 1 OR offset &gt; 0
                OR (total length &gt; 68 AND DF = 0).</t>
              </list> <vspace blankLines="1" /> In order to optimize cases
            where fragmentation headers are unnecessary, the NAT44 of a CE
            that has one SHOULD send packets with TTL = 254.</t>

            <t>In Domains whose chosen topology is hub-and-spoke, BRs that
            receive 4rd IPv6 packets whose embedded destination IPv4 addresses
            match a CE mapping rule MUST do the equivalent of reversibly
            translating their headers to IPv4 and then reversibly translate
            them back to IPv6 as though packets would be entering the
            Domain.</t>
          </list></t>

        <figure align="center" anchor="formatFig" title="Reversible Packet Translation">
          <artwork align="center"><![CDATA[
                (A) Without IPv6 fragment header
       IPv4 packet                          Tunnel packet
  +--------------------+ :            : +--------------------+
20|     IPv4 Header    | :    <==>    : |     IPv6 Header    | 40
  +--------------------+ :            : +--------------------+
  |     IP Payload     |      <==>      |     IP Payload     |
  |                    |     Layer 4    |                    |
  +--------------------+    unchanged   +--------------------+


                (B) With IPv6 fragment header
                                            Tunnel packet
                                      : +--------------------+
       IPv4 packet                    : |     IPv6 Header    | 40
  +--------------------+ :            : +--------------------+
20|     IPv4 Header    | :    <==>    : |IPv6 Fragment Header|  8
  +--------------------+ :            : +--------------------+
  |     IP Payload     |      <==>      |     IP Payload     |
  |                    |     Layer 4    |                    |
  +--------------------+    unchanged   +--------------------+
]]></artwork>
        </figure>

        <t><list counter="mine" style="format R-%d:">
            <t>Values to be set in IPv6 header fields at Domain entry are
            detailed in <xref target="v6HeadTable1"></xref>
            (no fragment header) and <xref target="v6HeadTable2"></xref>
            (with fragment header). Those to be set in IPv4 header fields at
            Domain exit are detailed in <xref target="v4HeadTable1"></xref>
            (no fragment header) and <xref target="v4HeadTable2"></xref>
            (with fragment header).
            <vspace blankLines="1" />
            To convey
            IPv4 header information that has no equivalent in IPv6, some
            ad hoc fields are placed in IPv6 flow labels and in Identification
            fields of IPv6 fragment headers, as detailed in <xref
            target="fragHeadFig"></xref>.</t>
          </list></t>

        <figure align="center" anchor="fragHeadFig" title="4rd Identification
Fields of IPv6 Fragment Headers">
          <artwork align="center"><![CDATA[
                 |0      |4                            19| 
                 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                 |   0   |         Addr_Prot_Cksm        |
                 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                            IPv6 Flow Label

    0 1 2          |8              |16                           31|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |.|.|.|    0    |    IPv4_TOS   |             IPv4_ID           |
   /-+-\-\-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  /     \ TTL_255         IPv6 Identification Field
IPv4_DF  TTL_1            (in fragment header if needed)
]]></artwork>
        </figure>

        <texttable anchor="v6HeadTable1" title="IPv4-to-IPv6 Reversible Header
Translation (without&nbsp;Fragment&nbsp;Header)">
          <ttcol>IPv6 Field</ttcol>

          <ttcol>Value (fields from IPv4 header)</ttcol>

          <c>Version</c>

          <c>6</c>

          <c>Traffic Class</c>

          <c>TOS</c>

          <c>Addr_Prot_Cksm</c>

          <c>Sum of addresses and Protocol (Note 1)</c>

          <c>Payload length</c>

          <c>Total length - 20</c>

          <c>Next header</c>

          <c>Protocol</c>

          <c>Hop limit</c>

          <c>Time to Live</c>

          <c>Source address</c>

          <c>See <xref target="v4ToV6Sec"></xref></c>

          <c>Destination address</c>

          <c>See <xref target="v4ToV6Sec"></xref></c>
        </texttable>

        <texttable anchor="v6HeadTable2" title="IPv4-to-IPv6 Reversible Header
Translation (with&nbsp;Fragment&nbsp;Header)">
          <ttcol>IPv6 Field</ttcol>

          <ttcol>Value (fields from IPv4 header)</ttcol>

          <c>Version</c>

          <c>6</c>

          <c>Traffic Class</c>

          <c>TOS OR Tunnel Traffic Class (<xref
          target="dscpEcnSec"></xref>)</c>

          <c>Addr_Prot_Cksm</c>

          <c>Sum of addresses and Protocol (Note 1)</c>

          <c>Payload length</c>

          <c>Total length - 12</c>

          <c>Next header</c>

          <c>44 (fragment header)</c>

          <c>Hop limit</c>

          <c>IF Time to Live = 1 or 255 THEN 254</c>

          <c></c>

          <c>ELSE Time to Live (Note 2)</c>

          <c>Source address</c>

          <c>See <xref target="v4ToV6Sec"></xref></c>

          <c>Dest. address</c>

          <c>See <xref target="v4ToV6Sec"></xref></c>

          <c>2nd next header</c>

          <c>Protocol</c>

          <c>Fragment offset</c>

          <c>IPv4 fragment offset</c>

          <c>M</c>

          <c>More Fragments flag (MF)</c>

          <c>IPv4_DF</c>

          <c>Don't Fragment flag (DF)</c>

          <c>TTL_1</c>

          <c>IF Time to Live = 1 THEN 1 ELSE 0 (Note 2)</c>

          <c>TTL_255</c>

          <c>IF Time to Live = 255 THEN 1 ELSE 0 (Note 2)</c>

          <c>IPv4_TOS</c>

          <c>Type of Service (TOS)</c>

          <c>IPv4_ID</c>

          <c>Identification</c>
        </texttable>

        <texttable anchor="v4HeadTable1" title="IPv6-to-IPv4 Reversible Header
Translation (without&nbsp;Fragment&nbsp;Header)">
          <ttcol>IPv4 Field</ttcol>

          <ttcol>Value (fields from IPv6 header)</ttcol>

          <c>Version</c>

          <c>4</c>

          <c>Header length</c>

          <c>5</c>

          <c>TOS</c>

          <c>Traffic Class</c>

          <c>Total length</c>

          <c>Payload length + 20</c>

          <c>Identification</c>

          <c>0</c>

          <c>DF</c>

          <c>1</c>

          <c>MF</c>

          <c>0</c>

          <c>Fragment offset</c>

          <c>0</c>

          <c>Time to Live</c>

          <c>Hop count</c>

          <c>Protocol</c>

          <c>Next header</c>

          <c>Header checksum</c>

          <c>Computed as per <xref target="RFC0791"></xref> (Note 3)</c>

          <c>Source address</c>

          <c>Bits 80-111 of source address</c>

          <c>Dest. address</c>

          <c>Bits 80-111 of destination address</c>
        </texttable>

        <texttable anchor="v4HeadTable2" title="IPv6-to-IPv4 Reversible Header
Translation (with&nbsp;Fragment&nbsp;Header)
">
          <ttcol>IPv4 Field</ttcol>

          <ttcol>Value (fields from IPv6 header)</ttcol>

          <c>Version</c>

          <c>4</c>

          <c>Header length</c>

          <c>5</c>

          <c>TOS</c>

          <c>Traffic Class OR IPv4_TOS (<xref target="dscpEcnSec"></xref>)</c>

          <c>Total length</c>

          <c>Payload length + 12</c>

          <c>Identification</c>

          <c>IPv4_ID</c>

          <c>DF</c>

          <c>IPv4_DF</c>

          <c>MF</c>

          <c>M</c>

          <c>Fragment offset</c>

          <c>Fragment offset</c>

          <c>Time to Live (Note 2)</c>

          <c>IF TTL_255 = 1 THEN 255</c>

          <c></c>

          <c>ELSEIF TTL_1 = 1 THEN 1 ELSE hop count</c>

          <c>Protocol</c>

          <c>2nd next header</c>

          <c>Header checksum</c>

          <c>Computed as per <xref target="RFC0791"></xref> (Note 3)</c>

          <c>Source address</c>

          <c>Bits 80-111 of source address</c>

          <c>Destination address</c>

          <c>Bits 80-111 of destination address</c>
        </texttable>

        <t>NOTE 1: The need to save in the IPv6 header a checksum of both IPv4
        addresses and the IPv4 protocol field results from the following
        facts: (1) header checksums, present in IPv4 but not in IPv6, protect
        addresses or protocol integrity; (2) in IPv4, ICMP messages and
        null-checksum UDP datagrams depend on this protection because, unlike
        other datagrams, they have no other address-and-protocol integrity
        protection. The sum MUST be performed in ordinary two's complement
        arithmetic. <vspace blankLines="1" /> IP-layer Packet length is
        another field covered by the IPv4 header checksum. It is not
        included in the saved checksum because (1) doing so would have
        conflicted with <xref target="RFC6437"></xref> (flow labels must be
        the same in all packets of each flow); (2) ICMPv4 messages have good
        enough protection with their own checksums; (3) the UDP length field
        provides to null-checksum UDP datagrams the same level of protection
        after Domain traversal as without Domain traversal (consistency
        between IP-layer and UDP-layer lengths can be checked).</t>

        <t>NOTE 2: TTL treatment has been chosen to permit adjacency tests
        between two IPv4 nodes situated at both ends of a 4rd tunnel. TTL
        values to be preserved for this are TTL = 255 and TTL = 1. For other
        values, TTL decreases between two IPv4 nodes as though the
        traversed IPv6 routers were IPv4 routers.
        <vspace blankLines="1" />
        The effect of this TTL treatment on IPv4 traceroute is
        specific: (1) the number of routers of the end-to-end path includes
        traversed IPv6 routers; (2) IPv6 routers of a Domain are listed after
        IPv4 routers of Domain entry and exit; (3) the IPv4 address shown for
        an IPv6 router is the IPv6-only dummy IPv4 address (<xref
        target="icmpSec"></xref>); (4) the response time indicated for an IPv6
        router is that of the next router.</t>

        <t>NOTE 3: Provided the sum of obtained IPv4 addresses and protocol
        matches Addr_Prot_Cksm. If not, the packet MUST be silently
        discarded.</t>
      </section>

      <section anchor="v6ToV4Sec"
               title="Address Mapping from CE IPv6 Prefixes to 4rd IPv4 Prefixes">
        <figure align="center" anchor="v6To4rdFig" title="From CE IPv6 Prefix
to 4rd IPv4 Address and Port Set">
          <artwork align="center"><![CDATA[
  +--------------------------------------+
  |             CE IPv6 prefix           | 
  +--------------------------+-----------+ 
  :     Longest match        :           :
  :  with a Rule IPv6 prefix :           :
  :           ||             :  EA-bits  :
  :           \/             :   length  :
  +--------------------------+     |     :
  |    Rule IPv6 prefix      |<----'---->:
  +--------------------------+           :
                ||           :           :
                \/           :           :
           +-----------------+-----------+
           |Rule IPv4 prefix |  EA bits  |
           +-----------------+-----------+
           :                             :
           +-----------------------------+
           |     CE 4rd IPv4 prefix      |
           +-----------------------------+
  ________/ \_________                   :
 /                    \                  :
:                  ____:________________/ \__ 
:                 /    :                     \
:    <= 32       :     :          > 32        :
+----------------+     +-----------------+----+
|IPv4 prfx or add|  OR |   IPv4 address  |PSID|
+----------------+     +-----------------+----+
                       :       32        : || :
                                           \/
                 (by default)          (If WKPs authorized)
                     :    :                     :    :
                 +---+----+---------+           +----+-------------+
   Ports in      |> 0|PSID|any value|    OR     |PSID|  any value  |
the CE port set  +---+----+---------+           +----+-------------+
                 : 4 :     12       :           :        16        :
]]></artwork>
        </figure>

        <t><list counter="mine" style="format R-%d:">
            <t>A CE whose delegated IPv6 prefix matches the Rule IPv6 prefix
            of one or several Mapping rules MUST select the CE mapping rule
            for which the match is the longest. It then derives its 4rd IPv4
            prefix as shown in <xref target="v6To4rdFig"></xref>: (1) The CE
            replaces the Rule IPv6 prefix with the Rule IPv4 prefix. The result
            is the CE 4rd IPv4 prefix. &nbsp;(2) If this CE 4rd IPv4 prefix
            has less than 32 bits, the CE takes it as its assigned
            IPv4 prefix. If it has exactly 32 bits, the CE takes it
            as its IPv4 address. If it has more than 32 bits,
            the CE MUST take the first 32 bits as its shared public
            IPv4 address and bits beyond the first 32 as its
            Port-set identifier (PSID). Ports of its restricted port set are
            by default those that have any non-zero value in their first 4
            bits (the PSID offset), followed by the PSID, and followed by any
            values in remaining bits. If the WKP authorized option applies to
            the Mapping rule, there is no 4-bit offset before the PSID so that
            all ports can be assigned.
            <vspace blankLines="1" />
            NOTE: The choice of the default PSID position in Port fields
            has been guided by the following objectives: (1) for fairness,
            avoid having any of the well-known ports 0-1023 in the port set
            specified by any PSID value; (2) for compatibility with
            RTP/RTCP <xref target="RFC4961"></xref>, include in each port set
            pairs of consecutive ports; (3) in order to facilitate operation
            and training, have the PSID at a fixed position in port fields;
            (4) in order to facilitate documentation in hexadecimal notation,
            and to facilitate maintenance, have this position nibble-aligned.
            Ports that are excluded from assignment to CEs are 0-4095, instead
            of just 0-1023, in a trade-off to favor nibble alignment of PSIDs
            and overall simplicity.</t>

            <t>A CE whose delegated IPv6 prefix has its longest match with the
            Rule IPv6 prefix of the BR mapping rule MUST take as its
            IPv4 address the 32 bits that, in the delegated IPv6 prefix,
            follow this Rule IPv6 prefix. If this is the case while the
            hub-and-spoke option applies to the Domain, or if the Rule IPv6
            prefix is not a /80, there is a configuration error in the
            Domain. An implementation-dependent administrative action MAY be
            taken.
            <vspace blankLines="1" />
            A CE whose delegated IPv6 prefix does not match the Rule IPv6
            prefix of either any CE Mapping rule or the BR mapping rule,
            and is in a Domain that has a NAT64+ mapping rule,
            MUST be noted as having the unspecified IPv4 address.</t>
          </list></t>
      </section>

      <section anchor="v4ToV6Sec"
               title="Address Mapping from 4rd IPv4 Addresses to 4rd IPv6 Addresses">
        <figure align="center" anchor="addToPrefFig" title="From 4rd IPv4
Address to 4rd IPv6 Address">
          <artwork align="center"><![CDATA[
:            32              :  :       16      : \
+----------------------------+  +---------------+ |
|         IPv4 address       |  |Port_or_ICMP_ID| |  Shared-address
+----------------------------+  +---+------+----+ |       case
:      Longest match         :  : 4 : PSID :      |   (PSID length
:  with a Rule IPv4 prefix   :      :length:      |  of the rule > 0)
:       ||                   :      :      :      |    with WKPs
:       \/                   :      :      :      |  not authorized
+----------------+-----------+      +------+      | (PSID offset = 4)
|Rule IPv4 prefix|IPv4 suffix|      | PSID |      |
+----------------+-----------+      +------+      |
:       ||        \_______    \____ |      |      |
:       \/                \        \|      /      |
+--------------------------+--------+-----+      /
|    Rule IPv6 prefix      |    EA bits   |
+--------------------------+--------------+
:                                         :
+-----------------------------------------+
|                 IPv6 prefix             |
+-----------------------------------------+
:\_______________________________        / \
:             ___________________\______/   \_______________
:            /                    \                         \
:           / (CE mapping rule)    \   (BR mapping rule)     \
:   <= 64  :                        :          112            :
+----------+---+---+------+---+     +--------------+---+------+---+
|CE v6 prfx| 0 |tag|v4 add|CNP|     |BR IPv6 prefix|tag|v4 add|CNP|
+----------+-|-+---+------+---+     +--------------+---+------+---+
:   <= 64  : | :16 :  32  :16 :     :      64      :16 :  32  :16 :
             |
       Padding to /64
]]></artwork>
        </figure>

        <t><list counter="mine" style="format R-%d:">
            <t>BRs, and CEs that are assigned public IPv4 addresses, shared or
            not, MUST derive 4rd IPv6 addresses from 4rd IPv4 addresses
            via the steps below or their functional equivalent (<xref
            target="addToPrefFig"></xref> details the shared public IPv4
            address case):
            <vspace blankLines="1" />
            NOTE: The rules for forming 4rd-specific
            Interface Identifiers (IIDs)
            are to obey <xref target="RFC7136"></xref>:
            <vspace blankLines="1"/>
            "Specifications of other forms of 64-bit IIDs MUST specify how
            all 64 bits are set."
            <vspace blankLines="1"/>
            and
            <vspace blankLines="1"/>
            "the whole IID value MUST be viewed
            as an opaque bit string by third parties, except possibly in
            the local context."

            <list style="format (%d)">
                <t>If hub-and-spoke topology does not apply to the Domain, or
                if it applies but the IPv6 address to be derived is a source
                address from a CE or a destination address from a BR, find the
                CE mapping rule whose Rule IPv4 prefix has the longest match
                with the IPv4 address. <vspace blankLines="1" /> If no Mapping
                rule is thus obtained, take the BR mapping rule.
                <vspace blankLines="1" />
                If the obtained Mapping rule assigns IPv4 prefixes to
                CEs, i.e., if the length of the Rule IPv4 prefix plus
                EA-bits length is 32 - k, with k &gt;= 0, delete the last k
                bits of the IPv4 address.
                <vspace blankLines="1" />
                Otherwise, if the length of the Rule IPv4 prefix plus the
                EA-bits length is 32 + k, with k &gt; 0, take k as the
                PSID length and append to the IPv4 address the PSID copied
                from bits p to p+3 of the Port_or_ICMP_ID field where
                (1) p, the PSID offset, is 4 by default and 0 if the WKPs
                authorized option applies to the rule;
                (2) the Port_or_ICMP_ID field is in bits of the IP
                payload that depend on whether the address is source or
                destination, on whether the packet is ICMP or not, and, if it
                is ICMP, whether it is an error message or an Echo message.
                This field is: <list style="letters">
                    <t>If the packet Protocol is not ICMP, the port field
                    associated with the address (bits 0-15 for a source
                    address and bits 16-31 for a destination address).</t>

                    <t>If the packet is an ICMPv4 Echo or Echo reply message,
                    the ICMPv4 Identification field (bits 32-47).</t>

                    <t>If the packet is an ICMPv4 error message, the port
                    field associated with the address in the returned packet
                    header (bits 240-255 for a source address and bits 224-239
                    for a destination address).</t>
                  </list> <vspace blankLines="1" /> NOTE 1: Using
                Identification fields of ICMP messages as port fields
                permits the exchange of Echo requests and Echo replies
                between shared-address CEs and IPv4 hosts having exclusive
                IPv4 addresses. Echo exchanges between two shared-address CEs
                remain impossible, but this is a limitation inherent in
                address sharing (one reason among many to use IPv6).
                <vspace blankLines="1" />
                NOTE 2: When the PSID is taken in the port fields of the
                IPv4 payload, implementation is kept independent from
                any particular Layer&nbsp;4 protocol having such
                port fields by not checking that the protocol is indeed
                one that has such port fields.

                A packet may consequently go, in the case of a source mistake,
                from a BR to a shared-address CE with a protocol that is not
                supported by this CE. In this case, the CE NAT44 returns an
                ICMPv4 "protocol unreachable" error message. The IPv4 source
                is thus appropriately informed of its mistake.</t>

                <t>In the result, replace the Rule IPv4 prefix with the
                Rule IPv6 prefix.</t>

                <t>If the result is shorter than a /64, append to the result a
                null padding up to 64 bits, followed by the 4rd Tag (0x0300),
                and followed by the IPv4 address.
                <vspace blankLines="1" />
                NOTE: The 4rd Tag is a 4rd-specific mark. Its function is to
                ensure that 4rd IPv6 addresses are recognizable by CEs without
                any interference with the choice of subnet prefixes in CE
                sites. (These choices may have been done before 4rd is
                enabled.)
                <vspace blankLines="1" />
                For this, the 4rd Tag has its "u" and "g"
                bits <xref target="RFC4291"></xref> both set to 1, so that
                they maximally differ from these existing IPv6 address
                schemas. So far, u = g = 1 has not been used in any
                IPv6 addressing architecture.
                <vspace blankLines="1" />
                With the 4rd Tag, IPv6 packets can be routed to the
                4rd function within a CE node based on a /80 prefix that
                no native IPv6 address can contain.</t>

                <t>Add to the result a Checksum Neutrality Preserver (CNP).
                Its value, in one's complement arithmetic, is the opposite of
                the sum of 16-bit fields of the IPv6 address other than the
                IPv4 address and the CNP themselves (i.e., five
                consecutive fields in address bits 0-79).
                <vspace blankLines="1" />
                NOTE: The CNP guarantees that Tunnel packets are valid
                IPv6 packets for all Layer&nbsp;4 protocols that use the
                same checksum algorithm as TCP. This guarantee does not
                depend on where the checksum fields of these protocols
                are placed in IP payloads. (Today, such protocols are
                UDP <xref target="RFC0768"></xref>, TCP <xref
                target="RFC0793"></xref>, UDP-Lite <xref
                target="RFC3828"></xref>, and the Datagram Congestion
                Control Protocol (DCCP) <xref target="RFC5595"></xref>.
                Should new ones be specified, BRs will support them
                without needing an update.)</t>
              </list></t>

            <t>A 4rd-capable CE SHOULD, and a 4rd-enabled CE MUST,
            always prohibit all addresses that use its advertised
            prefix and have an IID starting with 0x0300 (4rd Tag), by
            using Duplicate Address Detection <xref target="RFC4862"></xref>.
            </t>

            <t>A CE that is assigned the unspecified IPv4 address (see <xref
            target="v6ToV4Sec"></xref>) MUST use, for packets tunneled between
            itself and the Domain NAT64+, addresses as detailed in <xref
            target="cgnAddFig"></xref>: part (a) for its IPv6 source,
            and part (b) as IPv6 destinations that depend on
            IPv4 destinations. A NAT64+, being
            NAT64 conforming <xref target="RFC6146"></xref>, MUST accept
            IPv6 packets whose destination conforms to <xref
            target="cgnAddFig"></xref>(b) (4rd Tag instead of "u" and 0x00
            octets). In its Binding Information Base, it MUST remember whether
            a mapping was created with a "u" or 4rd-tag destination. In the
            IPv4-to-IPv6 direction, it MUST use 4rd tunneling, with source
            address conforming to <xref target="cgnAddFig"></xref>(b), when
            using a mapping that was created with a 4rd-tag destination.

<figure align="center" anchor="cgnAddFig" title="Rules for CE and NAT64+">
                <artwork align="center"><![CDATA[
    +---------------------+---------+-------+-------------+------+
(a) |   CE IPv6 prefix    |    0    |4rd Tag|      0      |  CNP |
    +---------------------+---------+-------+-------------+------+
    :      <= 64          :  >= 0   :   16  :     32      :  16  :
        4rd IPv6 address of a CE having no public IPv4 address

    <----------- Rule IPv6 prefix --------->:
    +-------------------------------+-------+-------------+------+
(b) |      NAT64+ IPv6 prefix       |4rd Tag|IPv4 address |  CNP |
    +-------------------------------+-------+-------------+------+
    :               64              :   16  :      32     :  16  :
           4rd IPv6 address of a host reachable via a NAT64+
]]></artwork>
              </figure></t>

            <t anchor="antiSpoofR">For anti-spoofing protection, CEs and BRs
            MUST check that the IPv6 source address of each received
            Tunnel packet is that which, according to R-9, is
            derived from the source 4rd IPv4 address. For this, the IPv4
            address used to obtain the source 4rd IPv4 address is that
            embedded in the IPv6 source address (in its bits 80-111).
            (This verification is needed because IPv6 ingress filtering
            <xref target="RFC3704"></xref> applies only to IPv6 prefixes,
            without any guarantee that Tunnel packets are built as specified
            in R-9.)</t>

            <t>For additional protection against packet corruption at a link
            layer that might be undetected at this layer during Domain
            traversal, CEs and BRs SHOULD verify that source and destination
            IPv6 addresses have not been modified. This can be done by
            checking that they remain checksum neutral
            (see the Note above regarding the CNP).</t>
          </list></t>
      </section>

      <section anchor="mtuSec" title="Fragmentation Processing">
        <section anchor="fragSec" title="Fragmentation at Domain Entry">
          <t><list counter="mine" style="format R-%d:">
              <t>If an IPv4 packet enters a CE or BR with a size such that the
              derived Tunnel packet would be longer than the Domain PMTU, the
              packet has to be either discarded or fragmented. The
              Domain-entry node MUST discard it if the packet has DF = 1, with
              an ICMP error message returned to the source. It MUST fragment
              it otherwise, with the payload of each fragment not exceeding
              PMTU - 48. The first fragment has its offset equal to the
              received offset. Subsequent fragments have offsets increased
              by the lengths of the payloads of previous fragments.
              Functionally, fragmentation is supposed to be done in IPv4
              before applying reversible header translation to each fragment;
              see <xref target="packetSec"></xref>.</t>
            </list></t>
        </section>

        <section anchor="port-fragSec"
                 title="Ports of Fragments Addressed to Shared-Address CEs">
          <t>Because ports are available only in the first fragments of
          IPv4 fragmented packets, a BR needs a mechanism to send to the right
          shared-address CEs all fragments of fragmented packets.</t>

          <t>For this, a BR MAY systematically reassemble fragmented IPv4
          packets before tunneling them. But this consumes large memory space,
          creates opportunities for denial-of-service-attacks, and can
          significantly increase forwarding delays. This is the reason for
          the following requirement:</t>

          <t><list counter="mine" style="format R-%d:">
              <t>BRs SHOULD support an algorithm whereby received IPv4 packets
              can be forwarded on the fly. The following is an example of such
              an algorithm:
                 <list counter="brinit" style="format (%d)">
                  <t>At BR initialization, if at least one CE mapping rule
                  deals with one or more shared public IPv4 addresses
                  (i.e., length of Rule IPv4 prefix + EA-bits length &gt; 32),
                  the BR initializes an empty "IPv4 packet table" whose
                  entries have the following items:
                  <list style="empty">
                      <t>- IPv4 source</t>

                      <t>- IPv4 destination</t>

                      <t>- IPv4 identification</t>

                      <t>- Destination port</t>
                    </list></t>

                  <t>When the BR receives an IPv4 packet whose matching
                  Mapping rule deals with one or more shared public
                  IPv4 addresses (i.e., length of Rule IPv4 prefix +
                  EA-bits length &gt; 32), the BR searches the table for an
                  entry whose IPv4 source, IPv4 destination, and
                  IPv4 identification are those of the received packet.
                  The BR then performs actions as detailed in
                  <xref target="brV4ActTable"></xref>, depending on which
                  conditions hold.</t>
                </list></t>
            </list></t>

          <texttable anchor="brV4ActTable" title="BR Actions">
            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <ttcol></ttcol>

            <c>- CONDITIONS -</c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c>First Fragment (offset = 0)</c>

            <c>Y</c>

            <c>Y</c>

            <c>Y</c>

            <c>Y</c>

            <c>N</c>

            <c>N</c>

            <c>N</c>

            <c>N</c>

            <c>Last fragment (MF = 0)</c>

            <c>Y</c>

            <c>Y</c>

            <c>N</c>

            <c>N</c>

            <c>Y</c>

            <c>Y</c>

            <c>N</c>

            <c>N</c>

            <c>An entry has been found</c>

            <c>Y</c>

            <c>N</c>

            <c>Y</c>

            <c>N</c>

            <c>Y</c>

            <c>N</c>

            <c>Y</c>

            <c>N</c>

            <c>-------------------------</c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c>- RESULTING ACTIONS -</c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c></c>

            <c>Create a new entry</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>Use port of the entry</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>

            <c>Update port of the entry</c>

            <c>-</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>Delete the entry</c>

            <c>X</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>

            <c>-</c>

            <c>-</c>

            <c>Forward the packet</c>

            <c>X</c>

            <c>X</c>

            <c>X</c>

            <c>X</c>

            <c>X</c>

            <c>-</c>

            <c>X</c>

            <c>-</c>
          </texttable>

          <t><list style="empty">
              <t><list counter="brinit" style="format (%d)">
                  <t>The BR performs garbage collection for table entries that
                  remain unchanged for longer than some limit. This limit,
                  which is normally longer than the maximum time normally
                  needed to reassemble a packet, is not critical.
                  It should not, however, be longer than 15 seconds <xref
                  target="RFC0791"></xref>.</t>
                </list></t>
            </list></t>

          <t><list counter="mine" style="format R-%d:">
              <t>For the above algorithm to be effective, CEs that are
              assigned shared public IPv4 addresses MUST NOT interleave
              fragments of several fragmented packets.</t>

              <t>CEs that are assigned IPv4 prefixes and are in nodes that
              route public IPv4 addresses rather than only using NAT44s MUST
              have the same behavior as that described just above for BRs.</t>
            </list></t>
        </section>

        <section anchor="pktIdSec"
                 title="Packet Identifications from Shared-Address CEs">
          <t>When packets go from CEs that share the same IPv4 address to a
          common destination, a precaution is needed to guarantee that packet
          identifications set by sources are different. Otherwise, packet
          reassembly at the destination could be confused because it is
          based only on source IPv4 address and Identification.
          The probability of such confusing situations may in theory be
          very low, but a safe solution is needed in order to avoid
          creating new attack opportunities.</t>

          <t><list counter="mine" style="format R-%d:">
              <t>A CE that is assigned a shared public IPv4 address MUST only
              use packet identifications that have the CE PSID in their bits 0
              to PSID length - 1.</t>

              <t>A BR or a CE that receives a packet from a shared-address CE
              MUST check that bits 0 to PSID length - 1 of their packet
              identifications are equal to the PSID found in the source
              4rd IPv4 address.</t>
            </list></t>
        </section>
      </section>

      <section anchor="dscpEcnSec" title="TOS and Traffic Class Processing">
        <t>IPv4 TOS and IPv6 traffic class have the same semantic, that of the
        differentiated services field, or DS field, specified in <xref
        target="RFC2474"></xref> and <xref target="RFC6040"></xref>. Their
        first 6 bits contain a differentiated services codepoint (DSCP), and
        their last 2 bits can convey explicit congestion notifications
        (ECNs), which both may evolve during Domain traversal. <xref
        target="RFC2983"></xref> discusses how the DSCP can be handled by
        tunnel endpoints. The Tunnel Traffic Class option provides
        permission to ignore DS-field evolutions occurring during Domain
        traversal, if the desired behavior is that of generic tunnels
        conforming to <xref target="RFC2473"></xref>.</t>

        <t><list counter="mine" style="format R-%d:">
            <t>Unless the Tunnel Traffic Class option is configured
            for the Domain, BRs and CEs MUST copy the IPv4 TOS into the
            IPv6 traffic class at Domain entry and copy back the
            IPv6 traffic class into the IPv4 TOS at Domain exit.</t>

            <t>If the Tunnel Traffic Class option is configured for a Domain,
            BRs and CEs MUST at Domain entry take the configured Tunnel
            Traffic Class as the IPv6 traffic class and copy the received IPv4
            TOS into the IPv4_TOS of the fragment header (<xref
            target="fragHeadFig"></xref>). At Domain exit, they MUST copy back
            the IPv4_TOS of the fragment header into the IPv4 TOS.</t>
          </list></t>
      </section>

      <section anchor="icmpSec" title="Tunnel-Generated ICMPv6 Error Messages">
        <t>If a Tunnel packet is discarded on its way across a 4rd domain
        because of an unreachable destination, an ICMPv6 error message is
        returned to the IPv6 source. For the IPv4 source of the discarded
        packet to be informed of packet loss, the ICMPv6 message has to be
        converted into an ICMPv4 message.</t>

        <t><list counter="mine" style="format R-%d:">
            <t>If a CE or BR receives an ICMPv6 error message <xref
            target="RFC4443"></xref>, it MUST synthesize an ICMPv4 error
            packet <xref target="RFC0792"></xref>. This packet MUST contain
            the first 8 octets of the discarded packet's IP payload.
            The reserved IPv4 dummy address (192.0.0.8/32; see <xref
            target="ianaSec"></xref>) MUST be used as its source address.
            <vspace blankLines="1" />
            As described in <xref target="RFC6145"></xref>, ICMPv6 Type = 1 
            and Code = 0 (Destination Unreachable, No route to destination)
            MUST be translated into ICMPv4 Type = 3 and Code = 0
            (Destination Unreachable, Net unreachable), and ICMPv6 Type = 3
            and Code = 0 (Time Exceeded, Hop limit exceeded in transit) MUST
            be translated into ICMPv4 Type = 11 and Code = 0 (Time Exceeded,
            time to live exceeded in transit).</t>
          </list></t>
      </section>

      <section anchor="dhcpSec" title="Provisioning 4rd Parameters to CEs">
        <t>Domain parameters listed in <xref target="paramSec"></xref> are
        subject to the following constraints: <list counter="mine"
            style="format R-%d:">
            <t>Each Domain MUST have a BR mapping rule and/or a NAT64+ mapping
            rule. The BR mapping rule is only used by CEs that are assigned
            public IPv4 addresses, shared or not. The NAT64+ mapping rule is
            only used by CEs that are assigned the unspecified IPv4 address
            (<xref target="v6ToV4Sec"></xref>) and therefore need an ISP
            NAT64 to reach IPv4 destinations.</t>

            <t>Each CE and each BR MUST support up to 32 Mapping rules.
            <vspace blankLines="1" />
            Support for up to 32 Mapping rules ensures that independently
            acquired CEs and BR nodes can always interwork.
            <vspace blankLines="1" />
            ISPs that need Mapping rules for more IPv4 prefixes than this
            number SHOULD split their networks into multiple Domains.
            Communication between these domains can be done
            in IPv4 or by some other implementation-dependent,
            but equivalent, means.</t>

            <t>For mesh topologies, where CE-CE paths don't go via BRs, all
            mapping rules of the Domain MUST be sent to all CEs. For
            hub-and-spoke topologies, where all CE-CE paths go via BRs, each
            CE MAY be sent only the BR mapping rule of the Domain plus, if
            different, the CE mapping rule that applies to its CE IPv6
            prefix.</t>

            <t>In a Domain where the chosen topology is hub-and-spoke, all CEs
            MUST have IPv6 prefixes that match a CE mapping rule. (Otherwise,
            packets sent to CEs whose IPv6 prefixes would match only the BR
            mapping rule would, with longest-match selected routes, be routed
            directly to these CEs. This would be contrary to the hub-and-spoke
            requirement.)</t>

            <t>CEs MUST be able to acquire parameters of 4rd domains (<xref
            target="paramSec"></xref>) in DHCPv6 <xref
            target="RFC3315"></xref>. Formats of DHCPv6 options to be
            used are detailed in
            Figures <xref target="dhcpOption" format="counter"></xref>,
            <xref target="dhcpRuleFig" format="counter"></xref>,
            and <xref target="dhcpDomFig" format="counter"></xref>, with
            field values specified after each figure.</t>
          </list></t>

        <figure align="center" anchor="dhcpOption" title="DHCPv6 Option for 4rd">
          <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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      option = OPTION_4RD      |         option-length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 encapsulated 4rd rule options                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        </figure>

        <t><list style="symbols">
            <t>option code: 97, OPTION_4RD (see <xref
            target="ianaSec"></xref>)</t>

            <t>option-length: the length of encapsulated options, in octets</t>

            <t>encapsulated 4rd rule options: The OPTION_4RD DHCPv6 option
            contains at least one encapsulated OPTION_4RD_MAP_RULE option
            and a maximum of one encapsulated OPTION_4RD_NON_MAP_RULE option.
            Since DHCP servers normally send whatever options the
            operator configures, operators are advised to configure
            these options appropriately. DHCP servers MAY check to see
            that the configuration follows these rules and notify
            the operator in an implementation-dependent manner if the settings
            for these options aren't valid. The length of encapsulated options
            is in octets.</t>
          </list></t>

        <figure align="center" anchor="dhcpRuleFig"
title="Encapsulated Option for Mapping-Rule Parameters">
          <artwork align="center"><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| option = OPTION_4RD_MAP_RULE  |         option-length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  prefix4-len  |  prefix6-len  |    ea-len     |W|   Reserved  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    rule-ipv4-prefix                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                                                               +
|                        rule-ipv6-prefix                       |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ]]></artwork>
        </figure>

        <t><list style="symbols">
            <t>option code: 98, encapsulated OPTION_4RD_MAP_RULE option (see <xref
            target="ianaSec"></xref>)</t>

            <t>option-length: 20</t>

            <t>prefix4-len: number of bits of the Rule IPv4 prefix</t>

            <t>prefix6-len: number of bits of the Rule IPv6 prefix</t>

            <t>ea-len: EA-bits length</t>

            <t>W: WKP authorized, = 1 if set</t>

            <t>rule-ipv4-prefix: Rule IPv4 prefix, left-aligned</t>

            <t>rule-ipv6-prefix: Rule IPv6 prefix, left-aligned</t>
          </list></t>

        <figure align="center" anchor="dhcpDomFig"
title="Encapsulated Option for Non-Mapping-Rule Parameters
of&nbsp;4rd&nbsp;Domains">
          <artwork align="center"><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|option =OPTION_4RD_NON_MAP_RULE|         option-length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|H|      0    |T| traffic-class |         domain-pmtu           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>

        <t><list style="symbols">
            <t>option code: 99, encapsulated OPTION_4RD_NON_MAP_RULE option (see
            <xref target="ianaSec"></xref>)</t>

            <t>option-length: 4</t>

            <t>H: Hub-and-spoke topology (= 1 if Yes)</t>

            <t>T: Traffic Class flag (= 1 if a Tunnel Traffic Class is
            provided)</t>

            <t>traffic-class: Tunnel Traffic Class</t>

            <t>domain-pmtu: Domain PMTU (at least 1280 octets)</t>
          </list></t>

        <t>Means other than DHCPv6 that may prove useful to provide 4rd
        parameters to CEs are off-scope for this document. The same or similar
        parameter formats would, however, be recommended to facilitate training
        and operation.</t>
      </section>
    </section>

    <section anchor="secSec" title="Security Considerations">
      <t>Spoofing attacks <list style="hanging">
          <t>With IPv6 ingress filtering in effect in the Domain <xref
          target="RFC3704"></xref>, as required in <xref
          target="modelSec"></xref> (<xref target="modelFig"></xref> in
          particular), and with consistency checks between 4rd IPv4 and IPv6
          addresses (<xref target="v4ToV6Sec"></xref>), no spoofing
          opportunity in IPv4 is introduced by 4rd: being able to use as
          source IPv6 address only one that has been allocated to him, a
          customer can only provide as source 4rd IPv4 address that which
          derives this IPv6 address according to <xref
          target="v4ToV6Sec"></xref>, i.e., one that his ISP has allocated
          to him.</t>
        </list></t>

      <t>Routing loop attacks <list style="hanging">
          <t>Routing loop attacks that may exist in some "automatic tunneling"
          scenarios are documented in <xref target="RFC6324"></xref>. No
          opportunities for routing loop attacks have been identified with
          4rd.</t>
        </list></t>

      <t>Fragmentation-related attacks <list style="hanging">
          <t>As discussed in <xref target="mtuSec"></xref>, each BR of a
          Domain that assigns shared public IPv4 addresses should maintain
          a dynamic table of fragmented packets that go to these shared-address
          CEs.</t>

          <t>This leaves BRs vulnerable to denial-of-service attacks
          from hosts that would send very large numbers of first fragments
          and would never send last fragments having the same
          packet identifications. This vulnerability is inherent in IPv4
          address sharing, be it static or dynamic. Compared to what it is
          with algorithms that reassemble IPv4 packets in BRs, it is, however,
          significantly mitigated by the algorithm provided in <xref
          target="port-fragSec"></xref>, as that algorithm uses much less
          memory space.</t>
        </list></t>

    </section>

    <section anchor="ianaSec" title="IANA Considerations">
      <t>IANA has allocated the following: <list style="symbols">
          <t>Encapsulated options OPTION_4RD (97),
          OPTION_4RD_MAP_RULE (98), and OPTION_4RD_NON_MAP_RULE (99).
          These options have been recorded in the option code space of
          the "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)"
          registry.  See <xref target="dhcpSec"></xref> of this document
          and Section 24.3 of <xref target="RFC3315"></xref>).

<figure>
              <artwork><![CDATA[
      Value   |      Description        |  Reference
   -----------+-------------------------+---------------
        97    |       OPTION_4RD        | this document
        98    |   OPTION_4RD_MAP_RULE   | this document
        99    | OPTION_4RD_NON_MAP_RULE | this document
]]></artwork>
            </figure></t>

          <t>Reserved IPv4 address 192.0.0.8/32 to be used as the "IPv4 dummy
          address" (<xref target="icmpSec"></xref>).</t>
        </list></t>
    </section>

    <section anchor="prevWorkSec" title="Relationship with Previous Works">
      <t>The present specification has been influenced by many previous IETF
      drafts, in particular those accessible at
      &lt;http://tools.ietf.org/html/draft-xxxx&gt;, where "xxxx" refers to
      the following (listed in order, by date of their first versions):</t>

      <t><list style="symbols">
          <t>bagnulo-behave-nat64 (2008-06-10)</t>

          <t>xli-behave-ivi (2008-07-06)</t>

          <t>despres-sam-scenarios (2008-09-28)</t>

          <t>boucadair-port-range (2008-10-23)</t>

          <t>ymbk-aplusp (2008-10-27)</t>

          <t>xli-behave-divi (2009-10-19)</t>

          <t>thaler-port-restricted-ip-issues (2010-02-28)</t>

          <t>cui-softwire-host-4over6 (2010-07-06)</t>

          <t>dec-stateless-4v6 (2011-03-05)</t>

          <t>matsushima-v6ops-transition-experience (2011-03-07)</t>

          <t>despres-intarea-4rd (2011-03-07)</t>

          <t>deng-aplusp-experiment-results (2011-03-07)</t>

          <t>operators-softwire-stateless-4v6-motivation (2011-05-05)</t>

          <t>xli-behave-divi-pd (2011-07-04)</t>

          <t>murakami-softwire-4rd (2011-07-04)</t>

          <t>murakami-softwire-4v6-translation (2011-07-04)</t>

          <t>despres-softwire-4rd-addmapping (2011-08-19)</t>

          <t>boucadair-softwire-stateless-requirements (2011-09-08)</t>

          <t>chen-softwire-4v6-add-format (2011-10-12)</t>

          <t>mawatari-softwire-464xlat (2011-10-16)</t>

          <t>mdt-softwire-map-dhcp-option (2011-10-24)</t>

          <t>mdt-softwire-mapping-address-and-port (2011-10-24)</t>

          <t>mdt-softwire-map-translation (2012-01-10)</t>

          <t>mdt-softwire-map-encapsulation (2012-01-27)</t>
        </list></t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      &RFC0791;
      &RFC0792;
      &RFC0793;
      &RFC2119;
      &RFC2460;
      &RFC2474;
      &RFC2983;
      &RFC3315;
      &RFC4291;
      &RFC4443;
      &RFC4862;

      <?rfc include='reference.RFC.4925'?>

      &RFC5082;
      &RFC6040;
    </references>

    <references title="Informative References">
      &RFC0768;
      &RFC1191;
      &RFC1918;
      &RFC2473;
      &RFC3022;
      &RFC3704;
      &RFC3828;
      &RFC4271;
      &RFC4821;
      &RFC4961;
      &RFC5595;
      &RFC5969;
      &RFC6145;
      &RFC6146;
      &RFC6324;
      &RFC6346;
      &RFC6437;
      &RFC6535;

      <?rfc include='reference.RFC.6887'?>
      <?rfc include='reference.RFC.7136'?>

<!-- draft-ietf-softwire-stateless-4v6-motivation (Expired (IESG: Dead)) -->
<reference anchor='Solutions-4v6'>
<front>
<title>Motivations for Carrier-side Stateless IPv4 over IPv6 Migration
Solutions</title>
<author initials='M' surname='Boucadair' fullname='Mohamed Boucadair'
  role="editor">
    <organization />
</author>
<author initials='S' surname='Matsushima' fullname='Satoru Matsushima'>
    <organization />
</author>
<author initials='Y' surname='Lee' fullname='Yiu Lee'>
    <organization />
</author>
<author initials='O' surname='Bonness' fullname='Olaf Bonness'>
    <organization />
</author>
<author initials='I' surname='Borges' fullname='Isabel Borges'>
    <organization />
</author>
<author initials='G' surname='Chen' fullname='Gang Chen'>
    <organization />
</author>
<date month='November' year='2012' />
</front>
<seriesInfo name='Work in Progress,'
  value='draft-ietf-softwire-stateless-4v6-motivation-05' />
</reference>

<!-- draft-shirasaki-nat444 (Expired) -->
<reference anchor='NAT444'>
<front>
<title>NAT444</title>
<author initials='I' surname='Yamagata' fullname='Ikuhei Yamagata'>
    <organization />
</author>
<author initials='Y' surname='Shirasaki' fullname='Yasuhiro Shirasaki'>
    <organization />
</author>
<author initials='A' surname='Nakagawa' fullname='Akira Nakagawa'>
    <organization />
</author>
<author initials='J' surname='Yamaguchi' fullname='Jiro Yamaguchi'>
    <organization />
</author>
<author initials='H' surname='Ashida' fullname='Hiroyuki Ashida'>
    <organization />
</author>
<date month='July' year='2012' />
</front>
<seriesInfo name='Work in Progress,' value='draft-shirasaki-nat444-06' />
</reference>

    </references>

    <section title="Textual Representation of Mapping Rules" anchor="TextRep">
      <t>In the sections that follow, each Mapping rule will be represented as
      follows, using 0bXXX to represent binary number XXX; square brackets
      ("[ ]") indicate optional items:

 <figure>
          <artwork><![CDATA[{Rule IPv4 prefix, EA-bits length, Rule IPv6 prefix
   [, WKPs authorized]}

EXAMPLES:
 {0.0.0.0/0, 32, 2001:db8:0:1:300::/80}
                            a BR mapping rule
 {198.16.0.0/14, 22, 2001:db8:4000::/34}
                            a CE mapping rule
 {0.0.0.0/0, 32, 2001:db8:0:1::/80}
                            a NAT64+ mapping rule
 {198.16.0.0/14, 22, 2001:db8:4000::/34, Yes}
                            a CE mapping rule
                              and hub-and-spoke topology
]]></artwork>
        </figure></t>
    </section>

    <section anchor="ispSec" title="Configuring Multiple Mapping Rules">
      <t>As far as mapping rules are concerned, the simplest deployment model
      is that in which the Domain has only one rule (the BR mapping rule). To
      assign an IPv4 address to a CE in this model, an IPv6 /112 is assigned
      to it, comprising the BR /64 prefix, the 4rd Tag, and the IPv4 address.
      However, this model has the following limitations: (1) shared IPv4
      addresses are not supported; (2) IPv6 prefixes used for 4rd are too long
      to also be used for native IPv6 addresses; (3) if the IPv4 address space
      of the ISP is split with many disjoint IPv4 prefixes, the IPv6 routing
      plan must be as complex as an IPv4 routing plan based on these
      prefixes.</t>

      <t>With more mapping rules, CE prefixes used for 4rd can be those used
      for native IPv6. How to choose CE mapping rules for a particular
      deployment does not need to be standardized.</t>

      <t>The following is only a particular pragmatic approach that can be
      used for various deployment scenarios. It is applied in some of the
      use cases that follow.</t>

      <t><list style="format (%d)">
          <t>Select a "Common_IPv6_prefix" that will appear at the beginning
          of all 4rd CE IPv6 prefixes.</t>

          <t>Choose all IPv4 prefixes to be used, and assign one of them to
          each CE mapping rule i.</t>

          <t>For each CE mapping rule i, do the following: <list
              style="letters">
              <t>Choose the length of its Rule IPv6 prefix (possibly the same
              for all CE mapping rules).</t>

              <t>Determine its PSID_length(i). A CE mapping rule that assigns
              shared addresses with a sharing ratio of 2^Ki has
              PSID_length = Ki. A CE mapping rule that assigns
              IPv4 prefixes of length L &lt; 32 is considered to have a
              negative PSID_length (PSID_length = L - 32).</t>

              <t>Derive EA-bits length (i) = 32 - L(Rule IPv4 prefix(i)) +
              PSID_length(i).</t>

              <t>Derive the length of Rule_code(i), the prefix to be appended
              to the Common prefix to get the Rule IPv6 prefix of rule i:
              <figure>
                  <artwork align="center"><![CDATA[                                                                                              
   L(Rule_code(i)) = L(CE IPv6 prefix(i)) 
                     - L(Common_IPv6_prefix)
                     - (32 - L(Rule IPv4 prefix(i)))
                     - PSID_length(i)                   
]]></artwork>
                </figure></t>

              <t>Derive Rule_code(i) with the following constraints:
              (1) its length is L(Rule_code(i));
              (2) it does not overlap with any of the previously
              obtained Rule codes (for instance, 010 and 01011 do
              overlap, while 00, 011, and 010 do not);
              (3) it has the lowest possible value as a fractional
              binary number (for instance, 0100 &lt; 10 &lt; 11011 &lt; 111).
              Thus, rules whose Rule_code lengths are
              4, 3, 5, and 2 give Rule_codes 0000, 001, 00010, and 01.</t>

              <t>Take Rule IPv6 prefix(i) = the Common_IPv6_prefix followed by
              Rule_code(i).</t>
            </list></t>
        </list></t>

      <figure align="center" anchor="codeFig" title="Diagram of One
Pragmatic Approach">
        <artwork align="center"><![CDATA[
:<--------------------- L(CE IPv6 prefix(i)) --------------------->:
:                                                                  :
:                       32 - L(Rule IPv4 prefix(i))  PSID_length(i):
:                                                \             |   :
:                                      :<---------'--------><--'-->:
:                                      :              ||           :
:                                      :              \/           :
:                            :<------->:<--- EA-bits length(i) --->:
:                          L(Rule code(i))
:                            :         :
+----------------------------+---------+
|    Common IPv6 prefix      |Rule code|
|                            |   (i)   |
+----------------------------+---------+
:<------ L(Rule IPv6 prefix(i)) ------>:
]]></artwork>
      </figure>
    </section>

    <section anchor="add4rdSec"
             title="Adding Shared IPv4 Addresses to an IPv6 Network">
      <section anchor="ownNetSec" title="With CEs within CPEs">
        <t>Here, we consider an ISP that offers IPv6-only service to up to
        2^20 customers. Each customer is delegated a /56, starting with common
        prefix 2001:db8:0::/36. The ISP wants to add public IPv4 service for
        customers that are 4rd capable. It prefers to do so with stateless
        operation in its nodes but has significantly fewer IPv4 addresses
        than IPv6 addresses, so a sharing ratio is necessary.
        </t>

        <t>The only IPv4 prefixes it can use are 192.8.0.0/15, 192.4.0.0/16,
        192.2.0.0/16, and 192.1.0.0/16 (neither overlapping nor aggregatable).
        This gives 2^(32 - 15) + 3 * 2^(32 - 16) IPv4 addresses,
        i.e., 2^18 + 2^16. For the 2^20 customers to have the same
        sharing ratio, the number of IPv4 addresses to be shared has to
        be a power of 2. The ISP can therefore give up using one of its
        /16s, say the last one. (Whether or not it could
        be motivated to return it to its Internet Registry is off-scope for
        this document.) The sharing ratio to apply is then 2^20 / 2^18 = 2^2 =
        4, giving a PSID length of 2.</t>

        <t>Applying the principles of <xref target="ispSec"></xref> with
        L(Common IPv6 prefix) = 36, L(PSID) = 2 for all rules,
        and L(CE IPv6 prefix(i)) = 56 for all rules, Rule codes and
        Rule IPv6 prefixes are as follows:</t>

        <texttable>
          <ttcol>CE Rule IPv4 prefix</ttcol>

          <ttcol>EA bits length</ttcol>

          <ttcol>Rule-Code length</ttcol>

          <ttcol>Code (binary)</ttcol>

          <ttcol>CE Rule IPv6 prefix</ttcol>

          <c>192.8.0.0/15</c>

          <c>19</c>

          <c>1</c>

          <c>0</c>

          <c>2001:db8:0::/37</c>

          <c>192.4.0.0/16</c>

          <c>18</c>

          <c>2</c>

          <c>10</c>

          <c>2001:db8:800::/38</c>

          <c>192.2.0.0/16</c>

          <c>18</c>

          <c>2</c>

          <c>11</c>

          <c>2001:db8:c00::/38</c>
        </texttable>

        <t>Mapping rules are then the following:

 <figure align="center"> <artwork align="center"><![CDATA[
{192.8.0.0/15, 19, 2001:0db8:0000::/37}
{192.4.0.0/16, 18, 2001:0db8:0800::/38}
{192.2.0.0/16, 18, 2001:0db8:0c00::/38}
{0.0.0.0/0,    32, 2001:0db8:0000:0001:300::/80}
]]></artwork> </figure></t>

        <t>The CE whose IPv6 prefix is, for example, 2001:db8:0bbb:bb00::/56
        derives its IPv4 address and its port set as follows (<xref
        target="v6ToV4Sec"></xref>):
 <figure align="center">
            <artwork align="center"><![CDATA[
CE IPv6 prefix     : 2001:0db8:0bbb:bb00::/56   
Rule IPv6 prefix(i): 2001:0db8:0800::/38 (longest match)
EA-bits length(i)  : 18
EA bits            : 0b11 1011 1011 1011 1011 
Rule IPv4 prefix(i): 0b1100 0000 0000 0100 (192.4.0.0/16)
IPv4 address       : 0b1100 0000 0000 0100 1110 1110 1110 1110
                   : 192.4.238.238
PSID               : 0b11
Ports              : 0bYYYY 11XX XXXX XXXX
                     with YYYY > 0, and X...X any value
]]></artwork>
          </figure></t>

        <t>An IPv4 packet sent to address 192.4.238.238 and port 7777 is
        tunneled to the IPv6 address obtained as follows (<xref
        target="v4ToV6Sec"></xref>):
 <figure align="center">
            <artwork align="center"><![CDATA[
IPv4 address       : 192.4.238.238 (0xc004 eeee)
                   : 0b1100 0000 0000 0100 1110 1110 1110 1110
Rule IPv4 prefix(i): 192.4.0.0/16  (longest match)
                   : 0b1100 0000 0000 0100
IPv4 suffix (i)    : 0b1110 1110 1110 1110
EA-bits length (i) : 18
PSID length (i)    : 2  (= 16 + 18 - 32)
Port field         : 0b 0001 1110 0110 0001 (7777)
PSID               : 0b11
Rule IPv6 prefix(i): 2001:0db8:0800::/38
CE IPv6 prefix     : 2001:0db8:0bbb:bb00::/56
IPv6 address       : 2001:0db8:0bbb:bb00:300:c004:eeee:YYYY
                     with YYYY = the computed CNP
]]></artwork>
          </figure></t>
      </section>

      <section anchor="softbankSec"
               title="With Some CEs behind Third-Party Router CPEs">
        <t>We now consider an ISP that has the same need as the ISP
        described in the previous section, except that
        (1) instead of using only its own IPv6 infrastructure,
        it uses that of a third-party provider and
        (2) some of its customers use this provider's
        Customer Premises Equipment (CPEs) so that they can use
        specific services offered by the provider. In these CPEs, a non-zero
        index is used to route IPv6 packets to the physical port to which CEs
        are attached, say 0x2. Each such CPE delegates to the CE nodes
        the customer-site IPv6 prefix followed by this index.</t>

        <t>The ISP is supposed to have the same IPv4 prefixes as those in the
        previous use case -- 192.8.0.0/15, 192.4.0.0/16, and 192.2.0.0/16 --
        and to use the same Common IPv6 prefix, 2001:db8:0::/36.</t>

        <t>We also assume that only a minority of customers use third-party
        CPEs, so that it is sufficient to use only one of the two /16s for
        them.</t>

        <t>Mapping rules are then (see <xref target="ownNetSec"></xref>):
        <figure align="center">
            <artwork align="center"><![CDATA[
{192.8.0.0/15, 19, 2001:0db8:0000::/37}
{192.4.0.0/16, 18, 2001:0db8:0800::/38}
{192.2.0.0/16, 18, 2001:0db8:0c00::/38}
{0.0.0.0/0,    32, 2001:0db8:0000:0001:300::/80}
]]></artwork>
          </figure></t>

        <t>CEs that are behind third-party CPEs derive their own IPv4
        addresses and port sets as described
        in <xref target="ownNetSec"></xref>.</t>

        <t>In a BR, and also in a CE if the topology is mesh, the IPv6 address
        that is derived from IPv4 address 192.4.238.238 and port 7777 is
        obtained as described in the previous section, except for the last two
        steps, which are modified as follows:
 <figure align="center">
            <artwork align="center"><![CDATA[
IPv4 address       : 192.4.238.238 (0xc004 eeee)
                   : 0b1100 0000 0000 0100 1110 1110 1110 1110
Rule IPv4 prefix(i): 192.4.0.0/16  (longest match)
                   : 0b1100 0000 0000 0100
IPv4 suffix (i)    : 0b1110 1110 1110 1110
EA-bits length (i) : 18
PSID length (i)    : 2  (= 16 + 18 - 32)
Port field         : 0b 0001 1110 0110 0001 (7777)
PSID               : 0b11
Rule IPv6 prefix(i): 2001:0db8:0800::/38
CE IPv6 prefix     : 2001:0db8:0bbb:bb00::/60
IPv6 address       : 2001:0db8:0bbb:bb00:300:192.4.238.238:YYYY
                     with YYYY = the computed CNP
]]></artwork>
          </figure></t>
      </section>
    </section>

    <section anchor="Sec4Via6"
             title="Replacing Dual-Stack Routing with IPv6-Only Routing">
      <t>In this use case, we consider an ISP that offers IPv4 service with
      public addresses individually assigned to its customers. It also offers
      IPv6 service, as it has deployed dual-stack routing. Because it
      provides its own CPEs to customers, it can upgrade all of its CPEs to
      support 4rd. It wishes to take advantage of this capability to replace
      dual-stack routing with IPv6-only routing, without changing any IPv4
      address or IPv6 prefix.</t>

      <t>For this, the ISP can use the single-rule model described at the
      beginning of <xref target="ispSec"></xref>. If the prefix routed to BRs
      is chosen to start with 2001:db8:0:1::/64, this rule is: <list>
          <t>{0.0.0.0/0, 32, 2001:db8:0:1:300::/80}</t>
        </list></t>

      <t>All that is needed in the network before disabling IPv4 routing is
      the following: <list style="symbols">
          <t>In all routers, where there is an IPv4 route toward x.x.x.x/n,
          add a parallel route toward 2001:db8:0:1:300:x.x.x.x::/(80+n).</t>

          <t>Where IPv4 address x.x.x.x was assigned to a CPE, now delegate
          IPv6 prefix 2001:db8:0:1:300:x.x.x.x::/112.</t>
        </list></t>

      <t>NOTE: In parallel with this deployment, or after it, shared IPv4
      addresses can be assigned to IPv6 customers. It is sufficient that IPv4
      prefixes used for this be different from those used for
      exclusive-address assignments. Under this constraint, Mapping rules can
      be set up according to the same principles as those described in <xref
      target="add4rdSec"></xref>.</t>
    </section>

    <section anchor="Sec4rd-6rd"
             title="Adding IPv6 and 4rd Service to a Net-10 Network">
      <t>In this use case, we consider an ISP that has only deployed IPv4,
      possibly because some of its network devices are not yet IPv6 capable.
      Because it did not have enough IPv4 addresses, it has assigned private
      IPv4 addresses <xref target="RFC1918"></xref> to customers, say
      10.x.x.x. It thus supports up to 2^24 customers (a "Net-10" network,
      using the NAT444 model <xref target="NAT444"></xref>).</t>

      <t>Now, it wishes to offer IPv6 service without further delay, using
      6rd <xref target="RFC5969"></xref>. It also wishes to offer
      incoming IPv4 connectivity to its customers with a simpler solution
      than that provided by the Port Control Protocol
      (PCP) <xref target="RFC6887"></xref>.</t>

      <t>This appendix describes an example that adds IPv6 (using 6rd) and 4rd
      services to the "Net-10" private IPv4 network.</t>

      <t>The IPv6 prefix to be used for 6rd is supposed to be 2001:db8::/32,
      and the public IPv4 prefix to be used for shared addresses is supposed
      to be 198.16.0.0/16 (0xc610). The resulting sharing ratio is 2^24 /
      2^(32 - 16) = 256, giving a PSID length of 8.</t>

      <t>The ISP installs one or several BRs at its border to the public IPv4
      Internet. They support 6rd, and 4rd above it. The BR prefix /64 is
      supposed to be that which is derived from IPv4 address 10.0.0.1 (i.e.,
      2001:db8:0:100:/64).</t>

      <t>In accordance with <xref target="RFC5969"></xref>, 6rd BRs are
      configured with the following parameters:
      IPv4MaskLen = 8; 6rdPrefix = 2001:db8::/32;
      6rdBRIPv4Address = 192.168.0.1 (0xc0a80001).</t>

      <t>4rd Mapping rules are then the following:
 <figure align="center">
          <artwork align="center"><![CDATA[
{198.16.0.0/16, 24, 2001:db8:0:0:300::/80}      
{0.0.0.0/0,     32, 2001:db8:0:100:300:/80,}      
]]></artwork>
        </figure></t>

      <t>Any customer device that supports 4rd in addition to 6rd can then use
      its assigned shared IPv4 address with 240 assigned ports.</t>

      <t>If its NAT44 supports port forwarding to provide incoming IPv4
      connectivity (statically, or dynamically with Universal Plug and Play
      (UPnP) and/or the NAT Port Mapping Protocol (NAT-PMP)), it
      can use it with ports of the assigned port set (a possibility that does
      not exist in Net-10 networks without 4rd/6rd).</t>
    </section>

    <section anchor="ackSec" title="Acknowledgements" numbered="no">
      <t>This specification has benefited over several years from independent
      proposals, questions, comments, constructive suggestions, and useful
      criticisms from numerous IETF contributors. The authors would like
      to express recognition of all of these contributors, and especially
      the following, in alphabetical order by their first names:
      Behcet Sarikaya, Bing Liu, Brian Carpenter, Cameron Byrne,
      Congxiao Bao, Dan Wing, Derek Atkins, Erik Kline, Francis Dupont,
      Gabor Bajko, Hui Deng, Jacni Quin (who was an active coauthor of some
      earlier versions of this specification), James Huang, Jan Zorz,
      Jari Arkko, Kathleen Moriarty, Laurent Toutain, Leaf Yeh,
      Lorenzo Colitti, Marcello Bagnulo, Mark Townsley, Mohamed Boucadair,
      Nejc Skoberne, Olaf Maennel, Ole Troan, Olivier Vautrin, Peng Wu,
      Qiong Sun, Rajiv Asati, Ralph Droms, Randy Bush, Satoru Matsushima,
      Simon Perreault, Stuart Cheshire, Suresh Krishnan,
      Ted Lemon, Teemu Savolainen, Tetsuya Murakami, Tina Tsou,
      Tomek Mrugalski, Washam Fan, Wojciech Dec, Xiaohong Deng, Xing Li,
      and Yu Fu.</t>
    </section>

  </back>
</rfc>
