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

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

</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 282?>

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

<t>Will Hawkins, Max Inden, Colin Perkins, and Michael Tuexen made improvements to
this draft.</t>

</section>


  </back>

<!-- ##markdown-source:
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
zI7o529j8XcA/ej/WSkAAA==

-->

</rfc>

