<?xml version='1.0' encoding='UTF-8'?>
<rfc version="3" docName="draft-li-rdma-crem-00" category="std" consensus="true" submissionType="IETF" ipr="trust200902" tocInclude="true" tocDepth="3" sortRefs="true" symRefs="true" xml:lang="en">

  <front>
    <title abbrev="CREM for RDMA">Congestion-Aware Reliability Enhancement Mechanism (CREM) for RDMA over IP Networks</title>
    <seriesInfo name="Internet-Draft" value="draft-li-rdma-crem-00"/>

    <author fullname="Zhiqiang Li" initials="Z." surname="Li">
      <organization>China Mobile</organization>
      <address>
        <postal><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><city>Beijing</city><code>100053</code>
        <country>China</country></postal>
        <email>duzongpeng@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>201203</code>
        <country>China</country></postal>
        <email>wangjj@centec.com</email>
      </address>
    </author>
    <author fullname="Wei Cheng" initials="W." surname="Cheng">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>201203</code>
        <country>China</country></postal>
        <email>chengw@centec.com</email>
      </address>
    </author>
    <author fullname="Ying Zhao" initials="Y." surname="Zhao">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>200000</code>
        <country>China</country></postal>
        <email>zhaoying@centec.com</email>
      </address>
    </author>
    <author fullname="Chunhao Zhao" initials="C." surname="Zhao">
      <organization>SAIA</organization>
      <address>
        <postal><city>Shanghai</city><code>200125</code>
        <country>China</country></postal>
        <email>chunhao.zhao@sh-aia.com</email>
      </address>
    </author>
    <author fullname="Xun Sun" initials="X." surname="Sun">
      <organization>Inesa</organization>
      <address>
        <postal><city>Shanghai</city><code>200030</code>
        <country>China</country></postal>
        <email>sunxun@inesa.com</email>
      </address>
    </author>

    <date year="2026" month="November" day="2"/>
    <area>Web and Internet Transport</area>
    <keyword>RDMA</keyword>
    <keyword>RoCEv2</keyword>
    <keyword>forward erasure correction</keyword>
    <keyword>coded retransmission</keyword>
    <keyword>Alternate Marking</keyword>
    <keyword>long-distance</keyword>
    <keyword>high BDP</keyword>

    <abstract>
      <t>RDMA transports designed for lossless data center fabrics perform
      poorly over long-distance, high bandwidth-delay product, or lossy IP
      paths: go-back-N retransmission resends whole windows, selective
      repeat costs at least a round trip per loss, and fixed forward
      erasure correction wastes capacity when the path is clean.  This
      document specifies the Congestion-Aware Reliability Enhancement
      Mechanism (CREM), which protects datagram-based RDMA flows without
      modifying their packets.  CREM adds a UDP-encapsulated repair channel
      on which the sender transmits erasure-coded repair symbols computed
      over blocks of RDMA packets, adapts the redundancy to measured loss
      and to whether losses are caused by congestion, and recovers losses
      that exceed the redundancy with a coded retransmission: a number of
      repair symbols, computed only over the lost packets, that is smaller
      than the number of lost packets.  Per-packet retransmission remains as
      the final fallback.  Optional path reports from on-path nodes,
      derived from Alternate Marking measurements or from the nodes' own
      drops, inform the adaptation.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>

      <section anchor="background">
        <name>Background</name>
        <t>RDMA has become the dominant transport for training, inference,
        and storage traffic inside AI data centers.  Deployments now extend
        RDMA across data centers and metropolitan or wide-area links, for
        example to move key-value caches between inference sites or to
        synchronize training across sites
        <xref target="I-D.li-tsvwg-inference-transport"/>.  These paths have
        round-trip times of milliseconds rather than microseconds, carry
        several megabytes of data per round trip, and are not lossless.</t>
        <t>Reliability mechanisms behave very differently on such paths:</t>
        <ul>
          <li>Go-back-N retransmission, the classic behavior of RDMA reliable
          connections, resends every packet after a loss.  A single loss on a
          high-BDP path wastes up to a full window.</li>
          <li>Selective repeat, using SACK or NACK, resends only lost packets
          but adds at least one round trip of latency per loss event and
          requires per-packet state.</li>
          <li>Forward erasure correction (FEC) sends redundancy in advance
          and recovers losses without waiting, but a fixed redundancy level
          either wastes capacity on clean paths or fails on bad ones.</li>
        </ul>
        <t>Which mechanism performs best depends on message size, loss rate,
        and round-trip time, and these change over time.  No interoperable
        mechanism today combines the strengths of retransmission and
        redundancy for RDMA over IP and adapts between them.</t>
      </section>

      <section anchor="overview">
        <name>Overview of CREM</name>
        <t>CREM has three cooperating parts:</t>
        <ol>
          <li>Adaptive forward erasure correction
          (<xref target="adaptive"/>): the sender groups the packets of an
          RDMA flow into source blocks of k consecutive packet sequence
          number positions and sends m repair symbols per block on a separate
          UDP flow.  The pair (k, m) is
          negotiated and changed over a reliable control exchange as the
          observed loss changes.</li>
          <li>Coded retransmission (<xref target="retx"/>): when a block has
          lost more packets than its repair symbols can recover, the receiver
          requests repair, listing the lost packets.  The sender answers with
          new repair symbols computed over the lost packets only; their
          number is the number of lost packets minus the repair symbols the
          receiver already holds.  If that also fails, CREM falls back to
          per-packet retransmission.</li>
          <li>Congestion-aware path feedback (<xref target="feedback"/>):
          receivers report loss and ECN statistics, and on-path nodes
          optionally report per-hop loss and delay measured with Alternate
          Marking <xref target="RFC9341"/>, as well as packets they dropped.
          The sender uses this to tell congestion loss from transmission
          loss: redundancy is increased for the latter but not for the
          former, where it would add to the congestion.</li>
        </ol>
        <t>CREM does not change RDMA packets, RDMA transport semantics, or
        congestion control.  Repair traffic is rate-limited and reacts to
        congestion as specified in <xref target="cc"/>.</t>
      </section>

      <section anchor="scope">
        <name>Scope and Applicability</name>
        <t>This document specifies CREM for RDMA transports that carry each
        packet in a UDP datagram and number packets with a packet sequence
        number (PSN), with RDMA over Converged Ethernet version 2 (RoCEv2)
        <xref target="IBTA-ROCEV2"/> as the defined flow kind.  CREM only
        reads the PSN and the destination queue pair of protected packets.
        RDMA transports over TCP, such as RDMAP <xref target="RFC5040"/> with
        MPA <xref target="RFC5044"/>, are reliable at the TCP layer and do not
        need CREM.</t>
        <t>CREM is intended for limited domains <xref target="RFC8799"/>, such
        as interconnected data centers of one operator.  The CREM sender and
        receiver functions can be implemented in the RDMA NIC, in a host
        shim, or in a gateway at the boundary of a long-distance segment
        that protects all RDMA flows crossing it.</t>
      </section>

      <section anchor="related">
        <name>Relationship to Other Work</name>
        <t>The FEC Framework (FECFRAME) <xref target="RFC6363"/> defines how
        FEC schemes protect arbitrary packet flows; CREM follows its model of
        source blocks and repair flows and uses its construction of source
        symbols from packets, but adds adaptive parameters, coded
        retransmission, and RDMA-specific source identification.
        <xref target="I-D.ietf-dtn-btpu-fec"/> applies FECFRAME to bundle
        transfer; <xref target="I-D.michel-quic-fec"/> and
        <xref target="I-D.dmoskvitin-quic-adaptive-fec"/> add FEC to QUIC.
        <xref target="I-D.chen-rdma-windowless-ack"/> extends acknowledgments
        inside the RDMA transport header; CREM leaves transport headers
        unchanged and can coexist with it.
        <xref target="I-D.hzh-fantel-wan-tunnel"/> and
        <xref target="I-D.sang-fann-fast-network-event-notification"/>
        address fast network notifications for RDMA and AI traffic; the path
        reports of CREM are specific to repair decisions and could be carried
        by a general notification mechanism when one is standardized.
        <xref target="I-D.liu-opsawg-alt-mark-per-packet"/> discusses loss
        localization with Alternate Marking.</t>
      </section>
    </section>

    <section anchor="conventions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
      "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
      NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
      "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT 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>
      <dl newline="false" spacing="normal">
        <dt>Protected flow:</dt><dd>The packets of one RDMA connection in one
        direction, for example all RoCEv2 packets toward one destination
        queue pair.</dd>
        <dt>CREM Sender Function (CSF), CREM Receiver Function (CRF):</dt>
        <dd>The functions at the two ends of a protected flow that implement
        this document.</dd>
        <dt>Source packet:</dt><dd>A packet of the protected flow, unchanged
        by CREM.</dd>
        <dt>Source block:</dt><dd>k source packets with consecutive PSNs,
        starting at the Block Start PSN.</dd>
        <dt>Source symbol:</dt><dd>The octet string derived from a source
        packet for coding (<xref target="symbols"/>).</dd>
        <dt>Repair symbol:</dt><dd>A coded combination of source symbols,
        carried in a REPAIR message.</dd>
        <dt>Repair Index:</dt><dd>The identifier i of a repair symbol within
        its block.</dd>
        <dt>Coded retransmission:</dt><dd>Repair symbols sent in response to a
        repair request and computed over the lost source symbols only.</dd>
        <dt>Repair Session ID:</dt><dd>An identifier that links a coded
        retransmission to the request that triggered it.</dd>
        <dt>Path Reporter:</dt><dd>An on-path node that implements
        <xref target="node-reports"/>.</dd>
      </dl>
    </section>

    <section anchor="architecture">
      <name>Architecture</name>
      <figure anchor="fig-arch">
        <name>CREM Functions and Message Paths</name>
        <artwork type="ascii-art">
 +----------+  source packets (unchanged) +----------+  +----------+
 |   RDMA   |---------------------------&gt;|          |-&gt;|   RDMA   |
 |  sender  |                            |   Path   |  | receiver |
 +----------+                            | Reporter |  +-----^----+
 |   CSF    |--- REPAIR (CREM port) ----&gt;| (option) |-&gt;|   CRF    |
 +----------+                            +----------+  +----------+
                                          restored packets go to the
                                          RDMA receiver via the CRF

 CREM messages (UDP, CREM port):
   CSF      -&gt; CRF : HELLO, PARAM_UPDATE, REPAIR, CLOSE
   CRF      -&gt; CSF : HELLO_ACK, PARAM_ACK, LOSS_REPORT,
                     REPAIR_REQUEST, CLOSE
   Reporter -&gt; CSF : PATH_REPORT
</artwork>
      </figure>
      <t>The CSF observes the protected flow as the RDMA sender emits it,
      forms source blocks, and sends repair symbols.  The CRF observes the
      protected flow as it arrives, holds the source symbols of incomplete
      blocks, decodes when possible, and passes restored packets to the RDMA
      receiver as if they had arrived from the network.  All CREM messages
      use UDP <xref target="RFC768"/> with the CREM port as destination
      port.</t>
      <t>The CREM port is a UDP port configured by the operator of the
      limited domain; this document does not request a port assignment from
      the "Service Name and Transport Protocol Port Number Registry"
      <xref target="RFC6335"/>.  All CSFs, CRFs, and Path Reporters of a
      domain <bcp14>MUST</bcp14> be configured with the same CREM port, because Path
      Reporters send to CSFs without prior signaling.  Operators <bcp14>SHOULD</bcp14> choose
      the port from the Dynamic Ports range (49152-65535) and <bcp14>MUST</bcp14> ensure that
      no other service of the domain uses it.  Implementations <bcp14>MUST NOT</bcp14> assume
      a default port value.</t>
    </section>

    <section anchor="coding">
      <name>Source Blocks and Coding</name>

      <section anchor="symbols">
        <name>Source Symbols</name>
        <t>For a source packet whose UDP payload is the octet string P (for
        RoCEv2, from the Base Transport Header through the invariant CRC), the
        source symbol is:</t>
        <artwork>
   S = uint16(len(P)) || P || zero padding to T octets
</artwork>
        <t>where T, the symbol length, is at least the largest UDP payload of
        the flow plus 2.  This follows the construction of application data
        unit information in <xref target="RFC6363"/> without the flow
        identifier octet, which CREM conveys in the message header.  The
        length prefix lets the CRF restore P exactly.</t>
      </section>

      <section anchor="blocks">
        <name>Source Blocks</name>
        <t>A source block covers k consecutive PSN positions, starting at the
        Block Start PSN; position j (0 &lt;= j &lt; k) corresponds to PSN Block
        Start PSN + j, modulo 2^24.  Blocks of a flow do not overlap.  Not
        every PSN position carries a packet in the protected direction: for
        example, an RDMA READ request consumes one PSN for each expected
        response packet, and those PSNs never appear in the request
        direction.  The CSF therefore records which positions of a block
        carry a source packet in a Present Bitmap, which it sends in every
        REPAIR message of the block.  Absent positions are neither coded nor
        expected; they are treated as zero symbols that are known to both
        sides.</t>
        <t>Only packets that carry a new PSN are sources; acknowledgment and
        negative acknowledgment packets are not protected.  A source packet
        that the RDMA transport retransmits with the same PSN occupies the
        same position.  Retransmitted packets are expected to be identical
        to the original; restored packets are verified as described in
        <xref target="receiver"/>, so a difference is detected rather than
        delivered.  The CSF closes a block when k positions have been
        covered, or earlier at the end of a burst; the k of a closed block
        is carried in its REPAIR messages.  When the CRF has received no
        REPAIR message for a block, it does not know its boundaries and
        reports losses by PSN range instead (<xref target="request"/>).</t>
        <t>The CRF does not need REPAIR messages to recognize the most common
        absent positions: when it observes an RDMA READ request, it derives
        the number of PSNs the request consumes from its DMA Length and the
        RDMA MTU announced in HELLO, and treats those PSNs as absent.  If the
        CSF receives a PSN-range request that names absent positions, it
        answers with an INFO message: a REPAIR with the INFO flag, Symbol
        Length zero, and no symbol, which carries the Block Start PSN, k, and
        Present Bitmap of the block.</t>
      </section>

      <section anchor="schemes">
        <name>FEC Schemes</name>
        <t>FEC schemes are identified by an 8-bit value
        (<xref target="iana"/>).  Support for scheme 1 is <bcp14>REQUIRED</bcp14>.</t>

        <section anchor="scheme0">
          <name>Scheme 0: Source Copy</name>
          <t>The repair symbol with Repair Index i is source symbol i of the
          block, unmodified.  It is used for per-packet retransmission by the
          CSF (<xref target="fallback"/>).</t>
        </section>

        <section anchor="scheme1">
          <name>Scheme 1: Cauchy Reed-Solomon over GF(2^8)</name>
          <t>Arithmetic is in GF(2^8) defined by the primitive polynomial
          x^8 + x^4 + x^3 + x^2 + 1 (0x11D); addition is bitwise exclusive-or.
          For source index j and Repair Index i, define y_j = j and x_i = 255 -
          i, and the coefficient</t>
          <artwork>
   C(i, j) = 1 / (x_i + y_j)        (computed in GF(2^8))
</artwork>
          <t>which exists whenever i + j &lt; 255.  The CSF <bcp14>MUST</bcp14> use only
          Repair Indices with i + k &lt;= 255.  A repair symbol over a set L of
          source indices is, octet by octet:</t>
          <artwork>
   R_i[L] = sum over j in L of C(i, j) * S_j
</artwork>
          <t>An ordinary repair symbol uses L equal to all present positions of
          the block.  A coded retransmission uses L equal to the set of lost
          sources named in the request (<xref target="retx"/>).  Because every
          square submatrix of a Cauchy matrix is non-singular, the receiver
          can solve for any set U of u unknown source symbols from any u
          repair symbols of distinct indices whose sets L all contain U,
          after subtracting the contributions of the source symbols it holds.
          Ordinary repair symbols always satisfy this condition.  A coded
          retransmission satisfies it because its L is the CRF's set of
          unknown sources at the time of the request, and that set only
          shrinks afterwards.  Repair symbols generated without a request
          from the CRF (<xref target="node-reports"/>) <bcp14>MUST</bcp14> therefore be
          ordinary repair symbols.  Under these rules the code is maximum
          distance separable: as many symbols as there are present sources
          recover the block.</t>
        </section>

        <section anchor="scheme2">
          <name>Scheme 2: XOR Parity</name>
          <t>The single repair symbol (m = 1, Repair Index 0) is the bitwise
          exclusive-or of all source symbols of the block.  It recovers one lost
          source.  Coded retransmission is not defined for this scheme; blocks
          with more than one loss use the fallback of
          <xref target="fallback"/>.</t>
        </section>
      </section>
    </section>

    <section anchor="adaptive">
      <name>Adaptive Forward Erasure Correction</name>

      <section anchor="negotiation">
        <name>Capability Negotiation</name>
        <t>Before protecting a flow, the CSF sends HELLO to the CRF, giving
        the flow descriptor, the schemes it supports, and its limits for k,
        m, and T.  The CRF answers with HELLO_ACK, which assigns the Flow ID
        used in all later messages for the flow and states the CRF's
        limits, including the number of blocks it can hold concurrently.
        The CRF <bcp14>MUST</bcp14> choose the Flow ID at random among unused values.  The
        CSF retransmits HELLO with exponential backoff, starting at 1 ms, for
        at most eight attempts; without an answer it does not protect the
        flow.  The effective limits are the minimum of the two sides.  The
        CSF sends all later messages of the flow to the address and port
        from which HELLO_ACK came, and the CRF sends to the address and port
        from which HELLO came.</t>
      </section>

      <section anchor="param-sync">
        <name>Parameter Synchronization</name>
        <t>Each configuration (scheme, k, m, T) has a Config ID.  To change
        the configuration, the CSF sends PARAM_UPDATE with a new Config ID
        and an Effective PSN.  It retransmits PARAM_UPDATE after a
        retransmission timeout (initially 2 * SRTT, at least 1 ms), doubling
        the timeout on each retransmission, until it receives PARAM_ACK for
        that Config ID; after eight unanswered attempts it sends CLOSE.  The CSF <bcp14>MUST NOT</bcp14> use the new
        configuration for blocks that start before the Effective PSN or
        before PARAM_ACK has been received.  If the Effective PSN passes
        before the acknowledgment arrives, the CSF continues with the old
        configuration and sends PARAM_UPDATE again with a later Effective
        PSN.  Every REPAIR message carries its Config ID, scheme, and k, so
        that the CRF never decodes a block with the wrong parameters.</t>
        <t>The CRF reserves decoding resources when it acknowledges a
        configuration and <bcp14>MUST</bcp14> accept REPAIR messages for any configuration
        it has acknowledged and not yet released.  A configuration is
        released when a newer configuration has been acknowledged and every
        block that uses the older one has been closed or has fallen back.</t>
      </section>

      <section anchor="policy">
        <name>Redundancy Policy</name>
        <t>The redundancy policy is local to the CSF, subject to the
        following requirements:</t>
        <ul>
          <li>The CSF <bcp14>MUST</bcp14> classify recent losses as congestion-related or not,
          using the evidence of <xref target="feedback"/>: rising ECN
          Congestion Experienced marks <xref target="RFC3168"/>, growth of
          queueing delay reported for a hop, and drops reported by a node as
          queue overflow indicate congestion; losses without these signals
          are treated as transmission losses.</li>
          <li>The CSF <bcp14>MUST NOT</bcp14> increase m in response to congestion-related
          loss beyond a configured m_cong (<bcp14>RECOMMENDED</bcp14>: 1).  Redundancy does
          not help a congested queue and adds load to it.</li>
          <li>The CSF <bcp14>MUST</bcp14> apply hysteresis: it <bcp14>MUST NOT</bcp14> change the
          configuration more than once per two smoothed round-trip times,
          because a change takes effect only after a round trip.</li>
        </ul>
        <t>The <bcp14>RECOMMENDED</bcp14> policy for transmission loss uses an estimate p of
        the packet loss rate (an exponentially weighted moving average over
        LOSS_REPORT intervals) and chooses the smallest m for which the
        probability that a block of k + m packets loses more than m packets,
        under independent losses with rate p, is below a target epsilon
        (default 10^-4).  m = 0 is chosen when p is so low that coded
        retransmission alone meets the target; the flow then incurs no
        redundancy overhead and still benefits from coded retransmission.  The
        block size k trades decoding delay (the CRF waits for up to k packets)
        against overhead; k = 32 is a reasonable default for multi-millisecond
        paths.</t>
      </section>

      <section anchor="sending">
        <name>Sending Repair Symbols</name>
        <t>The CSF sends the m repair symbols of a block, with Repair Indices 0
        to m-1, as soon as the block is closed.  It <bcp14>MAY</bcp14> spread them among the
        next source packets to reduce burstiness.  Repair messages are
        subject to the rate limits of <xref target="cc"/>.</t>
      </section>
    </section>

    <section anchor="receiver">
      <name>Receiver Operation</name>
      <t>For each open block, the CRF records the source symbols and repair
      symbols received.  The following rules apply:</t>
      <ul>
        <li>When the number of distinct symbols received for a block reaches
        the number of present positions, the CRF decodes the missing source
        symbols and restores the packets.  It <bcp14>MUST</bcp14> verify the invariant CRC
        of each restored RoCEv2 packet <xref target="IBTA-ROCEV2"/> and
        discard a packet that fails; it then requests a fallback for that
        position (<xref target="fallback"/>).  Verified packets are passed to
        the RDMA receiver, and the block is closed.</li>
        <li>The CRF <bcp14>MAY</bcp14> hold source packets with PSNs after a gap for up to a
        hold time H (<bcp14>RECOMMENDED</bcp14>: the time to receive one block at the flow
        rate, at most one quarter of the minimum RTT), so that restored
        packets reach the RDMA receiver in order.  When H expires, it <bcp14>MUST</bcp14>
        release held packets in PSN order even if the gap remains, so that
        CREM never delays the RDMA transport's own recovery by more than
        H.</li>
        <li>Packets restored after their successors were released are still
        passed to the RDMA receiver; RDMA transports discard duplicates and
        accept late packets according to their own rules.</li>
        <li>A block is incomplete when, after the CRF has observed a packet
        beyond the block or all of its repair symbols, plus a reordering
        allowance (<bcp14>RECOMMENDED</bcp14>: H), it holds fewer symbols than present
        positions.  The CRF then proceeds as in <xref target="retx"/>.  A
        PSN gap for which the CRF has seen no REPAIR message is handled in
        the same way, using the PSN-range form of the request.</li>
      </ul>
      <t>Restored packets carry no ECN marking.  The CRF counts them separately
      so that they do not mask losses in its LOSS_REPORT.</t>
    </section>

    <section anchor="retx">
      <name>Coded Retransmission</name>

      <section anchor="request">
        <name>Repair Request</name>
        <t>For an incomplete block, the CRF sends REPAIR_REQUEST with the Block
        Start PSN, k, the Config ID, a bitmap of the lost source indices (the
        set L, with X = |L| lost sources), the number r of repair symbols it
        holds for the block, and a suggested count M_s = X - r + delta, where
        delta (<bcp14>RECOMMENDED</bcp14>: 0 on clean paths, 1 when p exceeds one percent)
        allows for the loss of repair symbols; M_s <bcp14>MUST NOT</bcp14> exceed X.  The
        final decision on M rests with the CSF.  A Request ID distinguishes
        successive requests for the same block.</t>
        <t>When the CRF has received no REPAIR message for the affected
        positions, it does not know the block structure and sends the
        PSN-range form instead: a list of lost PSN ranges, each a start PSN
        and a count.  This list of lost PSNs is all the CSF needs: it maps
        the PSNs to its blocks and answers each block as below, with r taken
        as zero.</t>
      </section>

      <section anchor="response">
        <name>Coded Response</name>
        <t>On receiving REPAIR_REQUEST for a block it still holds, the CSF:</t>
        <ol>
          <li>chooses M with X - r &lt;= M &lt;= X, normally M = M_s;</li>
          <li>computes M repair symbols R_i[L] over the lost set L, using
          Repair Indices not previously used for the block; if fewer than M
          unused indices with i + k &lt;= 255 remain, it answers with Source
          Copy symbols instead (<xref target="fallback"/>);</li>
          <li>sends them in REPAIR messages with the RETX flag set, the
          lost-set bitmap, and a Repair Session ID equal to the Request ID;
          and</li>
          <li>sends them back to back, so that the whole repair takes one round
          trip regardless of X.</li>
        </ol>
        <t>Because M is X - r (plus delta), coded retransmission sends fewer
        symbols than the number of lost packets whenever the receiver holds
        at least one repair symbol of the block, and it recovers all lost
        packets within one round trip.  The CSF <bcp14>MUST</bcp14> keep the source symbols of a block until the block is
        acknowledged by the RDMA transport or until it gives up retransmission
        for the block.  It <bcp14>MUST</bcp14> respond to at most one request per block per
        smoothed round-trip time.</t>
        <t>The CRF decodes when the ordinary and retransmitted repair symbols
        it holds, together with its source symbols, number at least the
        present positions of the block.  If
        source packets in L arrive late, the CRF subtracts their contribution
        from the retransmitted symbols as well.</t>
      </section>

      <section anchor="fallback">
        <name>Fallback</name>
        <t>A block that remains incomplete after two coded retransmission
        rounds, or whose scheme does not support coded retransmission, falls
        back to per-packet retransmission.  Either:</t>
        <ul>
          <li>the CSF sends the lost source symbols with scheme 0 (Source
          Copy) in response to a REPAIR_REQUEST carrying the FALLBACK flag;
          or</li>
          <li>the CRF releases all held packets of the block and leaves
          recovery to the RDMA transport's own retransmission.</li>
        </ul>
        <t>In both cases the data is eventually delivered by the RDMA
        transport's reliability, which CREM never disables.</t>
      </section>
    </section>

    <section anchor="feedback">
      <name>Congestion-Aware Path Feedback</name>

      <section anchor="loss-report">
        <name>Receiver Loss Reports</name>
        <t>The CRF sends LOSS_REPORT at least once per smoothed round-trip time
        while the flow is active.  It reports, for the interval: source
        packets expected and received (before restoration), packets restored
        by decoding, blocks incomplete after the first decoding attempt, ECN
        CE marks observed on source packets, REPAIR messages received, CE
        marks observed on REPAIR messages, and the interval duration.  The
        CSF derives the path loss rate p and the CE fractions from it.</t>
      </section>

      <section anchor="node-reports">
        <name>On-Path Path Reports</name>
        <t>Support for this section is <bcp14>OPTIONAL</bcp14> for network nodes; CSFs <bcp14>MUST</bcp14>
        be able to process PATH_REPORT.</t>
        <t>A Path Reporter that measures the protected flow with Alternate
        Marking (<xref target="RFC9341"/>, <xref target="RFC9342"/>, applied
        to IPv6 with <xref target="RFC9343"/>) can determine, per marking
        period, how many packets of the flow were lost between measurement
        points and how its queueing delay changed.  A node also knows exactly
        which packets it dropped itself, for example because of queue
        overflow or a corrupted frame.  A Path Reporter <bcp14>MAY</bcp14> send PATH_REPORT
        to the source address of the protected flow, containing one Hop Entry
        per measurement point with:</t>
        <ul>
          <li>the node identifier and the marking period number;</li>
          <li>the number of packets lost in the period;</li>
          <li>the change in queueing delay in microseconds, signed;</li>
          <li>a cause code: 1 for queue overflow, 2 for transmission error, 0
          for unknown; and</li>
          <li>optionally, the PSNs of packets the node dropped itself.</li>
        </ul>
        <t>A CSF that receives PSNs dropped by a node <bcp14>MAY</bcp14> send additional
        ordinary repair symbols for the affected blocks without waiting for
        the CRF's request (<xref target="scheme1"/>).  This saves the time
        between the drop and the receiver's detection of it.</t>
        <t>Path Reporters send PATH_REPORT to the CREM port of the CSF address
        configured for the flow's source prefix, or, by default, to the
        flow's source address.  A CSF in a gateway on the path toward the
        source intercepts reports addressed to the sources it serves.  A
        PATH_REPORT <bcp14>MUST</bcp14> fit in the path MTU; a reporter truncates the
        dropped-PSN lists and sets the Truncated flag (0x80) if needed.
        When reverse-path capacity is scarce, a Path Reporter that forwards
        PATH_REPORT messages from downstream reporters for the same CSF <bcp14>MAY</bcp14>
        merge their Hop Entries with its own into one PATH_REPORT, up to 16
        entries, within an aggregation interval (<bcp14>RECOMMENDED</bcp14>: 50
        microseconds).  Reporters <bcp14>MUST</bcp14> rate-limit PATH_REPORT per flow and per
        port.</t>
        <t>Alternate Marking, where it is deployed, is a measurement function
        of the network operator and is applied independently of CREM, for
        example in IPv6 options added and removed at the edges of the
        measured domain <xref target="RFC9343"/>.  CREM itself does not mark
        or modify protected packets.</t>
        <t>A CSF <bcp14>MUST</bcp14> accept PATH_REPORT only from the set of reporter
        addresses configured for the domain.  Path reports influence only
        redundancy, the timing of retransmission, and loss classification;
        they never cause the CSF to deem data delivered.</t>
      </section>
    </section>

    <section anchor="formats">
      <name>Message Formats</name>

      <section anchor="hdr">
        <name>Common Header</name>
        <figure anchor="fig-hdr">
          <name>CREM Common Header</name>
          <artwork type="ascii-art">
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type  |     Flags     |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Flow ID                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Version is 1.  Length is the length of the message in octets,
        including this header.  Flow ID is assigned by the CRF in HELLO_ACK and
        is zero in HELLO and in PATH_REPORT.  Integers are in network byte
        order.  Types: 1 REPAIR, 2 HELLO, 3 HELLO_ACK, 4 PARAM_UPDATE, 5
        PARAM_ACK, 6 REPAIR_REQUEST, 7 LOSS_REPORT, 8 PATH_REPORT, 9 CLOSE.
        Messages with an unknown Version or Type <bcp14>MUST</bcp14> be discarded.</t>
      </section>

      <section anchor="fmt-repair">
        <name>REPAIR</name>
        <figure anchor="fig-repair">
          <name>REPAIR Message (Type 1) after the Common Header</name>
          <artwork type="ascii-art">
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Config ID   |    Scheme     |       k       | Repair Index  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                Block Start PSN                |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Repair Session ID       |        Symbol Length T        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Present Bitmap (ceil(k/32) 32-bit words)           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Lost Source Bitmap (ceil(k/32) words, RETX flag only)    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Repair Symbol (T octets)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Flags: 0x80 RETX (coded retransmission; the Lost Source Bitmap is
        present), 0x40 LAST (last repair symbol the CSF intends to send for
        this block in this round), 0x20 INFO (block information only; Symbol
        Length is zero and no symbol follows).  Repair Session ID is zero for ordinary
        repair symbols.  In both bitmaps, bit j (counting from the most
        significant bit of the first word) refers to position j; in the
        Present Bitmap it is set if position j carries a source packet, and
        in the Lost Source Bitmap if source j is in L.  k is 1 to 255.</t>
      </section>

      <section anchor="fmt-hello">
        <name>HELLO and HELLO_ACK</name>
        <figure anchor="fig-hello">
          <name>HELLO (Type 2) after the Common Header</name>
          <artwork type="ascii-art">
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Flow Kind   |      AF       |       Supported Schemes       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Max k     |     Max m     |             Max T             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           RDMA MTU            |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Sender Nonce (64 bits)                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Address (4 or 16 octets, per AF) ...          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Destination Address (4 or 16 octets, per AF) ...       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Flow Label                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Flow Kind is 1 for RoCEv2.  AF is 4 or 6.  Supported Schemes is a
        bitmap with bit s (from the least significant bit) set if scheme s is
        supported.  RDMA MTU is the path MTU of the RDMA connection in
        octets of payload per packet.  For RoCEv2 the Flow Label holds the
        destination queue pair number in its low 24 bits.  HELLO_ACK (Type 3)
        carries the same first twelve octets with the CRF's Supported Schemes,
        Max k, Max m, and Max T (RDMA MTU echoed), followed by the echoed
        Sender Nonce, Max Open Blocks (16 bits), and 16 reserved bits; the
        Flow ID in its header is the assigned identifier.  HELLO_ACK is
        therefore never larger than HELLO.</t>
      </section>

      <section anchor="fmt-param">
        <name>PARAM_UPDATE and PARAM_ACK</name>
        <t>PARAM_UPDATE (Type 4) carries Config ID (8 bits), Scheme (8 bits), k
        (8 bits), m (8 bits), T (16 bits), Reserved (16 bits), Effective PSN
        (24 bits), and Reserved (8 bits).  PARAM_ACK (Type 5) carries Config ID
        (8 bits), Status (8 bits; 0 accepted, 1 unsupported scheme, 2 limits
        exceeded, 3 resources exhausted), and Reserved (16 bits).  A CSF that
        receives a non-zero Status keeps its current configuration.</t>
      </section>

      <section anchor="fmt-request">
        <name>REPAIR_REQUEST</name>
        <t>REPAIR_REQUEST (Type 6) has two forms.  The block form carries
        Config ID (8 bits), Scheme (8 bits), k (8 bits), Repairs Held r (8
        bits), Block Start PSN (24 bits), Suggested M (8 bits), Request ID
        (16 bits), Reserved (16 bits), and the Lost Source Bitmap (ceil(k/32)
        words).  The PSN-range form, indicated by flag 0x10 RANGES, carries
        Request ID (16 bits), Range Count (16 bits), and Range Count entries
        of Start PSN (24 bits) and Count (8 bits).  Flag 0x20 FALLBACK
        requests Source Copy symbols for the lost sources.</t>
      </section>

      <section anchor="fmt-loss">
        <name>LOSS_REPORT</name>
        <t>LOSS_REPORT (Type 7) carries Interval (32 bits, microseconds),
        Expected (32 bits), Received (32 bits), Restored (32 bits), Incomplete
        Blocks (32 bits), CE Marked (32 bits), Repairs Received (32 bits), and
        Repairs CE Marked (32 bits), all counts for the interval.</t>
      </section>

      <section anchor="fmt-path">
        <name>PATH_REPORT</name>
        <figure anchor="fig-path">
          <name>PATH_REPORT (Type 8) after the Common Header</name>
          <artwork type="ascii-art">
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Method     |  Entry Count  |      AF       |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Flow source and destination address (4 or 16 octets each)   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Flow Label                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Hop Entry 1 (see below)                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              ...                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Hop Entry:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Node ID                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Marking Period Number                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Lost Count                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Queue Delay Change (signed, us)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Cause     |  PSN Count    |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Reserved    |  Dropped PSN (24 bits), repeated PSN Count    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Method: 1 Alternate Marking <xref target="RFC9341"/>, 2 Clustered
        Alternate Marking <xref target="RFC9342"/>, 3 node-local drop
        accounting.  The flow is identified by addresses and Flow Label as in
        HELLO, because a Path Reporter does not know the Flow ID.  Entry Count
        is at most 16.</t>
      </section>

      <section anchor="fmt-close">
        <name>CLOSE</name>
        <t>CLOSE (Type 9) carries a Reason (16 bits) and Reserved (16 bits).
        Either side sends it to release the flow's state.  Reasons: 0 normal
        termination, 1 flow ended, 2 parameter synchronization failed, 3
        resources exhausted, 4 circuit breaker.</t>
      </section>
    </section>

    <section anchor="cc">
      <name>Congestion Control Considerations</name>
      <t>Repair traffic adds load to the network.  The congestion control of
      an RDMA flow normally runs in the RDMA interface, which a CSF in a host
      shim or gateway cannot influence directly, and REPAIR messages use a
      different UDP port and can therefore take a different path under
      equal-cost multipath routing.  CREM therefore limits repair traffic
      itself:</t>
      <ul>
        <li>The rate of ordinary repair symbols <bcp14>MUST NOT</bcp14> exceed m/k times the
        measured rate of the protected flow, and the volume of coded
        retransmissions <bcp14>MUST NOT</bcp14> exceed the volume of source packets reported
        lost.</li>
        <li>REPAIR messages carry the DSCP of the protected flow and are ECN
        capable.  When LOSS_REPORT shows CE marks or loss on REPAIR messages,
        the CSF <bcp14>MUST</bcp14> reduce m (to zero if the condition persists for more
        than one second) in addition to applying the classification of
        <xref target="policy"/>.</li>
        <li>A CSF integrated with the RDMA interface <bcp14>SHOULD</bcp14> also count REPAIR
        octets against the flow's congestion control, so that redundancy
        trades the flow's own goodput for lower latency.</li>
      </ul>
      <t>Because redundancy is not raised for congestion-related loss, CREM
      does not amplify congestion.  These rules follow
      <xref target="RFC8085"/> and <xref target="RFC9743"/>.  As a circuit
      breaker in the sense of <xref target="RFC8084"/>, a CSF that observes a
      path loss rate (from LOSS_REPORT, before restoration) above ten percent
      or a CE fraction above fifty percent over one second <bcp14>MUST</bcp14> set m to zero
      and stop coded retransmission for the flow, leaving recovery to the
      RDMA transport.  The flow stays open, so LOSS_REPORT messages continue,
      and the CSF resumes redundancy only after the condition has been absent
      for at least ten seconds.  If the condition persists for more than one
      minute, the CSF sends CLOSE with reason 4.</t>
    </section>

    <section anchor="ops">
      <name>Operational Considerations</name>
      <ul>
        <li>MTU: a REPAIR message is larger than a source packet by its header
        (20 octets plus both bitmaps) and the CREM UDP/IP headers.  The symbol
        length T plus these headers <bcp14>MUST</bcp14> fit the path MTU.</li>
        <li>Memory: the CSF keeps the source symbols of unacknowledged blocks;
        the CRF keeps up to Max Open Blocks blocks.  Both are bounded by the
        bandwidth-delay product of the path.</li>
        <li>Gateways: a pair of CREM gateways at the ends of a long-distance
        segment can protect all RDMA flows crossing it, so that end hosts
        need no changes.</li>
        <li>Monitoring: implementations <bcp14>SHOULD</bcp14> expose the configured (k, m),
        restored packets, coded retransmissions and their sizes, fallbacks,
        and the loss classification.</li>
      </ul>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>Data integrity is the main concern.  A forged REPAIR message would
      make the CRF reconstruct wrong packets, which the RDMA receiver would
      place into application memory.  The invariant CRC of RoCEv2 detects
      accidental corruption of restored packets but not a deliberate forgery.
      Deployments <bcp14>MUST</bcp14> therefore either protect CREM messages, and the
      protected flow, with IPsec ESP <xref target="RFC4303"/>, or confine
      CREM to a limited domain whose boundary drops datagrams addressed to
      the CREM port from outside.  The random Sender Nonce and Flow ID make
      blind injection unlikely but do not authenticate messages.</t>
      <t>Forged REPAIR_REQUEST or PATH_REPORT messages could cause the CSF to
      send additional repair traffic.  The amount is bounded: at most X
      symbols per block per round trip, within the rate limits of
      <xref target="cc"/>; REPAIR messages are sent only to the address bound
      at HELLO, never to the source of a request; and PATH_REPORT is accepted
      only from configured reporters.  HELLO is no smaller than HELLO_ACK,
      so CREM cannot be used for reflection amplification.</t>
      <t>Path reports reveal per-hop loss and delay.  They are sent only to
      sources of protected flows inside the domain.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests no port number; the CREM port is configured
      per limited domain (<xref target="architecture"/>).</t>
      <section anchor="iana-reg">
        <name>CREM Registries</name>
        <t>IANA is requested to create a registry group named "CREM
        Parameters" with the following registries.  Unless stated otherwise,
        values are assigned by Specification Required <xref target="RFC8126"/>
        and the upper quarter of each value space is reserved for Private
        Use.</t>
        <ul>
          <li>"CREM Message Types" (4 bits): 0 Reserved, 1 REPAIR, 2 HELLO, 3
          HELLO_ACK, 4 PARAM_UPDATE, 5 PARAM_ACK, 6 REPAIR_REQUEST, 7
          LOSS_REPORT, 8 PATH_REPORT, 9 CLOSE.  Assignments require Standards
          Action.</li>
          <li>"CREM FEC Schemes" (8 bits): 0 Source Copy, 1 Cauchy
          Reed-Solomon GF(2^8), 2 XOR Parity.</li>
          <li>"CREM Flow Kinds" (8 bits): 0 Reserved, 1 RoCEv2.</li>
          <li>"CREM Measurement Methods" (8 bits): 0 Reserved, 1 Alternate
          Marking, 2 Clustered Alternate Marking, 3 Node-local drop
          accounting.</li>
          <li>"CREM Loss Causes" (8 bits): 0 Unknown, 1 Queue overflow, 2
          Transmission error.</li>
          <li>"CREM PARAM_ACK Status Codes" (8 bits): 0 Accepted, 1
          Unsupported scheme, 2 Limits exceeded, 3 Resources exhausted.</li>
          <li>"CREM CLOSE Reasons" (16 bits): 0 Normal termination, 1 Flow
          ended, 2 Parameter synchronization failed, 3 Resources exhausted, 4
          Circuit breaker.</li>
          <li>"CREM Message Flags": one entry per bit of the 8-bit Flags field
          and message type; initial contents REPAIR 0x80 RETX, 0x40 LAST, and
          0x20 INFO, REPAIR_REQUEST 0x20 FALLBACK and 0x10 RANGES, PATH_REPORT
          0x80 Truncated.</li>
        </ul>
        <t>The designated experts should verify that new FEC schemes specify
        the coding of absent positions and whether coded retransmission is
        supported, and that new flow kinds specify how sources and PSN
        positions are identified.</t>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC768" target="https://www.rfc-editor.org/info/rfc768">
  <front>
    <title>User Datagram Protocol</title>
    <author fullname="J. Postel" initials="J." surname="Postel"/>
    <date month="August" year="1980"/>
  </front>
  <seriesInfo name="STD" value="6"/>
  <seriesInfo name="RFC" value="768"/>
  <seriesInfo name="DOI" value="10.17487/RFC768"/>
</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 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="RFC3168" target="https://www.rfc-editor.org/info/rfc3168">
  <front>
    <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
    <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
    <author fullname="S. Floyd" initials="S." surname="Floyd"/>
    <author fullname="D. Black" initials="D." surname="Black"/>
    <date month="September" year="2001"/>
    </front>
  <seriesInfo name="RFC" value="3168"/>
  <seriesInfo name="DOI" value="10.17487/RFC3168"/>
</reference>
        <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="RFC6335" target="https://www.rfc-editor.org/info/rfc6335">
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="J. Touch" initials="J." surname="Touch"/>
    <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
    <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
    <date month="August" year="2011"/>
    </front>
  <seriesInfo name="BCP" value="165"/>
  <seriesInfo name="RFC" value="6335"/>
  <seriesInfo name="DOI" value="10.17487/RFC6335"/>
</reference>
        <reference anchor="RFC6363" target="https://www.rfc-editor.org/info/rfc6363">
  <front>
    <title>Forward Error Correction (FEC) Framework</title>
    <author fullname="M. Watson" initials="M." surname="Watson"/>
    <author fullname="A. Begen" initials="A." surname="Begen"/>
    <author fullname="V. Roca" initials="V." surname="Roca"/>
    <date month="October" year="2011"/>
    </front>
  <seriesInfo name="RFC" value="6363"/>
  <seriesInfo name="DOI" value="10.17487/RFC6363"/>
</reference>
        <reference anchor="RFC8084" target="https://www.rfc-editor.org/info/rfc8084">
  <front>
    <title>Network Transport Circuit Breakers</title>
    <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
    <date month="March" year="2017"/>
    </front>
  <seriesInfo name="BCP" value="208"/>
  <seriesInfo name="RFC" value="8084"/>
  <seriesInfo name="DOI" value="10.17487/RFC8084"/>
</reference>
        <reference anchor="RFC8085" target="https://www.rfc-editor.org/info/rfc8085">
  <front>
    <title>UDP Usage Guidelines</title>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
    <author fullname="G. Shepherd" initials="G." surname="Shepherd"/>
    <date month="March" year="2017"/>
    </front>
  <seriesInfo name="BCP" value="145"/>
  <seriesInfo name="RFC" value="8085"/>
  <seriesInfo name="DOI" value="10.17487/RFC8085"/>
</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="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="RFC9341" target="https://www.rfc-editor.org/info/rfc9341">
  <front>
    <title>Alternate-Marking Method</title>
    <author fullname="G. Fioccola" initials="G." role="editor" surname="Fioccola"/>
    <author fullname="M. Cociglio" initials="M." surname="Cociglio"/>
    <author fullname="G. Mirsky" initials="G." surname="Mirsky"/>
    <author fullname="T. Mizrahi" initials="T." surname="Mizrahi"/>
    <author fullname="T. Zhou" initials="T." surname="Zhou"/>
    <date month="December" year="2022"/>
    </front>
  <seriesInfo name="RFC" value="9341"/>
  <seriesInfo name="DOI" value="10.17487/RFC9341"/>
</reference>
        <reference anchor="RFC9342" target="https://www.rfc-editor.org/info/rfc9342">
  <front>
    <title>Clustered Alternate-Marking Method</title>
    <author fullname="G. Fioccola" initials="G." role="editor" surname="Fioccola"/>
    <author fullname="M. Cociglio" initials="M." surname="Cociglio"/>
    <author fullname="A. Sapio" initials="A." surname="Sapio"/>
    <author fullname="R. Sisto" initials="R." surname="Sisto"/>
    <author fullname="T. Zhou" initials="T." surname="Zhou"/>
    <date month="December" year="2022"/>
    </front>
  <seriesInfo name="RFC" value="9342"/>
  <seriesInfo name="DOI" value="10.17487/RFC9342"/>
</reference>
        <reference anchor="RFC9343" target="https://www.rfc-editor.org/info/rfc9343">
  <front>
    <title>IPv6 Application of the Alternate-Marking Method</title>
    <author fullname="G. Fioccola" initials="G." surname="Fioccola"/>
    <author fullname="T. Zhou" initials="T." surname="Zhou"/>
    <author fullname="M. Cociglio" initials="M." surname="Cociglio"/>
    <author fullname="F. Qin" initials="F." surname="Qin"/>
    <author fullname="R. Pang" initials="R." surname="Pang"/>
    <date month="December" year="2022"/>
    </front>
  <seriesInfo name="RFC" value="9343"/>
  <seriesInfo name="DOI" value="10.17487/RFC9343"/>
</reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC5040" target="https://www.rfc-editor.org/info/rfc5040">
  <front>
    <title>A Remote Direct Memory Access Protocol Specification</title>
    <author fullname="R. Recio" initials="R." surname="Recio"/>
    <author fullname="B. Metzler" initials="B." surname="Metzler"/>
    <author fullname="P. Culley" initials="P." surname="Culley"/>
    <author fullname="J. Hilland" initials="J." surname="Hilland"/>
    <author fullname="D. Garcia" initials="D." surname="Garcia"/>
    <date month="October" year="2007"/>
    </front>
  <seriesInfo name="RFC" value="5040"/>
  <seriesInfo name="DOI" value="10.17487/RFC5040"/>
</reference>
        <reference anchor="RFC5044" target="https://www.rfc-editor.org/info/rfc5044">
  <front>
    <title>Marker PDU Aligned Framing for TCP Specification</title>
    <author fullname="P. Culley" initials="P." surname="Culley"/>
    <author fullname="U. Elzur" initials="U." surname="Elzur"/>
    <author fullname="R. Recio" initials="R." surname="Recio"/>
    <author fullname="S. Bailey" initials="S." surname="Bailey"/>
    <author fullname="J. Carrier" initials="J." surname="Carrier"/>
    <date month="October" year="2007"/>
    </front>
  <seriesInfo name="RFC" value="5044"/>
  <seriesInfo name="DOI" value="10.17487/RFC5044"/>
</reference>
        <reference anchor="RFC8799" target="https://www.rfc-editor.org/info/rfc8799">
  <front>
    <title>Limited Domains and Internet Protocols</title>
    <author fullname="B. Carpenter" initials="B." surname="Carpenter"/>
    <author fullname="B. Liu" initials="B." surname="Liu"/>
    <date month="July" year="2020"/>
    </front>
  <seriesInfo name="RFC" value="8799"/>
  <seriesInfo name="DOI" value="10.17487/RFC8799"/>
</reference>
        <reference anchor="RFC9743" target="https://www.rfc-editor.org/info/rfc9743">
  <front>
    <title>Specifying New Congestion Control Algorithms</title>
    <author fullname="M. Duke" initials="M." role="editor" surname="Duke"/>
    <author fullname="G. Fairhurst" initials="G." role="editor" surname="Fairhurst"/>
    <date month="March" year="2025"/>
    </front>
  <seriesInfo name="BCP" value="133"/>
  <seriesInfo name="RFC" value="9743"/>
  <seriesInfo name="DOI" value="10.17487/RFC9743"/>
</reference>
        <reference anchor="I-D.li-tsvwg-inference-transport" target="https://datatracker.ietf.org/doc/html/draft-li-tsvwg-inference-transport-00">
  <front>
    <title>Transport Considerations for Large-Scale Distributed Inference Networks</title>
    <author fullname="Zhiqiang Li" initials="Z." surname="Li">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Zongpeng Du" initials="Z." surname="Du">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec</organization>
    </author>
    <author fullname="Wei Cheng" initials="W." surname="Cheng">
      <organization>Centec</organization>
    </author>
    <author fullname="Guoying Zhang" initials="G." surname="Zhang">
      <organization>Centec</organization>
    </author>
    <author fullname="Xun Sun" initials="X." surname="Sun">
      <organization>Inesa</organization>
    </author>
    <author fullname="Chunhao Zhao" initials="C." surname="Zhao">
      <organization>SAIA</organization>
    </author>
    <date day="4" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-li-tsvwg-inference-transport-00"/>
</reference>
        <reference anchor="I-D.ietf-dtn-btpu-fec" target="https://datatracker.ietf.org/doc/html/draft-ietf-dtn-btpu-fec-03">
  <front>
    <title>Forward Error Correction for the Bundle Transfer Protocol</title>
    <author fullname="Rick Taylor" initials="R." surname="Taylor">
      <organization>Aalyria Technologies</organization>
    </author>
    <date day="15" month="October" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-dtn-btpu-fec-03"/>
</reference>
        <reference anchor="I-D.michel-quic-fec" target="https://datatracker.ietf.org/doc/html/draft-michel-quic-fec-01">
  <front>
    <title>Forward Erasure Correction for QUIC loss recovery</title>
    <author fullname="François Michel" initials="F." surname="Michel">
      <organization>UCLouvain</organization>
    </author>
    <author fullname="Olivier Bonaventure" initials="O." surname="Bonaventure">
      <organization>UCLouvain, WEL RI</organization>
    </author>
    <date day="23" month="October" year="2023"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-michel-quic-fec-01"/>
</reference>
        <reference anchor="I-D.dmoskvitin-quic-adaptive-fec" target="https://datatracker.ietf.org/doc/html/draft-dmoskvitin-quic-adaptive-fec-00">
  <front>
    <title>Adaptive Forward Erasure Correction for Delay-Sensitive QUIC Connections</title>
    <author fullname="Dmitriy Moskvitin" initials="D." surname="Moskvitin">
      <organization>Huawei</organization>
    </author>
    <author fullname="Evgeny Onegin" initials="E." surname="Onegin">
      <organization>Huawei</organization>
    </author>
    <author fullname="Rachel Huang" initials="R." surname="Huang">
      <organization>Huawei</organization>
    </author>
    <author fullname="Hanlin Luo" initials="H." surname="Luo">
      <organization>Huawei</organization>
    </author>
    <author fullname="Qichang Chen" initials="Q." surname="Chen">
      <organization>Huawei</organization>
    </author>
    <date day="6" month="May" year="2024"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-dmoskvitin-quic-adaptive-fec-00"/>
</reference>
        <reference anchor="I-D.chen-rdma-windowless-ack" target="https://datatracker.ietf.org/doc/html/draft-chen-rdma-windowless-ack-00">
  <front>
    <title>Windowless Cumulative ACK Extension for RDMA Retransmission</title>
    <author fullname="Danyang Chen" initials="D." surname="Chen">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Hongwei Yang" initials="H." surname="Yang">
      <organization>China Mobile</organization>
    </author>
    <date day="6" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-chen-rdma-windowless-ack-00"/>
</reference>
        <reference anchor="I-D.hzh-fantel-wan-tunnel" target="https://datatracker.ietf.org/doc/html/draft-hzh-fantel-wan-tunnel-03">
  <front>
    <title>Fast Notification for tunnel-based lossless RDMA transmission in WAN</title>
    <author fullname="Zehua Hu" initials="Z." surname="Hu">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Yongqing Zhu" initials="Y." surname="Zhu">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Jiayuan Hu" initials="J." surname="Hu">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Tanxin Pi" initials="T." surname="Pi">
      <organization>China Telecom</organization>
    </author>
    <date day="27" month="June" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-hzh-fantel-wan-tunnel-03"/>
</reference>
        <reference anchor="I-D.sang-fann-fast-network-event-notification" target="https://datatracker.ietf.org/doc/html/draft-sang-fann-fast-network-event-notification-01">
  <front>
    <title>Problem Statement and Requirements for Fast Network Event Notification in Distributed AI Training and Inference</title>
    <author fullname="Liu Sang" initials="L." surname="Sang">
      <organization>China Academy of Information and Communications Technology</organization>
    </author>
    <author fullname="Xuesong Geng" initials="X." surname="Geng">
      <organization>Huawei Technologies</organization>
    </author>
    <author fullname="Huan Deng" initials="H." surname="Deng">
      <organization>China Telecom</organization>
    </author>
    <date day="3" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-sang-fann-fast-network-event-notification-01"/>
</reference>
        <reference anchor="I-D.liu-opsawg-alt-mark-per-packet" target="https://datatracker.ietf.org/doc/html/draft-liu-opsawg-alt-mark-per-packet-00">
  <front>
    <title>Alternate marking usage for loss location in per-packet load balancing networks</title>
    <author fullname="Kefei Liu" initials="K." surname="Liu">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Ruixue Wang" initials="R." surname="Wang">
      <organization>China Mobile</organization>
    </author>
    <date day="2" month="March" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-liu-opsawg-alt-mark-per-packet-00"/>
</reference>
        <reference anchor="IBTA-ROCEV2" target="https://www.infinibandta.org/">
          <front>
            <title>Supplement to InfiniBand Architecture Specification Volume 1 Release 1.2.1, Annex A17: RoCEv2</title>
            <author><organization>InfiniBand Trade Association</organization></author>
            <date year="2014" month="September"/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="vectors" numbered="true">
      <name>Coding Example</name>
      <t>This example uses scheme 1 with k = 4 and T = 16.  The UDP payloads
      of the four source packets are the ASCII strings "RDMA-PKT-0" to
      "RDMA-PKT-3" (10 octets each), so each source symbol is the length
      0x000a, the payload, and four octets of padding:</t>
      <artwork>
S0 = 000a52444d412d504b542d3000000000
S1 = 000a52444d412d504b542d3100000000
S2 = 000a52444d412d504b542d3200000000
S3 = 000a52444d412d504b542d3300000000
</artwork>
      <t>Coefficients C(i, j) for i = 0..2 and j = 0..3 (x_i = 255 - i, y_j =
      j):</t>
      <artwork>
        j=0  j=1  j=2  j=3
  i=0:  fd   7e   ff   7f
  i=1:  7e   fd   7f   ff
  i=2:  ff   7f   fd   7e
</artwork>
      <t>With m = 2 the CSF sends R0 and R1 over the whole block:</t>
      <artwork>
R0 = 001ef6ccd7c377f0ddfc774c00000000
R1 = 001ef6ccd7c377f0ddfc774f00000000
</artwork>
      <t>Sources 0, 1, and 2 are lost (X = 3); the CRF holds S3, R0, and R1
      (r = 2) and requests M = X - r = 1 symbol for L = {0, 1, 2}.  The CSF
      sends the coded retransmission with Repair Index 2 over L only:</t>
      <artwork>
R2[L] = 00354fdf6d4b40b57e5c400000000000
</artwork>
      <t>The CRF subtracts C(0,3)*S3 from R0 and C(1,3)*S3 from R1 and solves
      the 3 x 3 Cauchy system with rows i = 0, 1, 2 and columns j = 0, 1, 2,
      recovering S0, S1, and S2.  Three lost packets were recovered with one
      retransmitted symbol.  The REPAIR message for R2[L] (Flow ID
      0x0000BEEF, Config ID 1, Block Start PSN 0x001000, Repair Session ID
      7, all four positions present, so Present Bitmap 0xF0000000 and Lost
      Source Bitmap 0xE0000000) begins as follows and is followed by the 16
      octets of R2[L], for a total Length of 44:</t>
      <artwork>
11 80 00 2c 00 00 be ef 01 01 04 02 00 10 00 00
00 07 00 10 f0 00 00 00 e0 00 00 00
</artwork>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The authors thank the participants in discussions on RDMA over
      long-distance networks for their comments.</t>
    </section>
  </back>
</rfc>