RFC 5043

Stream Control Transmission Protocol (SCTP) Direct Data Placement (DDP) Adaptation

πŸ“… published October 2007, from ietf

RFC 5043: Stream Control Transmission Protocol (SCTP) Direct Data Placement (DDP) Adaptation πŸ’–

okay bestie, let's get into RFC 5043 πŸ¦‹ It's a Standards Track doc from the Network Working Group, dated October 2007, and it's all about how to run Direct Data Placement (DDP) over the Stream Control Transmission Protocol (SCTP). The editors are C. Bestler, Ed. from Neterion and R. Stewart, Ed. from Cisco Systems, Inc. It doesn't list any Obsoletes or Updates entries, so it isn't replacing or changing anything else πŸŽ€

Status of This Memo ✨

This doc is an Internet standards track protocol for the Internet community, and it's asking for discussion and suggestions for improvements πŸ’¬ For the current standardization state and status of this protocol, check the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited 🌈

Abstract 🌸

This doc specifies an adaptation layer that gives you a Lower Layer Protocol (LLP) service for Direct Data Placement (DDP), using the Stream Control Transmission Protocol (SCTP) 🧚

Table of Contents πŸ’œ

1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
  1.1.  Conventions  . . . . . . . . . . . . . . . . . . . . . . .  3
2.  Definitions  . . . . . . . . . . . . . . . . . . . . . . . . .  3
3.  Motivation . . . . . . . . . . . . . . . . . . . . . . . . . .  5
4.  Overview . . . . . . . . . . . . . . . . . . . . . . . . . . .  5
5.  Data Formats . . . . . . . . . . . . . . . . . . . . . . . . .  5
  5.1.  Adaptation Layer Indicator . . . . . . . . . . . . . . . .  5
  5.2.  Payload Data Chunks  . . . . . . . . . . . . . . . . . . .  6
    5.2.1.  DDP Source Sequence Number (DDP-SSN) . . . . . . . . .  6
    5.2.2.  DDP Segment Chunk  . . . . . . . . . . . . . . . . . .  7
    5.2.3.  DDP Stream Session Control . . . . . . . . . . . . . .  7
6.  DDP Stream Sessions  . . . . . . . . . . . . . . . . . . . . .  8
  6.1.  Sequencing . . . . . . . . . . . . . . . . . . . . . . . .  9
  6.2.  Legal Sequence: Active/Passive Session Accepted  . . . . .  9
  6.3.  Legal Sequence: Active/Passive Session Rejected  . . . . .  9
  6.4.  Legal Sequence: Active/Passive Session Non-ULP Rejected  . 10
  6.5.  ULP-Specific Sequencing  . . . . . . . . . . . . . . . . . 10
  6.6.  Other Sequencing Rules . . . . . . . . . . . . . . . . . . 10
7.  SCTP Endpoints . . . . . . . . . . . . . . . . . . . . . . . . 11
  7.1.  Adaptation Layer Indication Restriction  . . . . . . . . . 11
  7.2.  Multihoming Implications . . . . . . . . . . . . . . . . . 11
8.  Number of Streams  . . . . . . . . . . . . . . . . . . . . . . 12
9.  Fragmentation  . . . . . . . . . . . . . . . . . . . . . . . . 12
10. Sequenced Unordered Operation  . . . . . . . . . . . . . . . . 13
11. Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . 13
  11.1. Association Initialization . . . . . . . . . . . . . . . . 13
  11.2. Chunk Bundling . . . . . . . . . . . . . . . . . . . . . . 14
  11.3. Association Termination  . . . . . . . . . . . . . . . . . 14
12. IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 15
13. Security Considerations  . . . . . . . . . . . . . . . . . . . 15
14. Contributors . . . . . . . . . . . . . . . . . . . . . . . . . 16
15. Acknowledgments  . . . . . . . . . . . . . . . . . . . . . . . 16
16. References . . . . . . . . . . . . . . . . . . . . . . . . . . 16
  16.1. Normative References . . . . . . . . . . . . . . . . . . . 16
  16.2. Informative References . . . . . . . . . . . . . . . . . . 16

1. Introduction 🌟

This doc describes a method to adapt Direct Data Placement [RFC5041] to Stream Control Transmission Protocol (SCTP) [RFC4960].

Some implementations can bake this adaptation layer into their SCTP implementations to get maximum performance, and the behavior of SCTP stays unaffected πŸ™Œ An SCTP layer that's used only by this adaptation layer gets to take certain optimizations, because it's only using a limited subset of SCTP capabilities. So to allow optimization for these implementations, we specify the use of the new adaptation layer indication as defined in [RFC5061].

1.1. Conventions πŸ“

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119].

2. Definitions πŸ“š

okay, here's the glossary, and it's lowkey the most important part so pay attention πŸ€“

  • DDP: See Direct Data Placement Protocol.
  • DDP Endpoint: The logical sender/receiver of DDP Segments. An SCTP stream pair is not assumed to have a DDP Endpoint. DDP Segments may only be sent once a DDP Endpoint has been assigned to an SCTP stream pair by a local interface.
  • DDP Source Stream Sequence Number (DDP-SSN): A stream-specific sequence number assigned by the adaptation layer for each SCTP Data Chunk sent. This is the order that chunks were submitted to SCTP, no matter in what order they are actually sent or received.
  • DDP Segment: The smallest unit of data transfer for the DDP protocol. It includes a DDP Header and ULP Payload (if present). A DDP Segment should be sized to fit within the Lower Layer Protocol MULPDU (Marker PDU Aligned (MPA) Upper Layer PDU).
  • DDP Segment Chunk: An SCTP Payload Data Chunk that encapsulates the DDP-SSN and a DDP Segment.
  • DDP Stream: A sequence of DDP Segments whose ordering is defined by the LLP. For SCTP, a DDP stream maps directly to a bidirectional pair of SCTP streams with the same Stream IDs. Note that DDP has no ordering guarantees between DDP streams.
  • DDP Stream Session: A single pairing of DDP Endpoints over a DDP stream that lasts from an Initiation message through the Termination message(s).
  • DDP Stream Session Control Message: A message that is used to control the association of the DDP Endpoint with the DDP stream.
  • Direct Data Placement Protocol (DDP): A wire protocol that supports Direct Data Placement by associating explicit memory buffer placement information with the LLP payload units.
  • Lower Layer Protocol (LLP): In the context of DDP, the protocol layer beneath RDMA that provides a reliable transport service. The SCTP DDP adaption is one of the initially defined LLPs for DDP.
  • Protection Domain: A common local interface convention to control which Steering Tags (STags) are valid with which DDP Endpoints. Under this convention, both the Steering Tag and DDP Endpoint are created within the context of a Protection Domain, and the Steering Tag may only be enabled for DDP Endpoints created under the same Protection Domain.
  • RDMA: Remote Direct Memory Access.
  • RNIC: RDMA Network Interface Card.
  • SCTP association: A protocol relationship between two SCTP endpoints. An SCTP association supports multiple SCTP streams.
  • SCTP Data Chunk: An SCTP Chunk used to convey Payload Data. There can be multiple Chunks within each SCTP packet. Other Chunks are used to control the SCTP Association.
  • SCTP endpoint: The logical sender/receiver of SCTP packets. On a multihomed host, an SCTP endpoint is represented to its peers as a combination of an SCTP port number and a set of eligible destination transport addresses to which SCTP packets can be sent.
  • SCTP Stream: A unidirectional logical channel established from one to another associated SCTP endpoint. There can be multiple SCTP streams within each SCTP association. An SCTP stream is used to form one direction of a DDP stream.
  • Transmission Sequence Number (TSN): A 32-bit sequence number used internally by SCTP. One TSN is attached to each chunk containing user data to permit the receiving SCTP endpoint to acknowledge its receipt and detect duplicate deliveries.
  • Upper Layer Protocol (ULP): In the context of RDMA protocol specifications, this is the layer using RDMA services. Typically, this is an application or middleware. A primary goal of RDMA protocols is to enable direct transfer of payload to/from ULP Buffers.

3. Motivation πŸ’‘

This doc specifies an adaptation layer that fulfills the requirements of a Lower Layer Protocol (LLP) for DDP, using a specific subset of SCTP capabilities.

The defined protocol is meant to be implementable over existing SCTP stacks, while clearly spelling out which parts of SCTP are required to enable an implementation to be optimized specifically for DDP 🎯

4. Overview πŸ¦‹

The adaptation layer uses a pair of like-numbered SCTP streams within an SCTP Association to provide a reliable DDP stream between two DDP Endpoints. Except as specifically noted, each DDP Segment submitted by the DDP layer is encoded as a single unordered SCTP Data Chunk. In addition to the DDP Segment, the Data Chunk also contains a sequence number (DDP-SSN) that reflects the order in which DDP submitted the segments for that stream.

A DDP Stream Session is defined by DDP Stream Session Control Chunks that manage the state of the DDP Stream Session. These Chunks dynamically bind DDP Endpoints to the DDP Stream Session, and DDP Segment Chunks are used to reliably deliver DDP Segments within the session 🫢

5. Data Formats πŸŽ€

5.1. Adaptation Layer Indicator 🧩

The DDP/SCTP adaptation layer uses all streams within an SCTP association. An SCTP Association that has had the DDP Adaptation Indication negotiated will carry only SCTP Data Chunks as defined in this document.

It's presumed that handling incoming data chunks for DDP-enabled associations is different enough from routine SCTP associations that it's undesirable to require support for mixing DDP and non-DDP streams in a single association. If an application wants both DDP and non-DDP traffic with the same remote host, more than a single association is required πŸ™ƒ

We define an Adaptation Indication that MUST appear in the INIT or INIT-ACK, with the following format as defined in [RFC5061].

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Type =0xC006           |    Length = Variable          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Adaptation Indication                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Adaptation Indication:

The following value has been assigned for DDP:

DDP                        - 0x00000001

5.2. Payload Data Chunks 🌈

The DDP SCTP adaptation uses two types of SCTP Payload Data Chunks, told apart by the Payload Protocol Identifier:

  • DDP Segment Chunks are used to reliably deliver DDP Segments sent between DDP Endpoints.
  • DDP Stream Session Control Messages are used to establish and tear down DDP Stream Sessions, specifically by controlling the binding of DDP Endpoints with SCTP streams.

Payload Protocol Identifier:

The following values are defined for DDP in this document and have been assigned by IANA:

DDP Segment Chunk          - 16
DDP Stream Session Control - 17

5.2.1. DDP Source Sequence Number (DDP-SSN) πŸ’–

Okay bestie, every SCTP Payload Data Chunk this adaptation layer uses carries a DDP Source Sequence Number (DDP-SSN) πŸ’…. The DDP-SSN keeps track of the order the messages were handed to the SCTP layer for whichever SCTP stream is in use ✨. The DDP-SSN MUST have the same value that the SCTP Stream Sequence Number (SSN) would have been assigned if ordered SCTP Payload Data Chunks had been used instead of unordered ones πŸŽ€.

Here's why we need it πŸ«–:

  • The SCTP Stream Sequence Number (SSN) is not giving what we need, because every message in this document uses unordered Payload Data Chunks so the receiving SCTP layer can deliver them promptly πŸ¦‹.
  • The SCTP Transmission Sequence Number (TSN) is also not it for working out the original order of Data Chunks within a stream 😭. The sending SCTP layer is allowed to optimize the transmission sequence of unordered Data Chunks to encourage Chunk Bundling, or for other purposes 🌸.

5.2.2. DDP Segment Chunk 🌈

   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          DDP-SSN              |         DDP Segment           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
   |                                                               |
   |                         ...                                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

DDP Segments are as defined in [RFC5041]. The DDP Segment Chunk serves the same purpose as the MPA [RFC5044] Upper Layer PDU (MULPDU), in that it carries DDP Segments over a reliable protocol with added sequencing information 🧚.

5.2.3. DDP Stream Session Control πŸ‘‘

   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          DDP-SSN              |    Function Code              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Private Data (Dependent on Function Code)          |
   |                         ...                                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

The following function code values are defined for DDP in this document:

      DDP Stream Session Initiate         - 0x001
      DDP Stream Session Accept           - 0x002
      DDP Stream Session Reject           - 0x003
      DDP Stream Session Terminate        - 0x004

ULP-supplied Private Data MUST be included for DDP Stream Session Initiate, DDP Stream Session Accept, and DDP Stream Session Reject messages. However, the ULP supplied Private DATA MAY be of zero length 🫢.

Private Data length MUST NOT exceed 512 bytes in any message πŸ™ˆ.

Private Data MUST NOT be included in the DDP Stream Session Terminate message πŸ’€.

Received DDP Stream Session Control messages SHOULD be reported to the ULP. If reported, any supplied Private Data MUST be available for the ULP to examine πŸ‘€.

The DDP/SCTP adaptation layer MAY limit the number of Session Initiate requests that it has submitted to the ULP. When a DDP Stream Session Initiate cannot be forwarded to the ULP due to such a limit, the adaptation layer MUST respond with a DDP Stream Session Terminate message πŸ“.

6. DDP Stream Sessions ✨

A DDP Endpoint is the logical sender/receiver of DDP Segments. A DDP stream connects two DDP Endpoints using a matched pair of SCTP streams having the same SCTP Stream Identifiers πŸ¦‹.

A DDP Stream Session defines the sequence of Data Chunks exchanged between two DDP Endpoints over a DDP stream that has a distinct beginning and end, as defined in the following section. Data Chunks from one DDP Stream Session are never carried over to the next session. Each Data Chunk unambiguously belongs to exactly one session. The DDP-SSNs assigned to the Data Chunks for a session MUST NOT have any gaps πŸ’….

The local interface MAY dynamically associate a DDP Endpoint with the DDP stream based upon the initial exchanges of a DDP Session, and dynamically terminate that association at the session's end. Alternately, a specialized local interface could simply statically map DDP Endpoints to DDP streams 🌸.

Conventionally, local interfaces for RDMA have deferred the selection of the DDP Endpoint until after the ULP decides to accept an RDMA connection request. But that is a local interface choice and not a wire protocol requirement πŸ€·β€β™€οΈ.

A DDP stream is associated with at most one Protection Domain during a single DDP Stream Session. On the passive side, the association is typically deferred until the DDP Stream Session Accept message πŸŽ€.

6.1. Sequencing

The DDP-SSN is reset to zero at the beginning of each DDP Stream Session πŸ”„.

The normative sequence for considering Payload Data Chunks within a given session is based upon each Data Chunk's DDP-SSN. When considered in this normative sequence, all sessions MUST conform to one of the patterns defined in this section πŸ“‹.

If the adaptation layer receives a Payload Data Chunk that conforms to none of the enumerated legal patterns, the DDP Stream Session MUST be terminated 🚫.

In this DDP Stream Session sequence, one DDP Endpoint assumes the active role in requesting a DDP Stream Session, which the other side accepts.

Active side sends a DDP Stream Session Initiate message.

Passive side sends a DDP Stream Session Accept message.

Each side may then send zero or more DDP Segments with increasing DDP-SSNs, subject to any flow control imposed by other protocol layers.

The final User Data Chunk for each side MAY be a DDP Stream Terminate. At least one side MUST send a DDP Stream Terminate. Note that this would follow any RDMAP Terminate message, which to the adaptation layer is simply another DDP Segment 🫠.

DDP Stream Sessions allow each party to send a single non-payload message before the other end commits specific resources to the session. This allows each end to determine which resources are to be used, how they are to be configured, or even if the session should be granted 🧐.

These decisions MAY be influenced by the need to assign a specific Protection Domain, to determine how many RDMA Read Credits are required, or to determine how many receive operations the ULP should enable.

Because of these or other factors, the passive side MAY choose to reject a DDP Stream Session Request. This results in the following legal sequence:

Active side sends a DDP Stream Session Initiate message.

Passive side sends a DDP Stream Session Reject message.

A DDP Stream Session Reject message MUST NOT be sent unless the rejection is at the direction of the ULP πŸ›‘.

Acceptance or rejection of DDP Stream Session Initiate messages SHOULD be under the control of the ULP. This MAY require passing an event to the ULP. There MUST be a finite limit on the number of such requests that are pending a ULP decision. When more session requests are received, the passive side MUST respond to the Initiate message with a DDP Stream Terminate Message 🚦.

6.5. ULP-Specific Sequencing 🧩

An implementation MAY choose to support additional ULP-specific sequences, but MUST NOT do so unless requested to do so by the ULP.

A defined ULP MUST be able to operate using only the defined mandatory session sequences. Any additional sequences must be used only for optional optimizations ✨.

6.6. Other Sequencing Rules πŸ“œ

A DDP Stream Session Control message MUST NOT be sent if it may be received before a prior DDP Stream Session Control message within the same DDP Stream Session.

An active side of a DDP Stream Session MUST NOT send a DDP Segment that might be received before the DDP Stream Session Initiate message.

This MAY be determined by SCTP acking of the Data Chunk used to carry the DDP Stream Session Initiate message, or by receipt of a responsive DDP Stream Session Control message.

A DDP Stream Identifier MUST NOT be reused for another DDP Stream Session while any Data Chunk from a prior session might be outstanding πŸ”’.

7. SCTP Endpoints 🌷

7.1. Adaptation Layer Indication Restriction

The local interface MUST allow the ULP to specify an SCTP endpoint to use a specific Adaptation Indication. It MAY require the ULP to do so.

Once an endpoint decides on its acceptable Adaptation Indication(s), it SHOULD terminate all requests to establish an association with any different Adaptation Indication πŸ™…β€β™€οΈ.

An SCTP implementation MAY choose to accept association requests for a given SCTP endpoint only until one association for the endpoint has been established. At that point, it MAY choose to restrict all further associations for the same endpoint to use the same Adaptation Indication πŸ”.

7.2. Multihoming Implications 🌐

SCTP allows an SCTP endpoint to be associated with multiple IP addresses, potentially representing different interface devices. Distribution of the logic for a single DDP stream across multiple input devices can be very undesirable, resulting in complex cache coherency challenges πŸ˜΅β€πŸ’«. Therefore, the local interface MAY restrict DDP-enabled SCTP endpoints to a single IP address, or to a set of IP addresses that are all assigned to the same input device ("RNIC").

The default binding of a DDP-enabled SCTP endpoint SHOULD NOT cover more than a single IP address unless doing so results in neither additional bus traffic nor duplication of memory registration resources. This will frequently result in a different default than for SCTP endpoints that are not DDP enabled πŸ’….

Applications MAY choose to avoid using out-of-band methods for communicating the set of IP addresses used by an SCTP endpoint when there is potential confusion as to the intended scope of the SCTP endpoint. For example, assuming the SCTP endpoint consists of all IP addresses Advertised by DNS may work for a general purpose SCTP endpoint but not a DDP-enabled one πŸ€”.

Even when multihoming is supported, ULPs are cautioned that they SHOULD NOT use ULP control of the source address in an attempt to load-balance a stream across multiple paths. A receiving DDP/SCTP implementation that chooses to support multihoming SHOULD optimize its design on the assumption that multihoming will be used for network fault tolerance, and not to load-balance between paths. This is consistent with recommended SCTP practices πŸ›‘οΈ.

8. Number of Streams πŸŽ€

DDP streams are bidirectional. They are always composed by pairing the inbound and outbound SCTP streams with the same SCTP Stream Identifier πŸ¦‹.

The adaptation layer should request the maximum number of SCTP streams it will wish to use over the lifetime of the association. SCTP streams must still be bound to DDP Endpoints, and a DDP-enabled SCTP association does not support ordered Data Chunks. Therefore, the mere existence of an SCTP stream is unlikely to require significant supporting resources 🌸.

This mapping uses an SCTP association to carry one or more DDP streams. Each DDP stream will be mapped to a pair of SCTP streams with the same SCTP stream number. The adaptation MUST initialize all of its SCTP associations with the same number of inbound and outbound streams πŸ’œ.

9. Fragmentation ✨

okay so a DDP/SCTP Receiver already handles fragmentation at both the IP and DDP layers πŸ’… which means SCTP layer segmenting is mostly going to get skipped, bestie 🫢

As a Lower Layer Protocol (LLP) for DDP, the SCTP adaptation layer MUST tell the DDP layer the maximum DDP Segment size it will support πŸŽ€ ideally that's the biggest value you can handle without IP or SCTP fragmentation, or 516 bytes, whichever is larger 🌸

516 bytes is the minimum needed so a DDP Stream Session Control Message can carry 512 bytes of Private Data πŸ’–

SCTP data chunk fragmentation MUST NOT be used unless the only other option is IP fragmentation πŸ™ˆ

The SCTP adaptation layer SHOULD set the maximum DDP Segment size below the theoretical maximum so there's room to bundle Control Chunks in the same SCTP packet 🧚

The SCTP adaptation layer MUST reject DDP Segments that are bigger than the maximum size it specified 🚫


10. Sequenced Unordered Operation πŸ¦‹

The adaptation layer MUST set the Unordered option on all Data Chunks (U Flag set to one) πŸ’œ the SCTP layer is expected to deliver unordered Data Chunks without delay ⭐

Since DDP uses unordered SCTP delivery, the receiver MUST NOT rely on the SCTP Transmission Sequence Number (TSN) to tell it the ordering of DDP Segments πŸ™ˆ like, just because the SCTP Data Chunk for a DDP Segment sits before the cumulative ack point does NOT mean every earlier DDP segment has been placed πŸ’€ and the SCTP sender doesn't have to send unordered Data Chunks in the order they were handed over 🌈

The DDP-SSN can be used without any special logic to figure out the submission sequence when the maximum number of in-flight messages is less than 32768 ✨ same goes if the sending SCTP accepts no more than 32767 Data Chunks for a single stream without assigning TSNs πŸ“

If SCTP does accept more than 32768 Data chunks for a single stream without assigning TSNs, the sending DDP must just refrain from sending more than 32767 Data Chunks for a single stream without acknowledgment πŸ”₯ and note that it MUST NOT rely on ULP flow control for this πŸ’… typical ULP flow control only deals with untagged messages, not DDP segments, so it's not the move here πŸ™…β€β™€οΈ

The receiver MAY perform a validity check on received DDP-SSNs to make sure any gap could be explained by Data Chunks that haven't arrived yet 🧐 implementations SHOULD NOT allocate resources on the assumption that DDP-SSNs are valid without doing that check first 🫠 and an invalid DDP-SSN MAY result in termination of the DDP stream 😭


11. Procedures πŸ‘‘

11.1. Association Initialization

When an association starts up, a DDP/SCTP adaptation layer MUST include an adaptation layer indication in its INIT or INIT-ACK (as defined in Section 5.1) πŸŽ€ after the first two SCTP chunks (INIT and INIT-ACK) are exchanged, an endpoint MUST verify and inspect the Adaptation Indication and check it against the table below to know what to do next πŸ”

       Indication |           Action
         type     |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                  | This indicates that the peer DOES NOT
      NONE        | support ANY DDP or RDMA adaptation, and thus
                  | RDMA and DDP procedures MUST NOT be
                  | performed upon this association.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                  | This indicates that the peer DOES support
      DDP         | the DDP/SCTP adaptation layer defined here.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                  | This indicates that the peer DOES NOT
    ANY-OTHER     | support the DDP adaptation, and thus
    Indication    | DDP procedures MUST NOT be performed
                  | upon this association.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

An implementation MAY require that every association for a given SCTP endpoint be set to the same mode 🧸

The local interface MAY let the ULP accept only requests to set up an association in a specified mode 🌸

11.2. Chunk Bundling

SCTP lets you bundle multiple Data Chunks into a single SCTP packet πŸ“¦ data chunks with DDP Segments carrying untagged messages SHOULD NOT be held back just to make bundling happen πŸ™…β€β™€οΈ data chunks with DDP Segments carrying tagged messages are usually full sized anyway, so bundling doesn't really come into it 🧁 partial-size tagged messages MAY be delayed though, since they're often followed by a short untagged message πŸ’•

11.3. Association Termination

If an SCTP Association has to be terminated because of errors, that should get handled at the SCTP layer πŸ›‘ the RDMAP-defined RDMAP Terminate Message SHOULD NOT be sent on each DDP stream once someone decides to terminate an SCTP association 😩 sending it on every SCTP stream could seriously slow the whole termination down 🐌

The local interface SHOULD notify all consumers of DDP streams when the underlying SCTP stream has been terminated πŸ“£

Other RDMAP-defined Terminate Messages MUST be generated as specified when a DDP stream is terminated πŸ’Œ and with the SCTP mapping, ending a DDP Stream does NOT require ending the Association πŸ¦‹


12. IANA Considerations πŸ—‚οΈ

This document defines a new SCTP Adaptation Layer Indication codepoint for DDP (0x00000001) πŸŽ‰ [RFC5061] is the registry where this codepoint was assigned from πŸ’…

This document also defines two new SCTP Payload Protocol Identifiers (PPIDs) 🌈 RFC 4960 [RFC4960] is the registry where these identifiers were assigned from ✨ the values that got assigned are:

      DDP Segment Chunk           - 16
      DDP Stream Session Control  - 17

13. Security Considerations πŸ”

Any direct placement of memory could pose a significant security risk if adequate local controls aren't provided 😱 those threats get covered in the appropriate DDP [RFC5041], RDMA [RFC5040], or Security [RFC5042] documents πŸ“š this document doesn't add any extra security risks beyond the ones in RFC 4960 [RFC4960] πŸ’–

The IPsec requirements for Remote Direct Data Placement (RDDP) are based on the version of IPsec in RFC 2401 [RFC2401] and related RFCs, as profiled by RFC 3723 [RFC3723] πŸ™ƒ even though there's a newer version of IPsec in RFC 4301 [RFC4301] and related RFCs 🧐 one of the big early uses of the RDDP protocols is with iSCSI iSER [RFC5046] 🫢 so RDDP's IPsec requirements follow IPsec's, which lets a common IPsec profile work for both iSCSI and the RDDP protocols πŸŽ€ in the future, RFC 3723 might get updated to the newer version of IPsec, and the IPsec security requirements of any such update should apply the same way to iSCSI and the RDDP protocols 🌸

Extra requirements apply to security for RDDP over SCTP, since SCTP is the transport protocol πŸ¦‹ an implementation of IPsec for RDDP over SCTP:

  1. MUST support IPsec functionality for SCTP that's equivalent to the IPsec functionality for TCP that RFC 3723 requires πŸ”₯
  2. SHOULD support the same level of IPsec functionality for SCTP and TCP unless there's no support for TCP πŸ’…
  3. MUST support at least the level of protocol and port selector functionality for SCTP that's supported for TCP 🧚

14. Contributors 🫢

Huge thanks to our contributors, who spent many hours reading and reviewing and keeping us straight πŸ’–: Sukanta Ganguly (an independent consultant), Vivek Kashyap of IBM, Jim Pinkerton of Microsoft, and Hemal Shah of Broadcom πŸ‘‘ thanks for all your hard work, babes πŸ₯Ή


15. Acknowledgments πŸ’œ

The authors would like to thank the following people, who gave comments and input: Stephen Bailey, David Black, Douglas Otis, Allyn Romanow, and Jim Williams 🌷


16. References πŸ“–

16.1. Normative References

  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC3723] Aboba, B., Tseng, J., Walker, J., Rangan, V., and F. Travostino, "Securing Block Storage Protocols over IP", RFC 3723, April 2004.
  • [RFC4960] Stewart, R., "Stream Control Transmission Protocol", RFC 4960, September 2007.
  • [RFC5040] Recio, R., Metzler, B., Culley, P., Hilland, J., and D. Garcia, "A Remote Direct Memory Access Protocol Specification", RFC 5040, October 2007.
  • [RFC5041] Shah, H., Pinkerton, J., Recio, R., and P. Culley, "Direct Data Placement over Reliable Transports", RFC 5041, October 2007.
  • [RFC5042] Pinkerton, J. and E. Deleganes, "Direct Data Placement Protocol (DDP) / Remote Direct Memory Access Protocol (RDMAP) Security", RFC 5042, October 2007.
  • [RFC5061] Stewart, R., Xie, Q., Tuexen, M., Maruyama, S., and M. Kozuka, "Stream Control Transmission Protocol (SCTP) Dynamic Address Reconfiguration", RFC 5061, September 2007.

16.2. Informative References

  • [RFC2401] Kent, S. and R. Atkinson, "Security Architecture for the Internet Protocol", RFC 2401, November 1998.
  • [RFC4301] Kent, S. and K. Seo, "Security Architecture for the Internet Protocol", RFC 4301, December 2005.
  • [RFC5044] Culley, P., Elzur, U., Recio, R., Bailey, S., and J. Carrier, "Marker PDU Aligned Framing for TCP Specification", RFC 5044, October 2007.
  • [RFC5046] Ko, M., Chadalapaka, M., Elzur, U., Shah, H., and P. Thaler, "Internet Small Computer System Interface (iSCSI) Extensions for Remote Direct Memory Access (RDMA)", RFC 5046, October 2007.

Authors' Addresses 🏑

Caitlin Bestler (editor)
Neterion
20230 Stevens Creek Blvd.
Suite C
Cupertino, CA  95014
USA

Phone: 408-366-4639
EMail: caitlin.bestler@neterion.com


Randall R. Stewart (editor)
Cisco Systems, Inc.
Forest Drive
Columbia, SC  29036
USA

Phone: +1-815-342-5222
EMail: rrs@cisco.com

Copyright (C) The IETF Trust (2007).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 🫢

Intellectual Property ✨

okay bestie, this section is all about who owns what πŸ’… The IETF is totally neutral here 🫢 It takes no position on whether any Intellectual Property Rights or other rights that someone claims over the tech in this document are valid, or how far they reach. It also might or might not have any license available under those rights πŸ€·β€β™€οΈ And it does NOT claim it went out and hunted down every possible right, so it hasn't done an independent search πŸ•΅οΈβ€β™€οΈ If you want the rules about rights in RFC documents, check out BCP 78 and BCP 79 πŸ“š

Next up, the IPR paperwork πŸ“ Any copies of IPR disclosures sent to the IETF Secretariat πŸ’Œ plus any promises of licenses that might be offered 🎟️ and the results from anyone trying to get a general license or permission for implementers or users to use those proprietary rights πŸ”‘ can all be found in the IETF's online IPR repository at http://www.ietf.org/ipr 🌐 Total treasure hunt energy πŸ’œ

And here's the big invitation πŸ’– If you're an interested party and you know about copyrights, patents, patent applications, or other proprietary rights that might cover technology you'd need to implement this standard, the IETF wants you to tell them πŸ“£ Just send the info to ietf-ipr@ietf.org and they'll take it from there ✨ Periodt, the more transparency the better 🌸

Quick aside πŸŽ€ The IETF is basically asking everyone to speak up if they spot a patent that could affect this spec. Being open about IP is literally how the community stays fair 🫢
πŸ“¦ where this page comes from