<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">


<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="no"?>
<?rfc subcompact="no"?>
<?rfc authorship="yes"?>
<?rfc tocappendix="yes"?>
<rfc  xmlns:xi="http://www.w3.org/2001/XInclude" category="info" ipr='trust200902' tocInclude="true" indexInclude="true" obsoletes="" updates="1122,4291" consensus="true" submissionType="IETF" xml:lang="en" version="3" docName="draft-thubert-v6ops-yada-yatt-01" >

<front>

   <title abbrev='YADA-YATT'>Yet Another Double Address and Translation Technique</title>
   <author initials='P' surname='Thubert' fullname='Pascal Thubert' role='editor'>
      <organization abbrev='Cisco Systems'>Cisco Systems, Inc</organization>
      <address>
         <postal>
            <street>Building D</street>
            <street>45 Allee des Ormes - BP1200 </street>
            <city>Mougins - Sophia Antipolis</city>
            <code>06254</code>
          <country>France</country>
         </postal>
         <phone>+33 497 23 26 34</phone>
         <email>pthubert@cisco.com</email>
      </address>
   </author>

        <date/>

	<area>Internet</area>

	<workgroup>v6ops</workgroup>

        <abstract>
	<t>
    This document provides a mechanism named YADA to extend the current IPv4
    Internet by interconnecting IPv4 realms via a common footprint called the
    shaft. YADA extends <xref target="RFC1122"/> with the support of an
    IP-in-IP format used to tunnel packets across the shaft.
    This document also provides a bump-in-the-stack method to enable YADA on a
    legacy stack, e.g., to enable virtual machines without changing them.
    This document also provides a stateless address and IP header translation
    between YADA and IPv6 <xref target="RFC8200"/> called YATT and extends
    <xref target="RFC4291"/> for the YATT format.
    YATT can take place as a bump in the
    stack at either end, or within the network and enables an IPv6-only stack
    to dialog with an IPv4-only stack across a network that can be IPv6, IPv4,
    or mixed. YATT requires that the IPv6 stack owns a prefix that derives from
    a YADA address and the IPv4 stack is capable of YADA, so it does not
    replace a generic 4 to 6 translation mechanism for any v6 to any v4.
	</t>
	</abstract>
    </front>

    <middle>

	<!-- **************************************************************** -->
	<!-- **************************************************************** -->
	<!-- **************************************************************** -->
	<!-- **************************************************************** -->
	<section anchor='introduction'><name>Introduction</name>

   <t>
   This document provides a mechanism called Yet Another Double Address (YADA)
   to grow the Internet beyond the current IPv4 <xref target="RFC0791"/> realm
   that limits its capacity to form public addresses. This is achieved by
   interconnecting IPv4 realms via a common footprint called the shaft.

   </t>

       <t>
    In the analogy of a building, the ground floor would be the Internet, and
    each additional floor would be another IPv4 realm. The same surface of floor
    is available in each level, analog to the full IPv4 addressing that is
    available in each realm. The same footprint is dedicated across the building
    levels for the elevator shaft. The elevator shaft enables a third dimension
    that spans across the levels and allows to traverse from any level to any
    other level. The elevator shaft cannot be used for living or office space.

       </t>
<figure anchor='TRK'><name>The shaft</name>
              <artwork align="center"><![CDATA[


         /------------------------------------------------------
        /                                                     /
       /          |------------|                    realm 1  /
      /          /.           /.                            /
     /          / . shaft    / .  (current IPv4 Internet)  /
    /          |------------|  .                          /
   /           .  .         .  .                         /
  ------------------------------------------------------/
               |  .         |  |
         /-----|------------|--|--------------------------------
        /      |  .         |  |                              /
       /       |  |---------|--|                    realm 2  /
      /        | /.         | /.                            /
     /         |/ . shaft   |/ .                           /
    /          |------------|  .                          /
   /           .  .         .  .                         /
  ------------------------------------------------------/
               |  .         |  |
               |  .         |  |
               |            |  .
               |            |  .
               .            .  |
               .            .  |
               |  .         |  |
         /-----|------------|--|--------------------------------
        /      |  .         |  |                              /
       /       |  |---------|--|                    realm N  /
      /        | /          | /                             /
     /         |/   shaft   |/                             /
    /          |------------|                             /
   /                                                     /
  ------------------------------------------------------/


]]>
</artwork></figure>
    <t>
    By analogy, YADA assigns IPv4 prefixes to a multinternet shaft; those
    prefixes are common across the realms that are interconnected by the shaft.
    A single /24 IPv4 prefix assigned allows for > 250 times the capacity of the
    Internet as we know it at the time of this writing. Multiple prefixes can be
    assigned to the shaft for unicast and multicast communications, and each
    realm needs at least one unicast address in the shaft called its realm
    address. A YADA address is formed by the tuple (realm address, IPv4 address)
    and is advertised in DNS as a new double-A record.
    </t>

    <t>
    YADA leverages IP-in-IP encapsulation to tunnel packets across the
    shaft while normal IPv4 operations happen within a realm. YADA requires
    a change in the stack in the YADA endpoints that communicate with other
    realms to support the IP-in-IP YADA encapsulation. YADA also provides a bump
    in the stack method for legacy applications. More in <xref target="yada"/>.
    </t>

    <t>
     A second mechanism called Yet Another Translation Technique (YATT)
     translates the YADA format into flat IPv6 <xref target="RFC8200"/>.
     For unicast addresses, YATT forms an IPv6 prefix by collating an well-known
     assigned short prefix, the realm address (in the shaft), and the host
     IPv4 address (locally significant within the realm). The resulting IPv6
     prefix is automatically owned by the host that owns the IPv4 address in the
     realm.
     YATT then forms an IPv6 address for that host by collating a well-known
     Interface ID, so there's a one-to-one relationship between the YADA and the
     IPv6 address derived from it.
     More in <xref target="yatt"/>.
    </t>
    </section>

	<!-- **************************************************************** -->
	<!-- **************************************************************** -->
	<!-- **************************************************************** -->
	<!-- **************************************************************** -->

<section><name>Terminology</name>

<!-- section anchor='bcp'><name>Requirements Language</name>
<t>

    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
    "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
    "OPTIONAL" in this document are to be interpreted as described in BCP 14
    <xref target='RFC2119'/><xref target='RFC8174'/> when, and only when, they
    appear in all capitals, as shown here.

</t>
<t>
  In addition, the terms "Extends" and "Amends" are used as per
  <xref target="I-D.kuehlewind-update-tag" /> section 3.
</t>

</section>	  end section "Requirements Language" -->



<section anchor='gloss'><name>Glossary</name>
    <t> This document often uses the following acronyms:
       </t><dl spacing='compact'>
       <dt>YADA:</dt><dd>Yet Another Double Address</dd>
       <dt>YATT:</dt><dd>Yet Another Translation Technique</dd>
       <dt>NAT:</dt><dd>Network address Translation</dd>
       <dt>IID:</dt><dd>Interface ID</dd>
       <dt>CG-NAT:</dt><dd>Carrier Grade NAT</dd>
       </dl>

</section>	<!-- Glossary -->

<section anchor='terms'><name>New Terms</name>
    <t> This document often uses the following nex terms:
       </t>

       <dl spacing='compact'>
       <dt>IPv4 realm</dt><dd>A full IPv4 network like the current Internet.
       YADA does not affect the traditional IPv4 operations within a realm.
       </dd>
       <dt>The shaft</dt><dd>
       The shaft refers to a collection of IPv4 unicast
       and multicast prefixes that are assigned to Inter-realm communications
       and cannot be assigned to hosts or multicast groups within a realm.

       </dd>
       <dt>realm address</dt><dd>An IPv4 address that derives from a shaft
       prefix. </dd>
       <dt>Uni-realm address</dt><dd> A realm address that is unicast or anycast.
       A realm may have more than one Uni-realm address.
       </dd>
       <dt>Multi-realm address</dt><dd> A realm address that is multicast and
       denotes a collection of realms.
       </dd>
       <dt>YADA realm Prefix</dt><dd>A Prefix assigned to the shaft and from
       which realm addresses can be derived.</dd>
       <dt>YADA NAT Prefix</dt><dd>A Prefix assigned to the
        YADA bump-in-the-stack NAT operation.</dd>
       <dt>Double-A or YADA address</dt><dd>A YADA address is a tuple
       (realm address, IPv4 address) where the IPv4 address is only significant
       within the realm denoted by the realm address.</dd>
       <dt>YATT Space</dt><dd>An IPv6 range that is assigned for YATT operation.
       </dd>
       <dt>YATT Prefix</dt><dd>An IPv6 prefix that is derived from a YADA
       address by appending the YATT space prefix, the (truncated) realm address
       and the IPv4 address.</dd>
       <dt>YATT-IID:</dt><dd>A 64-bit assigned constant that is used in YATT to
       statelessly form an IPv6 address from a YATT prefix.</dd>
       <dt>Multinternet</dt><dd>A collection of IPv4 realms interconnected using
       a common shaft.</dd>
       </dl>

</section>	<!-- New Terms -->


</section><!-- Terminology -->


<section anchor='yadaext'><name>Extending RFC 1122</name>
   <t>
   YADA extends <xref target="RFC1122"/> to add the capability for an IPv4 host
   to recognize an special IP-in-IP format as an inter-realm IPv4 packet and
   process it accordingly. It also adds a new DNS double-A record format that
   denotes a YADA address.
   </t>
</section><!--Extending RFC 1122 -->

<section anchor='yattext'><name>Extending RFC 4291</name>
   <t>
   YATT extends <xref target="RFC4291"/> to add the capability for an IPv4 host
   to recognize an special IPv6 format as an YATT address embedding a YADA
   address and process it accordingly. It also automatically derives the
   ownership of the YATT prefix associated to a owned YADA address.
   </t>
</section><!--Extending RFC 1122 -->

<section anchor='yada'><name>YADA</name>
    <t>
    YADA assigns IPv4 prefixes to a multinternet shaft; those prefixes must be
    the same across all the realms that are interconnected by the shaft.
    Multiple prefixes can be assigned to the shaft for unicast and multicast
    communications, and each realm needs at least one unicast address in the
    shaft called its realm address. A YADA address is formed by the tuple
    (realm address, IPv4 address) and is advertised in DNS as a new double-A
    record. Because the YADA prefixes are assigned for YADA, a packet that
    has either source or destination IPV4 address derived from a shaft prefix
    is a YADA packet.
    </t>
    <t>
    YADA leverages IP-in-IP encapsulation to tunnel packets across the shaft
    for inter-realm communications, while the IPv4 operations within a realm
    are unaffected. The YADA address is found by using both inner and outer
    header and combining that information. The pair of IP headers is seen
    by a YADA stack as a single larger header though a non-YADA forwarder only
    needs the outer header and plain IPv4 operations to forward.
    </t>
    <t>
    YADA requires a change in the stack in the YADA endpoints that communicate
    with other realms to support the YADA encapsulation. YADA also provides a
    bump in the stack method for legacy applications. YADA also requires a
    change for the routers that serve the shaft. Those routers play a special
    role for packets that are delivered from the shaft to the destination
    realm, and for ICMP errors across realms. All other IPv4 nodes in the realm
    continue to operate as before.
    </t>
    <t>
    Routers serving the shaft advertise the shaft prefix(es) in their respective
    realms, and their realm addresses within the shaft, as host routes for
    unicast and anycast addresses. A stack that resolve a DNS name with a
    double-A record indicating a different realm generates an IP-in-IP packet,
    with the outer header indicating the source and destination realms, and the
    inner header indicating the source and destination IPv4 addresses within
    the respective realms, as shown in <xref target='ins'/>. The packet is
    forwarded down the shaft as is, using the normal longest match or multicast
    operation.
    </t>
<figure anchor='ins'><name>Packets Entering the shaft</name>
              <artwork align="center"><![CDATA[
                   |            |
            /------|------------|---------------------------------
           /       |            |                               /
          /    |   |        |   |                              /
         /     |   |--------|---|        Source Node          /
        /      |  /         |  /                             /
       /       | /.     +---|----  outer(src=src-realm      /
      /        |/ .     |   |/ .         dst=dst-realm)    /
     /         |------------|  .   inner(src=src-addr     /
    /          .  .     |   .  .         dst=dst-addr)   /
   /           .  .     |   .  .                        /
  /            .  .     |   .  .                       /
 -----------------------------------------------------/
               |        |   |  |
               |        |   |
               |        |   |
                        v
]]>
</artwork></figure>
    <t>
    The packet destination is an address is the shaft and it is attracted by a
    router that serves the shaft and advertises its prefixes in the source realm.
    Based on longest match, the router forwards the packet inside the shaft
    following the host route to a router that serves the destination realm.
    That router swaps the destination address in the inner and outer headers and
    forwards within its realm to the final destination, as shown in
    <xref target='ous'/>.
    In normal conditions, the stack of the destination node recognizes the YADA
    format and replies accordingly.
    </t>
<figure anchor='ous'><name>Packets Outgoing the shaft</name>
              <artwork align="center"><![CDATA[
                        |
                   |    |       |
                   |    |       |
            /------|----|-------|---------------------------------
           /   |   |    |   |   |                               /
          /    |   |    |   |   |                              /
         /     |   |----|---|---|     Destination Node        /
        /      |  /     |   |  /                             /
       /       | /.     +---|----> outer(src=src-realm      /
      /        |/ .         |/ .         dst=dst-addr)     /
     /         |------------|  .   inner(src=src-addr     /
    /          .  .         .  .         dst=realm-addr) /
   /           .  .         .  .                        /
  /            .  .         .  .                       /
 -----------------------------------------------------/
]]>
</artwork></figure>
    <t>
    In case of an error down the path or at the destination, if an ICMP message
    is generated by a node that is not YADA-aware, the message reaches the
    router that serves the shaft in the source realm. If the inner header is
    present in the ICMP payload, then the Router extracts it and forwards to the
    packet source.
    If the destination stack does not support YADA and decapsulates, the message
    reaches the router that serves the destination realm which logs and drops.
    based on the log, the node may be updated, or the DNS records may be fixed
    to avoid pointing on a node that does not support YADA.
    </t>
    <t>
    YADA requires the assignment of a second IPv4 prefix, this time for a
    internal NATing operation. A bump-in-the-stack intercepts the DNS lookups,
    and when the response yields a double-A record with a foreign realm, the
    record is augmented with an IPv4 address taken from a local NAT pool. When
    the stack sends a packet to that particular address, the bump-in-the-stack
    translates to the YADA format, using the information in the double-A record
    for the destination, and the local realm as source realm. The other way
    around, if a packet arrives with a YADA format but the stack does not
    support it, the bump-in-the-stack allocates an address from the pool, and
    NATs to IPv4 using that address as source.
    </t>
    <t>
    YADA was initially published as USPTO 7,356,031, filed in February 2002.
    </t>
</section><!-- yada -->

<section anchor='yatt'><name>YATT</name>


    <t>
     A second mechanism called YATT translates the YADA format into flat IPv6.
     </t>
<figure anchor='tfyatt'><name>YATT format</name>
              <artwork align="center"><![CDATA[
 +-----+---------------+--------------+-----------------------------+
 |YATT |     Realm     |     IPv4     |         Well-Known          |
 |Space|    Address    |    Address   |              IID            |
 +-----+- -------------+--------------+-----------------------------+
       <- YADA
        Prefix ->
 <--------   YATT Prefix ---------->
]]>
</artwork></figure>
    <t>
    For unicast addresses, YATT forms an IPv6 prefix by collating an well-known
    assigned short prefix called the YATT space, the realm address, and the host
    IPv4 address (locally significant within the realm). The resulting IPv6
    prefix is automatically owned by the host that owns the IPv4 address in the
    realm.
    </t>
    <t>
    Depending on assignment, the leftmost piece realm prefix may be truncated
    if it is well-known, to allow the YATT space and the realm address to fit
    in a 32-bit DWORD. This way, the YATT prefix can be a full /64 prefix that
    is entirely owned by the host that owns the associated YADA address.
    </t>
    <t>
    YATT then forms an IPv6 address for that host by collating a well-known
    Interface ID, so there's a one-to-one relationship.
    </t>
    <t>
    The formats can not be strictly provided till the YATT space and YADA prefix
    are assigned. But say that the YATT Space is F000::/6 and the YADA prefix
    is 240.0.0.0/6. In that case the values perfectly overlap and the YATT
    format becomes as follows:
    </t>
<figure anchor='tfyatt240'><name>YATT format using 240.0.0.0/6 </name>
              <artwork align="center"><![CDATA[
+-----+----------+----------------+---------------------------------+
| Realm Address  |    IPv4 Host   |            Well-Known           |
| in 240.0.0.0/6 | Public Address |               IID               |
+-----+- --------+----+-----------+---------------------------------+
<--- 32 bits ---><--- 32 bits ---><------------ 64 bits ------------>
<------   YATT IPv6 Prefix ------->
]]>
</artwork></figure>
    <t>
   In that case, the NAT operation is a plain insertion. Depending on the
   assignment, it might be that the Realm address must be placed in full after
   YATT space. In that case, the length of the YATT prefix will be more than 64
   bits.
    </t>
    <t>
    If the network supports IPv6 to the shaft, it makes sense for the YADA host
    or the bump-in-the-stack to generate the packets in the YATT form natively.
    The shaft router must then attract the shaft YADA realm Prefix in both
    IPv4 and YATT forms.
    </t>
    <t>
    If the network is IPv4 only, the packets are still generated using IP in IP,
    and the YATT NAT operation may happen at the router that delivers the
    packet in the destination realm, if it is v6-only, or in the destination
    host, if its stack is v6-only.
    </t>
    <t>
    YATT was initially published as USPTO 7,764,686, filed in December 2002.
    </t>
</section><!-- yatt -->




<section anchor='apy'><name>Applicability</name>
    <t>
    YADA And YATT enable communication between YADA-enabled IPv4 nodes across
    realms, and with IPv6 nodes that own a YADA address from which a YATT
    address can be derived.
    Communication from a legacy IPv4 application/stack that is not YADA-enabled,
    or to an IPv6 address that is not a YATT address, is not provided.
    </t>
    <t>
    Since the YATT translation is stateless, the header translation can happen
    anywhere in the network, e.g., as a bump in the stack at either end, or
    within the network, e.g., at the routers that serve the realms on the
    shaft. The shaft itself is expected to be dual stack to forward packets in
    their native form, either v4 or v6.
    </t>
    <t>
    For a legacy IPv4 node to communicate with YADA-enabled IPv4 node in another
    realm, a NAT operation similar to NAT46 <xref target="RFC8683"/>, but
    between IPv4 and YADA addresses, is required. The same would be required
    to allow an IPv4-only YADA node to communicate with
    </t>
</section><!-- Applicability -->



<section anchor='back'><name>Backwards Compatibility</name>
    <t>
    YADA operation does not affect the intra-realm communication.
    The only affected stacks are the endpoints that communicate between realms
    leveraging YADA.
    </t>
</section><!-- Backwards Compatibility -->


<section><name>Security Considerations</name>

</section><!-- Security Considerations -->
<section anchor='IANAcon'><name>IANA Considerations</name>


<t>
  This document requires the creation of a registry for IPv4 YADA realm prefixes,
  and the assignment of at least one YADA realm prefix.</t>

<t>This document requires the creation of a registry for IPv4 YADA NAT prefixes,
and the assignment of at least one YADA NAT prefix.</t>
</section> <!-- "IANA Considerations"-->

<section><name>Acknowledgments</name>
</section>

    </middle>
    <back>

   <displayreference   target="RFC0791"        to="IPv4"/>
   <displayreference   target="RFC1122"       to="INT-ARCHI"/>
   <displayreference   target="RFC4291"       to="IPv6-ADDRESSING"/>
   <displayreference   target="RFC8200"       to="IPv6"/>
   <displayreference   target="RFC8683"        to="NAT-DEPLOY"/>

    <references>
      <name>References</name>
      <references><name>Normative References</name>


<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1122.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4291.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8200.xml"/>
    </references>

    <references><name>Informative References</name>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8683.xml"/>
   </references>

    </references>

    </back>




</rfc>
