Skip to main content

DTNMA Application Data Model (ADM) YANG Syntax
draft-ietf-dtn-adm-yang-08

Document Type Active Internet-Draft (dtn WG)
Authors Edward J. Birrane , Brian Sipos , Justin Ethier , Per Andersson
Last updated 2026-11-02
Replaces draft-bsipos-dtn-amp-yang, draft-ietf-dtn-adm
RFC stream Internet Engineering Task Force (IETF)
Intended RFC status (None)
Formats
Yang Validation 0 errors, 14 warnings
Additional resources Mailing list discussion
Stream WG state WG Document
Document shepherd (None)
IESG IESG state I-D Exists
Consensus boilerplate Unknown
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-ietf-dtn-adm-yang-08
Delay-Tolerant Networking                                   E.J. Birrane
Internet-Draft                                                  B. Sipos
Intended status: Standards Track                               J. Ethier
Expires: 6 May 2027                                              JHU/APL
                                                            P. Andersson
                                                           Ionio Systems
                                                         2 November 2026

             DTNMA Application Data Model (ADM) YANG Syntax
                       draft-ietf-dtn-adm-yang-08

Abstract

   This document defines a concrete syntax for encoding a Delay-Tolerant
   Networking Management Architecture (DTNMA) Application Data Model
   (ADM) using the syntax and modular structure, but not the full data
   model, of YANG.  Extensions to YANG are defined to capture the
   specifics needed to define DTNMA Application Management Model (AMM)
   objects and to use the Application Resource Identifier (ARI) data-
   value syntax.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 6 May 2027.

Copyright Notice

   Copyright (c) 2026 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights

Birrane, et al.            Expires 6 May 2027                   [Page 1]
Internet-Draft               DTNMA ADM YANG                November 2026

   and restrictions with respect to this document.  Code Components
   extracted from this document must include Revised BSD License text as
   described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Revised BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
     1.1.  Scope . . . . . . . . . . . . . . . . . . . . . . . . . .   4
     1.2.  Terminology . . . . . . . . . . . . . . . . . . . . . . .   4
   2.  ADM Module Syntax . . . . . . . . . . . . . . . . . . . . . .   4
   3.  ADM Module Contents . . . . . . . . . . . . . . . . . . . . .   5
   4.  Inherited YANG Module Processing  . . . . . . . . . . . . . .   7
     4.1.  Direct Reuse  . . . . . . . . . . . . . . . . . . . . . .   7
     4.2.  Restrictions and Exclusions . . . . . . . . . . . . . . .  10
   5.  Built-In Types, TYPEDEFs, and Semantic Types  . . . . . . . .  11
   6.  ADM Module Extensions . . . . . . . . . . . . . . . . . . . .  14
     6.1.  The amm:enum Statement  . . . . . . . . . . . . . . . . .  14
     6.2.  Semantic Type Statements  . . . . . . . . . . . . . . . .  14
       6.2.1.  The type Statement (Named Type Use) . . . . . . . . .  14
       6.2.2.  The amm:ulist Statement . . . . . . . . . . . . . . .  17
       6.2.3.  The amm:dlist Statement . . . . . . . . . . . . . . .  18
       6.2.4.  The amm:umap Statement  . . . . . . . . . . . . . . .  20
       6.2.5.  The amm:tblt Statement  . . . . . . . . . . . . . . .  22
       6.2.6.  The union Statement (Type Union)  . . . . . . . . . .  23
       6.2.7.  The amm:seq Statement . . . . . . . . . . . . . . . .  24
     6.3.  The amm:parameter Statement . . . . . . . . . . . . . . .  25
       6.3.1.  The amm:default Statement . . . . . . . . . . . . . .  27
     6.4.  The typedef Statement (TYPEDEF Object)  . . . . . . . . .  27
     6.5.  The amm:ident Statement . . . . . . . . . . . . . . . . .  29
       6.5.1.  The amm:abstract Statement  . . . . . . . . . . . . .  31
       6.5.2.  The amm:base Statement  . . . . . . . . . . . . . . .  31
     6.6.  The amm:const Statement . . . . . . . . . . . . . . . . .  32
     6.7.  The amm:ctrl Statement  . . . . . . . . . . . . . . . . .  34
       6.7.1.  The amm:result Statement  . . . . . . . . . . . . . .  35
     6.8.  The Config-False leaf Statement (EDD Object)  . . . . . .  36
     6.9.  The amm:oper Statement  . . . . . . . . . . . . . . . . .  38
       6.9.1.  The amm:operand Statement . . . . . . . . . . . . . .  39
     6.10. The amm:sbr Statement . . . . . . . . . . . . . . . . . .  40
       6.10.1.  The amm:min-interval Statement . . . . . . . . . . .  41
       6.10.2.  The amm:max-count Statement  . . . . . . . . . . . .  42
       6.10.3.  The amm:init-enabled Statement . . . . . . . . . . .  42
     6.11. The amm:tbr Statement . . . . . . . . . . . . . . . . . .  42
       6.11.1.  The amm:start Statement  . . . . . . . . . . . . . .  43
     6.12. The amm:var Statement . . . . . . . . . . . . . . . . . .  43
       6.12.1.  The amm:init-value Statement . . . . . . . . . . . .  45
   7.  ADM Author Considerations . . . . . . . . . . . . . . . . . .  45
   8.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  45

Birrane, et al.            Expires 6 May 2027                   [Page 2]
Internet-Draft               DTNMA ADM YANG                November 2026

     8.1.  DTN Management Architecture . . . . . . . . . . . . . . .  45
   9.  Security Considerations . . . . . . . . . . . . . . . . . . .  47
   10. References  . . . . . . . . . . . . . . . . . . . . . . . . .  47
     10.1.  Normative References . . . . . . . . . . . . . . . . . .  47
     10.2.  Informative References . . . . . . . . . . . . . . . . .  47
   Appendix A.  ADM Module for AMM Extensions  . . . . . . . . . . .  49
   Appendix B.  ADM Module for Semantic Type Introspection . . . . .  60
   Appendix C.  ADM Module for AMM Semantic Types and Unions . . . .  66
   Appendix D.  ADM Module for Base Networking Objects . . . . . . .  75
   Appendix E.  IANA Assignments for display-hint  . . . . . . . . .  79
   Appendix F.  ADM Module for DTNMA Agents  . . . . . . . . . . . .  82
   Appendix G.  ADM Module for DTNMA Agent Access Control Lists  . . 127
   Implementation Status . . . . . . . . . . . . . . . . . . . . . . 136
   Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 136
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . . 137

1.  Introduction

   The Delay-Tolerant Networking Management Architecture (DTNMA) of
   [RFC9675] defines a concept for remote management in a challenged
   network environment, and the Application Management Model (AMM) of
   [I-D.ietf-dtn-amm] defines a meta-model for the structure of object
   types and literal-value types used in DTNMA and separates static
   definitions of Application Data Models (ADMs) from dynamic
   Operational Data Models (ODMs).

   This document defines a text representation of an ADM using the types
   and structures of the AMM combined with the syntax and processing
   semantics of YANG modules [RFC7950], while using AMM-specific
   extensions for object and data modeling.  With this representation,
   individual applications can capture their static management
   information in module files and make use of existing YANG processing
   and module-level logic (_e.g._, file naming, revision history,
   imports).

   Because the YANG syntax and data modeling language are closely
   coupled, there is no pre-existing example of using YANG for its
   syntax (and its module infrastructure) while using different domain-
   specific language (DSL) of extensions for data modeling.  Separating
   the syntax from the data modeling is similar in concept to making use
   of ASN.1 syntax of [X.680] without using the SMIv2 data modeling
   language [RFC2578], which is how unrelated things like certificate
   profile of X.509 [RFC5280] use ASN.1 module syntax.

   One way of thinking of this is that the ADM modules use a syntax that
   has "YANG characteristics" but does not make use of all YANG tooling
   or infrastructure and do not interoperate with existing YANG modules
   or their contained data models.

Birrane, et al.            Expires 6 May 2027                   [Page 3]
Internet-Draft               DTNMA ADM YANG                November 2026

1.1.  Scope

   This document defines a specific syntax for representing individual
   revisions of individual ADMs as text files.

   It does not define a representation for the runtime objects and
   literal values modeled by an ADM or ODM.  Encodings of values within
   the AMM are defined in the Application Resource Identifier (ARI)
   specification [I-D.ietf-dtn-ari].  While the Agent ADM provides an
   introspection capability to indicate _which_ objects are present in
   an ODM, encodings of the runtime state of those objects are outside
   of the scope of this document.

   It is not required that the YANG encoding be used for transmission of
   ADM information over the wire in the context of a network deployment.
   Since the AMM is designed to allow for multiple encodings, the
   expression of ADMs in YANG syntax is intended to support translation
   to other encodings without loss of information.

1.2.  Terminology

   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 [RFC2119].

   The terms "Application Data Model", "Application Resource
   Identifier", "Operational Data Model", "Externally Defined Data",
   "Variable", "Constant", "Control", "Literal", "Macro", "Namespace",
   "Operator", "Report", "Report Template", "Rule", "State-Based Rule",
   "Table", and "Time-Based Rule" are used without modification from the
   definitions provided in [I-D.ietf-dtn-amm].

   The terms "Comment", "Keyword", and "Module" are used without
   modification from the definitions provided in [RFC7950].

   Additional terms defined in this document are as follows.

   ADM Module:  The specific use of a YANG module to represent a DTNMA
      ADM.

2.  ADM Module Syntax

   Some aspects of this ADM module profile restrict the allowable
   definitions to conform with Section 4 of [I-D.ietf-dtn-amm] and by
   doing so make YANG modules defining ADMs incompatible with YANG
   modules intended for NETCONF, RESTCONF, or other applications.
   Because of this, YANG modules defining ADMs SHALL be managed
   separately from the "YANG Module Names" registry of [IANA-YANG].  See

Birrane, et al.            Expires 6 May 2027                   [Page 4]
Internet-Draft               DTNMA ADM YANG                November 2026

   the ADM registry defined in Section 9.3 of [I-D.ietf-dtn-ari] for
   registration of ADM modules.  For the remainder of this document, a
   YANG module defining an ADM will be referred to as an "ADM module"
   and a YANG module for any other purpose will be referred to as an
   "Other Module" to differentiate it.

   After explanation of extensions in Section 6, the following minimal
   ADM module will be expanded upon for further examples.

   module example-adm {
     yang-version 1.1;
     namespace "ari://example/adm/";
     prefix example-adm;

     import ietf-amm {
       prefix amm;
     }

     organization
       "Example Org." {
       amm:enum 65535;
     }
     contact
       "Some User <user@example.org>";
     description
       "Example ADM module with YANG syntax.
        The organization name and enumeration are IANA reserved.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2025-01-31 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 1;
   }

                    Figure 1: Minimal Example ADM Module

3.  ADM Module Contents

   An ADM module is identified, as defined in Section 4.1, by the module
   "namespace" having an "ari" scheme.  Within an ADM module, this
   profile makes restrictions in Section 4.2 which are formalized in the
   following table of allowed module substatements.  This table is
   adapted from Section 7.1 of [RFC7950].

Birrane, et al.            Expires 6 May 2027                   [Page 5]
Internet-Draft               DTNMA ADM YANG                November 2026

   The AMM object types of Section 3.4 of [I-D.ietf-dtn-amm] are
   expressed in an ADM module as follows:

   +=================+================================================+
   | AMM Object Type | ADM Module Expression                          |
   +=================+================================================+
   | EDD             | native leaf statement                          |
   +-----------------+------------------------------------------------+
   | TYPEDEF         | native typedef statement                       |
   +-----------------+------------------------------------------------+
   | All other       | AMM extension statement (amm:ident, amm:const, |
   | object types    | amm:ctrl, amm:oper, amm:sbr, amm:tbr, amm:var) |
   +-----------------+------------------------------------------------+

                Table 1: AMM Object Types in an ADM Module

   In each case the argument to the statement is the name of the object
   instance, and in ARI syntax the object is always referenced by its
   AMM object type.  For example, the EDD object named tx_count in
   Section 6.8 is expressed as a leaf statement in the ADM module and is
   referenced in text form as the module-relative path ./EDD/tx_count.

   The "yang-version" of all ADM modules conforming to this document
   SHALL be "1.1".  Later versions of YANG syntax could introduce
   incompatible changes and will need to be examined for consistency
   with the ADM module use.

     +==================+=============+=============================+
     | Substatement     | Cardinality | Reference                   |
     +==================+=============+=============================+
     | yang-version     | 1           | Section 7.1.2 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | namespace        | 1           | Section 7.1.3 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | prefix           | 1           | Section 7.1.4 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | include          | 0..n        | Section 7.1.6 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | import           | 0..n        | Section 7.1.5 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | status           | 0..1        | Section 7.21.2 of [RFC7950] |
     +------------------+-------------+-----------------------------+
     | reference        | 0..1        | Section 7.21.4 of [RFC7950] |
     +------------------+-------------+-----------------------------+
     | organization     | 0..1        | Section 7.1.7 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | description      | 0..1        | Section 7.21.3 of [RFC7950] |
     +------------------+-------------+-----------------------------+

Birrane, et al.            Expires 6 May 2027                   [Page 6]
Internet-Draft               DTNMA ADM YANG                November 2026

     | revision         | 0..n        | Section 7.1.9 of [RFC7950]  |
     +------------------+-------------+-----------------------------+
     | extension        | 0..n        | Section 7.19 of [RFC7950]   |
     +------------------+-------------+-----------------------------+
     | feature          | 0..n        | Section 7.20.1 of [RFC7950] |
     +------------------+-------------+-----------------------------+
     | deviation        | 0..n        | Section 7.20.3 of [RFC7950] |
     +------------------+-------------+-----------------------------+
     | amm:enum         | 1           | Section 6.1                 |
     +------------------+-------------+-----------------------------+
     | typedef (TYPEDEF | 0..n        | Section 6.4                 |
     | object)          |             |                             |
     +------------------+-------------+-----------------------------+
     | amm:const        | 0..n        | Section 6.6                 |
     +------------------+-------------+-----------------------------+
     | amm:ctrl         | 0..n        | Section 6.7                 |
     +------------------+-------------+-----------------------------+
     | leaf (EDD        | 0..n        | Section 6.8                 |
     | object)          |             |                             |
     +------------------+-------------+-----------------------------+
     | amm:oper         | 0..n        | Section 6.9                 |
     +------------------+-------------+-----------------------------+
     | amm:sbr          | 0..n        | Section 6.10                |
     +------------------+-------------+-----------------------------+
     | amm:tbr          | 0..n        | Section 6.11                |
     +------------------+-------------+-----------------------------+
     | amm:var          | 0..n        | Section 6.12                |
     +------------------+-------------+-----------------------------+

                    Table 2: ADM module Substatements

4.  Inherited YANG Module Processing

   The benefit of using the pre-existing YANG syntax is to take
   advantage of both tools that process YANG modules as well as some of
   the syntax and module-level semantics provided by YANG.

4.1.  Direct Reuse

   The following statements and behaviors of YANG are usable within an
   ADM with no modification:

   File Layout:  The existing file naming defined in Section 5.2 of
      [RFC7950] is unchanged for ADM modules.  Because ADM modules
      occupy a separate ecosystem than Other Modules, their file stores
      SHALL be kept separate.

   Modules and Submodules:  The existing concepts and syntax of modules

Birrane, et al.            Expires 6 May 2027                   [Page 7]
Internet-Draft               DTNMA ADM YANG                November 2026

      and submodules defined in Section 5.1 of [RFC7950] is unchanged
      for ADM modules.  Because ADM modules occupy a separate ecosystem
      than Other Modules, there will not be any cross-imports between
      the two ecosystems.  There is no harm in including an ADM module
      in an Other Module store, but it will have no data definitions
      usable with NETCONF, RESTCONF, _etc._

   Module Naming:  The existing module naming convention and
      recommendation from Section 4.1 of [RFC8407] is strengthened to a
      requirement for ADM modules.  All ADM modules SHALL be named by
      concatenating from the ADM namespace reference: the organization
      ID, a dash "-", and the model ID.

   Module Importing:  The existing concept and syntax of importing a
      module namespace, to reference objects in another module, defined
      in Section 5.1.1 of [RFC7950] is unchanged for ADM modules.
      Because the import includes a specific revision, the ARI
      references to objects in that imported module do not need any ADM
      revision information.

   Module Prefix:  The existing concept and syntax of the "prefix"
      statement defined in Section 7.1.4 of [RFC7950] is unchanged for
      ADM modules.  The only aspect of ADM modules that the prefix
      applies to, however, are references to feature names from "if-
      feature" statements.

   Module Namespace:  Although an ADM module has no use for an XML
      namespace (as defined in Section 5.3 of [RFC7950]), the
      "namespace" statement is used to provide an explicit ARI namespace
      reference (see Section 3.4 of [I-D.ietf-dtn-ari]).  For ADM
      modules, the "namespace" statement argument SHALL be the text-form
      ARI referencing the ADM itself.

      For example, the ADM "example-adm" will have a namespace of
      ari://example/adm/ which is valid YANG but does not conform to the
      guidelines of Section 4.9 of [RFC8407].

   Module Organization:  The existing concept and use of the
      "organization" statement defined in Section 7.1.7 of [RFC7950] is
      unchanged for ADM modules.  The organization statement is
      augmented for ADM modules by adding an amm:enum substatement as
      defined in Section 6.1.

   Name Resolution:  The existing name resolution logic described in
      Section 5.4 of [RFC7950] is unchanged for ADM modules.  Because
      ADM modules are a flat object namespace, the complexity of
      namespaces is significantly simplified compared to Other Modules.

Birrane, et al.            Expires 6 May 2027                   [Page 8]
Internet-Draft               DTNMA ADM YANG                November 2026

   Features:  The existing definition and use of features as described
      in Section 5.6.2 of [RFC7950] is unchanged for ADM modules.  This
      includes the declaration of a "feature" statement within an ADM
      module and the conditioning of the presence of an object on an
      "if-feature" statement.  This also treats feature identifiers as
      module-prefix-qualified references.

   Documentation Statements:  The existing status, description, and
      reference statements are unchanged from their definitions in
      Sections 7.21.2, 7.21.3, and Section 7.21.4 of [RFC7950]
      respectively.

   Reusable Groups:  The existing grouping and uses statements and logic
      described in Section 4.2.6 of [RFC7950] is unchanged for ADM
      modules generally.  Because ADM modules are a flat object
      namespace, the utility of reuse in an ADM module is limited to the
      contents of object definitions as shown in Table 3.  See Section 7
      for author considerations about the distinction between semantic
      type groupings and TYPEDEF instances.

                      +===============+=============+
                      | Substatement  | Cardinality |
                      +===============+=============+
                      | amm:parameter | 0..*        |
                      +---------------+-------------+
                      | amm:operand   | 0..*        |
                      +---------------+-------------+
                      | amm:result    | 0..1        |
                      +===============+=============+
                      | One of the semantic type:   |
                      +===============+=============+
                      | type          | 0..1        |
                      +---------------+-------------+
                      | amm:ulist     | 0..1        |
                      +---------------+-------------+
                      | amm:dlist     | 0..1        |
                      +---------------+-------------+
                      | amm:tblt      | 0..1        |
                      +---------------+-------------+
                      | amm:umap      | 0..1        |
                      +---------------+-------------+
                      | union         | 0..1        |
                      +---------------+-------------+
                      | amm:seq       | 0..1        |
                      +---------------+-------------+

                         Table 3: Allowed grouping
                               Substatements

Birrane, et al.            Expires 6 May 2027                   [Page 9]
Internet-Draft               DTNMA ADM YANG                November 2026

4.2.  Restrictions and Exclusions

   Because of the different interpretation of data definitions for an
   ADM module, the following restrictions are used to limit pre-existing
   valid YANG syntax within an ADM module:

   Built-In Types:  Because ADM modules have data that ultimately
      follows the AMM value model (see Section 3.1 of
      [I-D.ietf-dtn-amm]), the built-in types listed in Section 4.2.4 of
      [RFC7950], the "type" statement of Section 7.4 of [RFC7950], and
      the "typedef" statement of Section 7.3 of [RFC7950] are used to
      express the AMM semantic types and TYPEDEF objects defined in this
      document.  The normative mapping from AMM built-in value types to
      YANG types is defined in Section 5.  YANG built-in types, "type",
      and "typedef" statements SHALL only be used within the semantic
      type statements (Section 6.2) and the TYPEDEF object (Section 6.4)
      as defined by this document, and SHALL NOT be used to model data
      directly the way Other Modules do.

   Data Node Structure:  As defined in this document, there is no direct
      deterministic mapping between the complex, hierarchical, named
      data nodes of YANG and unnamed AMM values.  An ADM module SHALL
      NOT contain any YANG data node statements other than "leaf", among
      them "container", "leaf-list", "list", "anydata", "anyxml", and
      "choice".  The "leaf" statement SHALL be used solely with option
      "config false" to represent EDD objects as defined in Section 6.8.

   Data Presence Versus Value:  Rather than being an extrinsic notion of
      presence or absence, AMM objects can use type unions with the NULL
      type to indicate optional values and AMM values can use the null
      value to represent that state.  In the case of formal parameters,
      the use of a "default" statement is used to indicate behavior when
      an actual parameter is undefined.  In any case, the AMM value is
      always present when defined in the structure of an AMM object.  An
      ADM module SHALL NOT contain any "mandatory" statements.

   Nested Object Definitions:  Because of the flat structure of an ADM,
      the nesting allowed and encouraged by Section 5.5 of [RFC7950],
      are not allowed to be present in an ADM module.  An ADM module
      SHALL contain all AMM object definitions at the top (module)
      level.

   XPath Expressions:  The ADM module makes no use of XML or XPath in
      its definitions or logical constraints, so the behaviors described
      in Section 6.4 of [RFC7950] and in statements containing XPath
      expressions ("must", "when", "path", "augment") do not apply to
      ADM modules.  All references in an ADM module take the form of an
      ARI.

Birrane, et al.            Expires 6 May 2027                  [Page 10]
Internet-Draft               DTNMA ADM YANG                November 2026

   NETCONF Operations:  Because an ADM module will not be used for
      modeling in NETCONF and related protocols, the statements
      associated with NETCONF operations (notably "action",
      "notification", "rpc") SHALL NOT be present in an ADM module.

   Extending Models:  Because the transport of AMM values takes the form
      of an ARI, which does not include identity information the way XML
      elements do, the concept of extending an existing Legacy model by
      another model as described in Section 4.2.8 of [RFC7950] cannot
      apply to an ADM.  The model extension "augment" statement SHALL
      NOT be present in an ADM module.

5.  Built-In Types, TYPEDEFs, and Semantic Types

   As discussed in Section 4.2, the AMM value model of Section 3.1 of
   [I-D.ietf-dtn-amm] is expressed in an ADM module using the native
   YANG type system of [RFC7950].  AMM values do not have explicit data-
   node identifiers and are represented as ARIs at runtime, but the
   static typing of those values within an ADM uses the named types of
   the ietf-amm module with "type" statements and "typedef" statements
   as defined in this document.

   Each AMM built-in value type (see Section 3.1 of [I-D.ietf-dtn-amm])
   maps to a YANG type as shown in Table 4.  Each AMM built-in value
   type is represented as a named type in the ietf-amm module and
   referenced by its module-qualified name (for example, UINT as
   amm:uint).  Each named type wraps the corresponding YANG base type
   (for example, uint32), as shown in Table 4.

Birrane, et al.            Expires 6 May 2027                  [Page 11]
Internet-Draft               DTNMA ADM YANG                November 2026

    +===================+=============================================+
    | AMM Built-In Type | YANG Type                                   |
    +===================+=============================================+
    | NULL              | amm:null (empty)                            |
    +-------------------+---------------------------------------------+
    | BOOL              | amm:bool (boolean)                          |
    +-------------------+---------------------------------------------+
    | BYTE              | amm:byte (uint8)                            |
    +-------------------+---------------------------------------------+
    | INT               | amm:int (int32)                             |
    +-------------------+---------------------------------------------+
    | UINT              | amm:uint (uint32)                           |
    +-------------------+---------------------------------------------+
    | VAST              | amm:vast (int64)                            |
    +-------------------+---------------------------------------------+
    | UVAST             | amm:uvast (uint64)                          |
    +-------------------+---------------------------------------------+
    | REAL32            | amm:real32 (string, ARI text form)          |
    +-------------------+---------------------------------------------+
    | REAL64            | amm:real64 (string, ARI text form)          |
    +-------------------+---------------------------------------------+
    | TEXTSTR           | amm:textstr (string)                        |
    +-------------------+---------------------------------------------+
    | BYTESTR           | amm:bytestr (binary)                        |
    +-------------------+---------------------------------------------+
    | TP                | amm:tp (string, ARI text form)              |
    +-------------------+---------------------------------------------+
    | TD                | amm:td (string, ARI text form)              |
    +-------------------+---------------------------------------------+
    | LABEL             | amm:label (string, ARI text form)           |
    +-------------------+---------------------------------------------+
    | CBOR              | amm:cbor (binary)                           |
    +-------------------+---------------------------------------------+
    | ARITYPE           | amm:aritype (string, ARI text form)         |
    +-------------------+---------------------------------------------+
    | OBJPAT            | amm:objpat (string with a pattern)          |
    +-------------------+---------------------------------------------+
    | LITERAL           | string (ARI text form of any literal value) |
    +-------------------+---------------------------------------------+
    | OBJECT            | string (text form of an ARI referencing an  |
    |                   | object)                                     |
    +-------------------+---------------------------------------------+
    | NAMESPACE         | string (text form of an ARI referencing a   |
    |                   | namespace)                                  |
    +-------------------+---------------------------------------------+

           Table 4: AMM Built-In Value Type to YANG Type Mapping

Birrane, et al.            Expires 6 May 2027                  [Page 12]
Internet-Draft               DTNMA ADM YANG                November 2026

   The AMM built-in types mapped to named types derived from string in
   Table 4 hold the ARI text form of the value ([I-D.ietf-dtn-ari]).
   When an AMM value is present in the syntax of a YANG module, it is
   present only as that text form, without the ari: scheme prefix but in
   many cases _with_ its ARI literal type segment.  For example, a
   REAL64 value of 3.14 is written as the untyped literal 3.14.  A TP
   value is written as its RFC 3339 date-time or fractional-seconds text
   form (_e.g._, /TP/20230102T030405Z), and a TD value as its RFC 3339
   duration or fractional-seconds text form (_e.g._, /TD/PT5S).

   The TD type represents a time delta (an offset between two time
   points), not an absolute point in time.

   The value-class types LITERAL, OBJECT, and NAMESPACE of Section 3.1
   of [I-D.ietf-dtn-amm] are classes of values, and are mapped in
   Table 4.  For each of the DTNMA object types (IDENT, CONST, CTRL,
   EDD, OPER, SBR, TBR, VAR, and TYPEDEF) there is a corresponding
   object reference type of the same name.  A value of an object
   reference type or of the NAMESPACE type is the text form of the ARI
   of the referenced object or namespace ([I-D.ietf-dtn-ari]), and is
   expressed as the string type.  The referenced object type is
   intrinsic to the ARI value itself.  Where an ADM author needs to
   constrain the referenced object type or namespace, a pattern
   substatement on the string type may be applied.  This document does
   not define such patterns.

   Named types, including an AMM built-in type expressed as a named type
   and a TYPEDEF object, are referenced within ADM modules using the
   module-qualified name form <prefix>:<name>, in the same manner as any
   other reference to an object defined in another imported module (see
   Section 5.1.1 of [RFC7950]).  A TYPEDEF is a way for an ADM to apply
   a name and descriptive metadata to a specific semantic type (see
   Section 3.3 of [I-D.ietf-dtn-amm]).  The TYPEDEF is a top-level ADM
   object (see Section 3.4.2 of [I-D.ietf-dtn-amm]) with the syntax in
   Section 6.4.  Because they are ADM objects, TYPEDEFs can be
   referenced by name when necessary, as in the example below.

    type adm-a:mytype;

   Except for the case of a simple "type" with no restrictions or
   annotations, anywhere one of the semantic type statements
   (Section 6.2) occurs in an object definition can be considered as an
   "anonymous" unnamed semantic type.  The behavior in those cases is
   identical to a TYPEDEF just without a name associated with the
   semantic type.

Birrane, et al.            Expires 6 May 2027                  [Page 13]
Internet-Draft               DTNMA ADM YANG                November 2026

6.  ADM Module Extensions

   In order to provide syntax necessary for AMM Object instance
   definitions this document defines, via the DTNMA ADM (Appendix A),
   the following extensions for ADM modules.

6.1.  The amm:enum Statement

   This statement is used to apply an integer enumeration to an ADM
   module, organization, or AMM object.  Integer enumeration enables the
   compressed form of ARI discussed in Section 3.1 of
   [I-D.ietf-dtn-ari].  The argument to this statement is an integer in
   the YANG range 0..2^31-1 to fit within the ARI syntax.  There are no
   substatements defined in this profile.

   All well-known registered ADMs SHALL contain an amm:enum substatement
   within the top module statement and its organization statement.  The
   value in the organization enumeration SHALL agree with the
   registration in the "Namespace Organizations" registry of
   [IANA-DTNMA].

6.2.  Semantic Type Statements

   The statements within this section enable the various semantic type
   classes, as explained in Section 3.3 of [I-D.ietf-dtn-amm].  They are
   all used as substatements within one of the AMM object definition
   statements, sometimes directly (_e.g._, for CONST or EDD typing) and
   sometimes indirectly (_e.g._, for parameter or operand typing), but
   always as a choice between the need for one of the semantic type
   statements.  The Named Type Use (type) and Type Union (union)
   semantic types are expressed with the native YANG statements of
   [RFC7950], while the container and sequence semantic types (such as
   amm:ulist and amm:dlist) are expressed with the AMM extension
   statements defined in this document.

6.2.1.  The type Statement (Named Type Use)

   This statement creates a Named Type Use semantic type (see
   Section 3.3.1 of [I-D.ietf-dtn-amm]) for its parent statement.  It is
   the native YANG "type" statement of [RFC7950].  The argument to this
   statement is a YANG type, which is a module-qualified <prefix>:<name>
   reference to a named type: an AMM built-in value type of the ietf-amm
   module (as mapped in Section 5) or a TYPEDEF or other named type.

   The substatements under this are the native YANG type substatements
   (see Section 7.4.1 of [RFC7950]), such as range, length, and pattern,
   together with the AMM type-annotation extension statements defined in
   this document.  Because this is the native "type" statement, it does

Birrane, et al.            Expires 6 May 2027                  [Page 14]
Internet-Draft               DTNMA ADM YANG                November 2026

   not carry the description, reference, or units statements; those are
   carried by the enclosing TYPEDEF object (Section 6.4) or EDD object
   (Section 6.8) when the semantic type is named.  For compatibility
   reasons, the arguments used for pattern statements SHALL be limited
   to the constructs compatible with I-Regexp of [RFC9485].

     +==================+=============+=============================+
     | Substatement     | Cardinality | Valid for These Types       |
     +==================+=============+=============================+
     | Inherited from base YANG                                     |
     +==================+=============+=============================+
     | description      | 0..1        | any                         |
     +------------------+-------------+-----------------------------+
     | reference        | 0..1        | any                         |
     +------------------+-------------+-----------------------------+
     | units            | 0..1        | any                         |
     +==================+=============+=============================+
     | Display annotations                                          |
     +==================+=============+=============================+
     | amm:display-hint | 0..1        | any                         |
     +------------------+-------------+-----------------------------+
     | amm:int-labels   | 0..1        | Any INTEGER type            |
     +==================+=============+=============================+
     | Value constraints                                            |
     +==================+=============+=============================+
     | range            | 0..1        | Any INTEGER or FLOAT, with  |
     |                  |             | appropriate quantized       |
     |                  |             | values in the argument      |
     +------------------+-------------+-----------------------------+
     | length           | 0..1        | For TEXTSTR as number of    |
     |                  |             | characters.  For BYTESTR or |
     |                  |             | CBOR as number of bytes.    |
     +------------------+-------------+-----------------------------+
     | pattern          | 0..1        | For TEXTSTR only            |
     +------------------+-------------+-----------------------------+
     | amm:cddl         | 0..1        | For CBOR only               |
     +------------------+-------------+-----------------------------+
     | base             | 0..*        | For IDENT only              |
     +------------------+-------------+-----------------------------+

                       Table 5: type Substatements

   Examples of the "type" statement are below, some as simple use and
   some as restriction.

Birrane, et al.            Expires 6 May 2027                  [Page 15]
Internet-Draft               DTNMA ADM YANG                November 2026

    type amm:uint;
    type amm:uint {
      description
        "constrained number";
      units "meter";
      range "3..10";
    }
    type amm:textstr {
      description
        "constrained text size";
      length "10..100";
    }

6.2.1.1.  The amm:display-hint Statement

   This statement provides general purpose tailoring of how AMM values
   are intended to be displayed.  The argument to this statement is the
   text form of the ARI referencing an IDENT object derived from the
   root ari://ietf-amm/IDENT/display-hint object.

   The description of any leaf IDENT derived from this root object SHALL
   contain specific requirements for how the display hint affects text
   form of any associated values, including restrictions on which built-
   in types the hint can be used with.

6.2.1.2.  The amm:int-labels Statement

   This statement provides human-friendly labels for enumerated values
   or bit positions within an integer type.  There is no argument to
   this statement.

   The substatements under this are either "enum" or "bit" statements
   from YANG, each of which define a single value or bit name within the
   type.  A single "amm:int-labels" SHALL NOT use a mix of "enum" and
   "bit" substatements as this would result in ambiguous interpretation.
   When present, each "enum" statement SHALL contain an explicit and
   unique "value" substatement.  When present, each "bit" statement
   SHALL contain an explicit and unique "position" substatement.

Birrane, et al.            Expires 6 May 2027                  [Page 16]
Internet-Draft               DTNMA ADM YANG                November 2026

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | enum         | 0..n        |
                      +--------------+-------------+
                      | bit          | 0..n        |
                      +--------------+-------------+

                         Table 6: amm:int-labels
                              Substatements

6.2.1.3.  The amm:cddl Statement

   This statement provides annotation of allowed content within a CBOR
   type byte string in the form of a Concise Data Definition Language
   (CDDL) fragment.  The argument to this statement is a CDDL fragment
   in accordance with [RFC8610], escaped as necessary to conform to the
   YANG syntax.

   There are no substatements within this statement.

6.2.1.4.  The base Statement (for IDENT types)

   When the type is an IDENT (Section 6.5), this statement is the native
   YANG base substatement (see Section 7.4.1 of [RFC7950]) within the
   identity definition, which constrains the identity to be derived from
   a particular base identity.  The argument to this statement is the
   module-qualified <prefix>:<name> of the required base identity.  The
   identityref base type of [RFC7950] is a separate YANG data type and
   is not part of the AMM/ADM mapping.

   There are no substatements within this statement.

6.2.2.  The amm:ulist Statement

   This statement creates a Uniform List semantic type (see
   Section 3.3.2 of [I-D.ietf-dtn-amm]) for its parent statement.  There
   is no argument to this statement.

Birrane, et al.            Expires 6 May 2027                  [Page 17]
Internet-Draft               DTNMA ADM YANG                November 2026

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | min-elements | 0..1        |
                      +--------------+-------------+
                      | max-elements | 0..1        |
                      +--------------+-------------+
                      | uses         | 0..1        |
                      +==============+=============+
                      | One of the semantic type:  |
                      +==============+=============+
                      | type         | 0..1        |
                      +--------------+-------------+
                      | amm:ulist    | 0..1        |
                      +--------------+-------------+
                      | amm:dlist    | 0..1        |
                      +--------------+-------------+
                      | amm:umap     | 0..1        |
                      +--------------+-------------+
                      | union        | 0..1        |
                      +--------------+-------------+

                            Table 7: amm:ulist
                              Substatements

   Examples of the "amm:ulist" statement are below, some as simple use
   and some as restriction.

   amm:ulist {
     type amm:uint;
   }
   amm:ulist {
     type amm:uint {
       range "3..10";
     }
     min-elements 2;
     max-elements 10;
   }

6.2.3.  The amm:dlist Statement

   This statement creates a Diverse List semantic type (see
   Section 3.3.3 of [I-D.ietf-dtn-amm]) for its parent statement.  There
   is no argument to this statement.

Birrane, et al.            Expires 6 May 2027                  [Page 18]
Internet-Draft               DTNMA ADM YANG                November 2026

   Each of the type use substatements defines a single element within
   the AC, except for the amm:seq which defines a sequence of type-
   matching elements within the AC (rather than as a sub-AC).

                   +=====================+=============+
                   | Substatement        | Cardinality |
                   +=====================+=============+
                   | description         | 0..1        |
                   +---------------------+-------------+
                   | reference           | 0..1        |
                   +=====================+=============+
                   | One or more of the semantic type: |
                   +=====================+=============+
                   | type                | 0..n        |
                   +---------------------+-------------+
                   | amm:ulist           | 0..n        |
                   +---------------------+-------------+
                   | amm:dlist           | 0..n        |
                   +---------------------+-------------+
                   | amm:umap            | 0..n        |
                   +---------------------+-------------+
                   | union               | 0..n        |
                   +---------------------+-------------+
                   | amm:seq             | 0..n        |
                   +---------------------+-------------+

                      Table 8: amm:dlist Substatements

   Examples of the "amm:dlist" statement are below, one as simple
   structure and the other as a complex sequence.

   amm:dlist {
     // each "type" substatement is one element of the AC
     type amm:uint;
     type amm:uint;
   }
   amm:dlist {
     // first AC element is text
     type amm:textstr;
     // remaining 2-10 element are int
     amm:seq {
       type amm:int;
       min-elements 2;
       max-elements 10;
     }
   }

Birrane, et al.            Expires 6 May 2027                  [Page 19]
Internet-Draft               DTNMA ADM YANG                November 2026

6.2.4.  The amm:umap Statement

   This statement creates a Uniform Map semantic type (see Section 3.3.4
   of [I-D.ietf-dtn-amm]) for its parent statement.  There is no
   argument to this statement.

   When present, each of the amm:keys and amm:values substatements
   constrains the associated aspect of all map items to the specific
   type; when absent the aspect is left unconstrained.  Keep in mind
   that AM keys are always constrained to untyped literal values and the
   use of amm:keys can only narrow this constraint.

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | amm:keys     | 0..1        |
                      +--------------+-------------+
                      | amm:values   | 0..1        |
                      +--------------+-------------+

                            Table 9: amm:umap
                              Substatements

Birrane, et al.            Expires 6 May 2027                  [Page 20]
Internet-Draft               DTNMA ADM YANG                November 2026

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | uses         | 0..1        |
                      +==============+=============+
                      | One of the semantic type:  |
                      +==============+=============+
                      | type         | 0..1        |
                      +--------------+-------------+
                      | amm:ulist    | 0..1        |
                      +--------------+-------------+
                      | amm:dlist    | 0..1        |
                      +--------------+-------------+
                      | amm:umap     | 0..1        |
                      +--------------+-------------+
                      | union        | 0..1        |
                      +--------------+-------------+

                          Table 10: amm:keys and
                         amm:values Substatements

   Examples of the "amm:umap" statement are below, some as simple use
   and some as restriction.

   amm:umap {
     description
       "restrict only keys";
     amm:keys {
       type amm:uint;
     }
   }
   amm:umap {
     description
       "Map uint to text values.";
     amm:keys {
       type amm:uint;
     }
     amm:values {
       type amm:textstr;
     }
   }

Birrane, et al.            Expires 6 May 2027                  [Page 21]
Internet-Draft               DTNMA ADM YANG                November 2026

6.2.5.  The amm:tblt Statement

   This statement creates a Table Template semantic type (see
   Section 3.3.5 of [I-D.ietf-dtn-amm]) for its parent statement.  There
   is no argument to this statement.

   The substatements are a combination of "amm:column" statements
   defining table structure and "amm:key", "amm:unique", "min-elements",
   "max-elements" statements defining constraints on the table rows.

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | min-elements | 0..1        |
                      +--------------+-------------+
                      | max-elements | 0..1        |
                      +--------------+-------------+
                      | amm:key      | 0..1        |
                      +--------------+-------------+
                      | amm:unique   | 0..n        |
                      +--------------+-------------+
                      | amm:column   | 0..n        |
                      +--------------+-------------+

                            Table 11: amm:tblt
                              Substatements

   Examples of the "amm:tblt" statement are below.

   amm:tblt {
     amm:column first {
       type amm:uint;
     }
     amm:column second {
       type amm:textstr;
     }
     amm:key "first";
   }

6.2.5.1.  The amm:column Statement

   This statement defines the name and type of each column of a table.
   The argument to this statement is an identifier for the column.  All
   columns SHALL have unique names within the same parent table.

Birrane, et al.            Expires 6 May 2027                  [Page 22]
Internet-Draft               DTNMA ADM YANG                November 2026

   The primary substatement under this are one of the semantic type
   statements (Section 6.2) which defines the type for values in this
   column.  If present, any "if-feature" substatement within a column
   indicates that an Agent which does not implement the named feature(s)
   will: always use the undefined value in this column when producing
   tables associated with the parent template and/or always ignore (but
   not modify) given values in this column when processing these tables.

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | if-feature   | 0..1        |
                      +--------------+-------------+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | uses         | 0..1        |
                      +==============+=============+
                      | One of the semantic type:  |
                      +==============+=============+
                      | type         | 0..1        |
                      +--------------+-------------+
                      | amm:ulist    | 0..1        |
                      +--------------+-------------+
                      | amm:dlist    | 0..1        |
                      +--------------+-------------+
                      | amm:umap     | 0..1        |
                      +--------------+-------------+
                      | union        | 0..1        |
                      +--------------+-------------+

                           Table 12: amm:column
                              Substatements

6.2.6.  The union Statement (Type Union)

   A Type Union [I-D.ietf-dtn-amm] semantic type is expressed using the
   native YANG "type" statement with the union type (see Section 7.4 of
   [RFC7950]).

   Each member type substatement defines one of the possible choices of
   the union.  The order of the list of choices is significant,
   especially when converting ARI values, because the first choice which
   matches or converts will be used regardless of any other choices.

Birrane, et al.            Expires 6 May 2027                  [Page 23]
Internet-Draft               DTNMA ADM YANG                November 2026

                   +=====================+=============+
                   | Substatement        | Cardinality |
                   +=====================+=============+
                   | Ordered choice of semantic types: |
                   +=====================+=============+
                   | type                | 0..n        |
                   +---------------------+-------------+
                   | amm:ulist           | 0..n        |
                   +---------------------+-------------+
                   | amm:dlist           | 0..n        |
                   +---------------------+-------------+
                   | amm:tblt            | 0..n        |
                   +---------------------+-------------+
                   | amm:umap            | 0..n        |
                   +---------------------+-------------+

                       Table 13: union Substatements

   Examples of the "union" statement are below, some as simple use and
   some with a restricted member.

    union {
      type amm:int;
      type amm:textstr;
    }
    union {
      type amm:uint {
        range "3..10";
      }
      type amm:textstr;
    }

   An AMM type union that uses the NULL type to indicate an optional
   value is expressed with the corresponding amm:null member type, which
   wraps the empty base type and maps to NULL as defined in Section 5;
   the null value denotes the absence of a value (see Section 4.2).

6.2.7.  The amm:seq Statement

   This statement creates a Sequence semantic type (see Section 3.3.7 of
   [I-D.ietf-dtn-amm]) for its parent statement.  There is no argument
   to this statement.

   This statement is distinct from the "amm:ulist" statement, which
   types the AC container itself, while the "amm:seq" types a portion of
   elements within an AC.  The "amm:seq" is not present as a top-level
   value type except for the special case of a greedy capturing
   parameter type.

Birrane, et al.            Expires 6 May 2027                  [Page 24]
Internet-Draft               DTNMA ADM YANG                November 2026

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | min-elements | 0..1        |
                      +--------------+-------------+
                      | max-elements | 0..1        |
                      +--------------+-------------+
                      | uses         | 0..1        |
                      +==============+=============+
                      | One of the semantic type:  |
                      +==============+=============+
                      | type         | 0..1        |
                      +--------------+-------------+
                      | amm:ulist    | 0..1        |
                      +--------------+-------------+
                      | amm:dlist    | 0..1        |
                      +--------------+-------------+
                      | amm:umap     | 0..1        |
                      +--------------+-------------+
                      | union        | 0..1        |
                      +--------------+-------------+

                            Table 14: amm:seq
                              Substatements

   Examples of the "seq" statement are below.

   amm:dlist {
     type amm:textstr;
     amm:seq {
       type amm:uint;
       min-elements 1;
     }
   }

6.3.  The amm:parameter Statement

   This statement is used to define one formal parameter that apply to
   the parent object.  The argument to this statement is an identifier
   for the parameter.  All parameters SHALL have unique names within the
   same parent object.

Birrane, et al.            Expires 6 May 2027                  [Page 25]
Internet-Draft               DTNMA ADM YANG                November 2026

   The substatements under this are one of the semantic type statements
   (Section 6.2) which defines the type of the parameter.  When the
   "amm:seq" statement is used to type a formal parameter, it SHALL be
   the last parameter in the list and represents a greedy matching of
   that an all subsequent given parameters.

                      +==============+=============+
                      | Substatement | Cardinality |
                      +==============+=============+
                      | description  | 0..1        |
                      +--------------+-------------+
                      | reference    | 0..1        |
                      +--------------+-------------+
                      | amm:default  | 0..1        |
                      +--------------+-------------+
                      | uses         | 0..1        |
                      +==============+=============+
                      | One of the semantic type:  |
                      +==============+=============+
                      | type         | 0..1        |
                      +--------------+-------------+
                      | amm:ulist    | 0..1        |
                      +--------------+-------------+
                      | amm:dlist    | 0..1        |
                      +--------------+-------------+
                      | amm:tblt     | 0..1        |
                      +--------------+-------------+
                      | amm:umap     | 0..1        |
                      +--------------+-------------+
                      | union        | 0..1        |
                      +--------------+-------------+
                      | amm:seq      | 0..1        |
                      +--------------+-------------+

                         Table 15: amm:parameter
                              Substatements

   An example of the "parameter" statement is below, where there are
   three defined parameters two of which have default values.

Birrane, et al.            Expires 6 May 2027                  [Page 26]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:parameter first {
       type amm:uint {
         range "3..10";
       }
     }
     amm:parameter second {
       type amm:textstr;
       amm:default "\"value\"";
     }
     amm:parameter third {
       amm:ulist {
         type amm:uint;
       }
       amm:default "/AC/(3,5,8)"
     }

6.3.1.  The amm:default Statement

   This statement is used to define default parameter as an AMM value.
   The argument to this statement is the text form of the ARI for the
   default value.

   The default value is used in the Parameter Handling procedure (see
   Section 6.4 of [I-D.ietf-dtn-amm]) to normalize given parameters into
   actual parameters.

6.4.  The typedef Statement (TYPEDEF Object)

   This statement is used to define a Semantic Type (TYPEDEF) object
   (see Section 3.4.2 of [I-D.ietf-dtn-amm]).  The argument to this
   statement is the name of the object instance.

   The substatements under this are a choice of a top-level semantic
   type (see Section 6.2) being named by the typedef.

Birrane, et al.            Expires 6 May 2027                  [Page 27]
Internet-Draft               DTNMA ADM YANG                November 2026

                +==========================+=============+
                | Substatement             | Cardinality |
                +==========================+=============+
                | if-feature               | 0..1        |
                +--------------------------+-------------+
                | amm:enum                 | 0..1        |
                +--------------------------+-------------+
                | status                   | 0..1        |
                +--------------------------+-------------+
                | description              | 0..1        |
                +--------------------------+-------------+
                | reference                | 0..1        |
                +--------------------------+-------------+
                | uses (for semantic type) | 0..1        |
                +==========================+=============+
                | One of the semantic type:              |
                +==========================+=============+
                | type                     | 0..1        |
                +--------------------------+-------------+
                | amm:ulist                | 0..1        |
                +--------------------------+-------------+
                | amm:dlist                | 0..1        |
                +--------------------------+-------------+
                | amm:tblt                 | 0..1        |
                +--------------------------+-------------+
                | amm:umap                 | 0..1        |
                +--------------------------+-------------+
                | union                    | 0..1        |
                +--------------------------+-------------+

                     Table 16: typedef Substatements

   Examples of the "typedef" statement are below, some as restriction
   and some as union.

Birrane, et al.            Expires 6 May 2027                  [Page 28]
Internet-Draft               DTNMA ADM YANG                November 2026

     typedef restricted-uint {
       description
         "Example restriction";
       type amm:uint {
         range "3..10";
       }
     }
     typedef annotated-uint {
       description
         "Example units annotation";
       type amm:uint;
       units "meter";
     }
     typedef structured-ac {
       description
         "Example units on AC items";
       amm:ulist {
         amm:type "/aritype/real32";
         amm:units "meter";
         min-elements 3;
         max-elements 10;
       }
     }

6.5.  The amm:ident Statement

   This statement is used to define an Identity (IDENT) object (see
   Section 3.4.3 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, optional
   formal parameters, and any number of base IDENT objects from which
   this one is derived.

Birrane, et al.            Expires 6 May 2027                  [Page 29]
Internet-Draft               DTNMA ADM YANG                November 2026

                  +=======================+=============+
                  | Substatement          | Cardinality |
                  +=======================+=============+
                  | if-feature            | 0..1        |
                  +-----------------------+-------------+
                  | amm:enum              | 0..1        |
                  +-----------------------+-------------+
                  | amm:parameter         | 0..n        |
                  +-----------------------+-------------+
                  | status                | 0..1        |
                  +-----------------------+-------------+
                  | description           | 0..1        |
                  +-----------------------+-------------+
                  | reference             | 0..1        |
                  +-----------------------+-------------+
                  | amm:abstract          | 0..1        |
                  +-----------------------+-------------+
                  | amm:base              | 0..*        |
                  +-----------------------+-------------+
                  | uses (for parameters) | 0..1        |
                  +-----------------------+-------------+

                     Table 17: amm:ident Substatements

   An example of a multiple-base hierarchy of IDENT objects is below.

Birrane, et al.            Expires 6 May 2027                  [Page 30]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:ident base-a {
       amm:abstract true;
       description
         "A base identity object.";
     }
     amm:ident base-b {
       amm:abstract true;
       description
         "Another base identity object.";
     }
     amm:ident use-1 {
       amm:base "./IDENT/base-a";
       description
         "An identity derived from base-a.";
     }
     amm:ident use-2 {
       amm:base "./IDENT/use-1";
       amm:base "./IDENT/base-b";
       description
         "An identity derived from base-a (via use-1) and base-b.";
     }
     amm:ident use-3 {
       amm:base "./IDENT/base-b";
       amm:parameter option {
         type amm:int;
       }
       description
         "An identity derived from base-b which includes a parameter.";
     }

6.5.1.  The amm:abstract Statement

   This statement causes the parent IDENT (Section 6.5) object to be
   explicitly marked as abstract or not, as defined in Section 3.4.3 of
   [I-D.ietf-dtn-amm].  The argument to this statement is a boolean
   ("true" or "false") value in accordance with Section 9.5 of
   [RFC7950].  If not present, the default marking of the IDENT object
   is not-abstract.

   There are no substatements within this statement.

6.5.2.  The amm:base Statement

   This statement causes the parent IDENT (Section 6.5) object to be
   derived from a referenced base object.  The argument to this
   statement is the text form of the ARI referencing the required base
   object.

Birrane, et al.            Expires 6 May 2027                  [Page 31]
Internet-Draft               DTNMA ADM YANG                November 2026

   Similar to YANG logic, in the AMM derivation of an IDENT from a base
   has the following properties.

   *  It is irreflexive, which means that an identity is not derived
      from itself.

   *  It is transitive, which means that if identity B is derived from A
      and C is derived from B, then C is also derived from A.

   There are no substatements within this statement.

6.6.  The amm:const Statement

   This statement is used to define a Constant (CONST) object (see
   Section 3.4.5 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, optional
   formal parameters, and one of the semantic type statements
   (Section 6.2) that represents the produced value of the CONST.  The
   amm:const statement SHALL contain a an amm:init-value, which is the
   constant represented by this object.

Birrane, et al.            Expires 6 May 2027                  [Page 32]
Internet-Draft               DTNMA ADM YANG                November 2026

         +=========================================+=============+
         | Substatement                            | Cardinality |
         +=========================================+=============+
         | if-feature                              | 0..1        |
         +-----------------------------------------+-------------+
         | amm:enum                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:parameter                           | 0..n        |
         +-----------------------------------------+-------------+
         | status                                  | 0..1        |
         +-----------------------------------------+-------------+
         | description                             | 0..1        |
         +-----------------------------------------+-------------+
         | reference                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:init-value                          | 1           |
         +-----------------------------------------+-------------+
         | uses (for parameters and semantic type) | 0..1        |
         +=========================================+=============+
         | One of the semantic type:                             |
         +=========================================+=============+
         | type                                    | 0..1        |
         +-----------------------------------------+-------------+
         | amm:ulist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:dlist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:tblt                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:umap                                | 0..1        |
         +-----------------------------------------+-------------+
         | union                                   | 0..1        |
         +-----------------------------------------+-------------+

                     Table 18: amm:const Substatements

   An example of a simple-typed CONST is below.

     amm:const pi32 {
       amm:type "/aritype/real32";
       amm:init-value "3.14159";
       description
         "A truncated value of Pi.";
     }

   Another example of a semantic-typed MAC-valued CONST (see
   Section 4.2.4 of [I-D.ietf-dtn-amm]) is below.

Birrane, et al.            Expires 6 May 2027                  [Page 33]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:const do_thing {
       type amm-base:mac;
       amm:init-value "/AC/(../CTRL/first,../CTRL/second(2))";
       description
         "Execute two controls in sequence.";
     }

6.7.  The amm:ctrl Statement

   This statement is used to define a Control (CTRL) object (see
   Section 3.4.6 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, optional
   formal parameters, and an optional execution result.  If the
   amm:result substatement is present it SHALL be used to constrain
   Result Storage for the execution procedure (see Section 6.6 of
   [I-D.ietf-dtn-amm]).  If the amm:result substatement is omitted the
   assumed result type SHALL be NULL with a default value of null.
   Regardless of the presence or type indicated by an amm:result
   substatement, the failure to execute any control always results in an
   undefined result value.

            +==================================+=============+
            | Substatement                     | Cardinality |
            +==================================+=============+
            | if-feature                       | 0..1        |
            +----------------------------------+-------------+
            | amm:enum                         | 0..1        |
            +----------------------------------+-------------+
            | amm:parameter                    | 0..n        |
            +----------------------------------+-------------+
            | status                           | 0..1        |
            +----------------------------------+-------------+
            | description                      | 0..1        |
            +----------------------------------+-------------+
            | reference                        | 0..1        |
            +----------------------------------+-------------+
            | amm:result                       | 0..1        |
            +----------------------------------+-------------+
            | uses (for parameters and result) | 0..1        |
            +----------------------------------+-------------+

                     Table 19: amm:ctrl Substatements

   An example of a single-parameter CTRL is below.

Birrane, et al.            Expires 6 May 2027                  [Page 34]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:ctrl reset_count {
       amm:parameter src {
         type amm:textstr;
         description
           "The name of the source.";
       }
       amm:result previous {
         type amm:uvast;
         description
           "The value just before reset.";
       }
       description
         "This control resets counts for the given source.";
     }

6.7.1.  The amm:result Statement

   The result statement contains one of the semantic type statements
   (Section 6.2) which represents the result expected from executing a
   CTRL or evaluating an OPER.  The argument to this statement is an
   identifier for the result.

                +==========================+=============+
                | Substatement             | Cardinality |
                +==========================+=============+
                | description              | 0..1        |
                +--------------------------+-------------+
                | reference                | 0..1        |
                +--------------------------+-------------+
                | uses (for semantic type) | 0..1        |
                +==========================+=============+
                | One of the semantic type:              |
                +==========================+=============+
                | type                     | 0..1        |
                +--------------------------+-------------+
                | amm:ulist                | 0..1        |
                +--------------------------+-------------+
                | amm:dlist                | 0..1        |
                +--------------------------+-------------+
                | amm:tblt                 | 0..1        |
                +--------------------------+-------------+
                | amm:umap                 | 0..1        |
                +--------------------------+-------------+
                | union                    | 0..1        |
                +--------------------------+-------------+

                    Table 20: amm:result Substatements

Birrane, et al.            Expires 6 May 2027                  [Page 35]
Internet-Draft               DTNMA ADM YANG                November 2026

6.8.  The Config-False leaf Statement (EDD Object)

   This statement, when combined with a "config false" substatement, is
   used to define an Externally Defined Data (EDD) object (see
   Section 3.4.4 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The leaf statement with a "config false" substatement is the native
   YANG representation of the EDD object type, and there is no separate
   EDD marker statement.  The identifier of the leaf is the name of the
   EDD object instance, and in ARI syntax the EDD continues to be
   referenced by the EDD object type, as /EDD/<name>.

   The substatements under this are the common object metadata, optional
   formal parameters, and one of the semantic type statements
   (Section 6.2) that represents the produced value of the EDD.

Birrane, et al.            Expires 6 May 2027                  [Page 36]
Internet-Draft               DTNMA ADM YANG                November 2026

         +=========================================+=============+
         | Substatement                            | Cardinality |
         +=========================================+=============+
         | if-feature                              | 0..1        |
         +-----------------------------------------+-------------+
         | config                                  | 1           |
         +-----------------------------------------+-------------+
         | amm:enum                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:parameter                           | 0..n        |
         +-----------------------------------------+-------------+
         | status                                  | 0..1        |
         +-----------------------------------------+-------------+
         | description                             | 0..1        |
         +-----------------------------------------+-------------+
         | reference                               | 0..1        |
         +-----------------------------------------+-------------+
         | uses (for parameters and semantic type) | 0..1        |
         +=========================================+=============+
         | One of the semantic type:                             |
         +=========================================+=============+
         | type                                    | 0..1        |
         +-----------------------------------------+-------------+
         | amm:ulist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:dlist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:tblt                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:umap                                | 0..1        |
         +-----------------------------------------+-------------+
         | union                                   | 0..1        |
         +-----------------------------------------+-------------+

                        Table 21: leaf Substatements

   An example of a simple-typed EDD is below.

     leaf tx_count {
       type amm-base:counter64;
       units "frames";
       description
         "The count of the number of frames sent.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 37]
Internet-Draft               DTNMA ADM YANG                November 2026

6.9.  The amm:oper Statement

   This statement is used to define an Operator (OPER) object (see
   Section 3.4.7 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, optional
   formal parameters, an operands list, and an evaluation result.

     +================================================+=============+
     | Substatement                                   | Cardinality |
     +================================================+=============+
     | if-feature                                     | 0..1        |
     +------------------------------------------------+-------------+
     | amm:enum                                       | 0..1        |
     +------------------------------------------------+-------------+
     | amm:parameter                                  | 0..n        |
     +------------------------------------------------+-------------+
     | status                                         | 0..1        |
     +------------------------------------------------+-------------+
     | description                                    | 0..1        |
     +------------------------------------------------+-------------+
     | reference                                      | 0..1        |
     +------------------------------------------------+-------------+
     | amm:operand                                    | 0..*        |
     +------------------------------------------------+-------------+
     | result                                         | 1           |
     +------------------------------------------------+-------------+
     | uses (for parameters, operands, and/or result) | 0..1        |
     +------------------------------------------------+-------------+

                     Table 22: amm:oper Substatements

   An example of an arithmetic OPER is below.

     amm:oper add {
       amm:operand val-a {
         type amm-base:numeric;
       }
       amm:operand val-b {
         type amm-base:numeric;
       }
       amm:result sum {
         type amm-base:numeric;
       }
       description
         "Sum together the two operands.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 38]
Internet-Draft               DTNMA ADM YANG                November 2026

   A more complex "variadic" OPER with parameters is below.  Also note
   the anonymous semantic type used to restrict the parameter.

     amm:oper sum {
       description
         "Sum together a sequence from the stack.";
       parameter count {
         description
           "The number of operands to pop."
         type amm:uint {
           range "1..max";
         }
       }
       operand value {
         description
           "This is not within a container, so does not represent an AC;
           it is multiple operands.";
         type amm-base:numeric;
       }
       result sum {
         type amm-base:numeric;
       }
     }

6.9.1.  The amm:operand Statement

   This statement is used to define one operand that applies to the
   parent object.  The argument to this statement is an identifier for
   the operand.  All operands SHALL have unique names within the same
   parent object.

Birrane, et al.            Expires 6 May 2027                  [Page 39]
Internet-Draft               DTNMA ADM YANG                November 2026

                +==========================+=============+
                | Substatement             | Cardinality |
                +==========================+=============+
                | description              | 0..1        |
                +--------------------------+-------------+
                | reference                | 0..1        |
                +--------------------------+-------------+
                | uses (for semantic type) | 0..1        |
                +==========================+=============+
                | One of the semantic type:              |
                +==========================+=============+
                | type                     | 0..1        |
                +--------------------------+-------------+
                | amm:ulist                | 0..1        |
                +--------------------------+-------------+
                | amm:dlist                | 0..1        |
                +--------------------------+-------------+
                | amm:tblt                 | 0..1        |
                +--------------------------+-------------+
                | amm:umap                 | 0..1        |
                +--------------------------+-------------+
                | union                    | 0..1        |
                +--------------------------+-------------+

                   Table 23: amm:operand Substatements

6.10.  The amm:sbr Statement

   This statement is used to define a State Based Rule object (see
   Section 3.4.8 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, the
   action to execute upon trigger, and rule control fields defined
   below.

Birrane, et al.            Expires 6 May 2027                  [Page 40]
Internet-Draft               DTNMA ADM YANG                November 2026

                    +==================+=============+
                    | Substatement     | Cardinality |
                    +==================+=============+
                    | if-feature       | 0..1        |
                    +------------------+-------------+
                    | amm:enum         | 0..1        |
                    +------------------+-------------+
                    | status           | 0..1        |
                    +------------------+-------------+
                    | description      | 0..1        |
                    +------------------+-------------+
                    | reference        | 0..1        |
                    +------------------+-------------+
                    | amm:action       | 1           |
                    +------------------+-------------+
                    | amm:condition    | 1           |
                    +------------------+-------------+
                    | amm:min-interval | 0..1        |
                    +------------------+-------------+
                    | amm:max-count    | 0..1        |
                    +------------------+-------------+
                    | amm:init-enabled | 0..1        |
                    +------------------+-------------+

                     Table 24: amm:sbr Substatements

   An example of an SBR with some default fields is below.

     amm:sbr enable_safe_mode {
       description
         "Enable safe mode below threshold.";
       amm:action "/AC/(./CTRL/ensure_safe_mode(true))";
       amm:condition "/AC/(./EDD/sensor,./VAR/min_threshold,"
         +"/ietf-amm/OPER/compare_lt)";
     }

6.10.1.  The amm:min-interval Statement

   This statement is used to define the Minimum Interval field of SBR
   (Section 6.10) objects.  The argument to this statement is the text
   form of a TD value.  If not present, the default value of zero
   (meaning no minimum) is used.

Birrane, et al.            Expires 6 May 2027                  [Page 41]
Internet-Draft               DTNMA ADM YANG                November 2026

6.10.2.  The amm:max-count Statement

   This statement is used to define the Maximum Count field of SBR
   (Section 6.10) and TBR (Section 6.11) objects.  The argument to this
   statement is the text form of a UVAST value.  If not present, the
   default value of zero (meaning no limit) is used.

6.10.3.  The amm:init-enabled Statement

   This statement is used to define the Initial Enabled state of SBR
   (Section 6.10) and TBR (Section 6.11) objects.  The argument to this
   statement is a boolean ("true" or "false") value in accordance with
   Section 9.5 of [RFC7950].  If not present, the default value of true
   is used.

6.11.  The amm:tbr Statement

   This statement is used to define a Time-Based Rule (TBR) object (see
   Section 3.4.9 of [I-D.ietf-dtn-amm]).  The argument to this statement
   is the name of the object instance.

   The substatements under this are the common object metadata, the
   action to execute upon trigger, and rule control fields defined
   below.

Birrane, et al.            Expires 6 May 2027                  [Page 42]
Internet-Draft               DTNMA ADM YANG                November 2026

                    +==================+=============+
                    | Substatement     | Cardinality |
                    +==================+=============+
                    | if-feature       | 0..1        |
                    +------------------+-------------+
                    | amm:enum         | 0..1        |
                    +------------------+-------------+
                    | status           | 0..1        |
                    +------------------+-------------+
                    | description      | 0..1        |
                    +------------------+-------------+
                    | reference        | 0..1        |
                    +------------------+-------------+
                    | amm:action       | 1           |
                    +------------------+-------------+
                    | amm:start        | 1           |
                    +------------------+-------------+
                    | amm:period       | 1           |
                    +------------------+-------------+
                    | amm:max-count    | 0..1        |
                    +------------------+-------------+
                    | amm:init-enabled | 0..1        |
                    +------------------+-------------+

                     Table 25: amm:tbr Substatements

   An example of an TBR with some default fields is below.

     amm:tbr tlm_rule {
       description
         "Generate telemetry reports.";
       amm:action "/AC/(./CTRL/first,/adm2/CTRL/other)";
       amm:period "/TD/PT30s";
     }

6.11.1.  The amm:start Statement

   This statement is used to define the Start field of TBR
   (Section 6.11) objects.  The argument to this statement is the text
   form of a TIME value (see Appendix A).  If not present, the default
   value of zero (meaning start immediately) is used.

6.12.  The amm:var Statement

   This statement is used to define a Variable (VAR) object (see
   Section 3.4.10 of [I-D.ietf-dtn-amm]).  The argument to this
   statement is the name of the object instance.

Birrane, et al.            Expires 6 May 2027                  [Page 43]
Internet-Draft               DTNMA ADM YANG                November 2026

   The substatements under this are the common object metadata, optional
   formal parameters, one of the semantic type statements (Section 6.2)
   that represents the stored-and-produced value of the VAR, and an
   optional initializer expression.

         +=========================================+=============+
         | Substatement                            | Cardinality |
         +=========================================+=============+
         | if-feature                              | 0..1        |
         +-----------------------------------------+-------------+
         | amm:enum                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:parameter                           | 0..n        |
         +-----------------------------------------+-------------+
         | status                                  | 0..1        |
         +-----------------------------------------+-------------+
         | description                             | 0..1        |
         +-----------------------------------------+-------------+
         | reference                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:init-value                          | 0..1        |
         +-----------------------------------------+-------------+
         | uses (for parameters and semantic type) | 0..1        |
         +=========================================+=============+
         | One of the semantic type:                             |
         +=========================================+=============+
         | type                                    | 0..1        |
         +-----------------------------------------+-------------+
         | amm:ulist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:dlist                               | 0..1        |
         +-----------------------------------------+-------------+
         | amm:tblt                                | 0..1        |
         +-----------------------------------------+-------------+
         | amm:umap                                | 0..1        |
         +-----------------------------------------+-------------+
         | union                                   | 0..1        |
         +-----------------------------------------+-------------+

                      Table 26: amm:var Substatements

   An example of a simple-typed VAR with an initializer value is below.

Birrane, et al.            Expires 6 May 2027                  [Page 44]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:var min_threshold {
       description
         "The lower threshold to enable safe mode.";
       amm:type "/aritype/real32" {
         units "meter";
       }
       amm:init-value "1e4";
     }

6.12.1.  The amm:init-value Statement

   This statement is used to define CONST values and VAR initial state
   as an AMM value.  The argument to this statement is the text form of
   the ARI for the initial value.

   The initializer is used as part of the Agent Initialization
   procedure, (see Section 6.1 of [I-D.ietf-dtn-amm]) and when new VAR
   objects are defined in an ODM.

7.  ADM Author Considerations

   All of the logical design considerations from Section 7 of
   [I-D.ietf-dtn-amm] apply to authors of ADM modules when considering
   the naming and behaviors of AMM object instances.

   All of the lifecycle considerations for YANG modules from [RFC8407]
   apply to those statements reused for ADM modules as defined in
   Section 4.1.  Specifically the guidance from Section 4.17 of
   [RFC8407] regarding feature use and scoping.

   Although this specification allows semantic type statements to be
   included in a grouping statement, it is RECOMMENDED that ADM authors
   make use of named TYPEDEF (Section 6.4) object where possible.

8.  IANA Considerations

   This section provides guidance to the Internet Assigned Numbers
   Authority (IANA) regarding registration of schema and namespaces
   related to core ADMs, in accordance with BCP 26 [RFC8126].

8.1.  DTN Management Architecture

   This document relies on existing ARI-defined registries defined in
   [IANA-DTNMA] by Section 9.3 of [I-D.ietf-dtn-ari].

Birrane, et al.            Expires 6 May 2027                  [Page 45]
Internet-Draft               DTNMA ADM YANG                November 2026

   This document defines the following entries within the "DTNMA IETF
   Data Models" registry of the "DTN Management Architecture" registry
   group [IANA-DTNMA].  All of the ADMs in this registry are under the
   "ietf" organization (enumeration 1).

    +=============+=================+===========+=====================+
    | Enumeration | Name            | Reference | Notes               |
    +=============+=================+===========+=====================+
    | 0           | amm             | [This     | Definition of YANG  |
    |             |                 | document] | extensions for the  |
    |             |                 |           | AMM itself.         |
    +-------------+-----------------+-----------+---------------------+
    | 1           | dtnma-agent     | [This     | DTNMA Agent         |
    |             |                 | document] | introspection       |
    |             |                 |           | objects.            |
    +-------------+-----------------+-----------+---------------------+
    | 2           | dtnma-agent-acl | [This     | DTNMA Agent access  |
    |             |                 | document] | control.            |
    +-------------+-----------------+-----------+---------------------+
    | 24          | amm-semtype     | [This     | AMM-defined         |
    |             |                 | document] | semantic type       |
    |             |                 |           | representation.     |
    +-------------+-----------------+-----------+---------------------+
    | 25          | amm-base        | [This     | AMM-defined type    |
    |             |                 | document] | unions and other    |
    |             |                 |           | definitions.        |
    +-------------+-----------------+-----------+---------------------+
    | 26          | network-base    | [This     | General purpose and |
    |             |                 | document] | abstract network-   |
    |             |                 |           | related objects.    |
    +-------------+-----------------+-----------+---------------------+

                      Table 27: DTNMA IETF Data Models

   This document defines the following entries within the "DTNMA IANA
   Data Models" registry of the "DTN Management Architecture" registry
   group [IANA-DTNMA].  All of the ADMs in this registry are under the
   "iana" organization (enumeration 2).

    +=============+===============+===========+======================+
    | Enumeration | Name          | Reference | Notes                |
    +=============+===============+===========+======================+
    | 0           | display-hints | [This     | Registry of well-    |
    |             |               | document] | known display hints. |
    +-------------+---------------+-----------+----------------------+

                     Table 28: DTNMA IANA Data Models

Birrane, et al.            Expires 6 May 2027                  [Page 46]
Internet-Draft               DTNMA ADM YANG                November 2026

9.  Security Considerations

   This document defines a syntax for encoding DTNMA ADMs within a text
   file, and for interpreting extensions to the YANG language to support
   modeling of AMM objects and ARI values.  It does not address what the
   contents of those ADMs are or any security considerations associated
   with the data models themselves.

10.  References

10.1.  Normative References

   [IANA-DTNMA]
              IANA, "Delay-Tolerant Networking Management Architecture
              (DTNMA) Parameters",
              <https://www.iana.org/assignments/TBA/>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC7950]  Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
              RFC 7950, DOI 10.17487/RFC7950, August 2016,
              <https://www.rfc-editor.org/info/rfc7950>.

   [RFC9485]  Bormann, C. and T. Bray, "I-Regexp: An Interoperable
              Regular Expression Format", RFC 9485,
              DOI 10.17487/RFC9485, October 2023,
              <https://www.rfc-editor.org/info/rfc9485>.

   [I-D.ietf-dtn-amm]
              Birrane, E. J., Sipos, B., and J. Ethier, "DTNMA
              Application Management Model (AMM) and Data Models", Work
              in Progress, Internet-Draft, draft-ietf-dtn-amm-07, 20
              July 2026, <https://datatracker.ietf.org/doc/html/draft-
              ietf-dtn-amm-07>.

   [I-D.ietf-dtn-ari]
              Birrane, E. J., Annis, E., and B. Sipos, "DTNMA
              Application Resource Identifier (ARI)", Work in Progress,
              Internet-Draft, draft-ietf-dtn-ari-09, 20 July 2026,
              <https://datatracker.ietf.org/doc/html/draft-ietf-dtn-ari-
              09>.

10.2.  Informative References

Birrane, et al.            Expires 6 May 2027                  [Page 47]
Internet-Draft               DTNMA ADM YANG                November 2026

   [IANA-YANG]
              IANA, "YANG Parameters",
              <https://www.iana.org/assignments/yang-parameters/>.

   [X.680]    ITU-T, "Information technology -- Abstract Syntax Notation
              One (ASN.1): Specification of basic notation", ITU-T
              Recommendation X.680, ISO/IEC 8824-1:2015, August 2015,
              <https://www.itu.int/rec/T-REC-X.680-201508-I/en>.

   [RFC2578]  McCloghrie, K., Ed., Perkins, D., Ed., and J.
              Schoenwaelder, Ed., "Structure of Management Information
              Version 2 (SMIv2)", STD 58, RFC 2578,
              DOI 10.17487/RFC2578, April 1999,
              <https://www.rfc-editor.org/info/rfc2578>.

   [RFC5280]  Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
              Housley, R., and W. Polk, "Internet X.509 Public Key
              Infrastructure Certificate and Certificate Revocation List
              (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008,
              <https://www.rfc-editor.org/info/rfc5280>.

   [RFC7942]  Sheffer, Y. and A. Farrel, "Improving Awareness of Running
              Code: The Implementation Status Section", BCP 205,
              RFC 7942, DOI 10.17487/RFC7942, July 2016,
              <https://www.rfc-editor.org/info/rfc7942>.

   [RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for
              Writing an IANA Considerations Section in RFCs", BCP 26,
              RFC 8126, DOI 10.17487/RFC8126, June 2017,
              <https://www.rfc-editor.org/info/rfc8126>.

   [RFC8407]  Bierman, A., "Guidelines for Authors and Reviewers of
              Documents Containing YANG Data Models", RFC 8407,
              DOI 10.17487/RFC8407, October 2018,
              <https://www.rfc-editor.org/info/rfc8407>.

   [RFC8610]  Birkholz, H., Vigano, C., and C. Bormann, "Concise Data
              Definition Language (CDDL): A Notational Convention to
              Express Concise Binary Object Representation (CBOR) and
              JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610,
              June 2019, <https://www.rfc-editor.org/info/rfc8610>.

   [RFC9675]  Birrane, III, E., Heiner, S., and E. Annis, "Delay-
              Tolerant Networking Management Architecture (DTNMA)",
              RFC 9675, DOI 10.17487/RFC9675, November 2024,
              <https://www.rfc-editor.org/info/rfc9675>.

Birrane, et al.            Expires 6 May 2027                  [Page 48]
Internet-Draft               DTNMA ADM YANG                November 2026

   [github-dtnma-ace]
              JHU/APL, "The DTNMA AMM CODEC Engine (ACE)",
              <https://github.com/JHUAPL-DTNMA/dtnma-ace>.

   [github-dtnma-adms]
              JHU/APL, "Application Data Models (ADMs)",
              <https://github.com/JHUAPL-DTNMA/dtnma-adms>.

   [github-dtnma-tools]
              JHU/APL, "A reference implementation of the DTN Management
              Architecture (DTNMA) Agent and related Tools",
              <https://github.com/JHUAPL-DTNMA/dtnma-tools>.

Appendix A.  ADM Module for AMM Extensions

   The ADM module in this section implements base extensions to YANG in
   support of the AMM.  This includes the following:

   *  Extensions to support ADM Metadata (see Section 4.1.1 of
      [I-D.ietf-dtn-amm]) within a YANG module.

   *  Extensions to support AMM Object Types (see Section 3.4 of
      [I-D.ietf-dtn-amm]) within a YANG module.

   *  Extensions to support Semantic Value Types (see Section 3.3 of
      [I-D.ietf-dtn-amm]) within a YANG module.

   <CODE BEGINS> file "ietf-amm.yang"
   module ietf-amm {
     yang-version 1.1;
     namespace "ari://ietf/amm/";
     prefix amm;

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact
       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module defines the DTN Management Architecture (DTNMA)
        Application Management Model (AMM) extensions within YANG.
        It also defines the base IDENT and TYPEDEF objects for the AMM,
        and native YANG typedefs for the AMM built-in literal types.

Birrane, et al.            Expires 6 May 2027                  [Page 49]
Internet-Draft               DTNMA ADM YANG                November 2026

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2025-07-03 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }

     /*
      * This section contains extensions for common behavior of AMM
      * objects.
      */

     extension enum {
       argument value;
       description
         "An enumeration identifies an object within a namespace.
          The argument to this statement is the integer value.";
     }

     extension parameter {
       argument name;
       description
         "The schema for a formal parameter of an object.
          Order of parameters is significant within this statement.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 50]
Internet-Draft               DTNMA ADM YANG                November 2026

     extension default {
       argument value;
       description
         "The literal value default for a parameter or result.
          The argument is the text form of the ARI";
     }

     extension init-value {
       argument value;
       description
         "The literal value of a CONST object,
          initial state for a VAR object.
          The argument is the text form of the ARI";
     }

     extension init-expr {
       argument expr;
       description
         "An expression evaluated to initialize a VAR object.
          The argument is the text form of the EXPR AC";
     }

     /*
      * This section contains extensions for AMM object definitions.
      */

     extension typedef {
       argument name;
       description
         "Definition of a TYPEDEF within an ADM.
          The argument to this statement is the object name.
          One of the type use substatements must be present.";
     }

     extension ident {
       argument name;
       description
         "Definition of an IDENT within an ADM.
          The argument to this statement is the object name.
          An 'base' substatement must be present.";
     }

     extension abstract {
       argument is-abstract;
       description
         "The boolean abstract marking of an IDENT object.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 51]
Internet-Draft               DTNMA ADM YANG                November 2026

     extension base {
       argument name;
       description
         "The argument is the base of an IDENT object.";
     }

     extension const {
       argument name;
       description
         "Definition of a CONST within an ADM.
          The argument to this statement is the object name.
          An 'init-value' substatement must be present.";
     }

     extension ctrl {
       argument name;
       description
         "Definition of a CTRL within an ADM.
          The argument to this statement is the object name.";
     }

     extension result {
       argument name;
       description
         "A result value reported as a response to a control.
          The substatement is the result type.
          Each CTRL can have a single optional result.";
     }

     extension edd {
       argument name;
       description
         "Definition of an EDD within an ADM.
          The argument to this statement is the object name.";
     }

     extension oper {
       argument name;
       description
         "Definition of an OPER within an ADM.
          The argument to this statement is the object name.";
     }

     extension operand {
       argument name;
       description
         "An individual operand taken from the expression stack
          during evaluation of the OPER.

Birrane, et al.            Expires 6 May 2027                  [Page 52]
Internet-Draft               DTNMA ADM YANG                November 2026

          Each substatement is an operand as a leaf (ARI).
          The order of operands is significant within an object
          definition.";
     }

     extension var {
       argument name;
       description
         "Definition of a VAR within an ADM.
          The argument to this statement is the object name.";
     }

     extension sbr {
       argument name;
       description
         "Definition of a SBR within an ADM.
          The argument to this statement is the object name.";
     }

     extension action {
       argument exec-tgt;
       description
         "Definition of the action executed by a rule object.
          The argument to this statement is the exec-tgt to execute.";
     }

     extension condition {
       argument expr;
       description
         "Condition evaluated by an SBR object to determine whether to
          execute its action.
          The argument to this statement is the expr to evaluate.";
     }

     extension min-interval {
       argument relative-time;
       description
         "The argument to this statement is a time-based ARI specifying
          the minimum amount of time between condition evaluations
          for an SBR object.";
     }

     extension max-count {
       argument count;
       description
         "The argument to this statement is the integer maximum
          execution count for a rule object.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 53]
Internet-Draft               DTNMA ADM YANG                November 2026

     extension init-enabled {
       argument state;
       description
         "The argument to this statement is the boolean initial enabled
          state for a rule object.";
     }

     extension tbr {
       argument name;
       description
         "Definition of a TBR within an ADM.
          The argument to this statement is the object name.";
     }

     extension start {
       argument time;
       description
         "The argument to this statement is the start time ARI for a
          TBR object.";
     }

     extension period {
       argument relative-time;
       description
         "The argument to this statement is an ARI defining the period
          for a TBR object.";
     }

     /*
      * This section contains extensions for defining semantic type
      * instances.
      */

     extension type {
       argument name;
       description
         "A reference to a built-in type or prefix-qualified typedef.";
     }

     extension display-hint {
       argument ident;
       description
         "Reference an IDENT object which indicates how a value should
          be displayed for human consumption.
          The base of the IDENT SHALL be the
          <ari://ietf/amm-base/ident/display-hint> object.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 54]
Internet-Draft               DTNMA ADM YANG                November 2026

     extension int-labels {
       description
         "Type narrowing for an integer to label enum values or bit
          positions.";
     }

     extension cddl {
       argument text;
       description
         "Type narrowing for a CBOR item in the form of CDDL syntax.
          The argument to this statement is the actual CDDL text.";
     }

     extension ulist {
       description
         "Type for an AC containing a list of uniform-typed values.";
     }

     extension dlist {
       description
         "Type for an AC containing a list of diverse-typed sequences.";
     }

     extension seq {
       description
         "A sequence of uniform-typed values within a 'dlist'.";
     }

     extension umap {
       description
         "Type for an AM containing a set of uniform-typed key-value
          pairs.";
     }

     extension keys {
       description
         "The type restriction for 'umap' keys.";
     }

     extension values {
       description
         "The type restriction for 'umap' values.";
     }

     extension tblt {
       description
         "Type for a table of values with a column schema.";
     }

Birrane, et al.            Expires 6 May 2027                  [Page 55]
Internet-Draft               DTNMA ADM YANG                November 2026

     extension column {
       argument name;
       description
         "An individual column within a 'tblt' definition.";
     }

     extension key {
       argument columns;
       description
         "Names of columns composing the row key, separated by spaces,
          within a 'tblt' definition.";
     }

     extension unique {
       argument columns;
       description
         "Names of columns composing a uniqueness constraint, separated
          by spaces, within a 'tblt' definition.";
     }

     extension union {
       description
         "Semantic type for a union of other types in substatements.";
     }

     /*
      * This section contains native YANG typedefs for the AMM built-in
      * literal types.
      *
      * A type with a single corresponding YANG base type is a direct
      * typedef of that base type.
      * A type without a single corresponding YANG base type is derived
      * from string and holds the ARI text form of the value.
      */

     typedef null {
       type empty;
       description
         "AMM NULL literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef bool {
       type boolean;
       description
         "AMM BOOL literal type.";
       reference

Birrane, et al.            Expires 6 May 2027                  [Page 56]
Internet-Draft               DTNMA ADM YANG                November 2026

         "draft-ietf-dtn-amm";
     }

     typedef byte {
       type uint8;
       description
         "AMM BYTE literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef int {
       type int32;
       description
         "AMM INT literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef uint {
       type uint32;
       description
         "AMM UINT literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef vast {
       type int64;
       description
         "AMM VAST literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef uvast {
       type uint64;
       description
         "AMM UVAST literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef real32 {
       type string;
       description
         "AMM REAL32 literal type.
          A 32-bit floating point value (IEEE 754 binary32),

Birrane, et al.            Expires 6 May 2027                  [Page 57]
Internet-Draft               DTNMA ADM YANG                November 2026

          represented as the ARI text form of the value.";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 8;
     }

     typedef real64 {
       type string;
       description
         "AMM REAL64 literal type.
          A 64-bit floating point value (IEEE 754 binary64),
          represented as the ARI text form of the value.";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 9;
     }

     typedef textstr {
       type string;
       description
         "AMM TEXTSTR literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef bytestr {
       type binary;
       description
         "AMM BYTESTR literal type.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef cbor {
       type binary;
       description
         "AMM CBOR literal type.
          Arbitrary CBOR content (RFC 8949); no RFC 9254
          constraints are in effect.";
       reference
         "draft-ietf-dtn-amm";
     }

     typedef tp {
       type string;
       description
         "AMM TP literal type.
          A DTN time point (RFC 9171), an absolute time as an

Birrane, et al.            Expires 6 May 2027                  [Page 58]
Internet-Draft               DTNMA ADM YANG                November 2026

          offset from the DTN Epoch 2000-01-01T00:00:00Z,
          represented as the ARI text form of the value
          (an RFC 3339 date-time or fractional seconds).
          Not affected by leap seconds.";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 12;
     }

     typedef td {
       type string;
       description
         "AMM TD literal type.
          A time delta (an offset between two time points),
          represented as the ARI text form of the value
          (an RFC 3339 duration without year or month
          components, or fractional seconds).";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 13;
     }

     typedef label {
       type string;
       description
         "AMM LABEL literal type.
          A 32-bit signed integer or a restricted text name
          (id-text), represented as the ARI text form
          of the value.";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 14;
     }

     typedef aritype {
       type string;
       description
         "AMM ARITYPE literal type.
          An ARI literal type identifier: a registered code
          point or a registered type name (id-text),
          represented as the ARI text form of the value.";
       reference
         "draft-ietf-dtn-ari";
       amm:enum 16;
     }

     typedef objpat {
       type string {

Birrane, et al.            Expires 6 May 2027                  [Page 59]
Internet-Draft               DTNMA ADM YANG                November 2026

         pattern '^\((\*|(-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9'
               + ']+)(,(-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9]+'
               + '))*|!?[A-Za-z_][0-9A-Za-z_\-\.]*)\)\((\*|(-?[0-9]+\.\.'
               + '(-?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9]+)(,(-?[0-9]+\.\.(-'
               + '?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9]+))*|!?[A-Za-z_][0-9A'
               + '-Za-z_\-\.]*)\)\((\*|(-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?['
               + '0-9]+)?|-?[0-9]+)(,(-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?[0-'
               + '9]+)?|-?[0-9]+))*|!?[A-Za-z_][0-9A-Za-z_\-\.]*)\)\((\*'
               + '|(-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9]+)(,('
               + '-?[0-9]+\.\.(-?[0-9]+)?|\.\.(-?[0-9]+)?|-?[0-9]+))*|!?'
               + '[A-Za-z_][0-9A-Za-z_\-\.]*)\)$';
       }
       description
         "An object reference pattern: four independent path segment
          patterns (organization, model, object type, and object ID),
          each a wildcard, a single value, or a comma-separated set of
          integer intervals.";
       reference
         "draft-ietf-dtn-ari: Object Reference Patterns";
     }

     amm:enum 0;
   }
   <CODE ENDS>

Appendix B.  ADM Module for Semantic Type Introspection

   The ADM module in this section implements the entities described in
   Section 4.2.2 of [I-D.ietf-dtn-amm].  This includes an IDENT object
   hierarchy which allows introspection of semantic types in ARI syntax.

   <CODE BEGINS> file "ietf-amm-semtype.yang"
   module ietf-amm-semtype {
     yang-version 1.1;
     namespace "ari://ietf/amm-semtype/";
     prefix amm-semtype;

     import ietf-amm {
       prefix amm;
     }

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact
       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

Birrane, et al.            Expires 6 May 2027                  [Page 60]
Internet-Draft               DTNMA ADM YANG                November 2026

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module defines base and derived IDENT objects which
        allow introspection of AMM semantic types.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2026-05-01 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 24;

     // Base IDENT objects
     amm:ident semtype {
       amm:enum 1;
       description
         "The base IDENT for semantic type introspection.
          This object itself provides no type information.";
       amm:abstract true;
     }

     // Semantic-type leaf IDENT objects
     amm:ident type-use {
       amm:enum 2;

Birrane, et al.            Expires 6 May 2027                  [Page 61]
Internet-Draft               DTNMA ADM YANG                November 2026

       description
         "A named type use with possible annotations and/or
          constraints.";
       amm:base "./IDENT/semtype";
       amm:parameter name {
         description
           "A built-in ARITYPE or reference to TYPEDEF object being
            used.";
         amm:type "//ietf/amm-base/TYPEDEF/type-ref";
       }
       // FIXME include constraints and annotations also?
     }
     amm:ident ulist {
       amm:enum 3;
       description
         "A uniformly-typed list within an AC.";
       amm:base "./IDENT/semtype";
       amm:parameter item-type {
         description
           "The semantic type for all items.";
         amm:type "./TYPEDEF/semtype";
       }
       amm:parameter min-elements {
         description
           "The smallest valid item count for the AC.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
       amm:parameter max-elements {
         description
           "The largest valid item count for the AC.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
     }
     amm:ident dlist {
       amm:enum 4;
       description
         "A diverse-typed list within an AC.";
       amm:base "./IDENT/semtype";
       amm:parameter item-types {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 62]
Internet-Draft               DTNMA ADM YANG                November 2026

           "The list of semantic type for each item in sequence within
            the list.
            The list itself is encoded as an AC in this parameter.";
         amm:ulist {
           amm:type "./TYPEDEF/semtype";
         }
       }
     }
     amm:ident umap {
       amm:enum 5;
       description
         "A uniformly-typed map within an AM.";
       amm:base "./IDENT/semtype";
       amm:parameter key-type {
         description
           "The semantic type for each key.";
         amm:type "./TYPEDEF/semtype";
       }
       amm:parameter value-type {
         description
           "The semantic type for each value.";
         amm:type "./TYPEDEF/semtype";
       }
     }
     amm:ident tblt {
       amm:enum 6;
       description
         "A parameterized table template for data within a TBL.";
       amm:base "./IDENT/semtype";
       amm:parameter columns {
         description
           "The list of column definitions as rows in a table.
            The order of these definitions is significant and correspond
            exactly with the order of columns in the TBL values.";
         amm:tblt {
           amm:key "name";
           amm:column name {
             description
               "The name of this column.
                Each name SHALL be unique within a table template.
                Each name SHALL be restricted to valid label text.";
             amm:type "//ietf/amm-base/typedef/id-text";
           }
           amm:column datatype {
             description
               "The semantic type for values in this column.";
             amm:type "./TYPEDEF/semtype";
           }

Birrane, et al.            Expires 6 May 2027                  [Page 63]
Internet-Draft               DTNMA ADM YANG                November 2026

         }
       }
       amm:parameter min-elements {
         description
           "The smallest valid row count for the TBL.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
       amm:parameter max-elements {
         description
           "The largest valid row count for the TBL.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
       amm:parameter key {
         description
           "The primary key column names tuples in this table,
            space-separated labels.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/textstr";
           amm:type "/ARITYPE/null";
         }
       }
       amm:parameter unique {
         description
           "The set of unique column name tuples in this table, as
            space-separated labels.
            The set itself is encoded as an AC in this parameter.";
         amm:default "/AC/()";
         amm:ulist {
           amm:type "/ARITYPE/textstr";
         }
       }
     }
     amm:ident union {
       amm:enum 8;
       description
         "A list of alternative type choices.";
       amm:base "./IDENT/semtype";
       amm:parameter choices {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 64]
Internet-Draft               DTNMA ADM YANG                November 2026

           "The semantic type for each choice.
            The list itself is encoded as an AC in this parameter.";
         amm:ulist {
           amm:type "./TYPEDEF/semtype";
         }
       }
     }
     amm:ident seq {
       amm:enum 9;
       description
         "A sequence of similarly-typed items as a sub-sequence of an
          AC value.
          This is only usable in specific contexts, such as within a
          ./IDENT/dlist parameter.";
       amm:base "./IDENT/semtype";
       amm:parameter item-type {
         description
           "The semantic type for all items in the sequence.";
         amm:type "./TYPEDEF/semtype";
       }
       amm:parameter min-elements {
         description
           "The smallest valid item count for the sequence.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
       amm:parameter max-elements {
         description
           "The largest valid item count for the sequence.";
         amm:default "null";
         amm:union {
           amm:type "/ARITYPE/uvast";
           amm:type "/ARITYPE/null";
         }
       }
     }

     // Named types
     amm:typedef semtype {
       amm:enum 25;
       description
         "A parameterized reference to a semantic type object.
          This is used for introspection of AMM objects.";
       amm:type "/ARITYPE/ident" {
         amm:base "./IDENT/semtype";

Birrane, et al.            Expires 6 May 2027                  [Page 65]
Internet-Draft               DTNMA ADM YANG                November 2026

       }
     }
   }
   <CODE ENDS>

Appendix C.  ADM Module for AMM Semantic Types and Unions

   The ADM module in this section implements base semantic types defined
   by the AMM.  This includes the following:

   *  Simple types described in Section 4.2.3 of [I-D.ietf-dtn-amm].

   *  Container types described in Section 4.2.4 of [I-D.ietf-dtn-amm].

   *  Union types described in Section 4.2.5 of [I-D.ietf-dtn-amm].

   <CODE BEGINS> file "ietf-amm-base.yang"
   module ietf-amm-base {
     yang-version 1.1;
     namespace "ari://ietf/amm-base/";
     prefix amm-type;

     import ietf-amm {
       prefix amm;
     }

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact
       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module defines base IDENT objects and base TYPEDEF
        objects for the AMM.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

Birrane, et al.            Expires 6 May 2027                  [Page 66]
Internet-Draft               DTNMA ADM YANG                November 2026

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2026-05-01 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 25;

     // abstract display hint hierarchy
     amm:ident display-hint {
       amm:enum 0;
       description
         "The base IDENT for objects usable as arguments for the
          'amm:display-hint' extension.
          This object itself provides no display hint purpose.";
       amm:abstract true;
     }
     amm:ident display-hint-integer {
       amm:enum 1;
       description
         "Intermediate base IDENT of display hints for integer values.
          Hints derived from this object SHALL only apply to built-in
          types BYTE, INT, UINT, VAST, and UVAST.";
       amm:abstract true;
       amm:base "./IDENT/display-hint";
     }
     amm:ident display-hint-float {
       amm:enum 2;
       description
         "Intermediate base IDENT of display hints for floating point
          values.
          Hints derived from this object SHALL only apply to built-in
          types REAL32 and REAL64.";
       amm:abstract true;
       amm:base "./IDENT/display-hint";

Birrane, et al.            Expires 6 May 2027                  [Page 67]
Internet-Draft               DTNMA ADM YANG                November 2026

     }
     amm:ident display-hint-bstr {
       amm:enum 3;
       description
         "Intermediate base IDENT of display hints for byte string
          values.
          Hints derived from this object SHALL only apply to built-in
          type BYTESTR.";
       amm:abstract true;
       amm:base "./IDENT/display-hint";
     }
     amm:ident display-hint-time {
       amm:enum 4;
       description
         "Intermediate base IDENT of display hints for time values.
          Hints derived from this object SHALL only apply to built-in
          types TP and TD.";
       amm:abstract true;
       amm:base "./IDENT/display-hint";
     }

     // Named type unions
     amm:typedef type-ref {
       amm:enum 0;
       description
         "Reference to either a built-in type or a TYPEDEF object.";
       amm:union {
         amm:type "/ARITYPE/aritype";
         amm:type "/ARITYPE/typedef";
       }
     }
     amm:typedef integer {
       amm:enum 1;
       description
         "Any type which represents a discrete integer.
          This union order prefers smaller range and signed types.";
       amm:union {
         amm:type "/ARITYPE/byte";
         amm:type "/ARITYPE/int";
         amm:type "/ARITYPE/uint";
         amm:type "/ARITYPE/vast";
         amm:type "/ARITYPE/uvast";
       }
     }
     amm:typedef float {
       amm:enum 2;
       description
         "Any type which represents a floating point number.

Birrane, et al.            Expires 6 May 2027                  [Page 68]
Internet-Draft               DTNMA ADM YANG                November 2026

          This union order prefers smaller range.";
       amm:union {
         amm:type "/ARITYPE/real32";
         amm:type "/ARITYPE/real64";
       }
     }
     amm:typedef numeric {
       amm:enum 3;
       description
         "Any type which can be used with numeric expressions.";
       amm:union {
         amm:type "./TYPEDEF/integer";
         amm:type "./TYPEDEF/float";
       }
     }
     amm:typedef numeric-or-time {
       amm:enum 27;
       description
         "Any type which can be used with numeric or time-as-numeric
          expressions.";
       amm:union {
         amm:type "./TYPEDEF/numeric";
         amm:type "./TYPEDEF/time";
       }
     }
     amm:typedef primitive {
       amm:enum 4;
       description
         "Any primitive type.
          This union order prefers conversion to wide types.";
       amm:union {
         amm:type "./TYPEDEF/numeric";
         amm:type "/ARITYPE/textstr";
         amm:type "/ARITYPE/bytestr";
         amm:type "/ARITYPE/bool";
         // null is last option for conversion
         amm:type "/ARITYPE/null";
       }
     }
     amm:typedef time {
       amm:enum 5;
       description
         "Any type which can be used with time expressions.";
       amm:union {
         amm:type "/ARITYPE/TP";
         amm:type "/ARITYPE/TD";
       }
     }

Birrane, et al.            Expires 6 May 2027                  [Page 69]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:typedef simple {
       amm:enum 6;
       description
         "Any type which contains a single literal value (not nested).";
       amm:union {
         amm:type "./TYPEDEF/TIME";
         amm:type "./TYPEDEF/PRIMITIVE";
       }
     }
     amm:typedef nested {
       amm:enum 7;
       description
         "A literal type which contains other ARI values.";
       amm:union {
         amm:type "/ARITYPE/AC";
         amm:type "/ARITYPE/AM";
         amm:type "/ARITYPE/TBL";
       }
     }
     amm:typedef any {
       amm:enum 8;
       description
         "Any value representable by an ARI.";
       // These type names are built-in
       amm:union {
         amm:type "/ARITYPE/literal";
         amm:type "/ARITYPE/object";
         amm:type "/ARITYPE/namespace";
       }
     }
     amm:typedef value-obj {
       amm:enum 9;
       description
         "A reference to an object which can produce a value.";
       amm:union {
         amm:type "/ARITYPE/const";
         amm:type "/ARITYPE/edd";
         amm:type "/ARITYPE/var";
       }
     }
     amm:typedef nonce {
       amm:enum 10;
       description
         "This type union is used to correlate Agent-Manager messages.
          The union is defined in Section 4.2.5 of draft-ietf-dtn-amm.";
       reference
         "draft-ietf-dtn-amm";
       amm:union {

Birrane, et al.            Expires 6 May 2027                  [Page 70]
Internet-Draft               DTNMA ADM YANG                November 2026

         amm:type "/ARITYPE/bytestr";
         amm:type "/ARITYPE/uvast";
         amm:type "/ARITYPE/null";
       }
     }
     amm:typedef id-text {
       amm:enum 25;
       description
         "This type is used to define and match object text names.
          The type is defined in Section 4.2.5 of draft-ietf-dtn-amm.";
       reference
         "draft-ietf-dtn-amm";
       amm:type "/ARITYPE/textstr" {
         pattern '!?[A-Za-z_][0-9A-Za-z_\-\.]*';
       }
     }
     amm:typedef id-int {
       amm:enum 26;
       description
         "This type is used to define and match object integer
          enumerations.
          The type is defined in Section 4.2.5 of draft-ietf-dtn-amm.";
       reference
         "draft-ietf-dtn-amm";
       amm:type "/ARITYPE/int";
     }

     // operational semantic types
     amm:typedef counter32 {
       amm:enum 11;
       description
         "A 32-bit counter with an arbitrary initial value which can
          only increment and never decrement.
          When the value reaches the upper limit of the type it wraps
          around to zero.
          At least two samples of this value need to be compared over
          time to be meaningful.
          This type is consistent with the SMIv2 and YANG data types
          of the same name.";
       reference
         "RFC 2578: Structure of Management Information Version 2
          RFC 6021: Common YANG Data Types";
       amm:type "/ARITYPE/uint";
     }
     amm:typedef counter64 {
       amm:enum 12;
       description
         "A 64-bit counter with an arbitrary initial value which can

Birrane, et al.            Expires 6 May 2027                  [Page 71]
Internet-Draft               DTNMA ADM YANG                November 2026

          only increment and never decrement.
          When the value reaches the upper limit of the type it wraps
          around to zero.
          At least two samples of this value need to be compared over
          time to be meaningful.
          This type is consistent with the SMIv2 and YANG data types
          of the same name.";
       reference
         "RFC 2578: Structure of Management Information Version 2
          RFC 6021: Common YANG Data Types";
       amm:type "/ARITYPE/uvast";
     }
     amm:typedef gauge32 {
       amm:enum 13;
       description
         "A 32-bit value sampling some quantized measurement.
          The value can increase or decrease arbitrarily over time.
          This type is consistent with the SMIv2 and YANG data types
          of the same name.";
       reference
         "RFC 2578: Structure of Management Information Version 2
          RFC 6021: Common YANG Data Types";
       amm:type "/ARITYPE/int";
     }
     amm:typedef gauge64 {
       amm:enum 14;
       description
         "A 64-bit value sampling some quantized measurement.
          The value can increase or decrease arbitrarily over time.
          This type is consistent with the SMIv2 and YANG data types
          of the same name.";
       reference
         "RFC 2578: Structure of Management Information Version 2
          RFC 6021: Common YANG Data Types";
       amm:type "/ARITYPE/vast";
     }
     amm:typedef timestamp {
       amm:enum 15;
       description
         "A time point representing the system clock at which a specific
          occurrence happened.
          The specific occurrence must be defined in the description
          of any node defined using this type.
          This type is consistent with the SMIv2 and YANG data types
          of the same name.";
       reference
         "RFC 2579: Textual Conventions for SMIv2
          RFC 6021: Common YANG Data Types";

Birrane, et al.            Expires 6 May 2027                  [Page 72]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:type "/ARITYPE/tp";
     }

     // Restrictions on AC item types for Evaluation and EXPR
     amm:typedef eval-tgt {
       amm:enum 16;
       description
         "A value which can be the target of an evaluation.
          An inline <./typedef/expr> value is evaluated directly.
          A reference to a value-producing object is dereferenced and
          SHALL produce a value that matches <./typedef/expr>, which
          is then evaluated.";
       amm:union {
         // object which produces an expression
         amm:type "./TYPEDEF/value-obj";
         // inline expression
         amm:type "./TYPEDEF/expr";
       }
     }
     amm:typedef expr-item {
       amm:enum 17;
       description
         "Each item of an EXPR list.";
       amm:union {
         // plain value for the stack
         amm:type "/ARITYPE/literal";
         // object which produces a value for the stack
         amm:type "./TYPEDEF/value-obj";
         // operator to evaluate
         amm:type "/ARITYPE/oper";
       }
     }
     amm:typedef expr {
       amm:enum 18;
       description
         "The contents of an EXPR container.";
       amm:ulist {
         amm:type "./TYPEDEF/expr-item";
       }
     }

     // Restrictions on AC item types for Execution and MAC
     amm:typedef exec-tgt {
       amm:enum 19;
       description
         "A value which can be the target of an execution.
          An inline <./typedef/mac> value is expanded and executed.
          A reference to a value-producing object is dereferenced and

Birrane, et al.            Expires 6 May 2027                  [Page 73]
Internet-Draft               DTNMA ADM YANG                November 2026

          SHALL produce a value that matches <./typedef/exec-tgt>,
          which is then executed.
          A reference to a CTRL is executed directly.";
       amm:union {
         amm:type "./TYPEDEF/exec-item";
         // inline MAC
         amm:type "./TYPEDEF/mac";
       }
     }
     amm:typedef exec-item {
       amm:enum 20;
       description
         "A reference to an object which can be executed.
          The value-object must be typed to contain a
          <./typedef/exec-tgt>.";
       amm:union {
         amm:type "/ARITYPE/ctrl";
         // object which produces an exec-tgt
         amm:type "./TYPEDEF/value-obj";
       }
     }
     amm:typedef mac {
       amm:enum 21;
       description
         "The contents of a MAC container are an ordered list of
          executable values.";
       amm:ulist {
         amm:type "./TYPEDEF/exec-item";
       }
     }

     // Restrictions on AC item types for Reporting and RPTT
     amm:typedef rpt-tgt {
       amm:enum 22;
       description
         "A value which can be the target of reporting.";
       amm:union {
         // object which produces an RPTT
         amm:type "./TYPEDEF/value-obj";
         // inline RPTT
         amm:type "./TYPEDEF/rptt";
       }
     }
     amm:typedef rptt-item {
       amm:enum 23;
       description
         "Each item of a RPTT.
          Each item references a value-producing object or contains an

Birrane, et al.            Expires 6 May 2027                  [Page 74]
Internet-Draft               DTNMA ADM YANG                November 2026

          expression to be evaluated.";
       amm:union {
         // produces the report item
         amm:type "./TYPEDEF/value-obj";
         // evaluates to the report item
         amm:type "./TYPEDEF/expr";
       }
     }
     amm:typedef rptt {
       amm:enum 24;
       description
         "The contents of a report template, encoded as the sequence
          of template items.";
       amm:ulist {
         amm:type "./TYPEDEF/rptt-item";
       }
     }
   }
   <CODE ENDS>

Appendix D.  ADM Module for Base Networking Objects

   The ADM module in this section implements IDENT objects and semantic
   types associated with abstract networking identifiers and endpoints.
   Specific networking technologies and protocols can derive from the
   abstract bases to implement concrete protocol-specific logic.

   <CODE BEGINS> file "ietf-network-base.yang"
   module ietf-network-base {
     yang-version 1.1;
     namespace "ari://ietf/network-base/";
     prefix network-base;

     import ietf-amm {
       prefix amm;
     }
     import ietf-amm-base {
       prefix amm-base;
     }

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact
       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

Birrane, et al.            Expires 6 May 2027                  [Page 75]
Internet-Draft               DTNMA ADM YANG                November 2026

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module defines base IDENT objects for network-related
        entities such as protocol endpoints. The base objects are
        general purpose, and all derived objects are layer- and/or
        protocol-specific with appropriate parameters.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2026-04-02 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 26;

     // General purpose network data types and forms
     amm:typedef uri {
       amm:enum 0;
       description
         "A specialization of the textstr type to only contain a single
          Uniform Resource Identifier (URI) as defined by STD 66.

          Objects using the uri type MUST be in US-ASCII encoding,
          and MUST be normalized as described by RFC 3986 Sections
          6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary

Birrane, et al.            Expires 6 May 2027                  [Page 76]
Internet-Draft               DTNMA ADM YANG                November 2026

          percent-encoding is removed, and all case-insensitive
          characters are set to lowercase except for hexadecimal
          digits, which are normalized to uppercase as described in
          Section 6.2.2.1.

          The purpose of this normalization is to help provide
          unique URIs.  Note that this normalization is not
          sufficient to provide uniqueness.  Two URIs that are
          textually distinct after this normalization may still be
          equivalent.

          Objects using the uri type may restrict the schemes that
          they permit.  For example, 'data:' and 'urn:' schemes
          might not be appropriate.

          A zero-length URI is not a valid URI.  This can be used to
          express 'URI absent' where required.

          In the value set and its semantics, this type is equivalent
          to the Uri SMIv2 textual convention defined in RFC 5017.";
       reference
         "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
          RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
                    Group: Uniform Resource Identifiers (URIs), URLs,
                    and Uniform Resource Names (URNs): Clarifications
                    and Recommendations
          RFC 5017: MIB Textual Conventions for Uniform Resource
                    Identifiers (URIs)";
       amm:type "/aritype/textstr" {
         // This pattern is on the normalized scheme
         pattern '[a-z][a-z0-9+-.]*:.*';
       }
     }
     amm:ident display-bstr-uuid {
       amm:enum 17;
       description
         "Interpret byte string values as UUID and display as
          human-friendly text according to RFC 9562 conventions.";
       reference
         "RFC 9562: Universally Unique IDentifiers (UUIDs)";
       amm:base "//ietf/amm-base/IDENT/display-hint-bstr";
     }
     amm:typedef uuid {
       amm:enum 5;
       description
         "A specialization of the bytestr type to contain a binary
          encoded UUID value.
          Values of this type SHALL contain a valid UUID value

Birrane, et al.            Expires 6 May 2027                  [Page 77]
Internet-Draft               DTNMA ADM YANG                November 2026

          as defined in Section 4 of RFC 9562.";
       reference
         "RFC 9562: Universally Unique IDentifiers (UUIDs)";
       amm:type "/aritype/bytestr" {
         length "16";
       }
     }
     amm:ident display-bstr-oid {
       amm:enum 18;
       description
         "Interpret byte string values as ASN.1 BER-encoded OIDs
          and display as human-friendly dotted-decimal form of
          ITU-T X.660.";
       reference
         "ITU-T X.660-2011: General procedures and top arcs of the
            international object identifier tree";
       amm:base "//ietf/amm-base/IDENT/display-hint-bstr";
     }
     amm:typedef oid {
       amm:enum 4;
       description
         "A specialization of the bytestr type to contain an ASN.1
          BER-encoded object identifier (OID) value.
          This typedef gives no more specific AMM constraints on
          the byte string value but does constrain it by these
          requirements.
          Values of this type SHALL contain valid BER-encoded OID
          contents consistent with the definition of CBOR tag 111
          but without the actual tag, as defined in Section 2.1 of
          RFC 9090.
          Values of this type always contain an absolute OID.";
       reference
         "RFC 9090: Concise Binary Object Representation (CBOR) Tags
            for Object Identifiers
          ITU-T X.660-2011: General procedures and top arcs of the
            international object identifier tree
          ITU-T X.690-2021: ASN.1 encoding rules: Specification of
            Basic Encoding Rules (BER), Canonical Encoding
            Rules (CER) and Distinguished Encoding Rules (DER)";
       amm:type "/aritype/bytestr" {
         length "2..max";
       }
     }

     // Abstract base IDENTs and types
     amm:ident abstract-endpoint {
       amm:enum 0;
       description

Birrane, et al.            Expires 6 May 2027                  [Page 78]
Internet-Draft               DTNMA ADM YANG                November 2026

         "This object defines an abstract base for all general purpose
          network/transport endpoint identifiers as seen from outside
          the endpoint node.
          Uses where the endpoint is being bound to from inside the
          node might require additional parameters outside of what is
          present in this object hierarchy.";
       amm:abstract true;
     }
     amm:typedef endpoint {
       amm:enum 1;
       description
         "A value which references a non-abstract derived object
          for specific types of network or transport endpoints.";
       amm:type "/aritype/ident" {
         amm:base "./IDENT/abstract-endpoint";
       }
     }
     amm:typedef endpoint-or-uri {
       amm:enum 3;
       description
         "A value which is either a specific parameterized endpoint
          IDENT reference or a text URI value identifying an endpoint.";
       amm:union {
         amm:type "./typedef/endpoint";
         amm:type "./typedef/uri";
       }
     }
   }
   <CODE ENDS>

Appendix E.  IANA Assignments for display-hint

   The ADM module in this section defines display-hint-derived IDENT
   objects described in Section 3.3.1 of [I-D.ietf-dtn-amm] for specific
   representations.

   <CODE BEGINS> file "iana-display-hints.yang"
   module iana-display-hints {
     yang-version 1.1;
     namespace "ari://iana/display-hints/";
     prefix ianadh;

     import ietf-amm {
       prefix amm;
     }
     import ietf-amm-base {
       prefix amm-base;
     }

Birrane, et al.            Expires 6 May 2027                  [Page 79]
Internet-Draft               DTNMA ADM YANG                November 2026

     organization
       "Internet Assigned Numbers Authority (IANA)" {
       amm:enum 2;
     }
     contact
       "Internet Assigned Numbers Authority

        Postal: ICANN
                12025 Waterfront Drive, Suite 300
                Los Angeles, CA 90094-2536
                United States of America
        Tel:    +1 310 301 5800
        <mailto:iana@iana.org>";
     description
       "This module defines leaf IDENT objects usable as 'display-hint'
        semantic type annotations derived from the base
        <ari://ietf/amm-base/ident/display-hint> object.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "https://www.iana.org/assignments/DTNMA-TBA";

     revision 2025-07-03 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 0;

Birrane, et al.            Expires 6 May 2027                  [Page 80]
Internet-Draft               DTNMA ADM YANG                November 2026

     // Integer number hints
     amm:ident display-int-dec {
       amm:enum 2;
       description
         "Display integers as decimal (base 10).";
       amm:base "//ietf/amm-base/ident/display-hint-integer";
     }
     amm:ident display-int-bin {
       amm:enum 3;
       description
         "Display integers as binary (base 2).";
       amm:base "//ietf/amm-base/ident/display-hint-integer";
     }
     amm:ident display-int-hex {
       amm:enum 4;
       description
         "Display integers as hexadecimal (base 16).";
       amm:base "//ietf/amm-base/ident/display-hint-integer";
     }

     // Floating-point number hints
     amm:ident display-float-dec {
       amm:enum 6;
       description
         "Display floating point values as decimal fraction.";
       amm:base "//ietf/amm-base/ident/display-hint-float";
     }
     amm:ident display-float-exp {
       amm:enum 7;
       description
         "Display floating point values as decimal exponential form.";
       amm:base "//ietf/amm-base/ident/display-hint-float";
     }
     amm:ident display-float-hex {
       amm:enum 8;
       description
         "Display floating point values as hexadecimal exponential
          form.";
       amm:base "//ietf/amm-base/ident/display-hint-float";
     }

     // Byte-string hints
     amm:ident display-bstr-text {
       amm:enum 10;
       description
         "Display byte string values as UTF-8 text where possible.
          The base16 encoding is used otherwise.";
       reference

Birrane, et al.            Expires 6 May 2027                  [Page 81]
Internet-Draft               DTNMA ADM YANG                November 2026

         "draft-ietf-dtn-ari";
       amm:base "//ietf/amm-base/ident/display-hint-bstr";
     }
     amm:ident display-bstr-base16 {
       amm:enum 11;
       description
         "Display byte string values as base16-encoded.";
       reference
         "draft-ietf-dtn-ari";
       amm:base "//ietf/amm-base/ident/display-hint-bstr";
     }
     amm:ident display-bstr-base64 {
       amm:enum 12;
       description
         "Display byte string values as base64url-encoded.";
       reference
         "draft-ietf-dtn-ari";
       amm:base "//ietf/amm-base/ident/display-hint-bstr";
     }

     // TIME type (TP or TD built-ins) hints
     amm:ident display-time-text {
       amm:enum 14;
       description
         "Display TP and TD values as text in accordance with
          RFC 3339 not using separator characters.";
       reference
         "draft-ietf-dtn-ari";
       amm:base "//ietf/amm-base/ident/display-hint-time";
     }
     amm:ident display-time-dec {
       amm:enum 15;
       description
         "Display TP and TD values as decimal fraction with units of
          seconds, which may or may not include a fractional part.";
       reference
         "draft-ietf-dtn-ari";
       amm:base "//ietf/amm-base/ident/display-hint-time";
     }
   }
   <CODE ENDS>

Appendix F.  ADM Module for DTNMA Agents

   The ADM module in this section implements the entities described in
   Section 4.3 of [I-D.ietf-dtn-amm].  This includes the following:

   *  Introspective access to the ADMs supported by the Agent.

Birrane, et al.            Expires 6 May 2027                  [Page 82]
Internet-Draft               DTNMA ADM YANG                November 2026

   *  Introspective access to the VARs in ODMs.

   *  A feature and introspective access to rules in ODMs.

   *  A report template used to announce presence of an Agent.

   *  Base helper controls and arithmetic operators

   <CODE BEGINS> file "ietf-dtnma-agent.yang"
   module ietf-dtnma-agent {
     yang-version 1.1;
     namespace "ari://ietf/dtnma-agent/";
     prefix da;

     import ietf-amm {
       prefix amm;
     }
     import ietf-amm-semtype {
       prefix amm-semtype;
     }
     import ietf-amm-base {
       prefix amm-base;
     }
     import ietf-network-base {
       prefix network-base;
     }

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact
       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module implements the DTN Management Architecture (DTNMA)
        Agent core functionality.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as

Birrane, et al.            Expires 6 May 2027                  [Page 83]
Internet-Draft               DTNMA ADM YANG                November 2026

        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2026-05-01 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }

     feature rules {
       description
         "Conforming to this feature enables time-based and
          state-based autonomy rules.
          A basic implementation can omit these and only allow
          direct manager execution without rules.
          Even without rules, an application can choose to
          generate and send reports at-will using internal
          Agent--application API.";
     }

     feature exec-control {
       description
         "Conforming to this feature enables controls which
          allow advanced sequencing of execution flows
          in an Agent.
          A basic implementation can omit these controls and
          allow only straightforward linear execution sequences
          with no waiting and no conditional branching.";
     }

     grouping obj-list-params {
       description
         "Common parameters for object listing";
       amm:parameter include-adm {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 84]
Internet-Draft               DTNMA ADM YANG                November 2026

           "If true, listings will include objects from ADMs";
         amm:default "false";
         amm:type "/aritype/BOOL";
       }
     }

     grouping ensure-object-id {
       description
         "Common parameters for providing object reference to
          ensure an object exists in an ODM.

          When this grouping is used, the logic operates according
          to the following in order to succeed.
          The parent 'namespace' SHALL refer to an existing ODM.
          Both the text 'obj-name' and integer 'obj-enum' SHALL
          either both not exist, in which case the object will be
          created, or both are allocated to the same object, in
          which case the object will be modified as needed.";
       amm:parameter namespace {
         description
           "The parent ODM namespace.";
         amm:type "/aritype/namespace";
       }
       amm:parameter obj-name {
         description
           "Text name for the desired object.";
         amm:type "//ietf/amm-base/typedef/id-text";
       }
       amm:parameter obj-enum {
         description
           "Integer enumeration for the desired object.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
     }

     grouping ensure-object-params {
       description
         "Common parameter for providing formal parameter
          definitions to ensure an object exists in an ODM.

          When this grouping is used it should be after all of
          the mandatory parameters (those with no default value)
          to allow the default no-formal-parameters to be used.";
       amm:parameter formal-params {
         description
           "An optional list of formal parameters for the object.";
         amm:default "/tbl/c=3;";
         amm:type "./typedef/formal-params-tbl";

Birrane, et al.            Expires 6 May 2027                  [Page 85]
Internet-Draft               DTNMA ADM YANG                November 2026

       }
     }

     grouping any-binary-operands {
       description
         "Any-value binary operands";
       amm:operand left {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:operand right {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     grouping any-unary-result {
       description
         "Any-value result";
       amm:result result {
         description
           "The single value.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     grouping numeric-time-binary-operands {
       description
         "Numeric or time binary operands";
       amm:operand left {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/numeric-or-time";
       }
       amm:operand right {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/numeric-or-time";
       }
     }

     grouping numeric-binary-operands {
       description
         "Numeric binary operands";
       amm:operand left {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 86]
Internet-Draft               DTNMA ADM YANG                November 2026

           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/NUMERIC";
       }
       amm:operand right {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/NUMERIC";
       }
     }

     grouping numeric-unary-result {
       description
         "Numeric result";
       amm:result result {
         description
           "The single value.";
         amm:type "//ietf/amm-base/typedef/NUMERIC";
       }
     }

     grouping integer-unary-operands {
       description
         "Integer unary operand";
       amm:operand val {
         description
           "The single value.";
         amm:type "//ietf/amm-base/typedef/INTEGER";
       }
     }

     grouping integer-binary-operands {
       description
         "Integer binary operands";
       amm:operand left {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/INTEGER";
       }
       amm:operand right {
         description
           "The left-side operand.";
         amm:type "//ietf/amm-base/typedef/INTEGER";
       }
     }

     grouping integer-unary-result {
       description
         "Integer result";

Birrane, et al.            Expires 6 May 2027                  [Page 87]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:result result {
         description
           "The single value.";
         amm:type "//ietf/amm-base/typedef/INTEGER";
       }
     }

     grouping bool-unary-operands {
       description
         "Boolean unary operand";
       amm:operand val {
         description
           "The single value.";
         amm:type "/aritype/BOOL";
       }
     }

     grouping bool-binary-operands {
       description
         "Boolean binary operands";
       amm:operand left {
         description
           "The left-side operand.";
         amm:type "/aritype/BOOL";
       }
       amm:operand right {
         description
           "The left-side operand.";
         amm:type "/aritype/BOOL";
       }
     }

     grouping bool-unary-result {
       description
         "Boolean result";
       amm:result result {
         description
           "The single value.";
         amm:type "/aritype/BOOL";
       }
     }

     grouping predicate-compose-interface {
       description
         "A common interface for all predicate composition
          operators below.";
       amm:parameter operators {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 88]
Internet-Draft               DTNMA ADM YANG                November 2026

           "The list of other predicate operators to evaluate and
            combine their results.";
         amm:ulist {
           amm:type "/aritype/oper";
         }
       }
       amm:operand value {
         description
           "The value to pass-through and evaluate with each of the
            subordinate operators.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result combined {
         description
           "The combined boolean result.";
         amm:type "/aritype/bool";
       }
     }

     amm:enum 1;
     amm:edd sw-vendor {
       amm:enum 0;
       description
         "The vendor for this Agent implementation.";
       amm:type "/aritype/TEXTSTR";
     }
     amm:edd sw-version {
       amm:enum 1;
       description
         "The version for this Agent implementation.";
       amm:type "/aritype/TEXTSTR";
     }
     amm:edd capability {
       amm:enum 2;
       description
         "A table to indicate the ADM capability of the sending agent.";
       amm:tblt {
         amm:key "org-name adm-name";
         amm:column org-name {
           description
             "The organization name containing the ADM";
           amm:type "/aritype/TEXTSTR";
         }
         amm:column org-enum {
           description
             "The organization enumeration containing the ADM";
           amm:type "/aritype/VAST";
         }

Birrane, et al.            Expires 6 May 2027                  [Page 89]
Internet-Draft               DTNMA ADM YANG                November 2026

         amm:column model-name {
           description
             "The model name of the ADM";
           amm:type "/aritype/TEXTSTR";
         }
         amm:column model-enum {
           description
             "The model enumeration of the ADM";
           amm:type "/aritype/VAST";
         }
         amm:column revision {
           description
             "The specific revision the agent supports.";
           amm:type "/aritype/TEXTSTR";
         }
         amm:column features {
           description
             "The features of the ADM which the agent supports.";
           amm:ulist {
             amm:type "/aritype/TEXTSTR";
           }
         }
       }
     }
     amm:const hello {
       amm:enum 0;
       description
         "A report template to indicate the presence of an agent
          on a network.";
       amm:init-value "/AC/(./EDD/sw-vendor,./EDD/sw-version,"
                    + "./EDD/capability)";
       amm:type "//ietf/amm-base/typedef/RPTT";
     }

     // Messaging counters
     amm:edd num-msg-rx {
       amm:enum 3;
       description
         "Counter of the number of AMP messages of any type received
          from any manager.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd num-msg-rx-failed {
       amm:enum 4;
       description
         "Counter of received EXECSET values that failed to be decoded
          and processed.";
       amm:type "//ietf/amm-base/typedef/counter64";

Birrane, et al.            Expires 6 May 2027                  [Page 90]
Internet-Draft               DTNMA ADM YANG                November 2026

     }
     amm:edd num-msg-tx {
       amm:enum 5;
       description
         "Counter of the number of AMP messages of any type transmitted
          to any manager.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd num-msg-tx-failed {
       amm:enum 15;
       description
         "Counter of RPTSET values that encoded but failed to be sent.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd last-msg-rx-time {
       amm:enum 17;
       description
         "A timestamp on the Agent when the latest AMP message was
          received from any manager.";
       amm:type "/aritype/TP";
     }

     // Execution counters and states
     amm:edd num-exec-started {
       amm:enum 6;
       description
         "Number of CTRL executions started.
          This does not include EXECSETs which have been received and
          are still queued for execution.
          See <./edd/exec-running> table for those details.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd num-exec-succeeded {
       amm:enum 7;
       description
         "Number of successful CTRL executions.
          This means the CTRL result was not undefined.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd num-exec-failed {
       amm:enum 8;
       description
         "Number of failed CTRL executions.
          This means the CTRL result was undefined.";
       amm:type "//ietf/amm-base/typedef/counter64";
     }
     amm:edd exec-running {
       amm:enum 9;

Birrane, et al.            Expires 6 May 2027                  [Page 91]
Internet-Draft               DTNMA ADM YANG                November 2026

       description
         "Information on controls currently being executed.
          This represents tracking of execution requests from
          received EXECSET values until the entire execution is
          finished (successfully or not).
          Once finished, the Agent SHALL remove the associated row
          from this table and never re-use its 'pid' value.";
       amm:tblt {
         amm:key "pid";
         amm:column pid {
           description
             "An identifier internal to an Agent used to correlate
              table rows over time.
              An implementation MAY assign values from a smaller
              domain than this column can represent.";
           amm:type "/aritype/UVAST";
         }
         amm:column target {
           description
             "The original, full target of the execution.
              This can be an inline MAC or a CTRL reference.";
           amm:type "//ietf/amm-base/typedef/exec-tgt";
         }
         amm:column state {
           description
             "The state of executing the target within the Agent.";
           amm:type "/aritype/BYTE" {
             amm:int-labels {
               enum waiting {
                 value 0;
                 description
                   "The execution is waiting on a condition or timer
                    to continue.
                    This includes waiting on Agent resources for the
                    execution itself.";
               }
               enum running {
                 value 1;
                 description
                   "The execution is currently running.";
               }
             }
           }
         }
       }
     }

     // MAC helper controls

Birrane, et al.            Expires 6 May 2027                  [Page 92]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:ctrl if-then-else {
       if-feature "exec-control";
       amm:enum 0;
       description
         "Evaluate an expression and follow one of two branches of
          further evaluation.";
       amm:parameter condition {
         description
           "The condition (inline or reference) to evaluate and
            convert to BOOL type.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";
       }
       amm:parameter on-truthy {
         description
           "The target to execute when the condition is truthy.";
         amm:default "null";
         amm:union {
           amm:type "//ietf/amm-base/typedef/exec-tgt";
           amm:type "/aritype/NULL";
         }
       }
       amm:parameter on-falsy {
         description
           "An optional target to execute when the condition is
            not truthy (including if evaluates to undefined).";
         amm:default "null";
         amm:union {
           amm:type "//ietf/amm-base/typedef/exec-tgt";
           amm:type "/aritype/NULL";
         }
       }
       amm:result branch {
         description
           "Indication of which branch was executed.";
         amm:type "/aritype/BOOL";
       }
     }
     amm:ctrl catch {
       if-feature "exec-control";
       amm:enum 1;
       description
         "Attempt to execute a target, and if there is some failure
          catch it and execute an alternative target.";
       amm:parameter try {
         description
           "The target to execute.";
         amm:type "//ietf/amm-base/typedef/exec-tgt";
       }

Birrane, et al.            Expires 6 May 2027                  [Page 93]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:parameter on-failure {
         description
           "An optional target to execute after failure.";
         amm:default "null";
         amm:union {
           amm:type "//ietf/amm-base/typedef/exec-tgt";
           amm:type "/aritype/NULL";
         }
       }
       amm:result try-success {
         description
           "True if the try target succeeded without exception.";
         amm:type "/aritype/BOOL";
       }
     }
     amm:ctrl exec-deadline {
       amm:enum 22;
       description
         "Execute a desired target and wait for it to finish before
          a relative time deadline.
          If it does not finish, it is terminated and an alternative
          timeout target is executed.
          If the target experiences a failure executing before the
          deadline, then this control will also fail.";
       amm:parameter target {
         description
           "The target to execute.";
         amm:type "//ietf/amm-base/typedef/exec-tgt";
       }
       amm:parameter deadline {
         description
           "The relative of time on the Agent to wait for
            the target to finish executing.";
         amm:type "/aritype/TD";
       }
       amm:parameter on-timeout {
         description
           "An optional target to execute after a timeout.";
         amm:default "null";
         amm:union {
           amm:type "//ietf/amm-base/typedef/exec-tgt";
           amm:type "/aritype/NULL";
         }
       }
       amm:result success {
         description
           "True if the target sub-execution succeeded before the
            deadline, false if the execution did not finish before,

Birrane, et al.            Expires 6 May 2027                  [Page 94]
Internet-Draft               DTNMA ADM YANG                November 2026

            and undefined if the execution failed before the
            deadline.";
         amm:type "/aritype/BOOL";
       }
     }
     amm:ctrl wait-for {
       if-feature "exec-control";
       amm:enum 2;
       description
         "This control causes the execution to pause for a given
          amount of time.
          This is intended to be used within a macro to separate
          controls in time.";
       amm:parameter duration {
         description
           "The relative of time on the Agent to wait for.";
         amm:type "/aritype/TD";
       }
     }
     amm:ctrl wait-until {
       if-feature "exec-control";
       amm:enum 3;
       description
         "This control causes the execution to pause until a specific
          absolute time point.
          This is intended to be used within a macro to separate
          controls in time or as a first macro item to delay execution
          after the time of reception.";
       amm:parameter time {
         description
           "The absolute Agent time at which to stop waiting.";
         amm:type "/aritype/TP";
       }
     }
     amm:ctrl wait-cond {
       if-feature "exec-control";
       amm:enum 4;
       description
         "This control causes the execution to pause until a condition
          expression evaluates to truthy.
          This is intended to be used within a macro to separate
          controls in time or as a first macro item to delay execution
          until the condition is met.";
       amm:parameter condition {
         description
           "The condition (inline or reference) to evaluate and
            convert to BOOL type.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";

Birrane, et al.            Expires 6 May 2027                  [Page 95]
Internet-Draft               DTNMA ADM YANG                November 2026

       }
       amm:parameter min-interval {
         description
           "An optional hint used by an Agent to limit how frequently
            the condition is evaluated.
            If this is null, an implementation-defined default will
            be used.";
         amm:default "null";
         amm:union {
           amm:type "/aritype/TD";
           amm:type "/aritype/NULL";
         }
       }
     }

     // Value production and reporting
     amm:ctrl inspect {
       amm:enum 5;
       description
         "Produce a result value to inspect the agent state.
          This does not perform any EXPR evaluation or RPTT handling.";
       amm:parameter ref {
         description
           "An object to produce a value from.";
         amm:type "//ietf/amm-base/typedef/VALUE-OBJ";
       }
       amm:result val {
         description
           "The produced value.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }
     amm:ctrl report-on {
       amm:enum 6;
       description
         "Agent-wide control to generate a report from a report
          template (RPTT) value.
          The parameter is a single RPTT list that would be produced
          by an object.
          If used for more than one-shot diagnostics, defining a RPTT
          (e.g. in a CONST within an ODM) is more efficient because
          the RPTT value would not need be present in the EXECSET or
          corresponding RPTSET.";
       amm:parameter template {
         description
           "The reporting template, either as a RPTT value directly or
            as a reference to a value-producing object (possibly
            parameterized) which itself produces an RPTT value.";

Birrane, et al.            Expires 6 May 2027                  [Page 96]
Internet-Draft               DTNMA ADM YANG                November 2026

         amm:type "//ietf/amm-base/typedef/rpt-tgt";
       }
       amm:parameter destinations {
         description
           "Destinations for the resulting report.
            If given an empty list (the default) reports will be sent
            to the manager executing this CTRL.
            When executed as a rule action, the destinations list is
            mandatory.

            It is possible that each destination has different access
            limitations so each destination might see different report
            contents.";
         amm:default "/ac/()";
         amm:ulist {
           amm:type "//ietf/network-base/typedef/endpoint-or-uri";
         }
       }
     }

     // Objects related to ODM handling
     amm:edd odm-list {
       amm:enum 16;
       description
         "A table of ODM within the agent.";
       amm:tblt {
         amm:key "org-name odm-name";
         amm:column org-name {
           description
             "The organization name containing the ODM";
           amm:type "//ietf/amm-base/typedef/id-text";
         }
         amm:column org-enum {
           description
             "The organization enumeration containing the ODM";
           amm:type "//ietf/amm-base/typedef/id-int";
         }
         amm:column model-name {
           description
             "The model name of the ODM";
           amm:type "//ietf/amm-base/typedef/id-text";
         }
         amm:column model-enum {
           description
             "The model enumeration of the ODM";
           amm:type "//ietf/amm-base/typedef/id-int";
         }
         amm:column revision {

Birrane, et al.            Expires 6 May 2027                  [Page 97]
Internet-Draft               DTNMA ADM YANG                November 2026

           description
             "The specific revision the agent supports.";
           amm:type "/aritype/TEXTSTR";
         }
       }
     }
     amm:ctrl ensure-odm {
       amm:enum 18;
       description
         "Ensure a specific ODM is present.
          The referenced organization and model identifiers SHALL either
          not already exist or exist with the exact combination given by
          these parameters";
       amm:parameter org-name {
         description
           "The organization name containing the ODM";
         amm:type "//ietf/amm-base/typedef/id-text";
       }
       amm:parameter org-id {
         description
           "The organization enumeration ID containing the ODM";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:parameter model-name {
         description
           "The model name containing the ODM.
            This value SHALL have a leading bang to indicate that it
            is an ODM.";
         amm:type "//ietf/amm-base/typedef/id-text" {
           pattern '!.+';
         }
       }
       amm:parameter model-id {
         description
           "The model enumeration ID containing the ODM.
            This value SHALL be negative to indicate that it is
            an ODM.";
         amm:type "//ietf/amm-base/typedef/id-int" {
           range "min..-1";
         }
       }
     }
     amm:ctrl obsolete-odm {
       amm:enum 19;
       description
         "Mark a specific ODM as obsolete if it is present.";
       amm:parameter odm-ns {
         description

Birrane, et al.            Expires 6 May 2027                  [Page 98]
Internet-Draft               DTNMA ADM YANG                November 2026

           "Namespace of the ODM";
         amm:type "/aritype/namespace";
       }
     }

     // Helpers for VAR
     amm:ctrl var-reset {
       amm:enum 7;
       description
         "Modify a VAR state to its default value.";
       amm:parameter target {
         description
           "The VAR object to affect.";
         amm:type "/aritype/VAR";
       }
     }
     amm:ctrl var-store {
       amm:enum 8;
       description
         "Modify a VAR state to a specific value.";
       amm:parameter target {
         description
           "The VAR object to affect.";
         amm:type "/aritype/VAR";
       }
       amm:parameter value {
         description
           "The exact value to store in the VAR.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     // Objects related to IDENT handling
     amm:edd ident-list {
       amm:enum 18;
       description
         "Inspect the set of (possibly filtered) IDENT objects known
          to the Agent.
          One possible filter is provided by the 'base' parameter to
          limit to a specific subtree of objects. Another is whether
          or not to include abstract objects in the list.";
       uses obj-list-params;
       amm:parameter include-abstract {
         description
           "Determine whether abstract objects are included in the
            list (when true), or only non-abstract objects (when
            false).";
         amm:default "false";

Birrane, et al.            Expires 6 May 2027                  [Page 99]
Internet-Draft               DTNMA ADM YANG                November 2026

         amm:type "/aritype/bool";
       }
       amm:parameter base {
         description
           "The optional base object from which to traverse derived
            objects. If this does not reference a known object the
            produced list SHALL be empty.
            The base object is not considered to be derived from
            itself, so it SHALL NOT be present in the produced list.";
         amm:default "null";
         amm:union {
           amm:type "/aritype/ident";
           amm:type "/aritype/null";
         }
       }
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/ident";
         }
         amm:column is-abstract {
           amm:type "/aritype/bool";
         }
       }
     }
     amm:ctrl ensure-ident {
       amm:enum 20;
       description
         "Ensure a specific IDENT is present in an ODM.
          If an object already exists with the same identifiers,
          parameters, and bases this control will do nothing
          and succeed.
          If an object already exists in the same namespace with either
          of the object identifiers this control will fail.";
       uses ensure-object-id;
       amm:parameter abstract {
         description
           "If true the object is abstract and SHALL NOT contain any
            formal parameters.";
         amm:type "/aritype/bool";
       }
       amm:parameter bases {
         description
           "The set of base objects for this object.";
         amm:ulist {
           amm:type "/aritype/ident";
         }
       }

Birrane, et al.            Expires 6 May 2027                 [Page 100]
Internet-Draft               DTNMA ADM YANG                November 2026

       uses ensure-object-params;
     }
     amm:ctrl obsolete-ident {
       amm:enum 21;
       description
         "Mark a specific IDENT as obsolete if it is present in an
          ODM.";
       amm:parameter obj {
         description
           "A reference to a IDENT within an ODM only.";
         amm:type "/aritype/IDENT";
       }
     }

     // Objects related to TYPEDEF handling
     amm:edd typedef-list {
       amm:enum 10;
       description
         "A table of TYPEDEF within the agent.";
       uses obj-list-params;
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/typedef";
         }
       }
     }

     // Objects related to CONST handling
     amm:edd const-list {
       amm:enum 14;
       description
         "A table of CONST within the agent.";
       uses obj-list-params;
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/CONST";
         }
         amm:column type {
           amm:type "//ietf/amm-semtype/typedef/semtype";
         }
       }
     }
     amm:ctrl ensure-const {
       amm:enum 11;
       description
         "Ensure a specific CONST is present in an ODM.

Birrane, et al.            Expires 6 May 2027                 [Page 101]
Internet-Draft               DTNMA ADM YANG                November 2026

          If an object already exists with the same identifiers,
          parameters, type, and value this control will do nothing
          and succeed.
          If an object already exists in the same namespace with either
          of the object identifiers this control will fail.";
       uses ensure-object-id;
       amm:parameter type {
         description
           "The type for the CONST object.";
         amm:type "//ietf/amm-semtype/typedef/semtype";
       }
       amm:parameter value {
         description
           "A required constant value.
            This value SHALL match the type given for this object.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       uses ensure-object-params;
     }
     amm:typedef formal-params-tbl {
       amm:enum 1;
       description
         "Introspection on formal parameters of an object which
          can be parameterized.
          The order of rows of the table is significant and
          corresponds with the index of each parameter.";
       amm:tblt {
         amm:key "name";
         amm:column name {
           description
             "The name of the parameter.
              This is unique among all rows.";
           amm:type "//ietf/amm-base/typedef/id-text";
         }
         amm:column type {
           description
             "The type for values of the parameter.";
           amm:type "//ietf/amm-semtype/typedef/semtype";
         }
         amm:column default {
           description
             "An optional default value.
              When there is no default, the undefined value is
              used here.";
           amm:type "//ietf/amm-base/typedef/any";
         }
       }
     }

Birrane, et al.            Expires 6 May 2027                 [Page 102]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:ctrl obsolete-const {
       amm:enum 12;
       description
         "Mark a specific CONST as obsolete if it is present in an
          ODM.";
       amm:parameter obj {
         description
           "A reference to a CONST within an ODM only.";
         amm:type "/aritype/CONST";
       }
     }

     // Objects related to VAR handling
     amm:edd var-list {
       amm:enum 11;
       description
         "A table of VAR within the agent.";
       uses obj-list-params;
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/VAR";
         }
         amm:column type {
           amm:type "//ietf/amm-semtype/typedef/semtype";
         }
       }
     }
     amm:ctrl ensure-var {
       amm:enum 9;
       description
         "Ensure a specific VAR is present in an ODM.
          If an object already exists with the same identifiers,
          parameters, type, and init-value this control will do
          nothing and succeed.
          If an object already exists in the same namespace with either
          of the object identifiers (but not both), or the type or
          is different, this control will fail.
          That means that this control can change only the initial value
          of a pre-existing VAR object.";
       uses ensure-object-id;
       amm:parameter type {
         description
           "The type for the VAR object.";
         amm:type "//ietf/amm-semtype/typedef/semtype";
       }
       amm:parameter init-value {
         description

Birrane, et al.            Expires 6 May 2027                 [Page 103]
Internet-Draft               DTNMA ADM YANG                November 2026

           "The exact value to use as the initial value of
            the new object and to store as the initial state
            of the object if created.
            This value SHALL match the type given for this object.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       uses ensure-object-params;
     }
     amm:ctrl obsolete-var {
       amm:enum 10;
       description
         "Mark a specific VAR as obsolete if it is present in an ODM.";
       amm:parameter obj {
         description
           "A reference to a VAR within an ODM only.";
         amm:type "/aritype/VAR";
       }
     }

     // Objects related to SBR handling
     amm:edd sbr-list {
       if-feature "rules";
       amm:enum 12;
       description
         "A table of SBR within the agent.";
       uses obj-list-params;
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/SBR";
         }
         amm:column action {
           description
             "The action (inline MAC or CTRL reference) to execute when
              this rule triggers.";
           amm:type "//ietf/amm-base/typedef/exec-tgt";
         }
         amm:column condition {
           description
             "The condition (inline or reference) to periodically
              evaluate and convert to BOOL type.";
           amm:type "//ietf/amm-base/typedef/eval-tgt";
         }
         amm:column min-interval {
           description
             "The minimum interval of Agent time between executions of
              the action.
              This can also be used by an Agent to limit how frequently

Birrane, et al.            Expires 6 May 2027                 [Page 104]
Internet-Draft               DTNMA ADM YANG                November 2026

              the condition is evaluated.";
           amm:type "/aritype/TD";
         }
         amm:column max-count {
           description
             "Number of executions of the action, after being enabled,
              when the rule is disabled.";
           amm:type "/aritype/UVAST";
         }
         amm:column init-enabled {
           description
             "Whether the rule is enabled at Agent initialization.";
           amm:type "/ARITYPE/BOOL";
         }
         amm:column enabled {
           description
             "The current enabled state of the rule.";
           amm:type "/ARITYPE/BOOL";
         }
       }
     }
     amm:edd tbr-list {
       if-feature "rules";
       amm:enum 13;
       description
         "A table of TBR within the agent.";
       uses obj-list-params;
       amm:tblt {
         amm:key "obj";
         amm:column obj {
           amm:type "/aritype/TBR";
         }
         amm:column action {
           description
             "The action (inline MAC or CTRL reference) to execute when
              this rule triggers.";
           amm:type "//ietf/amm-base/typedef/exec-tgt";
         }
         amm:column start-time {
           description
             "The earliest time (absolute or init-relative) at which
              the action is executed.";
           amm:type "//ietf/amm-base/typedef/TIME";
         }
         amm:column period {
           description
             "How often the action is executed.";
           amm:type "/aritype/TD";

Birrane, et al.            Expires 6 May 2027                 [Page 105]
Internet-Draft               DTNMA ADM YANG                November 2026

         }
         amm:column max-count {
           description
             "Number of executions of the action, after being enabled,
              when the rule is disabled.";
           amm:type "/aritype/UVAST";
         }
         amm:column init-enabled {
           description
             "Whether the rule is enabled at Agent initialization.";
           amm:type "/ARITYPE/BOOL";
         }
         amm:column enabled {
           description
             "The current enabled state of the rule.";
           amm:type "/ARITYPE/BOOL";
         }
       }
     }

     // CTRLs related to rules
     amm:ctrl ensure-sbr {
       if-feature "rules";
       amm:enum 13;
       description
         "Ensure that a state-based rule with the given identifiers
          exists within an ODM.";
       uses ensure-object-id;
       amm:parameter action {
         description
           "The action (inline MAC or CTRL reference) to execute when
            this rule triggers.";
         amm:type "//ietf/amm-base/typedef/exec-tgt";
       }
       amm:parameter condition {
         description
           "The condition (inline or reference) to periodically
            evaluate and convert to BOOL type.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";
       }
       amm:parameter min-interval {
         description
           "The minimum interval of Agent time between executions of
            the action.
            This can also be used by an Agent to limit how frequently
            the condition is evaluated.";
         amm:type "/ARITYPE/TD";
       }

Birrane, et al.            Expires 6 May 2027                 [Page 106]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:parameter max-count {
         description
           "Number of executions of the action, after being enabled,
            when the rule is disabled.";
         amm:type "/ARITYPE/UVAST";
       }
       amm:parameter init-enabled {
         description
           "Whether the rule is enabled at Agent initialization.";
         amm:type "/ARITYPE/BOOL";
       }
     }
     amm:ctrl ensure-tbr {
       if-feature "rules";
       amm:enum 14;
       description
         "Ensure that a time-based rule with the given identifiers
          exists within an ODM.";
       uses ensure-object-id;
       amm:parameter action {
         description
           "The action (inline MAC or CTRL reference) to execute when
            this rule triggers.";
         amm:type "//ietf/amm-base/typedef/exec-tgt";
       }
       amm:parameter start-time {
         description
           "The earliest time (absolute or init-relative) at which
            the action is executed.";
         amm:type "//ietf/amm-base/typedef/TIME";
       }
       amm:parameter period {
         description
           "How often the action is executed.";
         amm:type "/ARITYPE/TD";
       }
       amm:parameter max-count {
         description
           "Number of executions of the action, after being enabled,
            when the rule is disabled.";
         amm:type "/ARITYPE/UVAST";
       }
       amm:parameter init-enabled {
         description
           "Whether the rule is enabled at Agent initialization.";
         amm:type "/ARITYPE/BOOL";
       }
     }

Birrane, et al.            Expires 6 May 2027                 [Page 107]
Internet-Draft               DTNMA ADM YANG                November 2026

     amm:ctrl ensure-rule-enabled {
       if-feature "rules";
       amm:enum 15;
       description
         "Ensure a specific rule is enabled or disabled.";
       amm:parameter obj-id {
         description
           "The rule of which to ensure the enabled state.";
         amm:union {
           amm:type "/ARITYPE/SBR";
           amm:type "/ARITYPE/TBR";
         }
       }
       amm:parameter enabled {
         description
           "The desired enabled state of the rule.";
         amm:type "/ARITYPE/BOOL";
       }
     }
     amm:ctrl reset-rule-enabled {
       if-feature "rules";
       amm:enum 16;
       description
         "Reset rule enabled to initial setting.";
       amm:parameter obj-id {
         description
           "The rule of which to reset the enabled state.";
         amm:union {
           amm:type "/ARITYPE/SBR";
           amm:type "/ARITYPE/TBR";
         }
       }
     }
     amm:ctrl obsolete-rule {
       if-feature "rules";
       amm:enum 17;
       description
         "Mark a specific SBR or TBR as obsolete if it is present in
          an ODM.";
       amm:parameter obj-id {
         description
           "A reference to a rule within an ODM only.";
         amm:union {
           amm:type "/ARITYPE/SBR";
           amm:type "/ARITYPE/TBR";
         }
       }
       amm:result success {

Birrane, et al.            Expires 6 May 2027                 [Page 108]
Internet-Draft               DTNMA ADM YANG                November 2026

         description
           "Boolean indicating whether the rule was marked obsolete";
         amm:type "/ARITYPE/BOOL";
       }
     }

     // Numeric operators
     amm:oper negate {
       amm:enum 0;
       description
         "Negate a value, numeric or TD.
          This is equivalent to multiplying by -1 but a shorter
          expression.";
       amm:operand val {
         description
           "The single value.";
         amm:type "//ietf/amm-base/typedef/numeric-or-time";
       }
       uses numeric-unary-result;
     }
     amm:oper add {
       amm:enum 1;
       description
         "Add two numeric values or a TP and TD value (in either order).
          The operands are cast to the least compatible numeric type
          before the arithmetic.";
       uses numeric-time-binary-operands;
       uses any-unary-result;
     }
     amm:oper sub {
       amm:enum 2;
       description
         "Subtract two numeric values or a TP less a TD value.
          The left (second) operand is the minuend and the right (first)
          operand is the subtrahend; this means that the EXPR
          </AC/(10, 2, ./OPER/sub)> behaves as the infix '10 - 2'.
          The operands are cast to the least compatible numeric type
          before the arithmetic.";
       uses numeric-time-binary-operands;
       uses any-unary-result;
     }
     amm:oper multiply {
       amm:enum 3;
       description
         "Multiply two numeric values or a TD value (in either order).
          The operands are cast to the least compatible numeric type
          before the arithmetic.";
       uses numeric-time-binary-operands;

Birrane, et al.            Expires 6 May 2027                 [Page 109]
Internet-Draft               DTNMA ADM YANG                November 2026

       uses any-unary-result;
     }
     amm:oper divide {
       amm:enum 4;
       description
         "Divide two numeric values or a TD value (as numerator).
          The left (second) operand is the numerator and the right
          (first) operand is the divisor; this means that the EXPR
          </AC/(10, 2, ./OPER/divide)> behaves as the infix '10 / 2'.
          The operands are cast to the least compatible numeric type
          before the arithmetic.";
       uses numeric-time-binary-operands;
       uses any-unary-result;
     }
     amm:oper remainder {
       amm:enum 5;
       description
         "Find the remainder of a numeric operation.
          The left (second) operand is the numerator and the right
          (first) operand is the divisor; this means that the EXPR
          </AC/(10, 2, ./OPER/divide)> behaves as the infix '10 % 2'.
          The operands are cast to the least compatible numeric type
          before the arithmetic.";
       uses numeric-binary-operands;
       uses numeric-unary-result;
     }

     // Bitwise operators
     amm:oper bit-not {
       amm:enum 6;
       description
         "Perform a bitwise NOT on an integer value.";
       uses integer-unary-operands;
       uses integer-unary-result;
     }
     amm:oper bit-and {
       amm:enum 7;
       description
         "Perform a bitwise AND between two integer values.";
       uses integer-binary-operands;
       uses integer-unary-result;
     }
     amm:oper bit-or {
       amm:enum 8;
       description
         "Perform a bitwise OR between two integer values.";
       uses integer-binary-operands;
       uses integer-unary-result;

Birrane, et al.            Expires 6 May 2027                 [Page 110]
Internet-Draft               DTNMA ADM YANG                November 2026

     }
     amm:oper bit-xor {
       amm:enum 9;
       description
         "Perform a bitwise exclusive or (XOR) between two integer
          values.";
       uses integer-binary-operands;
       uses integer-unary-result;
     }

     // Boolean operators
     amm:oper bool-not {
       amm:enum 10;
       description
         "Perform a boolean NOT on a boolean value.";
       uses bool-unary-operands;
       uses bool-unary-result;
     }
     amm:oper bool-and {
       amm:enum 11;
       description
         "Perform a boolean AND between two boolean values.";
       uses bool-binary-operands;
       uses bool-unary-result;
     }
     amm:oper bool-or {
       amm:enum 12;
       description
         "Perform a boolean OR between two boolean values.";
       uses bool-binary-operands;
       uses bool-unary-result;
     }
     amm:oper bool-xor {
       amm:enum 13;
       description
         "Perform a boolean XOR between two boolean values.";
       uses bool-binary-operands;
       uses bool-unary-result;
     }

     // Strict value comparison
     amm:oper strict-eq {
       amm:enum 33;
       description
         "Compare two values for strict equality as defined by
          Section 6.12.1 of the AMM.";
       uses any-binary-operands;
       uses bool-unary-result;

Birrane, et al.            Expires 6 May 2027                 [Page 111]
Internet-Draft               DTNMA ADM YANG                November 2026

     }
     amm:oper strict-ne {
       amm:enum 34;
       description
         "Compare two values for strict inequality as defined by
          Section 6.12.1 of the AMM.";
       uses any-binary-operands;
       uses bool-unary-result;
     }

     // Loose value comparison
     amm:oper compare-eq {
       amm:enum 14;
       description
         "Compare two values for loose equality as defined by
          Section 6.12.1 of the AMM.
          Numeric operands MAY be converted to a least compatible
          numeric type for the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }
     amm:oper compare-ne {
       amm:enum 15;
       description
         "Compare two values for loose equality as defined by
          Section 6.12.1 of the AMM.
          Numeric operands MAY be converted to a least compatible
          numeric type for the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }

     // Numeric (or time-as-numeric) comparison
     amm:oper compare-gt {
       amm:enum 16;
       description
         "Compare two numbers by value.
          The result is true if the left value is greater than the
          right value.
          The operands are cast to the least compatible numeric type
          before the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }
     amm:oper compare-ge {
       amm:enum 17;
       description
         "Compare two numbers by value.

Birrane, et al.            Expires 6 May 2027                 [Page 112]
Internet-Draft               DTNMA ADM YANG                November 2026

          The result is true if the left value is greater than or equal
          to the right.
          The operands are cast to the least compatible numeric type
          before the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }
     amm:oper compare-lt {
       amm:enum 18;
       description
         "Compare two operands by value.
          The result is true if the left value is less than the right.
          The operands are cast to the least compatible numeric type
          before the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }
     amm:oper compare-le {
       amm:enum 19;
       description
         "Compare two operands by value.
          The result is true if the left value is less than or
          equal to the right.
          The operands are cast to the least compatible numeric type
          before the comparison.";
       uses any-binary-operands;
       uses bool-unary-result;
     }

     // Unary predicate (match) operators
     amm:oper is-undefined {
       amm:enum 29;
       description
         "Predicate to check for the undefined value.";
       amm:operand value {
         description
           "The value to check.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result match {
         description
           "True if and only if the value is the undefined value.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-not-undefined {
       amm:enum 30;
       description

Birrane, et al.            Expires 6 May 2027                 [Page 113]
Internet-Draft               DTNMA ADM YANG                November 2026

         "Predicate to check for the undefined value.";
       amm:operand value {
         description
           "The value to check.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result match {
         description
           "False if and only if the value is the undefined value.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-truthy {
       amm:enum 35;
       description
         "Predicate to convert to bool type.
          This operator will specifically consider the undefined value
          as not-truthy with a match result of false.
          This logic is the same as what is used internal to the Agent
          for conditional expressions and filters.";
       amm:operand value {
         description
           "The value to check.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result match {
         description
           "True if and only if the value is truthy.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper match-type {
       amm:enum 45;
       description
         "Predicate to match against any built-in type or named typedef
          based on the procedures of Section 6.10 of the AMM.
          If the desired type is not known to the agent the result SHALL
          be undefined.";
       reference
         "draft-ietf-dtn-amm";
       amm:parameter desired {
         description
           "The desired type to match against.";
         amm:union {
           amm:type "/aritype/aritype";
           amm:type "/aritype/typedef";
         }
       }

Birrane, et al.            Expires 6 May 2027                 [Page 114]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:operand value {
         description
           "The value to check.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result match {
         description
           "True if and only if the value matches the desired type.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper convert-type {
       amm:enum 46;
       description
         "Type conversion operator to any built-in type or named typedef
          based on the procedures of Section 6.11 of the AMM.
          If the desired type is not known to the agent the result SHALL
          be undefined.
          If the conversion fails the result SHALL be undefined.";
       reference
         "draft-ietf-dtn-amm";
       amm:parameter desired {
         description
           "The desired type to convert to.";
         amm:union {
           amm:type "/aritype/aritype";
           amm:type "/aritype/typedef";
         }
       }
       amm:operand value {
         description
           "The value to convert.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result converted {
         description
           "The result of conversion, which can be undefined.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }
     amm:oper match-regexp {
       amm:enum 23;
       description
         "This is a unary predicate operator which will compare
          a text value to a regular expression pattern.
          The regular expression is limited to I-Regexp compatibility.";
       reference
         "RFC 9485: I-Regexp: An Interoperable Regular Expression

Birrane, et al.            Expires 6 May 2027                 [Page 115]
Internet-Draft               DTNMA ADM YANG                November 2026

          Format";
       amm:parameter regexp {
         description
           "The I-Regexp text pattern to match.
            In accordance with that definition, this pattern is
            implicitly anchored to the start and end of the text being
            matched (i.e. it is always a full match).";
         amm:type "/aritype/textstr";
       }
       amm:operand value {
         description
           "The value to check for a match.";
         amm:type "/aritype/textstr";
       }
       amm:result is-match {
         description
           "The result is true if the value matches the given pattern.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-org-private {
       amm:enum 36;
       description
         "Predicate to determine if an object or
          namespace reference value has a namespace which
          is private (i.e. has an org-id which is a negative
          integer or text with a leading bang).";
       amm:operand value {
         description
           "The reference value to check.
            This value SHOULD NOT be de-referenced.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result match {
         description
           "True if and only if the org-id is private.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper match-org-int-range {
       amm:enum 37;
       description
         "Predicate to determine if a de-referenced object or
          namespace reference value has a namespace which
          has an org-id which is within a specific integer range.";

Birrane, et al.            Expires 6 May 2027                 [Page 116]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:parameter min-value {
         description
           "The minimum org-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:parameter max-value {
         description
           "The maximum org-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:operand value {
         description
           "The reference value to check.
            If the reference does not use integer form of org-id,
            it SHALL be dereferenced and translated to integer form.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result match {
         description
           "True if and only if the org-id is within the
            desired inclusive range.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-model-odm {
       amm:enum 38;
       description
         "Predicate to determine if an object or
          namespace reference value has a namespace which
          is is an ODM (i.e. has an model-id which is a negative
          integer or text with a leading bang).";
       amm:operand value {
         description
           "The reference value to check.
            This value SHOULD NOT be de-referenced.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result match {
         description
           "True if and only if the model is an ODM.";
         amm:type "/aritype/bool";
       }

Birrane, et al.            Expires 6 May 2027                 [Page 117]
Internet-Draft               DTNMA ADM YANG                November 2026

     }
     amm:oper match-model-int-range {
       amm:enum 39;
       description
         "Predicate to determine if a de-referenced object or
          namespace reference value has a namespace which
          has a model-id which is within a specific integer range.";
       amm:parameter min-value {
         description
           "The minimum model-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:parameter max-value {
         description
           "The maximum model-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:operand value {
         description
           "The reference value to check.
            If the reference does not use integer form of model-id,
            it SHALL be dereferenced and translated to integer form.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result match {
         description
           "True if and only if the model-id is within the
            desired inclusive range.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-same-ns {
       amm:enum 40;
       description
         "Predicate to determine if a de-referenced object or
          namespace reference value matches a desired namespace
          from a parameter.
          The comparison is on the actual namespace, regardless
          of whether integer or text IDs are used in either.";
       amm:parameter desired {
         description
           "A reference to the desired namespace to compare with.
            If this de-reference fails the result SHALL be undefined.";
         amm:type "/aritype/namespace";
       }

Birrane, et al.            Expires 6 May 2027                 [Page 118]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:operand value {
         description
           "The reference value to compare with the desired
            namespace.
            If the value is an object reference, it SHOULD only have
            its namespace portion (org-id and model-id) dereferenced
            and compared with the desired namespace.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result match {
         description
           "True if and only if the value references the same
            namespace as the desired.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper match-object-type {
       amm:enum 42;
       description
         "Predicate to determine if a de-referenced object reference
          value has a specific object type.";
       amm:parameter desired {
         description
           "The desired object type, either by built-in type reference,
            primitive integer enumeration, or text name.
            If the desired type is unknown to the Agent the result
            SHALL be undefined.";
         amm:type "/aritype/aritype";
       }
       amm:operand value {
         description
           "The object reference value to check.
            If the de-reference itself fails the result SHALL be
            false.";
         amm:type "/aritype/object";
       }
       amm:result match {
         description
           "True if and only if the type-id matches the desired
            object type.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper match-object-int-range {
       amm:enum 44;

Birrane, et al.            Expires 6 May 2027                 [Page 119]
Internet-Draft               DTNMA ADM YANG                November 2026

       description
         "Predicate to determine if a de-referenced object reference
          value has an obj-id which is within a specific integer
          range.";
       amm:parameter min-value {
         description
           "The minimum obj-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:parameter max-value {
         description
           "The maximum obj-id value to match.";
         amm:type "//ietf/amm-base/typedef/id-int";
       }
       amm:operand value {
         description
           "The reference value to check.
            If the reference does not use integer form of obj-id,
            it SHALL be dereferenced and translated to integer form.";
         amm:type "/aritype/object";
       }
       amm:result match {
         description
           "True if and only if the obj-id is within the
            desired inclusive range.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper is-same-object {
       amm:enum 41;
       description
         "Predicate to determine if a de-referenced object
          reference value matches a desired object
          from a parameter.
          The comparison is on the actual object instance, regardless
          of whether integer or text IDs are used in either.";
       amm:parameter desired {
         description
           "A reference to the desired object to compare with.
            If this de-reference fails the result SHALL be undefined.";
         amm:type "/aritype/object";
       }
       amm:operand value {
         description
           "The reference value to compare with the desired object.
            If this de-reference fails the result SHALL be false.";
         amm:type "/aritype/object";
       }

Birrane, et al.            Expires 6 May 2027                 [Page 120]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:result match {
         description
           "True if and only if the value references the same object
            as the desired.";
         amm:type "/aritype/bool";
       }
     }
     amm:oper ref {
       amm:enum 43;
       description
         "A zero-ary operator to copy a reference value parameter
          into its result.
          This is a work-around for <//ietf/amm-base/typedef/expr-item>
          permitting only literal or OPER references.";
       amm:parameter ref {
         description
           "The input reference value.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
       amm:result ref {
         description
           "The output reference value.";
         amm:union {
           amm:type "/aritype/object";
           amm:type "/aritype/namespace";
         }
       }
     }

     // Unary predicate function composition
     amm:oper predicate-all {
       amm:enum 24;
       description
         "Compose unary predicate operators with a result that is true
          only when all of the subordinate operators evaluate to a
          truthy result.
          If any operator evaluates to the undefined value it is
          considered not truthy and this result will be false.";
       uses predicate-compose-interface;
     }
     amm:oper predicate-any {
       amm:enum 25;
       description
         "Compose unary predicate operators with a result that is true
          when any of the subordinate operators evaluate to a

Birrane, et al.            Expires 6 May 2027                 [Page 121]
Internet-Draft               DTNMA ADM YANG                November 2026

          truthy result.
          If any operator evaluates to the undefined value it is
          considered not truthy, so other operators are still
          part of the result which may be true.";
       uses predicate-compose-interface;
     }
     amm:oper predicate-none {
       amm:enum 26;
       description
         "Compose unary predicate operators with a result that is true
          when all of the subordinate operators do not evaluate to a
          truthy result.
          If any operator evaluates to the undefined value it is
          considered not truthy, so other operators are still
          part of the result which may be true.";
       uses predicate-compose-interface;
     }

     // sub-expression evaluation operators
     amm:oper eval {
       amm:enum 28;
       description
         "A zero-ary operator which functions by evaluating a target
          sub-expression using the following phases:
            1. If the target is a reference, it is used to produce
               a value which SHALL be an expression.
               Otherwise, the target SHALL itself be an expression.
            2. Evaluate the expression and consider the evaluation
               result as this operator result.";
       amm:parameter target {
         description
           "Either an inline sub-expression or a reference to an
            object which produces an expression.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";
       }
       amm:result sub-result {
         description
           "The result of the sub-expression evaluation.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }
     amm:oper unary-eval {
       amm:enum 27;
       description
         "A unary operator which functions by evaluating a target
          sub-expression using the following phases:
            1. Substitute the bind-value actual parameter for
               </label/0> items within the target value

Birrane, et al.            Expires 6 May 2027                 [Page 122]
Internet-Draft               DTNMA ADM YANG                November 2026

               (literal expression or object reference).
            2. If the target is a reference, it is used to produce
               a value which SHALL be an expression.
               Otherwise, the target SHALL itself be an expression.
            3. Evaluate the expression and consider the evaluation
               result as this operator result.
          This is similar to the <./oper/eval> object with the
          addition of the unary operand binding.";
       amm:parameter target {
         description
           "Either an inline sub-expression or a reference to an
            object which produces an expression.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";
       }
       amm:operand bind-value {
         description
           "The value to pass-through as </label/0> during
            the substitution phase of evaluation with each of the
            subordinate operators.
            The label does not need to be present in this
            target, the operand can simply be ignored.
            Any label values of 1 or larger present
            will cause the evaluation to fail and result in
            the undefined value.";
         amm:type "//ietf/amm-base/typedef/any";
       }
       amm:result sub-result {
         description
           "The result of the sub-expression evaluation.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }
     amm:oper nary-eval {
       amm:enum 31;
       description
         "An N-ary operator which functions by evaluating a target
          sub-expression using the following phases:
            1. Substitute the bind-values actual parameter for
               LABEL items with integer primitive (e.g. </label/0>)
               within the target value
               (literal expression or object reference).
               The number of bind-able operands is given by the
               _operand-count_ parameter.
            2. If the target is a reference, it is used to produce
               a value which SHALL be an expression.
               Otherwise, the target SHALL itself be an expression.
            3. Evaluate the expression and consider the evaluation
               result as this operator result.

Birrane, et al.            Expires 6 May 2027                 [Page 123]
Internet-Draft               DTNMA ADM YANG                November 2026

          This is similar to the <./oper/eval> object with the
          addition of the unary operand binding.";
       amm:parameter operand-count {
         description
           "The number of operands to pop from the evaluation stack
            and use as bind-values for the target parameter.
            This is limited to signed int length because LABEL
            values are also limited to signed int.";
         amm:type "/aritype/int" {
           range "0..max";
         }
       }
       amm:parameter target {
         description
           "Either an inline sub-expression or a reference to an
            object which produces an expression.
            Not all valid labels, 0 through (_operand-count_ - 1),
            need to be present in this target, some operands can
            simply be popped and ignored.
            Any label values of _operand-count_ or larger present
            will cause the evaluation to fail and result in
            the undefined value.";
         amm:type "//ietf/amm-base/typedef/eval-tgt";
       }
       amm:operand bind-values {
         description
           "The evaluation stack values to substitute for LABEL values
            during the substitution phase of evaluation.
            A total of _operand-count_ values will be popped for this
            sequence.
            Label 0 refers to the bottom-most popped value from
            the stack and label (_operand-count_ - 1) refers to the
            top of the stack.";
         amm:seq {
           amm:type "//ietf/amm-base/typedef/any";
         }
       }
       amm:result sub-result {
         description
           "The result of the sub-expression evaluation.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     // Table (TBL) filtering
     amm:typedef tbl-row-filter {
       amm:enum 0;
       description

Birrane, et al.            Expires 6 May 2027                 [Page 124]
Internet-Draft               DTNMA ADM YANG                November 2026

         "A table filter applied using two phases for each row:
            1. Substitute row values for LABEL items within EXPR.
               This does not apply recursively to VALUE-OBJ within
               the expression.
            2. Evaluate the expression and consider the row matched
               if the result is a truthy value.
          Each LABEL item refers to the value at a column index
          within the context of the input row. Label substitution
          is performed as described in the value production section
          of the DTNMA AMM document.";
       reference
         "draft-ietf-dtn-amm";
       amm:type "//ietf/amm-base/typedef/EXPR";
     }
     amm:oper tbl-filter {
       amm:enum 20;
       description
         "Filter a table first by rows (using an expression) and then
          by columns (using identifiers).";
       amm:parameter rows {
         description
           "A filter for each row.";
         amm:type "./typedef/tbl-row-filter";
       }
       amm:parameter columns {
         description
           "A filter to restrict output to only the listed columns.
            The order of columns in the filtered result table SHALL
            correspond with the order of columns in this list.";
         amm:ulist {
           amm:type "/aritype/UVAST";
         }
       }
       amm:operand in {
         description
           "Table to filter.";
         amm:type "/aritype/TBL";
       }
       amm:result out {
         description
           "The filtered table.";
         amm:type "/aritype/TBL";
       }
     }
     amm:oper tbl-get {
       amm:enum 32;
       description
         "Retrieve an item from the given table.";

Birrane, et al.            Expires 6 May 2027                 [Page 125]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:parameter row {
         description
           "Index of the row (major axis) of the item.";
         amm:type "/aritype/uint";
       }
       amm:parameter column {
         description
           "Index of the column (minor axis) of the item.";
         amm:type "/aritype/uint";
       }
       amm:operand in {
         description
           "List to retrieve a value from.";
         amm:type "/aritype/TBL";
       }
       amm:result out {
         description
           "The retrieved value or undefined if the index is not
            valid.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     // List (AC) filtering
     amm:oper list-get {
       amm:enum 21;
       description
         "Retrieve an item from the given list.";
       amm:parameter index {
         description
           "Index of the value to retrieve from the list.";
         amm:type "/aritype/uint";
       }
       amm:operand in {
         description
           "List to retrieve a value from.";
         amm:type "/aritype/AC";
       }
       amm:result out {
         description
           "The retrieved value or undefined if the index is not
            valid.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }

     // Map (AM) filtering
     amm:oper map-get {

Birrane, et al.            Expires 6 May 2027                 [Page 126]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:enum 22;
       description
         "Retrieve an item from the given map.";
       amm:parameter key {
         description
           "Key of the value to retrieve from the map.";
         amm:type "//ietf/amm-base/typedef/primitive";
       }
       amm:operand in {
         description
           "Map to retrieve a value from.";
         amm:type "/aritype/AM";
       }
       amm:result out {
         description
           "The retrieved value or undefined if the key is not valid.";
         amm:type "//ietf/amm-base/typedef/any";
       }
     }
   }
   <CODE ENDS>

Appendix G.  ADM Module for DTNMA Agent Access Control Lists

   The ADM module in this section implements the entities described in
   Appendix A of [I-D.ietf-dtn-amm].

   <CODE BEGINS> file "ietf-dtnma-agent-acl.yang"
   module ietf-dtnma-agent-acl {
     yang-version 1.1;
     namespace "ari://ietf/dtnma-agent-acl/";
     prefix acl;

     import ietf-amm {
       prefix amm;
     }
     import ietf-dtnma-agent {
       prefix da;
     }
     import ietf-network-base {
       prefix network-base;
     }

     organization
       "Internet Engineering Task Force (IETF)" {
       amm:enum 1;
     }
     contact

Birrane, et al.            Expires 6 May 2027                 [Page 127]
Internet-Draft               DTNMA ADM YANG                November 2026

       "WG Web: <http://tools.ietf.org/wg/dtn/>
        WG List: <mailto:dtn@ietf.org>

        Editor: Brian Sipos
                <mailto:brian.sipos+ietf@gmail.com>";
     description
       "This module implements the DTN Management Architecture (DTNMA)
        Agent Access Control List (ACL) functionality.

        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 BCP 14 (RFC 2119) (RFC 8174) when, and only when,
        they appear in all capitals, as shown here.

        Copyright (c) 2025 IETF Trust and the persons identified as
        authors of the code.  All rights reserved.

        Redistribution and use in source and binary forms, with or
        without modification, is permitted pursuant to, and subject to
        the license terms contained in, the Revised BSD License set
        forth in Section 4.c of the IETF Trust's Legal Provisions
        Relating to IETF Documents
        (https://trustee.ietf.org/license-info).

        This version of this YANG module is part of RFC XXXX
        (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
        for full legal notices.";
     reference
       "draft-ietf-dtn-adm-yang";

     revision 2026-05-01 {
       description
         "Updated for latest ADM document.";
       reference
         "draft-ietf-dtn-adm-yang";
     }
     amm:enum 2;

     // Common types in this model
     amm:typedef entry-id {
       amm:enum 2;
       description
         "The identifier for an entry in any access control table.";
       amm:type "/ARITYPE/UINT";
     }
     amm:typedef optional-entry-id {
       amm:enum 3;

Birrane, et al.            Expires 6 May 2027                 [Page 128]
Internet-Draft               DTNMA ADM YANG                November 2026

       description
         "An optional entry identifier (or a null value).";
       amm:union {
         amm:type "./TYPEDEF/entry-id";
         amm:type "/ARITYPE/null";
       }
     }

     // Atomic permission objects
     amm:ident permission {
       amm:enum 0;
       description
         "The base IDENT for objects usable as permissions in the
          access control table.
          Derived objects MUST define the specific conditions in which
          the permission is exercised.
          Derived objects MAY be parameterized as needed to control
          specific access granted by each permission.
          This object itself is abstract and provides not specific
          permission.";
       amm:abstract true;
     }
     amm:typedef permission-list {
       amm:enum 0;
       description
         "A list of permission object (IDENT) references.";
       amm:ulist {
         amm:type "/aritype/ident" {
           amm:base "./ident/permission";
         }
       }
     }

     // built-in permissions
     amm:ident execute {
       amm:enum 10;
       description
         "Permission to allow executing specific CTRL objects.
          This includes objects used directly as EXECSET targets,
          indirectly within macros, or as actions of TBR or SBR
          objects.";
       amm:base "./ident/permission";
     }
     amm:ident produce {
       amm:enum 11;
       description
         "Permission to allow producing values from CONST, VAR, or
          EDD objects.

Birrane, et al.            Expires 6 May 2027                 [Page 129]
Internet-Draft               DTNMA ADM YANG                November 2026

          This includes production for use by reporting or evaluating
          procedures of the Agent.";
       amm:base "./ident/permission";
     }
     amm:ident modify-var {
       amm:enum 12;
       description
         "Permission to allow modifying the value of VAR objects.
          This includes any control which would alter the value,
          but does not affect applications on the Agent directly
          altering the state of an object.";
       amm:base "./ident/permission";
     }
     amm:ident modify-rule-enabled {
       amm:enum 17;
       description
         "Permission to allow modifying the enabled state of
          SBR and TBR objects.
          This includes any control which would alter the state,
          but does not affect Agent-internal logic related to
          init-enabled and max-count fields of a rule.";
       amm:base "./ident/permission";
     }
     amm:ident ensure-odm {
       amm:enum 13;
       description
         "Permission to allow ensuring an ODM exists within an Agent.
          Granting this permission will allow creating a new ODM or
          modifying an existing ODM depending on its starting state.";
       amm:base "./ident/permission";
     }
     amm:ident obsolete-odm {
       amm:enum 14;
       description
         "Permission to allow obsoleting an ODM within an Agent.
          Once an ODM is obsoleted it can no longer be used but
          its identifiers are reserved to prevent inconsistent reuse.";
       amm:base "./ident/permission";
     }
     amm:ident ensure-object {
       amm:enum 15;
       description
         "Permission to allow ensuring an object exists within an ODM.
          Granting this permission will allow creating a new object or
          modifying an existing object depending on its starting state.
          The permission itself does not restrict the type of object,
          but the access list can limit the item to specific object
          types and names.";

Birrane, et al.            Expires 6 May 2027                 [Page 130]
Internet-Draft               DTNMA ADM YANG                November 2026

       amm:base "./ident/permission";
     }
     amm:ident obsolete-object {
       amm:enum 16;
       description
         "Permission to allow obsoleting an object within an ODM.
          Once an object is obsoleted it can no longer be used but
          its identifiers are reserved to prevent inconsistent reuse.
          The permission itself does not restrict the type of object,
          but the access list can limit the item to specific object
          types and names.";
       amm:base "./ident/permission";
     }

     // Default access permission
     amm:var default-access {
       amm:enum 1;
       description
         "The default permission for any object if no specific access
          are present in the <./EDD/access-list> table.";
       amm:type "./TYPEDEF/permission-list";
     }

     // Access control table and modifier controls
     amm:typedef access-target-filter {
       amm:enum 5;
       description
         "A target object/namespace filter applied using two phases for
          each row:
            1. Substitute the target object or namespace reference for
               </label/0> items within the value.
               This does not apply recursively to VALUE-OBJ within
               the expression.
            2. Evaluate the expression and consider the target matched
               if the result is a truthy value.
          Only LABEL value 0 is valid.
          Label substitution is performed as described in the value
          production section of the DTNMA AMM document.";
       reference
         "draft-ietf-dtn-amm";
       amm:type "//ietf/amm-base/typedef/EXPR";
     }
     amm:edd access-list {
       amm:enum 2;
       description
         "List the current group--object access.";
       amm:tblt {
         amm:key "access-id";

Birrane, et al.            Expires 6 May 2027                 [Page 131]
Internet-Draft               DTNMA ADM YANG                November 2026

         amm:column access-id {
           description
             "A unique identifier for this access list item.";
           amm:type "./TYPEDEF/entry-id";
         }
         amm:column group-ids {
           description
             "A cross-reference to the groups getting access, or the
              empty list to match all groups.";
           amm:ulist {
             amm:type "./TYPEDEF/entry-id";
           }
         }
         amm:column objects {
           description
             "A set of filters for target objects or namespaces being
              granted access.
              The filter </ac/(true)> can be used to match-all target
              objects.";
           amm:type "./typedef/access-target-filter";
         }
         amm:column permissions {
           description
             "References to specific permissions being granted.
              Individual permission references MAY be parameterized
              as necessary.
              The absence of permissions does not grant any access.";
           amm:type "./TYPEDEF/permission-list";
         }
         amm:column added-at {
           description
             "Agent timestamp when this group was added.";
           amm:type "//ietf/amm-base/typedef/timestamp";
         }
         amm:column updated-at {
           description
             "Agent timestamp when this group was added or updated.";
           amm:type "//ietf/amm-base/typedef/timestamp";
         }
       }
     }
     amm:ctrl ensure-access {
       amm:enum 3;
       description
         "Ensures that an access control permission is set for the
          given group and ARI pattern.";
       amm:parameter access-id {
         description

Birrane, et al.            Expires 6 May 2027                 [Page 132]
Internet-Draft               DTNMA ADM YANG                November 2026

           "A unique identifier for this access list item.";
         amm:type "./TYPEDEF/entry-id";
       }
       amm:parameter group-ids {
         description
           "Identify the groups being assigned the permission,
            or the empty list for all-groups.";
         amm:ulist {
           amm:type "./TYPEDEF/entry-id";
         }
       }
       amm:parameter objects {
         description
           "A set of filters for target objects or namespaces being
            granted access.
            The filter </ac/(true)> can be used to match-all targets.";
         amm:type "./typedef/access-target-filter";
       }
       amm:parameter permissions {
         description
           "Permissions to grant to the associated group and objects";
         amm:type "./TYPEDEF/permission-list";
       }
     }
     amm:ctrl discard-access {
       amm:enum 4;
       description
         "Discard any access item with the given ID.";
       amm:parameter access-id {
         description
           "Uniquely identify the access";
         amm:type "./TYPEDEF/entry-id";
       }
     }

     //
     // Group management
     //
     amm:typedef group-member-filter {
       amm:enum 4;
       description
         "A member filter applied using two phases for each row:
            1. Substitute a manager identity for </label/0> items
               within the value.
               This does not apply recursively to VALUE-OBJ within
               the expression.
            2. Evaluate the expression and consider the identity matched
               if the result is a truthy value.

Birrane, et al.            Expires 6 May 2027                 [Page 133]
Internet-Draft               DTNMA ADM YANG                November 2026

          Only LABEL value 0 is valid.
          Label substitution is performed as described in the value
          production section of the DTNMA AMM document.";
       reference
         "draft-ietf-dtn-amm";
       amm:type "//ietf/amm-base/typedef/EXPR";
     }
     amm:edd current-groups {
       amm:enum 3;
       description
         "Get the group IDs for the current execution context, which may
          include the implicit Agent group ID zero.";
       amm:ulist {
         amm:type "./TYPEDEF/entry-id";
       }
     }
     amm:edd group-list {
       amm:enum 4;
       description
         "Get the defined access control groups.";
       amm:tblt {
         amm:key "group-id";
         amm:column group-id {
           description
             "The unique identifier for a group.
              The agent itself has implicit group ID zero which cannot
              be modified.";
           amm:type "./TYPEDEF/entry-id";
         }
         amm:column name {
           description
             "The human-friendly name of the group.";
           amm:type "//ietf/amm-base/typedef/id-text";
         }
         amm:column members {
           description
             "The list of members of the group, identified by matching
              transport endpoint.";
           amm:type "./typedef/group-member-filter";
         }
         amm:column added-at {
           description
             "Agent timestamp when this group was added.";
           amm:type "//ietf/amm-base/typedef/timestamp";
         }
         amm:column updated-at {
           description
             "Agent timestamp when this group was added or updated.";

Birrane, et al.            Expires 6 May 2027                 [Page 134]
Internet-Draft               DTNMA ADM YANG                November 2026

           amm:type "//ietf/amm-base/typedef/timestamp";
         }
       }
     }
     amm:ctrl ensure-group {
       amm:enum 5;
       description
         "Ensure that after the control completes a group exists with
          the given information";
       amm:parameter group-id {
         description
           "Uniquely identify the group";
         amm:type "./TYPEDEF/entry-id";
       }
       amm:parameter name {
         description
           "Name of the group";
         amm:type "//ietf/amm-base/typedef/id-text";
       }
     }
     amm:ctrl ensure-group-members {
       amm:enum 7;
       description
         "Ensure that the membership of a group has a specific set of
          endpoint patterns.";
       amm:parameter group-id {
         description
           "Uniquely identify the group";
         amm:type "./TYPEDEF/entry-id";
       }
       amm:parameter members {
         description
           "The list of endpoint patterns denoting group membership";
         amm:type "./typedef/group-member-filter";
       }
     }
     amm:ctrl discard-group {
       amm:enum 6;
       description
         "Discard any group with the given ID.";
       amm:parameter group-id {
         description
           "Uniquely identify the group";
         amm:type "./TYPEDEF/entry-id";
       }
     }
   }
   <CODE ENDS>

Birrane, et al.            Expires 6 May 2027                 [Page 135]
Internet-Draft               DTNMA ADM YANG                November 2026

Implementation Status

   This section is to be removed before publishing as an RFC.

   [NOTE to the RFC Editor: please remove this section before
   publication, as well as the reference to [RFC7942],
   [github-dtnma-ace], and [github-dtnma-adms].]

   This section records the status of known implementations of the
   protocol defined by this specification at the time of posting of this
   Internet-Draft, and is based on a proposal described in [RFC7942].
   The description of implementations in this section is intended to
   assist the IETF in its decision processes in progressing drafts to
   RFCs.  Please note that the listing of any individual implementation
   here does not imply endorsement by the IETF.  Furthermore, no effort
   has been spent to verify the information presented here that was
   supplied by IETF contributors.  This is not intended as, and must not
   be construed to be, a catalog of available implementations or their
   features.  Readers are advised to note that other implementations can
   exist.

   A full implementation in Python language of the ADM module encoding
   and decoding, and for translating between ARI text name and integer
   enumeration (based on ADM contents) is present in the source
   repository [github-dtnma-ace].  This repository includes unit test
   vectors for verifying ADM module encoding and decoding and is used as
   the basis of ADM syntax checking and formatting tools in the ADM
   modules in this document.

   The ADM modules present in Appendix A through D are version
   controlled in their original form in the repository
   [github-dtnma-adms].

   An implementation of the models themselves is part of the C11
   language REFDA library managed under the source repository
   [github-dtnma-tools].  This project has built-item (executable)
   testing which exercises the AMM-level interface of the REFDA through
   sending specific EXECSET values and observing subsequent RPTSET
   values as well as daemon log events.

Acknowledgments

   The following participants contributed technical material, use cases,
   and useful thoughts on the overall approach captured in this
   document: David Linko, Sarah Heiner, Jenny Cao, and Leonardo Babun of
   the Johns Hopkins University Applied Physics Laboratory (JHU/APL).

Birrane, et al.            Expires 6 May 2027                 [Page 136]
Internet-Draft               DTNMA ADM YANG                November 2026

Authors' Addresses

   Edward J. Birrane, III
   The Johns Hopkins University Applied Physics Laboratory
   11100 Johns Hopkins Rd.
   Laurel, MD 20723
   United States of America
   Phone: +1 443 778 7423
   Email: Edward.Birrane@jhuapl.edu

   Brian Sipos
   The Johns Hopkins University Applied Physics Laboratory
   Email: brian.sipos+ietf@gmail.com

   Justin Ethier
   The Johns Hopkins University Applied Physics Laboratory
   Email: Justin.Ethier@jhuapl.edu

   Per Andersson
   Ionio Systems
   Email: per.ietf@ionio.se

Birrane, et al.            Expires 6 May 2027                 [Page 137]