RFC 7877
Session Peering Provisioning Framework (SPPF)
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 Notice π
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 π«§:
- 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 πΊοΈ.
- 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 extendBasicObjType(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 thebaseelement, as described above). π·οΈsedRecRef: A set of zero or more objects of typeSedRecRefType. These house the unique keys of the SED Records (containing the SED) that theSedGrpTypeobject refers to, plus their relative priority within the context of this SED Group. πdgName: A set of zero or more names ofDestGrpTypeobject instances. EachdgName, together with this SED Group's Registrant ID, uniquely identifies aDestGrpTypeobject 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 ofOrgIdType. The set of peering organizations in this list is not directly settable or modifiable using theaddSedGrpsRqstoperation. Instead, this set is controlled using the SED Offer and Accept operations. π€sourceIdent: A set of zero or moreSourceIdentTypeobject 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 associatedsourceIdentRegexshould 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 associatedsourceIdentScheme. π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 typeSedRecType. the concrete types that useSedRecTypeas an extension base areNAPTRType,NSType, andURIType. 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 thereplfield must be includedrepl: the NAPTR replacement field π it should only be provided if theregxfield 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. π«Ά
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997,
http://www.rfc-editor.org/info/rfc2119. - [RFC2277] Alvestrand, H., "IETF Policy on Character Sets and Languages", BCP 18, RFC 2277, DOI 10.17487/RFC2277, January 1998,
http://www.rfc-editor.org/info/rfc2277. - [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November 2003,
http://www.rfc-editor.org/info/rfc3629. - [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004,
http://www.rfc-editor.org/info/rfc3688. - [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005,
http://www.rfc-editor.org/info/rfc3986. - [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, DOI 10.17487/RFC5226, May 2008,
http://www.rfc-editor.org/info/rfc5226. - [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008,
http://www.rfc-editor.org/info/rfc5234. - [RFC7878] Cartwright, K., Bhatia, V., Mule, J., and A. Mayrhofer, "Session Peering Provisioning (SPP) Protocol over SOAP", RFC 7878, DOI 10.17487/RFC7878, August 2016,
http://www.rfc-editor.org/info/rfc7878. - [W3C.REC-xml-20081126] Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth Edition)", World Wide Web Consortium Recommendation REC-xml-20081126, November 2008,
http://www.w3.org/TR/2008/REC-xml-20081126.
13.2. Informative References πΈ
And these are the extra-credit reads, the background bangers that give you the full picture. π§
- [RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P., Luotonen, A., Sink, E., and L. Stewart, "An Extension to HTTP : Digest Access Authentication", RFC 2069, DOI 10.17487/RFC2069, January 1997,
http://www.rfc-editor.org/info/rfc2069. - [RFC2781] Hoffman, P. and F. Yergeau, "UTF-16, an encoding of ISO 10646", RFC 2781, DOI 10.17487/RFC2781, February 2000,
http://www.rfc-editor.org/info/rfc2781. - [RFC2827] Ferguson, P. and D. Senie, "Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, May 2000,
http://www.rfc-editor.org/info/rfc2827. - [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, DOI 10.17487/RFC3261, June 2002,
http://www.rfc-editor.org/info/rfc3261. - [RFC3403] Mealling, M., "Dynamic Delegation Discovery System (DDDS) Part Three: The Domain Name System (DNS) Database", RFC 3403, DOI 10.17487/RFC3403, October 2002,
http://www.rfc-editor.org/info/rfc3403. - [RFC4725] Mayrhofer, A. and B. Hoeneisen, "ENUM Validation Architecture", RFC 4725, DOI 10.17487/RFC4725, November 2006,
http://www.rfc-editor.org/info/rfc4725. - [RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, "Internet Denial-of-Service Considerations", RFC 4732, DOI 10.17487/RFC4732, December 2006,
http://www.rfc-editor.org/info/rfc4732. - [RFC4949] Shirey, R., "Internet Security Glossary, Version 2", FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007,
http://www.rfc-editor.org/info/rfc4949. - [RFC5067] Lind, S. and P. Pfautz, "Infrastructure ENUM Requirements", RFC 5067, DOI 10.17487/RFC5067, November 2007,
http://www.rfc-editor.org/info/rfc5067. - [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, DOI 10.17487/RFC5246, August 2008,
http://www.rfc-editor.org/info/rfc5246. - [RFC5486] Malas, D., Ed. and D. Meyer, Ed., "Session Peering for Multimedia Interconnect (SPEERMINT) Terminology", RFC 5486, DOI 10.17487/RFC5486, March 2009,
http://www.rfc-editor.org/info/rfc5486. - [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646, September 2009,
http://www.rfc-editor.org/info/rfc5646. - [RFC6116] Bradner, S., Conroy, L., and K. Fujiwara, "The E.164 to Uniform Resource Identifiers (URI) Dynamic Delegation Discovery System (DDDS) Application (ENUM)", RFC 6116, DOI 10.17487/RFC6116, March 2011,
http://www.rfc-editor.org/info/rfc6116. - [RFC6461] Channabasappa, S., Ed., "Data for Reachability of Inter-/Intra-NetworK SIP (DRINKS) Use Cases and Protocol Requirements", RFC 6461, DOI 10.17487/RFC6461, January 2012,
http://www.rfc-editor.org/info/rfc6461. - [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing", RFC 7230, DOI 10.17487/RFC7230, June 2014,
http://www.rfc-editor.org/info/rfc7230. - [SOAPREF] Gudgin, M., Hadley, M., Moreau, J., and H. Nielsen, "SOAP Version 1.2 Part 1: Messaging Framework", W3C REC REC-SOAP12-part1-20030624, June 2003,
http://www.w3.org/TR/soap12-part1/. - [Unicode6.1] The Unicode Consortium, "The Unicode Standard, Version 6.1.0", (Mountain View, CA: The Unicode Consortium, 2012. ISBN 978-1-936213-02-3),
http://unicode.org/versions/Unicode6.1.0/.
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
- ietf: rfc7877 2016-08
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms