<?xml version='1.0' encoding='utf8'?>
<rfc version="3" category="std" ipr="trust200902" submissionType="IETF" consensus="true" docName="draft-yang-opsawg-ipfix-rocev2-sequence-00" tocInclude="true" symRefs="true" sortRefs="true">
  <front>
    <title abbrev="RoCEv2 Sequence Observations">IPFIX Export of RoCEv2 Sequence Observations</title>
    <author fullname="Jin Yang" initials="J." surname="Yang">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>yangjinwl@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Weiqiang Cheng" initials="W." surname="Cheng">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>chengweiqiang@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Tingting Han" initials="T." surname="Han">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>hantingting@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec</organization>
      <address>
        <postal>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>wangjj@centec.com</email>
      </address>
    </author>
    <author fullname="Li Wang" initials="L." surname="Wang">
      <organization>Centec</organization>
      <address>
        <postal>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>wangl@centec.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="30"/>
    <area>Operations and Management</area>
    <workgroup>Individual Submission</workgroup>
    <abstract>
      <t>This document specifies an IP Flow Information Export (IPFIX) metering and export profile for bounded Packet Sequence Number (PSN) observations on provisioned RoCEv2 Reliable Connection SEND and RDMA WRITE request streams. It defines cumulative observations of skipped, subsequently observed, expired, repeated, and unclassified sequence positions, with explicit observation epochs and qualification flags.</t>
      <t>The profile requires complete observation of the provisioned stream and defines no packet-loss estimator, retransmission detector, or congestion-control action. Twelve Information Elements describe the observation state. Existing RoCEv2 header Information Elements identify the monitored stream.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Two metering implementations can see the same PSNs yet report different gap counts if they use different history, initialization, or closure rules. A common export profile is useful when a collector consumes such observations from multiple implementations and must distinguish unresolved history from observed packets. The interoperability target is the interpretation of exported measurements, not an implementation-specific packet-processing architecture.</t>
      <t><xref target="I-D.lin-opsawg-ipfix-rocev2"/> defines raw RoCEv2 BTH Information Elements. Those fields remain useful for packet traces and validation. This document reuses its destination QP and partition identifiers and adds an explicitly specified summary. A raw-field export need not export every packet; however, a sampled packet trace cannot reconstruct the exact state of this profile. No throughput or export-volume improvement is claimed without measurement.</t>
      <t>A shared collector may correlate queue and sequence observations, but such correlation alone does not establish which link lost a packet or whether an ECN policy is effective. A sequence position may be observed after reordering, a retry, duplication, or a capture fault. These causes cannot in general be distinguished by the counters defined here.</t>
    </section>
    <section anchor="requirements">
      <name>Requirements Language</name>
      <t>The key words <bcp14>MUST</bcp14>, <bcp14>MUST NOT</bcp14>, <bcp14>REQUIRED</bcp14>, <bcp14>SHOULD</bcp14>, <bcp14>SHOULD NOT</bcp14>, <bcp14>RECOMMENDED</bcp14>, <bcp14>MAY</bcp14>, and <bcp14>OPTIONAL</bcp14> 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 anchor="profile">
      <name>Applicability and Provisioning</name>
      <t>The profile covers only a provisioned, unidirectional RoCEv2 Reliable Connection request stream using BTH OpCodes 0x00 through 0x0B: SEND and RDMA WRITE, including the immediate-data variants in that range. Originally transmitted requests advance by one PSN modulo 2^24. Other RC operations, UC, UD, XRC, and inferred READ spans are outside this profile. Provisioning <bcp14>MUST</bcp14> establish the operation restriction for the whole connection, rather than merely filter the listed opcodes.</t>
      <t>RDMA READ can reserve sequence space for response packets; <xref target="LINUX-RXE"/> provides a public implementation example. Filtering READ from a mixed stream does not make its remaining request PSNs consecutive. An observed unsupported request or malformed request attributable to the provisioned connection <bcp14>MUST</bcp14> close the epoch with profileViolation and disable metering for that connection until explicitly reprovisioned. The offending packet is not counted. A subsequent SEND or WRITE <bcp14>MUST NOT</bcp14> automatically re-enable the profile. Response packets and CNPs do not change this request state.</t>
      <t>The observation point <bcp14>MUST</bcp14> process all request packets in the provisioned scope, without sampling, selective omission, or known capture loss, and <bcp14>MUST</bcp14> cover all paths carrying that stream. A single ECMP branch without complete coverage is not sufficient. Deployment provisioning <bcp14>MUST</bcp14> establish namespace separation and path coverage. If capture completeness cannot be established, this profile <bcp14>MUST NOT</bcp14> be enabled. A capture gap closes affected epochs with captureDiscontinuity; metering resumes only after complete observation has been re-established and starts fresh state. An unclassifiable capture fault affecting several contexts closes all contexts that may be affected.</t>
      <t>Serial interpretation also requires that a packet cannot legitimately be separated from the current high-water position by half or more of the PSN serial space, including very old retries. This is an applicability condition, not something a 24-bit field alone can verify. If endpoint behavior or retention bounds cannot establish it, this profile <bcp14>MUST NOT</bcp14> be used for that connection. Known violations close the epoch. An exactly half-space distance is always treated as ambiguous.</t>
    </section>
    <section anchor="identity">
      <name>Identity and Epoch Lifecycle</name>
      <t>The record key comprises the IPFIX Transport Session, Observation Domain ID, observationPointId, source and destination IP addresses of the RoCEv2 packet, rdmaDestinationQP, rdmaPartitionKey, any additional tenant or tunnel namespace required to avoid collisions, and rdmaSequenceEpochId. A physical interface identifier alone is not a tenant namespace. Address family and encapsulation layer <bcp14>MUST</bcp14> be fixed and unambiguous in each Template. UDP source port <bcp14>MUST NOT</bcp14> split a connection context.</t>
      <t>The Exporting Process <bcp14>MUST</bcp14> allocate a nonzero, monotonically increasing epoch ID across all contexts in each Transport Session and Observation Domain when the first report of that epoch is serialized. Thus first reports are serialized in increasing epoch-ID order; the ID does not order the first packet times. An ID <bcp14>MUST NOT</bcp14> be reused in that scope. IDs need not be consecutive at a collector. A new Transport Session starts fresh metering state. An epoch is closed on a known connection-generation change, idle expiration, policy or window change, capture discontinuity, profile violation, resource eviction, serial discontinuity, or impending counter/report-ID exhaustion.</t>
      <t>Unless connection generation is independently established by trusted provisioning or endpoint integration, every report <bcp14>MUST</bcp14> set generationUnverified. A local epoch is not proof of a connection lifetime. Neither an idle timer nor an apparently new initial PSN proves that destination QP reuse was detected. Known connection restarts <bcp14>MUST NOT</bcp14> be joined even if addresses, QP, and PSN repeat.</t>
      <t>A serial discontinuity caused by a valid eligible request closes the old epoch before counting that request, then starts a new epoch with that request. The request is counted exactly once. Other closure causes require the applicable validity conditions to be re-established before restart. A final snapshot abandons all pending positions. If it cannot be exported because of failure or resource exhaustion, the collector sees an incomplete epoch; a final record is never fabricated by the collector.</t>
    </section>
    <section anchor="algorithm">
      <name>Bounded Sequence Observation Algorithm</name>
      <t>Let M=2^24 and 1&lt;=W&lt;=2^22. The exporter maintains a local extended integer H, a fixed initial extended position S, and a retained interval [L,H], where L=max(S,H-W+1). Retained positions are either SEEN or PENDING. Positions before S or before L are unclassified, including positions numerically within W of H but preceding the first observed request. No initialized prefix is presumed seen or pending. Local extended integers are not exported PSN values.</t>
      <t>For an arriving PSN p, compute u=(p-(H mod M)) mod M. If u=M/2, comparison is ambiguous. Otherwise d=u for u&lt;M/2, and d=u-M for u&gt;M/2. This uses the serial comparison boundary in <xref target="RFC1982"/>. Implementations <bcp14>MUST</bcp14> use checked arithmetic for counters and local extended positions; they <bcp14>MUST</bcp14> close and restart before overflow rather than wrap a cumulative counter.</t>
      <table anchor="transitions">
        <name>Per-Request Transitions</name>
        <thead>
          <tr>
            <th>Condition</th>
            <th>Required action</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>No active epoch</td>
            <td>Set S=H=p; retain only p as SEEN; requests=1; all other counters=0.</td>
          </tr>
          <tr>
            <td>u=M/2 or d&gt;W</td>
            <td>Close with serialDiscontinuity; start fresh state with p; do not account p to the old epoch.</td>
          </tr>
          <tr>
            <td>1&lt;=d&lt;=W</td>
            <td>Count request; add H+1 through H+d-1 as PENDING and add d-1 to skipped; advance H by d; mark H SEEN; expire each pending position below new L once.</td>
          </tr>
          <tr>
            <td>d&lt;=0 and H+d in [L,H] is PENDING</td>
            <td>Count request; change that position to SEEN; increment filled once.</td>
          </tr>
          <tr>
            <td>d&lt;=0 and H+d in [L,H] is SEEN</td>
            <td>Count request; increment repeated.</td>
          </tr>
          <tr>
            <td>d&lt;=0 and H+d&lt;L</td>
            <td>Count request; increment unclassifiedLate; do not change H or retained state.</td>
          </tr>
        </tbody>
      </table>
      <t>At most W position labels are retained. Ordinary reports do not reset counters or pending state. On closure, add the number of pending positions to abandoned and clear pending. A position can be filled or expired or abandoned, never more than one of these. Expiry is caused by high-water advance, not by an elapsed-time estimate of network loss.</t>
      <artwork type="ascii-art">skipped = filled + expired + abandoned + pending
0 &lt;= pending &lt;= W - 1
repeated + unclassifiedLate + filled &lt;= requests - 1
</artwork>
      <t>These relationships <bcp14>MUST</bcp14> hold at every snapshot. Abandoned is zero in an active epoch and pending is zero in a final epoch. Their validity establishes internal accounting only. A malicious exporter can satisfy them with fabricated measurements.</t>
    </section>
    <section anchor="export">
      <name>Export Profile and Template</name>
      <t>This profile uses IPFIX over TCP <xref target="RFC7011"/> to order reports from an Exporting Process. A profile implementation <bcp14>MUST</bcp14> support this binding. Selecting TCP for this profile does not remove the general implementation requirements of RFC 7011, including its SCTP requirement, and does not update that RFC. Reconnection creates a new session and new epochs. TCP reliability does not guarantee delivery of a final report after process or connection failure.</t>
      <t>Each Data Record <bcp14>MUST</bcp14> contain every field listed in <xref target="template-fields"/>, plus any required namespace keys. It <bcp14>MUST</bcp14> be an atomic snapshot of a single epoch. All counters are cumulative from the first accounted request. The report ID starts at one and increments once per serialized snapshot; retransmission of an identical snapshot retains its ID. The ID and each total counter <bcp14>MUST NOT</bcp14> wrap. flowStartMilliseconds and flowEndMilliseconds are the first and last accounted packet arrival times; they do not measure the export delay or the final closure time.</t>
      <t>A Template <bcp14>MUST</bcp14> use exactly one address family. A field is not conditionally omitted within a record. All named fields occur once in this profile. The exporter <bcp14>MUST</bcp14> advertise the Flow Keys using the Flow Keys Options Template in RFC 7011, including record-level namespace and epoch identifiers but excluding report ID. The Transport Session and Observation Domain are outer context. An observationPointId change requires a new epoch. The unassigned identifiers in this draft and its dependency are not usable wire numbers.</t>
      <table anchor="template-fields">
        <name>Profile Fields in Example Order</name>
        <thead>
          <tr>
            <th>Information Element</th>
            <th>Octets</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>observationPointId</td>
            <td>8</td>
          </tr>
          <tr>
            <td>sourceIPv4Address / sourceIPv6Address</td>
            <td>4 / 16</td>
          </tr>
          <tr>
            <td>destinationIPv4Address / destinationIPv6Address</td>
            <td>4 / 16</td>
          </tr>
          <tr>
            <td>rdmaDestinationQP</td>
            <td>4</td>
          </tr>
          <tr>
            <td>rdmaPartitionKey</td>
            <td>2</td>
          </tr>
          <tr>
            <td>flowStartMilliseconds</td>
            <td>8</td>
          </tr>
          <tr>
            <td>flowEndMilliseconds</td>
            <td>8</td>
          </tr>
          <tr>
            <td>rdmaSequenceEpochId</td>
            <td>8</td>
          </tr>
          <tr>
            <td>rdmaSequenceReportId</td>
            <td>8</td>
          </tr>
          <tr>
            <td>rdmaSequenceWindow</td>
            <td>4</td>
          </tr>
          <tr>
            <td>rdmaSequenceFlags</td>
            <td>2</td>
          </tr>
          <tr>
            <td>skippedPsnTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>filledPsnTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>expiredPsnTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>abandonedPsnTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>pendingPsnCount</td>
            <td>4</td>
          </tr>
          <tr>
            <td>repeatedPsnTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>requestPacketTotalCount</td>
            <td>8</td>
          </tr>
          <tr>
            <td>unclassifiedLatePacketTotalCount</td>
            <td>8</td>
          </tr>
        </tbody>
      </table>
      <t>With assigned standard IEs, no extra namespace fields, and full-length encodings as shown, there are 19 fields: 120 octets per IPv4 Data Record or 144 per IPv6 Data Record. The Template Record is 80 octets (4+19*4); its containing Template Set is 84 octets before any padding. These are distinct from the IPFIX Message length. An enterprise-specific field adds a four-octet PEN to its Field Specifier; therefore these Template lengths do not apply unchanged to experimental PEN mappings. No Template ID is reserved by this profile. Other legal integer lengths require explicit agreement and <bcp14>MUST</bcp14> retain the same semantics.</t>
      <t>The destination QP uses the unsigned32 definition from <xref target="I-D.lin-opsawg-ipfix-rocev2"/>, with its upper eight bits zero. rdmaPartitionKey is unsigned16. Both remain dependent on the referenced individual proposal; its progression or allocation is not assumed. Prior to publication, the definitions and assignments must be resolved with that work or replaced through explicit review, rather than silently inventing competing fields.</t>
    </section>
    <section anchor="collector">
      <name>Collector Processing</name>
      <t>The collector <bcp14>MUST</bcp14> validate Template bindings, field ranges, required keys, and the arithmetic relationships in <xref target="algorithm"/>. It compares cumulative counters only for an identical full epoch key. Window, connection-generation qualification, flow start time, and namespace are immutable within the epoch. Closure-reason flags appear only in final records. Each final record has pending zero; each non-final record has abandoned zero. Unknown flag bits make the record an unsupported qualification; the collector <bcp14>MUST</bcp14> preserve the raw record and <bcp14>MUST NOT</bcp14> derive unqualified measurements from it.</t>
      <t>For a retained epoch, a larger report ID is processed only if total counters do not decrease and immutable fields agree. A report gap, including a first received ID greater than one, marks missing report coverage. It does not invalidate an otherwise self-consistent cumulative total, but differences across the gap <bcp14>MUST NOT</bcp14> be assigned to the missing subintervals. An identical repeat of the latest report ID is ignored; different decoded content for that ID invalidates the epoch. A smaller report ID is stale and <bcp14>MUST NOT</bcp14> modify already published values. An implementation <bcp14>MAY</bcp14> keep older raw records for offline validation.</t>
      <t>After an accepted final record, no larger report ID can extend that epoch. A conflicting or extending record received while closure state is retained invalidates it. Collectors <bcp14>MUST</bcp14> set finite resource and retention limits and expose those limits to their operators. On retirement, they <bcp14>MUST</bcp14> preserve an outcome of complete, incomplete, or invalid in the stored result. Offline recomputation from an explicit archive is a separate operation.</t>
      <t>For bounded retirement, the collector retains an epoch-admission high-water ID per Transport Session and Observation Domain. It first looks up retained context by epoch ID, rejecting a changed full key for that ID. For an unknown epoch, an ID at or below the high-water ID is an orphan and <bcp14>MUST NOT</bcp14> create or reopen context. An unknown larger ID advances the high-water ID, including when admission is refused because of resource limits. It can create a new context with missing initial reports explicitly qualified. This rule relies on the specified ordering of first reports. Retirement therefore needs no unbounded tombstone set. The high-water ID is cleared only with a new Transport Session. A collector <bcp14>MUST NOT</bcp14> silently forget it while continuing that session.</t>
      <t>Silence alone is not a final report. A session failure or configured inactivity timeout without finalEpoch leaves the epoch incomplete. Complete report coverage requires reports from ID one through a valid final record without report gaps; metering qualifications still apply and this does not imply coverage of an entire connection lifetime. A missing final does not erase useful observed counters, but outstanding positions remain unresolved. Collectors <bcp14>MUST</bcp14> distinguish metering qualifications, report gaps, and collector resource drops from network loss.</t>
      <t>Expired positions <bcp14>MUST NOT</bcp14> be labeled lost packets. Repeated PSNs <bcp14>MUST NOT</bcp14> be labeled confirmed retransmissions. Filled positions <bcp14>MUST NOT</bcp14> be labeled proven reorderings. Aggregate counters from different observation points <bcp14>MUST NOT</bcp14> be subtracted to claim a loss location: the records lack common event identities, and windows, paths, and epochs may differ.</t>
    </section>
    <section anchor="ies">
      <name>Information Element Definitions</name>
      <t>The following definitions follow <xref target="RFC7012"/> and <xref target="RFC7013"/>. Each requested IE has status current and reference RFC XXXX. TBD labels denote unassigned Element IDs. The units none are intentional for sequence-position quantities; packets is used only for counts of observed packet arrivals.</t>
      <section anchor="ie-1">
        <name>rdmaSequenceEpochId</name>
        <t>Nonzero epoch identifier allocated monotonically across contexts in a Transport Session and Observation Domain. It is never reused within that scope.</t>
        <table anchor="ie-metadata-1">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD1</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>identifier</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-2">
        <name>rdmaSequenceReportId</name>
        <t>Snapshot identifier starting at one and increasing per serialized report within an epoch. Retransmission of an identical snapshot retains the identifier.</t>
        <table anchor="ie-metadata-2">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD2</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>identifier</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-3">
        <name>rdmaSequenceWindow</name>
        <t>Configured history width W in PSN positions, 1 through 4194304; constant throughout an epoch. A position is a serial-space value, not a claim about a distinct network packet.</t>
        <table anchor="ie-metadata-3">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD3</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned32</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>quantity</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-4">
        <name>rdmaSequenceFlags</name>
        <t>Numeric qualification masks defined in the flags table; serialized in network byte order.</t>
        <table anchor="ie-metadata-4">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD4</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned16</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>flags</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-5">
        <name>skippedPsnTotalCount</name>
        <t>Number of sequence positions introduced as PENDING by bounded forward advances since epoch creation.</t>
        <table anchor="ie-metadata-5">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD5</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-6">
        <name>filledPsnTotalCount</name>
        <t>Number of PENDING positions changed to SEEN while retained. A position contributes at most once.</t>
        <table anchor="ie-metadata-6">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD6</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-7">
        <name>expiredPsnTotalCount</name>
        <t>Number of PENDING positions retired by high-water advance outside the retained window.</t>
        <table anchor="ie-metadata-7">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD7</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-8">
        <name>abandonedPsnTotalCount</name>
        <t>Number of PENDING positions retired at epoch closure. Zero before closure.</t>
        <table anchor="ie-metadata-8">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD8</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-9">
        <name>pendingPsnCount</name>
        <t>Current PENDING positions; at most W-1 and zero on closure.</t>
        <table anchor="ie-metadata-9">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD9</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned32</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>quantity</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>none</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-10">
        <name>repeatedPsnTotalCount</name>
        <t>Number of accounted packets whose PSN maps to an already SEEN retained position.</t>
        <table anchor="ie-metadata-10">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD10</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>packets</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-11">
        <name>requestPacketTotalCount</name>
        <t>All eligible requests accounted to the epoch, including its first request, repeated arrivals, and unclassified late arrivals. Excludes offending profile-violation packets and responses.</t>
        <table anchor="ie-metadata-11">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD11</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>packets</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="ie-12">
        <name>unclassifiedLatePacketTotalCount</name>
        <t>Accounted requests that map before L, including before the first observed position S. Their earlier observation status is not known.</t>
        <table anchor="ie-metadata-12">
          <name>Registration Properties</name>
          <thead>
            <tr>
              <th>Property</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Element ID</td>
              <td>TBD12</td>
            </tr>
            <tr>
              <td>Abstract Data Type</td>
              <td>unsigned64</td>
            </tr>
            <tr>
              <td>Data Type Semantics</td>
              <td>totalCounter</td>
            </tr>
            <tr>
              <td>Units</td>
              <td>packets</td>
            </tr>
            <tr>
              <td>Range</td>
              <td>As specified in the description and profile</td>
            </tr>
            <tr>
              <td>Status</td>
              <td>current</td>
            </tr>
            <tr>
              <td>Reference</td>
              <td>RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="flags">
        <name>Qualification Flags</name>
        <t>The following hexadecimal masks, not bit positions in a drawing, define the wire value. Closure causes can be combined. generationUnverified is set in every report unless generation was independently established. Other defined reason bits <bcp14>MUST</bcp14> be zero in non-final reports; finalEpoch alone permits ordinary closure. Senders <bcp14>MUST</bcp14> set undefined bits to zero.</t>
        <table anchor="flag-masks">
          <name>Defined Masks</name>
          <thead>
            <tr>
              <th>Mask</th>
              <th>Name</th>
              <th>Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0x0001</td>
              <td>finalEpoch</td>
              <td>Epoch is closed.</td>
            </tr>
            <tr>
              <td>0x0002</td>
              <td>profileViolation</td>
              <td>Unsupported or malformed request/profile violation.</td>
            </tr>
            <tr>
              <td>0x0004</td>
              <td>captureDiscontinuity</td>
              <td>Complete observation interrupted.</td>
            </tr>
            <tr>
              <td>0x0008</td>
              <td>stateExhaustion</td>
              <td>Context resource eviction.</td>
            </tr>
            <tr>
              <td>0x0010</td>
              <td>serialDiscontinuity</td>
              <td>Unsupported jump or ambiguous serial interpretation.</td>
            </tr>
            <tr>
              <td>0x0020</td>
              <td>generationUnverified</td>
              <td>Connection generation not independently established.</td>
            </tr>
            <tr>
              <td>0xFFC0</td>
              <td>Unassigned</td>
              <td>Reserved for future IANA assignment.</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="examples">
      <name>Verification Examples</name>
      <t>With W=4 and PSNs 100,102,101,103,102: requests=5, skipped=1, filled=1, repeated=1, pending=expired=abandoned=unclassifiedLate=0. These observations are compatible with multiple network histories.</t>
      <t>With W=4 and PSNs 100,99,100: position 99 precedes S even though it lies inside the nominal width. The result is requests=3, unclassifiedLate=1, repeated=1, skipped=filled=pending=0. Treating 99 as an initialized missing or previously seen position is incorrect.</t>
      <t>With W=4 and PSNs 100,102,106: skipped=4, expired=1, pending=3. Closing produces abandoned=3 and pending=0. A later packet cannot fill the closed result.</t>
      <t>PSNs 16777214,16777215,0,1 advance continuously with no skipped positions. A jump of 2^23 closes as ambiguous. With W=1, any forward advance greater than one starts a fresh epoch; no pending positions exist.</t>
      <t>An observed READ disables the provisioned profile, including after subsequent SEND packets. A capture fault requires a fresh epoch after capture validity returns. Neither mechanism carries pending state across the interruption.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>The IPFIX security considerations in <xref target="RFC7011"/> apply. Exporters and collectors for this profile <bcp14>MUST</bcp14> support TLS 1.3 <xref target="RFC8446"/> over TCP and <bcp14>MUST</bcp14> use mutually authenticated, confidential export sessions with explicitly authorized peers. Current TLS deployment guidance is in <xref target="RFC9325"/>. A transport reconnect changes the epoch scope even when certificates identify the same exporter.</t>
      <t>Addresses, QP identifiers, partition identifiers, and times can reveal tenant activity. Operators <bcp14>SHOULD</bcp14> restrict observation and retention to the required scope and authorize collector access. Malformed packets and fabricated identities can exhaust state or induce closure storms. Exporters <bcp14>MUST</bcp14> bound concurrent contexts and window size, restrict provisioning to authorized scopes, and expose capture/resource failures. Resource controls can lose reports; they <bcp14>MUST NOT</bcp14> silently convert incomplete observations into complete results.</t>
      <t>An authenticated exporter may still be faulty or compromised. Arithmetic validation does not establish truth. This profile supplies no instructions to endpoints and <bcp14>MUST NOT</bcp14> be used as authoritative evidence to force retransmission or disable congestion feedback.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to allocate the twelve IEs in <xref target="ies"/> in the IPFIX Information Elements registry <xref target="IANA-IPFIX"/>. No numeric IDs are requested. Experimental implementations <bcp14>MUST</bcp14> use enterprise-specific IEs under an assigned PEN and an explicitly shared mapping; they <bcp14>MUST NOT</bcp14> use TBD labels or unassigned standard numbers as wire values.</t>
      <t>IANA is also requested to create an rdmaSequenceFlags registry within IPFIX assignments. Entries are individual unsigned16 masks, description, and reference. Initial entries are masks 0x0001 through 0x0020 in <xref target="flag-masks"/>; individual masks 0x0040 through 0x8000 are unassigned. The registration policy is Specification Required <xref target="RFC8126"/>. Review must verify a nonoverlapping mask and define epoch/collector compatibility. A change to the observation algorithm or a new operation profile requires explicit version or IE separation; a flag alone <bcp14>MUST NOT</bcp14> silently redefine existing counters.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="I-D.lin-opsawg-ipfix-rocev2" target="https://datatracker.ietf.org/doc/html/draft-lin-opsawg-ipfix-rocev2-01">
        <front>
          <title>Export of RoCEv2 Base Transport Header (BTH) Information Using IP Flow Information Export (IPFIX)</title>
          <author initials="C." surname="Lin"/>
          <author initials="H." surname="Zhang"/>
          <date year="2026" month="September" day="1"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-lin-opsawg-ipfix-rocev2-01"/>
      </reference>
      <reference anchor="RFC1982" target="https://www.rfc-editor.org/info/rfc1982">
        <front>
          <title>Serial Number Arithmetic</title>
          <author initials="R." surname="Elz"/>
          <author initials="R." surname="Bush"/>
          <date year="1996" month="August"/>
        </front>
        <seriesInfo name="RFC" value="1982"/>
        <seriesInfo name="DOI" value="10.17487/RFC1982"/>
      </reference>
      <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 initials="S." surname="Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC7011" target="https://www.rfc-editor.org/info/rfc7011">
        <front>
          <title>Specification of the IP Flow Information Export (IPFIX) Protocol for the Exchange of Flow Information</title>
          <author initials="B." surname="Claise" role="editor"/>
          <author initials="B." surname="Trammell" role="editor"/>
          <author initials="P." surname="Aitken"/>
          <date year="2013" month="September"/>
        </front>
        <seriesInfo name="STD" value="77"/>
        <seriesInfo name="RFC" value="7011"/>
        <seriesInfo name="DOI" value="10.17487/RFC7011"/>
      </reference>
      <reference anchor="RFC7012" target="https://www.rfc-editor.org/info/rfc7012">
        <front>
          <title>Information Model for IP Flow Information Export (IPFIX)</title>
          <author initials="B." surname="Claise" role="editor"/>
          <author initials="B." surname="Trammell" role="editor"/>
          <date year="2013" month="September"/>
        </front>
        <seriesInfo name="RFC" value="7012"/>
        <seriesInfo name="DOI" value="10.17487/RFC7012"/>
      </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 initials="B." surname="Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446">
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author initials="E." surname="Rescorla"/>
          <date year="2018" month="August"/>
        </front>
        <seriesInfo name="RFC" value="8446"/>
        <seriesInfo name="DOI" value="10.17487/RFC8446"/>
      </reference>
    </references>
    <references>
      <name>Informative References</name>
      <reference anchor="IANA-IPFIX" target="https://www.iana.org/assignments/ipfix">
        <front>
          <title>IP Flow Information Export (IPFIX) Entities</title>
          <author>
            <organization>IANA</organization>
          </author>
        </front>
      </reference>
      <reference anchor="LINUX-RXE" target="https://github.com/torvalds/linux/blob/master/drivers/infiniband/sw/rxe/rxe_req.c">
        <front>
          <title>Linux Kernel Soft-RoCE (RXE) Requester PSN Allocation Implementation</title>
          <author>
            <organization>Linux Kernel Organization</organization>
          </author>
        </front>
      </reference>
      <reference anchor="RFC7013" target="https://www.rfc-editor.org/info/rfc7013">
        <front>
          <title>Guidelines for Authors and Reviewers of IP Flow Information Export (IPFIX) Information Elements</title>
          <author initials="B." surname="Trammell"/>
          <author initials="B." surname="Claise"/>
          <date year="2013" month="September"/>
        </front>
        <seriesInfo name="BCP" value="184"/>
        <seriesInfo name="RFC" value="7013"/>
        <seriesInfo name="DOI" value="10.17487/RFC7013"/>
      </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>
            <organization>RFC Editor</organization>
          </author>
          <date year="2017" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8126"/>
      </reference>
      <reference anchor="RFC9325" target="https://www.rfc-editor.org/info/rfc9325">
        <front>
          <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
          <author>
            <organization>RFC Editor</organization>
          </author>
          <date year="2022" month="November"/>
        </front>
        <seriesInfo name="RFC" value="9325"/>
      </reference>
    </references>
  </back>
</rfc>
