<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.14 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC3168 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
<!ENTITY RFC9293 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml">
<!ENTITY RFC9260 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml">
<!ENTITY RFC8261 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8261.xml">
<!ENTITY RFC6679 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml">
<!ENTITY RFC9000 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY RFC9330 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
<!ENTITY RFC2474 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2474.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-tsvwg-udp-ecn-05" category="info" submissionType="IETF">
  <front>
    <title abbrev="udp-ecn">Configuring UDP Sockets for ECN for Common Platforms</title>

    <author fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>

    <date />

    <area>Web and Internet Transport</area>
    <workgroup>Transport and Services Working Group</workgroup>
    <keyword>udp</keyword> <keyword>ecn</keyword>

    <abstract>


<?line 58?>

<t>Explicit Congestion Notification (ECN) applies to all transport protocols in
principle. However, it had limited deployment for UDP until QUIC became widely
adopted. As a result, documentation of UDP socket APIs for ECN on various
platforms is sparse. This document records the results of experimenting with
these APIs in order to get ECN working on UDP for Chromium on Apple, Linux, and
Windows platforms.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://tsvwg.github.io/udp-ecn/draft-ietf-tsvwg-udp-ecn.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-tsvwg-udp-ecn/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Transport and Services Working Group Working Group mailing list (<eref target="mailto:tsvwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/tsvwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/tsvwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/tsvwg/udp-ecn"/>.</t>
    </note>


  </front>

  <middle>


<?line 67?>

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

<t><xref target="RFC3168"/> defines a two-bit field in the IP header for Explicit Congestion
Notification (ECN), which provides network feedback to endpoint congestion
controllers. This has historically mostly been relevant to TCP (<xref target="RFC9293"/>),
where any incoming ECN codepoints are internally consumed by the kernel, and
therefore imply no application interface except enabling and disabling the
capability.</t>

<t>The Stream Control Transport Protocol (SCTP) (<xref target="RFC9260"/>) has long supported
ECN in its design. SCTP is sometimes carried over DTLS and UDP (<xref target="RFC8261"/>).
In principle, user-space implementers might have leveraged UDP ECN APIs to
deliver ECN codepoints between SCTP and the UDP socket. At the time of
publication, the TSV Working Group is not aware of any such efforts.</t>

<t><xref target="RFC6679"/> defines ECN over RTP over UDP. The Working Group is aware of a
research implementation, but cannot confirm any commercial deployments.</t>

<t>However, QUIC <xref target="RFC9000"/> runs over UDP and has seen wider deployment than
SCTP. The Low Latency, Low Loss, Scalable Throughput (L4S) experiment
(<xref target="RFC9330"/>) and QUIC have combined to increase interest in ECN over UDP.</t>

<t>The Chromium Projects (<xref target="CHROMIUM"/>) provide a widely-deployed protocol library
that includes QUIC. An effort to provide ECN support for QUIC on the many
platforms on which Chromium is deployed revealed that many ECN-related UDP
socket interfaces are poorly documented.</t>

<t>This informational document provides a record of that experience, to encourage
further support for ECN in other QUIC implementations, and indeed any consumer
of ECN codepoints that operates over UDP. It is not a standards-track document
and does not bind platforms to any API, or suggest any such API.</t>

<t>Many socket APIs continue to reference the "ToS (Type of Service) byte",
including the IP_TOS label, even though <xref target="RFC2474"/> obsoleted that in 1998.
That 8-bit field now contains a 6-bit Differentiated Services Code Point (DSCP)
and the 2-bit ECN field.</t>

<t>This document focuses on the APIs for the C and C++ languages. Other languages
are likely to have different syntax and capabilities.</t>

<t>The "ecn-examples" code repository (<xref target="EXAMPLES"/>) is extremely compact code that
can verify the information in this document.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>

<t>This document is not a general tutorial on UDP socket programming, and assumes
familiarity with basic socket concepts like binding, socket options, and
common system error codes.</t>

<t>Throughout this document, "Apple" refers to both macOS and iOS.</t>

</section>
<section anchor="receiving-ecn-codepoints"><name>Receiving ECN codepoints</name>

<t>Network devices can change the ECN codepoint in the IP header. Since this
feedback is required at the packet sender, the packet receiver needs to extract
this codepoint from the UDP socket in order to report to the sender.</t>

<t>There are two components to this: setting the socket to report incoming ECN
marks, and retrieving the ECN codepoint for each incoming packet.</t>

<t>Note that Apple platforms additionally provide a framework for network
connections that allows receiving ECN flags when using UDP without traditional
socket option semantics. When sending or receiving UDP datagrams, IP protocol
metadata carries ECN information in both directions. See
<xref target="APPLE-NETWORK-FRAMEWORK"/>.</t>

<section anchor="setting-the-socket-to-report-incoming-ecn-codepoints"><name>Setting the socket to report incoming ECN codepoints</name>

<section anchor="linux-apple-and-freebsd"><name>Linux, Apple, and FreeBSD</name>

<t>To receive ECN codepoints, applications set a socket option to true using a setsockopt()
call.</t>

<t>On all platforms, IPv4 sockets require the IPPROTO_IP-level socket option with
name IP_RECVTOS to be set.</t>

<t>On all platforms, IPv6 sockets require the IPPROTO_IPV6-level socket option with
name IPV6_RECVTCLASS to be set.
If the IPv6 socket is not IPv6 only, on Linux hosts it is required to also set
the IPPROTO_IP-level socket option IP_RECVTOS to receive ECN codepoints for
UDP/IPv4 packets.</t>

<t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-POSIX"/>.</t>

</section>
<section anchor="windows"><name>Windows</name>

<t>Windows documentation recommends using the function WSASetRecvIPEcn() to
enable ECN codepoint reporting regardless of the IP version. This function dates to
Windows 10 Build 20348, according to <xref target="WINDOWS-DOC"/>.</t>

<t>However, this can also be accomplished by calling setsockopt() and using
options of level IPPROTO_IP and name IP_RECVECN for IPv4, and IPPROTO_IPV6
and IPV6_RECVECN for IPv6. These options are documented at
<xref target="WINDOWS-SOCKOPT"/>.</t>

<t>For IPv6 sockets which are not IPv6 only, WSASetRecvIPEcn() will not enable ECN reporting for
IPv4. This requires a separate setsockopt() call using the IP_RECVECN option.</t>

<t>If a socket is bound to a IPv4-mapped IPv6 address (i.e. it is of the format
::ffff:&lt;IPv4 address&gt;), calls to WSASetRecvIpEcn() return error EINVAL.
These sockets should instead use an explicit setsockopt() call to set
IP_RECVECN.</t>

<t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>

</section>
</section>
<section anchor="retrieving-ecn-codepoints-on-incoming-packets"><name>Retrieving ECN codepoints on incoming packets</name>

<t>All platforms described in this document require the use of a recvmsg() call to
read data from the socket to retrieve the ECN codepoint, because that information
is provided as ancillary data.
Those platforms all return zero or more "cmsg"s that contain requested information
about the arriving packet.</t>

<t>Examples of the technique described below can be found at <xref target="CHROMIUM-POSIX"/>
and <xref target="CHROMIUM-WINDOWS"/>.</t>

<section anchor="linux"><name>Linux</name>

<t>If a UDP/IPv4 message is received, Linux will include a cmsg of level IPPROTO_IP
and type IP_TOS. The cmsg data contains an unsigned char.
This applies to IPv4 sockets and IPv6 socket, which are not IPv6 only.</t>

<t>If a UDP/IPv6 message is received, Linux will include a cmsg of level IPPROTO_IPV6
and type IPV6_TCLASS. The cmsg data contains an int.
This applies to IPv6 sockets.</t>

<t>The cmsg data contains the entire IP header byte, which includes the DSCP
and the ECN codepoint.
The ECN codepoint constitutes the two least-significant bits of this byte.</t>

<t>The same applies to the Linux-specific recvmmsg() call.</t>

</section>
<section anchor="apple-and-freebsd"><name>Apple and FreeBSD</name>

<t>If a UDP/IPv4 message is received on an IPv4 socket, the ancillary data
will contain a cmsg of level IPPROTO_IP and type IP_RECVTOS. The cmsg data
contains an unsigned char.</t>

<t>If a UDP/IPv6 or UDP/IPv4 message is received on an IPv6 socket, the
ancillary data will contain a cmsg of level IPPROTO_IPV6 and type IPV6_TCLASS.
The cmsg data contains an int.</t>

<t>The cmsg data contains the entire IP header byte, which includes the DSCP
and the ECN codepoint.
The ECN codepoint constitutes the two least-significant bits of this byte.</t>

</section>
<section anchor="windows-1"><name>Windows</name>

<t>If the incoming packet is UDP/IPv4, the socket will include a cmsg of level
IPPROTO_IP and type IP_ECN. The cmsg data contains an int.</t>

<t>If the incoming packet is UDP/IPv6, the socket will include a cmsg of level
IPPROTO_IPV6 and type IPV6_ECN. The cmsg data contains an int.</t>

<t>The cmsg data solely consists of the ECN codepoint, and requires no
further bitwise operations.</t>

</section>
</section>
</section>
<section anchor="sending-ecn-codepoints"><name>Sending ECN codepoints</name>

<t>Existing ECN specifications (<xref target="RFC3168"/>, <xref target="RFC9330"/>} envision a particular
connection consistently sending the same ECN codepoint. It might transition that
marking after successfully completing a handshake, recognizing the path or the
peer do not support ECN, or transitioning to a new path. Therefore, using a
socket option to configure a consistent marking is generally more resource-
efficient.</t>

<t>However, some server designs receive all incoming packets on a single socket.
As the many connections that constitute this packet stream may have different
support for ECN, it is suitable to provide the ECN codepoint on a per-packet basis.</t>

<t>Note that Apple platforms additionally provide a framework for network
connections that allows sending ECN flags when using UDP without traditional
socket option semantics. When sending or receiving UDP datagrams, IP protocol
metadata carries ECN information in both directions. See
<xref target="APPLE-NETWORK-FRAMEWORK"/>.</t>

<section anchor="on-a-per-socket-basis"><name>On a per-socket basis</name>

<section anchor="apple-freebsd-and-linux"><name>Apple, FreeBSD, and Linux</name>

<t>For sending UDP/IPv4 packets on an IPv4 socket, Apple, FreeBSD, and Linux platforms
allow the outgoing ECN codepoint to be configured by using the IPPROTO_IP-level socket
option with name IP_TOS.
The value has the type int.</t>

<t>For sending UDP/IPv6 packets on an IPv6 socket, Apple, FreeBSD, and Linux platforms
allow the outgoing ECN codepoint to be configured by using the IPPROTO_IPV6-level socket
option with name IPV6_TCLASS.
The value has the type int.</t>

<t>For sending UDP/IPv4 packets on an IPv6 socket, Linux platforms allow the
the outgoing ECN codepoint to be configured by using the IPPROTO_IP-level socket
option with name IP_TOS.</t>

<t>For sending UDP/IPv4 packets on an IPv6 socket, Apple and FreeBSD platforms allow
the outgoing ECN codepoint to be configured by using the IPPROTO_IPV6-level socket
option with name IPV6_TCLASS.</t>

<t>Except for Apple platforms, this setsockopt() call also sets the Differentiated
Services Code Point (DSCP) that make up the rest of the header byte.
Applications making this call will generally want to preserve any existing DSCP
setting, which might require an additional getsockopt() call.</t>

<t>An example of the technique described above can be found at <xref target="CHROMIUM-POSIX"/>.</t>

</section>
<section anchor="windows-2"><name>Windows</name>

<t>At the time of this writing, Windows does not provide a way to configure
marking on a per-socket basis.</t>

</section>
</section>
<section anchor="on-a-per-packet-basis"><name>On a per-packet basis</name>

<t>Packets can be individually marked with ECN codepoints using the ancillary data
that accompanies a sendmsg() call.</t>

<section anchor="apple-freebsd-and-linux-1"><name>Apple, FreeBSD, and Linux</name>

<t>For sending UDP/IPv4 packets on an IPv4 socket, Apple, FreeBSD, and Linux use
a cmsg with level IPPROTO_IP and type IP_TOS. On Apple and Linux the type of
data is int and for FreeBSD it is unsigned char.</t>

<t>For sending UDP/IPv6 packets on an IPv6 socket, Apple, FreeBSD, and Linux use
a cmsg with level IPPROTO_IPV6 and type IPV6_TCLASS. The type of the data
is int.</t>

<t>For sending UDP/IPv4 packets on an IPv6 socket, Linux requires a cmsg with
level IPPROTO_IP and type IP_TOS.
Apple and FreeBSD accept a cmsg with level IPPROTO_IPV6 and type IPV6_TCLASS.</t>

<t>The same applies to the Linux-specific sendmmsg() call.</t>

</section>
<section anchor="windows-3"><name>Windows</name>

<t>Windows uses a cmsg with level IPPROTO_IP and type IP_ECN for IPv4 packets.</t>

<t>Windows uses a cmsg with level IPPROTO_IPV6 and type IPV6_ECN for IPv6 packets.</t>

<t>An example of the technique described above can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>

</section>
</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>The security implications of ECN are documented in <xref target="RFC3168"/> and <xref target="RFC9330"/>.
This document is a guide to enabling these capabilities, which incurs no
additional security considerations.</t>

<t>Note that implementing ECN capabilities on some platforms, but not others, can
help peers identify the operating system in use by a host, which can have
privacy implications. This document aims to mitigate that possibility.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>



    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="APPLE-NETWORK-FRAMEWORK" target="https://developer.apple.com/documentation/network/nwprotocolip/metadata">
  <front>
    <title>NWProtocolIP.Metadata</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM" target="https://www.chromium.org/chromium-projects/">
  <front>
    <title>The Chromium Projects</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM-POSIX" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_posix.cc">
  <front>
    <title>udp_socket_posix.cc</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM-WINDOWS" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_win.cc">
  <front>
    <title>udp_socket_win.cc</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="EXAMPLES" target="https://github.com/nplab/ecn-examples">
  <front>
    <title>ecn-examples</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="WINDOWS-DOC" target="https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-wsasetrecvipecn">
  <front>
    <title>WSASetRecvIPEcn function (ws2tcpip.h)</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="WINDOWS-SOCKOPT" target="https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options">
  <front>
    <title>MSDN - IPPROTO_IP socket options</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
&RFC3168;
&RFC9293;
&RFC9260;
&RFC8261;
&RFC6679;
&RFC9000;
&RFC9330;
&RFC2474;


    </references>


<?line 326?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The author would like to thank Ryan Hamilton, who provided constant advice
through this effort. Randall Meyer from Apple and Nick Grifka from Microsoft
provided useful hints about the behavior of their respective operating systems.
However, the author takes full responsibility for any errors above.</t>

<t>Michael Tuexen wrote the "ecn-examples" code that was very helpful in verifying
the conclusions in this document. He also made multiple editorial contributions.</t>

<t>Neal Cardwell, Gorry Fairhurst, Max Franke, Rodney Grimes, Will Hawkins,
Guillaume Hétier, Max Inden, Jonathan Lennox, Colin Perkins, Marten
Seemann, and Greg White made improvements to this draft.</t>

</section>


  </back>

<!-- ##markdown-source:
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
9uL2ekf4ldJI/Dc1msElKzUAAA==

-->

</rfc>

