<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-connect-ethernet-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="CONNECT-ETHERNET">Proxying Ethernet in HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-ethernet-01"/>
    <author initials="A. R." surname="Sedeño" fullname="Alejandro R Sedeño">
      <organization>Google LLC</organization>
      <address>
        <email>asedeno@google.com</email>
      </address>
    </author>
    <date year="2023" month="October" day="19"/>
    <area>Transport</area>
    <workgroup>Multiplexed Application Substrate over QUIC Encryption</workgroup>
    <keyword>quic</keyword>
    <keyword>http</keyword>
    <keyword>datagram</keyword>
    <keyword>VPN</keyword>
    <keyword>proxy</keyword>
    <keyword>tunnels</keyword>
    <keyword>masque</keyword>
    <keyword>http-ng</keyword>
    <keyword>layer-2</keyword>
    <keyword>ethernet</keyword>
    <abstract>
      <?line 53?>

<t>This document describes how to proxy Ethernet frames in HTTP. This protocol
is similar to IP proxying in HTTP, but for Layer 2 instead of Layer 3. More
specifically, this document defines a protocol that allows an HTTP client to
create Layer 2 Ethernet tunnel through an HTTP server to an attached
physical or virtual Ethernet segment.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-masque.github.io/draft-ietf-masque-connect-ethernet/draft-ietf-masque-connect-ethernet.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-masque-connect-ethernet/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        MASQUE Working Group mailing list (<eref target="mailto:masque@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/masque/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/masque/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-masque/draft-ietf-masque-connect-ethernet"/>.</t>
    </note>
  </front>
  <middle>
    <?line 62?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP provides the CONNECT method (see <xref section="9.3.6" sectionFormat="of" target="HTTP"/>) for
creating a TCP <xref target="TCP"/> tunnel to a destination, a similar mechanism for
UDP <xref target="CONNECT-UDP"/>, and an additional mechanism for IP
<xref target="CONNECT-IP"/>. However, these mechanisms can't carry layer 2 frames
without further encapsulation inside of IP, for instance with EtherIP
<xref target="ETHERIP"/>, GUE <xref target="GUE"/> or L2TP
<xref target="L2TP"/> <xref target="L2TPv3"/>, which imposes an additional MTU cost.</t>
      <t>This document describes a protocol for exchanging Ethernet frames with an HTTP
server. Either participant in the HTTP connection can then relay Ethernet
frames to and from a local or virtual interface, allowing the bridging of two
Ethernet broadcast domains to establish a Layer 2 VPN. This can simplify
connectivity to network-connected appliances that are configured to only
interact with peers on the same Ethernet broadcast domain.</t>
      <t>This protocol supports all existing versions of HTTP by using HTTP Datagrams
<xref target="HTTP-DGRAM"/>. When using HTTP/2 <xref target="H2"/> or HTTP/3 <xref target="H3"/>, it uses
HTTP Extended CONNECT as described in <xref target="EXT-CONNECT2"/> and
<xref target="EXT-CONNECT3"/>. When using HTTP/1.x <xref target="H1"/>, it uses HTTP Upgrade as
defined in <xref section="7.8" sectionFormat="of" target="HTTP"/>.</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>In this document, we use the term "Ethernet proxy" to refer to the HTTP server
that responds to the Ethernet proxying request. The term "client" is used in the
HTTP sense; the client constructs the Ethernet proxying request. If there are
HTTP intermediaries (as defined in <xref section="3.7" sectionFormat="of" target="HTTP"/>) between the client
and the Ethernet proxy, those are referred to as "intermediaries" in this
document. The term "Ethernet proxying endpoints" refers to both the client and
the Ethernet proxy.</t>
      <t>This document uses terminology from <xref target="QUIC"/>. Where this document
defines protocol types, the definition format uses the notation from <xref section="1.3" sectionFormat="of" target="QUIC"/>. This specification uses the variable-length integer encoding
from <xref section="16" sectionFormat="of" target="QUIC"/>. Variable-length integer values do not
need to be encoded in the minimum number of bytes necessary.</t>
      <t>Note that, when the HTTP version in use does not support multiplexing streams
(such as HTTP/1.1), any reference to "stream" in this document represents the
entire connection.</t>
    </section>
    <section anchor="client-config">
      <name>Configuration of Clients</name>
      <t>Clients are configured to use Ethernet proxying over HTTP via a URL.</t>
      <t>Examples are shown below:</t>
      <artwork><![CDATA[
https://example.org/.well-known/masque/ethernet/
https://proxy.example.org:4443/masque/ethernet/
https://proxy.example.org:4443/masque/ethernet/
https://masque.example.org/?user=bob
]]></artwork>
    </section>
    <section anchor="tunnelling-ethernet-over-http">
      <name>Tunnelling Ethernet over HTTP</name>
      <t>To allow negotiation of a tunnel for Ethernet over HTTP, this document defines
the "connect-ethernet" HTTP upgrade token. The resulting Ethernet tunnels use the
Capsule Protocol (see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>) with HTTP Datagrams in the
format defined in <xref target="payload-format"/>.</t>
      <t>To initiate an Ethernet tunnel associated with a single HTTP stream, a client
issues a request containing the "connect-ethernet" upgrade token.</t>
      <t>By virtue of the definition of the Capsule Protocol (see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>), Ethernet proxying requests do not carry any message content.
Similarly, successful Ethernet proxying responses also do not carry any message
content.</t>
      <t>Ethernet proxying over HTTP <bcp14>MUST</bcp14> be operated over TLS or QUIC encryption, or another
equivalent encryption protocol, to provide confidentiality, integrity, and
authentication.</t>
      <section anchor="ethernet-proxy-handling">
        <name>Ethernet Proxy Handling</name>
        <t>Upon receiving an Ethernet proxying request:</t>
        <ul spacing="normal">
          <li>
            <t>if the recipient is configured to use another HTTP proxy, it will act as an
intermediary by forwarding the request to another HTTP server. Note that
such intermediaries may need to re-encode the request if they forward it
using a version of HTTP that is different from the one used to receive it,
as the request encoding differs by version (see below).</t>
          </li>
          <li>
            <t>otherwise, the recipient will act as an Ethernet proxy. The Ethernet proxy
can choose to reject the Ethernet proxying request or establish an Ethernet
tunnel.</t>
          </li>
        </ul>
        <t>The lifetime of the Ethernet tunnel is tied to the Ethernet proxying request
stream.</t>
        <t>A successful response (as defined in Sections <xref format="counter" target="resp1"/> and <xref format="counter" target="resp23"/>)
indicates that the Ethernet proxy has established an Ethernet tunnel and is
willing to proxy Ethernet frames. Any response other than a successful response
indicates that the request has failed; thus, the client <bcp14>MUST</bcp14> abort the request.</t>
      </section>
      <section anchor="req1">
        <name>HTTP/1.1 Request</name>
        <t>When using HTTP/1.1 <xref target="H1"/>, an Ethernet proxying request will meet the following
requirements:</t>
        <ul spacing="normal">
          <li>
            <t>the method <bcp14>SHALL</bcp14> be "GET".</t>
          </li>
          <li>
            <t>the request <bcp14>SHALL</bcp14> include a single Host header field containing the host
and optional port of the Ethernet proxy.</t>
          </li>
          <li>
            <t>the request <bcp14>SHALL</bcp14> include a Connection header field with value "Upgrade"
(note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="HTTP"/>).</t>
          </li>
          <li>
            <t>the request <bcp14>SHALL</bcp14> include an Upgrade header field with value "connect-ethernet".</t>
          </li>
        </ul>
        <t>An Ethernet proxying request that does not conform to these restrictions is
malformed. The recipient of such a malformed request <bcp14>MUST</bcp14> respond with an error
and <bcp14>SHOULD</bcp14> use the 400 (Bad Request) status code.</t>
        <t>For example, if the client is configured with the URL
"https://example.org/.well-known/masque/ethernet/" and wishes to open an
Ethernet tunnel, it could send the following request.</t>
        <figure anchor="fig-req-h1">
          <name>Example HTTP/1.1 Request</name>
          <sourcecode type="http-message"><![CDATA[
GET https://example.org/.well-known/masque/ethernet/ HTTP/1.1
Host: example.org
Connection: Upgrade
Upgrade: connect-ethernet
Capsule-Protocol: ?1
]]></sourcecode>
        </figure>
      </section>
      <section anchor="resp1">
        <name>HTTP/1.1 Response</name>
        <t>The server indicates a successful response by replying with the following
requirements:</t>
        <ul spacing="normal">
          <li>
            <t>the HTTP status code on the response <bcp14>SHALL</bcp14> be 101 (Switching Protocols).</t>
          </li>
          <li>
            <t>the response <bcp14>SHALL</bcp14> include a Connection header field with value "Upgrade"
(note that this requirement is case-insensitive as per <xref section="7.6.1" sectionFormat="of" target="HTTP"/>).</t>
          </li>
          <li>
            <t>the response <bcp14>SHALL</bcp14> include a single Upgrade header field with value
"connect-ethernet".</t>
          </li>
          <li>
            <t>the response <bcp14>SHALL</bcp14> meet the requirements of HTTP responses that start the
Capsule Protocol; see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>.</t>
          </li>
        </ul>
        <t>If any of these requirements are not met, the client <bcp14>MUST</bcp14> treat this proxying
attempt as failed and close the connection.</t>
        <t>For example, the server could respond with:</t>
        <figure anchor="fig-resp-h1">
          <name>Example HTTP/1.1 Response</name>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: connect-ethernet
Capsule-Protocol: ?1
]]></sourcecode>
        </figure>
      </section>
      <section anchor="req23">
        <name>HTTP/2 and HTTP/3 Requests</name>
        <t>When using HTTP/2 <xref target="H2"/> or HTTP/3 <xref target="H3"/>, Ethernet proxying requests use HTTP
Extended CONNECT. This requires that servers send an HTTP Setting as specified
in <xref target="EXT-CONNECT2"/> and <xref target="EXT-CONNECT3"/> and that requests use HTTP
pseudo-header fields with the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>The :method pseudo-header field <bcp14>SHALL</bcp14> be "CONNECT".</t>
          </li>
          <li>
            <t>The :protocol pseudo-header field <bcp14>SHALL</bcp14> be "connect-ethernet".</t>
          </li>
          <li>
            <t>The :authority pseudo-header field <bcp14>SHALL</bcp14> contain the authority of the IP
proxy.</t>
          </li>
          <li>
            <t>The :path and :scheme pseudo-header fields <bcp14>SHALL NOT</bcp14> be empty. Their values
<bcp14>SHALL</bcp14> contain the scheme and path from the configured URL; see
<xref target="client-config"/>.</t>
          </li>
        </ul>
        <t>An Ethernet proxying request that does not conform to these restrictions is
malformed; see <xref section="8.1.1" sectionFormat="of" target="H2"/> and <xref section="4.1.2" sectionFormat="of" target="H3"/>.</t>
        <t>For example, if the client is configured with the URL
"https://example.org/.well-known/masque/ethernet/" and wishes to open an
Ethernet tunnel, it could send the following request.</t>
        <figure anchor="fig-req-h2">
          <name>Example HTTP/2 or HTTP/3 Request</name>
          <sourcecode type="http-message"><![CDATA[
HEADERS
:method = CONNECT
:protocol = connect-ethernet
:scheme = https
:path = /.well-known/masque/ethernet/
:authority = example.org
capsule-protocol = ?1
]]></sourcecode>
        </figure>
      </section>
      <section anchor="resp23">
        <name>HTTP/2 and HTTP/3 Responses</name>
        <t>The server indicates a successful response by replying with the following
requirements:</t>
        <ul spacing="normal">
          <li>
            <t>the HTTP status code on the response <bcp14>SHALL</bcp14> be in the 2xx (Successful) range.</t>
          </li>
          <li>
            <t>the response <bcp14>SHALL</bcp14> meet the requirements of HTTP responses that start the
Capsule Protocol; see <xref section="3.2" sectionFormat="of" target="HTTP-DGRAM"/>.</t>
          </li>
        </ul>
        <t>If any of these requirements are not met, the client <bcp14>MUST</bcp14> treat this proxying
attempt as failed and abort the request. As an example, any status code in the
3xx range will be treated as a failure and cause the client to abort the
request.</t>
        <t>For example, the server could respond with:</t>
        <figure anchor="fig-resp-h2">
          <name>Example HTTP/2 or HTTP/3 Response</name>
          <sourcecode type="http-message"><![CDATA[
HEADERS
:status = 200
capsule-protocol = ?1
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="context-identifiers">
      <name>Context Identifiers</name>
      <t>The mechanism for proxying Ethernet in HTTP defined in this document allows
future extensions to exchange HTTP Datagrams that carry different semantics from
Ethernet frames. Some of these extensions can augment Ethernet payloads with
additional data or compress Ethernet frame header fields, while others can
exchange data that is completely separate from Ethernet payloads. In order to
accomplish this, all HTTP Datagrams associated with Ethernet proxying requests
streams start with a Context ID field; see <xref target="payload-format"/>.</t>
      <t>Context IDs are 62-bit integers (0-2<sup>62</sup>-1). Context IDs are encoded as
variable-length integers; see <xref section="16" sectionFormat="of" target="QUIC"/>. The Context ID value of 0
is reserved for Ethernet payloads, while non-zero values are dynamically
allocated. Non-zero even-numbered Context-IDs are client allocated, and
odd-numbered Context IDs are proxy-allocated. The Context ID namespace is tied
to a given HTTP request; it is possible for a Context ID with the same numeric
value to be simultaneously allocated in distinct requests, potentially with
different semantics. Context IDs <bcp14>MUST NOT</bcp14> be re-allocated within a given HTTP
request but <bcp14>MAY</bcp14> be allocated in any order. The Context ID allocation
restrictions to the use of even-numbered and odd-numbered Context IDs exist in
order to avoid the need for synchronization between endpoints. However, once a
Context ID has been allocated, those restrictions do not apply to the use of the
Context ID; it can be used by either the client or the Ethernet proxy,
independent of which endpoint initially allocated it.</t>
      <t>Registration is the action by which an endpoint informs its peer of the
semantics and format of a given Context ID. This document does not define how
registration occurs. Future extensions <bcp14>MAY</bcp14> use HTTP header fields or capsules
to register Context IDs. Depending on the method being used, it is possible for
datagrams to be received with Context IDs that have not yet been registered.
For instance, this can be due to reordering of the packet containing the
datagram and the packet containing the registration message during transmission.</t>
    </section>
    <section anchor="payload-format">
      <name>HTTP Datagram Payload Format</name>
      <t>When associated with Ethernet proxying request streams, the HTTP Datagram
Payload field of HTTP Datagrams (see <xref target="HTTP-DGRAM"/>) has the format defined in
<xref target="dgram-format"/>. Note that when HTTP Datagrams are encoded using QUIC DATAGRAM
frames, the Context ID field defined below directly follows the Quarter Stream
ID field which is at the start of the QUIC DATAGRAM frame payload.</t>
      <figure anchor="dgram-format">
        <name>Ethernet Proxying HTTP Datagram Format</name>
        <artwork><![CDATA[
Ethernet Proxying HTTP Datagram Payload {
  Context ID (i),
  Payload (..),
}
]]></artwork>
      </figure>
      <t>The Ethernet Proxying HTTP Datagram Payload contains the following fields:</t>
      <dl spacing="compact">
        <dt>Context ID:</dt>
        <dd>
          <t>A variable-length integer that contains the value of the Context ID. If an
HTTP/3 datagram which carries an unknown Context ID is received, the receiver
<bcp14>SHALL</bcp14> either drop that datagram silently or buffer it temporarily (on the order
of a round trip) while awaiting the registration of the corresponding Context
ID.</t>
        </dd>
        <dt>Payload:</dt>
        <dd>
          <t>The payload of the datagram, whose semantics depend on value of the previous
field. Note that this field can be empty.</t>
        </dd>
      </dl>
      <t>Ethernet frames are encoded using HTTP Datagrams with the Context ID set to
zero. When the Context ID is set to zero, the Payload field contains a full
Layer 2 Ethernet Frame (from the MAC destination field until the last byte of
the Frame check sequence field).</t>
    </section>
    <section anchor="ethernet-frame-handling">
      <name>Ethernet Frame Handling</name>
      <t>This document defines a tunnelling mechanism that is conceptually an Ethernet
link. Implementations might need to handle some of the responsibilities of an
Ethernet switch or bridge if they do not delegate them to another implementation
such as a kernel. Those responsibilities are beyond the scope of this document,
and include, but are not limited to, the handling of broadcast packets and
multicast groups.</t>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>Ethernet proxying in HTTP enables the bridging of Ethernet broadcast domains.
These examples are provided to help illustrate some of the ways in which Ethernet
proxying can be used.</t>
      <section anchor="example-remote">
        <name>Remote Access L2VPN</name>
        <t>The following example shows a point to point VPN setup where a client
appears to be connected to a remote Layer 2 network.</t>
        <figure anchor="diagram-tunnel">
          <name>L2VPN Tunnel Setup</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="520" viewBox="0 0 520 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,96" fill="none" stroke="black"/>
                <path d="M 248,32 L 248,96" fill="none" stroke="black"/>
                <path d="M 320,32 L 320,96" fill="none" stroke="black"/>
                <path d="M 424,32 L 424,96" fill="none" stroke="black"/>
                <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
                <path d="M 248,32 L 320,32" fill="none" stroke="black"/>
                <path d="M 424,32 L 456,32" fill="none" stroke="black"/>
                <path d="M 80,48 L 248,48" fill="none" stroke="black"/>
                <path d="M 88,64 L 104,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 240,64" fill="none" stroke="black"/>
                <path d="M 320,64 L 456,64" fill="none" stroke="black"/>
                <path d="M 80,80 L 248,80" fill="none" stroke="black"/>
                <path d="M 8,96 L 80,96" fill="none" stroke="black"/>
                <path d="M 248,96 L 320,96" fill="none" stroke="black"/>
                <path d="M 424,96 L 456,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="464,96 452,90.4 452,101.6" fill="black" transform="rotate(0,456,96)"/>
                <polygon class="arrowhead" points="464,64 452,58.4 452,69.6" fill="black" transform="rotate(0,456,64)"/>
                <polygon class="arrowhead" points="464,32 452,26.4 452,37.6" fill="black" transform="rotate(0,456,32)"/>
                <polygon class="arrowhead" points="96,64 84,58.4 84,69.6" fill="black" transform="rotate(180,88,64)"/>
                <g class="text">
                  <text x="484" y="36">HOST</text>
                  <text x="512" y="36">1</text>
                  <text x="284" y="52">L2</text>
                  <text x="360" y="52">Layer</text>
                  <text x="392" y="52">2</text>
                  <text x="44" y="68">Client</text>
                  <text x="128" y="68">Layer</text>
                  <text x="160" y="68">2</text>
                  <text x="196" y="68">Tunnel</text>
                  <text x="288" y="68">Proxy</text>
                  <text x="484" y="68">HOST</text>
                  <text x="512" y="68">2</text>
                  <text x="376" y="84">Broadcast</text>
                  <text x="364" y="100">Domain</text>
                  <text x="484" y="100">HOST</text>
                  <text x="512" y="100">3</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------+                    +--------+            +---> HOST 1
|        +--------------------+   L2   |  Layer 2   |
| Client |<--Layer 2 Tunnel---|  Proxy +------------+---> HOST 2
|        +--------------------+        |  Broadcast |
+--------+                    +--------+  Domain    +---> HOST 3

]]></artwork>
          </artset>
        </figure>
        <t>In this case, the client connects to the Ethernet proxy and immediately can
start sending ethernet frames to the attached broadcast domain.</t>
        <figure anchor="fig-full-tunnel">
          <name>VPN Full-Tunnel Example</name>
          <artwork><![CDATA[
[[ From Client ]]             [[ From Ethernet Proxy ]]

SETTINGS
  H3_DATAGRAM = 1

                              SETTINGS
                                ENABLE_CONNECT_PROTOCOL = 1
                                H3_DATAGRAM = 1

STREAM(44): HEADERS
:method = CONNECT
:protocol = connect-ethernet
:scheme = https
:path = /.well-known/masque/ethernet/
:authority = proxy.example.com
capsule-protocol = ?1

                              STREAM(44): HEADERS
                              :status = 200
                              capsule-protocol = ?1

DATAGRAM
Quarter Stream ID = 11
Context ID = 0
Payload = Encapsulated Ethernet Frame

                              DATAGRAM
                              Quarter Stream ID = 11
                              Context ID = 0
                              Payload = Encapsulated Ethernet Frame
]]></artwork>
        </figure>
      </section>
      <section anchor="site-to-site-l2vpn">
        <name>Site-to-Site L2VPN</name>
        <t>The following example shows a site-to-site VPN setup where a client
joins a locally attached broadcast domain to a remote broadcast domain
through the Proxy.</t>
        <figure anchor="diagram-s2s">
          <name>Site-to-site L2VPN Example</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="256" width="432" viewBox="0 0 432 256" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,32 L 80,96" fill="none" stroke="black"/>
                <path d="M 96,96 L 96,192" fill="none" stroke="black"/>
                <path d="M 152,32 L 152,96" fill="none" stroke="black"/>
                <path d="M 280,32 L 280,96" fill="none" stroke="black"/>
                <path d="M 336,96 L 336,192" fill="none" stroke="black"/>
                <path d="M 352,32 L 352,96" fill="none" stroke="black"/>
                <path d="M 80,32 L 152,32" fill="none" stroke="black"/>
                <path d="M 280,32 L 352,32" fill="none" stroke="black"/>
                <path d="M 152,48 L 280,48" fill="none" stroke="black"/>
                <path d="M 160,64 L 176,64" fill="none" stroke="black"/>
                <path d="M 256,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 152,80 L 280,80" fill="none" stroke="black"/>
                <path d="M 80,96 L 152,96" fill="none" stroke="black"/>
                <path d="M 280,96 L 352,96" fill="none" stroke="black"/>
                <path d="M 64,128 L 96,128" fill="none" stroke="black"/>
                <path d="M 336,128 L 368,128" fill="none" stroke="black"/>
                <path d="M 64,160 L 96,160" fill="none" stroke="black"/>
                <path d="M 336,160 L 368,160" fill="none" stroke="black"/>
                <path d="M 64,192 L 96,192" fill="none" stroke="black"/>
                <path d="M 336,192 L 368,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="376,192 364,186.4 364,197.6" fill="black" transform="rotate(0,368,192)"/>
                <polygon class="arrowhead" points="376,160 364,154.4 364,165.6" fill="black" transform="rotate(0,368,160)"/>
                <polygon class="arrowhead" points="376,128 364,122.4 364,133.6" fill="black" transform="rotate(0,368,128)"/>
                <polygon class="arrowhead" points="72,192 60,186.4 60,197.6" fill="black" transform="rotate(180,64,192)"/>
                <polygon class="arrowhead" points="72,160 60,154.4 60,165.6" fill="black" transform="rotate(180,64,160)"/>
                <polygon class="arrowhead" points="72,128 60,122.4 60,133.6" fill="black" transform="rotate(180,64,128)"/>
                <g class="text">
                  <text x="316" y="52">L2</text>
                  <text x="116" y="68">Client</text>
                  <text x="188" y="68">L2</text>
                  <text x="228" y="68">Tunnel</text>
                  <text x="320" y="68">Proxy</text>
                  <text x="20" y="132">HOST</text>
                  <text x="48" y="132">A</text>
                  <text x="128" y="132">Layer</text>
                  <text x="160" y="132">2</text>
                  <text x="288" y="132">Layer</text>
                  <text x="320" y="132">2</text>
                  <text x="396" y="132">HOST</text>
                  <text x="424" y="132">1</text>
                  <text x="144" y="148">Broadcast</text>
                  <text x="288" y="148">Broadcast</text>
                  <text x="20" y="164">HOST</text>
                  <text x="48" y="164">B</text>
                  <text x="132" y="164">Domain</text>
                  <text x="300" y="164">Domain</text>
                  <text x="396" y="164">HOST</text>
                  <text x="424" y="164">2</text>
                  <text x="20" y="196">HOST</text>
                  <text x="48" y="196">C</text>
                  <text x="396" y="196">HOST</text>
                  <text x="424" y="196">3</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
         +--------+               +--------+
         |        +---------------+   L2   |
         | Client |---L2 Tunnel---|  Proxy |
         |        +---------------+        |
         +-+------+               +------+-+
           |                             |
HOST A <---+ Layer 2             Layer 2 +---> HOST 1
           | Broadcast         Broadcast |
HOST B <---+ Domain               Domain +---> HOST 2
           |                             |
HOST C <---+                             +---> HOST 3



]]></artwork>
          </artset>
        </figure>
        <t>In this case, the client connects to the Ethernet proxy and immediately can
start relaying Ethernet frames from its attached broadcast domain to the
proxy. The difference between this example and <xref target="example-remote"/> is limited to
what the Client is doing with the the tunnel; the exchange between the Client
and the Proxy is the same as in <xref target="fig-full-tunnel"/> above.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>There are risks in allowing arbitrary clients to establish a tunnel to a Layer 2
network. Bad actors could abuse this capability to attack hosts on that network
that they would otherwise be unable to reach. HTTP servers that support Ethernet
proxying <bcp14>SHOULD</bcp14> restrict its use to authenticated users. Depending on the
deployment, possible authentication mechanisms include mutual TLS between IP
proxying endpoints, HTTP-based authentication via the HTTP Authorization header
<xref target="HTTP"/>, or even bearer tokens. Proxies can enforce policies for authenticated
users to further constrain client behavior or deal with possible abuse. For
example, proxies can rate limit individual clients that send an excessively
large amount of traffic through the proxy.</t>
      <t>Users of this protocol may send arbitrary Ethernet frames through the tunnel,
including frames with falsified source MAC addresses. This could allow
impersonation of other hosts, poisoning of ARP and CAM tables, and cause a
denial of service to other hosts on the network. These are the same attacks
available to an arbitrary client with physical access to the network.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-upgrade-token">
        <name>HTTP Upgrade Token</name>
        <t>This document will request IANA to register "connect-ethernet" in the HTTP
Upgrade Token Registry maintained at
&lt;<eref target="https://www.iana.org/assignments/http-upgrade-tokens"/>&gt;.</t>
        <dl spacing="compact">
          <dt>Value:</dt>
          <dd>
            <t>connect-ethernet</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Proxying of Ethernet Payloads</t>
          </dd>
          <dt>Expected Version Tokens:</dt>
          <dd>
            <t>None</t>
          </dd>
          <dt>References:</dt>
          <dd>
            <t>This document</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-suffix">
        <name>Updates to the MASQUE URI Suffixes Registry</name>
        <t>This document will request IANA to register "ethernet" in the MASQUE URI
Suffixes Registry maintained at $IANA_URL_TBD, created by CONNECT-IP
<xref target="CONNECT-IP"/>.</t>
        <table anchor="iana-suffixes-table">
          <name>New MASQUE URI Suffixes</name>
          <thead>
            <tr>
              <th align="left">Path Segment</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">ethernet</td>
              <td align="left">Ethernet Proxying</td>
              <td align="left">This Document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="H1" to="HTTP/1.1"/>
    <displayreference target="H2" to="HTTP/2"/>
    <displayreference target="H3" to="HTTP/3"/>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="H1">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="H2">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="H3">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="TCP">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="CONNECT-IP">
          <front>
            <title>Proxying IP in HTTP</title>
            <author fullname="T. Pauly" initials="T." role="editor" surname="Pauly"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="A. Chernyakhovsky" initials="A." surname="Chernyakhovsky"/>
            <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document describes how to proxy IP packets in HTTP. This protocol is similar to UDP proxying in HTTP but allows transmitting arbitrary IP packets. More specifically, this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy. This document updates RFC 9298.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9484"/>
          <seriesInfo name="DOI" value="10.17487/RFC9484"/>
        </reference>
        <reference anchor="L2TP">
          <front>
            <title>Layer Two Tunneling Protocol "L2TP"</title>
            <author fullname="W. Townsley" initials="W." surname="Townsley"/>
            <author fullname="A. Valencia" initials="A." surname="Valencia"/>
            <author fullname="A. Rubens" initials="A." surname="Rubens"/>
            <author fullname="G. Pall" initials="G." surname="Pall"/>
            <author fullname="G. Zorn" initials="G." surname="Zorn"/>
            <author fullname="B. Palter" initials="B." surname="Palter"/>
            <date month="August" year="1999"/>
            <abstract>
              <t>This document describes the Layer Two Tunneling Protocol (L2TP). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2661"/>
          <seriesInfo name="DOI" value="10.17487/RFC2661"/>
        </reference>
        <reference anchor="L2TPv3">
          <front>
            <title>Layer Two Tunneling Protocol - Version 3 (L2TPv3)</title>
            <author fullname="J. Lau" initials="J." role="editor" surname="Lau"/>
            <author fullname="M. Townsley" initials="M." role="editor" surname="Townsley"/>
            <author fullname="I. Goyret" initials="I." role="editor" surname="Goyret"/>
            <date month="March" year="2005"/>
            <abstract>
              <t>This document describes "version 3" of the Layer Two Tunneling Protocol (L2TPv3). L2TPv3 defines the base control protocol and encapsulation for tunneling multiple Layer 2 connections between two IP nodes. Additional documents detail the specifics for each data link type being emulated. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3931"/>
          <seriesInfo name="DOI" value="10.17487/RFC3931"/>
        </reference>
        <reference anchor="HTTP-DGRAM">
          <front>
            <title>HTTP Datagrams and the Capsule Protocol</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
              <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
              <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9297"/>
          <seriesInfo name="DOI" value="10.17487/RFC9297"/>
        </reference>
        <reference anchor="EXT-CONNECT2">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>This document defines a mechanism for running the WebSocket Protocol (RFC 6455) over a single stream of an HTTP/2 connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8441"/>
          <seriesInfo name="DOI" value="10.17487/RFC8441"/>
        </reference>
        <reference anchor="EXT-CONNECT3">
          <front>
            <title>Bootstrapping WebSockets with HTTP/3</title>
            <author fullname="R. Hamilton" initials="R." surname="Hamilton"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The mechanism for running the WebSocket Protocol over a single stream of an HTTP/2 connection is equally applicable to HTTP/3, but the HTTP-version-specific details need to be specified. This document describes how the mechanism is adapted for HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9220"/>
          <seriesInfo name="DOI" value="10.17487/RFC9220"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="ETHERIP">
          <front>
            <title>EtherIP: Tunneling Ethernet Frames in IP Datagrams</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="S. Hollenbeck" initials="S." surname="Hollenbeck"/>
            <date month="September" year="2002"/>
          </front>
          <seriesInfo name="RFC" value="3378"/>
          <seriesInfo name="DOI" value="10.17487/RFC3378"/>
        </reference>
        <reference anchor="GUE">
          <front>
            <title>Generic UDP Encapsulation</title>
            <author fullname="Tom Herbert" initials="T." surname="Herbert">
              <organization>Quantonium</organization>
            </author>
            <author fullname="Lucy Yong" initials="L." surname="Yong">
              <organization>Independent</organization>
            </author>
            <author fullname="Osama Zia" initials="O." surname="Zia">
              <organization>Microsoft</organization>
            </author>
            <date day="26" month="October" year="2019"/>
            <abstract>
              <t>   This specification describes Generic UDP Encapsulation (GUE), which
   is a scheme for using UDP to encapsulate packets of different IP
   protocols for transport across layer 3 networks. By encapsulating
   packets in UDP, specialized capabilities in networking hardware for
   efficient handling of UDP packets can be leveraged. GUE specifies
   basic encapsulation methods upon which higher level constructs, such
   as tunnels and overlay networks for network virtualization, can be
   constructed. GUE is extensible by allowing optional data fields as
   part of the encapsulation, and is generic in that it can encapsulate
   packets of various IP protocols.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-intarea-gue-09"/>
        </reference>
      </references>
    </references>
    <?line 529?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Much of the initial version of this draft borrows heavily from <xref target="CONNECT-IP"/>.</t>
      <t>The author would like to thank Alexander Chernyakhovsky and David Schinazi
for their advice while preparing this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+Vc/VIjOZL/X0+hdV/EwQ52Y0PMB9vMrBvoaSJomgUzexsT
HRNylbBrKZe8pSpoL80+y77CvcLdi11+SCpV2dA9cXtxG3fETGOqpJSUyo9f
plLu9/uiyqpcH8jeRWk+rrJiJk+quS4LXcmskG8nk4ueUNNpqe+gzdH78/OT
o0n/ZPL25PL8ZNITiar0zJSrA2mrVKQmKdQCqKWluqn6ma5u+gtl/1LrfmKK
QidVXzvq/d2hsPV0kVmbmaJaLaHX6cnkjSjqxVSXByIFygcCulld2NoeyKqs
tYBZ7AlVagWzmZSqsEtTVj1xb8rbWWnqJTx+V+dVtsz1R53K8XKZZzBHGEJe
1VNblUBVmjtdyj9cnx7JkyIpV0t83RO3egVk0gMh+/IvdZbg73lVLfE3TEbN
SrXAzz9dnOOvJfILP1Q1rCy3+JHX6jv2ixl+zNVKl/0RfvSLF3e6qGF1UoZJ
j6/+cH3SgyfMit4fYUW4Gz9iA3y+UFkOz3mI3yNrB6ac4RtVJnN4g0Pag5cv
sSE+yu70wDd7iQ9eTktzb/VLJvESu86yal5PoTNt1f3M7dbLz+8f9s6BmbaK
hm5TGTD1QWa+gN4XNBnMq0XeE0LV1dyUuE8wBwliCsIxHsjLgbzSqf7Pfzf0
mAVxnOs/qyItjbxsvQWeqCL7K0nGgfzRmFmu5dnZEb3UzGtloUNhfj+jt4PE
LIQoTLmATne0eW+HB9T+8EBevjn6bjgc0Z9pZpew6QekPS+HgyE2HXWa7m1o
it3f7nUa7m9ouCdEVtw0UxGi3+9LRfKdVEJM5pmVoIz1QheVTLVNymyqrZyb
e1kZFt1Gz29AsOGlU/eBpN7QpjKJyQV8ttkCRQq7nl5wbxRN12FHTmsgYkp5
hpIuR7gjlVapNDfu0d5AvjOlFnapk+wGFDLPVzuy6szyJitgGioMDQ1UJaEt
SK1UPJhM8gxbV0YkYAVAmf2gYTmsj9AZNGc2Dx2tLlHtYQ3wRFWVSuY6Fcv5
yuJ8QCDkXVZWNXwMlKye4dQGjr+LLE1zLcQLeVpUpUnrBKVHCCIPk77LgNMw
rpbOTsoFiK5J5ZbVWj48XGnqIL8b7A2+Rub8Bnse8jbvPj5uIxN5WcheJSdH
F9DtN/CLGo2+23t8DMuDdeDOQlMS4h340+/TQidzkG67IILXx0TF227401H7
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
G4j/AlxKa5zCTAAA

-->

</rfc>
