RFC 7877

Session Peering Provisioning Framework (SPPF)

πŸ“… published August 2016, from ietf

RFC 7877: Session Peering Provisioning Framework (SPPF) ✨

okay bestie, this is the title block πŸŽ€ It's from the Internet Engineering Task Force (IETF) and it's a Standards Track doc, so it's official, implementers-have-to-read-it energy πŸ’…

  • Authors: K. Cartwright and V. Bhatia (both TNS), S. Ali (NeuStar), and D. Schwartz (XConnect)
  • Date: August 2016
  • ISSN: 2070-1721 πŸ¦‹

Abstract 🌸

so this doc spells out the data model and the overall structure for a framework that provisions Session Establishment Data (SED) into Session Data Registries and SIP Service Provider (SSP) data stores πŸ’œ the framework is called the "Session Peering Provisioning Framework" (SPPF), and the provisioned data is typically used by network elements for session establishment 🧚

Status of This Memo πŸ“œ

this is an Internet Standards Track doc πŸ”₯

it's a product of the IETF, which means it has the consensus of the IETF community ✨ it got public review and was approved for publication by the Internet Engineering Steering Group (IESG) 🫢 for more on Internet Standards, check Section 2 of RFC 7841 🌈

info about the current status of this doc, any errata, and how to send feedback is at http://www.rfc-editor.org/info/rfc7877 πŸ’–

Copyright (c) 2016 IETF Trust and the persons identified as the document authors. All rights reserved. πŸ’…

this doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they stand on the date of publication πŸ¦‹ please read these carefully, because they explain your rights and restrictions for this doc 😭

Code Components pulled out of this document must include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions. They're also provided without warranty, as described in the Simplified BSD License. Read this one twice, it's the important part πŸ’€

Table of Contents 🧚

1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   6
3.  Framework High-Level Design . . . . . . . . . . . . . . . . .   7
  3.1.  Framework Data Model  . . . . . . . . . . . . . . . . . .   7
  3.2.  Time Value  . . . . . . . . . . . . . . . . . . . . . . .  10
  3.3.  Extensibility . . . . . . . . . . . . . . . . . . . . . .  10
4.  Substrate Protocol Requirements . . . . . . . . . . . . . . .  11
  4.1.  Mandatory Substrate . . . . . . . . . . . . . . . . . . .  11
  4.2.  Connection Oriented . . . . . . . . . . . . . . . . . . .  11
  4.3.  Request and Response Model  . . . . . . . . . . . . . . .  11
  4.4.  Connection Lifetime . . . . . . . . . . . . . . . . . . .  11
  4.5.  Authentication  . . . . . . . . . . . . . . . . . . . . .  12
  4.6.  Authorization . . . . . . . . . . . . . . . . . . . . . .  12
  4.7.  Confidentiality and Integrity . . . . . . . . . . . . . .  12
  4.8.  Near Real Time  . . . . . . . . . . . . . . . . . . . . .  12
  4.9.  Request and Response Sizes  . . . . . . . . . . . . . . .  12
  4.10. Request and Response Correlation  . . . . . . . . . . . .  13
  4.11. Request Acknowledgement . . . . . . . . . . . . . . . . .  13
5.  Base Framework Data Structures and Response Codes . . . . . .  13
  5.1.  Basic Object Type and Organization Identifiers  . . . . .  13
  5.2.  Various Object Key Types  . . . . . . . . . . . . . . . .  14
    5.2.1.  Generic Object Key Type . . . . . . . . . . . . . . .  14
    5.2.2.  Derived Object Key Types  . . . . . . . . . . . . . .  15
  5.3.  Response Message Types  . . . . . . . . . . . . . . . . .  16
6.  Framework Data Model Objects  . . . . . . . . . . . . . . . .  18
  6.1.  Destination Group . . . . . . . . . . . . . . . . . . . .  18
  6.2.  Public Identifier . . . . . . . . . . . . . . . . . . . .  19
  6.3.  SED Group . . . . . . . . . . . . . . . . . . . . . . . .  25
  6.4.  SED Record  . . . . . . . . . . . . . . . . . . . . . . .  29
  6.5.  SED Group Offer . . . . . . . . . . . . . . . . . . . . .  33
  6.6.  Egress Route  . . . . . . . . . . . . . . . . . . . . . .  35

7.  Framework Operations  . . . . . . . . . . . . . . . . . . . .  36
  7.1.  Add Operation . . . . . . . . . . . . . . . . . . . . . .  37
  7.2.  Delete Operation  . . . . . . . . . . . . . . . . . . . .  37
  7.3.  Get Operations  . . . . . . . . . . . . . . . . . . . . .  38
  7.4.  Accept Operations . . . . . . . . . . . . . . . . . . . .  38
  7.5.  Reject Operations . . . . . . . . . . . . . . . . . . . .  39
  7.6.  Get Server Details Operation  . . . . . . . . . . . . . .  39
8.  XML Considerations  . . . . . . . . . . . . . . . . . . . . .  40
  8.1.  Namespaces  . . . . . . . . . . . . . . . . . . . . . . .  40
  8.2.  Versioning and Character Encoding . . . . . . . . . . . .  40
9.  Security Considerations . . . . . . . . . . . . . . . . . . .  41
  9.1.  Confidentiality and Authentication  . . . . . . . . . . .  41
  9.2.  Authorization . . . . . . . . . . . . . . . . . . . . . .  41
  9.3.  Denial of Service . . . . . . . . . . . . . . . . . . . .  41
    9.3.1.  DoS Issues Inherited from the Substrate Mechanism . .  42
    9.3.2.  DoS Issues Specific to SPPF . . . . . . . . . . . . .  42
  9.4.  Information Disclosure  . . . . . . . . . . . . . . . . .  43
  9.5.  Non-repudiation . . . . . . . . . . . . . . . . . . . . .  43
  9.6.  Replay Attacks  . . . . . . . . . . . . . . . . . . . . .  43
  9.7.  Compromised or Malicious Intermediary . . . . . . . . . .  44
10. Internationalization Considerations . . . . . . . . . . . . .  44
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . .  44
  11.1.  URN Assignments  . . . . . . . . . . . . . . . . . . . .  44
  11.2.  Organization Identifier Namespace Registry . . . . . . .  45
12. Formal Specification  . . . . . . . . . . . . . . . . . . . .  45
13. References  . . . . . . . . . . . . . . . . . . . . . . . . .  54
  13.1.  Normative References . . . . . . . . . . . . . . . . . .  54
  13.2.  Informative References . . . . . . . . . . . . . . . . .  55
Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  57
Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  57

heads up bestie 🫢 the text I got for this part stops at the Table of Contents, so I haven't made up Section 1 yet. Send me the next part and I'll keep the vibe going πŸ’–

1. Introduction ✨

okay so, Service Providers (SPs) and enterprises use routing databases called Registries πŸ“ž to make session routing decisions for Voice over IP, SMS, and Multimedia Messaging Service (MMS) traffic exchanges πŸ’Œ. This doc is super narrowly focused on the provisioning framework for these Registries πŸŽ€. It lays out a way for an entity to provision session-related data into a Session Peering Provisioning Protocol (SPPP) Registry (or "Registry") πŸ’…. The data being provisioned can be optionally shared with other participating peering entities 🫢. The requirements and use cases behind all of this are written up in [RFC6461] πŸ“š.

Three types of provisioning flows were described in the use case document: client to Registry, Registry to local data repository, and Registry to Registry πŸ¦‹. This document covers the client-to-Registry flow, which is what lets you provision Session Establishment Data (SED) πŸ’–. The framework that supports the flow of messages for client-to-Registry provisioning is called the "Session Peering Provisioning Framework" (SPPF) ✨.

The roles of "client" and "server" only apply to the connection πŸ”Œ. They have nothing to do with what type of entity is taking part in a protocol exchange πŸ™ˆ. For example, a Registry might also act as a "client" when it starts a connection, like when it distributes data to an SSP 🌈.

   *--------*               *------------*               *------------*
   |        | (1) Client   |             | (3) Registry  |            |
   | Client | ------------> |  Registry  |<------------->|  Registry  |
   |        |   to Registry |            |  to Registry  |            |
   *--------*               *------------*               *------------*
                                 /  \                          \
                                /    \                          \
                               /      \                          \
                              /        \                          v
                             /          \                         ...
                            /            \
                           / (2) Distrib  \
                          / Registry data  \
                         /  to local data   \
                        V      store         V
                       +----------+       +----------+
                       |Local Data|       |Local Data|
                       |Repository|       |Repository|
                       +----------+       +----------+

                Figure 1: Three Registry Provisioning Flows

A "terminating" SSP provisions SED into the Registry so it can be selectively shared with other peer SSPs πŸ“.

SED is typically used by various downstream SIP-signaling systems to route a call to the next hop associated with the called domain πŸ“±. These systems usually grab their session routing info from a local data store (a "Local Data Repository") πŸ—„οΈ. More specifically, the SED is the set of parameters that the outgoing Signaling Path Border Elements (SBEs) need in order to initiate the session 🧚. Check out [RFC5486] for more details πŸ‘€.

A Registry may distribute the provisioned data into local data repositories πŸ“¦. It may also offer a central query-resolution service (not shown in the above figure) for query purposes πŸ”.

A key requirement for the SPPF is that it can accommodate two basic deployment scenarios 🫧:

  1. A resolution system returns a Lookup Function (LUF) that identifies the target domain to help with call routing (as described in Section 4.3.3 of [RFC5486]). In this case, the querying entity may use other means to perform the Location Routing Function (LRF), which in turn helps determine the actual location of the Signaling Function in that domain πŸ—ΊοΈ.
  2. A resolution system returns an LRF that comprises the location (address) of the Signaling Function in the target domain (as described in [RFC5486]) πŸ“.

Design-wise, SPPF is agnostic to the substrate protocol 🫠. This document includes the specification of the data model, and it identifies (but does not specify) the means to enable protocol operations within a request and response structure 🧩. That part of the spec has been handed off to the "protocol" specification for the framework 🀝. To encourage interoperability, the framework supports extensibility aspects 🌸.

In this document, an XML Schema is used to describe the building blocks of the SPPF 🧱. It also expresses the data types, the semantic relationships between the various data types, and various constraints as a binding construct πŸ”—. A "protocol" specification is free to choose any data representation format, as long as it meets the requirements laid out in the SPPF XML Schema Definition (XSD) πŸ’œ. XML and JSON are two widely used examples of data representation formats πŸ₯°.

This document is organized as follows πŸ“‹:

  • Section 2 provides the terminology
  • Section 3 provides an overview of SPPF, including functional entities and a data model
  • Section 4 specifies requirements for SPPF substrate protocols
  • Section 5 describes the base framework data structures, the generic response types that MUST be supported by a conforming substrate "protocol" specification, and the basic object type from which most first-class objects extend
  • Section 6 provides a detailed description of the data model object specifications
  • Section 7 describes the operations that are supported by the data model
  • Section 8 defines XML considerations XML parsers must meet to conform to this specification
  • Sections 9 - 11 discuss security, internationalization, and IANA considerations, respectively
  • Section 12 normatively defines the SPPF using its XSD

2. Terminology πŸ’…

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] πŸŽ€.

This document reuses terms from [RFC3261], [RFC5486], the use cases and requirements documented in [RFC6461], and the ENUM Validation Architecture [RFC4725] πŸ”.

This document defines the following additional terms πŸ’–:

SPPF: Session Peering Provisioning Framework, which is the framework used by a substrate protocol to provision data into a Registry (see arrow labeled "1" in Figure 1 of [RFC6461]). It is the primary scope of this document 🎯.

Client: In the context of SPPF, this is an application that initiates a provisioning request. It is sometimes referred to as a "Registry client" πŸ“€.

Server: In the context of SPPF, this is an application that receives a provisioning request and responds accordingly πŸ“₯.

Registry: The Registry operates a master database of SED for one or more Registrants πŸ—ƒοΈ.

Registrant: The definition of a Registrant is based on [RFC4725]. It is the end user, person, or organization that is the "holder" of the SED being provisioned into the Registry by a Registrar. For example, in [RFC6461], a Registrant is pictured as an SP in Figure 2 πŸ‘‘. Within the confines of a Registry, a Registrant is uniquely identified by the "rant" element πŸͺͺ.

Registrar: The definition of a Registrar is based on [RFC4725]. It is an entity that performs provisioning operations on behalf of a Registrant by interacting with the Registry via SPPF operations. In other words, the Registrar is the SPPF client. The Registrar and Registrant roles are logically separate to allow, but not require, a single Registrar to perform provisioning operations on behalf of more than one Registrant πŸ¦Έβ€β™€οΈ.

Peering Organization: A peering organization is an entity to which a Registrant's SED Groups are made visible using the operations of SPPF πŸ‘―β€β™€οΈ.


3. Framework High-Level Design 🧠

This section introduces the structure of the data model and provides the information framework for the SPPF ✨. The data model is defined along with all the objects manipulated by a conforming substrate protocol and their relationships 🌈.

3.1. Framework Data Model ✨

okay so the data model in Figure 2 is basically the cast list of SPPF πŸ’… It lays out the logical objects and how they relate to each other. SPPF also defines the protocol operations an SPPF client uses to fill a Registry with those objects. Clients working for different Registrars can push their data into the Registry using a conforming substrate protocol that implements these operations

the logical structure below matches the terminology and requirements in [RFC6461] πŸŽ€

    +-------------+                        +-----------------+
    | All object  |                        |Egress Route:    |
    | types       |                   0..n | rant,           |
    +-------------+                     +--| egrRteName,     |
          |0..n                        /   | pref,           |
          |                           /    | regxRewriteRule,|
          |2                         /     | ingrSedGrp,     |
+----------------------+            /      | svcs            |
|Organization:         |           /       +-----------------+
| orgId                |          /
+----------------------+         /
       |0..n                    /
       |                       /        ("rant" = Registrant)
       |A SED Group is        /
       |associated with      /
       |zero or more        /              +---[abstract]----+
       |peering            /               | SED Record:     |
       |organizations     /                |  rant,          |
       |                 /                 |  sedName,       |0..n
       |0..n            /                  |  sedFunction,   |------|
+--------+--------------+0..n          0..n|  isInSvc,       |      |
|SED Group:             |------------------|  ttl            |      |
|  rant,                |                  +-----------------+      |
|  sedGrpName,          |                      ^ Various types      |
|  isInSvc,             |                      | of SED Records     |
|  sedRecRef,           |                      |                    |
|  peeringOrg,          |                +-----+------------+       |
|  sourceIdent,         |                |        |         |       |
|  priority,            |             +----+  +-------+  +----+     |
|  dgName               |             | URI|  | NAPTR |  | NS |     |
+-----------------------+             +----+  +-------+  +----+     |
       |0..n                                                        |
       |                                 +-----[abstract]------+    |
       |0..n                             |Public Identifier:   |    |
   +----------------------+0..n      0..n|  rant,              |    |
   | Dest Group:          |--------------|  publicIdentifier,  |    |
   |   rant,              |              |  dgName             |    |
   |   dgName             |              |                     |    |
   +----------------------+              +---------------------+    |
                                                  ^ Various types   |
              +---------+-------+------+----------+ of Public       |
              |         |       |      |          | Identifiers     |
           +------+  +-----+  +-----+ +-----+  +------+             |
           |  URI |  | TNP |  | TNR | | RN  |  |  TN  |-------------|
           +------+  +-----+  +-----+ +-----+  +------+  0..n

                   Figure 2: Framework Data Model

here's how the objects and attributes fit together (we're going bottom up, so the building blocks come first 🧱):

  • Public Identifier: Basically the well-known attribute you use as the key for resolution lookups πŸ”‘ In SPPF it can be a Telephone Number (TN), a range of TNs, a Public Switched Telephone Network (PSTN) Routing Number (RN), a TN prefix, or a URI.

An SPPF Public Identifier may be a member of zero or more Destination Groups, so you can make logical groups of Public Identifiers that share the same SED (think: routes) 🌸

A TN Public Identifier may optionally be linked to zero or more individual SED Records. This lets a Public Identifier attach directly to a SED Record instead of being forced into one or more Destination Groups, which is perfect for cases where the SED Record has data made just for that one TN πŸ’œ

  • Destination Group: A named group of zero or more Public Identifiers that can be tied to one or more SED Groups, so managing their common SED gets way easier πŸ¦‹
  • SED Group: This one's a main character πŸ‘‘ A SED Group holds a set of SED Record references, a set of Destination Group references, and a set of peering organization identifiers. Together they make a three-part relationship between a bunch of Public Identifiers, the SED they share, and the list of peering organizations whose query responses from the resolution system may include the SED in that SED Group. The sourceIdent element inside a SED Group, combined with those peering organization identifiers, is what enables fine-grained source-based routing ✨ For more on the SED Group and source-based routing, check out the definitions and descriptions in Section 6.1.
  • SED Record: The SED Record holds the data a resolution system sends back when a query for a Public Identifier succeeds πŸ’– SED Records usually hang out inside a SED Group whenever the SED in them isn't specific to one Public Identifier.

To cover the use cases in [RFC6461], SPPF defines three types of SED Records: URIType, NAPTRType, and NSType. They all extend the abstract SedRecType and inherit the shared "priority" attribute, which sets precedence across the SED Records in a SED Group in a protocol-agnostic way πŸŽ€

  • Egress Route: In a high-availability setup, the originating SSP probably has more than one egress path to the ingress SBE of the target SSP 🧚 The Egress Route lets the originating SSP pick a specific egress SBE to pair with the target ingress SBE. The "svcs" element lists ENUM services (for example, E2U+pstn:sip+sip) that identify which SED Records in the SED Group the originating SSP is going to modify.
  • Organization: An Organization is an entity that can play any mix of three roles: Registrant, Registrar, and peering organization 🌈 Every object in SPPF is tied to two organization identifiers, one for its Registrant and one for its Registrar. A SED Group also has a set of zero or more organization identifiers for the peering organizations whose resolution query responses may include the SED in its SED Records. A peering organization is basically an entity the Registrant wants to share SED data with 🫢

3.2. Time Value ⏰

some SPPF request and response messages include time values typed as xs:dateTime, which is a built-in W3C XML Schema Datatype. Unqualified local time values are a big no-no πŸ™…β€β™€οΈ because they can cause interoperability drama. A time attribute value MUST be written in Coordinated Universal Time (UTC) format, without the time-zone digits.

2010-05-30T09:30:10Z is an example of a time value that's totally fine for SPPF messages πŸ’… 2010-05-30T06:30:10+3:00 is a valid UTC time, but it is NOT acceptable for SPPF messages πŸ’€

Wait, correction, this one is not acceptable, so keep it out of your messages πŸ™ˆ


3.3. Extensibility 🧩

the framework has a bunch of extension points in the form of "ext" elements πŸ’œ Any extensions that go beyond private SPPF installations need to be documented in an RFC. The first such extension is expected to set up an IANA registry that holds a list of documented extensions 🌸


4. Substrate Protocol Requirements 🫧

this section lays out the requirements for substrate protocols that can carry SPPF πŸ’– More specifically, it spells out the services, features, and assumptions that SPPF hands off to the substrate and envelope technologies you pick.

4.1. Mandatory Substrate πŸ”’

none of the existing transport protocols that run directly over IP, the ones showing up as "Protocol" in IPv4 headers or "Next Header" in IPv6 headers, meet the requirements in this section for carrying SPPF 😭

so, one option for carrying SPPF is given in "Session Peering Provisioning (SPP) Protocol over SOAP" [RFC7878], which uses SOAP as the substrate πŸŽ€ To encourage interoperability, the SPPF server MUST provide support for this protocol. Other options may pop up over time that also comply with the requirements above πŸ¦‹

4.2. Connection Oriented πŸ”—

SPPF follows a model where a client sets up a connection to a server, and then SPPF messages get exchanged over that point-to-point connection πŸ’œ So a substrate protocol for SPPF is going to be connection oriented ✨

4.3. Request and Response Model πŸ”

provisioning operations in SPPF follow the request-response model: a client sends a request message to kick off a transaction, and the server sends back a response πŸ’… Multiple request-response exchanges MAY be done over a single persistent connection.

So a substrate protocol for SPPF will follow the request-response model by making sure a response is sent back to whoever started the request 🫢

4.4. Connection Lifetime ⏳

some use cases only need to provision a single request to a network element 🧚 Connections for those might be short-lived, and only get set up when needed, lasting maybe a few seconds. Other use cases provision either a huge dataset or a constant stream of small updates, and those would probably need long-lived connections that last for hours or even days 🌈

So a protocol suitable for SPPF SHOULD be able to support both short-lived and long-lived connections πŸ‘‘

4.5. Authentication πŸ”

every SPPF object is linked to a Registrant identifier. An SPPF client provisions SPPF objects on behalf of Registrants πŸ’– An authenticated SPP client counts as a Registrar. So the SPPF substrate protocol MUST provide a way for an SPPF server to authenticate an SPPF client πŸŽ€

4.6. Authorization πŸͺͺ

once the SPPF client is authenticated as a Registrar, the Registry runs authorization checks to see whether that Registrar is allowed to act on behalf of the Registrant whose identifier is in the SPPF request 🌸 Check out Section 9 for more guidance on this πŸ’…

4.7. Confidentiality and Integrity πŸ›‘οΈ

SPPF objects that the Registry manages can be private in nature πŸ™ˆ So the substrate protocol MUST provide a way to protect data integrity.

if the data gets messed with in flight between the SPPF client and the Registry, it can seriously hurt the stability and integrity of the whole system 😱 So the substrate protocol MUST provide a way to protect data integrity. No cap, this one is non-negotiable πŸ”₯

4.8. Near Real Time ⚑

okay so, a LOT of use cases need the server to answer super fast, like within a few multiples of the round-trip time between the server and the client πŸƒβ€β™€οΈπŸ’¨ that's the vibe. So a Data for Reachability of Inter-/Intra-NetworK SIP (DRINKS) substrate protocol MUST support near real-time responses to requests the client sends. no skipping this one πŸ’…

4.9. Request and Response Sizes πŸ“¦

using SPPF can involve tiny updates, like changing one single Public Identifier (a few bytes, very chill 🧁). But other provisioning stuff can be HUGE, like adding millions of records to a Registry 😳 so a suitable substrate protocol for SPPF SHOULD accommodate datasets of all different sizes. main character energy for protocols 🌈

4.10. Request and Response Correlation πŸ”—

A substrate protocol suitable for SPPF MUST allow responses to be correlated with requests. bestie, this is non-negotiable: every response has to be matchable to the request it belongs to 🫢

4.11. Request Acknowledgement 🧾

the data moving through SPPF is probably crucial for keeping the communication network running, so it's serious business πŸ₯Ί an SPPF client that's provisioning SED to the Registry needs to know whether its submitted requests were processed correctly. ngl that's a big deal 😭

failed transactions can end up with a subset of Public Identifiers, or even SSPs, being unreachable, or the provisioning state of the network being inconsistent. yikes πŸ’€

so, a substrate protocol for SPPF MUST provide a response for each request, so that a client can identify whether a request succeeded or failed. βœ…βŒ

5. Base Framework Data Structures and Response Codes 🧱

SPPF has some common data structures that most of the supported object types share. this section walks through them πŸŽ€

5.1. Basic Object Type and Organization Identifiers πŸͺͺ

all first-class objects extend the type BasicObjType. it's made up of the Registrant organization, the Registrar organization, the date and time of object creation, and the last date and time the object was modified. The Registry MUST store the date and time of the object creation and modification, if applicable, for all Get operations (see Section 7). If the client passed in either date or time values, the Registry MUST ignore it. The Registrar performs the SPPF operations on behalf of the Registrant, the organization that owns the object πŸ‘‘

   <complexType name="BasicObjType" abstract="true">
    <sequence>
     <element name="rant" type="sppfb:OrgIdType"/>
     <element name="rar" type="sppfb:OrgIdType"/>
     <element name="cDate" type="dateTime" minOccurs="0"/>
     <element name="mDate" type="dateTime" minOccurs="0"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </complexType>

the identifiers used for Registrants (rant) and Registrars (rar) are instances of OrgIdType. The OrgIdType is defined as a string and all OrgIdType instances MUST follow the textual convention: "namespace:value" (for example, "iana-en:32473"). Specifically:

Strings used as OrgIdType Namespace identifiers MUST conform to the following syntax in the Augmented Backus-Naur Form (ABNF) [RFC5234].

      namespace = ALPHA *(ALPHA/DIGIT/"-")

see Section 11 for the corresponding IANA registry definition πŸ—‚οΈ

5.2. Various Object Key Types πŸ”‘

the SPPF data model has various object relationships. in some cases, these are set up by embedding the unique identity of the related object inside the relating object. Note that an object's unique identity is required to Delete or Get the details of an object. The following subsections normatively define the various object keys in SPPF and the attributes of those keys.

"Name" attributes that are used as components of object key types MUST be compared using the toCasefold() function, as specified in Section 3.13 of [Unicode6.1] (or a newer version of Unicode). This function performs case-insensitive comparisons πŸ™ˆ

5.2.1. Generic Object Key Type

most objects in SPPF are uniquely identified by an object key that has the object's name, type, and Registrant's organization ID as attributes. the abstract type called ObjKeyType is where this unique identity lives. Any concrete representation of the ObjKeyType MUST contain the following:

  • Object Name: The name of the object.
  • Registrant ID: The unique organization ID that identifies the Registrant.
  • Type: The value that represents the type of SPPF object. This is required as different types of objects in SPPF, that belong to the same Registrant, can have the same name.

The structure of abstract ObjKeyType is as follows:

   <complexType name="ObjKeyType" abstract="true">
    <annotation>
     <documentation>
     ---- Generic type that represents the
          key for various objects in SPPF. ----
     </documentation>
    </annotation>
   </complexType>

5.2.2. Derived Object Key Types

the SPPF data model contains certain objects that are uniquely identified by attributes that are different from, or in addition to, the attributes in the generic object key described in the previous section. ✨ Object keys of this kind are derived from the abstract ObjKeyType and defined in their own abstract key types. Because these object key types are abstract, they MUST be specified in a concrete form in any SPPF-conforming substrate "protocol" specification. These are used in Delete and Get operations and may also be used in Accept and Reject operations.

Following are the derived object keys in an SPPF data model:

  • SedGrpOfferKeyType: This uniquely identifies a SED Group object offer. This key type extends from ObjKeyType and MUST also have the organization ID of the Registrant to whom the object is being offered as one of its attributes. In addition to the Delete and Get operations, these key types are used in Accept and Reject operations on a SED Group Offer object. The structure of abstract SedGrpOfferKeyType is as follows:
   <complexType name="SedGrpOfferKeyType"
   abstract="true">
       <complexContent>
           <extension base="sppfb:ObjKeyType">
               <annotation>
       <documentation>
       ---- Generic type that represents
            the key for an object offer. ----
       </documentation>
      </annotation>
     </extension>
    </complexContent>
   </complexType>

A SED Group Offer object MUST use SedGrpOfferKeyType. Refer to Section 6.5 for a description of the SED Group Offer object.

  • PubIdKeyType: This uniquely identifies a Public Identity object. This key type extends from the abstract ObjKeyType. Any concrete definition of PubIdKeyType MUST contain the elements that identify the value and type of Public Identity and also contain the organization ID of the Registrant that is the owner of the Public Identity object. A Public Identity object in SPPF is uniquely identified by the Registrant's organization ID, the value of the Public Identity, and the type of the Public Identity object. Consequently, any concrete representation of the PubIdKeyType MUST contain the following attributes:
    • Registrant ID: The unique organization ID that identifies the Registrant.
    • Value: The value of the Public Identity.
    • Type: The type of the Public Identity object.

The PubIdKeyType is used in Delete and Get operations on a Public Identifier object.

  • The structure of abstract PubIdKeyType is as follows:
   <complexType name="PubIdKeyType" abstract="true">
    <complexContent>
     <extension base="sppfb:ObjKeyType">
      <annotation>
       <documentation>
       ---- Generic type that represents the key for a Pub ID. ----
       </documentation>
      </annotation>
     </extension>
    </complexContent>
   </complexType>

A Public Identity object MUST use attributes of PubIdKeyType for its unique identification. Refer to Section 6 for a description of a Public Identity object πŸ¦‹

5.3. Response Message Types ✨

okay so this is the menu of replies a server can send back πŸ’… the table below lists the response types that MUST be defined for any substrate protocol carrying SPPF. an SPPF server MUST implement every single one of these, no skipping 🫢

+---------------------+---------------------------------------------+
| Response Type       | Description                                 |
+---------------------+---------------------------------------------+
| Request succeeded   | A given request succeeded.                  |
| Request syntax      | The syntax of a given request was found to  |
| invalid             | be invalid.                                 |
| Request too large   | The count of entities in the request is     |
|                     | larger than the server is willing or able   |
|                     | to process.                                 |
| Version not         | The server does not support the version of  |
| supported           | the SPPF protocol specified in the request. |
| Command invalid     | The operation and/or command being          |
|                     | requested by the client is invalid and/or   |
|                     | not supported by the server.                |
| System temporarily  | The SPPF server is temporarily not          |
| unavailable         | available to serve the client request.      |
| Unexpected internal | The SPPF server encountered an unexpected   |
| system or server    | error that prevented the server from        |
| error               | fulfilling the request.                     |
| Attribute value     | The SPPF server encountered an attribute or |
| invalid             | property in the request that had an         |
|                     | invalid/bad value.  Optionally, the         |
|                     | specification MAY provide a way to indicate |
|                     | the Attribute Name and the Attribute Value  |
|                     | to identify the object that was found to be |
|                     | invalid.                                    |
| Object does not     | An object present in the request does not   |
| exist               | exist on the SPPF server. Optionally, the   |
|                     | specification MAY provide a way to indicate |
|                     | the Attribute Name and the Attribute Value  |
|                     | that identifies the nonexistent object.     |
| Object status or    | The operation requested on an object        |
| ownership does not  | present in the request cannot be performed  |
| allow for operation | because the object is in a status that does |
|                     | not allow said operation, or the user       |
|                     | requesting the operation is not authorized  |
|                     | to perform said operation on the object.    |
|                     | Optionally, the specification MAY provide a |
|                     | way to indicate the Attribute Name and the  |
|                     | Attribute Value that identifies the object. |
+---------------------+---------------------------------------------+

Table 1: Response Types

okay now the fun part πŸŽ€ when the responses are "parameterized" with an Attribute Name and Attribute Value, the use of those parameters MUST follow these rules:

  • ✨ Any value given for the Attribute Name parameter MUST be an exact XSD element name of the protocol data element the response is talking about. for example, valid values for "attribute name" are "dgName", "sedGrpName", "sedRec", etc.
  • 🌸 The value for Attribute Value MUST be the value of the data element that the preceding Attribute Name refers to.
  • πŸ’œ The response type "Attribute value invalid" MUST be used whenever an element value does not adhere to data validation rules.
  • πŸ¦‹ The response types "Attribute value invalid" and "Object does not exist" MUST NOT be used interchangeably πŸ™ˆ the "Object does not exist" type MUST be returned by an Update/Del/Accept/Reject operation when the data element(s) used to uniquely identify a preexisting object does not exist. if the data elements used to uniquely identify an object are malformed, then the response type "Attribute value invalid" MUST be returned instead.

6. Framework Data Model Objects 🧚

this section describes each supported data model object (the nouns) and names the commands (the verbs) that MUST be supported for each one 🌈 the actual data structures needed for each command are left to an SPPF-conforming substrate "protocol" specification, so this part isn't the whole story.

6.1. Destination Group πŸ“

a Destination Group is a logical grouping of Public Identifiers that share a common SED ✨ the substrate protocol MUST support the ability to Add, Get, and Delete Destination Groups (see Section 7 for a generic description of the various operations).

a Destination Group object MUST be uniquely identified by the attributes defined in the description of "ObjKeyType" in "Generic Object Key Type" (Section 5.2.1 of this document).

here's the DestGrpType object structure πŸ‘‘

<complexType name="DestGrpType">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="dgName" type="sppfb:ObjNameType"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

the DestGrpType object is made up of these elements:

  • base: all first-class objects extend BasicObjType (see Section 5.1). πŸ’–
  • dgName: the character string that holds the name of the Destination Group. 🫧
  • ext: the point of extensibility described in Section 3.3. πŸ”₯

6.2. Public Identifier πŸŽ€

Okay so a Public Identifier is basically the search key used to find the SED πŸ” Most of the time it's attached to the end user who has a retail relationship with the SP or Registrant organization πŸ’… SPPF is into the carrier-of-record idea from [RFC5067] 🫢 so the Registrant a Public Identifier is being created under can optionally claim to be a carrier-of-record ✨

SPPF knows about three types of Public Identifiers: TNs, RNs, and URIs 🌈 It gives you structures to manage a single TN, a contiguous range of TNs, and a TN prefix 🧚 The substrate protocol MUST support the ability to Add, Get, and Delete Public Identifiers (refer to Section 7 for a generic description of various operations) πŸ’–

A Public Identity object MUST be uniquely identified by attributes as defined in the description of "PubIdKeyType" in Section 5.2.2 πŸ”‘

The abstract XSD type PubIdType is a generalization for the concrete Public Identifier schema types πŸ“ The PubIdType element "dgName" represents the name of a Destination Group of which a given Public Identifier may be a member πŸ‘‘ Note that this element may be present multiple times, so a given Public Identifier may be a member of multiple Destination Groups πŸ¦‹ The PubIdType object structure is defined like this:

<complexType name="PubIdType" abstract="true">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="dgName" type="sppfb:ObjNameType"
             minOccurs="0" maxOccurs="unbounded"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

A Public Identifier may be a member of zero or more Destination Groups 🌸 When it's a member of a Destination Group, it's meant to be associated with SED through the SED Group(s) that is associated with that Destination Group 🫧 When a Public Identifier isn't a member of any Destination Group, it's meant to be associated with SED through the SED Records that are directly associated with the Public Identifier πŸ™ˆ

A TN is provisioned using the TNType, an extension of PubIdType πŸ“ž Each TNType object is uniquely identified by the combination of its value contained within the <tn> element and its Registrant ID ✨ TNType is defined as follows:

<complexType name="TNType">
 <complexContent>
  <extension base="sppfb:PubIdType">
   <sequence>
    <element name="tn" type="sppfb:NumberValType"/>
    <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
    <element name="sedRecRef" type="sppfb:SedRecRefType"
             minOccurs="0" maxOccurs="unbounded"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="CORInfoType">
 <sequence>
   <element name="corClaim" type="boolean" default="true"/>
   <element name="cor" type="boolean" default="false" minOccurs="0"/>
   <element name="corDate" type="dateTime" minOccurs="0"/>
 </sequence>
</complexType>

<simpleType name="NumberValType">
 <restriction base="token">
  <maxLength value="20"/>
  <pattern value="\+?\d\d*"/>
 </restriction>
</simpleType>

TNType has these attributes:

  • tn: Telephone number to be added to the Registry. πŸ“±
  • sedRecRef: Optional reference to SED Records that are directly associated with the TN Public Identifier. Following the SPPF data model, the SED Record could be a protocol-agnostic URIType or another type. πŸ”—
  • corInfo: corInfo is an optional parameter of type CORInfoType that lets the Registrant organization set forth a claim to be the carrier-of-record (see [RFC5067]). This is done by setting the value of the <corClaim> element of the CORInfoType object structure to "true". The other two parameters of the CORInfoType, <cor> and <corDate>, are set by the Registry to describe the outcome of the carrier-of-record claim by the Registrant. Generally, including the <corInfo> parameter is useful if the Registry has the authority information, such as the number portability data, so it can figure out whether the Registrant claim can be satisfied 🧠 If the carrier-of-record claim disagrees with the authority data in the Registry, whether or not a TN Add operation fails is a matter of policy and is beyond the scope of this document πŸ€·β€β™€οΈ

An RN is provisioned using the RNType, an extension of PubIDType πŸͺ„ The Registrant organization can add the RN and associate it with the appropriate Destination Group(s) to share the route information πŸ›£οΈ This lets SSPs use the RN search key to derive the Ingress Routes for session establishment at the runtime resolution process (see [RFC6116]) πŸš€ Each RNType object is uniquely identified by the combination of its value inside the <rn> element and its Registrant ID πŸͺͺ RNType is defined as follows:

<complexType name="RNType">
 <complexContent>
  <extension base="sppfb:PubIdType">
   <sequence>
    <element name="rn" type="sppfb:NumberValType"/>
    <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

RNType has the following attributes:

  • rn: The RN used as the search key. πŸ”Ž
  • corInfo: corInfo is an optional parameter of type CORInfoType that lets the Registrant organization set forth a claim to be the carrier-of-record (see [RFC5067]).

TNRType is used to provision a contiguous range of TNs 🌈 The object definition requires a starting TN and an ending TN that together define the span of the TN range, including the starting and ending TN πŸ“ TNRType is especially handy when you want a TN range that doesn't include all the TNs within a TN block or prefix 🧩 It also accommodates the open number plan, so the TNs that fall between the start and end TN can have different length variance 🌍 Whether the Registry can handle open number plan semantics is a matter of policy and is beyond the scope of this document πŸ™ƒ Each TNRType object is uniquely identified by the combination of its value, which is in turn a combination of the <startTn> and <endTn> elements, and its Registrant ID πŸ†” The TNRType object structure is defined as follows:

<complexType name="TNRType">
 <complexContent>
  <extension base="sppfb:PubIdType">
   <sequence>
    <element name="range" type="sppfb:NumberRangeType"/>
    <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="NumberRangeType">
 <sequence>
  <element name="startTn" type="sppfb:NumberValType"/>
  <element name="endTn" type="sppfb:NumberValType"/>
 </sequence>
</complexType>

TNRType has these attributes:

  • startTn: The starting TN in the TN range.
  • endTn: The last TN in the TN range.
  • corInfo: corInfo is an optional parameter of type CORInfoType that lets the Registrant organization set forth a claim to be the carrier-of-record (see [RFC5067]).

Sometimes it's useful to describe a bunch of TNs using just the first few digits of the TN, which is called the TN prefix or a block 🧁 A given TN prefix may include TNs with different length variance to support the open number plan 🌷 Again, whether the Registry supports open number plan semantics is a matter of policy, and it's beyond the scope of this document πŸ’­ The TNPType data structure is used to provision a TN prefix 🎁 Each TNPType object is uniquely identified by the combination of its value in the <tnPrefix> element and its Registrant ID πŸͺž TNPType is defined as follows:

<complexType name="TNPType">
 <complexContent>
  <extension base="sppfb:PubIdType">
   <sequence>
    <element name="tnPrefix" type="sppfb:NumberValType"/>
    <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

TNPType consists of these attributes:

  • tnPrefix: The TN prefix.
  • corInfo: corInfo is an optional parameter of type CORInfoType that lets the Registrant organization set forth a claim to be the carrier-of-record (see [RFC5067]).

Sometimes a Public Identifier is a URI, like an email address πŸ“§ The URIPubIdType object holds the data element needed for these Public Identifiers πŸ’Œ Each URIPubIdType object is uniquely identified by the combination of its value in the <uri> element and its Registrant ID πŸͺͺ URIPubIdType is defined as follows:

<complexType name="URIPubIdType">
 <complexContent>
  <extension base="sppfb:PubIdType">
   <sequence>
    <element name="uri" type="anyURI"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

URIPubIdType has these attributes:

  • uri: The value that acts as the Public Identifier. πŸ”—
  • ext: Point of extensibility described in Section 3.3. 🧩

6.3. SED Group ✨

okay so a SED Group is basically a bestie bundle πŸŽ€ of one or more Destination Groups, the common SED Records, and the list of peer orgs allowed to access those SED Records for that group. and the indirect linking is the lowkey genius part! Public Identifiers point to their SED through the group, which makes the peering data way more scalable and manageable 🧠✨

instead of millions of updates to every single Public Identifier record (each one holding its own peering data 😭), changing SED info is ONE operation on a SED Group or SED Record. no cap, iconic πŸ’…

The substrate protocol MUST support the ability to Add, Get, and Delete SED Groups (check Section 7 for the generic run-down of the various operations) πŸ¦‹

A SED Group object MUST be uniquely identified by the attributes defined for ObjKeyType in "Generic Object Key Type" (Section 5.2.1 of this document) πŸ”‘

The SedGrpType object structure looks like this:

<complexType name="SedGrpType">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="sedGrpName" type="sppfb:ObjNameType"/>
    <element name="sedRecRef" type="sppfb:SedRecRefType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="dgName" type="sppfb:ObjNameType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="peeringOrg" type="sppfb:OrgIdType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="sourceIdent" type="sppfb:SourceIdentType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="isInSvc" type="boolean"/>
    <element name="priority" type="unsignedShort"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="SedRecRefType">
 <sequence>
  <element name="sedKey" type="sppfb:ObjKeyType"/>
  <element name="priority" type="unsignedShort"/>
  <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
 </sequence>
</complexType>

The SedGrpType object is made up of these elements:

  • base: All first-class objects extend BasicObjType (see Section 5.1). 🌸
  • sedGrpName: The character string holding the name of the SED Group. It uniquely identifies this object within the context of the Registrant ID (a child element of the base element, as described above). 🏷️
  • sedRecRef: A set of zero or more objects of type SedRecRefType. These house the unique keys of the SED Records (containing the SED) that the SedGrpType object refers to, plus their relative priority within the context of this SED Group. πŸ”—
  • dgName: A set of zero or more names of DestGrpType object instances. Each dgName, together with this SED Group's Registrant ID, uniquely identifies a DestGrpType object instance whose associated Public Identifiers are reachable using the SED housed in this SED Group. An intended side effect of this is that a SED Group cannot provide session establishment information for a Destination Group belonging to another Registrant. 🚫
  • peeringOrg: A set of zero or more peering organization IDs that have accepted an offer to receive this SED Group's information. Note that this identifier, peeringOrg, is an instance of OrgIdType. The set of peering organizations in this list is not directly settable or modifiable using the addSedGrpsRqst operation. Instead, this set is controlled using the SED Offer and Accept operations. 🀝
  • sourceIdent: A set of zero or more SourceIdentType object instances. These objects, described further below, house the source identification schemes and identifiers that are applied at resolution time as part of source-based routing algorithms for the SED Group. 🧭
  • isInSvc: A boolean element that defines whether this SED Group is in service. The SED contained in a SED Group that is in service is a candidate for inclusion in resolution responses for Public Identities residing in the Destination Group associated with this SED Group. The session establishment information contained in a SED Group that is not in service is not a candidate for inclusion in resolution responses. 🟒
  • priority: A priority value that can be used to give one SED Group a relative weighting over another. The manner in which this value is used, perhaps in conjunction with other factors, is a matter of policy. βš–οΈ
  • ext: Point of extensibility described in Section 3.3. 🧩

As described above, the SED Group contains a set of references to SED Record objects. A SED Record object is based on an abstract type, SedRecType. The concrete types that use SedRecType as an extension base are NAPTRType, NSType, and URIType. The definitions of these types are included in "SED Record" (Section 6.4 of this document) πŸ“¦

The SedGrpType object supports source-based routing in two ways: through the peeringOrg data element, and more granularly through the source identity element. The source identity element lets you specify zero or more of the following for a given SED Group: a regular expression that is matched against the resolution client IP address, a regular expression that is matched against the root domain name(s), and/or a regular expression that is matched against the calling party URI(s). 🎯

Here's how the routing plays out. First, the server identifies the visible SED Groups whose associated Destination Group(s) contain the lookup key being queried and whose peeringOrg list contains the querying organization's organization ID. Then the resolution server evaluates the characteristics of the Source URI, Source IP address, and root domain of the lookup key being queried, and compares these against the source identity criteria associated with those SED Groups. The SED contained in SED Groups that have source-based routing criteria will only be included in the resolution response if one or more of the criteria matches the source criteria from the resolution request. πŸ•΅οΈβ€β™€οΈπŸ’–

The source identity data element is of type SourceIdentType, whose structure is defined as follows:

<complexType name="SourceIdentType">
 <sequence>
  <element name="sourceIdentRegex" type="sppfb:RegexType"/>
  <element name="sourceIdentScheme"
           type="sppfb:SourceIdentSchemeType"/>
  <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
 </sequence>
</complexType>

<simpleType name="SourceIdentSchemeType">
 <restriction base="token">
  <enumeration value="uri"/>
  <enumeration value="ip"/>
  <enumeration value="rootDomain"/>
 </restriction>
</simpleType>

The SourceIdentType object is made up of these data elements:

  • sourceIdentScheme: The source identification scheme that this source identification criteria applies to, and that the associated sourceIdentRegex should be matched against. πŸͺͺ
  • sourceIdentRegex: The regular expression that should be used to test for a match against the portion of the resolution request dictated by the associated sourceIdentScheme. πŸ”
  • ext: Point of extensibility described in Section 3.3. 🧩

6.4. SED Record ✨

okay so a SED Group is basically a combo of SED Records that together define the SED 🧚 but here's the bestie part: SED Records don't have to be made for just one SED Group. one record can serve multiple groups πŸ’… so if you change a network node that shows up in a bunch of routes, you only need ONE update operation to change its properties, and that change shows up in every SED Group whose SED Record set points to that node πŸ¦‹ the substrate protocol MUST support the ability to Add, Get, and Delete SED Records (check Section 7 for the generic rundown of the operations) πŸ’–

a SED Record object MUST be uniquely identified by the attributes described in "ObjKeyType" under "Generic Object Key Type" (Section 5.2.1 of this document) πŸŽ€

here's the SedRecType object structure:

<complexType name="SedRecType" abstract="true">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="sedName" type="sppfb:ObjNameType"/>
    <element name="sedFunction" type="sppfb:SedFunctionType"
             minOccurs="0"/>
    <element name="isInSvc" type="boolean"/>
    <element name="ttl" type="positiveInteger" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<simpleType name="SedFunctionType">
 <restriction base="token">
  <enumeration value="routing"/>
  <enumeration value="lookup"/>
 </restriction>
</simpleType>

the SedRecType object is made up of these elements:

  • base: every first-class object extends BasicObjType (see Section 5.1) 🌸
  • sedName: the character string holding the name of the SED Record 🏷️ it uniquely identifies this object within the context of the Registrant ID (which is a child element of the base element, as we just covered) πŸ’œ
  • sedFunction: as described in [RFC6461], SED mostly falls into one of two buckets: LUF and LRF πŸ“ to clear up any confusion about what function a SED Record is meant to do, this optional element lets the provisioning party spell out its intentions 🫢
  • isInSvc: a boolean that says whether or not this SED Record is in service πŸ”₯ the session establishment info in an in-service SED Record is a candidate for resolution responses for TNs directly associated with this SED Record, or for Public Identities sitting in a Destination Group that's associated with a SED Group, which then has an association to this SED Record πŸ‘‘
  • ttl: the number of seconds an addressing server may cache a particular SED Record for ⏳
SED Records are based on the abstract type SedRecType. the concrete types that use SedRecType as an extension base are NAPTRType, NSType, and URIType. their definitions are included below.

okay the NAPTRType object holds all the data elements needed for a Naming Authority Pointer (NAPTR) (see [RFC3403]) that contains routing info for a SED Group πŸ¦‹ the NSType object holds the data elements needed for a DNS name server that points to another DNS server containing the routing info you want 🌈 the NSType is only relevant when the resolution protocol is ENUM (see [RFC6116]) πŸ’… and the URIType object holds the data elements needed to house a URI πŸŽ€

here's the thing that makes this so iconic: the data provisioned in a Registry can be used for lots of purposes and queried with different protocols, including SIP, ENUM, and more 🧚 so the resolution data in SED Records has to be in a form that can actually be transported using one of those protocols 🫢 for NAPTRType, if the URI is tied to a Destination Group, the user part of the replacement string <uri> that may need the Public Identifier can't be preset 😭 as a SIP Redirect, the resolution server applies the <ere> pattern to the input Public Identifier in the query, then processes the replacement string by substituting any back references in <uri> to get the final URI that goes in the SIP Contact header 🌸 for an ENUM query, the resolution server just returns the values of the <ere> and <uri> members of the URI πŸ’–

<complexType name="NAPTRType">
 <complexContent>
  <extension base="sppfb:SedRecType">
   <sequence>
    <element name="order" type="unsignedShort"/>
    <element name="flags" type="sppfb:FlagsType" minOccurs="0"/>
    <element name="svcs" type="sppfb:SvcType"/>
    <element name="regx" type="sppfb:RegexParamType" minOccurs="0"/>
    <element name="repl" type="sppfb:ReplType" minOccurs="0"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="NSType">
 <complexContent>
  <extension base="sppfb:SedRecType">
   <sequence>
    <element name="hostName" type="token"/>
    <element name="ipAddr" type="sppfb:IPAddrType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="IPAddrType">
 <sequence>
  <element name="addr" type="sppfb:AddrStringType"/>
  <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
 </sequence>
 <attribute name="type" type="sppfb:IPType" default="IPv4"/>
</complexType>

<simpleType name="IPType">
 <restriction base="token">
  <enumeration value="IPv4"/>
  <enumeration value="IPv6"/>
 </restriction>
</simpleType>

<complexType name="URIType">
 <complexContent>
  <extension base="sppfb:SedRecType">
   <sequence>
    <element name="ere" type="token" default="^(.*)$"/>
    <element name="uri" type="anyURI"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<simpleType name="flagsType">
 <restriction base="token">
  <length value="1"/>
  <pattern value="[A-Z]|[a-z]|[0-9]"/>
 </restriction>
</simpleType>

the NAPTRType object is made up of these elements:

  • order: the order value in an ENUM NAPTR, relative to other NAPTRType objects in the same SED Group 🌟
  • svcs: the ENUM service(s) served by the SBE πŸ›ŽοΈ this field's value must be of the form specified in [RFC6116] (for example, E2U+pstn:sip+sip) πŸ’« which values are allowed is a matter of policy and isn't limited by this protocol πŸ€·β€β™€οΈ
  • regx: the NAPTR's regular expression field 🧩 if this isn't included, then the repl field must be included
  • repl: the NAPTR replacement field πŸ” it should only be provided if the regx field isn't provided; otherwise, the server will ignore it πŸ™ˆ
  • ext: the point of extensibility described in Section 3.3 🌈

the NSType object is made up of these elements:

  • hostName: the root-relative host name of the name server 🏠
  • ipAddr: zero or more objects of type IpAddrType πŸ’œ each one holds an IP Address and the IP Address type ("IPv4" or "IPv6") πŸ¦‹
  • ext: the point of extensibility described in Section 3.3 ✨

the URIType object is made up of these elements:

  • ere: the POSIX Extended Regular Expression (ere) as defined in [RFC3986] 🌸
  • uri: the URI as defined in [RFC3986] πŸŽ€ in some cases this serves as the replacement string, and it's up to the resolution server to arrive at the final usable URI 🧚

6.5. SED Group Offer ✨

okay this one is all about who gets access πŸ‘‘ the list of peer organizations whose resolution responses can include the SED in a given SED Group is controlled by the organization that the SED Group object belongs to (its Registrant) AND the peer organization that submits resolution requests (a data recipient, also called a peering organization) 🫢 the Registrant offers access to a SED Group by submitting a SED Group Offer πŸ’Œ then the data recipient can accept or reject that offer πŸ“

here's the key tea: not until access to a SED Group has been offered AND accepted will the data recipient's organization ID show up in the peeringOrg list in a SED Group object 😭 and only then does that SED Group's peering info become a candidate for the responses to resolution requests that data recipient submits πŸ¦‹ the substrate protocol MUST support the ability to Add, Get, Delete, Accept, and Reject SED Group Offers (check Section 7 for the generic description of the operations) πŸ’–

a SED Group Offer object MUST be uniquely identified by the attributes described in "SedGrpOfferKeyType" under "Derived Object Key Types" (Section 5.2.2 of this document) πŸŽ€

here's the SedGrpOfferType object structure:

<complexType name="SedGrpOfferType">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="sedGrpOfferKey" type="sppfb:SedGrpOfferKeyType"/>
    <element name="status" type="sppfb:SedGrpOfferStatusType"/>
    <element name="offerDateTime" type="dateTime"/>
    <element name="acceptDateTime" type="dateTime" minOccurs="0"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

<complexType name="SedGrpOfferKeyType" abstract="true">
 <annotation>
  <documentation>
  -- Generic type that represents the key for a SED Group Offer. Must
     be defined in concrete form in a substrate "protocol"
     specification. --
  </documentation>
 </annotation>
</complexType>

<simpleType name="SedGrpOfferStatusType">
 <restriction base="token">
  <enumeration value="offered"/>
  <enumeration value="accepted"/>
 </restriction>
</simpleType>

the SedGrpOfferType object is made up of these elements:

  • base: every first-class object extends BasicObjType (see Section 5.1) 🌈
  • sedGrpOfferKey: the object that identifies the SED that is or has been offered, and the organization it is or has been offered to 🧚
  • status: the status of the offer, either offered or accepted πŸ‘‘ the server controls this one πŸ€– it's automatically set to "offered" whenever a new SED Group Offer is added, and automatically set to "accepted" if and when that offer gets accepted ✨ whatever value the client passes in gets ignored πŸ™ˆ
  • offerDateTime: the date and time in UTC when the SED Group Offer was added ⏰
  • acceptDateTime: the date and time in UTC when the SED Group Offer was accepted πŸŽ‰

6.6. Egress Route πŸ›£οΈ

Okay so, in a high-availability setup, the originating SSP is likely to have more than one egress path to the ingress SBE of the target SSP πŸ’–. If the originating SSP wants to be in charge and pick a specific egress SBE to pair with the target ingress SBE, it can totally do that using the EgrRteType object πŸ’….

An Egress Route object MUST be uniquely identified by attributes as defined in the description of "ObjKeyType" in "Generic Object Key Type" (Section 5.2.1 of this document) πŸ”‘.

Say the target SSP offered (as part of its SED) to share one or more Ingress Routes, and the originating SSP accepted that offer 🀝. To add the Egress Route to the Registry, the originating SSP uses a valid regular expression to rewrite the Ingress Route so it includes the egress SBE info ✍️. Also, more than one Egress Route can be linked to a single Ingress Route for fault-tolerant configurations πŸ›‘οΈ. The supporting SPPF structure gives a way to include route precedence info, which helps manage traffic going out to more than one outbound egress SBE 🧚.

The substrate protocol MUST support the ability to Add, Get, and Delete Egress Routes (refer to Section 7 for a generic description of various operations) 🫢. The EgrRteType object structure looks like this:

<complexType name="EgrRteType">
 <complexContent>
  <extension base="sppfb:BasicObjType">
   <sequence>
    <element name="egrRteName" type="sppfb:ObjNameType"/>
    <element name="pref" type="unsignedShort"/>
    <element name="regxRewriteRule" type="sppfb:RegexParamType"/>
    <element name="ingrSedGrp" type="sppfb:ObjKeyType"
             minOccurs="0" maxOccurs="unbounded"/>
    <element name="svcs" type="sppfb:SvcType" minOccurs="0"/>
    <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
   </sequence>
  </extension>
 </complexContent>
</complexType>

The EgrRteType object is made up of these elements πŸ‘‘:

  • base: All first-class objects extend BasicObjType (see Section 5.1).
  • egrRteName: The name of the Egress Route.
  • pref: The preference of this Egress Route relative to other Egress Routes that may get selected when responding to a resolution request.
  • regxRewriteRule: The regular expression rewrite rule that should be applied to the regular expression of the ingress NAPTR(s) that belongs to the Ingress Route.
  • ingrSedGrp: The ingress SED Group that the Egress Route should be used for.
  • svcs: ENUM service(s) that is served by an Egress Route. This element is used to identify the ingress NAPTRs associated with the SED Group to which an Egress Route's regxRewriteRule should be applied. If no ENUM service(s) is associated with an Egress Route, then the Egress Route's regxRewriteRule should be applied to all the NAPTRs associated with the SED Group. This field's value must be of the form specified in [RFC6116] (e.g., E2U+pstn:sip+sip). The allowable values are a matter of policy and are not limited by this protocol πŸ“ž.
  • ext: Point of extensibility described in Section 3.3.

7. Framework Operations πŸŽ€

Besides the operation-specific object types, all operations MAY specify the minor version of the protocol. That, together with the major version (which can be, for instance, specified in the protocol Namespace), identifies the version of the SPPF protocol the client is using πŸ”’. If the minor version is not specified, the latest minor version supported by the SPPF server for the given major version will be used. Also, operations that may potentially modify persistent protocol objects SHOULD include a transaction ID as well 🧾.

7.1. Add Operation βž•

Any conforming substrate "protocol" specification MUST provide a definition for the operation that adds one or more SPPF objects into the Registry. If the object, as identified by the request attributes that form part of the object's key, does not exist, then the Registry MUST create the object. If the object does exist, then the Registry MUST replace the current properties of the object with the properties passed in as part of the Add operation πŸ”„.

Note that this effectively allows modification of a preexisting object ✏️.

If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from amongst the response messages defined in "Response Message Types" (Section 5.3 of this document) 🚫.

7.2. Delete Operation πŸ—‘οΈ

Any conforming substrate "protocol" specification MUST provide a definition for the operation that deletes one or more SPPF objects from the Registry using the object's key πŸ’€.

If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from amongst the response messages defined in "Response Message Types" (Section 5.3 of this document) πŸ™….

When an object is deleted, any references to that object must of course also be removed as the SPPF server implementation fulfills the deletion request. Furthermore, deleting a composite object must also result in the deletion of the objects it contains. So these rules apply to deleting SPPF object types 🧹:

  • Destination Groups: When a Destination Group is deleted, any cross-references between that destination group and any SED Group must be automatically removed by the SPPF implementation as part of fulfilling the deletion request. Similarly, any cross-references between that Destination Group and any Public Identifier must be removed by the SPPF implementation.
  • SED Groups: When a SED Group is deleted, any references between that SED Group and any Destination Group must be automatically removed by the SPPF implementation as part of fulfilling the deletion request. Similarly, any cross-references between that SED Group and any SED Records must be removed by the SPPF implementation as part of fulfilling the deletion request. Furthermore, SED Group Offers relating to that SED Group must also be deleted.
  • SED Records: When a SED Record is deleted, any cross-references between that SED Record and any SED Group must be removed by the SPPF implementation as part of fulfilling the deletion request. Similarly, any reference between that SED Record and any Public Identifier must be removed by the SPPF implementation.
  • Public Identifiers: When a Public Identifier is deleted, any cross-references between that Public Identifier and any referenced Destination Group must be removed by the SPPF implementation as part of fulfilling the deletion request. Any references to SED Records associated directly to that Public Identifier must also be deleted by the SPPF implementation.

Deletes MUST be atomic βš›οΈ. All or nothing, bestie!

7.3. Get Operations πŸ”

Sometimes, on behalf of the Registrant, the Registrar needs to get info about SPPF objects that were provisioned earlier in the Registry πŸ•΅οΈ. A few examples are logging, auditing, and pre-provisioning dependency checking. This query mechanism is limited to aid provisioning scenarios and should not be confused with query protocols provided as part of the resolution system (e.g., ENUM and SIP) πŸ™…β€β™€οΈ.

Any conforming "protocol" specification MUST provide a definition for the operation that queries the details of one or more SPPF objects from the Registry using the object's key. If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from among the response messages defined in Section 5.3.

If the response to the Get operation includes an object(s) that extends the BasicObjType, the Registry MUST include the "cDate" and "mDate", if applicable πŸ“….

7.4. Accept Operations βœ…

In SPPF, a SED Group Offer can be accepted or rejected by, or on behalf of, the Registrant to which the SED Group has been offered (refer to Section 6.5 of this document for a description of the SED Group Offer object) 🎁. The Accept operation is used to accept the SED Group Offers. Any conforming substrate "protocol" specification MUST provide a definition for the operation to accept SED Group Offers by, or on behalf of, the Registrant, using the SED Group Offer object key πŸ”.

Not until access to a SED Group has been offered and accepted will the Registrant's organization ID be included in the peeringOrg list in that SED Group object. That SED Group's peering information only becomes a candidate for inclusion in the responses to the resolution requests submitted by that Registrant 🌟. A SED Group Offer that is in the "offered" status is accepted by, or on behalf of, the Registrant to which it has been offered. When the SED Group Offer is accepted, it moves to the "accepted" status, and the data recipient's organization ID is added into the list of peerOrgIds for that SED Group πŸ₯³.

If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from amongst the response messages defined in "Response Message Types" (Section 5.3 of this document) 🚷.

7.5. Reject Operations ❌

In SPPF, a SED Group Offer object can be accepted or rejected by, or on behalf of, the Registrant to which the SED Group has been offered (refer to "Framework Data Model Objects", Section 6 of this document, for a description of the SED Group Offer object) πŸ“¦. Furthermore, that offer may be rejected, regardless of whether or not it has been previously accepted. The Reject operation is used to reject the SED Group Offer. When the SED Group Offer is rejected, that SED Group Offer is deleted, and, if appropriate, the data recipient's organization ID is removed from the list of peeringOrg IDs for that SED Group. Any conforming substrate "protocol" specification MUST provide a definition for the operation to reject SED Group Offers by, or on behalf of, the Registrant, using the SED Group Offer object key πŸ™ƒ.

If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from among the response messages defined in "Response Message Types" (Section 5.3 of this document) πŸ›‘.

7.6. Get Server Details Operation πŸ–₯️

In SPPF, the Get Server Details operation can be used to request certain details about the SPPF server. These include the server's current status and the major/minor version of the SPPF protocol it supports πŸ“Š.

Any conforming substrate "protocol" specification MUST provide a definition for the operation to request such details from the SPPF server. If the entity that issued the command is not authorized to perform this operation, an appropriate error message MUST be returned from among the response messages defined in "Response Message Types" (Section 5.3 of this document) πŸ”’.


8. XML Considerations 🌸

XML is the encoding format for SPPF πŸ’œ. It lets complex hierarchical data be expressed in a text format that you can read, save, and manipulate with both regular text tools and XML-specific tools 🧰.

XML is case sensitive πŸ” . Unless stated otherwise, the character casing of XML specifications in this document MUST be preserved to develop a conforming specification. Don't mess with the capitals, periodt πŸ’….

This section covers a small number of XML-related considerations pertaining to SPPF ✨.

8.1. Namespaces ✨

Every SPPF element lives in the namespaces spelled out in the "IANA Considerations" and "Formal Framework Specification" sections of this document. πŸ’–

8.2. Versioning and Character Encoding πŸŽ€

Okay so every XML instance SHOULD kick off with an <?xml?> declaration. That tells the parser which XML version is in use, can optionally name the character encoding, and can optionally give the parser a little hint that an external schema file is needed to validate the instance. πŸ¦‹

Conformant parsers recognize both UTF-8 (defined in [RFC3629]) and UTF-16 (defined in [RFC2781]). Per [RFC2277], UTF-8 is the RECOMMENDED character encoding for SPPF. Ate and left no crumbs. πŸ’…

Other encodings beyond UTF-8 and UTF-16 are allowed by XML. UTF-8 is the default XML assumes when there's no "encoding" attribute or byte order mark (BOM), so the "encoding" attribute is OPTIONAL when you're using UTF-8. 🌸 SPPF clients and servers MUST accept a UTF-8 BOM if one is present, though emitting a UTF-8 BOM is NOT RECOMMENDED. πŸ™ˆ

Example XML declarations:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

9. Security Considerations πŸ”’

Okay, this part is serious bestie. πŸ₯Ί Many SPPF implementations manage data that is confidential and critical. On top of that, SPPF implementations can support provisioning for multiple Registrars and Registrants. So any SPPF implementation must address the requirements for confidentiality, authentication, and authorization. No skipping this one! 🚨

9.1. Confidentiality and Authentication πŸ”

For confidentiality and authentication, the substrate protocol requirements section of this document lists security properties the substrate protocol must provide. That way, authenticated endpoints can swap data confidentially and with integrity protection. Check Section 4 of this document and [RFC7878] for the specific solutions to authentication and confidentiality. ✨

9.2. Authorization πŸ‘‘

With respect to authorization, the SPPF server implementation must define and implement a set of authorization rules that precisely address two things. First, which Registrars will be authorized to create/modify/delete each SPPF object type for a given Registrant(s). Second, which Registrars will be authorized to view/get each SPPF object type for a given Registrant(s).

These authorization rules are a matter of policy and are not specified within the context of SPPF. However, any SPPF implementation must specify these authorization rules in order to function in a reliable and safe manner. 🫢

9.3. Denial of Service πŸ›‘

In general, guidance on Denial-of-Service (DoS) issues is given in "Internet Denial of Service Considerations" [RFC4732], which also gives a general vocabulary for describing the DoS issue. πŸ“š

SPPF is a high-level client-server protocol that can be implemented on lower-level mechanisms such as remote procedure call and web-service API protocols. So it inherits any Denial-of-Service issues inherent to the specific lower-level mechanism used for any implementation of SPPF. SPPF also has its own set of higher-level exposures that are likely to be independent of lower-layer mechanism choices. 🧚

9.3.1. DoS Issues Inherited from the Substrate Mechanism 🧱

In general, an SPPF implementation is dependent on the selection and implementation of a lower-level substrate protocol, plus a binding between that protocol and SPPF. The archetypal SPPF implementation uses XML [W3C.REC-xml-20081126] representation in a SOAP [SOAPREF] request/response framework over HTTP [RFC7230]. It probably also uses Transport Layer Security (TLS) [RFC5246] for on-the-wire data integrity and participant authentication, and it might use HTTP Digest authentication [RFC2069]. πŸ“

The typical deployment scenario for SPPF is to have servers in a managed facility. That's why techniques such as Network Ingress Filtering [RFC2827] are generally applicable. In short, any DoS mechanism affecting a typical HTTP implementation would affect such an SPPF implementation. Therefore, the mitigation tools for HTTP in general also apply to SPPF. πŸ›‘οΈ

SPPF does not directly specify an authentication mechanism. Instead, it relies on the lower-level substrate protocol to provide for authentication. Authentication is an expensive operation in general, and one apparent attack vector is to flood an SPPF server with repeated requests for authentication, thereby exhausting its resources. So SPPF implementations SHOULD be prepared to handle authentication floods, perhaps by noting repeated failed login requests from a given source address and blocking that source address. 🌧️

9.3.2. DoS Issues Specific to SPPF 🎯

The primary defense mechanism against DoS within SPPF is authentication. Implementations MUST tightly control access to the SPPF service, SHOULD implement DoS and other policy control screening, and MAY employ a variety of policy violation reporting and response measures. Some examples are automatic blocking of specific users and alerting of operations personnel. In short, the primary SPPF response to DoS-like activity by a user is to block that user or subject their actions to additional review. πŸ’€

SPPF allows a client to submit multiple-element or "batch" requests that may insert or otherwise affect a large amount of data with a single request. In the simplest case, the server progresses sequentially through each element in a batch, completing one before starting the next. Mid-batch failures are handled by stopping the batch and rolling back the data store to its pre-request state.

This "stop and roll back" design provides a DoS opportunity. A hostile client could repeatedly issue large batch requests with one or more failing elements, causing the server to repeatedly stop and roll back large transactions. The suggested response is to monitor clients for such failures and take administrative action (such as blocking the user) when an excessive number of rollbacks is reported. 😀

An additional suggested response is for an implementer to set their maximum allowable XML message size and their maximum allowable batch size. The goal is a level that they feel protects their operational instance. That depends on the hardware sizing they have in place and on the expected load and size needs their users expect. πŸ“

9.4. Information Disclosure πŸ•΅οΈβ€β™€οΈ

It is not uncommon for the logging systems to document on-the-wire messages for various purposes, such as debugging, auditing, and tracking. At the minimum, the various support and administration staff will have access to these logs. Also, if an unprivileged user gains access to the SPPF deployments and/or support systems, they will have access to the information that is potentially deemed confidential. 😳

To manage information disclosure concerns beyond the substrate level, SPPF implementations MAY provide support for encryption at the SPPF object level. πŸ”

9.5. Non-repudiation πŸ“

In some situations, it may be required to protect against denial of involvement (see [RFC4949]) and tackle non-repudiation concerns in regard to SPPF messages. This type of protection is useful for satisfying authenticity concerns related to SPPF messages. It goes beyond the end-to-end connection integrity, confidentiality, and authentication protection that the substrate layer provides. 🧾

This is an optional feature, and some SPPF implementations MAY provide support for it. πŸ’œ

9.6. Replay Attacks πŸ”

Anti-replay protection ensures that a given SPPF object replayed at a later time won't affect the integrity of the system. SPPF provides at least one mechanism to fight against replay attacks. Use of the optional client transaction identifier allows the SPPF client to correlate the request message with the response. It also lets the client be sure that the response is not a replay of a server response from earlier exchanges. πŸ•°οΈ

Use of unique values for the client transaction identifier is highly encouraged. That helps avoid chance matches to a potential replay message. ✨

9.7. Compromised or Malicious Intermediary πŸ•·οΈ

The SPPF client or Registrar can be a separate entity acting on behalf of the Registrant in facilitating provisioning transactions to the Registry. Therefore, even though the substrate layer provides end-to-end protection for each specific SPPP connection between client and server, data might be available in clear text before or after it traverses an SPPP connection. ⚠️

Therefore, a man-in-the-middle attack by one of the intermediaries is a possibility. That could affect the integrity of the data that belongs to the Registrant and/or expose peering data to unintended actors. 😱

10. Internationalization Considerations 🌍

Character encodings to be used for SPPF elements are described in Section 8.2. The use of time elements in the protocol is specified in Section 3.2. πŸ•’

Where human-readable messages that are presented to an end user are used in the protocol, those messages SHOULD be tagged according to [RFC5646]. The substrate protocol MUST support a respective mechanism to transmit such tags together with those human-readable messages. Labels for everyone! 🏷️

11. IANA Considerations πŸ“‹

11.1. URN Assignments πŸ¦„

This document uses URNs to describe XML Namespaces and XML Schemas conforming to a Registry mechanism described in [RFC3688].

Two URI assignments have been made. First, the registration for the SPPF XML Namespace:

urn:ietf:params:xml:ns:sppf:base:1
Registrant Contact: The IESG
XML: None.  Namespace URIs do not represent an XML specification.

Next, the registration request for the XML Schema:

URI: urn:ietf:params:xml:schema:sppf:1
Registrant Contact: IESG
XML: See "Formal Specification" (Section 12 of this document).

11.2. Organization Identifier Namespace Registry πŸ—‚οΈ

IANA has created and will maintain a registry titled "SPPF OrgIdType Namespaces". The formal syntax is described in Section 5.1.

Assignments consist of the OrgIdType Namespace string and the definition of the associated Namespace. This document makes the following initial assignment for the OrgIdType Namespaces:

      OrgIdType Namespace string                       Namespace
      --------------------------                       ---------
      IANA Enterprise Numbers                          iana-en

Future assignments are to be made through the well-known IANA Policy "RFC Required" (see Section 4.1 of [RFC5226]). Such assignments will typically be requested when a new Namespace for identification of SPs is defined. Registry glow-up unlocked πŸ’–

12. Formal Specification πŸ“œ

This section provides the XSD for the SPPF protocol. 🧁

Okay bestie, the schema keeps going, so here's the next chunk of the XML πŸ’–βœ¨

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:sppfb="urn:ietf:params:xml:ns:sppf:base:1"
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:ietf:params:xml:ns:sppf:base:1"
elementFormDefault="qualified" xml:lang="EN">
 <annotation>
  <documentation>
   ---- Generic object key types to be defined by specific
        substrate/architecture.  The types defined here can
        be extended by the specific architecture to
        define the Object Identifiers. ----
  </documentation>
 </annotation>
 <complexType name="ObjKeyType"
  abstract="true">
  <annotation>
   <documentation>
    ---- Generic type that represents the
         key for various objects in SPPF. ----
   </documentation>
  </annotation>
 </complexType>
 <complexType name="SedGrpOfferKeyType" abstract="true">
  <complexContent>
   <extension base="sppfb:ObjKeyType">
    <annotation>
     <documentation>
     ---- Generic type that represents
          the key for a SED Group Offer. ----
     </documentation>
    </annotation>
   </extension>
  </complexContent>
 </complexType>

 <complexType name="PubIdKeyType" abstract="true">
  <complexContent>
   <extension base="sppfb:ObjKeyType">
    <annotation>
     <documentation>
      ----Generic type that
      represents the key
      for a Pub ID. ----
     </documentation>
    </annotation>
   </extension>
  </complexContent>
 </complexType>

 <annotation>
  <documentation>
    ---- Object Type Definitions ----
  </documentation>
 </annotation>

 <complexType name="SedGrpType">
  <complexContent>
   <extension base="sppfb:BasicObjType">
    <sequence>
     <element name="sedGrpName" type="sppfb:ObjNameType"/>
     <element name="sedRecRef" type="sppfb:SedRecRefType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="dgName" type="sppfb:ObjNameType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="peeringOrg" type="sppfb:OrgIdType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="sourceIdent" type="sppfb:SourceIdentType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="isInSvc" type="boolean"/>
     <element name="priority" type="unsignedShort"/>
     <element name="ext"
     type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="DestGrpType">
  <complexContent>
   <extension base="sppfb:BasicObjType">
    <sequence>
     <element name="dgName"
     type="sppfb:ObjNameType"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="PubIdType" abstract="true">
  <complexContent>
   <extension base="sppfb:BasicObjType">
    <sequence>
     <element name="dgName" type="sppfb:ObjNameType"
              minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="TNType">
  <complexContent>
   <extension base="sppfb:PubIdType">
    <sequence>
     <element name="tn" type="sppfb:NumberValType"/>
     <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
     <element name="sedRecRef" type="sppfb:SedRecRefType"
              minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="TNRType">
  <complexContent>
   <extension base="sppfb:PubIdType">
    <sequence>
     <element name="range" type="sppfb:NumberRangeType"/>
     <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="TNPType">
  <complexContent>
   <extension base="sppfb:PubIdType">
    <sequence>
     <element name="tnPrefix" type="sppfb:NumberValType"/>
     <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="RNType">
  <complexContent>
   <extension base="sppfb:PubIdType">
    <sequence>
     <element name="rn" type="sppfb:NumberValType"/>
     <element name="corInfo" type="sppfb:CORInfoType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
  <complexType name="URIPubIdType">
  <complexContent>
   <extension base="sppfb:PubIdType">
    <sequence>
     <element name="uri" type="anyURI"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="SedRecType" abstract="true">
  <complexContent>
   <extension base="sppfb:BasicObjType">
    <sequence>
     <element name="sedName" type="sppfb:ObjNameType"/>
     <element name="sedFunction" type="sppfb:SedFunctionType"
              minOccurs="0"/>
     <element name="isInSvc" type="boolean"/>
     <element name="ttl" type="positiveInteger" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="NAPTRType">
  <complexContent>
   <extension base="sppfb:SedRecType">
    <sequence>
     <element name="order" type="unsignedShort"/>
     <element name="flags" type="sppfb:FlagsType" minOccurs="0"/>
     <element name="svcs" type="sppfb:SvcType"/>
     <element name="regx" type="sppfb:RegexParamType" minOccurs="0"/>
     <element name="repl" type="sppfb:ReplType" minOccurs="0"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="NSType">
  <complexContent>
   <extension base="sppfb:SedRecType">
    <sequence>
     <element name="hostName" type="token"/>
     <element name="ipAddr" type="sppfb:IPAddrType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="URIType">
  <complexContent>
   <extension base="sppfb:SedRecType">
    <sequence>
     <element name="ere" type="token" default="^(.*)$"/>
     <element name="uri" type="anyURI"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="SedGrpOfferType">
  <complexContent>
   <extension base="sppfb:BasicObjType">
    <sequence>
     <element name="sedGrpOfferKey" type="sppfb:SedGrpOfferKeyType"/>
     <element name="status" type="sppfb:SedGrpOfferStatusType"/>
     <element name="offerDateTime" type="dateTime"/>
     <element name="acceptDateTime" type="dateTime" minOccurs="0"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <complexType name="EgrRteType">
  <complexContent>
   <extension base="sppfb:BasicObjType">

    <sequence>
     <element name="egrRteName" type="sppfb:ObjNameType"/>
     <element name="pref" type="unsignedShort"/>
     <element name="regxRewriteRule" type="sppfb:RegexParamType"/>
     <element name="ingrSedGrp" type="sppfb:ObjKeyType"
              minOccurs="0" maxOccurs="unbounded"/>
     <element name="svcs" type="sppfb:SvcType" minOccurs="0"/>
     <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
    </sequence>
   </extension>
  </complexContent>
 </complexType>
 <annotation>
  <documentation>
   ---- Abstract Object and Element Type Definitions ----
  </documentation>
 </annotation>
 <complexType name="BasicObjType" abstract="true">
  <sequence>
   <element name="rant" type="sppfb:OrgIdType"/>
   <element name="rar" type="sppfb:OrgIdType"/>
   <element name="cDate" type="dateTime" minOccurs="0"/>
   <element name="mDate" type="dateTime" minOccurs="0"/>
   <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
  </sequence>
 </complexType>
 <complexType name="RegexParamType">
  <sequence>
   <element name="ere" type="sppfb:RegexType" default="^(.*)$"/>
   <element name="repl" type="sppfb:ReplType"/>
  </sequence>
 </complexType>
 <complexType name="IPAddrType">
  <sequence>
   <element name="addr" type="sppfb:AddrStringType"/>
   <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
  </sequence>
  <attribute name="type" type="sppfb:IPType" default="v4"/>
 </complexType>
 <complexType name="SedRecRefType">
  <sequence>
   <element name="sedKey" type="sppfb:ObjKeyType"/>
   <element name="priority" type="unsignedShort"/>
   <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
  </sequence>
 </complexType>
 <complexType name="SourceIdentType">
  <sequence>

   <element name="sourceIdentRegex" type="sppfb:RegexType"/>
   <element name="sourceIdentScheme"
            type="sppfb:SourceIdentSchemeType"/>
   <element name="ext" type="sppfb:ExtAnyType" minOccurs="0"/>
  </sequence>
 </complexType>
 <complexType name="CORInfoType">
  <sequence>
   <element name="corClaim" type="boolean" default="true"/>
   <element name="cor" type="boolean" default="false" minOccurs="0"/>
   <element name="corDate" type="dateTime" minOccurs="0"/>
  </sequence>
 </complexType>
 <complexType name="SvcMenuType">
  <sequence>
   <element name="serverStatus" type="sppfb:ServerStatusType"/>
   <element name="majMinVersion" type="token" maxOccurs="unbounded"/>
   <element name="objURI" type="anyURI" maxOccurs="unbounded"/>
   <element name="extURI" type="anyURI"
            minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
 </complexType>
 <complexType name="ExtAnyType">
  <sequence>
   <any namespace="##other" maxOccurs="unbounded"/>
  </sequence>
 </complexType>
 <simpleType name="FlagsType">
  <restriction base="token">
   <length value="1"/>
   <pattern value="[A-Z]|[a-z]|[0-9]"/>
  </restriction>
 </simpleType>
 <simpleType name="SvcType">
  <restriction base="token">
   <minLength value="1"/>
  </restriction>
 </simpleType>
 <simpleType name="RegexType">
  <restriction base="token">
   <minLength value="1"/>
  </restriction>
 </simpleType>
 <simpleType name="ReplType">
  <restriction base="token">
   <minLength value="1"/>
   <maxLength value="255"/>
  </restriction>

That's the schema so far, and there's still more coming for part 12 🧚🌸

    </simpleType>
    <simpleType name="OrgIdType">
     <restriction base="token"/>
    </simpleType>
    <simpleType name="ObjNameType">
     <restriction base="token">
      <minLength value="3"/>
      <maxLength value="80"/>
     </restriction>
    </simpleType>
    <simpleType name="TransIdType">
     <restriction base="token">
      <minLength value="3"/>
      <maxLength value="120"/>
     </restriction>
    </simpleType>
    <simpleType name="MinorVerType">
     <restriction base="unsignedLong"/>
    </simpleType>
    <simpleType name="AddrStringType">
     <restriction base="token">
      <minLength value="3"/>
      <maxLength value="45"/>
     </restriction>
    </simpleType>
    <simpleType name="IPType">
     <restriction base="token">
      <enumeration value="v4"/>
      <enumeration value="v6"/>
     </restriction>
    </simpleType>
    <simpleType name="SourceIdentSchemeType">
     <restriction base="token">
      <enumeration value="uri"/>
      <enumeration value="ip"/>
      <enumeration value="rootDomain"/>
     </restriction>
    </simpleType>
    <simpleType name="ServerStatusType">
     <restriction base="token">
      <enumeration value="inService"/>
      <enumeration value="outOfService"/>
     </restriction>
    </simpleType>
    <simpleType name="SedGrpOfferStatusType">
     <restriction base="token">
      <enumeration value="offered"/>
      <enumeration value="accepted"/>

     </restriction>
    </simpleType>
    <simpleType name="NumberValType">
     <restriction base="token">
      <maxLength value="20"/>
      <pattern value="\+?\d\d*"/>
     </restriction>
    </simpleType>
    <simpleType name="NumberTypeEnum">
     <restriction base="token">
      <enumeration value="TN"/>
      <enumeration value="TNPrefix"/>
      <enumeration value="RN"/>
     </restriction>
    </simpleType>
    <simpleType name="SedFunctionType">
     <restriction base="token">
      <enumeration value="routing"/>
      <enumeration value="lookup"/>
     </restriction>
    </simpleType>
    <complexType name="NumberType">
     <sequence>
      <element name="value" type="sppfb:NumberValType"/>
      <element name="type" type="sppfb:NumberTypeEnum"/>
     </sequence>
    </complexType>
    <complexType name="NumberRangeType">
     <sequence>
      <element name="startRange" type="sppfb:NumberValType"/>
      <element name="endRange" type="sppfb:NumberValType"/>
     </sequence>
    </complexType>
   </schema>

13. References πŸ“š

13.1. Normative References πŸ’–

Here are the must-read refs, the ones the spec leans on for real. 🫢

13.2. Informative References 🌸

And these are the extra-credit reads, the background bangers that give you the full picture. 🧚

Acknowledgements πŸŽ€

This doc is the result of a bunch of brainstorming sessions in the DRINKS working group and the DRINKS protocol design team, with help from all these amazing people (listed alphabetically, obviously πŸ’…): Syed Ali, Jeremy Barkan, Vikas Bhatia, Sumanth Channabasappa, Lisa Dusseault, Deborah A. Guyton, Otmar Lendl, Manjul Maharishi, Mickael Marrache, Alexander Mayrhofer, Samuel Melloul, David Schwartz, and Richard Shockey. Literally a whole team effort, and they ate 🫢✨

Authors' Addresses πŸ¦‹

Here's where to find the people who wrote this thing. Slide into their inboxes respectfully πŸ’Œ

Kenneth Cartwright
TNS
1939 Roland Clarke Place
Reston, VA  20191
United States

Email: kcartwright@tnsi.com


Vikas Bhatia
TNS
1939 Roland Clarke Place
Reston, VA  20191
United States

Email: vbhatia@tnsi.com


Syed Wasim Ali
NeuStar
46000 Center Oak Plaza
Sterling, VA  20166
United States

Email: syed.ali@neustar.biz


David Schwartz
XConnect
316 Regents Park Road
London  N3 2XJ
United Kingdom

Email: dschwartz@xconnect.net
πŸ“¦ where this page comes from