<?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.1.2) -->


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

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!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-04" 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 54?>

<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 63?>

<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>

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

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

<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 report ECN, applications set a socket option to true using a setsockopt()
call.</t>

<t>IPv6 sockets require a socket option of level IPPROTO_IPV6 and name
IPV6_RECVTCLASS.</t>

<t>IPv4 sockets require a socket option of level IPPROTO_IP and name
IP_RECVTOS.</t>

<t>For dual-stack sockets, on Linux hosts the application sets both the
IPV6_RECVTCLASS and IP_RECVTOS options to receive ECN codepoints on all incoming
packets. On Apple and FreeBSD hosts, the application only sets the
IPPROTO_IPV6-level socket option with name IPV6_RECVTCLASS to receive codepoints
for both v4 and v6; setting an IPPROTO_IP-level socket option on an IPv6 socket
results in an error. In particular this applies to the IPPROTO_IP-level socket
option with the name IP_RECVTOS.</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 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 dual-stack sockets, 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 IPv6-mapped IPv4 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 ECN information, because that information
is encoded in the control data that is returned from that function. Those
platforms all return zero or more "cmsg" 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 the incoming packet is IPv4, Linux will include a cmsg of level IPPROTO_IP
and type IP_TOS. The cmsg data contains an unsigned char.</t>

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

<t>The resulting report contains the entire IP header byte, which includes other
fields. 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 message (UDP/IPv4) 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 message (UDP/IPv6 or UDP/IPv4) 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 provided data is the entire byte from the IP header, which includes other
fields. 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 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 IPv6, the socket will include a cmsg of level
IPPROTO_IPV6 and type IPV6_ECN. The cmsg data contains an int.</t>

<t>The resulting integer 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 configure outgoing ECN 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="linux-and-apple"><name>Linux and Apple</name>

<t>Both Linux and Apple platforms set the outgoing ECN for IPv4 packets with a
socket option of level IPPROTO_IP and name IP_TOS.</t>

<t>For IPv6 packets, they use level IPPROTO_IPV6 and name IPV6_TCLASS.</t>

<t>This setsockopt() call also sets the Differentiated Services Code Point (DSCP)
bits 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 a
getsockopt() call.</t>

<t>For dual-stack sockets, Linux requires an additional setsockopt() call with
IP_TOS. Apple sockets do not and will return an error if this call is made.</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 control
information that accompanies a sendmsg() call.</t>

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

<t>These platforms expect a cmsg with level IPPROTO_IP and type IP_TOS if the
destination is an IPv4 address, or a IPv4-mapped IPv6 address.</t>

<t>Otherwise, they expect 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='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC8174;


    </references>

    <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="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 325?>

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA91b63IbOXb+j6dA6KopKcOLb6W1NZud1UiyrawujKgZZyuV
mgK7QRJRs7sDdJPWuPwueZY8Wb5zAPSFlC+TZPMjW7UjstkNnOt3vnPQHo1G
ojJVpo/l4LTIF2ZZW5Mv5c9nUzkrkntdObkorDw/vea/p8V6XeRymqkKX9du
INR8bvUGj9dpOdJJPhCJqvSysA/H0uSLQpjSHsvK1q56/vTp66fPhUiLJFdr
bJlatahGRleLUeU22+UorDHC8tpVwtXztXHOFHn1UOL+i/O7N1I+kSpzBXY0
eapLjf/k1WAoBzo1VWGNyujLxclP+AOJBxe3d28GIsWKx/Lj2cnd+SehrFZ4
/r2eS5Wn8iKvtM11Je+syl1Z2GogtoW9X9qiLnFfc5nvnmm7MYl28j1uIVu9
pdsG4l4/4KH0WMiRhB70B6qIjc5rjYvy960mpVd5sHd9rUyG62ywP5PtxoVd
0g/KJiv8sKqq0h1PJnQfXTIbPY63TejCZG6LrdMTXmFCTy5NtarncdFJ40kp
vSM6q/IdY//A2BTx3snnXDleVetsIISqq1VhyThYVcpFnWU+Bq6UrUwuz+p7
zb9ASpWb31QFrx/Lt0WxzPwP2iu+5vvHq3GKJ/68pIvjpFgLQcFm13huQ+Y+
mU4vz0fX53fvb27/Mnpze3J1Tp/IETHer99PbVEVSZFdTMdXulKIEcWWV3ap
u0qneqOzotR2rMoy07TfBEFcrxF5LOgE0UMRM8m3ZVjTlJN1s6aQp+9ub64u
fr4iARoJ7lZanq5ssTb1WkKYf9NJ5QZ8x64I2+12nIRb2ZPxy6gMz02624ym
N7OLf+5tBof86jilfy0LZz6Mk+TxrVxR20Q/vlv7wdlk8j0FWX4M5Sd+5cmj
m3TEen9xfXbzfvY5wbbw7N9YrLiFkEGW0dnNaU+e97OTma5udbK5mJ4nOWI1
T8jJ8mDrnldJacrx6vBxGTOtbD5em8QWrlhUHCg6H9Vugm1TZB39ffF8okoz
iYtN8sUofsYH5XRlsbcpOQVbMWc3p3+5md71RL2anV0DZy6m09ubu5tfL6bS
aymLkiT+TCx9q5T4Ly03MSUH9Qjy+eVHzfJiNBpJNXeVVUklxPmHMjOJqVAn
8iWAg6x2XVRmYRLlTYhCcigpiwwwryoA5RmKQ0TEmDwOpUOUqESJoXyT74ot
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
ylj8F1LB6RkGMwAA

-->

</rfc>

