<?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.6.39 (Ruby 2.7.4) -->


<!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 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-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>WIT</area>
    <workgroup>tsvwg</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 applications for UDP until QUIC became widely
deployed. 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://example.com/LATEST"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-duke-tsvwg-udp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        TSVWG 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/draft-tsvwg-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>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-and-apple"><name>Linux and Apple</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 type
IPV6_RECVTCLASS.</t>

<t>IPv4 sockets require a socket option of level IPPROTO_IP and type
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 hosts, the application only sets IPV6_RECVTCLASS; setting
IP_RECVTOS will return an error.</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 type 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 socekts, WSASetRecvIPEcn() will not enable ECN reporting for
IPv4. This requires a separate setsockopt() call using the IP_RECVECN option.</t>

<t>Experiments revealed that if a socket is bound to a IPv6-mapped IPv4 address
(i.e. it is of the format ::ffff:&lt;IPv4 address&gt;), calling to WSASetRecvIpEcn()
returned error EINVAL. The author was not able to formulate a generalized rule
about this behavior.</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. The ECN mark constitutes the two least-significant bits of this byte.</t>

</section>
<section anchor="apple"><name>Apple</name>

<t>If the incoming packet is IPv4, the socket will include a cmsg of level
IPPROTO_IP and type IP_RECVTOS.</t>

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

<t>The resulting byte of data is the entire Type-of-Service (TOS) byte from the
IPv4 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-1"><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 type IP_TOS.</t>

<t>For IPv6 packets, they use level IPPROTO_IPV6 and type 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-1"><name>Linux</name>

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

<t>Linux uses a cmsg with level IPPROTO_IPV6 and type IPV6_TCLASS for IPv4 packets.</t>

<t>In either case, note that the six most significant bits of the data are the
DSCP code point, and in general should be preserved while changing the ECN bits.</t>

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

<t>The author has not conducted experiments with setting ECN marks on a per-packet
basis on an Apple socket.</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 to fingerprint 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'>

&RFC2119;
&RFC8174;


    </references>

    <references title='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_posix.cc">
  <front>
    <title>udp_socket_win.cc</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
&RFC3168;
&RFC9293;
&RFC9260;
&RFC8261;
&RFC9000;
&RFC9330;


    </references>


<?line 285?>

<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.</t>

</section>


  </back>

<!-- ##markdown-source:
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
L8YS4qgJXu4e+g6m+V+aRDfAQigAAA==

-->

</rfc>

