4. Pass 2
This pass categorizes the primitives from pass 1 based on whether they relate to a connection or to data transmission. Primitives are presented following the nomenclature "CATEGORY.[SUBCATEGORY].PRIMITIVENAME.PROTOCOL". The CATEGORY can be CONNECTION or DATA. Within the CONNECTION category, ESTABLISHMENT, AVAILABILITY, MAINTENANCE, and TERMINATION subcategories can be considered. The DATA category does not have any SUBCATEGORY. The PROTOCOL name "UDP(-Lite)" is used when primitives are equivalent for UDP and UDP-Lite; the PROTOCOL name "TCP" refers to both TCP and MPTCP. We present "connection" as a general protocol-independent concept and use it to refer to, e.g., TCP connections (identifiable by a unique pair of IP addresses and TCP port numbers), SCTP associations (identifiable by multiple IP address and port number pairs), as well UDP and UDP-Lite connections (identifiable by a unique socket pair). Some minor details are omitted for the sake of generalization -- e.g., SCTP's 'Close' [RFC4960] returns success or failure and lets the application control whether further receive or send operations, or both, are disabled [RFC6458]. This is not described in the same way for TCP [RFC0793], but these details play no significant role for the primitives provided by either TCP or SCTP (for the sake of being generic, it could be assumed that both receive and send operations are disabled in both cases). The TCP 'Send' and 'Receive' primitives include usage of an 'urgent' parameter. This parameter controls a mechanism that is required to implement the "synch signal" used by telnet [RFC0854], but [RFC6093] states that "new applications SHOULD NOT employ the TCP urgent mechanism." Because pass 2 is meant as a basis for the creation of future systems, the "urgent" mechanism is excluded. This also concerns the notification 'Urgent Pointer Advance' in the 'Error_Report' (Section 4.2.4.1 of [RFC1122]). Since LEDBAT is a congestion control mechanism and not a protocol, it is not currently defined when to enable/disable or configure the mechanism. For instance, it could be a one-time choice upon connection establishment or when listening for incoming connections, in which case it should be categorized under CONNECTION.ESTABLISHMENT or CONNECTION.AVAILABILITY, respectively. To avoid unnecessarily
limiting future implementations, it was decided to place it under CONNECTION.MAINTENANCE, with all parameters that are described in the specification [RFC6817] made configurable.4.1. CONNECTION-Related Primitives
ESTABLISHMENT: Active creation of a connection from one transport endpoint to one or more transport endpoints. Interfaces to UDP and UDP-Lite allow both connection-oriented and connection-less usage of the API [RFC8085]. o CONNECT.TCP: Pass 1 primitive/event: 'Open' (active) or 'Open' (passive) with socket, followed by 'Send' Parameters: 1 local IP address (optional); 1 destination transport address (for active open; else the socket and the local IP address of the succeeding incoming connection request will be maintained); timeout (optional); options (optional); MKT configuration (optional); and user message (optional) Comments: if the local IP address is not provided, a default choice will automatically be made. The timeout can also be a retransmission count. The options are IP options to be used on all segments of the connection. At least the Source Route option is mandatory for TCP to provide. 'MKT configuration' refers to the ability to configure MKTs for authentication. The user message may be transmitted to the peer application immediately upon reception of the TCP SYN packet. To benefit from the lower latency this provides as part of the experimental TFO mechanism, its length must be at most the TCP's maximum segment size (minus TCP options used in the SYN). The message may also be delivered more than once to the application on the remote host. o CONNECT.SCTP: Pass 1 primitive/event: 'Initialize', followed by 'Enable/Disable Interleaving' (optional), followed by 'Associate' Parameters: list of local SCTP port number / IP address pairs ('Initialize'); one or several sockets (identifying the peer); outbound stream count; maximum allowed inbound stream count; adaptation layer indication (optional); chunk types required to be authenticated (optional); request interleaving on/off; maximum
number of INIT attempts (optional); maximum init. RTO for INIT (optional); user message (optional); and remote UDP port number (optional) Returns: socket list or failure Comments: 'Initialize' needs to be called only once per list of local SCTP port number / IP address pairs. One socket will automatically be chosen; it can later be changed in MAINTENANCE. The user message may be transmitted to the peer application immediately upon reception of the packet containing the COOKIE-ECHO chunk. To benefit from the lower latency this provides, its length must be limited such that it fits into the packet containing the COOKIE-ECHO chunk. If a remote UDP port number is provided, SCTP packets will be encapsulated in UDP. o CONNECT.MPTCP: This is similar to CONNECT.TCP except for one additional boolean parameter that allows the ability to enable or disable MPTCP for a particular connection or socket (default: enabled). o CONNECT.UDP(-Lite): Pass 1 primitive/event: 'Connect' followed by 'Send' Parameters: 1 local IP address (default (ANY) or specified); 1 destination transport address; 1 local port (default (OS chooses) or specified); and 1 destination port (default (OS chooses) or specified). Comments: associates a transport address creating a UDP(-Lite) socket connection. This can be called again with a new transport address to create a new connection. The CONNECT function allows an application to receive errors from messages sent to a transport address. AVAILABILITY: Preparing to receive incoming connection requests. o LISTEN.TCP: Pass 1 primitive/event: 'Open' (passive) Parameters: 1 local IP address (optional); 1 socket (optional); timeout (optional); buffer to receive a user message (optional); and MKT configuration (optional)
Comments: if the socket and/or local IP address is provided, this waits for incoming connections from only and/or to only the provided address. Else this waits for incoming connections without this/these constraint(s). ESTABLISHMENT can later be performed with 'Send'. If a buffer is provided to receive a user message, a user message can be received from a TFO-enabled sender before the TCP's connection handshake is completed. This message may arrive multiple times. 'MKT configuration' refers to the ability to configure MKTs for authentication. o LISTEN.SCTP: Pass 1 primitive/event: 'Initialize', followed by the 'Communication Up' or 'Restart' notification and possibly the 'Adaptation Layer' notification Parameters: list of local SCTP port number / IP address pairs (initialize) Returns: socket list; outbound stream count; inbound stream count; adaptation layer indication; chunks required to be authenticated; and interleaving supported on both sides yes/no Comments: 'Initialize' needs to be called only once per list of local SCTP port number / IP address pairs. 'Communication Up' can also follow a 'Communication Lost' notification, indicating that the lost communication is restored. If the peer has provided an adaptation layer indication, an 'Adaptation Layer' notification is issued. o LISTEN.MPTCP: This is similar to LISTEN.TCP except for one additional boolean parameter that allows the ability to enable or disable MPTCP for a particular connection or socket (default: enabled). o LISTEN.UDP(-Lite): Pass 1 primitive/event: 'Receive' Parameters: 1 local IP address (default (ANY) or specified); 1 destination transport address; local port (default (OS chooses) or specified); and destination port (default (OS chooses) or specified) Comments: the 'Receive' function registers the application to listen for incoming UDP(-Lite) datagrams at an endpoint.
MAINTENANCE: Adjustments made to an open connection, or notifications about it. These are out-of-band messages to the protocol that can be issued at any time, at least after a connection has been established and before it has been terminated (with one exception: CHANGE_TIMEOUT.TCP can only be issued for an open connection when DATA.SEND.TCP is called). In some cases, these primitives can also be immediately issued during ESTABLISHMENT or AVAILABILITY, without waiting for the connection to be opened (e.g., CHANGE_TIMEOUT.TCP can be done using TCP's 'Open' primitive). For UDP and UDP-Lite, these functions may establish a setting per connection but may also be changed per datagram message. o CHANGE_TIMEOUT.TCP: Pass 1 primitive/event: 'Open' or 'Send' combined with unspecified control of per-connection state variables Parameters: timeout value (optional); adv_uto (optional); boolean uto_enabled (optional, default false); and boolean changeable (optional, default true) Comments: when sending data, an application can adjust the connection's timeout value (the time after which the connection will be aborted if data could not be delivered). If 'uto_enabled' is true, the 'timeout value' (or, if provided, the value 'adv_uto') will be advertised for the TCP on the other side of the connection to adapt its own user timeout accordingly. 'uto_enabled' controls whether the UTO option is enabled for a connection. This applies to both sending and receiving. 'changeable' controls whether the user timeout may be changed based on a UTO option received from the other end of the connection; it becomes false when the 'timeout value' is used. o CHANGE_TIMEOUT.SCTP: Pass 1 primitive/event: 'Change Heartbeat' combined with 'Configure Max. Retransmissions of an Association' Parameters: 'Change Heartbeat': heartbeat frequency and 'Configure Max. Retransmissions of an Association': Association.Max.Retrans Comments: 'Change Heartbeat' can enable/disable heartbeats in SCTP as well as change their frequency. The parameter 'Association.Max.Retrans' defines after how many unsuccessful transmissions of any packets (including heartbeats) the
association will be terminated; thus, these two primitives/ parameters together can yield a similar behavior for SCTP associations as CHANGE_TIMEOUT.TCP does for TCP connections. o DISABLE_NAGLE.TCP: Pass 1 primitive/event: not specified Parameters: one boolean value Comments: the Nagle algorithm delays data transmission to increase the chance of sending a full-sized segment. An application must be able to disable this algorithm for a connection. o DISABLE_NAGLE.SCTP: Pass 1 primitive/event: 'Enable/Disable NoDelay' Parameters: one boolean value Comments: Nagle-like algorithms delay data transmission to increase the chance of sending a full-sized packet. o REQUEST_HEARTBEAT.SCTP: Pass 1 primitive/event: 'Request Heartbeat' Parameters: socket Returns: success or failure Comments: requests an immediate heartbeat on a path, returning success or failure. o ADD_PATH.MPTCP: Pass 1 primitive/event: not specified Parameters: local IP address and optionally the local port number Comments: the application specifies the local IP address and port number that must be used for a new subflow.
o ADD_PATH.SCTP: Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' Parameters: local IP address o REM_PATH.MPTCP: Pass 1 primitive/event: not specified Parameters: local IP address; local port number; remote IP address; and remote port number Comments: the application removes the subflow specified by the IP/ port-pair. The MPTCP implementation must trigger a removal of the subflow that belongs to this IP/port-pair. o REM_PATH.SCTP: Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' Parameters: local IP address o SET_PRIMARY.SCTP: Pass 1 primitive/event: 'Set Primary' Parameters: socket Returns: result of attempting this operation Comments: update the current primary address to be used, based on the set of available sockets of the association. o SET_PEER_PRIMARY.SCTP: Pass 1 primitive/event: 'Change Local Address / Set Peer Primary' Parameters: local IP address Comments: this is only advisory for the peer.
o CONFIG_SWITCHOVER.SCTP: Pass 1 primitive/event: 'Configure Path Switchover' Parameters: primary max retrans (number of retransmissions after which a path is considered inactive) and PF max retrans (number of retransmissions after which a path is considered to be "Potentially Failed", and others will be preferably used) (optional) o STATUS.SCTP: Pass 1 primitive/event: 'Status', 'Enable/Disable Interleaving', and 'Network Status Change' notification Returns: data block with information about a specified association, containing: association connection state; destination transport address list; destination transport address reachability states; current local and peer receiver window sizes; current local congestion window sizes; number of unacknowledged DATA chunks; number of DATA chunks pending receipt; primary path; most recent SRTT on primary path; RTO on primary path; SRTT and RTO on other destination addresses; MTU per path; and interleaving supported yes/no Comments: the 'Network Status Change' notification informs the application about a socket becoming active/inactive; this only affects the programming style, as the same information is also available via 'Status'. o STATUS.MPTCP: Pass 1 primitive/event: not specified Returns: list of pairs of tuples of IP address and TCP port number of each subflow. The first of the pair is the local IP and port number, while the second is the remote IP and port number. o SET_DSCP.TCP: Pass 1 primitive/event: not specified Parameters: DSCP value Comments: this allows an application to change the DSCP value for outgoing segments.
o SET_DSCP.SCTP: Pass 1 primitive/event: 'Set DSCP value' Parameters: DSCP value Comments: this allows an application to change the DSCP value for outgoing packets on a path. o SET_DSCP.UDP(-Lite): Pass 1 primitive/event: 'Set_DSCP' Parameter: DSCP value Comments: this allows an application to change the DSCP value for outgoing UDP(-Lite) datagrams. [RFC7657] and [RFC8085] provide current guidance on using this value with UDP. o ERROR.TCP: Pass 1 primitive/event: 'Error_Report' Returns: reason (encoding not specified) and subreason (encoding not specified) Comments: soft errors that can be ignored without harm by many applications; an application should be able to disable these notifications. The reported conditions include at least: ICMP error message arrived and excessive retransmissions. o ERROR.UDP(-Lite): Pass 1 primitive/event: 'Error_Report' Returns: Error report Comments: this returns soft errors that may be ignored without harm by many applications; an application must connect to be able receive these notifications.
o SET_AUTH.TCP: Pass 1 primitive/event: not specified Parameters: current_key and rnext_key Comments: current_key and rnext_key are the preferred outgoing MKT and the preferred incoming MKT, respectively, for a segment that is sent on the connection. o SET_AUTH.SCTP: Pass 1 primitive/event: 'Set/Get Authentication Parameters' Parameters: key_id; key; and hmac_id o GET_AUTH.TCP: Pass 1 primitive/event: not specified Parameters: current_key and rnext_key Comments: current_key and rnext_key are the preferred outgoing MKT and the preferred incoming MKT, respectively, that were carried on a recently received segment. o GET_AUTH.SCTP: Pass 1 primitive/event: 'Set/Get Authentication Parameters' Parameters: key_id and chunk_list o RESET_STREAM.SCTP: Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' Parameters: sid and direction o RESET_STREAM-EVENT.SCTP: Pass 1 primitive/event: 'Stream Reset' notification Parameters: information about the result of RESET_STREAM.SCTP Comments: this is issued when the procedure for resetting streams has completed.
o RESET_ASSOC.SCTP: Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' Parameters: information related to the extension, as defined in [RFC3260] o RESET_ASSOC-EVENT.SCTP: Pass 1 primitive/event: 'Association Reset' notification Parameters: information about the result of RESET_ASSOC.SCTP Comments: this is issued when the procedure for resetting an association has completed. o ADD_STREAM.SCTP: Pass 1 primitive/event: 'Add/Reset Streams, Reset Association' Parameters: number of outgoing and incoming streams to be added o ADD_STREAM-EVENT.SCTP: Pass 1 primitive/event: 'Stream Change' notification Parameters: information about the result of ADD_STREAM.SCTP Comments: this is issued when the procedure for adding a stream has completed. o SET_STREAM_SCHEDULER.SCTP: Pass 1 primitive/event: 'Set Stream Scheduler' Parameters: scheduler identifier Comments: choice of First-Come, First-Served; Round-Robin; Round- Robin per Packet; Priority-Based; Fair Bandwidth; and Weighted Fair Queuing.
o CONFIGURE_STREAM_SCHEDULER.SCTP: Pass 1 primitive/event: 'Configure Stream Scheduler' Parameters: priority Comments: the priority value only applies when Priority-Based or Weighted Fair Queuing scheduling is chosen with SET_STREAM_SCHEDULER.SCTP. The meaning of the parameter differs between these two schedulers, but in both cases, it realizes some form of prioritization regarding how bandwidth is divided among streams. o SET_FLOWLABEL.SCTP: Pass 1 primitive/event: 'Set IPv6 Flow Label' Parameters: flow label Comments: this allows an application to change the IPv6 header's flow label field for outgoing packets on a path. o AUTHENTICATION_NOTIFICATION-EVENT.SCTP: Pass 1 primitive/event: 'Authentication' notification Returns: information regarding key management o CONFIG_SEND_BUFFER.SCTP: Pass 1 primitive/event: 'Configure Send Buffer Size' Parameters: size value in octets o CONFIG_RECEIVE_BUFFER.SCTP: Pass 1 primitive/event: 'Configure Receive Buffer Size' Parameters: size value in octets Comments: this controls the receiver window.
o CONFIG_FRAGMENTATION.SCTP: Pass 1 primitive/event: 'Configure Message Fragmentation' Parameters: one boolean value (enable/disable) and maximum fragmentation size (optional; default: PMTU) Comments: if fragmentation is enabled, messages exceeding the maximum fragmentation size will be fragmented. If fragmentation is disabled, trying to send a message that exceeds the maximum fragmentation size will produce an error. o CONFIG_PMTUD.SCTP: Pass 1 primitive/event: 'Configure Path MTU Discovery' Parameters: one boolean value (PMTUD on/off) and PMTU value (optional) Returns: PMTU value Comments: this returns a meaningful PMTU value when PMTUD is enabled (the boolean is true), and the PMTU value can be set if PMTUD is disabled (the boolean is false). o CONFIG_DELAYED_SACK.SCTP: Pass 1 primitive/event: 'Configure Delayed SACK Timer' Parameters: one boolean value (delayed SACK on/off); timer value (optional); and number of packets to wait for (default 2) Comments: if delayed SACK is enabled, SCTP will send a SACK either upon receiving the provided number of packets or when the timer expires, whatever occurs first. o CONFIG_RTO.SCTP: Pass 1 primitive/event: 'Configure RTO Calculation' Parameters: init (optional); min (optional); and max (optional) Comments: this adjusts the initial, minimum, and maximum RTO values.
o SET_COOKIE_LIFE.SCTP: Pass 1 primitive/event: 'Set Cookie Life Value' Parameters: cookie life value o SET_MAX_BURST.SCTP: Pass 1 primitive/event: 'Set Maximum Burst' Parameters: max burst value Comments: not all implementations allow values above the default of 4. o SET_PARTIAL_DELIVERY_POINT.SCTP: Pass 1 primitive/event: 'Set Partial Delivery Point' Parameters: partial delivery point (integer) Comments: this parameter must be smaller or equal to the socket receive buffer size. o SET_CHECKSUM_ENABLED.UDP: Pass 1 primitive/event: 'Checksum_Enabled' Parameters: 0 when zero checksum is used at sender, 1 for checksum at sender (default) o SET_CHECKSUM_REQUIRED.UDP: Pass 1 primitive/event: 'Require_Checksum' Parameter: 0 to allow zero checksum, 1 when a non-zero checksum is required (default) at the receiver o SET_CHECKSUM_COVERAGE.UDP-Lite: Pass 1 primitive/event: 'Set_Checksum_Coverage' Parameters: coverage length at sender (default maximum coverage)
o SET_MIN_CHECKSUM_COVERAGE.UDP-Lite: Pass 1 primitive/event: 'Set_Min_Coverage' Parameter: coverage length at receiver (default minimum coverage) o SET_DF.UDP(-Lite): Pass 1 primitive event: 'Set_DF' Parameter: 0 when DF is not set (default) in the IPv4 header, 1 when DF is set o GET_MMS_S.UDP(-Lite): Pass 1 primitive event: 'Get_MM_S' Comments: this retrieves the maximum transport-message size that may be sent using a non-fragmented IP packet from the configured interface. o GET_MMS_R.UDP(-Lite): Pass 1 primitive event: 'Get_MMS_R' Comments: this retrieves the maximum transport-message size that may be received from the configured interface. o SET_TTL.UDP(-Lite) (IPV6_UNICAST_HOPS): Pass 1 primitive/event: 'Set_TTL' and 'Set_IPV6_Unicast_Hops' Parameters: IPv4 TTL value or IPv6 Hop Count value Comments: this allows an application to change the IPv4 TTL of IPv6 Hop Count value for outgoing UDP(-Lite) datagrams. o GET_TTL.UDP(-Lite) (IPV6_UNICAST_HOPS): Pass 1 primitive/event: 'Get_TTL' and 'Get_IPV6_Unicast_Hops' Returns: IPv4 TTL value or IPv6 Hop Count value Comments: this allows an application to read the IPv4 TTL of the IPv6 Hop Count value from a received UDP(-Lite) datagram.
o SET_ECN.UDP(-Lite): Pass 1 primitive/event: 'Set_ECN' Parameters: ECN value Comments: this allows a UDP(-Lite) application to set the Explicit Congestion Notification (ECN) code point field for outgoing UDP(-Lite) datagrams. It defaults to sending '00'. o GET_ECN.UDP(-Lite): Pass 1 primitive/event: 'Get_ECN' Parameters: ECN value Comments: this allows a UDP(-Lite) application to read the ECN code point field from a received UDP(-Lite) datagram. o SET_IP_OPTIONS.UDP(-Lite): Pass 1 primitive/event: 'Set_IP_Options' Parameters: options Comments: this allows a UDP(-Lite) application to set IP options for outgoing UDP(-Lite) datagrams. These options can at least be the Source Route, Record Route, and Timestamp option. o GET_IP_OPTIONS.UDP(-Lite): Pass 1 primitive/event: 'Get_IP_Options' Returns: options Comments: this allows a UDP(-Lite) application to receive any IP options that are contained in a received UDP(-Lite) datagram. o CONFIGURE.LEDBAT: Pass 1 primitive/event: N/A Parameters: enable (boolean); target; allowed_increase; gain_inc; gain_dec; base_history; current_filter; init_cwnd; and min_cwnd Comments: 'enable' is a newly invented parameter that enables or disables the whole LEDBAT service.
TERMINATION: Gracefully or forcefully closing a connection or being informed about this event happening. o CLOSE.TCP: Pass 1 primitive/event: 'Close' Comments: this terminates the sending side of a connection after reliably delivering all remaining data. o CLOSE.SCTP: Pass 1 primitive/event: 'Shutdown' Comments: this terminates a connection after reliably delivering all remaining data. o ABORT.TCP: Pass 1 primitive/event: 'Abort' Comments: this terminates a connection without delivering remaining data and sends an error message to the other side. o ABORT.SCTP: Pass 1 primitive/event: 'Abort' Parameters: abort reason to be given to the peer (optional) Comments: this terminates a connection without delivering remaining data and sends an error message to the other side. o ABORT.UDP(-Lite): Pass 1 primitive event: 'Close' Comments: this terminates a connection without delivering remaining data. No further UDP(-Lite) datagrams are sent/received for this transport service instance.
o TIMEOUT.TCP: Pass 1 primitive/event: 'User Timeout' event Comments: the application is informed that the connection is aborted. This event is executed on expiration of the timeout set in CONNECTION.ESTABLISHMENT.CONNECT.TCP (possibly adjusted in CONNECTION.MAINTENANCE.CHANGE_TIMEOUT.TCP). o TIMEOUT.SCTP: Pass 1 primitive/event: 'Communication Lost' event Comments: the application is informed that the connection is aborted. This event is executed on expiration of the timeout that should be enabled by default (see the beginning of Section 8.3 in [RFC4960]) and was possibly adjusted in CONNECTION.MAINTENANCE.CHANGE_TIMEOOUT.SCTP. o ABORT-EVENT.TCP: Pass 1 primitive/event: not specified o ABORT-EVENT.SCTP: Pass 1 primitive/event: 'Communication Lost' event Returns: abort reason from the peer (if available) Comments: the application is informed that the other side has aborted the connection using CONNECTION.TERMINATION.ABORT.SCTP. o CLOSE-EVENT.TCP: Pass 1 primitive/event: not specified o CLOSE-EVENT.SCTP: Pass 1 primitive/event: 'Shutdown Complete' event Comments: the application is informed that CONNECTION.TERMINATION.CLOSE.SCTP was successfully completed.
4.2. DATA-Transfer-Related Primitives
All primitives in this section refer to an existing connection, i.e., a connection that was either established or made available for receiving data (although this is optional for the primitives of UDP(-Lite)). In addition to the listed parameters, all sending primitives contain a reference to a data block, and all receiving primitives contain a reference to available buffer space for the data. Note that CONNECT.TCP and LISTEN.TCP in the ESTABLISHMENT and AVAILABILITY categories also allow to transfer data (an optional user message) before the connection is fully established. o SEND.TCP: Pass 1 primitive/event: 'Send' Parameters: timeout (optional); current_key (optional); and rnext_key (optional) Comments: this gives TCP a data block for reliable transmission to the TCP on the other side of the connection. The timeout can be configured with this call (see also CONNECTION.MAINTENANCE.CHANGE_TIMEOUT.TCP). 'current_key' and 'rnext_key' are authentication parameters that can be configured with this call (see also CONNECTION.MAINTENANCE.SET_AUTH.TCP). o SEND.SCTP: Pass 1 primitive/event: 'Send' Parameters: stream number; context (optional); socket (optional); unordered flag (optional); no-bundle flag (optional); payload protocol-id (optional); pr-policy (optional) pr-value (optional); sack-immediately flag (optional); and key-id (optional) Comments: this gives SCTP a data block for transmission to the SCTP on the other side of the connection (SCTP association). The 'stream number' denotes the stream to be used. The 'context' number can later be used to refer to the correct message when an error is reported. The 'socket' can be used to state which path should be preferred, if there are multiple paths available (see also CONNECTION.MAINTENANCE.SETPRIMARY.SCTP). The data block can be delivered out of order if the 'unordered' flag is set. The 'no-bundle flag' can be set to indicate a preference to avoid bundling. The 'payload protocol-id' is a number that will, if provided, be handed over to the receiving application. Using pr-policy and pr-value, the level of reliability can be controlled. The 'sack-immediately' flag can be used to indicate
that the peer should not delay the sending of a SACK corresponding to the provided user message. If specified, the provided key-id is used for authenticating the user message. o SEND.UDP(-Lite): Pass 1 primitive/event: 'Send' Parameters: IP address and port number of the destination endpoint (optional if connected) Comments: this provides a message for unreliable transmission using UDP(-Lite) to the specified transport address. The IP address and port number may be omitted for connected UDP(-Lite) sockets. All CONNECTION.MAINTENANCE.SET_*.UDP(-Lite) primitives apply per message sent. o RECEIVE.TCP: Pass 1 primitive/event: 'Receive' Parameters: current_key (optional) and rnext_key (optional) Comments: 'current_key' and 'rnext_key' are authentication parameters that can be read with this call (see also CONNECTION.MAINTENANCE.GET_AUTH.TCP). o RECEIVE.SCTP: Pass 1 primitive/event: 'Data Arrive' notification, followed by 'Receive' Parameters: stream number (optional) Returns: stream sequence number (optional) and partial flag (optional) Comments: if the 'stream number' is provided, the call to receive only receives data on one particular stream. If a partial message arrives, this is indicated by the 'partial flag', and then the 'stream sequence number' must be provided such that an application can restore the correct order of data blocks that comprise an entire message.
o RECEIVE.UDP(-Lite): Pass 1 primitive/event: 'Receive' Parameters: buffer for received datagram Comments: all CONNECTION.MAINTENANCE.GET_*.UDP(-Lite) primitives apply per message received. o SENDFAILURE-EVENT.SCTP: Pass 1 primitive/event: 'Send Failure' notification, optionally followed by 'Receive Unsent Message' or 'Receive Unacknowledged Message' Returns: cause code; context; and unsent or unacknowledged message (optional) Comments: 'cause code' indicates the reason of the failure, and 'context' is the context number if such a number has been provided in DATA.SEND.SCTP, for later use with 'Receive Unsent Message' or 'Receive Unacknowledged Message', respectively. These primitives can be used to retrieve the unsent or unacknowledged message (or part of the message, in case a part was delivered) if desired. o SEND_FAILURE.UDP(-Lite): Pass 1 primitive/event: 'Send' Comments: this may be used to probe for the effective PMTU when using in combination with the 'MAINTENANCE.SET_DF' primitive. o SENDER_DRY-EVENT.SCTP: Pass 1 primitive/event: 'Sender Dry' notification Comments: this informs the application that the stack has no more user data to send. o PARTIAL_DELIVERY_ABORTED-EVENT.SCTP: Pass 1 primitive/event: 'Partial Delivery Aborted' notification Comments: this informs the receiver of a partial message that the further delivery of the message has been aborted.
5. Pass 3
This section presents the superset of all transport features in all protocols that were discussed in the preceding sections, based on the list of primitives in pass 2 but also on text in pass 1 to include transport features that can be configured in one protocol and are static properties in another (congestion control, for example). Again, some minor details are omitted for the sake of generalization -- e.g., TCP may provide various different IP options, but only source route is mandatory to implement, and this detail is not visible in the pass 3 transport feature "Specify IP options". As before, "UDP(-Lite)" represents both UDP and UDP-Lite, and "TCP" refers to both TCP and MPTCP.5.1. CONNECTION-Related Transport Features
ESTABLISHMENT: Active creation of a connection from one transport endpoint to one or more transport endpoints. o Connect Protocols: TCP, SCTP, and UDP(-Lite) o Specify which IP options must always be used Protocols: TCP and UDP(-Lite) o Request multiple streams Protocols: SCTP o Limit the number of inbound streams Protocols: SCTP o Specify number of attempts and/or timeout for the first establishment message Protocols: TCP and SCTP o Obtain multiple sockets Protocols: SCTP o Disable MPTCP Protocols: MPTCP
o Configure authentication Protocols: TCP and SCTP Comments: with TCP, this allows the configuration of MKTs. In SCTP, this allows the specification of which chunk types must always be authenticated. DATA, ACK, etc., are different 'chunks' in SCTP; one or more chunks may be included in a single packet. o Indicate an Adaptation Layer (via an adaptation code point) Protocols: SCTP o Request to negotiate interleaving of user messages Protocols: SCTP o Hand over a message to reliably transfer (possibly multiple times) before connection establishment Protocols: TCP o Hand over a message to reliably transfer during connection establishment Protocols: SCTP o Enable UDP encapsulation with a specified remote UDP port number Protocols: SCTP AVAILABILITY: Preparing to receive incoming connection requests. o Listen, 1 specified local interface Protocols: TCP, SCTP, and UDP(-Lite) o Listen, N specified local interfaces Protocols: SCTP o Listen, all local interfaces Protocols: TCP, SCTP, and UDP(-Lite) o Obtain requested number of streams Protocols: SCTP o Limit the number of inbound streams Protocols: SCTP o Specify which IP options must always be used Protocols: TCP and UDP(-Lite)
o Disable MPTCP Protocols: MPTCP o Configure authentication Protocols: TCP and SCTP Comments: with TCP, this allows the configuration of MKTs. In SCTP, this allows the specification of which chunk types must always be authenticated. DATA, ACK, etc., are different 'chunks' in SCTP; one or more chunks may be included in a single packet. o Indicate an Adaptation Layer (via an adaptation code point) Protocols: SCTP MAINTENANCE: Adjustments made to an open connection, or notifications about it. o Change timeout for aborting connection (using retransmit limit or time value) Protocols: TCP and SCTP o Suggest timeout to the peer Protocols: TCP o Disable Nagle algorithm Protocols: TCP and SCTP o Request an immediate heartbeat, returning success/failure Protocols: SCTP o Notification of excessive retransmissions (early warning below abortion threshold) Protocols: TCP o Add path Protocols: MPTCP and SCTP MPTCP Parameters: source-IP; source-Port; destination-IP; and destination-Port SCTP Parameters: local IP address o Remove path Protocols: MPTCP and SCTP MPTCP Parameters: source-IP; source-Port; destination-IP; and destination-Port SCTP Parameters: local IP address
o Set primary path Protocols: SCTP o Suggest primary path to the peer Protocols: SCTP o Configure Path Switchover Protocols: SCTP o Obtain status (query or notification) Protocols: SCTP and MPTCP SCTP parameters: association connection state; destination transport address list; destination transport address reachability states; current local and peer receiver window sizes; current local congestion window sizes; number of unacknowledged DATA chunks; number of DATA chunks pending receipt; primary path; most recent SRTT on primary path; RTO on primary path; SRTT and RTO on other destination addresses; MTU per path; and interleaving supported yes/no MPTCP parameters: subflow-list (identified by source-IP; source-Port; destination-IP; and destination-Port) o Specify DSCP field Protocols: TCP, SCTP, and UDP(-Lite) o Notification of ICMP error message arrival Protocols: TCP and UDP(-Lite) o Change authentication parameters Protocols: TCP and SCTP o Obtain authentication information Protocols: TCP and SCTP o Reset Stream Protocols: SCTP o Notification of Stream Reset Protocols: STCP o Reset Association Protocols: SCTP o Notification of Association Reset Protocols: STCP o Add Streams Protocols: SCTP
o Notification of Added Stream Protocols: STCP o Choose a scheduler to operate between streams of an association Protocols: SCTP o Configure priority or weight for a scheduler Protocols: SCTP o Specify IPv6 flow label field Protocols: SCTP o Configure send buffer size Protocols: SCTP o Configure receive buffer (and rwnd) size Protocols: SCTP o Configure message fragmentation Protocols: SCTP o Configure PMTUD Protocols: SCTP o Configure delayed SACK timer Protocols: SCTP o Set Cookie life value Protocols: SCTP o Set maximum burst Protocols: SCTP o Configure size where messages are broken up for partial delivery Protocols: SCTP o Disable checksum when sending Protocols: UDP o Disable checksum requirement when receiving Protocols: UDP o Specify checksum coverage used by the sender Protocols: UDP-Lite o Specify minimum checksum coverage required by receiver Protocols: UDP-Lite
o Specify DF field Protocols: UDP(-Lite) o Get max. transport-message size that may be sent using a non- fragmented IP packet from the configured interface Protocols: UDP(-Lite) o Get max. transport-message size that may be received from the configured interface Protocols: UDP(-Lite) o Specify TTL/Hop Count field Protocols: UDP(-Lite) o Obtain TTL/Hop Count field Protocols: UDP(-Lite) o Specify ECN field Protocols: UDP(-Lite) o Obtain ECN field Protocols: UDP(-Lite) o Specify IP options Protocols: UDP(-Lite) o Obtain IP options Protocols: UDP(-Lite) o Enable and configure "Low Extra Delay Background Transfer" Protocols: A protocol implementing the LEDBAT congestion control mechanism TERMINATION: Gracefully or forcefully closing a connection, or being informed about this event happening. o Close after reliably delivering all remaining data, causing an event informing the application on the other side Protocols: TCP and SCTP Comments: a TCP endpoint locally only closes the connection for sending; it may still receive data afterwards. o Abort without delivering remaining data, causing an event that informs the application on the other side Protocols: TCP and SCTP
Comments: in SCTP, a reason can optionally be given by the application on the aborting side, which can then be received by the application on the other side. o Abort without delivering remaining data, not causing an event that informs the application on the other side Protocols: UDP(-Lite) o Timeout event when data could not be delivered for too long Protocols: TCP and SCTP Comments: the timeout is configured with CONNECTION.MAINTENANCE "Change timeout for aborting connection (using retransmit limit or time value)".5.2. DATA-Transfer-Related Transport Features
All transport features in this section refer to an existing connection, i.e., a connection that was either established or made available for receiving data. Note that TCP allows the transfer of data (a single optional user message, possibly arriving multiple times) before the connection is fully established. Reliable data transfer entails delay -- e.g., for the sender to wait until it can transmit data or due to retransmission in case of packet loss.5.2.1. Sending Data
All transport features in this section are provided by DATA.SEND from pass 2. DATA.SEND is given a data block from the application, which here we call a "message" if the beginning and end of the data block can be identified at the receiver, and "data" otherwise. o Reliably transfer data, with congestion control Protocols: TCP o Reliably transfer a message, with congestion control Protocols: SCTP o Unreliably transfer a message, with congestion control Protocols: SCTP o Unreliably transfer a message, without congestion control Protocols: UDP(-Lite) o Configurable Message Reliability Protocols: SCTP
o Choice of stream Protocols: SCTP o Choice of path (destination address) Protocols: SCTP o Ordered message delivery (potentially slower than unordered) Protocols: SCTP o Unordered message delivery (potentially faster than ordered) Protocols: SCTP and UDP(-Lite) o Request not to bundle messages Protocols: SCTP o Specifying a 'payload protocol-id' (handed over as such by the receiver) Protocols: SCTP o Specifying a key identifier to be used to authenticate a message Protocols: SCTP o Request not to delay the acknowledgement (SACK) of a message Protocols: SCTP5.2.2. Receiving Data
All transport features in this section are provided by DATA.RECEIVE from pass 2. DATA.RECEIVE fills a buffer provided by the application, with what here we call a "message" if the beginning and end of the data block can be identified at the receiver, and "data" otherwise. o Receive data (with no message delimiting) Protocols: TCP o Receive a message Protocols: SCTP and UDP(-Lite) o Choice of stream to receive from Protocols: SCTP o Information about partial message arrival Protocols: SCTP Comments: in SCTP, partial messages are combined with a stream sequence number so that the application can restore the correct order of data blocks an entire message consists of.
5.2.3. Errors
This section describes sending failures that are associated with a specific call to DATA.SEND from pass 2. o Notification of an unsent (part of a) message Protocols: SCTP and UDP(-Lite) o Notification of an unacknowledged (part of a) message Protocols: SCTP o Notification that the stack has no more user data to send Protocols: SCTP o Notification to a receiver that a partial message delivery has been aborted Protocols: SCTP