<?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-duke-tsvwg-udp-ecn-03" 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-duke-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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
sEk9KwAA

-->

</rfc>

