<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-li-ippm-ioam-packet-triggered-reporting-00"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="IOAM Packet-Triggered Reporting">
      Packet-Triggered Statistics Reporting for In-situ OAM
    </title>

    <seriesInfo name="Internet-Draft"
                value="draft-li-ippm-ioam-packet-triggered-reporting-00"/>

    <author fullname="Zhiqiang Li" initials="Z." surname="Li">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <street>32 Xuanwumen West Street</street>
          <city>Beijing</city>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>lizhiqiangyjy@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Zongpeng Du" initials="Z." surname="Du">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <street>32 Xuanwumen West Street</street>
          <city>Beijing</city>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>duzongpeng@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Wei Cheng" initials="W." surname="Cheng">
      <organization>Centec Networks</organization>
      <address>
        <postal>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>chengw@centec.com</email>
      </address>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec Networks</organization>
      <address>
        <postal>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>wangjj@centec.com</email>
      </address>
    </author>
    <author fullname="Guoying Zhang" initials="G." surname="Zhang">
      <organization>Centec Networks</organization>
      <address>
        <postal>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>zhanggy@centec.com</email>
      </address>
    </author>

<date year="2026" month="February" day="28"/>

    <area>Operations and Management</area>
    <workgroup>IPPM</workgroup>

    <keyword>IOAM</keyword>
    <keyword>In-situ OAM</keyword>
    <keyword>Packet Loss Measurement</keyword>
    <keyword>Delay Measurement</keyword>
    <keyword>Alternate Marking</keyword>

    <abstract>
      <t>This document defines a packet-triggered statistics
      reporting extension for In-situ Operations, Administration,
      and Maintenance (IOAM). The extension specifies a 2-bit
      Cycle Identifier field that enables receiving nodes to
      trigger statistics reporting based on observed Cycle ID
      transitions in received packets. This document defines the
      Cycle ID field format, node processing procedures, and
      keepalive packet generation rules.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>In-situ Operations, Administration, and Maintenance (IOAM)
      <xref target="RFC9197"/> records operational and telemetry
      information within user data packets while they traverse a
      network path. Alternate marking methods for packet loss
      measurement rely on periodic color changes to delineate
      measurement intervals.</t>

      <t>This document specifies a packet-triggered reporting
      extension that uses a four-value Cycle Identifier (Cycle ID)
      field. Receiving nodes observe Cycle ID transitions in
      arriving packets and use these transitions to trigger
      statistics reporting. This document defines the Cycle ID
      field encoding, procedures for encapsulating and
      decapsulating nodes, and the generation of keepalive packets
      to maintain measurement continuity.</t>

      <t>The scope of this document is limited to the definition of
      the Cycle ID field and associated node behaviors. The
      transport of IOAM data and the encapsulation in specific
      protocols (e.g., IPv6, NSH, GRE) are outside the scope of
      this document.</t>

      <section anchor="requirements-language">
        <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>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document uses the terminology defined in
      <xref target="RFC9197"/>. The following additional terms are
      used in this document:</t>

      <dl>
        <dt>Cycle Identifier (Cycle ID):</dt>
        <dd>A 2-bit field that identifies the measurement interval
        to which a packet belongs. Valid values are 0, 1, 2, and
        3.</dd>

        <dt>Keepalive Packet:</dt>
        <dd>A packet generated by the encapsulating node when no
        user data packets are transmitted during a measurement
        interval, ensuring at least one packet per interval
        reaches the decapsulating node.</dd>

        <dt>Encapsulating Node:</dt>
        <dd>The IOAM node that inserts the Cycle ID field into
        packets entering the IOAM domain.</dd>

        <dt>Decapsulating Node:</dt>
        <dd>The IOAM node that processes the Cycle ID field and
        triggers statistics reporting upon Cycle ID
        transitions.</dd>

        <dt>Transit Node:</dt>
        <dd>An IOAM node that processes packets within the IOAM
        domain, updating statistics based on the Cycle ID.</dd>

        <dt>Measurement Interval:</dt>
        <dd>The time period associated with a single Cycle ID
        value during which packet statistics are accumulated.</dd>
      </dl>
    </section>

    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>This section provides a non-normative overview of
      packet-triggered statistics reporting.</t>

      <t>The encapsulating node assigns a Cycle ID value (0-3) to
      each packet based on the current measurement interval. The
      Cycle ID value increments sequentially (0, 1, 2, 3, 0, ...)
      as measurement intervals advance. When the decapsulating
      node receives a packet with a Cycle ID different from the
      previously received Cycle ID, it triggers the reporting of
      statistics accumulated during the earlier interval.</t>

      <t>To ensure that statistics reporting is triggered even
      during periods of no user traffic, the encapsulating node
      generates keepalive packets when no user data packets have
      been transmitted during an interval transition.</t>

      <figure anchor="fig-overview">
        <name>Packet-Triggered Reporting Overview</name>
        <artwork type="ascii-art"><![CDATA[
+---------------+                              +---------------+
| Encapsulating |   Cycle ID in IOAM Header    | Decapsulating |
|     Node      | ---------------------------> |     Node      |
+---------------+                              +---------------+
       |                                              |
       | 1. Assign Cycle ID                           |
       | 2. Maintain per-cycle counters               |
       | 3. Generate keepalive if needed              |
       |                                              |
       |                                   1. Detect Cycle ID change
       |                                   2. Trigger stats report
       |                                   3. Update local Cycle ID
]]></artwork>
      </figure>
    </section>

    <section anchor="packet-format">
      <name>Cycle ID Field Format</name>
      <t>The Cycle ID field is carried within the IOAM Option-Type
      header. The field format is defined as follows:</t>

      <figure anchor="fig-packet-format">
        <name>Cycle ID Field Format</name>
        <artwork type="ascii-art"><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cycle ID  |K|                    Reserved                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

      <t>The fields are defined as follows:</t>

      <dl>
        <dt>Cycle ID (2 bits):</dt>
        <dd>Identifies the measurement interval. Valid values are
        0, 1, 2, and 3. The Cycle ID MUST increment sequentially
        modulo 4 (i.e., 0 -> 1 -> 2 -> 3 -> 0).</dd>

        <dt>K (Keepalive Flag, 1 bit):</dt>
        <dd>When set to 1, indicates that this packet is a
        keepalive packet. When set to 0, indicates a user data
        packet. The K flag MUST be set to 0 for user data
        packets.</dd>

        <dt>Reserved (29 bits):</dt>
        <dd>Reserved for future use. MUST be set to zero on
        transmission. MUST be ignored on reception.</dd>
      </dl>

      <section anchor="cycle-id-values">
        <name>Cycle ID Value Definitions</name>
        <t>The following Cycle ID values are defined:</t>

        <table anchor="tab-cycle-id">
          <name>Cycle ID Values</name>
          <thead>
            <tr>
              <th>Value</th>
              <th>Binary</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0</td>
              <td>00</td>
              <td>Measurement Interval 0</td>
            </tr>
            <tr>
              <td>1</td>
              <td>01</td>
              <td>Measurement Interval 1</td>
            </tr>
            <tr>
              <td>2</td>
              <td>10</td>
              <td>Measurement Interval 2</td>
            </tr>
            <tr>
              <td>3</td>
              <td>11</td>
              <td>Measurement Interval 3</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="encapsulating-node">
      <name>Encapsulating Node Procedures</name>
      <t>This section specifies the normative procedures for
      encapsulating nodes.</t>

      <section anchor="encap-cycle-assignment">
        <name>Cycle ID Assignment</name>
        <t>The encapsulating node MUST maintain a current Cycle ID
        value for each IOAM flow. The encapsulating node MUST
        assign the current Cycle ID value to all packets belonging
        to that flow.</t>

        <t>The encapsulating node MUST increment the Cycle ID value
        at the beginning of each new measurement interval. The
        increment operation MUST be performed modulo 4:</t>

        <t>new_cycle_id = (current_cycle_id + 1) mod 4</t>

        <t>The duration of a measurement interval is a local
        configuration parameter. The default measurement interval
        duration is 1 second. Implementations SHOULD support
        configurable measurement interval durations in the range
        of 100 milliseconds to 60 seconds.</t>
      </section>

      <section anchor="encap-statistics">
        <name>Statistics Maintenance</name>
        <t>The encapsulating node MUST maintain per-flow,
        per-Cycle-ID statistics counters. At minimum, the
        following counters MUST be maintained:</t>

        <ul>
          <li>Packet count: The number of packets transmitted
          with each Cycle ID value</li>
          <li>Byte count: The total bytes transmitted with each
          Cycle ID value</li>
        </ul>

        <t>The encapsulating node MUST maintain statistics for
        all four Cycle ID values (0, 1, 2, 3) simultaneously.</t>

        <figure anchor="fig-stats-table">
          <name>Per-Flow Statistics Structure</name>
          <artwork type="ascii-art"><![CDATA[
+----------+--------------+--------+--------+--------+--------+
| Flow ID  | Current      | Cyc 0  | Cyc 1  | Cyc 2  | Cyc 3  |
|          | Cycle ID     | Stats  | Stats  | Stats  | Stats  |
+----------+--------------+--------+--------+--------+--------+
| <flow>   | 0|1|2|3      | pkt/   | pkt/   | pkt/   | pkt/   |
|          |              | byte   | byte   | byte   | byte   |
+----------+--------------+--------+--------+--------+--------+
]]></artwork>
        </figure>
      </section>

      <section anchor="encap-reporting">
        <name>Statistics Reporting</name>
        <t>The encapsulating node MUST report statistics with a
        two-interval delay relative to the current Cycle ID. This
        delay ensures that all packets from a given interval have
        been processed before reporting.</t>

        <t>The reporting relationship is defined as follows:</t>

        <table anchor="tab-reporting">
          <name>Statistics Reporting Schedule</name>
          <thead>
            <tr>
              <th>Current Cycle ID</th>
              <th>Report Statistics for Cycle ID</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0</td>
              <td>2</td>
            </tr>
            <tr>
              <td>1</td>
              <td>3</td>
            </tr>
            <tr>
              <td>2</td>
              <td>0</td>
            </tr>
            <tr>
              <td>3</td>
              <td>1</td>
            </tr>
          </tbody>
        </table>

        <t>The reporting schedule MAY be expressed as:</t>
        <t>report_cycle_id = (current_cycle_id + 2) mod 4</t>
      </section>

      <section anchor="encap-keepalive">
        <name>Keepalive Packet Generation</name>
        <t>The encapsulating node MUST generate a keepalive packet
        when a Cycle ID transition occurs and no user data packets
        were transmitted during the ending interval.</t>

        <t>The encapsulating node MUST track whether at least one
        user data packet has been transmitted during each
        measurement interval. The encapsulating node SHOULD
        implement this tracking using a per-flow, per-Cycle-ID
        flag.</t>

        <t>Upon Cycle ID transition, if the tracking flag indicates
        no user data packets were transmitted during the ending
        interval, the encapsulating node MUST generate and transmit
        a keepalive packet with the following properties:</t>

        <ul>
          <li>The Cycle ID field MUST be set to the ending
          interval's Cycle ID value</li>
          <li>The K flag MUST be set to 1</li>
          <li>The packet SHOULD use a cached packet template from
          the flow, if available</li>
          <li>The packet MAY be a minimal probe packet if no
          template is available</li>
        </ul>

        <t>Keepalive packets MUST NOT be counted in the packet
        statistics for packet loss calculation. Implementations
        MUST distinguish keepalive packets from user data packets
        in statistics counters.</t>
      </section>

      <section anchor="encap-errors">
        <name>Error Handling</name>
        <t>If the encapsulating node is unable to insert the
        Cycle ID field due to insufficient header space, the node
        MUST forward the packet without IOAM information and
        SHOULD increment an error counter.</t>

        <t>If the encapsulating node detects an invalid Cycle ID
        value in its local state (i.e., a value outside the range
        0-3), the node MUST reset the Cycle ID to 0 and SHOULD
        log the error condition.</t>
      </section>
    </section>

    <section anchor="transit-node">
      <name>Transit Node Procedures</name>
      <t>This section specifies the normative procedures for
      transit nodes.</t>

      <section anchor="transit-processing">
        <name>Packet Processing</name>
        <t>A transit node that supports packet-triggered reporting
        MUST perform the following operations for each received
        packet containing a Cycle ID field:</t>

        <ol>
          <li>Parse the Cycle ID field from the IOAM header</li>
          <li>Validate that the Cycle ID value is in the range
          0-3</li>
          <li>Update the statistics counter corresponding to the
          parsed Cycle ID value</li>
          <li>Forward the packet according to normal forwarding
          procedures</li>
        </ol>

        <t>Transit nodes MUST NOT modify the Cycle ID field or the
        K flag.</t>

        <t>Transit nodes SHOULD NOT maintain timers for statistics
        reporting. Transit nodes MAY trigger local statistics
        reporting based on observed Cycle ID transitions, using
        the same procedures as decapsulating nodes.</t>
      </section>

      <section anchor="transit-errors">
        <name>Error Handling</name>
        <t>If a transit node receives a packet with an invalid
        Cycle ID value (outside the range 0-3), the node MUST
        forward the packet without updating statistics and SHOULD
        increment an error counter.</t>

        <t>If a transit node receives a packet with a malformed
        Cycle ID field (e.g., truncated header), the node SHOULD
        forward the packet according to local policy and MUST
        increment an error counter.</t>
      </section>
    </section>

    <section anchor="decapsulating-node">
      <name>Decapsulating Node Procedures</name>
      <t>This section specifies the normative procedures for
      decapsulating nodes.</t>

      <section anchor="decap-state">
        <name>State Maintenance</name>
        <t>The decapsulating node MUST maintain the following
        per-flow state:</t>

        <ul>
          <li>Last received Cycle ID: The Cycle ID value from the
          most recently received packet</li>
          <li>Per-Cycle-ID statistics counters: Packet and byte
          counts for each of the four Cycle ID values</li>
          <li>Initialization flag: Indicates whether the flow has
          received its first packet</li>
        </ul>

        <t>Upon receiving the first packet for a flow, the
        decapsulating node MUST set the initialization flag and
        record the received Cycle ID as the last received
        Cycle ID. The decapsulating node MUST NOT trigger
        statistics reporting for the first received packet.</t>
      </section>

      <section anchor="decap-trigger">
        <name>Report Triggering</name>
        <t>For each received packet after initialization, the
        decapsulating node MUST compare the packet's Cycle ID
        with the last received Cycle ID.</t>

        <t>If the Cycle ID values differ, the decapsulating node
        MUST:</t>

        <ol>
          <li>Trigger statistics reporting for the interval that
          ended two cycles before the newly received Cycle ID,
          calculated as: report_cycle_id = (received_cycle_id + 2)
          mod 4</li>
          <li>Update the last received Cycle ID to the newly
          received value</li>
          <li>Update the statistics counter for the newly
          received Cycle ID</li>
        </ol>

        <t>If the Cycle ID values are equal, the decapsulating
        node MUST update only the statistics counter for the
        current Cycle ID.</t>
      </section>

      <section anchor="decap-keepalive">
        <name>Keepalive Packet Processing</name>
        <t>When the decapsulating node receives a packet with the
        K flag set to 1, the node MUST:</t>

        <ul>
          <li>Process the Cycle ID for report triggering as
          specified in <xref target="decap-trigger"/></li>
          <li>NOT include the keepalive packet in packet loss
          statistics</li>
          <li>Optionally discard the packet after processing if
          no further forwarding is required</li>
        </ul>
      </section>

      <section anchor="decap-errors">
        <name>Error Handling</name>
        <t>If the decapsulating node receives a packet with an
        invalid Cycle ID value, the node MUST discard the Cycle ID
        information from that packet, MUST NOT trigger statistics
        reporting based on that packet, and SHOULD increment an
        error counter.</t>

        <t>If the decapsulating node detects a Cycle ID sequence
        gap (e.g., transition from 0 to 2, skipping 1), the node
        SHOULD log this condition and MAY trigger reporting for
        all skipped intervals. The specific behavior for sequence
        gaps is implementation-defined.</t>
      </section>
    </section>

    <section anchor="state-machine">
      <name>Cycle ID State Machine</name>
      <t>The Cycle ID transitions through four states in a fixed
      sequence. The state machine is defined as follows:</t>

      <figure anchor="fig-state-machine">
        <name>Cycle ID State Machine</name>
        <artwork type="ascii-art"><![CDATA[
                    Interval Timer Expiry
           +-----+                        +-----+
           |     |   +------------------> |     |
           |  0  |   |                    |  1  |
           |     | <-+                    |     |
           +-----+   |                    +-----+
              ^      |                       |
              |      |  Interval             |  Interval
              |      |  Timer                |  Timer
              |      |  Expiry               |  Expiry
              |      |                       v
           +-----+   |                    +-----+
           |     |   |                    |     |
           |  3  | <-+                    |  2  |
           |     |   +------------------> |     |
           +-----+     Interval Timer     +-----+
                          Expiry
]]></artwork>
      </figure>

      <t>The Cycle ID value MUST transition in the sequence:
      0 -> 1 -> 2 -> 3 -> 0 (repeating). No other transition
      sequences are valid.</t>

      <t>The transition from one Cycle ID value to the next MUST
      occur only at measurement interval boundaries as determined
      by the encapsulating node's local timer.</t>
    </section>

    <section anchor="manageability">
      <name>Manageability Considerations</name>

      <section anchor="config-params">
        <name>Configuration Parameters</name>
        <t>Implementations supporting this specification SHOULD
        expose the following configuration parameters:</t>

        <ul>
          <li>Measurement interval duration (default: 1 second,
          range: 100ms - 60s)</li>
          <li>Keepalive generation enable/disable (default:
          enabled)</li>
          <li>Per-flow statistics reporting destination</li>
          <li>Error counter thresholds for alarming</li>
        </ul>
      </section>

      <section anchor="monitoring">
        <name>Monitoring and Statistics</name>
        <t>Implementations SHOULD provide access to the following
        operational statistics:</t>

        <ul>
          <li>Per-flow, per-Cycle-ID packet and byte counters</li>
          <li>Keepalive packets generated (per flow)</li>
          <li>Keepalive packets received (per flow)</li>
          <li>Cycle ID errors detected</li>
          <li>Cycle ID sequence gaps detected</li>
        </ul>
      </section>
    </section>

    <section anchor="security-considerations">
      <name>Security Considerations</name>
        <t>The security considerations of <xref target="RFC9197"/>
      apply to this extension. The following additional
      considerations are specific to the Cycle ID mechanism.</t>

      <t>The Cycle ID field is a 2-bit value that indicates the
      measurement interval. An on-path attacker could modify the
      Cycle ID value, causing incorrect statistics reporting at
      the decapsulating node. Implementations operating outside
      a single administrative trust domain SHOULD protect IOAM
      data integrity using mechanisms such as those described in
      <xref target="RFC9197"/> Section 5.</t>

      <t>The keepalive packet generation mechanism could be abused
      by an attacker who suppresses user data packets, causing
      the encapsulating node to generate keepalive packets
      continuously. Implementations SHOULD monitor keepalive
      generation rates and alert operators when abnormal patterns
      are detected.</t>

      <t>Statistics counters maintained by transit and
      decapsulating nodes are local state and are not exposed in
      the data plane. Access to these counters through management
      interfaces SHOULD be protected by authentication and
      authorization mechanisms.</t>
    </section>

    <section anchor="iana-considerations">
      <name>IANA Considerations</name>

      <section anchor="iana-option-type">
        <name>IOAM Option-Type Registry</name>
        <t>This document requests IANA to allocate a new Option-Type
        from the "IOAM Option-Type" registry defined in
        <xref target="RFC9197"/>.</t>

        <table anchor="tab-iana-option">
          <name>IOAM Option-Type Allocation Request</name>
          <thead>
            <tr>
              <th>Value</th>
              <th>Description</th>
              <th>Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>TBD1</td>
              <td>IOAM Cycle ID Option</td>
              <td>[This Document]</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="iana-flags">
        <name>IOAM Cycle ID Flags Registry</name>
        <t>This document requests IANA to create a new registry
        titled "IOAM Cycle ID Flags" under the "In-situ OAM (IOAM)"
        registry group.</t>

        <t>The registry contains 1-bit flags. The initial contents
        of the registry are:</t>

        <table anchor="tab-iana-flags">
          <name>IOAM Cycle ID Flags Registry</name>
          <thead>
            <tr>
              <th>Bit Position</th>
              <th>Name</th>
              <th>Description</th>
              <th>Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0</td>
              <td>K</td>
              <td>Keepalive Flag</td>
              <td>[This Document]</td>
            </tr>
          </tbody>
        </table>

        <t>Future assignments in this registry require Standards
        Action <xref target="RFC8126"/>.</t>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119"
                   target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement
            Levels</title>
            <author fullname="S. Bradner" initials="S."
                    surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>

        <reference anchor="RFC8174"
                   target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119
            Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC9197"
                   target="https://www.rfc-editor.org/info/rfc9197">
          <front>
            <title>Data Fields for In Situ Operations,
            Administration, and Maintenance (IOAM)</title>
            <author fullname="F. Brockners" initials="F."
                    surname="Brockners" role="editor"/>
            <author fullname="S. Bhandari" initials="S."
                    surname="Bhandari" role="editor"/>
            <author fullname="T. Mizrahi" initials="T."
                    surname="Mizrahi" role="editor"/>
            <date month="May" year="2022"/>
          </front>
          <seriesInfo name="RFC" value="9197"/>
          <seriesInfo name="DOI" value="10.17487/RFC9197"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="RFC4303"
                   target="https://www.rfc-editor.org/info/rfc4303">
          <front>
            <title>IP Encapsulating Security Payload (ESP)</title>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="December" year="2005"/>
          </front>
          <seriesInfo name="RFC" value="4303"/>
          <seriesInfo name="DOI" value="10.17487/RFC4303"/>
        </reference>

        <reference anchor="RFC8126"
                   target="https://www.rfc-editor.org/info/rfc8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations
            Section in RFCs</title>
            <author fullname="M. Cotton" initials="M."
                    surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T."
                    surname="Narten"/>
            <date month="June" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>

        <reference anchor="RFC9326"
                   target="https://www.rfc-editor.org/info/rfc9326">
          <front>
            <title>In Situ Operations, Administration, and
            Maintenance (IOAM) Direct Exporting</title>
            <author fullname="H. Song" initials="H." surname="Song"/>
            <author fullname="B. Gafni" initials="B." surname="Gafni"/>
            <author fullname="F. Brockners" initials="F."
                    surname="Brockners"/>
            <author fullname="S. Bhandari" initials="S."
                    surname="Bhandari"/>
            <author fullname="T. Mizrahi" initials="T."
                    surname="Mizrahi"/>
            <date month="November" year="2022"/>
          </front>
          <seriesInfo name="RFC" value="9326"/>
          <seriesInfo name="DOI" value="10.17487/RFC9326"/>
        </reference>
      </references>
    </references>

    <section anchor="examples" numbered="true">
      <name>Processing Examples</name>
      <t>This appendix provides non-normative examples of
      packet-triggered reporting behavior.</t>

      <section anchor="example-normal">
        <name>Normal Operation</name>
        <t>Consider a flow with continuous traffic. The
        encapsulating node operates with a 1-second measurement
        interval:</t>

        <artwork type="ascii-art"><![CDATA[
Time (s)  Cycle ID   Encap Action          Decap Action
--------  --------   ------------------    ------------------
0.0-1.0      0       Assign CID=0          Receive CID=0
                     Count packets         Count packets
                                           (Initialize)

1.0-2.0      1       Assign CID=1          Receive CID=1
                     Count packets         Trigger: report CID=3
                                           (No data for CID=3)
                                           Count packets

2.0-3.0      2       Assign CID=2          Receive CID=2
                     Report CID=0 stats    Trigger: report CID=0
                     Count packets         Count packets

3.0-4.0      3       Assign CID=3          Receive CID=3
                     Report CID=1 stats    Trigger: report CID=1
                     Count packets         Count packets
]]></artwork>
      </section>

      <section anchor="example-keepalive">
        <name>Keepalive Generation</name>
        <t>Consider a flow with intermittent traffic where no
        packets are transmitted during Cycle ID=1:</t>

        <artwork type="ascii-art"><![CDATA[
Time (s)  Cycle ID   Traffic    Encap Action
--------  --------   --------   ---------------------------
0.0-1.0      0       Present    Assign CID=0, count packets
1.0-2.0      1       None       Generate keepalive (CID=1, K=1)
2.0-3.0      2       Present    Assign CID=2, count packets
]]></artwork>
      </section>
    </section>

    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>TBD</t>
    </section>
  </back>
</rfc>