<?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">
]>


<rfc ipr="trust200902" docName="draft-ietf-tsvwg-udp-ecn-00" 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 42?>

<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://martinduke.github.io/udp-ecn/draft-duke-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/martinduke/udp-ecn"/>.</t>
    </note>


  </front>

  <middle>


<?line 51?>

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

<t><xref target="RFC3168"/> reserves two bits 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 marks 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 markings between SCTP and the UDP socket. The author is not aware
of any such efforts.</t>

<t><xref target="RFC6679"/> defines ECN over RTP over UDP. The author 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 document provides a record of that experience, to encourage further support
for ECN in other QUIC implementations, and indeed any consumer of ECN markings
that operates over UDP.</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>

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

<t>Network devices can change the ECN bits 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 value for each incoming packet.</t>

<section anchor="setting-the-socket-to-report-incoming-ecn-marks"><name>Setting the socket to report incoming ECN marks</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 markings on all incoming
packets.
On Apple and FreeBSD hosts, the application only sets the IPPROTO_IPV6-level
socket option with name IPV6_RECVTCLASS; 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.</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. The author was unable to identify any online
documentation of these options at the time of writing.</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-marks-on-incoming-packets"><name>Retrieving ECN marks 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.</t>

<t>If the incoming packet is IPv6, Linux will include a cmsg of level IPPROTO_IPV6
and type IP_TCLASS.</t>

<t>The resulting byte of data is the entire Type-of-Service byte from the IPv4
header or the Traffic Class byte from the IPv6 header.
The ECN mark 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 or level IPPROTO_IPV6 and type IPV6_TCLASS.
The cmsg data contains an int.</t>

<t>The provided data is the entire Type-of-Service (TOS) byte from the IPv4 header
or the Traffic Class byte from the IPv6 header.
The ECN mark 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.</t>

<t>If the incoming packet is IPv6, the socket will include a cmsg of level
IPPROTO_IPV6 and type IPV6_ECN.</t>

<t>The resulting integer solely consists of the ECN mark, and requires no further
bitwise operations.</t>

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

<t>Existing ECN specifications envision a particular connection consistently
sending the same ECN marking. 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>

<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 TOS 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, we hypothesize that Linux sockets will require an
additional setsockopt() call with IP_TOS. Apple sockets will not and will
return an error if this call is made. Our experiments did not test this
hypothesis.</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>The author did not experiment with setting a windows socket to send an ECN
mark.</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="microsoft"><name>Microsoft</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="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>
&RFC3168;
&RFC9293;
&RFC9260;
&RFC8261;
&RFC6679;
&RFC9000;
&RFC9330;


    </references>


<?line 291?>

<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>Will Hawkins, Max Inden, Colin Perkins, and Michael Tuexen made improvements to
this draft.</t>

</section>


  </back>

<!-- ##markdown-source:
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
AXdaqEs9KwAA

-->

</rfc>

