<?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 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-02" 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 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://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-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 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 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 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 IP
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"><name>Apple</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 IP_RECVTCLASS.
The cmsg data contains an int.</t>

<t>The provided 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 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-2"><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 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_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 286?>

<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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
iKXX8f5GhIkX/WhvLP4OxpVOKg8qAAA=

-->

</rfc>

