<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced. 
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC7665 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7665.xml">
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6830 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6830.xml">
<!ENTITY RFC7276 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7276.xml">
<!ENTITY RFC7112 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7112.xml">
<!ENTITY RFC6833 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6833.xml">
<!ENTITY RFC2460 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2460.xml">
<!ENTITY RFC791 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml">
<!ENTITY RFC6564 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6564.xml">
<!ENTITY I-D.brockners-inband-oam-data SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.brockners-inband-oam-data.xml">
<!ENTITY I-D.brockners-inband-oam-requirements SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.brockners-inband-oam-requirements.xml">
<!ENTITY I-D.brockners-inband-oam-transport SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.brockners-inband-oam-transport.xml">
<!ENTITY I-D.brockners-proof-of-transit SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.brockners-proof-of-transit.xml">
<!ENTITY I-D.ietf-spring-segment-routing SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-spring-segment-routing.xml">
<!ENTITY I-D.previdi-isis-segment-routing-extensions SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.previdi-isis-segment-routing-extensions.xml">
<!ENTITY I-D.ietf-ippm-6man-pdm-option SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-ippm-6man-pdm-option.xml">
<!ENTITY I-D.gont-v6ops-ipv6-ehs-in-real-world SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.gont-v6ops-ipv6-ehs-in-real-world.xml">
<!ENTITY I-D.brockners-lisp-sr SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.brockners-lisp-sr.xml">
<!ENTITY I-D.hildebrand-spud-prototype SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.hildebrand-spud-prototype.xml">
<!ENTITY I-D.ietf-sfc-nsh SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-sfc-nsh.xml">
<!ENTITY I-D.ietf-6man-segment-routing-header SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-6man-segment-routing-header.xml">
<!ENTITY I-D.ietf-nvo3-vxlan-gpe SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-nvo3-vxlan-gpe.xml">
<!ENTITY I-D.lapukhov-dataplane-probe SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.lapukhov-dataplane-probe.xml">
<!ENTITY I-D.SPUD SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml-ids/reference.I-D.hildebrand-spud-prototype.xml">
<!ENTITY AFI SYSTEM "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml">
]>
<!-- Comments received
Jen Linkova:

1)

"In-band OAM data is added to a packet on entering the in-situ
OAM-domain and is removed from the packet when exiting the domain. " -
it might be just me but I found the terminology a bit confusing. When
I read it for the first time I assumed that "data" means "data in OAM
header. While it looks like by "data" you mean "the data container".
Shall the container and the data be called differently?

2) IMHO calling a node "in-situ OAM encapsulating" is a bit confusing
as at least for some cases there is no encapsulation. Maybe smth like
'pop/push' MPLS terminology? Or would it confuse people even more?

3) (sorry for nitpicking)

"Hop_Lim:  1-octet Hop limit that is set to the TTL value in the
packet at the node that records this data."
s/TTL/TTL or Hop Limit/ - that field is called Hop Limit in IPv6, not TTL.


Deepak Kumar:

I believe just I-oam header should be placed flexibly, if network is l2/l3 leaf and traffic is within one data center then current format is fine.
If traffic is going over L2 and L3 vxlan seperated, or Border Leaf, Data Center Interconnect I-oam header can come fixed byte inside data and configuration policy can determine this behavior if required.
Now How to indicate if common OAM header is starting immediately or after Fixed byte, I will left to community.
Using single "O" bit is also fine for active OAM as we can look at two places if we use optional Fixed byte.

As I-OAM is for real data it will be issue and they might not support that mode or getting extra bit in Datapath header will solve this issue.

L2/L3 distributed scenario is currently deployed by operator.

   In-band OAM header in VXLAN GPE header:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Outer Ethernet Header                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Outer IP Header                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Outer UDP Header                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
   |R|R|Ver|I|P|R|O|          Reserved             | NP = i.s.OAM  |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ GPE
   |     Virtual Network Identifier (VNI)          | Reserved      |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +

            Fixed Byte of Inner Packet Real Data (Optional)


   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
   | Type =i.s.OAM | i.s.OAM HDR len |  Reserved     | NP = IP/Eth |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+iOAM
   |                     in-situ OAM options                       |  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
   |                                                               |
   |                                                               |
   |                     Payload + Padding (L2/L3/ESP/...)         |
   |                                                               |
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-->
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="exp" docName="draft-brockners-inband-oam-data-02"
     ipr="trust200902">
  <!-- ipr="full3978"-->

  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

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

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

    <title abbrev="In-situ OAM Data Formats">Data Formats for In-situ
    OAM</title>

    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->

    <author fullname="Frank Brockners" initials="F." surname="Brockners">
      <organization abbrev="Cisco">Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street>Hansaallee 249, 3rd Floor</street>

          <!-- Reorder these if your country does things differently -->

          <city>DUESSELDORF</city>

          <region>NORDRHEIN-WESTFALEN</region>

          <code>40549</code>

          <country>Germany</country>
        </postal>

        <email>fbrockne@cisco.com</email>

        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

    <author fullname="Shwetha Bhandari" initials="S." surname="Bhandari">
      <organization abbrev="Cisco">Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street>Cessna Business Park, Sarjapura Marathalli Outer Ring
          Road</street>

          <city>Bangalore, KARNATAKA 560 087</city>

          <country>India</country>
        </postal>

        <email>shwethab@cisco.com</email>
      </address>
    </author>

    <author fullname="Carlos Pignataro" initials="C." surname="Pignataro">
      <organization abbrev="Cisco">Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street>7200-11 Kit Creek Road</street>

          <city>Research Triangle Park</city>

          <region>NC</region>

          <code>27709</code>

          <country>United States</country>
        </postal>

        <email>cpignata@cisco.com</email>
      </address>
    </author>

    <author fullname="Hannes Gredler" initials="H." surname="Gredler">
      <organization>RtBrick Inc.</organization>

      <address>
        <email>hannes@rtbrick.com</email>
      </address>
    </author>

    <author fullname="John Leddy" initials="J." surname="Leddy">
      <organization abbrev="Comcast">Comcast</organization>

      <address>
        <email>John_Leddy@cable.comcast.com</email>
      </address>
    </author>

    <author fullname="Stephen Youell" initials="S." surname="Youell">
      <organization abbrev="JMPC">JP Morgan Chase</organization>

      <address>
        <postal>
          <street>25 Bank Street</street>

          <city>London</city>

          <code>E14 5JP</code>

          <country>United Kingdom</country>
        </postal>

        <email>stephen.youell@jpmorgan.com</email>
      </address>
    </author>

    <author fullname="Tal Mizrahi" initials="T." surname="Mizrahi">
      <organization abbrev="">Marvell</organization>

      <address>
        <postal>
          <street>6 Hamada St.</street>

          <city>Yokneam</city>

          <code>20692</code>

          <country>Israel</country>
        </postal>

        <email>talmi@marvell.com</email>
      </address>
    </author>

    <author fullname="David Mozes" initials="D." surname="Mozes">
      <organization abbrev="">Mellanox Technologies Ltd.</organization>

      <address>
        <postal>
          <street></street>

          <city></city>

          <code></code>

          <country></country>
        </postal>

        <email>davidm@mellanox.com</email>
      </address>
    </author>

    <author fullname="Petr Lapukhov" initials="P." surname="Lapukhov">
      <organization abbrev="">Facebook</organization>

      <address>
        <postal>
          <street>1 Hacker Way</street>

          <city>Menlo Park, CA</city>

          <code>94025</code>

          <country>US</country>
        </postal>

        <email>petr@fb.com</email>
      </address>
    </author>

    <author fullname="Remy Chang" initials="R." surname="Chang">
      <organization abbrev="">Barefoot Networks</organization>

      <address>
        <postal>
          <street>2185 Park Boulevard</street>

          <city>Palo Alto, CA</city>

          <code>94306</code>

          <country>US</country>
        </postal>

        <email></email>
      </address>
    </author>

    <date day="30" month="October" year="2016" />

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>ops</area>

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

    <keyword>Telemetry, Tracing,</keyword>

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

    <abstract>
      <t>In-situ Operations, Administration, and Maintenance (OAM) records
      operational and telemetry information in the packet while the packet
      traverses a path between two points in the network. This document
      discusses the data types and data formats for in-situ OAM data records.
      In-situ OAM data records can be embedded into a variety of transports
      such as NSH, Segment Routing, VXLAN-GPE, native IPv6 (via extension
      header), or IPv4. In-situ OAM is to complement current out-of-band OAM
      mechanisms based on ICMP or other types of probe packets.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction" toc="default">
      <t>This document defines data record types for "in-situ" Operations,
      Administration, and Maintenance (OAM). In-situ OAM records OAM
      information within the packet while the packet traverses a particular
      network domain. The term "in-situ" refers to the fact that the OAM data
      is added to the data packets rather than is being sent within packets
      specifically dedicated to OAM. A discussion of the motivation and
      requirements for in-situ OAM can be found in <xref
      target="I-D.brockners-inband-oam-requirements"></xref>. In-situ OAM is
      to complement "out-of-band" or "active" mechanisms such as ping or
      traceroute, or more recent active probing mechanisms as described in
      <xref target="I-D.lapukhov-dataplane-probe"></xref>. In-situ OAM
      mechanisms can be leveraged where current out-of-band mechanisms do not
      apply or do not offer the desired results, such as proving that a
      certain set of traffic takes a pre-defined path, SLA verification for
      the live data traffic, detailed statistics on traffic distribution paths
      in networks that distribute traffic across multiple paths, or scenarios
      where probe traffic is potentially handled differently from regular data
      traffic by the network devices.</t>

      <t>This document defines the data types and data formats for in-situ OAM
      data records. The in-situ OAM data records can be transported by a
      variety of transport protocols, including NSH, Segment Routing,
      VXLAN-GPE, IPv6, IPv4. Encapsulation details for these different
      transport protocols are outside the scope of this document.</t>
    </section>

    <section anchor="Conventions" title="Conventions">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119"></xref>.</t>

      <t>Abbreviations used in this document:</t>

      <t><list hangIndent="11" style="hanging">
          <t hangText="MTU:">Maximum Transmit Unit</t>

          <t hangText="NSH:">Network Service Header</t>

          <t hangText="OAM:">Operations, Administration, and Maintenance</t>

          <t hangText="SFC:">Service Function Chain</t>

          <t hangText="SID:">Segment Identifier</t>

          <t hangText="SR:">Segment Routing</t>

          <t hangText="TLV:">Type-Length-Value</t>

          <t hangText="VXLAN-GPE:">Virtual eXtensible Local Area Network,
          Generic Protocol Extension</t>
        </list></t>
    </section>

    <section anchor="iOAM_option_format"
             title="In-situ OAM Data Types and Data Format">
      <t>This section defines in-situ OAM data types and data formats of the
      data records required for in-situ OAM. The different uses of in-situ OAM
      require the definition of different types of data. The in-situ OAM data
      format for the data being carried corresponds to the three main
      categories of in-situ OAM data defined in <xref
      target="I-D.brockners-inband-oam-requirements"></xref>, which are :
      edge-to-edge, per node, and for selected nodes only.</t>

      <t>Transport options for in-situ OAM data are found in <xref
      target="I-D.brockners-inband-oam-transport"></xref>. In-situ OAM data is
      defined as options in Type-Length-Value (TLV) format. The TLV format for
      each of the three different types of in-situ OAM data is defined in this
      document.</t>

      <t>In-situ OAM is expected to be deployed in a specific domain rather
      than on the overall Internet. The part of the network which employs in
      situ OAM is referred to as the "in-situ OAM-domain". In-situ OAM data is
      added to a packet upon entering the in-situ OAM-domain and is removed
      from the packet when exiting the domain. Within the in-situ OAM-domain,
      the in-situ OAM data may be updated by network nodes that the packet
      traverses. The device which adds in-situ OAM data container to the
      packet to capture in-situ OAM data is called the "in-situ OAM
      encapsulating node", whereas the device which removes the in-situ OAM
      data container is referred to as the "in-situ OAM decapsulating node".
      Nodes within the domain which are aware of in-situ OAM data and read
      and/or write or process the in-situ OAM data are called "in-situ OAM
      transit nodes". Note that not every node in an in-situ OAM domain needs
      to be an in-situ OAM transit node. For example, a Segment Routing
      deployment might require the segment routing path to be verified. In
      that case, only the SR nodes would also be in-situ OAM transit nodes
      rather than all nodes.</t>

      <section anchor="iOAM_tracing_option"
               title="In-situ OAM Tracing Options">
        <t>"In-situ OAM tracing data" is expected to be collected at every
        node that a packet traverses, i.e., in a typical deployment all nodes
        in an in-situ OAM-domain would participate in in-situ OAM and thus be
        in-situ OAM transit nodes, in-situ OAM encapsulating or in-situ OAM
        decapsulating nodes. The maximum network diameter of the in-situ OAM
        domain is assumed to be known.</t>

        <t>To optimize hardware and software implementations tracing is
        defined as two separate options. Any deployment MAY choose to
        configure and support one or both of the following options. An
        implementation of the transport protocol that carries these in-situ
        OAM data MAY choose to support only one of the options. In the event
	that both options are utilized at the same time, the Incremental
	Trace Option MUST be placed before the Pre-allocated Trace Option.</t>

        <t><list style="hanging">
            <t hangText="Pre-allocated Trace Option:">This trace option is
            defined as a container of node-data elements with pre-allocated
            space for each node to populate its information. This option is
            useful for software implementations where it is efficient to
            allocate the space once and index into the array to populate the
            data during transit. The in-situ OAM encapsulating node allocates
            the option header and sets the fields in the option header. The in
            situ OAM encapsulating node allocates an array which is to store
            operational data retrieved from every node while the packet
            traverses the domain. In-situ OAM transit nodes update the content
            of the array. A pointer which is part of the in-situ OAM trace
            data points to the next empty slot in the array, which is where
            the next in-situ OAM transit node fills in its data.</t>

            <t hangText="Incremental Trace Option:">This trace options is
            defined as a container of node-data elements where each node
            allocates and pushes its node data immediately following the
            option header. The number of node-data recorded and maximum number
            of node data that can be recorded are written into the option
            header. This format of trace recording is useful for some of the
            hardware implementations as this eliminates the need for the
            transit network elements to read the full array in the option and
            allows for arbitrarily long packets as the MTU allows. The in-situ
            OAM encapsulating node allocates the option header. The in-situ
            OAM encapsulating node based on operational state and
            configuration sets the fields in the header to control how large
            the node data list can grow. In-situ OAM transit nodes pushes its
            node data to the node data list and increments the number of node
            data records in the header.</t>
          </list></t>

        <t>Every node data entry is to hold information for a particular in
        situ OAM transit node that is traversed by a packet. The in-situ OAM
        decapsulating node removes the in-situ OAM data and process and/or
        export the metadata. In-situ OAM data uses its own name-space for
        information such as node identifier or interface identifier. This
        allows for a domain-specific definition and interpretation. For
        example: In one case an interface-id could point to a physical
        interface (e.g., to understand which physical interface of an
        aggregated link is used when receiving or transmitting a packet)
        whereas in another case it could refer to a logical interface (e.g.,
        in case of tunnels).</t>

        <t>The following in-situ OAM data is defined for in-situ OAM
        tracing:</t>

        <t><list style="symbols">
            <t>Identification of the in-situ OAM node. An in-situ OAM node
            identifier can match to a device identifier or a particular
            control point or subsystem within a device.</t>

            <t>Identification of the interface that a packet was received
            on.</t>

            <t>Identification of the interface that a packet was sent out
            on.</t>

            <t>Time of day when the packet was processed by the node.
            Different definitions of processing time are feasible and
            expected, though it is important that all devices of an in-situ
            OAM domain follow the same definition.</t>

            <t>Generic data: Format-free information where syntax and semantic
            of the information is defined by the operator in a specific
            deployment. For a specific deployment, all in-situ OAM nodes
            should interpret the generic data the same way. Examples for
            generic in-situ OAM data include geo-location information
            (location of the node at the time the packet was processed),
            buffer queue fill level or cache fill level at the time the packet
            was processed, or even a battery charge level.</t>

            <t>A mechanism to detect whether in-situ OAM trace data was added
            at every hop or whether certain hops in the domain weren't in-situ
            OAM transit nodes.</t>
          </list>The "Node data List" array in the packet is populated
        iteratively as the packet traverses the network, starting with the
        last entry of the array, i.e., "Node data List [n]" is the first entry
        to be populated, "Node data List [n-1]" is the second one, etc.</t>

        <section title="Pre-allocated Trace Option">
          <t><figure>
              <artwork><![CDATA[ 
In-situ OAM Pre-allocated Trace Option: 

 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 Type  |  Opt Data Len | Elements-left |    Reserved1  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         OAM-Trace-Type        |         Reserved2             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
|                                                               |  |
|                        Node data List [0]                     |  |
|                                                               |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  D
|                                                               |  a
|                        Node data List [1]                     |  t
|                                                               |  a
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
~                             ...                               ~  S
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  p
|                                                               |  a
|                        Node data List [n-1]                   |  c
|                                                               |  e
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
|                                                               |  |
|                        Node data List [n]                     |  |
|                                                               |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+


]]></artwork>
            </figure><list style="hanging">
              <t hangText="Option Type:">8-bit identifier of the type of
              option. Option number is defined based on the encapsulation
              protocol.</t>

              <t hangText="Opt Data Len:">8-bit unsigned integer. Length of
              the Option Data field of this option, in octets.</t>

              <!---->

              <t hangText="Elements-left:">8-bit unsigned integer. A pointer
              that indicates the next data recording point in the data space
              of the packet in octets. It is the index into the "Node data
              List" array shown above.</t>

              <t hangText="Reserved1:">8-bit unused field in this document and
              MUST be set to zero.</t>

              <t hangText="OAM-trace-type:">16-bit identifier of a particular
              trace element variant.</t>

              <t hangText=" ">The trace type value is a bit field. The
              following bit fields are defined in this document, with details
              on each field described in the <xref
              target="trace-node-data-element"></xref>. The order of packing
              the trace data in each Node-data element follows the bit order
              for setting each trace data element. <list hangIndent="9"
                  style="hanging">
                  <t hangText="Bit 0">When set indicates presence of Hop_Lim
                  and node_id in the Node data.</t>

                  <t hangText="Bit 1">When set indicates presence of
                  ingress_if_id and egress_if_id in the Node data.</t>

                  <t hangText="Bit 2">When set indicates presence of timestamp
                  seconds in the Node data</t>

                  <t hangText="Bit 3">When set indicates presence of timestamp
                  nanoseconds in the Node data.</t>

                  <t hangText="Bit 4">When set indicates presence of transit
                  delay in the Node data.</t>

                  <t hangText="Bit 5">When set indicates presence of app_data
                  in the Node data.</t>

                  <t hangText="Bit 6">When set indicates presence of queue
                  depth in the Node data.</t>

                  <t hangText="Bit 7 - 14">Undefined in this document.</t>

                  <t hangText="Bit 15">When set indicates wide data format for
                  all the node data elements that are present. When unset
                  indicates short data format for all the node data elements
                  that are present.</t>
                </list></t>

              <t hangText=" "><xref target="trace-type-node-data"></xref>
              describes the format of a number of trace types.</t>

              <t hangText="Reserved2:">16-bit unused field in this document
              and MUST be set to zero.</t>

              <t hangText="Node data List [n]:">Variable-length field. The
              format of which is determined by the OAM Type representing the
              n-th Node data in the Node data List. The Node data List is
              encoded starting from the last Node data of the path. The first
              element of the node data list (Node data List [0]) contains the
              last node of the path while the last node data of the Node data
              List (Node data List[n]) contains the first Node data of the
              path traced. The index contained in "Elements-left" identifies
              the current active Node data to be populated.</t>
            </list></t>
        </section>

        <section title="Incremental Trace Option">
          <t><figure>
              <artwork><![CDATA[ 
In-situ OAM Incremental Trace Option: 

 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 Type  |  Opt Data Len | Maximum Length|    Flags      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         OAM Trace Type        |         Reserved              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                        Node data List [0]                     |
|                                                               | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                        Node data List [1]                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
~                             ...                               ~ 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                        Node data List [n-1]                   |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                        Node data List [n]                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


]]></artwork>
            </figure><list style="hanging">
              <t hangText="Option Type:">8-bit identifier of the type of
              option. Option number is defined based on the encapsulation
              protocol.</t>

              <t hangText="Opt Data Len:">8-bit unsigned integer. Length of
              the Option Data field of this option, in octets.</t>

              <t hangText="Maximum Length:">8-bit unsigned integer. This field
              specifies the maximum length of the node data list in octets.
              Given that the sender knows the minimum path MTU, the sender can
              set the maximum of node data bytes allowed before exceeding the
              MTU. Thus, a simple comparison between "Opt data Len" and "Max
              Length" allows to decide whether or not data could be added.</t>

              <t hangText="Flags">8-bit field. Following flags are
              defined:<list style="hanging">
                  <t hangText="1">"Overflow" (O-bit) (least significant bit).
                  This bit is set by the network element if the number of
                  records on the packet is at the maximum limit as specified
                  by the packet: i.e., the packet is already "full" of
                  telemetry information. This is useful for transit nodes to
                  ignore further processing of the option. If inserting a new
                  node data record would cause "Opt Data Len" to exceed "Max
                  Length", no record is added and the overflow "O-bit" must be
                  set to "1" in the header.</t>
                </list></t>

              <t hangText="OAM-trace-type:">16-bit identifier of a particular
              trace element variant.</t>

              <t hangText=" ">The trace type value is a bit field. The
              following bit fields are defined in this document, with details
              on each field described in the <xref
              target="trace-node-data-element"></xref>. The order of packing
              the trace data in each Node-data element follows the bit order
              for setting each trace data element. <list hangIndent="9"
                  style="hanging">
                  <t hangText="Bit 0">When set indicates presence of Hop_Lim
                  and node_id in the Node data.</t>

                  <t hangText="Bit 1">When set indicates presence of
                  ingress_if_id and egress_if_id in the Node data.</t>

                  <t hangText="Bit 2">When set indicates presence of timestamp
                  seconds in the Node data</t>

                  <t hangText="Bit 3">When set indicates presence of timestamp
                  nanoseconds in the Node data.</t>

                  <t hangText="Bit 4">When set indicates presence of transit
                  delay in the Node data.</t>

                  <t hangText="Bit 5">When set indicates presence of app_data
                  in the Node data.</t>

                  <t hangText="Bit 6">When set indicates presence of queue
                  depth in the Node data.</t>

                  <t hangText="Bit 7">When set indicates presence of variable
                  length Opaque State Snapshot field.</t>

                  <t hangText="Bit 8-14">Undefined in this draft.</t>

                  <t hangText="Bit 15">When set indicates wide data format for
                  all the node data elements that are present. When unset
                  indicates short data format for all the node data elements
                  that are present.</t>
                </list></t>

              <t hangText=" "><xref target="trace-type-node-data"></xref>
              describes the format of a number of trace types.</t>

              <t hangText="Reserved:">2 bytes unused field in this document
              and MUST be set to zero.</t>

              <t hangText="Node data List [n]:">Variable-length field. The
              format of which is determined by the OAM Type representing the
              n-th Node data in the Node data List. The Node data List is
              encoded starting from the last Node data of the path. The first
              element of the node data list (Node data List [0]) contains the
              last node of the path while the last node data of the Node data
              List (Node data List[n]) contains the first Node data of the
              path traced.</t>
            </list></t>
        </section>

        <section anchor="trace-node-data-element"
                 title="In-situ OAM node data element format">
          <t>The in-situ OAM node data elements are defined in 2 formats -
          short and wide that is selected by bit 15 in the OAM-trace-type
          field. All the data records MUST be 4-byte aligned in both the
          formats.</t>

          <t>Data type and format for each of the data records in short format
          is shown below:</t>

          <t><list style="hanging">
              <t hangText="Hop_Lim and node_id:">4-octet field defined as
              follows: <figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Hop_Lim     |              node_id                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure><list style="hanging">
                  <t hangText="Hop_Lim:">1-octet unsigned integer. It is set
                  to the Hop Limit value in the packet at the node that
                  records this data. Hop Limit information is used to identify
                  the location of the node in the communication path. This is
                  copied from the lower layer for e.g. TTL value in IPv4
                  header or hop limit field from IPv6 header of the
                  packet.</t>

                  <t hangText="node_id:">3-octet unsigned integer. Node
                  identifier field to uniquely identify a node within in-situ
                  OAM domain. The procedure to allocate, manage and map the
                  node_ids is beyond the scope of this document.</t>
                </list></t>

              <t hangText="ingress_if_id and egress_if_id:">4-octet field
              defined as follows: <figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     ingress_if_id             |         egress_if_id          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure><list style="hanging">
                  <t hangText="ingress_if_id:">2-octet unsigned integer.
                  Interface identifier to record the ingress interface the
                  packet was received on.</t>

                  <t hangText="egress_if_id:">2-octet unsigned integer.
                  Interface identifier to record the egress interface the
                  packet is forwarded out of.</t>
                </list></t>

              <t hangText="timestamp seconds:">4-octet unsigned integer.
              Absolute timestamp in seconds that specifies the time at which
              the packet was received by the node. The format of this field is
              identical to the most significant 32 bits of 64 least
              significant bits of the <xref target="IEEE1588v2"></xref>. This
              truncated format consists of a 32-bit seconds field. As defined
              in <xref target="IEEE1588v2"></xref>, the timestamp specifies
              the number of seconds elapsed since 1 January 1970 00:00:00
              according to the International Atomic Time (TAI).<figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       timestamp seconds                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure></t>

              <t hangText="timestamp nanoseconds:">4-octet unsigned integer in
              the range 0 to 10^9-1. This timestamp specifies the fractional
              part of the wall clock time at which the packet was received by
              the node in units of nanoseconds. It is nanoseconds that are
              recorded in 32 least significant bits of absolute time as per
              <xref target="IEEE1588v2"></xref>. This fields allows for delay
              computation between any two nodes in the network when the nodes
              are time synchronized.<figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       timestamp nanoseconds                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure></t>

              <t hangText="transit delay:">4-octet unsigned integer in the
              range 0 to 2^30-1. It is the time in nanoseconds packet spent in
              transiting a node. This can serve to give an indication of
              queuing delay at the node. If the transit delay exceeds 2^30-1
              nanoseconds then the top bit 'O' is set to indicate
              overflow.<figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|O|                     transit delay                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure></t>

              <t hangText="app_data:">4-octet placeholder which can be used by
              the node to add application specific data</t>

              <t hangText="queue depth:">4-octet unsigned integer field. This
              field indicates the length of the egress interface queue of the
              interface where the packet is forwarded out of. <figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       queue depth                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure></t>
            </list></t>

          <t>Data type and format for each of the elements in wide format
          follows when Most Significant Bit (MSB) i.e., bit 15 of
          OAM-Trace-Type is set:<list style="hanging">
              <t hangText="Hop_Lim and node_id:">8-octet field defined as
              follows: <figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Hop_Lim     |              node_id                          ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                         node_id (contd)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure><list style="hanging">
                  <t hangText="Hop_Lim:">1-octet unsigned integer. It is set
                  to the Hop Limit value in the packet at the node that
                  records this data. Hop Limit information is used to identify
                  the location of the node in the communication path. This is
                  copied from the lower layer for e.g. TTL value in IPv4
                  header or hop limit field from IPv6 header of the
                  packet.</t>

                  <t hangText="node_id:">7-octet unsigned integer. Node
                  identifier field to uniquely identify a node within in-situ
                  OAM domain. The procedure to allocate, manage and map the
                  node_ids is beyond the scope of this document.</t>
                </list></t>

              <t hangText="ingress_if_id and egress_if_id:">8-octet field
              defined as follows: <figure>
                  <artwork><![CDATA[ 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       ingress_if_id                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       egress_if_id                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure><list style="hanging">
                  <t hangText="ingress_if_id:">4-octet unsigned integer.
                  Interface identifier to record the ingress interface the
                  packet was received on.</t>

                  <t hangText="egress_if_id:">4-octet unsigned integer.
                  Interface identifier to record the egress interface the
                  packet is forwarded out of.</t>
                </list></t>

              <t hangText="app_data:">8-octet placeholder which can be used by
              the node to add application specific data.</t>

              <t hangText="Opaque State Snapshot:">Variable length field. It
              allows the network element to store arbitrary state in the node
              data record, without a pre-defined schema. The schema needs to
              made known to the analyzer by some out-of-band means. The 24-bit
              "Schema Id" field in the record is supposed to let the analyzer
              know which particular schema to use, and it is expected to be
              configured on the network element by the operator. This ID is
              expected to be configured on the device by the network operator.
              <figure>
                  <artwork><![CDATA[    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Length      |                     Schema ID                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                                                               |
   |                        Opaque data                            |
   ~                                                               ~
   .                                                               .
   .                                                               .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
                </figure><list style="hanging">
                  <t hangText="Length:">1-octet unsigned integer. It is the
                  length of the Opaque data field that follows Schema Id. It
                  MUST always be a multiple of 4.</t>

                  <t hangText="Schema ID:">3-octet unsigned integer
                  identifying the schema of Opaque data.</t>

                  <t hangText="Opaque data:">Variable length field. This field
                  is interpreted as specified by the schema identified by the
                  Schema ID.</t>
                </list></t>

              <t>The fields - timestamp seconds, timestamp nanoseconds and
              transit delay have the same format as defined in short
              format.</t>
            </list></t>
        </section>

        <section anchor="trace-type-node-data"
                 title=" Examples of In-situ OAM node data">
          <t>An entry in the "Node data List" array can have different
          formats, following the needs of the deployment. Some deployments
          might only be interested in recording the node identifiers, whereas
          others might be interested in recording node identifier and
          timestamp. The section defines different formats that an entry in
          "Node data List" can take.</t>

          <t><list style="hanging">
              <t hangText="0x002B:">In-situ OAM-trace-type is 0x2B then the
              format of node data is:<figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     ingress_if_id             |         egress_if_id          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                  timestamp nanoseconds                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            app_data                           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
                </figure></t>

              <t hangText="0x0003:">In-situ OAM-trace-type is 0x0003 then the
              format is:<figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |     ingress_if_id             |         egress_if_id          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

]]></artwork>
                </figure></t>

              <t hangText="0x0009:">In-situ OAM-trace-type is 0x0009 then the
              format is: <figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                   timestamp nanoseconds                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
                </figure></t>

              <t hangText="0x0021:">In-situ OAM-trace-type is 0x0021 then the
              format is:<figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            app_data                           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
                </figure></t>

              <t hangText="0x0029:">In-situ OAM-trace-type is 0x0029 then the
              format is:<figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    timestamp nanoseconds                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                            app_data                           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
                </figure></t>

              <t hangText="0x104D:">In-situ OAM-trace-type is 0x104D then the
              format is:<figure>
                  <artwork><![CDATA[     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Hop_Lim     |              node_id                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         node_id(contd)                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                      timestamp seconds                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    timestamp nanoseconds                      |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   Length      |                     Schema Id                 |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    |                                                               |
    |                        Opaque data                            |
    ~                                                               ~
    .                                                               .
    .                                                               .
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
                </figure></t>
            </list></t>
        </section>
      </section>

      <section anchor="iOAM_proof_of_transit_option"
               title="In-situ OAM Proof of Transit Option">
        <t>In-situ OAM Proof of Transit data is to support the path or service
        function chain <xref target="RFC7665"></xref> verification use cases.
        Proof-of-transit uses methods like nested hashing or nested encryption
        of the in-situ OAM data or mechanisms such as Shamir's Secret Sharing
        Schema (SSSS). While details on how the in-situ OAM data for the proof
        of transit option is processed at in-situ OAM encapsulating,
        decapsulating and transit nodes are outside the scope of the document,
        all of these approaches share the need to uniquely identify a packet
        as well as iteratively operate on a set of information that is handed
        from node to node. Correspondingly, two pieces of information are
        added as in-situ OAM data to the packet:</t>

        <t><list style="symbols">
            <t>Random: Unique identifier for the packet (e.g., 64-bits allow
            for the unique identification of 2^64 packets).</t>

            <t>Cumulative: Information which is handed from node to node and
            updated by every node according to a verification algorithm.</t>
          </list></t>

        <t><figure>
            <artwork><![CDATA[ 
In-situ OAM Proof of Transit option:

 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 Type  |  Opt Data Len |  POT type = 0 |P|  reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+
|                           Random                              |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  P
|                        Random(contd)                          |  O
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  T
|                         Cumulative                            |  | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  |
|                         Cumulative (contd)                    |  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<-+


]]></artwork>
          </figure><list style="hanging">
            <t hangText="Option Type:">8-bit identifier of the type of
            option.</t>

            <t hangText="Opt Data Len:">8-bit unsigned integer. Length of the
            Option Data field of this option, in octets.</t>

            <t hangText="POT Type:">8-bit identifier of a particular POT
            variant that dictates the POT data that is included. This document
            defines POT Type 0:<list style="hanging">
                <t hangText="0:">POT data is a 16 Octet field as described
                below.</t>
              </list></t>

            <t hangText="Profile to use (P):">1-bit. Indicates which
            POT-profile is used to generate the Cumulative. Any node
            participating in POT will have a maximum of 2 profiles configured
            that drive the computation of cumulative. The two profiles are
            numbered 0, 1. This bit conveys whether profile 0 or profile 1 is
            used to compute the Cumulative.</t>

            <t hangText="Reserved:">7-bit. Reserved for future use.</t>

            <t hangText="Random:">64-bit Per packet Random number.</t>

            <t hangText="Cumulative:">64-bit Cumulative that is updated at
            specific nodes by processing per packet Random number field and
            configured parameters.</t>
          </list>Note: Larger or smaller sizes of "Random" and "Cumulative"
        data are feasible and could be required for certain deployments (e.g.
        in case of space constraints in the transport protocol used). Future
        versions of this document will address different sizes of data for
        "proof of transit".</t>
      </section>

      <section anchor="iOAM_edge_to_edge_opt"
               title="In-situ OAM Edge-to-Edge Option">
        <t>The in-situ OAM Edge-to-Edge Option is to carry data which is to be
        interpreted only by the in-situ OAM encapsulating and in-situ OAM
        decapsulating node, but not by in-situ OAM transit nodes.</t>

        <t>Currently only sequence numbers use the in-situ OAM Edge-to-Edge
        option. In order to detect packet loss, packet reordering, or packet
        duplication in an in-situ OAM-domain, sequence numbers can be added to
        packets of a particular tube (see <xref
        target="I-D.hildebrand-spud-prototype"></xref>). Each tube leverages a
        dedicated namespace for its sequence numbers.</t>

        <t><figure>
            <artwork><![CDATA[
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Option Type  |  Opt Data Len | OAM-E2E-Type  |    reserved   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      E2E Option data format determined by iOAM-E2E-Type       ~
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

]]></artwork>
          </figure><list style="hanging">
            <t hangText="Option Type:">8-bit identifier of the type of
            option.</t>

            <t hangText="Opt Data Len:">8-bit unsigned integer. Length of the
            Option Data field of this option, in octets.</t>

            <t hangText="OAM-E2E-Type:">8-bit identifier of a particular in
            situ OAM E2E variant.<list style="empty">
                <t>0: E2E option data is a 64-bit sequence number added to a
                specific tube which is used to identify packet loss and
                reordering for that tube.</t>
              </list></t>

            <t hangText="Reserved:">8-bit. (Reserved Octet) Reserved octet for
            future use.</t>
          </list></t>
      </section>
    </section>

    <section title="In-situ OAM Data Export">
      <t>In-situ OAM nodes collect information for packets traversing a domain
      that supports in-situ OAM. The device at the domain edge (which could
      also be an end-host) which receives a packet with in-situ OAM
      information chooses how to process the in-situ OAM data collected within
      the packet. This decapsulating node can simply discard the information
      collected, can process the information further, or export the
      information using e.g., IPFIX.</t>

      <t>The discussion of in-situ OAM data processing and export is left for
      a future version of this document.</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>IANA considerations will be added in a future version of this
      document.</t>
    </section>

    <section title="Manageability Considerations">
      <t>Manageability considerations will be addressed &iacute;n a later
      version of this document..</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>Security considerations will be addressed &iacute;n a later version
      of this document. For a discussion of security requirements of in-situ
      OAM, please refer to <xref
      target="I-D.brockners-inband-oam-requirements"></xref>.</t>
    </section>

    <section title="Acknowledgements">
      <t>The authors would like to thank Eric Vyncke, Nalini Elkins, Srihari
      Raghavan, Ranganathan T S, Karthik Babu Harichandra Babu, Akshaya
      Nadahalli, LJ Wobker, Erik Nordmark, and Andrew Yourtchenko for the
      comments and advice. This document leverages and builds on top of
      several concepts described in <xref
      target="I-D.kitamura-ipv6-record-route"></xref>. The authors would like
      to acknowledge the work done by the author Hiroshi Kitamura and people
      involved in writing it.</t>
    </section>
  </middle>

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

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

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

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

    <references title="Normative References">
      &RFC2119;

      &I-D.brockners-inband-oam-requirements;

      <reference anchor="IEEE1588v2"
                 target="http://standards.ieee.org/findstds/standard/1588-2008.html">
        <front>
          <title>1588-2008 - IEEE Standard for a Precision Clock
          Synchronization Protocol for Networked Measurement and Control
          Systems</title>

          <author>
            <organization>Institute of Electrical and Electronics
            Engineers</organization>
          </author>

          <date year="2008" />
        </front>

        <seriesInfo name="" value="IEEE Std 1588-2008" />
      </reference>
    </references>

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

      &I-D.lapukhov-dataplane-probe;

      <reference anchor="I-D.kitamura-ipv6-record-route">
        <front>
          <title>Record Route for IPv6 (PR6) Hop-by-Hop Option
          Extension</title>

          <author fullname="Hiroshi Kitamura" initials="H" surname="Kitamura"></author>

          <date month="November" year="2000" />
        </front>

        <seriesInfo name="Internet-Draft"
                    value="draft-kitamura-ipv6-record-route-00" />

        <format target="https://tools.ietf.org/id/draft-kitamura-ipv6-record-route-00.txt"
                type="TXT" />
      </reference>

      &I-D.brockners-inband-oam-transport;

      &I-D.SPUD;
    </references>
  </back>
</rfc>
