<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="no" ?>
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<?rfc compact="no" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-birrane-dtn-ari-01" ipr="trust200902" submissionType="IETF" symRefs="true" tocInclude="true" version="3" xml:lang="en">
  <front>
    <title abbrev="ARI">Asynchronous Resource Identifier</title>
    <seriesInfo name="Internet-Draft" value="draft-birrane-dtn-ari-01"/>
    <author fullname="Edward J. Birrane, III" initials="E.J." surname="Birrane">
      <organization abbrev="JHU/APL">The Johns Hopkins University Applied Physics Laboratory</organization>
      <address>
        <postal>
          <street>11100 Johns Hopkins Rd.</street>
          <city>Laurel</city>
          <region>MD</region>
          <code>20723</code>
          <country>US</country>
        </postal>
        <phone>+1 443 778 7423</phone>
        <email>Edward.Birrane@jhuapl.edu</email>
      </address>
    </author>
    <author fullname="Emery Annis" initials="E.A." surname="Annis">
      <organization abbrev="JHU/APL">The Johns Hopkins University Applied Physics Laboratory</organization>
      <address>
        <email>Emery.Annis@jhuapl.edu</email>
      </address>
    </author>
    <author fullname="Brian Sipos" initials="B." surname="Sipos">
      <organization abbrev="JHU/APL">The Johns Hopkins University Applied Physics Laboratory</organization>
      <address>
        <email>brian.sipos+ietf@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>Delay-Tolerant Networking</workgroup>
    <keyword>DTN</keyword>
    <keyword>Network Management</keyword>
    <keyword>Naming</keyword>
    <keyword>Addressing</keyword>
    <abstract>
      <t>
                This document defines the structure, format, and features of 
                the naming scheme for the objects defined in the 
                Delay-Tolerant Networking (DTN) Application Data Model (ADM), 
                in support of challenged network management solutions 
                described in the Delay-Tolerant Networking Autonomous 
                Management Architecture (AMA).
      </t>
      <t>
                This document defines a new Asynchronous Resource Identifier (ARI), 
                based on the structure of a common URI, meeting the needs for 
                a concise, typed, parameterized, and hierarchically organized 
                set of data elements.               
      </t>
    </abstract>
  </front>
  <middle>
    <section>
      <name>Introduction</name>
      <t>
                The unique limitations of Delay-Tolerant Networking
                transport capabilities <xref target="RFC4838"/> necessitate 
                increased reliance on individual node behavior. These 
                limitations are considered part of the expected operational
                environment of the system and, thus, contemporaneous end-to-end 
                data exchange cannot be considered a requirement for 
                successful communication.
      </t>
      <t>
                The primary DTN transport mechanism, Bundle Protocol version 7, 
                (BPv7) <xref target="RFC9171"/>, standardizes a 
                store-and-forward behavior required to communicate effectively 
                between endpoints that may never co-exist in a single network 
                partition. BPv7 might be deployed in static environments, but 
                the design and operation of BPv7 cannot presume that to be the 
                case.
      </t>
      <t>
                Similarly, the management of any BPv7 protocol agent (BPA) (or 
                any software reliant upon DTN for its communication) cannot 
                presume to operate in a resourced, connected network. Just as 
                DTN transport must be delay-tolerant, DTN network management 
                must also be delay-tolerant.
      </t>
      <t>
                The DTN Autonomous Management Architecture (DTN AMA) 
                <xref target="I-D.ietf-dtn-ama"/> outlines an architecture that
                achieves this result through the self-management of a DTN node as 
                configured by one or more remote managers in an asynchronous
                and open-loop system. An important part of this architecture is
                the definition of a conceptual data schema for defining resources 
                configured by remote managers and implemented by the local 
                autonomy of a DTN node. 
      </t>
      <t>
                The DTN Asynchronous Management Model (DTN AMM) 
                <xref target="I-D.birrane-dtn-adm"/> defines a logical schema
                that can be used to represent data types and structures,
                autonomous controls, and other kinds of information expected
                to be required for the local management of a DTN node. The
                DTN AMM further describes a physical data model, called the
                Application Data Model, that can be defined in the context
                of applications to create resources in accordance with the DTN
                AMM logical schema. These named resources can be predefined in 
                moderated publications or custom-defined as part of the 
                operational management of a network or a node.
      </t>
      <t>
                Every AMM resource must be uniquely identifiable. To accomplish
                this, an expressive naming scheme is required.  The AMM 
                Resource Identifier (ARI) provides this naming scheme. This 
                document defines an ARI, based on the structure of a URI, 
                meeting the needs for a concise, typed, parameterized, and 
                hierarchically organized naming convention.
      </t>
      <section>
        <name>Scope</name>
        <t>
                    The ARI scheme is based on the structure of a 
                    URI <xref target="RFC3986"/> in accordance with the 
                    practices outlined in <xref target="RFC8820"/>. 
        </t>
        <t>
                    ARIs are designed to support the identification requirements
                    of the DTN AMM logical schema. As such, this specification
                    will discuss these requirements to the extent necessary to
                    explain the structure and use of the ARI syntax. 
        </t>
        <t>
                    This specification does not constrain the syntax or
                    structure of any existing URI (or part thereof). As such,
                    the ARI scheme does not impede the ownership of any other
                    URI definition and is therefore clear of the concerns
                    presented in <xref target="RFC7320"/>. 
        </t>
        <t>
                    This specification does not discuss the manner in which ARIs
                    might be generated, populated, and used by applications.
                    The operational utility and configuration of ARIs in a
                    system are described in other documents associated with
                    DTN management, to include the AMA and AMM specifications.
        </t>
        <t>
                    This specification does not describe the way in which 
                    path prefixes associated with an ARI are standardized, 
                    moderated, or otherwise populated. Path suffixes may be
                    specified where they do not lead to collision or 
                    ambiguity. 
        </t>
        <t>
                    This specification does not describe the mechanisms for
                    generating either standardized or custom ARIs in the 
                    context of any given application, protocol, or network.                    
        </t>
        <t>
                    This specification does not describe the ways in which an
                    ARI could be encoded into other formats, to include 
                    compressed binary formats. However, the design of the ARI 
                    syntax discusses compressibility to the extent that the
                    design impacts the ability to create such encodings.
        </t>
      </section>
      <section>
        <name>Use of ABNF</name>
        <t>
This document defines text structure using the Augmented Backus-Naur Form (ABNF) of <xref target="RFC5234"/>.
The entire ABNF structure can be extracted from the XML version of this document using the XPath expression:
        </t>
        <sourcecode>'//sourcecode[@type="abnf"]'</sourcecode>
        <t>
The following initial fragment defines the top-level rules of this document's ABNF.
        </t>
        <sourcecode type="abnf">
start = ari
        </sourcecode>
        <t>
From the document <xref target="RFC3986"/> the definitions are taken for <tt>pchar</tt>, <tt>path-absolute</tt>, and <tt>path-noscheme</tt>.
From the document <xref target="RFC5234"/> the definition is taken for <tt>digit</tt>.
        </t>
      </section>
      <section>
        <name>Use of CDDL</name>
        <t>
This document defines Concise Binary Object Representation (CBOR) structure using the Concise Data Definition Language (CDDL) of <xref target="RFC8610"/>.
The entire CDDL structure can be extracted from the XML version of this document using the XPath expression:
        </t>
        <sourcecode>'//sourcecode[@type="cddl"]'</sourcecode>
        <t>
The following initial fragment defines the top-level symbols of this document's CDDL, which includes the example CBOR content.
        </t>
        <sourcecode type="cddl">
start = ari

; Limited sizes to fit the AMP data model
int32 = (int .lt 2147483648) .ge -2147483648
uint32 = uint .lt 4294967296
int64 = (int  .lt 9223372036854775808) .ge -9223372036854775808
uint64 = uint .lt 18446744073709551616
        </sourcecode>
        <t>
This document does not rely on any CDDL symbol names from other documents.
        </t>
      </section>
      <section>
        <name>Terminology</name>
        <t>
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
<xref target="RFC8174"/> when, and only when, they appear in all capitals,
as shown here.
        </t>
        <t>
Additionally, the following terms are used in this document:          
        </t>
        <dl spacing="normal">
          <dt>Agent:</dt>
          <dd>
            An entity being managed in the AMA as defined in <xref target="I-D.ietf-dtn-ama"/>.
            It is expected to be accessible by its Managers over a DTN.
          </dd>
          <dt>Manager:</dt>
          <dd>
            An entity managing others in the AMA as defined in <xref target="I-D.ietf-dtn-ama"/>.
            It is expected to be accessible by its Agents over a DTN.
          </dd>
          <dt>Application Data Model (ADM):</dt>
          <dd>
            Definitions of pre-planned objects being managed on remote agents across challenged networks.
            An ADM is versioned, but a single version of an ADM cannot change over time once it is registered.
            This is similar in function to an SMI MIB or an YANG module.
          </dd>
          <dt>Operational Data Model (ODM):</dt>
          <dd>
            The operational configuration of an Agent, exclusive of the pre-planned objects defined by ADMs.
            These objects are dynamic configuration applied at runtime, either by Managers in the network or by autonomy on the Agent.
          </dd>
          <dt>Asynchronous Resource Identifier (ARI):</dt>
          <dd>
            An identifier for any ADM or ODM managed object, as well as ad-hoc managed objects and literal values.
            ARIs are syntactically conformant to the Uniform Resource Identifier (URI) syntax documented in <xref target="RFC3986"/> and using the scheme name "ari".
            This is similar in function to an SMI OID or an YANG XPath expression along with parameters.
          </dd>
          <dt>Namespace</dt>
          <dd>
            A moderated, hierarchical taxonomy of 
            namespaces that describe a set of ADM scopes. 
            Specifically, an individual ADM namespace is a specific 
            sequence of ADM namespaces, from most general to most 
            specific, that uniquely and unambiguously identify the 
            namespace of a particular ADM. 
          </dd>
        </dl>
      </section>
    </section>
    <section>
      <name>ARI Purpose</name>
      <t>
        ADM resources are referenced in the context of autonomous applications on an agent.
        The naming scheme of these resources must support certain features to inform AMA processing in accordance with the ADM logical schema.
      </t>
      <t>
        This section defines the set of unique characteristics of the ARI scheme, the combination of which provides a unique utility for naming.
        While certain other naming schemes might incorporate certain elements, there are no such schemes that both support needed features and exclude prohibited features.
      </t>
      <section>
        <name>Resource Parameterization</name>
        <t>
          The ADM schema allows for the parameterization of resources
          to both reduce the overall data volume communicated between 
          DTN nodes and to remove the need for any round-trip data
          negotiation.
        </t>
        <t>
          Parameterization reduces the communicated data volume when
          parameters are used as filter criteria. By associating
          a parameter with a data source, data characteristic, or 
          other differentiating attribute, DTN nodes can locally
          process parameters to construct the minimal set of
          information to either process for local autonomy or 
          report to remote managers in the network.
        </t>
        <t>
          Parameterization eliminates the need for round-trip
          negotiation to identify where information is located or
          how it should be accessed. When parameters define the
          ability to perform an associative lookup of a value, the
          index or location of the data at a particular DTN node can
          be resolved locally as part of the local autonomy of the
          node and not communicated back to a remote manager.
        </t>
      </section>
      <section>
        <name>Compressible Structure</name>
        <t>
          The ability to encode information in very concise formats
          enables DTN communications in a variety of ways. Reduced 
          message sizes increase the likelihood of message delivery,
          require fewer processing resources to secure, store, and
          forward, and require less resources to transmit. 
        </t>
        <t>
          While the encoding of an ARI is outside of the scope of
          this document, the structure of portions of the ARI
          syntax lend themselves to better compressibility.
          For example, DTN ADM encodings support the ability to
          identify resources in as few as 3 bytes by exploiting the 
          compressible structure of the ARI. 
        </t>
        <t>
          The ARI syntax supports three design elements to aid in the
          creation of more concise encodings:
          enumerated forms of path segments,
          relative paths,
          and patterning. 
        </t>
        <section>
          <name>Enumerated Path Segments</name>
          <t>
            Because the ARI structure includes paths segments with stable enumerated values, each segment can be represented by either its text name or its integer enumeration.
            For human-readability in text form the text name is preferred, but for binary encoding and for comparisons the integer form is preferred.
            It is a translation done by the entity handling an ARI to switch between preferred representations (see <xref target="sec-transcoding"/>); the data model of both forms of the ARI allows for either.
          </t>
        </section>
        <section>
          <name>Relative Paths</name>
          <t>
            Hierarchical structures are well known to support
            compressible encodings by strategically enumerating 
            well-known branching points in a hierarchy.  For this
            reason, the ARI syntax uses the URI path to implement a 
            naming hierarchy.
          </t>
          <t>
            Supporting relative paths allow for the ARI namespace
            to be shortened relative to a well-known prefix. By 
            eliminating the need to repeat common path prefixes
            in ARIs (in any encoding) the size of any given
            ARI can be reduced.
          </t>
          <t>
            This relative prefix might be relative to an existing
            location, such as the familiar "../item" or relative
            to a defined nickname for a particular path
            prefix, such as "{root}/item".
          </t>
        </section>
        <section>
          <name>Patterning</name>
          <t>
            Patterning in this context refers to the structuring
            of ARI information to allow for meaning data selection
            as a function of wildcards, regular expressions, and
            other expressions of a pattern. 
          </t>
          <t>
            Patterns allow for both better compression and fewer
            ARI representations by allowing a single ARI pattern 
            to stand-in for a variety of actual ARIs. 
          </t>
          <t>
            This benefit is best achieved when the structure of
            the ARI is both expressive enough to include 
            information that is useful to pattern match, and 
            regular enough to understand how to create these
            patterns.
          </t>
        </section>
      </section>
    </section>
    <section anchor="sec-ari-structure">
      <name>ARI Logical Structure</name>
      <t>
        This section describes the components of the ARI scheme to inform the discussion of the ARI syntax in <xref target="sec-text-form"/>.
        At the top-level, an ARI is one of two classes: literal or object reference.
        Each of these classes is defined in the following subsections.
      </t>
      <section anchor="sec-struct-names">
        <name>Names, Enumerations, Comparisons, and Canonicalizations</name>
        <t>
          Within the ARI logical model, there are a number of domains in which items are identified by a combination of text name and integer enumeration: ADMs, ODMs, literal types, object types, and objects.
          In all cases, within a single domain the text name and integer enumeration SHALL NOT be considered comparable.
          It is an explicit activity by any entity processing ARIs to make the translation between text name and integer enumeration (see <xref target="sec-transcoding"/>).
        </t>
        <t>
          Text names SHALL be restricted to begin with an alphabetic character followed by any number of other characters, as defined in the <tt>id-text</tt> ABNF symbol.
          This excludes a large class of characters, including non-printing characters.
          When represented in text form, the text name for ODMs is prefixed with a "!" character to disambiguate it from an ADM name (see <xref target="sec-struct-objref"/>).
        </t>
        <t>
          For text names, comparison and uniqueness SHALL be based on case-insensitive logic.
          The canonical form of text names SHALL be the lower case representation.
        </t>
        <t>
          Integer enumerations for ADMs and ODMs SHALL be restricted to a magnitude less than 2**63 to allow them to fit within a signed 64-bit storage.
          The ADM registration in <xref target="tab-iana-dtnmp-adms"/> reserves high-valued code points for private and experimental ADMs, while the entire domain of ODM code points (negative integers) is considered private use.
          Integer enumerations for primitive types and object types SHALL be restricted to a magnitude less than 2**31 to allow them to fit within a signed 32-bit storage.
          The registrations in <xref target="tab-iana-dtnmp-primitive-types"/> and <xref target="tab-iana-dtnmp-object-types"/> respectively
          Integer enumerations for objects (within an ADM or ODM) SHALL be restricted to a magnitude less than 2**31 to allow them to fit within a signed 32-bit storage, although negative-value object enumerations are disallowed.
        </t>
        <t>
          For integer enumerations, comparison and uniqueness SHALL be based on numeric values not on encoded forms.
          The canonical form of integer enumerations in text form SHALL be the shortest length decimal representation.
        </t>
      </section>
      <section anchor="sec-struct-literal">
        <name>Literals</name>
        <t>
          Literals represent a special class of ARI which are not associated with any particular ADM or ODM.
          A literal has no other name other than its value, but literals may be explicitly typed in order to force the receiver to handle it in a specific way.
        </t>
        <t>
          Because literals will be based on the CBOR data model <xref target="RFC8949"/> and its extended diagnostic notation, a literal has an intrinsic representable data type as well as an AMP data type.
          The CBOR primitive types are named CDDL symbols as defined in <xref section="3.3" target="RFC8610"/>.
        </t>
        <t>
          When converting from AMP primitive types, the chosen CBOR type SHALL be determined by the mapping in <xref target="tab-ari-literal-types"/>.
          Additionally, when handling typed literal ARIs any combination of AMP primitive type and CBOR primitive type not in <xref target="tab-ari-literal-types"/> SHALL be considered invalid.
          This restriction is enforced by the CDDL defined in <xref target="sec-binary-form"/>.
          Additionally, when handling a literal of AMP type <tt>CBOR</tt> the well-formed-ness of the CBOR contained SHOULD be verified before the literal is treated as valid.
        </t>
        <table align="center" anchor="tab-ari-literal-types">
          <name>Literal Types to CBOR Primitives</name>
          <thead>
            <tr>
              <th>AMP Primitive Type</th>
              <th>Used CBOR Primitive Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <tt>BOOL</tt>
              </td>
              <td>
                <tt>bool</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>BYTE</tt>
              </td>
              <td>
                <tt>uint</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>INT</tt>
              </td>
              <td>
                <tt>int</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>UINT</tt>
              </td>
              <td>
                <tt>uint</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>VAST</tt>
              </td>
              <td>
                <tt>int</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>UVAST</tt>
              </td>
              <td>
                <tt>uint</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>REAL32</tt>
              </td>
              <td>
                <tt>float</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>REAL64</tt>
              </td>
              <td>
                <tt>float</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>TV</tt>
              </td>
              <td>
                <tt>int</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>TS</tt>
              </td>
              <td>
                <tt>int</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>STR</tt>
              </td>
              <td>
                <tt>tstr</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>LABEL</tt>
              </td>
              <td>
                <tt>tstr</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>BYTESTR</tt>
              </td>
              <td>
                <tt>bstr</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>CBOR</tt>
              </td>
              <td>
                <tt>bstr</tt>
              </td>
            </tr>
          </tbody>
        </table>
        <t>
          When interpreting an untyped literal ARI, the implied AMP primitive type SHALL be determined by the mapping in <xref target="tab-ari-literal-implied"/>.
        </t>
        <table align="center" anchor="tab-ari-literal-implied">
          <name>Literal Implied and Allowed Types</name>
          <thead>
            <tr>
              <th>CBOR Primitive Type</th>
              <th>Implied AMP Primitive Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <tt>bool</tt>
              </td>
              <td>
                <tt>BOOL</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>uint</tt>
              </td>
              <td>
                <tt>UVAST</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>nint</tt>
              </td>
              <td>
                <tt>VAST</tt>
              </td>
            </tr>
            <tr>
              <td><tt>float16</tt>, <tt>float32</tt></td>
              <td>
                <tt>FLOAT32</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>float64</tt>
              </td>
              <td>
                <tt>FLOAT64</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>bstr</tt>
              </td>
              <td>
                <tt>BYTESTR</tt>
              </td>
            </tr>
            <tr>
              <td>
                <tt>tstr</tt>
              </td>
              <td>
                <tt>STR</tt>
              </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sec-struct-objref">
        <name>Object References</name>
        <t>
          Object references are composed of two parts: object identity and optional parameters.
          The object identity can be dereferenced to a specific object in the ADM/ODM, while the parameters provide additional information for certain types of object and only when allowed by the parameter "signature" from the ADM/ODM.
        </t>
        <t>
          The object identity itself contains the components, described in the following subsections: namespace, object type, and object name.
          When encoded in text form (see <xref target="sec-text-form"/>), the identity components correspond to the URI path segments.
        </t>
        <section>
          <name>Namespace</name>
          <t>            
            ADM resources exist within namespaces to eliminate the possibility of a conflicting resource name, aid in the application of patterns, and improve the compressibility of the ARI.
            Namespaces <bcp14>SHALL NOT</bcp14> be used as a security mechanism to manage access.
            An Agent or Manager <bcp14>SHALL NOT</bcp14> infer security information or access control based solely on namespace information in an ARI.
          </t>
          <t>
            Namespaces have two possible forms; one more human-friendly and one more compressible:
          </t>
          <dl>
            <dt>Text form:</dt>
            <dd>
              This form corresponds with a human-readable identifier for either an ADM or a ODM namespace.
              The text form is not compressible and needs to be converted to a numeric namespace based on a local registry.
              A text form namespace SHALL contain only URI path segment characters.
            </dd>
            <dt>Numeric form:</dt>
            <dd>
              This form corresponds with a compressible value suitable for on-the-wire encoding between Manager and Agent.
              Sorting and matching numeric namespaces is also faster than text form.
              A numeric form namespaces SHALL be small enough to be represented as a 64-bit signed integer.
            </dd>
          </dl>
          <t>
            Independent to the form of the namespace is the issuer of the namespace, which is one of:
          </t>
          <dl>
            <dt>ADM namespace:</dt>
            <dd>
              When a namespace is associated with an ADM, its text form SHALL begin with an alphabetic character and its numeric form SHALL be a positive integer.
              All ADM namespaces are universally unique and, except for private or experimental use, SHOULD be registered with IANA (see <xref target="tab-iana-dtnmp-adms"/>).
            </dd>
            <dt>ODM namespace:</dt>
            <dd>
              When a namespace is not associated with an ADM, its text form SHALL begin with a bang character "!" and its numeric form SHALL be a negative integer.
              These namespaces do not have universal registration and SHALL be considered to be private use.
              It is expected that runtime ODM namespaces will be allocated and managed per-user and per-mission.
            </dd>
          </dl>
        </section>
        <section>
          <name>Object Type</name>
          <t>
            Due to the flat structure of an ADM, as defined in <xref target="I-D.birrane-dtn-adm"/>, all managed objects are of a specific and unchanging type from a set of available managed object types.
            The preferred form for object types in text ARIs is the text name, while in binary form it is the integer enumeration (see <xref target="sec-transcoding"/>).
          </t>
          <t>
            The following subsection explains the form of those object identifiers.
          </t>
        </section>
        <section>
          <name>Object Name</name>
          <t>
            An object is any one of a number of data elements defined for the management of a given application or protocol that conforms to the ADM logical schema. 
          </t>
          <t>
            Within a single ADM or runtime namespace and a single object type, all managed objects have similar characteristics and all objects are identified by a single text name or integer enumeration.
            The preferred form for object names in text ARIs is the text name, while in binary form it is the integer enumeration.
            Any ADM-defined object will have both name and enumeration, while a runtime-defined object can have either but not both.
            Conversion between the two forms requires access to the original ADM, and its specific revision, in which the object was defined.
          </t>
        </section>
        <section>
          <name>Parameters</name>
          <t>
            The ADM logical schema allows many object types to be parameterized when defined in the context of an application or a protocol. 
          </t>
          <t>
            If two instances of an ADM resource have the same namespace 
            and same object type and object name but have different parameter 
            values, then those instances are unique and the ARIs for 
            those instances MUST also be unique. Therefore, parameters 
            are considered part of the ARI syntax. 
          </t>
          <t>
            The ADM logical schema defines two types of parameters: 
            Formal and Actual. The terms formal parameter and actual 
            parameter follow common computer programming vernacular
            for discussing function declarations and function calls,
            respectively.
          </t>
          <dl newline="true">
            <dt>Formal Parameters:</dt>
            <dd>
              Formal parameters define the type, name, and order of the information that customizes an ARI.
              They represent the unchanging "definition" of the parameterized object.
              Because ARIs represent a <em>use</em> of an object and not its definition, formal parameters are not present in an ARI.
            </dd>
            <dt>Actual Parameters:</dt>
            <dd>
              <t>
                Actual parameters represent the data values used to
                distinguish different instances of a parameterized
                object. 
              </t>
              <t>
                An actual parameter MUST specify a value and MAY 
                specify a type. If a type is provided it MUST match the 
                type provided by the formal parameter. An actual 
                parameter MUST NOT include NAME information.
              </t>
              <t>
                Including type information in an actual parameters
                allows for explicit type checking of a value, which
                might otherwise be implicitly cast.
              </t>
              <t>
                There are two ways in which the value of an actual 
                parameter can be specified: parameter-by-value and 
                parameter-by-name.
              </t>
              <dl>
                <dt>Parameter-By-Value:</dt>
                <dd> 
                  This method involves directly supplying the 
                  value as part of the actual parameter. It is the 
                  default method for supplying values.
                </dd>
                <dt>Parameter-By-Name:</dt>
                <dd> 
                  This method involves specifying the name of some 
                  other parameter and using that other parameter's 
                  value for the value of this parameter. This 
                  method is useful when a parameterized ARI 
                  contains another parameterized ARI. The 
                  contained object's actual parameter can be 
                  given as the name of the containing ARI's 
                  parameter. In that way, a containing ARI's
                  parameters can be "flowed down" to all of the 
                  objects it contains. 
                </dd>
              </dl>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="sec-text-form">
      <name>ARI Text Form</name>
      <t>
        This section defines how the data model explained in <xref target="sec-ari-structure"/> is encoded as text conforming to the URI syntax of <xref target="RFC3986"/>.
        The most straightforward text form of ARI uses an explicit scheme and an absolute path (starting with an initial slash "/"), which requires no additional context to interpret its structure.
      </t>
      <t>
        When used within the context of a base ARI, the URI Reference form of <xref target="sec-text-reference"/> can be used.
        In all other cases an ARI must be an absolute-path form and contain a scheme.
      </t>
      <t>
        While this text description is normative, the ABNF schema in this section provides a more explicit and machine-parsable text schema.
        The scheme name of the ARI is "ari" and the scheme-specific part of the ARI follows one of the two forms corresponding to the literal-value ARI and the object-reference ARI.
      </t>
      <sourcecode type="abnf">
ari = absolute-ari / relative-ari

absolute-ari = "ari:" ari-ssp
ari-ssp = ari-ssp-literal / ari-ssp-objref

; A text name must start with an alphabetic character
id-text = ALPHA *pchar
; An integer enumeration must contain only digits
id-num = 1*DIGIT
      </sourcecode>
      <section>
        <name>URIs and Percent Encoding</name>
        <t>
          Due to the intrinsic structure of the URI, on which the text form of ARI is based, there are limitations on the syntax available to the scheme-specific-part <xref target="RFC7595"/>.
          One of these limitations is that each path segment can contain only characters in the <tt>pchar</tt> ABNF symbol defined in <xref target="RFC3986"/>.
          For most parts of the ARI this restriction is upheld by the values themselves: ADM/ODM names, type names, and object names have a limited character set as well.
          For literals and nested parameters though, the percent encoding of <xref section="2.4" target="RFC3986"/> is needed.
        </t>
        <t>
          In the ARI text examples in this document the URIs have been percent-decoded for clarity, as might be done in an ARI display and editing tool.
          But the actual encoded form of the human-friendly ARI <tt>ari:"text"</tt> is <tt>ari:%22text%22</tt>.
          Outside of literals, the safe characters which are not be percent-encoded are the structural delimiters <tt>/()[],</tt> used for parameters and ARI collections.
        </t>
        <t>
          One other aspect of convenience for human editing of text-form ARIs is linear white space.
          The current ABNF pattern, staying within the URI pattern, do not allow for whitespace to separate list items or otherwise.
          A human editing an ARI could find it convenient to include whitespace following commas between list items, or to separate large lists across lines.
          Any tool that allows this kind of convenience of editing SHALL collapse any white space within a single ARI before encoding its contents.
        </t>
      </section>
      <section anchor="sec-text-literal">
        <name>Literals</name>
        <t>
          Based on the structure of <xref target="sec-struct-literal"/>, the text form of the literal ARI contains only a URI path with an optional AMP primitive type.
          A literal has no concept of a namespace or context, so the path is always absolute.
          When the path has two segments, the first is the AMP primitive type and the second is the encoded literal value.
          When the path has a single segment it is the encoded literal value.
          As a shortcut, an ARI with only a single path segment is necessarily an untyped literal so the leading slash can be elided.
        </t>
        <t>
          An ARI encoder or decoder SHALL handle both text name and integer enumeration forms of the primitive type.
          When present and able to be looked up, the primitive type SHOULD be a text name.
        </t>
        <t>
          The literal value SHALL be the percent encoded form of the CBOR extended diagnostic notation text of <xref section="G" target="RFC8610"/>.
          When untyped, the decoded literal value SHALL be one of the primitive types named by the <tt>lit-notype</tt> CDDL symbol of <xref target="sec-binary-literal"/>.
          When typed, the decoded literal value MAY be any valid CBOR item conforming to the AMP primitive type definition.
        </t>
        <t>
          Some example of the forms for a literals are below.
          These first are untyped primitive values:
        </t>
        <sourcecode type="uri">
ari:true
ari:"text"
ari:10
        </sourcecode>
        <t>
          And these are typed values:
        </t>
        <sourcecode type="uri">
ari:/UINT/10
ari:/LABEL/"name"
ari:/CBOR/&lt;&lt;10&gt;&gt;
        </sourcecode>
        <t>
          The literal-value ARI has a corresponding ABNF definition of:
        </t>
        <sourcecode type="abnf">
; The primitive type name is optional
ari-ssp-literal = ["/" lit-type] ["/"] lit-value
; Type is restricted to valid AMP primitive types
lit-type = id-text / id-num
; The value is percent-encoded CBOR Diagnostic syntax
lit-value = *pchar
        </sourcecode>
      </section>
      <section>
        <name>Object References</name>
        <t>
          Based on the structure of <xref target="sec-struct-objref"/>, the text form of the object reference ARI contains a URI with three path segments corresponding to the namespace-id, object-type, and object-id.
          Those three segments (excluding parameters as defined below) are referred to as the object identity.
        </t>
        <t>
          An ARI encoder or decoder SHALL handle both text name and integer enumeration forms of the namespace-id, object-type, and object-id.
        </t>
        <t>
          The final segment containing the object-id MAY contain parameters enclosed by parentheses "(" and ")".
          There is no semantic distinction between the absence of parameters and the empty parameter list.
          The parameter list SHALL be separated by comma characters ",".
          Each parameter item SHALL be either an ARI or an ARI collection.
          Within a parameter item, ARI collections SHALL be indicated by enclosing square brackets "[" and "]".
          The ARI collection list SHALL be separated by comma characters ",".
          Each parameter item is handled recursively as the text form of ARI.
        </t>
        <t>
          The parameters as a whole SHALL be the percent encoded form of the constituent ARIs, excluding the structural delimiters <tt>/()[],</tt>.
          Implementations are advised to be careful about the percent encoded vs. decoded cases of each of the nested ARIs within parameters to avoid duplicate encoding or decoding.
          It is recommended to dissect the parameters and ARI collections in their encoded form first, and then to dissect and percent decode each separately and recursively.
        </t>
        <sourcecode type="uri">
ari:/adm-a/EDD/someobj
ari:/adm-a/CTRL/otherobj(true,3)
ari:/adm-a/CTRL/otherobj("a param",/UINT/10)
ari:/41/-1/0
        </sourcecode>
        <t>
          The object-reference ARI has a corresponding ABNF definition of:
        </t>
        <sourcecode type="abnf">
ari-ssp-objref = obj-ident [paramlist]
; The object identity can be used separately than parameters
obj-ident = "/" ns-id "/" obj-type "/" obj-id

; A comma-separated list of parameters with enclosure
paramlist = "(" param *("," param) ")"
param = ari / ac

ns-id = ns-adm / ns-odm
ns-adm = id-text / id-num
ns-odm = ("!" id-text) / ("-" id-num)
; Type is restricted to valid AMP primitive types
obj-type = id-text / ("-" id-num)
obj-id = id-text / id-num

; A comma-separated list of any form of ARI with enclosure
ac = "[" ari *("," ari) "]"
        </sourcecode>
      </section>
      <section anchor="sec-text-reference">
        <name>URI References</name>
        <t>
          The text form of ARI can contain a URI Reference, as defined in <xref section="3" target="RFC3986"/>, which can only be resolved using a base URI using the algorithm defined in <xref section="5" target="RFC3986"/>.
          When resolving nested ARI content, the base URI of any interior resolution is the next-outer ARI in the nested structure.
          The outermost ARI SHALL NOT be a URI Reference because it will have no base URI to resolve with.
        </t>
        <t>
          Because a relative-path ARI with no path separators is considered to be an untyped literal, an ARI reference SHALL contain at least one path separator.
          For the case where the ARI reference is to a sibling object from the base URI the relative path SHOULD be of the form "./" to include the path separator.
        </t>
        <t>
          When resolving nested ARI content, the parameters of the URI reference SHALL be preserved in the resolved ARI.
          This behavior is equivalent to the query parameter portion when resolving a generic URI reference.
        </t>
        <sourcecode type="abnf">
; Relative ARI must be resolved before interpreting
relative-ari = path-nonempty [paramlist]

; Non-empty absolute or relative path
path-nonempty = path-absolute / path-noscheme
        </sourcecode>
      </section>
      <section anchor="sec-text-patterns">
        <name>Patterns</name>
        <t>
          Because each of the text form use path segments to delimit the components of the absolute ARI, and due to the restrictions of the ARI path segment content, it is possible for URI reserved characters to be able to provide wildcard-type patterns.
          Although the form is similar, an ARI Pattern is not itself an ARI and they cannot be used interchangeably.
          The context used to interpret and match an ARI Pattern SHALL be explicit and separate from that used to interpret and dereference an ARI.
        </t>
        <t>
          The ARI Pattern SHALL NOT ever take the form of a URI Reference; only as an absolute URI.
          An ARI Pattern SHALL NOT ever contain parameters, only identity.
        </t>
        <t>
          An ARI Pattern has no optional path segments.
          When used as a literal ARI pattern the path SHALL have two segments.
          When used as an object-reference ARI pattern the path SHALL have three segments.
        </t>
        <t>
          The single-wildcard is the only defined segment pattern and a segment can either be a real ID or a single wildcard.
        </t>
        <sourcecode type="abnf">
ari-pat = "ari:" ari-pat-ssp
ari-pat-ssp = ari-pat-literal / ari-pat-objref

ari-pat-literal = "/" id-pat "/" id-pat
ari-pat-objref = "/" id-pat "/" id-pat "/" id-pat

; The non-wildcard symbol is the same as ARI syntax
id-pat = wildcard / (*pchar)
wildcard = "*"
        </sourcecode>
      </section>
    </section>
    <section anchor="sec-binary-form">
      <name>ARI Binary Form</name>
      <t>
        This section defines how the data model explained in <xref target="sec-ari-structure"/> is encoded as a binary sequence conforming to the CBOR syntax of <xref target="RFC8949"/>.
        Within this section the term "item" is used to mean the CBOR-decoded data item which follows the logical model of CDDL <xref target="RFC8610"/>.
      </t>
      <t>
        The binary form of the URI is intended to be used for machine-to-machine interchange so it is missing some of the human-friendly shortcut features of the ARI text form from <xref target="sec-text-form"/>.
        It still follows the same logical data model so it has a one-for-one representation of all of the styles of text-form ARI.
      </t>
      <t>
        A new CBOR tag TBD999999 has been registered to indicate that an outer CBOR item is a binary-form ARI.
        This is similar in both syntax and semantics to the "ari" URI scheme in that for a nested ARI structure, only the outer-most ARI need be tagged.
        The inner ARIs are necessarily interpreted as such based on the nested ARI schema of this section.
      </t>
      <t>
        While this text description is normative, the CDDL schema in this section provides a more explicit and machine-parsable binary schema.
      </t>
      <sourcecode type="cddl">
; An ARI can be tagged if helpful
ari = ari-notag / #6.999999(ari-notag)
ari-notag = lit-ari / ari-objref
      </sourcecode>
      <section>
        <name>Intermediate CBOR</name>
        <t>
The CBOR item form is used as an intermediate encoding between the ARI data and the ultimate binary encoding.
When decoding a binary form ARI, the CBOR must be both "well-formed" according to <xref target="RFC8949"/> and "valid" according to the CDDL model of this specification.
Implementations are encouraged, but not required, to use a streaming form of CBOR encoder/decoder to reduce memory consumption of an ARI handler.
For simple implementations or diagnostic purposes, a two stage conversion between ARI--CBOR and CBOR--binary can be more easily understood and tested.
        </t>
      </section>
      <section anchor="sec-binary-literal">
        <name>Literals</name>
        <t>
          Based on the structure of <xref target="sec-struct-literal"/>, the binary form of the literal ARI contains a data item along with an optional AMP primitive type.
          In order to keep the encoding as short as possible, the untyped literal is encoded as the simple value itself.
          Because the typed literal and the object-reference forms uses CBOR array framing, this framing is used to disambiguate from the pure-value encoding of the <tt>lit-notype</tt> CDDL symbol.
        </t>
        <t>
          When present, the primitive type SHALL be an integer enumeration.
          When untyped, the decoded literal value SHALL be one of the primitive types named by the <tt>lit-notype</tt> CDDL symbol.
          When typed, the decoded literal value MAY be any valid CBOR item conforming to the AMP primitive type definition.
        </t>
        <t>
          Some example of the forms for a literal are below.
          These first are untyped primitive values:
        </t>
        <sourcecode type="cbor">
true
        </sourcecode>
        <sourcecode type="cbor">
"text"
        </sourcecode>
        <sourcecode type="cbor">
10
        </sourcecode>
        <t>
          And these are typed values:
        </t>
        <sourcecode type="cbor">
[4, 10]
        </sourcecode>
        <sourcecode type="cbor">
[15, &lt;&lt;10&gt;&gt;]
        </sourcecode>
        <t>
          The literal-value ARI has a corresponding CDDL definition of:
        </t>
        <sourcecode type="cddl">
lit-ari = lit-typeval / lit-notype

lit-notype = bool / int / float / tstr / bstr

lit-typeval = $lit-typeval .within lit-typeval-struct
lit-typeval-struct = [
  lit-type: (int32 .ge 0),
  lit-value: any
]

; FIXME: will expand with assigned types
$lit-typeval /= [1, bool]
$lit-typeval /= [2, uint .size 1] ; 1-byte
$lit-typeval /= [4, int32] ; 4-byte
$lit-typeval /= [5, uint32] ; 4-byte
$lit-typeval /= [6, uint64] ; 8-byte
$lit-typeval /= [7, int64] ; 8-byte
$lit-typeval /= [8, float16 / float32]
$lit-typeval /= [9, float64]
$lit-typeval /= [10, tstr]
$lit-typeval /= [11, bstr]

$lit-typeval /= [12, int]
$lit-typeval /= [13, int]
$lit-typeval /= [14, tstr .regexp "[A-Za-z].*"]
$lit-typeval /= [15, bstr .cbor any]
        </sourcecode>
      </section>
      <section>
        <name>Object References</name>
        <t>
          Based on the structure of <xref target="sec-struct-objref"/>, the binary form of the object reference ARI is a CBOR-encoded item.
          An ARI SHALL be encoded as a CBOR array with at least three items corresponding to the namespace-id, object-type, and object-id.
          Those three items are referred to as the object identity.
          The optional fourth item of the array is the parameter list.
        </t>
        <t>
          The namespace-id SHALL be present only as an integer enumeration.
          The object-type SHALL be present only as an integer enumeration.
          The object-id SHALL be present as either a text name or an integer enumeration.
          The processing of text name object identity components by an Agent is optional and SHALL be communicated to any associated Manager prior to encoding any ARIs for that Agent.
        </t>
        <t>
          When present, the parameter list SHALL be a CBOR array containing either ARI or ARI collection items.
          The CBOR tag 41 (meaning a homogeneous array per <xref target="IANA-CBOR"/>) SHALL be used to indicate that a parameter item is an ARI collection.
          All other, untagged parameter items SHALL be handled as an ARI.
        </t>
        <t>
          An example object reference without parameters is:
        </t>
        <sourcecode type="cbor">
[41, -1, 0]
        </sourcecode>
        <t>
          Another example object reference with parameters is:
        </t>
        <sourcecode type="cbor">
[41, -2, 3, ["a param", [4, 10]]]
        </sourcecode>
        <t>
          The object-reference ARI has a corresponding CDDL definition of:
        </t>
        <sourcecode type="cddl">
ari-objref = [obj-ident, ?params]
obj-ident = (
  ns-id,
  obj-type,
  obj-id,
)
ns-id = int64
obj-type = $obj-type-reg .within (int32 .lt 0)
obj-id = (int32 .ge 0) / tstr
params = [*ari-or-ac]

ari-or-ac = ari / ac
ac = #6.41([*ari])

; FIXME: will expand with assigned types
$obj-type-reg = nint
        </sourcecode>
      </section>
      <section anchor="sec-binary-reference">
        <name>URI References</name>
        <t>TBD</t>
      </section>
      <section anchor="sec-binary-patterns">
        <name>Patterns</name>
        <t>TBD</t>
      </section>
    </section>
    <section anchor="sec-transcoding">
      <name>Transcoding Considerations</name>
      <t>
        When translating literal types into text form and code point lookup tables are available, the primitive type SHOULD be converted to its text name.
        When translating literal types from text form and code point lookup tables are available, the primitive type SHOULD be converted from its text name.
        The conversion between AMP primitive type name and enumeration requires a lookup table based on the registrations in <xref target="tab-iana-dtnmp-primitive-types"/>.
      </t>
      <t>
        When translating literal values into text form, it is necessary to canonicalize the CBOR extended diagnostic notation of the item.
        The following applies to generating text form from CBOR items:
      </t>
      <ul>
        <li>The canonical text form of CBOR <tt>bool</tt> values SHALL be the forms identified in <xref section="8" target="RFC8949"/>.</li>
        <li>The canonical text form of CBOR <tt>int</tt> and <tt>float</tt> values SHALL be the decimal form defined in <xref section="8" target="RFC8949"/>.</li>
        <li>The canonical text form of CBOR <tt>tstr</tt> values SHALL be the definite-length, non-concatenated form defined in <xref section="8" target="RFC8949"/>.</li>
        <li>The canonical text form of CBOR <tt>bstr</tt> values SHALL be the definite-length, base16 ("h" prefix), non-concatenated form defined in <xref section="8" target="RFC8949"/>.</li>
        <li>When presenting the AMP primitive type of <tt>CBOR</tt> the values SHALL be the embedded CBOR form defined in <xref section="G.3" target="RFC8610"/>.</li>
      </ul>
      <t>
        When translating object references into text form and code point lookup tables are available, any enumerated item SHOULD be converted to its text name.
        When translating object references from text form and code point lookup tables are available, any enumerated item SHOULD be converted from its text name.
        The conversion between AMP object-type name and enumeration requires a lookup table based on the registrations in <xref target="tab-iana-dtnmp-object-types"/>.
        The conversion between name and enumeration for either namespace-id or object-id require lookup tables based on ADMs and ODMs known to the processing entity.
      </t>
    </section>
    <section>
      <name>Interoperability Considerations</name>
      <t>
                DTN challenged networks might interface with better 
                resourced networks that are managed using non-DTN 
                management protocols. When this occurs, the federated
                network architecture might need to define management
                gateways that translate between DTN and non-DTN
                management approaches. 
      </t>
      <aside>
        <t>
                NOTE: It is also possible for DTN management be used
                end-to-end because this approach can also operate in
                less challenged networks. The opposite is not true; non-DTN 
                management approaches should not be assumed to work in DTN 
                challenged networks. 
      </t>
      </aside>
      <t>
                Where possible, ARIs should be translatable to other, 
                non-DTN management naming schemes. This translation might
                not be 1-1, as the features of the ADM may differ from
                features in other management naming schemes. Therefore,
                it is unlikely that a single naming scheme can be used for
                both DTN and non-DTN management.
      </t>
    </section>
    <section>
      <name>Security Considerations</name>
      <t>
        Because ADM and ODM namespaces are defined by any entity, no security or permission meaning can be inferred simply from the expression of namespace.
      </t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t>
        This section provides guidance to the Internet Assigned Numbers Authority (IANA) regarding registration of schema and namespaces related to the ADM Resource Identifier (ARI), in accordance with BCP 26 <xref target="RFC1155"/>.
      </t>
      <section anchor="sec-iana-scheme">
        <name>URI Schemes Registry</name>
        <t>
          This document defines a new URI scheme "ari" in <xref target="sec-text-form"/>.
          A new entry has been added to the "URI Schemes" registry <xref target="IANA-URI"/> with the following parameters.
        </t>
        <dl newline="true">
          <dt>Scheme name:</dt>
          <dd>ari</dd>
          <dt>Status:</dt>
          <dd>Permanent</dd>
          <dt>Applications/protocols that use this scheme name:</dt>
          <dd>The scheme is used by AMP Managers and Agents to identify managed objects.</dd>
          <dt>Contact:</dt>
          <dd>IETF Chair &lt;chair@ietf.org&gt;</dd>
          <dt>Change controller:</dt>
          <dd>IESG &lt;iesg@ietf.org&gt;</dd>
          <dt>Reference:</dt>
          <dd><xref target="sec-text-form"/> of [This document].</dd>
        </dl>
      </section>
      <section anchor="sec-iana-cbor-tag">
        <name>CBOR Tags Registry</name>
        <t>
          This document defines a new CBOR tag TBD999999 in <xref target="sec-binary-form"/>.
          A new entry has been added to the "CBOR Tags" registry <xref target="IANA-CBOR"/> with the following parameters.
        </t>
        <dl newline="true">
          <dt>Tag:</dt>
          <dd>TBD999999</dd>
          <dt>Data Item:</dt>
          <dd>multiple</dd>
          <dt>Semantics:</dt>
          <dd>Used to tag a binary-form DTNMP ARI</dd>
          <dt>Reference:</dt>
          <dd><xref target="sec-binary-form"/> of [This document].</dd>
        </dl>
      </section>
      <section>
        <name>DTN Management Protocol Registry</name>
        <t>
          This document defines a new sub-registry "Primitive Types" within the "DTN Management Protocol" registry <xref target="IANA-DTNMP"/> containing the following initial entries.
          Enumerations in this sub-registry are non-negative integers representable as CBOR <tt>uint</tt> type with an argument shorter than 4-bytes.
          The registration procedure for this sub-registry is Specification Required.
        </t>
        <table anchor="tab-iana-dtnmp-primitive-types">
          <name>Primitive Types</name>
          <thead>
            <tr>
              <th>Enumeration</th>
              <th>Name</th>
              <th>Reference</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <em>TBD1</em>
              </td>
              <td>
                <tt>BOOL</tt>
              </td>
              <td>[This document]</td>
              <td>A native boolean value.</td>
            </tr>
            <tr>
              <td>
                <em>TBD2</em>
              </td>
              <td>
                <tt>BYTE</tt>
              </td>
              <td>[This document]</td>
              <td>An 8-bit unsigned integer.</td>
            </tr>
            <tr>
              <td>
                <em>TBD4</em>
              </td>
              <td>
                <tt>INT</tt>
              </td>
              <td>[This document]</td>
              <td>A 32-bit signed integer.</td>
            </tr>
            <tr>
              <td>
                <em>TBD5</em>
              </td>
              <td>
                <tt>UINT</tt>
              </td>
              <td>[This document]</td>
              <td>A 32-bit unsigned integer.</td>
            </tr>
            <tr>
              <td>
                <em>TBD6</em>
              </td>
              <td>
                <tt>VAST</tt>
              </td>
              <td>[This document]</td>
              <td>A 64-bit signed integer.</td>
            </tr>
            <tr>
              <td>
                <em>TBD7</em>
              </td>
              <td>
                <tt>UVAST</tt>
              </td>
              <td>[This document]</td>
              <td>A 64-bit unsigned integer.</td>
            </tr>
            <tr>
              <td>
                <em>TBD8</em>
              </td>
              <td>
                <tt>REAL32</tt>
              </td>
              <td>[This document]</td>
              <td>A 32-bit <xref target="IEEE.754-2019"/> floating point number.</td>
            </tr>
            <tr>
              <td>
                <em>TBD9</em>
              </td>
              <td>
                <tt>REAL64</tt>
              </td>
              <td>[This document]</td>
              <td>A 64-bit <xref target="IEEE.754-2019"/> floating point number.</td>
            </tr>
            <tr>
              <td>
                <em>TBD10</em>
              </td>
              <td>
                <tt>STR</tt>
              </td>
              <td>[This document]</td>
              <td>A text string composed of characters.</td>
            </tr>
            <tr>
              <td>
                <em>TBD11</em>
              </td>
              <td>
                <tt>BYTESTR</tt>
              </td>
              <td>[This document]</td>
              <td>A byte string composed of 8-bit values.</td>
            </tr>
            <tr>
              <td>
                <em>TBD12</em>
              </td>
              <td>
                <tt>TV</tt>
              </td>
              <td>[This document]</td>
              <td/>
            </tr>
            <tr>
              <td>
                <em>TBD13</em>
              </td>
              <td>
                <tt>TS</tt>
              </td>
              <td>[This document]</td>
              <td/>
            </tr>
            <tr>
              <td>
                <em>TBD14</em>
              </td>
              <td>
                <tt>LABEL</tt>
              </td>
              <td>[This document]</td>
              <td>A text label of a parent object parameter. This is only valid in a nested parameterized ARI.</td>
            </tr>
            <tr>
              <td>
                <em>TBD15</em>
              </td>
              <td>
                <tt>CBOR</tt>
              </td>
              <td>[This document]</td>
              <td>A byte string containing an encoded CBOR item. The structure is opaque to the Agent but guaranteed well-formed for the ADM using it.</td>
            </tr>
            <tr>
              <td>TBD16 to 65279</td>
              <td/>
              <td/>
              <td>
                <em>Unassigned</em>
              </td>
            </tr>
            <tr>
              <td>65280 to 2147483647</td>
              <td/>
              <td>[This document]</td>
              <td>Enumerations that are 2**16-2**8 and larger are reserved for private or experimental use.</td>
            </tr>
          </tbody>
        </table>
        <t>
          This document defines a new sub-registry "Managed Object Types" within the "DTN Management Protocol" registry <xref target="IANA-DTNMP"/> containing the following initial entries.
          Enumerations in this sub-registry are negative integers representable as CBOR <tt>nint</tt> type with an argument shorter than 4-bytes.
          The registration procedure for this sub-registry is Specification Required.
        </t>
        <table anchor="tab-iana-dtnmp-object-types">
          <name>Managed Object Types</name>
          <thead>
            <tr>
              <th>Enumeration</th>
              <th>Name</th>
              <th>Reference</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <em>-TBD1</em>
              </td>
              <td>
                <tt>MDAT</tt>
              </td>
              <td>[This document]</td>
              <td>ADM Metadata</td>
            </tr>
            <tr>
              <td>
                <em>-TBD2</em>
              </td>
              <td>
                <tt>CONST</tt>
              </td>
              <td>[This document]</td>
              <td>Constant</td>
            </tr>
            <tr>
              <td>
                <em>-TBD3</em>
              </td>
              <td>
                <tt>CTRL</tt>
              </td>
              <td>[This document]</td>
              <td>Control</td>
            </tr>
            <tr>
              <td>
                <em>-TBD4</em>
              </td>
              <td>
                <tt>EDD</tt>
              </td>
              <td>[This document]</td>
              <td>Externally Defined Data</td>
            </tr>
            <tr>
              <td>
                <em>-TBD5</em>
              </td>
              <td>
                <tt>MAC</tt>
              </td>
              <td>[This document]</td>
              <td>Macro</td>
            </tr>
            <tr>
              <td>
                <em>-TBD6</em>
              </td>
              <td>
                <tt>OPER</tt>
              </td>
              <td>[This document]</td>
              <td>Operator</td>
            </tr>
            <tr>
              <td>
                <em>-TBD7</em>
              </td>
              <td>
                <tt>RPTT</tt>
              </td>
              <td>[This document]</td>
              <td>Report Template</td>
            </tr>
            <tr>
              <td>
                <em>-TBD8</em>
              </td>
              <td>
                <tt>SBR</tt>
              </td>
              <td>[This document]</td>
              <td>State-Based Rule</td>
            </tr>
            <tr>
              <td>
                <em>-TBD9</em>
              </td>
              <td>
                <tt>TBLT</tt>
              </td>
              <td>[This document]</td>
              <td>Table Template</td>
            </tr>
            <tr>
              <td>
                <em>-TBD10</em>
              </td>
              <td>
                <tt>TBR</tt>
              </td>
              <td>[This document]</td>
              <td>Time-Based Rule</td>
            </tr>
            <tr>
              <td>
                <em>-TBD11</em>
              </td>
              <td>
                <tt>VAR</tt>
              </td>
              <td>[This document]</td>
              <td>Variable</td>
            </tr>
            <tr>
              <td>TBD12 to 65279</td>
              <td/>
              <td/>
              <td>
                <em>Unassigned</em>
              </td>
            </tr>
            <tr>
              <td>65280 to 2147483647</td>
              <td/>
              <td>[This document]</td>
              <td>Enumerations that are 2**16-2**8 and larger are reserved for private or experimental use.</td>
            </tr>
          </tbody>
        </table>
        <t>
          This document defines a new sub-registry "Application Data Models" within the "DTN Management Protocol" registry <xref target="IANA-DTNMP"/> containing the following initial entries.
          Enumerations in this sub-registry are non-negative integers representable as CBOR <tt>uint</tt> type with an argument shorter than 8-bytes.
          The registration procedure for this sub-registry is Specification Required.
        </t>
        <table anchor="tab-iana-dtnmp-adms">
          <name>Application Data Models</name>
          <thead>
            <tr>
              <th>Enumeration</th>
              <th>Name</th>
              <th>Reference</th>
              <th>Notes</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>0</td>
              <td/>
              <td>[This document]</td>
              <td>Value zero is reserved.</td>
            </tr>
            <tr>
              <td>1 to 4294967296</td>
              <td/>
              <td/>
              <td>
                <em>Unassigned</em>
              </td>
            </tr>
            <tr>
              <td>4294967296 and larger</td>
              <td/>
              <td>[This document]</td>
              <td>Enumerations that are larger than 32-bit are reserved for private or experimental use.</td>
            </tr>
          </tbody>
        </table>
        <t>
          The Operational Data Models code points are all private use, so do not need to have an IANA registry defined.
        </t>
      </section>
    </section>
  </middle>
  <back>
    <!-- <displayReference target="IEEE.754-2019" to="IEEE754"/> -->
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA-CBOR" target="https://www.iana.org/assignments/cbor-tags/">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IANA-DTNMP" target="https://www.iana.org/assignments/TBD/">
          <front>
            <title>Delay-Tolerant Networking (DTN) Management Protocol</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IANA-URI" target="https://www.iana.org/assignments/uri-schemes/">
          <front>
            <title>Uniform Resource Identifier (URI) Schemes</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml-misc/reference.IEEE.754-2019.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7595.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9171.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1155.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4838.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7320.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8610.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8820.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-dtn-ama.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.birrane-dtn-adm.xml"/>
      </references>
    </references>
    <section>
      <name>Examples</name>
      <t>
        The examples in this section rely on the ADM and ODM definitions in <xref target="tab-ex-adms"/> and <xref target="tab-ex-odms"/> respectively.
      </t>
      <table anchor="tab-ex-adms">
        <name>Example ADMs</name>
        <thead>
          <tr>
            <th>Enumeration</th>
            <th>Name</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>10</td>
            <td>adm10</td>
          </tr>
          <tr>
            <td>20</td>
            <td>adm20</td>
          </tr>
        </tbody>
      </table>
      <table anchor="tab-ex-odms">
        <name>Example ODMs</name>
        <thead>
          <tr>
            <th>Enumeration</th>
            <th>Name</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>-10</td>
            <td>odm10</td>
          </tr>
        </tbody>
      </table>
      <t>
        Given those namespaces, the example objects are listed in <xref target="tab-ex-adms"/> where the Namespace column uses the ARI text form convention.
      </t>
      <table anchor="tab-ex-objects">
        <name>Example Objects</name>
        <thead>
          <tr>
            <th>Namespace</th>
            <th>Object Type</th>
            <th>Enumeration</th>
            <th>Name</th>
            <th>Signature</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>adm10</td>
            <td>EDD</td>
            <td>3</td>
            <td>num_bytes</td>
            <td>()</td>
          </tr>
          <tr>
            <td>adm10</td>
            <td>CTRL</td>
            <td>2</td>
            <td>do_thing</td>
            <td>(AC targets, UINT count)</td>
          </tr>
          <tr>
            <td>adm10</td>
            <td>RPTT</td>
            <td>1</td>
            <td>rpt_with_param</td>
            <td>(ARI var, STR text)</td>
          </tr>
          <tr>
            <td>!odm10</td>
            <td>VAR</td>
            <td>1</td>
            <td>my_counter</td>
            <td>()</td>
          </tr>
        </tbody>
      </table>
      <t>
        Each of the following examples illustrate the comparison of ARI forms in different situations, covering the gamut of what can be expressed by an ARI.
      </t>
      <section>
        <name>Typed Literal</name>
        <t>
          This is the literal value 4 interpreted as a 32-bit unsigned integer.
          The ARI text (which is identical to its percent-encoded form) is:
        </t>
        <sourcecode type="uri">ari:/UINT/4</sourcecode>
        <t>
          which is translated to enumerated form:
        </t>
        <sourcecode type="uri">ari:/5/4</sourcecode>
        <t>
          and converted to CBOR item:
        </t>
        <sourcecode type="cbor">[5, 4]</sourcecode>
        <t>
          and finally to the binary string of:
        </t>
        <sourcecode>0x820504</sourcecode>
      </section>
      <section>
        <name>Complex CBOR Literal</name>
        <t>
          This is a literal value embedding a complex CBOR structure.
          The CBOR diagnostic expression being encoded is
        </t>
        <sourcecode>{"test": [3, 4.5]}</sourcecode>
        <t>
          which is CBOR-encoded to a byte string and percent-encoded to the URL path:
        </t>
        <sourcecode type="uri">ari:/CBOR/h%27A164746573748203F94480%27</sourcecode>
        <t>
          which is translated to enumerated form:
        </t>
        <sourcecode type="uri">ari:/15/h%27A164746573748203F94480%27</sourcecode>
        <t>
          and converted to CBOR item (note the byte string is no longer text-encoded):
        </t>
        <sourcecode type="cbor">[15, h'A164746573748203F94480']</sourcecode>
        <t>
          and finally to the binary string of:
        </t>
        <sourcecode>0x820F4BA164746573748203F94480</sourcecode>
      </section>
      <section>
        <name>Non-parameterized Object Reference</name>
        <t>
          This is a non-parameterized <tt>num_bytes</tt> object in the ADM namespace.
          The ARI text (which is identical to its percent-encoded form) is:
        </t>
        <sourcecode type="uri">ari:/adm10/edd/num_bytes</sourcecode>
        <t>
          which is translated to enumerated form:
        </t>
        <sourcecode type="uri">ari:/10/-4/3</sourcecode>
        <t>
          and converted to CBOR item:
        </t>
        <sourcecode type="cbor">[10, -4, 3]</sourcecode>
        <t>
          and finally to the binary string of:
        </t>
        <sourcecode>0x830A2303</sourcecode>
      </section>
      <section>
        <name>Parameterized Object Reference</name>
        <t>
          This is an parameterized <tt>do_thing</tt> object in the ADM namespace.
          Additionally, the parameters include two relative-path ARI References to other objects in the same ADM, which are resolved after text-decoding.
          The ARI text (which is identical to its percent-encoded form) is:
        </t>
        <sourcecode type="uri">ari:/adm10/ctrl/do_thing([../edd/num_bytes,/!odm10/var/my_counter],3)</sourcecode>
        <t>
          which is translated to enumerated and resolved form:
        </t>
        <sourcecode type="uri">ari:/10/-3/2([/10/-4/3,/-10/-11/1],3)</sourcecode>
        <t>
          and converted to CBOR item:
        </t>
        <sourcecode type="cbor">
[10, -3, 2, [
  41([
    [10, -4, 3],
    [10, -11, 1]
  ]),
  3
]]
        </sourcecode>
        <t>
          and finally to the binary string of:
        </t>
        <sourcecode>0x840A220282D82982830A2303830A2A0103</sourcecode>
      </section>
      <section>
        <name>Recursive Structure with Percent Encodings</name>
        <t>
          This is a complex example having nested ARIs, some with percent-encoding needed.
          The human-friendly (but not valid URI) text for this case is:
        </t>
        <sourcecode>ari:/adm10/rptt/rpt_with_param("text")</sourcecode>
        <t>
          which is percent encoded to the real URI:
        </t>
        <sourcecode type="uri">ari:/adm10/rptt/rpt_with_param(%22text%22)</sourcecode>
        <t>
          which is translated to enumerated form:
        </t>
        <sourcecode type="uri">ari:/10/-7/1(%22text%22)</sourcecode>
        <t>
          and converted to CBOR item:
        </t>
        <sourcecode type="cbor">[10, -7, 1, ["text"]]</sourcecode>
        <t>
          and finally to the binary string of:
        </t>
        <sourcecode>0x840A2601816474657874</sourcecode>
      </section>
      <!--
          <tr>
            <td>"num_bytes"</td>
              <td> Shortform encoding where the N1/N2 namespace can be 
                        assumed.</td>
            </tr>
            <tr>
              <td>"num_bytes_if(String if_name)"</td>
              <td> Formal parameter definition of num_bytes object that 
                        accepts a string interface name.</td>
            </tr>
            <tr>
              <td>"num_bytes_if(String if_name=eth0)"</td>
              <td> Formal parameter definition of num_bytes object that 
                        accepts a string interface name with a default value.</td>
            </tr>
            <tr>
              <td>"num_bytes_if()"</td>
              <td> Actual parameter using the default value of eth0.</td>
            </tr>
            <tr>
              <td>"num_bytes_if(eth0)"</td>
              <td> Actual parameter of eth0.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(Int n1 = 0, Int n2 = 3)"</td>
              <td> Formal parameter of object obj1 in anonymous namespace
                        taking 2 default parameters.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(, )"</td>
              <td> Actual parameter using the default values of 0 for n1 
                        and 3 for n2.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(, 4)"</td>
              <td> Actual parameter using the default value of 0 for n1.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(4, )"</td>
              <td> Actual parameter using the default value of 3 for n2.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(4,4)"</td>
              <td> Actual parameters provided for all obj1 parameters.</td>
            </tr>
            <tr>
              <td>"ari:/obj1(&lt;input&gt;,4)"</td>
              <td> Actual parameters provided for all obj1 parameters,
                        with the value of the first parameter taken from some
                        other parameter named "input".</td>
            </tr>
            <tr>
              <td>"ari:uint(4)"</td>
              <td> The Literal value 4 interpreted as a 32-bit unsigned 
                        integer.</td>
            </tr>
          -->
    </section>
  </back>
</rfc>
