<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.9 (Ruby 3.0.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-nfsv4-nfs-ulb-v2-07" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.6 -->
  <front>
    <title abbrev="NFS on RPC-Over-RDMA V2">Network File System (NFS) Upper-Layer Binding To RPC-Over-RDMA Version 2</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-nfs-ulb-v2-07"/>
    <author initials="C." surname="Lever" fullname="Charles Lever">
      <organization abbrev="Oracle">Oracle Corporation</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date year="2022" month="May" day="13"/>
    <area>Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <abstract>
      <t>This document specifies Upper-Layer Bindings of Network File System
(NFS) protocol versions to RPC-over-RDMA version 2.</t>
    </abstract>
    <note>
      <name>Note</name>
      <t>Discussion of this draft takes place on the <eref target="nfsv4@ietf.org">NFSv4 working group mailing
list</eref>, archived at
<eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
Working Group information is available at
<eref target="https://datatracker.ietf.org/wg/nfsv4/about/"/>.</t>
      <t>Submit suggestions and changes as pull requests at
<eref target="https://github.com/chucklever/i-d-nfs-ulb-v2"/>.
Instructions are on that page.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The RPC-over-RDMA version 2 transport can employ direct data
placement to convey data payloads associated with RPC transactions,
as described in <xref target="I-D.ietf-nfsv4-rpcrdma-version-two"/>.
As mandated by that document, RPC client and server implementations
using RPC-over-RDMA version 2 <bcp14>MUST</bcp14> agree in advance which
XDR data items and RPC procedures are eligible for direct data
placement (DDP).</t>
      <t>An Upper-Layer Binding specifies this agreement for one or more
versions of one RPC program. Other operational details, such as RPC
binding assignments, pairing Write chunks with result data items, and
reply size estimation, are also specified by such a Binding.</t>
      <t>This document contains material required of Upper-Layer Bindings, as
specified in Appendix A of <xref target="I-D.ietf-nfsv4-rpcrdma-version-two"/>, for
the following NFS protocol versions:</t>
      <ul spacing="normal">
        <li>NFS version 2 <xref target="RFC1094"/></li>
        <li>NFS version 3 <xref target="RFC1813"/></li>
        <li>NFS version 4.0 <xref target="RFC7530"/></li>
        <li>NFS version 4.1 <xref target="RFC8881"/></li>
        <li>NFS version 4.2 <xref target="RFC7862"/></li>
      </ul>
      <t>The current document also provides Upper-Layer Bindings for auxiliary
protocols used with NFS versions 2 and 3 (see <xref target="auxproto"/>).</t>
      <t>This document assumes the reader is already familiar with concepts
and terminology defined throughout
<xref target="I-D.ietf-nfsv4-rpcrdma-version-two"/> and the documents it references.</t>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</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>
    </section>
    <section anchor="upper-layer-binding-for-nfs-versions-2-and-3">
      <name>Upper-Layer Binding for NFS Versions 2 and 3</name>
      <t>The Upper-Layer Binding specification in this section applies to NFS
version 2 <xref target="RFC1094"/> and NFS version 3 <xref target="RFC1813"/>. For brevity, in
this document, a "Legacy NFS client" refers to an NFS client using
version 2 or version 3 of the NFS RPC program (100003) to communicate
with an NFS server. Likewise, a "Legacy NFS server" is an NFS server
communicating with clients using NFS version 2 or NFS version 3.</t>
      <section anchor="ddp-eligibility">
        <name>DDP-Eligibility</name>
        <t>Generally, storage protocols based on RDMA divide both
read and write operations into two steps. This division enables
the payload receiver to allocate the sink buffer for each I/O operation
in advance of the network payload transfer.
By allocating the sink buffer tactically,
a good quality receiver implementation
reduces the amount of data movement it must perform
during and after the I/O operation.</t>
        <t>During an NFS WRITE that involves explicit RDMA,
first the NFS client sends a request that indicates
where the NFS server can find the payload buffer,
then the NFS server pulls the WRITE payload from that buffer.
Likewise, during an NFS READ that involves explicit RDMA,
the NFS client provides the location of the destination buffer,
then the NFS server pushes the READ payload to that buffer.</t>
        <t>Therefore, the following XDR data items in NFS versions 2 and 3 are DDP-eligible:</t>
        <ul spacing="normal">
          <li>The opaque file data argument in the NFS WRITE procedure</li>
          <li>The pathname argument in the NFS SYMLINK procedure</li>
          <li>The opaque file data result in the NFS READ procedure</li>
          <li>The pathname result in the NFS READLINK procedure</li>
        </ul>
        <t>All other argument or result data items in NFS versions 2 and 3 are
not DDP-eligible.</t>
        <t>Regardless of whether an NFS operation is considered non-idempotent,
a transport error might not indicate whether the server has processed
the arguments of the RPC Call or whether the server has accessed or
modified client memory associated with that RPC.</t>
      </section>
      <section anchor="reply-size-estimation">
        <name>Reply Size Estimation</name>
        <t>During the construction of each RPC Call message, a Requester is
responsible for allocating appropriate RDMA resources to receive
the corresponding Reply message. These resources must be capable of
holding the entire Reply. Therefore the Requester needs to estimate
the maximum possible size of the expected Reply message.</t>
        <ul spacing="normal">
          <li>Often, the expected Reply can fit in a limited number of RDMA
Send messages. The Requester need not provision any RDMA
resources for the Reply, relying instead on message continuation
to handle the entire Reply message.</li>
          <li>In cases where the Upper Layer Binding permits direct data
placement of the results (DDP), a Requester can provision
Write chunks to receive those results. The Requester <bcp14>MUST</bcp14> reliably
estimate the maximum size of each result receive via a Write chunk.</li>
          <li>A Requester that expects a large Reply message can provision
a Reply chunk. The Requester <bcp14>MUST</bcp14> reliably estimate the maximum
size of the payload received via the Reply chunk.</li>
          <li>If RDMA resources are not available to send a Reply, a Responder
falls back to message continuation.</li>
        </ul>
        <t>A correctly implemented Legacy NFS client thus avoids
retransmission of non-idempotent NFS requests due to improperly
estimated Reply resources.</t>
      </section>
      <section anchor="rpc-binding-considerations">
        <name>RPC Binding Considerations</name>
        <t>Legacy NFS servers typically listen for clients on UDP and TCP
port 2049. Additionally, they register these ports with a local
portmapper service <xref target="RFC1833"/>.</t>
        <t>A Legacy NFS server supporting RPC-over-RDMA version 2 and
registering itself with the RPC portmapper <bcp14>MAY</bcp14> choose an arbitrary port
or <bcp14>MAY</bcp14> use the alternative well-known port number for its RPC-over-RDMA
service (see <xref target="iana-cons"/>).
The chosen port <bcp14>MAY</bcp14> be registered with the RPC portmapper
using the netids assigned in
<xref section="12" sectionFormat="of" target="I-D.ietf-nfsv4-rpcrdma-version-two"/>.</t>
      </section>
      <section anchor="transport-considerations">
        <name>Transport Considerations</name>
        <section anchor="keep-alive">
          <name>Keep-Alive</name>
          <t>Legacy NFS client implementations can rely on connection keep-alive
to detect when a Legacy NFS server has become unresponsive.
When an NFS server is no longer responsive, client-side keep-alive
terminates the connection, triggering reconnection and retransmission
of outstanding RPC transactions.</t>
          <t>Some RDMA transports (such as the Reliable Connected QP type on
InfiniBand) have no keep-alive mechanism. Without a disconnect or
new RPC traffic, such connections can remain alive long after an NFS
server has become unresponsive or unreachable. Once an NFS client
has consumed all available RPC-over-RDMA version 2 credits on that
transport connection, it awaits a reply indefinitely before sending
another RPC request.</t>
          <t>Legacy NFS clients <bcp14>SHOULD</bcp14> reserve one RPC-over-RDMA version 2 credit
to use for periodic server or connection health assessment. Either
peer can use this credit to drive an RPC request on an otherwise idle
connection, triggering either an affirmative server response or a
connection termination.</t>
        </section>
        <section anchor="replay-detection">
          <name>Replay Detection</name>
          <t>Like NFSv4.0, Legacy NFS servers typically employ request replay
detection to reduce the risk of data and file namespace corruption
that could result when an NFS client retransmits a non-idempotent
NFS request.  A Legacy NFS server can send a cached response
when a replay is detected, rather than executing the request again.
Replay detection is not perfect, but it is usually adequate.</t>
          <t>For Legacy NFS servers, replay detection commonly utilizes heuristic
indicators such as the IP address of the NFS client, the source port
of the connection, the transaction ID of the request, and the
contents of the request's RPC and upper-layer protocol headers.
A Legacy NFS client is careful to re-use the same source port
when reconnecting so that Legacy NFS servers can better detect
RPC retransmission.</t>
          <t>However, a Legacy NFS client operating over an RDMA transport has no
control over connection source ports. It is almost certain that an
RPC request retransmitted on a new connection can never be detected
as a replay if the receiving Legacy NFS server includes the connection
source port in its replay detection heuristics.</t>
          <t>Therefore a Legacy NFS server using an RDMA transport should never
use a connection's source port as part of its NFS
request replay detection mechanism.</t>
        </section>
      </section>
    </section>
    <section anchor="auxproto">
      <name>Upper-Layer Bindings for NFS Version 2 and 3 Auxiliary Protocols</name>
      <t>Storage administrators typically deploy NFS versions 2 and 3 with
several other protocols, sometimes called the "NFS auxiliary
protocols." These are distinct RPC programs that define procedures
not part of the NFS RPC program (100003). The Upper-Layer
Bindings in this section apply to:</t>
      <ul spacing="normal">
        <li>Versions 2 and 3 of the MOUNT RPC program (100005) <xref target="RFC1813"/></li>
        <li>Versions 1, 3, and 4 of the NLM RPC program (100021) <xref target="RFC1813"/></li>
        <li>Version 1 of the NSM RPC program (100024), described in Chapter 11
of <xref target="XNFS"/></li>
        <li>Versions 2 and 3 of the NFSACL RPC program (100227). The NFSACL
program does not have a public definition. This document treats
the NFSACL program as a de facto standard, as there are several
interoperating implementations.</li>
      </ul>
      <section anchor="mount-nlm-and-nsm-protocols">
        <name>MOUNT, NLM, and NSM Protocols</name>
        <t>Historically, NFS/RDMA implementations have conveyed the
MOUNT, NLM, and NSM protocols via TCP. A Legacy NFS server
implementation <bcp14>MUST</bcp14> provide support for these auxiliary
protocols via TCP.</t>
        <t>Moreover, there is little benefit from transporting these
protocols via RDMA. Thus this document does not provide
an Upper-Layer binding for them.</t>
      </section>
      <section anchor="nfsacl-protocol">
        <name>NFSACL Protocol</name>
        <t>Legacy NFS clients and servers convey NFSACL procedures on the same
transport connection and port as the NFS RPC program (100003).
Utilizing the same port obviates the need for a separate rpcbind
query to discover server support for this RPC program.</t>
        <t>ACLs are typically small, but even large ACLs must be encoded and
decoded to some degree before being being stored in local filesystems.
Thus no data item in this Upper-Layer Protocol is DDP-eligible.</t>
        <t>For procedures whose replies do not include an ACL object, the size
of each Reply is determined directly from the NFSACL RPC program's XDR
definition.</t>
        <t>The NFSACL protocol does not provide a mechanism to determine the size
of a received ACL in advance. When preparing for responses that include
ACLs, Legacy NFS clients estimate a maximum reply size based on limits
within their local file systems. If that estimation is inadequate, a
Responder falls back to message continuation.</t>
      </section>
    </section>
    <section anchor="upper-layer-binding-for-nfs-version-4">
      <name>Upper-Layer Binding For NFS Version 4</name>
      <t>The Upper-Layer Binding specification in this section applies to
versions of the NFS RPC program defined in
NFS version 4.0 <xref target="RFC7530"/>,
NFS version 4.1 <xref target="RFC8881"/>,
and NFS version 4.2 <xref target="RFC7862"/>.</t>
      <section anchor="ddp-eligibility-1">
        <name>DDP-Eligibility</name>
        <t>Only the following XDR data items in the COMPOUND procedure of all
NFS version 4 minor versions are DDP-eligible:</t>
        <ul spacing="normal">
          <li>The opaque data field in the WRITE4args structure</li>
          <li>The linkdata field of the NF4LNK arm in the createtype4 union</li>
          <li>The opaque data field in the READ4resok structure</li>
          <li>The linkdata field in the READLINK4resok structure</li>
        </ul>
        <section anchor="the-nfsv42-readplus-operation">
          <name>The NFSv4.2 READ_PLUS operation</name>
          <t>NFS version 4.2 introduces an enhanced READ operation called
READ_PLUS <xref target="RFC7862"/>. READ_PLUS enables an NFS server to
compact returned READ data payloads. No part of a READ_PLUS
Reply is DDP-eligible.</t>
          <t>In a READ_PLUS result, returned file content appears as a list of one
or more of the following items:</t>
          <ul spacing="normal">
            <li>Regular data content, the same as the result of a traditional READ
operation</li>
            <li>Unallocated space in a file, where no data has been written, or
previously-written data has been removed via a hole-punch
operation</li>
            <li>A counted pattern</li>
          </ul>
          <t>Upon receipt of a READ_PLUS result, an NFSv4.2 client expands the
returned list into its preferred representation of the original
file content.</t>
          <t>Before receiving that result, an NFSv4.2 client is unaware of how
the NFS server has organized the file content. Thus it is not
possible to predict the size or structure of a READ_PLUS Reply
in advance. The use of direct data placement is therefore
challenging. Moreover, the usual benefits of hardware-assisted
data placement are entirely lost if the client must
parse the result of each READ I/O.</t>
          <t>Therefore this Upper Layer Binding does not make elements of an
NFSv4.2 READ_PLUS Reply DDP-eligible. Further, this Upper Layer
Binding recommends that NFS client implemenations avoid using
the READ_PLUS operation on NFS/RDMA mount points.</t>
        </section>
        <section anchor="nfs-version-4-compound-requests">
          <name>NFS Version 4 COMPOUND Requests</name>
          <section anchor="multiple-ddp-eligible-data-items">
            <name>Multiple DDP-eligible Data Items</name>
            <t>An NFS version 4 COMPOUND procedure can contain more than one
operation that carries a DDP-eligible data item. An NFS version 4
client provides XDR Position values in each Read chunk to
determine which chunk is associated with which argument data item.
However, NFS version 4 server and client implementations must agree
on how to pair Write chunks with returned result data items.</t>
            <t>A "READ operation" refers to any NFS version 4 operation
with a DDP-eligible result data item in the following lists.
An NFS version 4 client applies the mechanism specified in
<xref section="4.3.2" sectionFormat="of" target="I-D.ietf-nfsv4-rpcrdma-version-two"/>
to this class of operations as follows:</t>
            <ul spacing="normal">
              <li>If an NFS version 4 client wishes all DDP-eligible items in an NFS
reply to be conveyed inline, it leaves the Write list empty.</li>
            </ul>
            <t>An NFS version 4 server acts as follows:</t>
            <ul spacing="normal">
              <li>The first READ operation <bcp14>MUST</bcp14> use the first chunk in the Write list
in an NFS version 4 COMPOUND procedure. The next READ operation uses
the next Write chunk, and so on.</li>
              <li>If an NFS version 4 client has provided a matching non-empty Write
chunk, then the corresponding READ operation <bcp14>MUST</bcp14> return its
DDP-eligible data item using that chunk.</li>
              <li>If an NFS version 4 client has provided an empty matching Write
chunk, then the corresponding READ operation <bcp14>MUST</bcp14> return all of
its result data items inline.</li>
              <li>If a READ operation returns a union arm which does not contain a
DDP-eligible result, and the NFS version 4 client has provided a
matching non-empty Write chunk, an NFS version 4 server <bcp14>MUST</bcp14>
return an empty Write chunk in that Write list position.</li>
              <li>If there are more READ operations than Write chunks, then
remaining NFS Read operations in an NFS version 4 COMPOUND that
have no matching Write chunk <bcp14>MUST</bcp14> return their results inline.</li>
            </ul>
          </section>
          <section anchor="chunk-list-cmplx">
            <name>Chunk List Complexity</name>
            <t>By default, the RPC-over-RDMA version 2 protocol limits the
number of chunks or segments that may appear in Read or Write lists
(see <xref section="5.2" sectionFormat="of" target="I-D.ietf-nfsv4-rpcrdma-version-two"/>).</t>
            <t>These implementation limits are significant when Kerberos
integrity or privacy is in use <xref target="RFC7861"/>. GSS services increase the
size of credential material in RPC headers, potentially requiring the
more frequent use of less efficient Special Payload or
Continued Payload messages.</t>
            <t>NFS version 4 clients follow the prescriptions listed below when
constructing RPC-over-RDMA version 2 messages in the absence of an
explicit transport property exchange that alters these limits.
NFS version 4 servers <bcp14>MUST</bcp14> accept and process all such requests.</t>
            <ul spacing="normal">
              <li>The Read list can contain either a Call chunk, no more than one
Read chunk, or both a Call chunk and one Read chunk.</li>
              <li>The Write list can contain no more than one Write chunk.</li>
            </ul>
            <t>NFS version 4 clients wishing to send more complex chunk lists can
use transport properties to bound the complexity of NFS version 4
COMPOUNDs, limit the number of elements in scatter-gather operations,
and avoid other sources of chunk overruns at the receiving peer.</t>
          </section>
          <section anchor="nfs-version-4-compound-example">
            <name>NFS Version 4 COMPOUND Example</name>
            <t>The following example shows a Write list with three Write chunks, A,
B, and C. The NFS version 4 server consumes the provided Write
chunks by writing the results of the designated operations in the
compound request (READ and READLINK) back to each chunk.</t>
            <artwork><![CDATA[
  Write list:

     A --> B --> C

  NFS version 4 COMPOUND request:

     PUTFH LOOKUP READ PUTFH LOOKUP READLINK PUTFH LOOKUP READ
                   |                   |                   |
                   v                   v                   v
                   A                   B                   C
]]></artwork>
            <t>If the NFS version 4 client does not want the READLINK result
returned via RDMA, it provides an empty Write chunk for buffer B to
indicate that the READLINK result must be returned inline.</t>
          </section>
        </section>
      </section>
      <section anchor="reply-size-estimation-1">
        <name>Reply Size Estimation</name>
        <t>Within NFS version 4, there are certain variable-length result data
items whose maximum size cannot be estimated by clients reliably
because there is no protocol-specified size limit on these result
arrays. These include:</t>
        <ul spacing="normal">
          <li>The attrlist4 field</li>
          <li>Fields containing ACLs such as fattr4_acl, fattr4_dacl, and
fattr4_sacl</li>
          <li>Fields in the fs_locations4 and fs_locations_info4 data structures</li>
          <li>Fields which pertain to pNFS layout metadata, such as loc_body,
loh_body, da_addr_body, lou_body, lrf_body, fattr_layout_types,
and fs_layout_types</li>
        </ul>
        <section anchor="reply-size-estimation-for-minor-version-0">
          <name>Reply Size Estimation for Minor Version 0</name>
          <t>The NFS version 4.0 protocol itself does not impose any bound on the
size of NFS Calls or Replies.</t>
          <t>Variable-length fattr4 attributes make it particularly difficult for
clients to predict the maximum size of some NFS version 4.0 Replies.
Client implementations might rely upon internal architectural limits
to constrain the reply size, but such limits are not always reliable.
When an NFS version 4.0 client cannot predict the size of a Reply,
it can rely on message continuation to enable a Reply under any
circumstances.</t>
        </section>
        <section anchor="reply-size-estimation-for-minor-version-1-and-newer">
          <name>Reply Size Estimation for Minor Version 1 and Newer</name>
          <t>In NFS version 4.1 and newer minor versions, the csa_fore_chan_attrs
argument of the CREATE_SESSION operation contains a
ca_maxresponsesize field. The value in this field is
the absolute maximum size of replies generated by an NFS version 4.1
server.</t>
          <t>An NFS version 4 client can use this value when it is impossible
to estimate a reply size upper bound precisely.
In practice, objects such as ACLs, named attributes, layout bodies,
and security labels are much smaller than this maximum.</t>
        </section>
      </section>
      <section anchor="rpc-binding-considerations-1">
        <name>RPC Binding Considerations</name>
        <t>NFS version 4 servers are required to listen on TCP port 2049 and
are not required to register with an rpcbind service <xref target="RFC7530"/>.
Therefore, an NFS version 4 server supporting RPC-over-RDMA version 2
<bcp14>MUST</bcp14> use the alternative well-known port number for its RPC-over-RDMA
service defined in <xref target="iana-cons"/>.</t>
      </section>
      <section anchor="transport-considerations-1">
        <name>Transport Considerations</name>
        <section anchor="congestion-avoidance">
          <name>Congestion Avoidance</name>
          <t><xref section="3.1" sectionFormat="of" target="RFC7530"/> states:</t>
          <ul empty="true">
            <li>
              <t>Where an NFS version 4 implementation supports operation over the
IP network protocol, the supported transport layer between NFS and
IP <bcp14>MUST</bcp14> be an IETF standardized transport protocol that is
specified to avoid network congestion; such transports include TCP
and the Stream Control Transmission Protocol (SCTP).</t>
            </li>
          </ul>
          <t><xref section="2.9.1" sectionFormat="of" target="RFC8881"/> further states:</t>
          <ul empty="true">
            <li>
              <t>Even if NFS version 4.1 is used over a non-IP network protocol, it
is <bcp14>RECOMMENDED</bcp14> that the transport support congestion control.</t>
              <t>It is permissible for a connectionless transport to be used under
NFS version 4.1; however, reliable and in-order delivery of data
combined with congestion control by the connectionless transport
is <bcp14>REQUIRED</bcp14>. As a consequence, UDP by itself <bcp14>MUST NOT</bcp14> be used as
an NFS version 4.1 transport.</t>
            </li>
          </ul>
          <t>RPC-over-RDMA version 2 utilizes only reliable, connection-oriented
transports that guarantee in-order delivery, meeting all the above
requirements for NFS version 4.0 and 4.1.
See <xref section="4.2.1" sectionFormat="of" target="I-D.ietf-nfsv4-rpcrdma-version-two"/> for more details.</t>
        </section>
        <section anchor="retransmission-and-keep-alive">
          <name>Retransmission and Keep-alive</name>
          <t>NFS version 4 client implementations often rely on a transport-layer
connection keep-alive mechanism to detect when an NFS version 4 server
has become unresponsive. When an NFS server is no longer responsive,
client-side keep-alive terminates the connection, triggering
reconnection and RPC retransmission.</t>
          <t>Some RDMA transports (such as the Reliable Connected QP type on
InfiniBand) have no keep-alive mechanism. Without a disconnect or
new RPC traffic, such connections can remain alive long after an NFS
server has become unresponsive. Once an NFS client has consumed all
available RPC-over-RDMA version 2 credits on that transport
connection, it indefinitely awaits a reply before sending another RPC
request.</t>
          <t>NFS version 4 peers <bcp14>SHOULD</bcp14> reserve one RPC-over-RDMA version 2
credit for periodic server or connection health assessment.
Either peer can use this credit to drive an RPC request on an
otherwise idle connection, triggering either a quick affirmative
server response or immediate connection termination.</t>
          <t>In addition to network partition and request loss scenarios,
RPC-over-RDMA version 2 peers can terminate a connection when a
Transport header is malformed or when too many RPC-over-RDMA
messages are sent without a credit update. In such cases:</t>
          <ul spacing="normal">
            <li>If a transport error occurs (e.g., an RDMA2_ERROR type message is
received) just before the disconnect or instead of a disconnect,
the Requester <bcp14>MUST</bcp14> respond to that error as prescribed by the
specification of the RPC transport. Then the NFS version 4 rules
for handling retransmission apply.</li>
            <li>If there is a transport disconnect and the Responder has provided
no other response for a request, then only the NFS version 4 rules
for handling retransmission apply.</li>
          </ul>
        </section>
      </section>
      <section anchor="session-cons">
        <name>Session-Related Considerations</name>
        <t>The presence of an NFS version 4 session (as defined in <xref target="RFC8881"/>)
does not affect the operation of RPC-over-RDMA version 2. None of
the operations introduced to support NFS sessions (e.g., the SEQUENCE
operation) contain DDP-eligible data items. There is no need to
match the number of session slots with the available RPC-over-RDMA
version 2 credits.</t>
        <t>However, there are a few new cases where an RPC transaction can fail.
For example, a Requester might receive, in response to an RPC
request, an RDMA2_ERROR message with a rdma_err value of RDMA2_ERR_BADXDR.
These situations are not different from existing RPC errors, which an
NFS session implementation can already handle for other transport
types. Moreover, there might be no SEQUENCE result available to the
Requester to distinguish whether failure occurred before or after the
Responder executed the requested operations.</t>
        <t>When a transport error occurs (e.g., an RDMA2_ERROR type message is
received), the Requester proceeds, as usual, to match the incoming
XID value to a waiting RPC Call. The Requester terminates the RPC
transaction and reports the result status to the RPC consumer. The
Requester's session implementation then determines the session ID and
slot for the failed request and performs slot recovery to make that
slot usable again. Otherwise, that slot is rendered permanently
unavailable.</t>
        <t>When an NFS session is not present (for example, when NFS version 4.0
is in use), a transport error does not indicate whether the server
has processed the arguments of the RPC Call, or whether the server
has accessed or modified client memory associated with that RPC.</t>
      </section>
    </section>
    <section anchor="upper-layer-binding-for-nfs-version-4-callbacks">
      <name>Upper-Layer Binding For NFS Version 4 Callbacks</name>
      <t>The NFS version 4 family of protocols supports server-initiated
callbacks to notify NFS version 4 clients of events such as recalled
delegations.</t>
      <section anchor="nfs-version-40-callback">
        <name>NFS Version 4.0 Callback</name>
        <t>An NFS version 4.0 client uses the SETCLIENTID operation for advertising
the IP address, port, and netid of its NFS version 4.0 callback
service. When an NFS version 4.0 server provides a backchannel
service to an NFS version 4.0 client that uses RPC-over-RDMA version
2 for its forward channel, the server <bcp14>MUST</bcp14> advertise the backchannel
service using either the "tcp" or "tcp6" netid.</t>
        <t>Because the NFSv4.0 backchannel does not operate on RPC-over-RDMA,
this document does not specify an Upper-Layer binding
for the NFSv4.0 backchannel RPC program.</t>
      </section>
      <section anchor="nfs-version-41-callback">
        <name>NFS Version 4.1 Callback</name>
        <t>In NFS version 4.1 and newer minor versions, callback operations may
appear on the same connection that is in use for NFS version 4
forward channel client requests. NFS version 4 clients and servers
<bcp14>MUST</bcp14> use the mechanisms described in
<xref section="4.5" sectionFormat="of" target="I-D.ietf-nfsv4-rpcrdma-version-two"/>
to convey backchannel operations on an RPC-over-RDMA version 2 transport.</t>
        <t>The csa_back_chan_attrs argument of the CREATE_SESSION operation
contains a ca_maxresponsesize field. The value in this field is the
absolute maximum size of backchannel replies generated by a replying
NFS version 4 client.</t>
        <t>There are no DDP-eligible data items in callback procedures defined
in NFS version 4.1 or NFS version 4.2. However, some callback
operations, such as messages that convey device ID information, can
be sizeable. A sender can use Message Continuation or a Special Payload
message in this situation.</t>
        <t>When an NFS version 4.1 client can support Special Payload Calls in
its backchannel, it reports a backchannel ca_maxrequestsize that is
larger than the connection's inline thresholds. Otherwise, an NFS
version 4 server <bcp14>MUST</bcp14> use only Simple Payload or Continued Payload
messages to convey backchannel operations.</t>
      </section>
    </section>
    <section anchor="extending-ulbs">
      <name>Extending NFS Upper-Layer Bindings</name>
      <t>RPC programs such as NFS must have an Upper-Layer Binding
specification to operate on an RPC-over-RDMA version 2 transport
<xref target="I-D.ietf-nfsv4-rpcrdma-version-two"/>. Via standards action, the
Upper-Layer Binding specified in this document can be extended to
cover versions of the NFS version 4 protocol specified after NFS
version 4 minor version 2, or to cover separately published
extensions to an existing NFS version 4 minor version, as described
in <xref target="RFC8178"/>.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>RPC-over-RDMA version 2 supports all RPC security models, including
RPCSEC_GSS security and transport-level security <xref target="RFC7861"/>. The
choice of what Direct Data Placement mechanism to convey RPC argument
and results does not affect this since it changes only the method of
data transfer. Because the current document defines only the binding
of the NFS protocols atop RPC-over-RDMA version 2
<xref target="I-D.ietf-nfsv4-rpcrdma-version-two"/>, all relevant security
considerations are, therefore, described at that layer.</t>
    </section>
    <section anchor="iana-cons">
      <name>IANA Considerations</name>
      <t>The use of direct data placement in NFS introduces a need for an
additional port number assignment for networks that share traditional
UDP and TCP port spaces with RDMA services. The DDP protocol
is such an example <xref target="RFC5041"/>.</t>
      <t>For this purpose, the current document lists a set of port number
assignments that IANA has already assigned for NFS/RDMA
in the IANA port registry,
according to the guidelines described in <xref target="RFC6335"/>.</t>
      <artwork><![CDATA[
  nfsrdma 20049/tcp Network File System (NFS) over RDMA
  nfsrdma 20049/udp Network File System (NFS) over RDMA
  nfsrdma 20049/sctp Network File System (NFS) over RDMA
]]></artwork>
      <t>The author requests that IANA add the current document as a reference
for the existing nfsrdma port assignments. This document does not alter
these assignments.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.ietf-nfsv4-rpcrdma-version-two">
          <front>
            <title>RPC-over-RDMA Version 2 Protocol</title>
            <author fullname="Charles Lever">
              <organization>Oracle Corporation</organization>
            </author>
            <author fullname="David Noveck">
              <organization>NetApp</organization>
            </author>
            <date day="2" month="January" year="2022"/>
            <abstract>
              <t>   This document specifies the second version of a transport protocol
   that conveys Remote Procedure Call (RPC) messages using Remote Direct
   Memory Access (RDMA).  This version of the protocol is extensible.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-rpcrdma-version-two-06"/>
        </reference>
        <reference anchor="RFC7530">
          <front>
            <title>Network File System (NFS) Version 4 Protocol</title>
            <author fullname="T. Haynes" initials="T." role="editor" surname="Haynes">
              <organization/>
            </author>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck">
              <organization/>
            </author>
            <date month="March" year="2015"/>
            <abstract>
              <t>The Network File System (NFS) version 4 protocol is a distributed file system protocol that builds on the heritage of NFS protocol version 2 (RFC 1094) and version 3 (RFC 1813).  Unlike earlier versions, the NFS version 4 protocol supports traditional file access while integrating support for file locking and the MOUNT protocol. In addition, support for strong security (and its negotiation), COMPOUND operations, client caching, and internationalization has been added.  Of course, attention has been applied to making NFS version 4 operate well in an Internet environment.</t>
              <t>This document, together with the companion External Data Representation (XDR) description document, RFC 7531, obsoletes RFC 3530 as the definition of the NFS version 4 protocol.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7530"/>
          <seriesInfo name="DOI" value="10.17487/RFC7530"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck">
              <organization/>
            </author>
            <author fullname="C. Lever" initials="C." surname="Lever">
              <organization/>
            </author>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently.  The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol. </t>
              <t>This document obsoletes RFC 5661.  It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes">
              <organization/>
            </author>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC1833">
          <front>
            <title>Binding Protocols for ONC RPC Version 2</title>
            <author fullname="R. Srinivasan" initials="R." surname="Srinivasan">
              <organization/>
            </author>
            <date month="August" year="1995"/>
            <abstract>
              <t>This document describes the binding protocols used in conjunction with the ONC Remote Procedure Call (ONC RPC Version 2) protocols. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1833"/>
          <seriesInfo name="DOI" value="10.17487/RFC1833"/>
        </reference>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson">
              <organization/>
            </author>
            <author fullname="N. Williams" initials="N." surname="Williams">
              <organization/>
            </author>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS).  This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings.  This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="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">
              <organization/>
            </author>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="J. Touch" initials="J." surname="Touch">
              <organization/>
            </author>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund">
              <organization/>
            </author>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <date month="August" year="2011"/>
            <abstract>
              <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry.  It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
              <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP).  It also updates the DNS SRV specification to clarify what a service name is and how it is registered.  This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="165"/>
          <seriesInfo name="RFC" value="6335"/>
          <seriesInfo name="DOI" value="10.17487/RFC6335"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC8178">
          <front>
            <title>Rules for NFSv4 Extensions and Minor Versions</title>
            <author fullname="D. Noveck" initials="D." surname="Noveck">
              <organization/>
            </author>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document describes the rules relating to the extension of the NFSv4 family of protocols.  It covers the creation of minor versions, the addition of optional features to existing minor versions, and the correction of flaws in features already published as Proposed Standards.  The rules relating to the construction of minor versions and the interaction of minor version implementations that appear in this document supersede the minor versioning rules in RFC 5661 and other RFCs defining minor versions.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8178"/>
          <seriesInfo name="DOI" value="10.17487/RFC8178"/>
        </reference>
        <reference anchor="XNFS">
          <front>
            <title>Protocols for Interworking: XNFS, Version 3W</title>
            <author>
              <organization>The Open Group</organization>
            </author>
            <date year="1998" month="January"/>
          </front>
        </reference>
        <reference anchor="RFC1094">
          <front>
            <title>NFS: Network File System Protocol specification</title>
            <author fullname="B. Nowicki" initials="B." surname="Nowicki">
              <organization/>
            </author>
            <date month="March" year="1989"/>
            <abstract>
              <t>This RFC describes a protocol that Sun Microsystems, Inc., and others are using.  A new version of the protocol is under development, but others may benefit from the descriptions of the current protocol, and discussion of some of the design issues.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1094"/>
          <seriesInfo name="DOI" value="10.17487/RFC1094"/>
        </reference>
        <reference anchor="RFC1813">
          <front>
            <title>NFS Version 3 Protocol Specification</title>
            <author fullname="B. Callaghan" initials="B." surname="Callaghan">
              <organization/>
            </author>
            <author fullname="B. Pawlowski" initials="B." surname="Pawlowski">
              <organization/>
            </author>
            <author fullname="P. Staubach" initials="P." surname="Staubach">
              <organization/>
            </author>
            <date month="June" year="1995"/>
            <abstract>
              <t>This paper describes the NFS version 3 protocol.  This paper is provided so that people can write compatible implementations.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1813"/>
          <seriesInfo name="DOI" value="10.17487/RFC1813"/>
        </reference>
        <reference anchor="RFC5041">
          <front>
            <title>Direct Data Placement over Reliable Transports</title>
            <author fullname="H. Shah" initials="H." surname="Shah">
              <organization/>
            </author>
            <author fullname="J. Pinkerton" initials="J." surname="Pinkerton">
              <organization/>
            </author>
            <author fullname="R. Recio" initials="R." surname="Recio">
              <organization/>
            </author>
            <author fullname="P. Culley" initials="P." surname="Culley">
              <organization/>
            </author>
            <date month="October" year="2007"/>
            <abstract>
              <t>The Direct Data Placement protocol provides information to Place the  incoming data directly into an upper layer protocol's receive buffer  without intermediate buffers.  This removes excess CPU and memory  utilization associated with transferring data through the  intermediate buffers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5041"/>
          <seriesInfo name="DOI" value="10.17487/RFC5041"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Tom Talpey, who contributed the text of <xref target="chunk-list-cmplx"/>.
David Noveck contributed the text of <xref target="session-cons"/> and <xref target="extending-ulbs"/>.
The author also wishes to thank Bill Baker and Greg Marsden for their
support of this work.</t>
      <t>Special thanks go to Transport Area Directors Zaheduzzaman Sarker,
NFSV4 Working Group Chairs Brian Pawlowski, and David Noveck, and
NFSV4 Working Group Secretary Thomas Haynes for their support.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
jDOyVV1wguMOpe2E565oJudjGI7qZeyF+emGGrEJioMc7pTbzXmQWsE0CnYv
yN/9CEmdNbjVNXpvPJEVbmTWqdeyc48/K+JkGe9yJEwTvWHT1pt787uP/XsI
hv5KCSDU0PXJjFGV9dNIRq4C9uXoaNuNeIdUGSHWODv6cLSbhoqlYrbFDw/E
sXJO51STCwQqZcK9hb3KdfzzFvSgZHjF9rgV3RQQZzRVcikiL0NTmZLzIWz6
3mo27GBUA/IxVGNNVoW+Tr5d5JsXh/skJG/9pQWbrsFmo8k4ybk5Fm9FIB8k
OY9K/lwHn4FQS+GZZEvCtYHi2dEkm5JmHnqa1uO2gwZv+c6yusmlXxcfWnYF
1vMqu/PXWlCk/vzy5Td0GO7kBEZCFtIHL14cfvccvPEH/noWqSS57LX/Xpf/
sfdc1j7uRWqbpO47+mNL8RrOiETgoHFyyO1I8tcjgqsftKYHSa7GCAQa3sYS
1QV2XChuGUyf57/ew5HAE32UYSMGxKA8paC+vBYmsPn/3KvqPZIaIzfJXtVr
fWXKjd1iHqHmGjT1x/ChWpxNontpdgYrgJYnBuJA/QHQld088Govb8x/h+DL
l4Fp5x4Vj2b6IyQyPMY5/eoGTCbolzfmRkb9/gKsqN+bxuVySWmL4yLK+1v+
D0khibHyKO5Xy0df1nT6kBY5AiEQ1Y73K/2nAYPX/fqrWYNQXprmBu9BB9b4
6VD3/xTU8coU8PybBpQSOEJ3OGV2U3DQnWKHmy7HVgDz19gWr4C6WtVr4Jkf
zLaKdxkXoTFnpv4fc0T7cGxuAAA=

-->

</rfc>
