<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?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="yes"?>
<?rfc subcompact="no"?>
<?rfc strict='yes'?>
<?rfc iprnotified='no'?>
<rfc category="info" docName="draft-templin-intarea-grefrag-03.txt"
     ipr="trust200902" updates="RFC1701, RFC2784, RFC2890">
  <front>
    <title abbrev="GRE Tunnel Fragmentation">GRE Tunnel Level
    Fragmentation</title>

    <author fullname="Fred L. Templin" initials="F. L." role="editor"
            surname="Templin">
      <organization>Boeing Research &amp; Technology</organization>

      <address>
        <postal>
          <street>P.O. Box 3707</street>

          <city>Seattle</city>

          <region>WA</region>

          <code>98124</code>

          <country>USA</country>
        </postal>

        <email>fltemplin@acm.org</email>
      </address>
    </author>

    <date day="29" month="July" year="2016"/>

    <keyword>I-D</keyword>

    <keyword>Internet-Draft</keyword>

    <abstract>
      <t>GRE tunnels use IP fragmentation for delivery packets that exceed the
      path MTU. However, IP fragmentation has been shown to be susceptible to
      reassembly errors at high data rates, and IP fragments may be
      unconditionally dropped by some middleboxes. This document therefore
      introduces GRE tunnel level fragmentation, which overcomes these
      issues.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro" title="Introduction">
      <t>GRE is specified in the following RFCs: <xref target="RFC1701"/><xref
      target="RFC2784"/><xref target="RFC2890"/><xref target="RFC7676"/>. GRE
      fragmentation considerations are further discussed in <xref
      target="RFC7588"/>. In its current manifestation, GRE allows for
      fragmentation of the payload packet only if it is an IPv4 packet with
      the Don't Fragment (DF) bit set to 0. GRE also allows for IP
      fragmentation of the delivery packet, but IP fragmentation has been
      shown to be susceptible to reassembly errors at high data rates <xref
      target="RFC4963"/> and IP fragments may be unconditionally dropped by
      some middleboxes [I-D.taylor-v6ops-fragdrop].</t>

      <t>A third option (introduced here) is for the GRE tunnel to perform
      "tunnel level" fragmentation and reassembly on the payload packet at the
      GRE layer. In this way, the ingress can fragment the payload packet
      (while treating the payload packet's headers as ordinary data) and
      encapsulate each fragment in a separate delivery header. The GRE header
      requires a new fragment header field to support this.</t>

      <t>This tunnel level fragmentation method was first suggested in Section
      3.1.7 of <xref target="RFC2764"/>, and also appears in more recent works
      <xref target="I-D.templin-aerolink"/> <xref
      target="I-D.herbert-gue-fragmentation"/>. <xref
      target="I-D.ietf-intarea-tunnels"/> provides the architectural
      background for tunnel fragemntation and reassembly.</t>
    </section>

    <section anchor="minencaps" title="GRE Fragmentation Header">
      <t><xref target="grefrag"/> shows the GRE header as specified in <xref
      target="RFC1701"/> but with a new optional "Fragment Header" and a new
      control bit "F":</t>

      <figure anchor="grefrag" title="GRE Header with Fragment Header">
        <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |C|R|K|S|s|Recur|F| Flags | Ver |         Protocol Type         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Checksum (optional)      |       Offset (optional)       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Key (optional)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Sequence Number (optional)                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                 Fragment Header (Optional)                    |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Routing (optional)
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

      <t>In this format, when the "F" bit (i.e., bit 8) is set to 1 the GRE
      header includes a Fragment header formatted as follows:</t>

      <t><figure anchor="fraghdr" title="GRE Fragemnt Header Format">
          <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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       Fragment offset   |Res|M|  Reserved(2)  |               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               +
      |                        Identification                         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure> The fields of the option are:</t>

      <t><list style="symbols">
          <t>Fragment offset: This field indicates where in the datagram this
          fragment belongs. The fragment offset is measured in units of 8
          octets (64 bits). The first fragment has offset zero.</t>

          <t>Res: Two bit reserved field. Must be set to zero for
          transmission. If set to non-zero in a received packet then the
          packet MUST be dropped.</t>

          <t>M: More fragments bit. Set to 1 when there are more fragments
          following in the datagram, set to 0 for the last fragment.</t>

          <t>Reserved(2): Eight bit reserved field. Must be set to zero for
          transmission. If set to non-zero in a received packet then the
          packet MUST be dropped.</t>

          <t>Identification: 40 bits. Identifies fragments of a fragmented
          packet.</t>
        </list>Note that these formats are the same as specified in <xref
      target="I-D.herbert-gue-fragmentation"/> with the exception that the
      Reserved(2) field replaces the "Original Type" field since the GRE
      header already includes a Protocl Type.</t>
    </section>

    <section anchor="whentoinsert"
             title="GRE Tunnel Level Fragmentation and Reassembly">
      <t>GRE tunnel level fragmentation treats the entire GRE payload packet
      (including the payload headers) as opaque data. The GRE tunnel ingress
      breaks the payload packet into N fragments and encapsulates each
      fragment in a separate GRE header and GRE delivery header. For the first
      fragment, the ingress writes the IEEE802 protocol number in the Protocol
      Type field the same as for any GRE packet. For other fragments, the
      ingress instead writes the length of the fragment in the Protocol Type
      field. This value MUST be no larger than 1500, which the egress will
      interpret as a length instead of a protocol type. (This implies that the
      maximum size for a non-initial fragment is 1500 bytes.) The GRE tunnel
      ingress then sends each fragment to the GRE tunnel egress.</t>

      <t>When the GRE tunnel egress receives the fragments, it reassembles the
      GRE payload packet by concatenating the data portions of each fragment
      according to their offsets. In order to support this tunnel level
      fragmentation and reassembly procedure, the GRE tunnel ingress must know
      the maximum sized packet the GRE tunnel egress is capable of
      reassembling, i.e., the Maximum Reassembly Unit (MRU). In order to avoid
      interactions with Path MTU Discovery, the GRE tunnel egress MUST
      configure a minimum MRU of 1500 bytes plus the GRE delivery
      encapsulation overhead, and MAY configure a larger MRU.</t>
    </section>

    <section anchor="iana" title="IANA Considerations">
      <t>This document introduces no IANA considerations.</t>
    </section>

    <section anchor="secure" title="Security Considerations">
      <t>Security considerations for GRE apply also to this document.</t>
    </section>

    <section anchor="ack" title="Acknowledgements">
      <t>The following are acknowledged for their helpful comments: Tom
      Herbert, Carlos Pignataro, Joe Touch.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.0791"?>

      <?rfc include="reference.RFC.2460"?>

      <?rfc include="reference.RFC.1701"?>

      <?rfc include="reference.RFC.2784"?>

      <?rfc include="reference.RFC.2890"?>

      <?rfc include="reference.RFC.2764"?>

      <?rfc include="reference.RFC.7588"?>

      <?rfc include="reference.RFC.7676"?>

    </references>

    <references title="Informative References">
      <?rfc include="reference.I-D.templin-aerolink"?>

      <?rfc include="reference.I-D.ietf-intarea-tunnels"?>

      <?rfc include="reference.I-D.herbert-gue-fragmentation"?>

      <?rfc include="reference.RFC.4963"?>
    </references>
  </back>
</rfc>
