<?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.4 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ramseyer-grow-peering-api-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.0 -->
  <front>
    <title>Peering API</title>
    <seriesInfo name="Internet-Draft" value="draft-ramseyer-grow-peering-api-01"/>
    <author fullname="Jenny Ramseyer">
      <organization>Meta</organization>
      <address>
        <email>ramseyer@meta.com</email>
      </address>
    </author>
    <date year="2024" month="January" day="17"/>
    <keyword>BGP</keyword>
    <keyword>peering</keyword>
    <keyword>configuration</keyword>
    <abstract>
      <?line 37?>

<t>We propose an API standard for BGP Peering, also known as interdomain interconnection through global Internet Routing.
This API offers a standard way to request public (settlement-free) peering, verify the status of a request or BGP session, and list potential connection locations.
The API is backed by PeeringDB OIDC, the industry standard for peering authentication.
We also propose future work to cover private peering, and alternative authentication methods.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bgp.github.io/draft-ietf-peering-api/draft-peering-api-ramseyer-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ramseyer-grow-peering-api/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bgp/draft-ietf-peering-api"/>.</t>
    </note>
  </front>
  <middle>
    <?line 44?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Peering API is a mechanism that allows networks to automate interdomain interconnection  between two entities through global Internet Routing.
Using the API, networks will be able to automatically request and accept peering interconnections between Autonomous Systems in public or private scenarios in a time faster than it would take to configure sessions manually.
By speeding up the peering turn-up process and removing the need for manual involvement in peering, the API and automation will ensure that networks can get interconnected as fast, reliably, cost-effectively, and efficiently as possible.
As result, this improves end-user performance for all applications using networks interconnection supporting the Peering API.</t>
      <t>Business Justification:</t>
      <t>By using the Peering API, entities requesting and accepting peering can significantly improve the process to turn up interconnections by:</t>
      <ul spacing="normal">
        <li>
          <t>Reducing in person-hours spent configuring peering</t>
        </li>
        <li>
          <t>Reducing configuration mistakes by reducing human interaction</t>
        </li>
        <li>
          <t>And by peering, reducing network latency through expansion of interconnection relationships</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>All terms used in this document will be defined here:</t>
      <ul spacing="normal">
        <li>
          <t>Initiator: Network that wants to peer</t>
        </li>
        <li>
          <t>Receiver: Network that is receiving communications about peering</t>
        </li>
        <li>
          <t>Configured: peering session that is set up on one side</t>
        </li>
        <li>
          <t>Established: session is already defined as per BGP4 specification (page 71)</t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>As peering connections exchange real internet traffic, this API requires a security component to verify that the requestor is allowed to request peering on behalf of that ASN.
In this initial proposal, this API requires PeeringDB-based authentication as the standard.
After further discussion, the authors decided to offer alternate authentication options to accomodate the security concerns of different parties.
As peers may require varying security standards, this API will support PeeringDB OIDC as the base requirement, with optional security extensions in addition (RPKI or alternate OIDCs, for example)
This document hopes that, through the RFC process, the Working Group can come to a consensus on a base "authentication standard," to ease adoption for peering partners.</t>
      <t>Of particular interest is RPKI.
PeeringDB OIDC allows the API to verify who the requesting party is, while RPKI-signing allows the requesting party to prove that they can configure a request.
The combination of both authorizations provides a strong security guarantee.
This document recognizes that not all partners have the time or engineering resources to support all authorization standards, so the API will offer an extensible security platform to meet varying security requirements.
For RPKI-based authentication, this document refers to RFC9323.</t>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>The Peering API follows the RESTful API mode.
After authentication, a client can request to add or remove peering connections, list potential interconnection locations, and query for upcoming maintenance events.</t>
    </section>
    <section anchor="example-request-flow">
      <name>Example Request Flow</name>
      <t>For a diagram, please see: https://github.com/bgp/autopeer/?tab=readme-ov-file#sequence-diagram</t>
      <section anchor="auth">
        <name>AUTH</name>
        <t>First, the client makes an authenticated request to the server.
In this example, the client will use PeeringDB OAuth.
Authentication provides the server with client's email (for potential manual discussion), along with client's entitlements, to confirm client is permitted to request on behalf of the proposed ASN.</t>
      </section>
      <section anchor="request">
        <name>REQUEST</name>
        <ol spacing="normal" type="1"><li>
            <t>ADD SESSION (CLIENT REQUEST)</t>
          </li>
        </ol>
        <ul spacing="normal">
          <li>
            <t>Client provides:
            </t>
            <ul spacing="normal">
              <li>
                <t>Dictionary (multiple):
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Local ASN (server)</t>
                  </li>
                  <li>
                    <t>Local IP</t>
                  </li>
                  <li>
                    <t>Peer ASN (client)</t>
                  </li>
                  <li>
                    <t>Peer IP</t>
                  </li>
                  <li>
                    <t>Peer Type</t>
                  </li>
                  <li>
                    <t>MD5 (optional)</t>
                  </li>
                  <li>
                    <t>IXP ID</t>
                  </li>
                  <li>
                    <t>Status
  9: UUID</t>
                  </li>
                  <li>
                    <t>Sent prefixes (0 if not Established) (optional)</t>
                  </li>
                  <li>
                    <t>Received prefixes (0 if not Established) (optional)</t>
                  </li>
                  <li>
                    <t>Accepted Prefixes (optional)</t>
                  </li>
                </ol>
              </li>
            </ul>
          </li>
          <li>
            <t>Server actions:
            </t>
            <ul spacing="normal">
              <li>
                <t>Server confirms requested clientASN in list of authorized ASN.</t>
              </li>
              <li>
                <t>Optional: checks traffic levels, prefix limit counters, other desired internal checks.</t>
              </li>
            </ul>
          </li>
        </ul>
        <ol spacing="normal" type="1"><li>
            <t>ADD SESSION (SERVER RESPONSE)</t>
          </li>
        </ol>
        <ul spacing="normal">
          <li>
            <t>APPROVAL CASE
            </t>
            <ul spacing="normal">
              <li>
                <t>Server returns dictionary of acceptable peering sessions.  Note: this dictionary may also contain additional sessions on which to peer.  See "Public Peering Session Negotiation" for details.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>REJECTION CASE  </t>
            <ul spacing="normal">
              <li>
                <t>Server returns dictionary of acceptable and rejected sessions.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Optional information:
            </t>
            <ul spacing="normal">
              <li>
                <t>The server may also include the following details:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Prefix limit counters (optional value)</t>
                  </li>
                  <li>
                    <t>TimeWindow: Time window indicating when sessions will be configured after being notified (may be 0 if sessions are already configured on receiver side)</t>
                  </li>
                  <li>
                    <t>isInboundFiltered: optional bool that indicates whether prefixes will be filtered inbound.  If this is set to true, the time window should be set for how long the prefixes will be filtered.</t>
                  </li>
                  <li>
                    <t>isOutboundFiltered: optional bool that indicates whether prefixes will be filtered outbound.  If this is set to true, the time window should be set for how long the prefixes will be filtered.  If the outbound limit is longer than the inbound limit time, the time window should be set to the max of inbound versus outbound.</t>
                  </li>
                </ol>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="client-configuration">
        <name>CLIENT CONFIGURATION</name>
        <t>The client then configures the chosen peering sessions.
If the server added additional approved peering sessions, the client may choose whether or not to configure those sessions.
For every session that the server rejected, the client removes that session from the list to be configured.</t>
      </section>
      <section anchor="server-configuration">
        <name>SERVER CONFIGURATION</name>
        <t>The server configures all sessions that are in its list of approved peering sessions from its reply to the client.</t>
      </section>
      <section anchor="monitoring">
        <name>MONITORING</name>
        <t>Both client and server wait for sessions to establish.
At any point, client may send a "GET STATUS" request to the server, to request the status of the original request (by UUID) or of a session (by session UUID).
The client will send a dictionary along with the request, as follows:</t>
        <ul spacing="normal">
          <li>
            <t>Dictionary:
            </t>
            <ul spacing="normal">
              <li>
                <t>Local ASN (server)</t>
              </li>
              <li>
                <t>Local IP</t>
              </li>
              <li>
                <t>Peer ASN (client)</t>
              </li>
              <li>
                <t>Peer IP</t>
              </li>
              <li>
                <t>Peer Type</t>
              </li>
              <li>
                <t>MD5 (optional)</t>
              </li>
              <li>
                <t>IXP ID</t>
              </li>
              <li>
                <t>Status</t>
              </li>
              <li>
                <t>UUID</t>
              </li>
              <li>
                <t>Sent prefixes (0 if not Established) (optional)</t>
              </li>
              <li>
                <t>Received prefixes (0 if not Established) (optional)</t>
              </li>
              <li>
                <t>Accepted Prefixes (optional)</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The server then responds with the same dictionary, with the information that it understands (status, etc).</t>
      </section>
      <section anchor="completion">
        <name>COMPLETION</name>
        <t>If both sides report that the session is established, then peering is complete.
If one side does not configure sessions within the server's acceptable configuration window (TimeWindow), then the server is entitled to remove the configured sessions and report "Unestablished" to the client.</t>
      </section>
    </section>
    <section anchor="api-endpoints-and-specifications">
      <name>API Endpoints and Specifications</name>
      <t>Each peer needs an API endpoint that will implement the API protocol.
This API should be publicly listed in peeringDB and also as a potential expansion of RFC 9092 which provides endpoint integration to whois.
Each API endpoint should be fuzz-tested and protected against abuse.  Attackers should not be able to access internal systems using the API.
Every single request should come in with a unique guid called RequestID that maps to a peering request for later reference.  This guid format should be standardized across all requests.  This guid should be provided by the receiver once it receives the request and must be embedded in all communication.  If there is no RequestID present then that should be interpreted as a new request and the process starts again.
An email address is needed for communication if the API fails or is not implemented properly (can be obtained through peeringdb).</t>
      <t>For a programmatic specification of the API, please see the public Github here: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
      <t>This initial draft fully specifies the Public Peering endpoints.  Private Peering and Maintenance are under discussion, and the authors invite collaboration and discussion from interested parties.</t>
      <section anchor="data-types">
        <name>DATA TYPES</name>
        <t>As defined in https://github.com/bgp/autopeer/blob/main/api/openapi.yaml.
Please see specification for OpenAPI format.</t>
        <t>Peering Location</t>
        <t>Contains string field listing the desired peering location in format <tt>pdb:ix:$IX_ID</tt>, and an enum specifying peering type (public or private).</t>
        <t>Session Status</t>
        <t>Status of BGP Session, both as connection status and approval status (Established, Pending, Approved, Rejected, Down, etc)</t>
        <t>Session Array</t>
        <t>Array of potential BGP sessions, with request UUID.
 Request UUID is optional for client, and required for server.
 Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID.  Request ID will not change across the request.</t>
        <ul spacing="normal">
          <li>
            <t>BGP Session
            </t>
            <ul spacing="normal">
              <li>
                <t>local_asn (ASN of requestor)</t>
              </li>
              <li>
                <t>local_ip (IP of requestor, v4 or v6)</t>
              </li>
              <li>
                <t>peer_asn (server ASN)</t>
              </li>
              <li>
                <t>peer_ip (server-side IP)</t>
              </li>
              <li>
                <t>peer_type (public or private)</t>
              </li>
              <li>
                <t>md5 (optional string)</t>
              </li>
              <li>
                <t>location (Peering Location, as defined above)</t>
              </li>
              <li>
                <t>status (Session Status, as defined above)</t>
              </li>
              <li>
                <t>UUID (of individual session.  Server must provide UUID.  Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID)</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>Error</t>
        <t>API Errors, for field validation errors in requests, and request-level errors.</t>
        <t>The above is sourced largely from the linked OpenAPI specification.</t>
      </section>
      <section anchor="endpoints">
        <name>Endpoints:</name>
        <t>(As defined in https://github.com/bgp/autopeer/blob/main/api/openapi.yaml)
On each call, there should be rate limits, allowed senders, and other optional restrictions.</t>
        <section anchor="public-peering-over-an-internet-exchange-ix">
          <name>Public Peering over an Internet Exchange (IX):</name>
          <ul spacing="normal">
            <li>
              <t>/add_sessions: ADD/AUGMENT IX PEER
              </t>
              <ul spacing="normal">
                <li>
                  <t>Establish new BGP sessions between peers, at the desired exchange.</t>
                </li>
                <li>
                  <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
                </li>
                <li>
                  <t>POST: /add_sessions
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Request body: Session Array</t>
                    </li>
                    <li>
                      <t>Responses:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>200 OK:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Contents: Session Array (all sessions in request accepted for configuration).</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>300:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Contents: Modified Session Array, with rejected or additional sessions.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>400:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Error</t>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>REMOVE IX PEER
              </t>
              <ul spacing="normal">
                <li>
                  <t>Given a list of Session Arrays, remove the sessions in that list.</t>
                </li>
                <li>
                  <t>This API serves as a notification to the server, as the client may remove the sessions before sending the request to the server.</t>
                </li>
                <li>
                  <t>Server replies back with request ID and deletion status (complete, in-progress).</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="utility-api-calls">
          <name>UTILITY API CALLS</name>
          <t>Endpoints which provide useful information for potential interconnections.</t>
          <ul spacing="normal">
            <li>
              <t>/list_locations: LIST POTENTIAL PEERING LOCATIONS
              </t>
              <ul spacing="normal">
                <li>
                  <t>List potential peering locations, both public and private.</t>
                </li>
                <li>
                  <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
                </li>
                <li>
                  <t>GET: /list_locations
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Request parameters:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>asn (Server ASN, with which to list potential connections)</t>
                        </li>
                        <li>
                          <t>location_type (Optional: Peering Location)</t>
                        </li>
                      </ul>
                    </li>
                    <li>
                      <t>Response:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>200: OK
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Contents: List of Peering Locations.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>400:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Error</t>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>/get_status: QUERY FOR REQUEST STATUS
              </t>
              <ul spacing="normal">
                <li>
                  <t>Given a request ID, query for the status of that request.</t>
                </li>
                <li>
                  <t>Given an ASN without request ID, query for status of all connections between client and server.</t>
                </li>
                <li>
                  <t>Below is based on OpenAPI specification: https://github.com/bgp/autopeer/blob/main/api/openapi.yaml</t>
                </li>
                <li>
                  <t>GET: /get_status
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Request parameters:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>asn (requesting client's asn)</t>
                        </li>
                        <li>
                          <t>request_id (optional, UUID of request)</t>
                        </li>
                      </ul>
                    </li>
                    <li>
                      <t>Response:
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>200: OK
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Contents: Session Array of sessions in request_id, if provided.  Else, all existing and in-progress sessions between client ASN and server.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>400:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>Error (example: request_id is invalid)</t>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="private-peering">
          <name>Private Peering</name>
          <ul spacing="normal">
            <li>
              <t>ADD/AUGMENT PNI</t>
            </li>
            <li>
              <t>Parameters:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Peer ASN</t>
                </li>
                <li>
                  <t>Facility</t>
                </li>
                <li>
                  <t>email address (contact)</t>
                </li>
                <li>
                  <t>Action type: add/augment</t>
                </li>
                <li>
                  <t>LAG struct:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>IPv4</t>
                    </li>
                    <li>
                      <t>IPv6</t>
                    </li>
                    <li>
                      <t>Circuit ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Who provides LOA?  (and where to provide it).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Response:
              </t>
              <ul spacing="normal">
                <li>
                  <t>200:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>LAG struct, with server data populated</t>
                    </li>
                    <li>
                      <t>LOA or way to recieve it</t>
                    </li>
                    <li>
                      <t>Request ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>300:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Proposed Modification: LAG struct, LOA, email address for further discussion</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>40x: rejections</t>
                </li>
              </ul>
            </li>
            <li>
              <t>REMOVE PNI
              </t>
              <ul spacing="normal">
                <li>
                  <t>As ADD/AUGMENT in parameters.  Responses will include a request ID and status.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="public-peering-session-negotiation">
      <name>Public Peering Session Negotiation</name>
      <t>As part of public peering configuration, this draft must consider how the client and server should handshake at which sessions to configure peering.
At first, a client will request sessions A, B, and C.
The server may choose to accept all sessions A, B, and C.
At this point, configuration proceeds as normal.
However, the server may choose to rejest session B.
At that point, the server will reply back with A and C marked as "Accepted," and B as "Rejected."
The server will then configure A and C, and wait for the client to configure A and C.
If the client configured B as well, it will not come up.</t>
      <t>This draft encourages peers to set up garbage collection for unconfigured or down peering sessions, to remove stale configs and maintain good router hygiene.</t>
      <t>Related to rejection, if the server would like to configure additional sessions with the client, the server may reply back with additional peering sessions D and E.
The server will configure D and E on their side, and D and E will become part of the sessions requested in the UUID.
The client may choose whether or not to accept those additional sessions.
If they do, the client should configure D and E as well.
If they do not, the client will not configure D and E, and the server should garbage-collect those pending sessions.</t>
      <t>As part of the IETF discussion, the authors would like to discuss how to coordinate which side unfilters first.
Perhaps this information could be conveyed over a preferences vector.</t>
    </section>
    <section anchor="private-peering-1">
      <name>Private Peering</name>
      <t>Through future discussion with the IETF, the specification for private peering will be solidified.
Of interest for discussion includes Letter of Authorization (LOA) negotiation, and how to coordinate unfiltering and configuration checks.</t>
    </section>
    <section anchor="maintenance">
      <name>Maintenance</name>
      <t>This draft does not want to invent a new ticketing system.
However, there is an opportunity in this API to provide maintenance notifications to peering partners.
If there is interest, this draft would extend to propose a maintenance endpoint, where the server could broadcast upcoming and current maintenance windows.</t>
      <t>A maintenance message would follow a format like:</t>
      <ul spacing="normal">
        <li>
          <t>Title: string</t>
        </li>
        <li>
          <t>Start Date: date maintenance start(s/ed): UTC</t>
        </li>
        <li>
          <t>End Date: date maintenance ends: UTC</t>
        </li>
        <li>
          <t>Area: string or enum</t>
        </li>
        <li>
          <t>Details: freeform string</t>
        </li>
      </ul>
      <t>The "Area" field could be a freeform string, or could be a parseable ENUM, like (BGP, PublicPeering, PrivatePeering, Configuration, Caching, DNS, etc).</t>
      <t>Past maintenances will not be advertised.</t>
    </section>
    <section anchor="possible-extensions">
      <name>Possible Extensions</name>
      <t>The authors acknowledge that route-server configuration may also be of interest for this proposed API, and look forward to future discussions in this area.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <?line 353?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This project is joint work between Meta, AWS, Cloudflare, FullCtl, and Google.
Many thanks to my collaborators: Carlos Aguado (AWS), Ben Blaustein (Meta), Matt Griswold (FullCtl), Ben Ryall (Meta), Arturo Servin (Google), and Tom Strickx (Cloudflare).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
E/l/AND5H07WEKE++e8k+R+K4VTAtUAAAA==

-->

</rfc>
