rfc9254.original | rfc9254.txt | |||
---|---|---|---|---|
Internet Engineering Task Force M. Veillette, Ed. | Internet Engineering Task Force (IETF) M. Veillette, Ed. | |||
Internet-Draft Trilliant Networks Inc. | Request for Comments: 9254 Trilliant Networks Inc. | |||
Intended status: Standards Track I. Petrov, Ed. | Category: Standards Track I. Petrov, Ed. | |||
Expires: 13 October 2022 Google Switzerland GmbH | ISSN: 2070-1721 Google Switzerland GmbH | |||
A. Pelov | A. Pelov | |||
Acklio | Acklio | |||
C. Bormann | C. Bormann | |||
Universität Bremen TZI | Universität Bremen TZI | |||
M. Richardson | M. Richardson | |||
Sandelman Software Works | Sandelman Software Works | |||
11 April 2022 | July 2022 | |||
CBOR Encoding of Data Modeled with YANG | Encoding of Data Modeled with YANG in the Concise Binary Object | |||
draft-ietf-core-yang-cbor-20 | Representation (CBOR) | |||
Abstract | Abstract | |||
Based on the Concise Binary Object Representation (CBOR, RFC 8949), | YANG (RFC 7950) is a data modeling language used to model | |||
this document defines encoding rules for representing configuration | configuration data, state data, parameters and results of Remote | |||
data, state data, parameters and results of Remote Procedure Call | Procedure Call (RPC) operations or actions, and notifications. | |||
(RPC) operations or actions, and notifications, defined using YANG | ||||
(RFC 7950). | ||||
Status of This Memo | This document defines encoding rules for YANG in the Concise Binary | |||
Object Representation (CBOR) (RFC 8949). | ||||
This Internet-Draft is submitted in full conformance with the | Status of This Memo | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | This is an Internet Standards Track document. | |||
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 | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 13 October 2022. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9254. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2022 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
2. Terminology and Notation . . . . . . . . . . . . . . . . . . 3 | 2. Terminology and Notation | |||
3. Properties of the CBOR Encoding . . . . . . . . . . . . . . . 5 | 3. Properties of the CBOR Encoding | |||
3.1. CBOR diagnostic notation . . . . . . . . . . . . . . . . 6 | 3.1. CBOR Diagnostic Notation | |||
3.2. YANG Schema Item iDentifier . . . . . . . . . . . . . . . 8 | 3.2. YANG Schema Item iDentifier | |||
3.3. Name . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.3. Name | |||
4. Encoding of Representation Nodes . . . . . . . . . . . . . . 11 | 4. Encoding of Representation Nodes | |||
4.1. The 'leaf' . . . . . . . . . . . . . . . . . . . . . . . 11 | 4.1. The 'leaf' | |||
4.1.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 11 | 4.1.1. Using SIDs in Keys | |||
4.1.2. Using names in keys . . . . . . . . . . . . . . . . . 12 | 4.1.2. Using Names in Keys | |||
4.2. The 'container' and other nodes from the data tree . . . 12 | 4.2. The 'container' and Other Nodes from the Data Tree | |||
4.2.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 13 | 4.2.1. Using SIDs in Keys | |||
4.2.2. Using names in keys . . . . . . . . . . . . . . . . . 14 | 4.2.2. Using Names in Keys | |||
4.3. The 'leaf-list' . . . . . . . . . . . . . . . . . . . . . 15 | 4.3. The 'leaf-list' | |||
4.3.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 15 | 4.3.1. Using SIDs in Keys | |||
4.3.2. Using names in keys . . . . . . . . . . . . . . . . . 16 | 4.3.2. Using Names in Keys | |||
4.4. The 'list' and 'list' entries . . . . . . . . . . . . . . 16 | 4.4. The 'list' and the 'list' Entries | |||
4.4.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 17 | 4.4.1. Using SIDs in Keys | |||
4.4.2. Using names in keys . . . . . . . . . . . . . . . . . 19 | 4.4.2. Using Names in Keys | |||
4.5. The 'anydata' . . . . . . . . . . . . . . . . . . . . . . 21 | 4.5. The 'anydata' | |||
4.5.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 22 | 4.5.1. Using SIDs in Keys | |||
4.5.2. Using names in keys . . . . . . . . . . . . . . . . . 23 | 4.5.2. Using Names in Keys | |||
4.6. The 'anyxml' . . . . . . . . . . . . . . . . . . . . . . 24 | 4.6. The 'anyxml' | |||
4.6.1. Using SIDs in keys . . . . . . . . . . . . . . . . . 24 | 4.6.1. Using SIDs in Keys | |||
4.6.2. Using names in keys . . . . . . . . . . . . . . . . . 25 | 4.6.2. Using Names in Keys | |||
5. Encoding of 'yang-data' extension . . . . . . . . . . . . . . 25 | 5. Encoding of the 'yang-data' Extension | |||
5.1. Using SIDs in keys . . . . . . . . . . . . . . . . . . . 26 | 5.1. Using SIDs in Keys | |||
5.2. Using names in keys . . . . . . . . . . . . . . . . . . . 27 | 5.2. Using Names in Keys | |||
6. Representing YANG Data Types in CBOR . . . . . . . . . . . . 28 | 6. Representing YANG Data Types in CBOR | |||
6.1. The unsigned integer Types . . . . . . . . . . . . . . . 28 | 6.1. The Unsigned Integer Types | |||
6.2. The integer Types . . . . . . . . . . . . . . . . . . . . 29 | 6.2. The Integer Types | |||
6.3. The 'decimal64' Type . . . . . . . . . . . . . . . . . . 29 | 6.3. The 'decimal64' Type | |||
6.4. The 'string' Type . . . . . . . . . . . . . . . . . . . . 30 | 6.4. The 'string' Type | |||
6.5. The 'boolean' Type . . . . . . . . . . . . . . . . . . . 30 | 6.5. The 'boolean' Type | |||
6.6. The 'enumeration' Type . . . . . . . . . . . . . . . . . 31 | 6.6. The 'enumeration' Type | |||
6.7. The 'bits' Type . . . . . . . . . . . . . . . . . . . . . 32 | 6.7. The 'bits' Type | |||
6.8. The 'binary' Type . . . . . . . . . . . . . . . . . . . . 34 | 6.8. The 'binary' Type | |||
6.9. The 'leafref' Type . . . . . . . . . . . . . . . . . . . 35 | 6.9. The 'leafref' Type | |||
6.10. The 'identityref' Type . . . . . . . . . . . . . . . . . 35 | 6.10. The 'identityref' Type | |||
6.10.1. SIDs as identityref . . . . . . . . . . . . . . . . 35 | 6.10.1. SIDs as 'identityref' | |||
6.10.2. Name as identityref . . . . . . . . . . . . . . . . 36 | 6.10.2. Name as 'identityref' | |||
6.11. The 'empty' Type . . . . . . . . . . . . . . . . . . . . 37 | 6.11. The 'empty' Type | |||
6.12. The 'union' Type . . . . . . . . . . . . . . . . . . . . 37 | 6.12. The 'union' Type | |||
6.13. The 'instance-identifier' Type . . . . . . . . . . . . . 38 | 6.13. The 'instance-identifier' Type | |||
6.13.1. SIDs as instance-identifier . . . . . . . . . . . . 39 | 6.13.1. SIDs as 'instance-identifier' | |||
6.13.2. Names as instance-identifier . . . . . . . . . . . . 42 | 6.13.2. Names as 'instance-identifier' | |||
7. Content-Types . . . . . . . . . . . . . . . . . . . . . . . . 43 | 7. Content-Types | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 44 | 8. Security Considerations | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 45 | 9. IANA Considerations | |||
9.1. Media-Types Registry . . . . . . . . . . . . . . . . . . 45 | 9.1. Media Types Registry | |||
9.2. CoAP Content-Formats Registry . . . . . . . . . . . . . . 46 | 9.2. CoAP Content-Formats Registry | |||
9.3. CBOR Tags Registry . . . . . . . . . . . . . . . . . . . 46 | 9.3. CBOR Tags Registry | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 47 | 10. References | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 47 | 10.1. Normative References | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 48 | 10.2. Informative References | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 49 | Acknowledgments | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 49 | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
The specification of the YANG 1.1 data modeling language [RFC7950] | The specification of the YANG 1.1 data modeling language [RFC7950] | |||
defines an XML encoding for data instances, i.e., contents of | defines an XML encoding for data instances, i.e., contents of | |||
configuration datastores, state data, RPC inputs and outputs, action | configuration datastores, state data, RPC inputs and outputs, action | |||
inputs and outputs, and event notifications. | inputs and outputs, and event notifications. | |||
An additional set of encoding rules has been defined in [RFC7951] | An additional set of encoding rules has been defined in [RFC7951] | |||
based on the JavaScript Object Notation (JSON) Data Interchange | based on "The JavaScript Object Notation (JSON) Data Interchange | |||
Format [RFC8259]. | Format" [RFC8259]. | |||
The aim of this document is to define a set of encoding rules for the | The aim of this document is to define a set of encoding rules for the | |||
Concise Binary Object Representation (CBOR) [RFC8949], collectively | Concise Binary Object Representation (CBOR) [RFC8949], collectively | |||
called _YANG-CBOR_. The resulting encoding is more compact compared | called "YANG-CBOR". The resulting encoding is more compact compared | |||
to XML and JSON and more suitable for Constrained Nodes and/or | to XML and JSON and more suitable for constrained nodes and/or | |||
Constrained Networks as defined by [RFC7228]. | constrained networks, as defined by [RFC7228]. | |||
2. Terminology and Notation | 2. Terminology and Notation | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
SID values (and the SID deltas computed from them) shown in the | ||||
examples are example values; these examples do not allocate the SIDs | ||||
shown for specific items in the modules. | ||||
The following terms are defined in [RFC7950]: | The following terms are defined in [RFC7950]: | |||
* action | * action | |||
* anydata | * anydata | |||
* anyxml | * anyxml | |||
* data node | * data node | |||
skipping to change at page 4, line 41 ¶ | skipping to change at line 182 ¶ | |||
The following term is defined in [RFC8040]: | The following term is defined in [RFC8040]: | |||
* yang-data extension | * yang-data extension | |||
The following term is defined in [RFC8791]: | The following term is defined in [RFC8791]: | |||
* YANG data structure | * YANG data structure | |||
This specification also makes use of the following terminology: | This specification also makes use of the following terminology: | |||
* YANG Schema Item iDentifier (YANG SID or simply SID): 63-bit | YANG Schema Item iDentifier (or "YANG SID" or simply "SID"): | |||
unsigned integer used to identify different YANG items. | 63-bit unsigned integer used to identify different YANG items. | |||
* delta: Difference between the current YANG SID and a reference | delta: | |||
YANG SID. A reference YANG SID is defined for each context for | Difference between the current YANG SID and a reference YANG SID. | |||
which deltas are used. | A reference YANG SID is defined for each context for which deltas | |||
are used. | ||||
* absolute SID: YANG SID not encoded as a delta. This is usually | absolute SID: | |||
called out explicitly only in positions where normally a delta | A YANG SID that is not encoded as a delta. This is usually called | |||
would be found. | out explicitly only in positions where normally a delta would be | |||
found. | ||||
* representation tree: a YANG data tree, possibly enclosed by a | representation tree: | |||
representation of a schema node such as a YANG data structure, a | A YANG data tree, possibly enclosed by a representation of a | |||
schema node, such as a YANG data structure, a notification, an | ||||
RPC, or an action. | ||||
representation node: | ||||
A node in a representation tree, i.e., a data tree node, or a | ||||
representation of a schema node, such as a YANG data structure, a | ||||
notification, an RPC, or an action. | notification, an RPC, or an action. | |||
* representation node: a node in a representation tree, i.e., a data | item: | |||
tree node, or a representation of a schema node such as a YANG | A schema node, an identity, a module, or a feature defined using | |||
data structure, a notification, an RPC, or an action. | the YANG modeling language. | |||
* item: A schema node, an identity, a module, or a feature defined | list entry: | |||
using the YANG modeling language. | The data associated with a single entry of a list (see Section 7.8 | |||
of [RFC7950]). | ||||
* list entry: the data associated with a single entry of a list (see | container-like instance: | |||
Section 7.8 of [RFC7950]). | An instance of a container, a YANG data structure, notification | |||
contents, RPC input, RPC output, action input, or action output | ||||
(Section 4.2); a list entry in a list (Section 4.4); or an anydata | ||||
node (Section 4.5). | ||||
* parent (of a representation node): the schema node of the closest | parent (of a representation node): | |||
enclosing representation node in which a given representation node | The schema node of the closest enclosing representation node in | |||
is defined. | which a given representation node is defined. | |||
3. Properties of the CBOR Encoding | 3. Properties of the CBOR Encoding | |||
This document defines CBOR encoding rules for YANG data trees and | This document defines CBOR encoding rules for YANG data trees and | |||
their subtrees. | their subtrees. | |||
A YANG data tree can be enclosed by a representation of a schema node | A YANG data tree can be enclosed by a representation of a schema | |||
such as a YANG data structure, a notification, an RPC, or an action; | node, such as a YANG data structure, a notification, an RPC, or an | |||
this is called a representation tree. The data tree nodes and the | action; this is called a representation tree. The data tree nodes | |||
enclosing schema node representation, if any, are collectively called | and the enclosing schema node representation, if any, are | |||
the representation nodes. | collectively called the representation nodes. | |||
A representation node such as container, list entry, YANG data | A representation node, such as a container, list entry, YANG data | |||
structure, notification, RPC input, RPC output, action input, or | structure, notification, RPC input, RPC output, action input, action | |||
action output is serialized using a CBOR map in which each schema | output, or anydata node, is serialized using a CBOR map in which each | |||
node defined within is encoded using a key and a value. This | schema node defined within is encoded using a key and a value. This | |||
specification supports two types of CBOR keys; YANG Schema Item | specification supports two types of CBOR keys: YANG Schema Item | |||
iDentifier (YANG SID) as defined in Section 3.2 and names as defined | iDentifier (YANG SID), as defined in Section 3.2, and names, as | |||
in Section 3.3. Each of these key types is encoded using a specific | defined in Section 3.3. Each of these key types is encoded using a | |||
CBOR type which allows their interpretation during the | specific CBOR type that allows their interpretation during the | |||
deserialization process. Protocols or mechanisms implementing this | deserialization process. Protocols or mechanisms implementing this | |||
specification can mandate the use of a specific key type or allow the | specification can mandate the use of a specific key type or allow the | |||
generator to choose freely per key. | generator to choose freely per key. | |||
In order to minimize the size of the encoded data, the mapping avoids | In order to minimize the size of the encoded data, the mapping avoids | |||
any unnecessary meta-information beyond that directly provided by the | any unnecessary meta-information beyond that directly provided by the | |||
CBOR basic generic data model (Section 2 of [RFC8949]). For | CBOR basic generic data model (Section 2 of [RFC8949]). For | |||
instance, CBOR tags are used solely in the case of an absolute SID, | instance, CBOR tags are used solely in the case of an absolute SID, | |||
anyxml data nodes, or the union datatype, to distinguish explicitly | anyxml data nodes, or the union datatype to explicitly distinguish | |||
the use of different YANG datatypes encoded using the same CBOR major | the use of different YANG datatypes encoded using the same CBOR major | |||
type. | type. | |||
Unless specified otherwise by the protocol or mechanism implementing | Unless specified otherwise by the protocol or mechanism implementing | |||
this specification, the indefinite length encoding as defined in | this specification, the indefinite length encoding, as defined in | |||
Section 3.2 of [RFC8949] SHALL be supported by the CBOR decoders | Section 3.2 of [RFC8949], SHALL be supported by the CBOR decoders | |||
employed with YANG-CBOR. (This enables an implementation to begin | employed with YANG-CBOR. (This enables an implementation to begin | |||
emitting an array or map before the number of entries in that | emitting an array or map before the number of entries in that | |||
structure is known, possibly also avoiding excessive locking or race | structure is known, possibly also avoiding excessive locking or race | |||
conditions. On the other hand, it deprives the receiver of the | conditions. On the other hand, it deprives the receiver of the | |||
encoded data from advance announcement about some size information, | encoded data from advance announcement about some size information, | |||
so a generator should choose indefinite length encoding only when | so a generator should choose indefinite length encoding only when | |||
these benefits do accrue.) | these benefits do accrue.) | |||
Data nodes implemented using a CBOR array, map, byte string, or text | Data nodes implemented using a CBOR array, map, byte string, or text | |||
string can be instantiated but empty. In this case, they are encoded | string can be instantiated but empty. In this case, they are encoded | |||
with a length of zero. | with a length of zero. | |||
When representation nodes are serialized using the rules defined by | When representation nodes are serialized using the rules defined by | |||
this specification as part of an application payload, the payload | this specification as part of an application payload, the payload | |||
SHOULD include information that would allow a stateless way to | SHOULD include information that would allow each node to be | |||
identify each node, such as the SID number associated with the node, | identified in a stateless way, for instance, the SID number | |||
SID delta from another SID in the application payload, the namespace | associated with the node, the SID delta from another SID in the | |||
qualified name, or the instance-identifier. | application payload, the namespace-qualified name, or the instance- | |||
identifier. | ||||
Examples in Section 4 include a root CBOR map with a single entry | Examples in Section 4 include a root CBOR map with a single entry | |||
having a key set to either a namespace qualified name or a SID. This | having a key set to either a namespace-qualified name or a SID. This | |||
root CBOR map is provided only as a typical usage example and is not | root CBOR map is provided only as a typical usage example and is not | |||
part of the present encoding rules. Only the value within this CBOR | part of the present encoding rules. Only the value within this CBOR | |||
map is compulsory. | map is compulsory. | |||
3.1. CBOR diagnostic notation | 3.1. CBOR Diagnostic Notation | |||
Within this document, CBOR binary contents are represented using an | Within this document, CBOR binary contents are represented using an | |||
equivalent textual form called CBOR diagnostic notation as defined in | equivalent textual form called CBOR diagnostic notation, as defined | |||
Section 8 of [RFC8949]. This notation is used strictly for | in Section 8 of [RFC8949]. This notation is used strictly for | |||
documentation purposes and is never used in the data serialization. | documentation purposes and is never used in the data serialization. | |||
Table 1 below provides a summary of this notation. | Table 1 below provides a summary of this notation. | |||
+==========+======+====================+===========+==========+ | +==========+======+====================+===========+==========+ | |||
| CBOR | CBOR | Diagnostic | Example | CBOR | | | CBOR | CBOR | Diagnostic | Example | CBOR | | |||
| content | type | notation | | encoding | | | Content | Type | Notation | | Encoding | | |||
+==========+======+====================+===========+==========+ | +==========+======+====================+===========+==========+ | |||
| Unsigned | 0 | Decimal digits | 123 | 18 7B | | | Unsigned | 0 | Decimal digits | 123 | 18 7B | | |||
| integer | | | | | | | integer | | | | | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
| Negative | 1 | Decimal digits | -123 | 38 7A | | | Negative | 1 | Decimal digits | -123 | 38 7A | | |||
| integer | | prefixed by a | | | | | integer | | prefixed by a | | | | |||
| | | minus sign | | | | | | | minus sign | | | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
| Byte | 2 | Hexadecimal value | h'F15C' | 42 F15C | | | Byte | 2 | Hexadecimal value | h'F15C' | 42 F15C | | |||
| string | | enclosed between | | | | | string | | enclosed between | | | | |||
skipping to change at page 7, line 46 ¶ | skipping to change at line 332 ¶ | |||
| Boolean | 7/20 | false | false | F4 | | | Boolean | 7/20 | false | false | F4 | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
| | 7/21 | true | true | F5 | | | | 7/21 | true | true | F5 | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
| Null | 7/22 | null | null | F6 | | | Null | 7/22 | null | null | F6 | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
| Not | 7/23 | undefined | undefined | F7 | | | Not | 7/23 | undefined | undefined | F7 | | |||
| assigned | | | | | | | assigned | | | | | | |||
+----------+------+--------------------+-----------+----------+ | +----------+------+--------------------+-----------+----------+ | |||
Table 1: CBOR diagnostic notation summary | Table 1: CBOR Diagnostic Notation Summary | |||
Note: CBOR binary contents shown in this specification are annotated | Note: CBOR binary contents shown in this specification are annotated | |||
with comments. These comments are delimited by slashes ("/") as | with comments. These comments are delimited by slashes ("/"), as | |||
defined in [RFC8610] Appendix G.6. | defined in Appendix G.6 of [RFC8610]. | |||
3.2. YANG Schema Item iDentifier | 3.2. YANG Schema Item iDentifier | |||
Some of the items defined in YANG [RFC7950] require the use of a | Some of the items defined in YANG [RFC7950] require the use of a | |||
unique identifier. In both Network Configuration Protocol (NETCONF) | unique identifier. In both the Network Configuration Protocol | |||
[RFC6241] and RESTCONF [RFC8040], these identifiers are implemented | (NETCONF) [RFC6241] and RESTCONF [RFC8040], these identifiers are | |||
using text strings. To allow the implementation of data models | implemented using text strings. To allow the implementation of data | |||
defined in YANG in constrained devices and constrained networks, a | models defined in YANG in constrained devices and constrained | |||
more compact method to identify YANG items is required. This compact | networks, a more compact method to identify YANG items is required. | |||
identifier, called YANG Schema Item iDentifier, is an unsigned | This compact identifier, called "YANG Schema Item iDentifier", is an | |||
integer limited to 63 bits of range (i.e., 0..9223372036854775807 or | unsigned integer limited to 63 bits of range (i.e., | |||
0..0x7fffffffffffffff). The following items are identified using | 0..9223372036854775807 or 0..0x7fffffffffffffff). The following | |||
YANG SIDs (often shortened to SIDs): | items are identified using YANG SIDs (often shortened to SIDs): | |||
* identities | * identities | |||
* data nodes | * data nodes | |||
* RPCs and associated input(s) and output(s) | * RPCs and associated input(s) and output(s) | |||
* actions and associated input(s) and output(s) | * actions and associated input(s) and output(s) | |||
* YANG data structures | * YANG data structures | |||
* notifications and associated information | * notifications and associated information | |||
* YANG modules and features | * YANG modules and features | |||
Note that any structuring of modules into submodules is transparent | | Note that any structuring of modules into submodules is | |||
to YANG-CBOR: SIDs are not allocated for the names of submodules, and | | transparent to YANG-CBOR: SIDs are not allocated for the names | |||
any items within a submodule are effectively allocated SIDs as part | | of submodules, and any items within a submodule are effectively | |||
of processing the module that includes them. | | allocated SIDs as part of processing the module that includes | |||
| them. | ||||
To minimize their size, SIDs used as keys in CBOR maps are encoded | To minimize their size, SIDs used as keys in CBOR maps are encoded | |||
using deltas, i.e., signed (negative or unsigned) integers that are | using deltas, i.e., signed (negative or unsigned) integers that are | |||
added to the reference SID applying to the map. The reference SID of | added to the reference SID applying to the map. The reference SID of | |||
an outermost map is zero, unless a different reference SID is | an outermost map is zero, unless a different reference SID is | |||
unambiguously conferred from the environment in which the outermost | unambiguously conferred from the environment in which the outermost | |||
map is used. The reference SID of a map that is most directly | map is used. The reference SID of a map that is most directly | |||
embedded in a map entry with a name-based key is zero. For all other | embedded in a map entry with a name-based key is zero. For all other | |||
maps, the reference SID is the SID computed for the map entry it is | maps, the reference SID is the SID computed for the map entry it is | |||
most directly embedded in. (The embedding may be indirect if an | most directly embedded in. (The embedding may be indirect if an | |||
skipping to change at page 9, line 14 ¶ | skipping to change at line 394 ¶ | |||
Thus, conversion from SIDs to deltas and back to SIDs is a stateless | Thus, conversion from SIDs to deltas and back to SIDs is a stateless | |||
process solely based on the data serialized or deserialized combined | process solely based on the data serialized or deserialized combined | |||
with, potentially, an outermost reference SID unambiguously conferred | with, potentially, an outermost reference SID unambiguously conferred | |||
by the environment. | by the environment. | |||
Mechanisms and processes used to assign SIDs to YANG items and to | Mechanisms and processes used to assign SIDs to YANG items and to | |||
guarantee their uniqueness are outside the scope of the present | guarantee their uniqueness are outside the scope of the present | |||
specification. If SIDs are to be used, the present specification is | specification. If SIDs are to be used, the present specification is | |||
used in conjunction with a specification defining this management. A | used in conjunction with a specification defining this management. A | |||
related document, [I-D.ietf-core-sid], is intended to serve as the | related document, i.e., [CORE-SID], is intended to serve as the | |||
definitive way to assign SID values for YANG modules managed by the | definitive way to assign SID values for YANG modules managed by the | |||
IETF, and recommends itself for YANG modules managed by non-IETF | IETF and recommends itself for YANG modules managed by non-IETF | |||
entities, as well. The present specification has been designed to | entities, as well. The present specification has been designed to | |||
allow different methods of assignment to be used within separate | allow different methods of assignment to be used within separate | |||
domains. | domains. | |||
To provide implementations with a way to internally indicate the | To provide implementations with a way to internally indicate the | |||
absence of a SID, the SID value 0 is reserved and will not be | absence of a SID, the SID value 0 is reserved and will not be | |||
allocated; it is not used in interchange. | allocated; it is not used in interchange. | |||
3.3. Name | 3.3. Name | |||
This specification also supports the encoding of YANG item | This specification also supports the encoding of YANG item | |||
identifiers as text strings, similar to those used by the JSON | identifiers as text strings, similar to those used by the JSON | |||
Encoding of Data Modeled with YANG [RFC7951]. This approach can be | encoding of data modeled with YANG [RFC7951]. This approach can be | |||
used to avoid the management overhead associated with SID allocation. | used to avoid the management overhead associated with SID allocation. | |||
The main drawback is the significant increase in size of the encoded | The main drawback is the significant increase in size of the encoded | |||
data. | data. | |||
YANG item identifiers implemented using names MUST be in one of the | YANG item identifiers implemented using names MUST be in one of the | |||
following forms: | following forms: | |||
* simple -- the identifier of the YANG item (i.e., schema node or | * simple -- the identifier of the YANG item (i.e., schema node or | |||
identity). | identity). | |||
* namespace qualified -- the identifier of the YANG item is prefixed | * namespace-qualified -- the identifier of the YANG item is prefixed | |||
with the name of the module in which this item is defined, | with the name of the module in which this item is defined, | |||
separated by the colon character (":"). | separated by the colon character (":"). | |||
The name of a module determines the namespace of all YANG items | The name of a module determines the namespace of all YANG items | |||
defined in that module. If an item is defined in a submodule, then | defined in that module. If an item is defined in a submodule, then | |||
the namespace qualified name uses the name of the main module to | the namespace-qualified name uses the name of the main module to | |||
which the submodule belongs. | which the submodule belongs. | |||
ABNF syntax [RFC5234] of a name is shown in Figure 1, where the | ABNF syntax [RFC5234] of a name is shown in Figure 1, where the | |||
production for "identifier" is defined in Section 14 of [RFC7950]. | production for "identifier" is defined in Section 14 of [RFC7950]. | |||
name = [identifier ":"] identifier | name = [identifier ":"] identifier | |||
Figure 1: ABNF Production for a simple or namespace qualified name | Figure 1: ABNF Production for a Simple or Namespace-Qualified Name | |||
A namespace qualified name MUST be used for all members of a top- | A namespace-qualified name MUST be used for all members of a top- | |||
level CBOR map and then also whenever the namespaces of the | level CBOR map and then also whenever the namespaces of the | |||
representation node and its parent node are different. In all other | representation node and its parent node are different. In all other | |||
cases, the simple form of the name MUST be used. | cases, the simple form of the name MUST be used. | |||
Definition example: | Definition example: | |||
module example-foomod { | module example-foomod { | |||
container top { | container top { | |||
leaf foo { | leaf foo { | |||
type uint8; | type uint8; | |||
skipping to change at page 10, line 45 ¶ | skipping to change at line 474 ¶ | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"example-foomod:top": { | "example-foomod:top": { | |||
"foo": 54, | "foo": 54, | |||
"example-barmod:bar": true | "example-barmod:bar": true | |||
} | } | |||
} | } | |||
Both the 'top' container and the 'bar' leaf defined in a different | Both the 'top' container and the 'bar' leaf defined in a different | |||
YANG module as its parent container are encoded as namespace | YANG module as its parent container are encoded as namespace- | |||
qualified names. The 'foo' leaf defined in the same YANG module as | qualified names. The 'foo' leaf defined in the same YANG module as | |||
its parent container is encoded as simple name. | its parent container is encoded as a simple name. | |||
4. Encoding of Representation Nodes | 4. Encoding of Representation Nodes | |||
Representation nodes defined using the YANG modeling language are | Representation nodes defined using the YANG modeling language are | |||
encoded using CBOR [RFC8949] based on the rules defined in this | encoded using CBOR [RFC8949], based on the rules defined in this | |||
section. We assume that the reader is already familiar with both | section. We assume that the reader is already familiar with both | |||
YANG [RFC7950] and CBOR [RFC8949]. | YANG [RFC7950] and CBOR [RFC8949]. | |||
4.1. The 'leaf' | 4.1. The 'leaf' | |||
A 'leaf' MUST be encoded accordingly to its datatype using one of the | A 'leaf' MUST be encoded accordingly to its datatype using one of the | |||
encoding rules specified in Section 6. | encoding rules specified in Section 6. | |||
The following examples show the encoding of a 'hostname' leaf using a | The following examples show the encoding of a 'hostname' leaf using a | |||
SID or a name. | SID or a name. | |||
skipping to change at page 11, line 36 ¶ | skipping to change at line 509 ¶ | |||
+ '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' | + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' | |||
+ '|\.'; | + '|\.'; | |||
length "1..253"; | length "1..253"; | |||
} | } | |||
} | } | |||
leaf hostname { | leaf hostname { | |||
type inet:domain-name; | type inet:domain-name; | |||
} | } | |||
4.1.1. Using SIDs in keys | 4.1.1. Using SIDs in Keys | |||
As with all examples below, the delta in the outermost map assumes a | As with all examples below, the delta in the outermost map assumes a | |||
reference YANG SID (current schema node) of 0. | reference YANG SID (current schema node) of 0. | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
1752 : "myhost.example.com" / hostname (SID 1752) / | 1752 : "myhost.example.com" / hostname (SID 1752) / | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
19 06D8 # unsigned(1752) | 19 06D8 # unsigned(1752) | |||
72 # text(18) | 72 # text(18) | |||
6D79686F73742E6578616D706C652E636F6D # "myhost.example.com" | 6D79686F73742E6578616D706C652E636F6D # "myhost.example.com" | |||
4.1.2. Using names in keys | 4.1.2. Using Names in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"ietf-system:hostname" : "myhost.example.com" | "ietf-system:hostname" : "myhost.example.com" | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
74 # text(20) | 74 # text(20) | |||
696574662D73797374656D3A686F73746E616D65 | 696574662D73797374656D3A686F73746E616D65 | |||
72 # text(18) | 72 # text(18) | |||
6D79686F73742E6578616D706C652E636F6D | 6D79686F73742E6578616D706C652E636F6D | |||
4.2. The 'container' and other nodes from the data tree | 4.2. The 'container' and Other Nodes from the Data Tree | |||
Instances of containers, YANG data structures, notification contents, | Instances of containers, YANG data structures, notification contents, | |||
RPC inputs, RPC outputs, action inputs, and action outputs MUST be | RPC inputs, RPC outputs, action inputs, and action outputs MUST be | |||
encoded using a CBOR map data item (major type 5). The same encoding | encoded using a CBOR map data item (major type 5). The same encoding | |||
is also used for the list entries in a list (Section 4.4). A map | is also used for the list entries in a list (Section 4.4) and for | |||
consists of pairs of data items, with each pair consisting of a key | anydata nodes (Section 4.5). Collectively, we speak of these | |||
and a value. Each key within the CBOR map is set to a schema node | instances as "container-like instances". | |||
identifier, each value is set to the value of this representation | ||||
node according to the instance datatype. | ||||
This specification supports two types of CBOR map keys; SID as | A map consists of pairs of data items, with each pair consisting of a | |||
defined in Section 3.2 and names as defined in Section 3.3. | key and a value. Each key within the CBOR map is set to a schema | |||
node identifier, and each value is set to the value of this | ||||
representation node according to the instance datatype. | ||||
This specification supports two types of CBOR map keys: SID, as | ||||
defined in Section 3.2, and names, as defined in Section 3.3. | ||||
The following examples show the encoding of a 'system-state' | The following examples show the encoding of a 'system-state' | |||
container representation instance using SIDs or names. | container representation instance using SIDs or names. | |||
Definition example adapted from [RFC6991] and [RFC7317]: | Definition example adapted from [RFC6991] and [RFC7317]: | |||
typedef date-and-time { | typedef date-and-time { | |||
type string { | type string { | |||
pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' | pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' | |||
+ '(Z|[\+\-]\d{2}:\d{2})'; | + '(Z|[\+\-]\d{2}:\d{2})'; | |||
skipping to change at page 13, line 25 ¶ | skipping to change at line 585 ¶ | |||
leaf current-datetime { | leaf current-datetime { | |||
type date-and-time; | type date-and-time; | |||
} | } | |||
leaf boot-datetime { | leaf boot-datetime { | |||
type date-and-time; | type date-and-time; | |||
} | } | |||
} | } | |||
} | } | |||
4.2.1. Using SIDs in keys | 4.2.1. Using SIDs in Keys | |||
In the context of containers and other nodes from the data tree, CBOR | In the context of containers and other nodes from the data tree, CBOR | |||
map keys within inner CBOR maps can be encoded using deltas (bare | map keys within inner CBOR maps can be encoded using deltas (bare | |||
integers) or absolute SIDs (tagged with tag number 47). | integers) or absolute SIDs (tagged with tag number 47). | |||
Delta values are computed as follows: | Delta values are computed as follows: | |||
* In the case of a 'container', deltas are equal to the SID of the | * In the case of a 'container', deltas are equal to the SID of the | |||
current representation node minus the SID of the parent | current representation node minus the SID of the parent | |||
'container'. | 'container'. | |||
skipping to change at page 14, line 28 ¶ | skipping to change at line 637 ¶ | |||
A1 # map(1) | A1 # map(1) | |||
01 # unsigned(1) | 01 # unsigned(1) | |||
A2 # map(2) | A2 # map(2) | |||
02 # unsigned(2) | 02 # unsigned(2) | |||
78 1A # text(26) | 78 1A # text(26) | |||
323031352D31302D30325431343A34373A32345A2D30353A3030 | 323031352D31302D30325431343A34373A32345A2D30353A3030 | |||
01 # unsigned(1) | 01 # unsigned(1) | |||
78 1A # text(26) | 78 1A # text(26) | |||
323031352D30392D31355430393A31323A35385A2D30353A3030 | 323031352D30392D31355430393A31323A35385A2D30353A3030 | |||
Figure 2: System state clock encoding | Figure 2: System State Clock Encoding | |||
4.2.2. Using names in keys | 4.2.2. Using Names in Keys | |||
CBOR map keys implemented using names MUST be encoded using a CBOR | CBOR map keys implemented using names MUST be encoded using a CBOR | |||
text string data item (major type 3). A namespace-qualified name | text string data item (major type 3). A namespace-qualified name | |||
MUST be used each time the namespace of a representation node and its | MUST be used each time the namespace of a representation node and its | |||
parent differ. In all other cases, the simple form of the name MUST | parent differ. In all other cases, the simple form of the name MUST | |||
be used. Names and namespaces are defined in Section 4 of [RFC7951]. | be used. Names and namespaces are defined in Section 4 of [RFC7951]. | |||
The following example shows the encoding of a 'system' container | The following example shows the encoding of a 'system' container | |||
representation node instance using names. | representation node instance using names. | |||
skipping to change at page 15, line 28 ¶ | skipping to change at line 686 ¶ | |||
78 1A # text(26) | 78 1A # text(26) | |||
323031352D30392D31355430393A31323A35385A2D30353A3030 | 323031352D30392D31355430393A31323A35385A2D30353A3030 | |||
4.3. The 'leaf-list' | 4.3. The 'leaf-list' | |||
A leaf-list MUST be encoded using a CBOR array data item (major type | A leaf-list MUST be encoded using a CBOR array data item (major type | |||
4). Each entry of this array MUST be encoded accordingly to its | 4). Each entry of this array MUST be encoded accordingly to its | |||
datatype using one of the encoding rules specified in Section 6. | datatype using one of the encoding rules specified in Section 6. | |||
The following example shows the encoding of the 'search' leaf-list | The following example shows the encoding of the 'search' leaf-list | |||
representation node instance containing two entries, "ietf.org" and | representation node instance containing two entries: "ietf.org" and | |||
"ieee.org". | "ieee.org". | |||
Definition example adapted from [RFC6991] and [RFC7317]: | Definition example adapted from [RFC6991] and [RFC7317]: | |||
typedef domain-name { | typedef domain-name { | |||
type string { | type string { | |||
pattern | pattern | |||
'((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' | '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' | |||
+ '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' | + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' | |||
+ '|\.'; | + '|\.'; | |||
length "1..253"; | length "1..253"; | |||
} | } | |||
} | } | |||
leaf-list search { | leaf-list search { | |||
type domain-name; | type domain-name; | |||
ordered-by user; | ordered-by user; | |||
} | } | |||
4.3.1. Using SIDs in keys | 4.3.1. Using SIDs in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
1746 : [ "ietf.org", "ieee.org" ] / search (SID 1746) / | 1746 : [ "ietf.org", "ieee.org" ] / search (SID 1746) / | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
19 06D2 # unsigned(1746) | 19 06D2 # unsigned(1746) | |||
82 # array(2) | 82 # array(2) | |||
68 # text(8) | 68 # text(8) | |||
696574662E6F7267 # "ietf.org" | 696574662E6F7267 # "ietf.org" | |||
68 # text(8) | 68 # text(8) | |||
696565652E6F7267 # "ieee.org" | 696565652E6F7267 # "ieee.org" | |||
4.3.2. Using names in keys | 4.3.2. Using Names in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"ietf-system:search" : [ "ietf.org", "ieee.org" ] | "ietf-system:search" : [ "ietf.org", "ieee.org" ] | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
72 # text(18) | 72 # text(18) | |||
696574662D73797374656D3A736561726368 # "ietf-system:search" | 696574662D73797374656D3A736561726368 # "ietf-system:search" | |||
82 # array(2) | 82 # array(2) | |||
68 # text(8) | 68 # text(8) | |||
696574662E6F7267 # "ietf.org" | 696574662E6F7267 # "ietf.org" | |||
68 # text(8) | 68 # text(8) | |||
696565652E6F7267 # "ieee.org" | 696565652E6F7267 # "ieee.org" | |||
4.4. The 'list' and 'list' entries | 4.4. The 'list' and the 'list' Entries | |||
A list or a subset of a list MUST be encoded using a CBOR array data | A list or a subset of a list MUST be encoded using a CBOR array data | |||
item (major type 4). Each list entry within this CBOR array is | item (major type 4). Each list entry within this CBOR array is | |||
encoded using a CBOR map data item (major type 5) based on the | encoded using a CBOR map data item (major type 5) based on the | |||
encoding rules of a collection as defined in Section 4.2. | encoding rules of a container-like instance, as defined in | |||
Section 4.2. | ||||
It is important to note that this encoding rule also applies to a | It is important to note that this encoding rule also applies to a | |||
'list' representation node instance that has a single entry. | 'list' representation node instance that has a single entry. | |||
The following examples show the encoding of a 'server' list using | The following examples show the encoding of a 'server' list using | |||
SIDs or names. | SIDs or names. | |||
Definition example simplified from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
list server { | list server { | |||
key name; | key name; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
} | } | |||
choice transport { | choice transport { | |||
case udp { | case udp { | |||
container udp { | container udp { | |||
skipping to change at page 17, line 42 ¶ | skipping to change at line 796 ¶ | |||
leaf iburst { | leaf iburst { | |||
type boolean; | type boolean; | |||
default false; | default false; | |||
} | } | |||
leaf prefer { | leaf prefer { | |||
type boolean; | type boolean; | |||
default false; | default false; | |||
} | } | |||
} | } | |||
4.4.1. Using SIDs in keys | 4.4.1. Using SIDs in Keys | |||
The encoding rules of each 'list' entry are defined in Section 4.2.1. | The encoding rules of each 'list' entry are defined in Section 4.2.1. | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
1756 : [ / server (SID 1756) / | 1756 : [ / server (SID 1756) / | |||
{ | { | |||
3 : "NRC TIC server", / name (SID 1759) / | 3 : "NRC TIC server", / name (SID 1759) / | |||
5 : { / udp (SID 1761) / | 5 : { / udp (SID 1761) / | |||
skipping to change at page 19, line 35 ¶ | skipping to change at line 855 ¶ | |||
A2 # map(2) | A2 # map(2) | |||
03 # unsigned(3) | 03 # unsigned(3) | |||
6E # text(14) | 6E # text(14) | |||
4E52432054414320736572766572 # "NRC TAC server" | 4E52432054414320736572766572 # "NRC TAC server" | |||
05 # unsigned(5) | 05 # unsigned(5) | |||
A1 # map(1) | A1 # map(1) | |||
01 # unsigned(1) | 01 # unsigned(1) | |||
6A # text(10) | 6A # text(10) | |||
7461632E6E72632E6361 # "tac.nrc.ca" | 7461632E6E72632E6361 # "tac.nrc.ca" | |||
4.4.2. Using names in keys | 4.4.2. Using Names in Keys | |||
The encoding rules of each 'list' entry are defined in Section 4.2.2. | The encoding rules of each 'list' entry are defined in Section 4.2.2. | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"ietf-system:server" : [ | "ietf-system:server" : [ | |||
{ | { | |||
"name" : "NRC TIC server", | "name" : "NRC TIC server", | |||
"udp" : { | "udp" : { | |||
skipping to change at page 21, line 48 ¶ | skipping to change at line 927 ¶ | |||
63 # text(3) | 63 # text(3) | |||
756470 # "udp" | 756470 # "udp" | |||
A1 # map(1) | A1 # map(1) | |||
67 # text(7) | 67 # text(7) | |||
61646472657373 # "address" | 61646472657373 # "address" | |||
6A # text(10) | 6A # text(10) | |||
7461632E6E72632E6361 # "tac.nrc.ca" | 7461632E6E72632E6361 # "tac.nrc.ca" | |||
4.5. The 'anydata' | 4.5. The 'anydata' | |||
An anydata serves as a container for an arbitrary set of | An anydata node serves as a container for an arbitrary set of | |||
representation nodes that otherwise appear as normal YANG-modeled | representation nodes that otherwise appear as normal YANG-modeled | |||
data. An anydata representation node instance is encoded using the | data. An anydata representation node instance is encoded using the | |||
same rules as a container, i.e., CBOR map. The requirement that | same rules as a container, i.e., using a CBOR map data item (major | |||
anydata content can be modeled by YANG implies the following: | type 5) based on the encoding rules of a container-like instance, as | |||
defined in Section 4.2. | ||||
* CBOR map keys of any inner representation nodes MUST be set to | ||||
valid deltas or names. | ||||
* CBOR arrays MUST contain either unique scalar values (as a leaf- | ||||
list, see Section 4.3), or maps (as a list, see Section 4.4). | ||||
* CBOR map values MUST follow the encoding rules of one of the | ||||
datatypes listed in Section 4. | ||||
The following example shows a possible use of an anydata. In this | The following example shows a possible use of an anydata node. In | |||
example, an anydata is used to define a representation node | this example, an anydata node is used to define a representation node | |||
containing a notification event; this representation node can be part | containing a notification event; this representation node can be part | |||
of a YANG list to create an event logger. | of a YANG list to create an event logger. | |||
Definition example: | Definition example: | |||
module event-log { | module event-log { | |||
... | ... | |||
anydata last-event; # SID 60123 | anydata last-event; // SID 60123 | |||
} | } | |||
This example also assumes the assistance of the following | This example also assumes the assistance of the following | |||
notification. | notification. | |||
module example-port { | module example-port { | |||
... | ... | |||
notification example-port-fault { # SID 60200 | notification example-port-fault { // SID 60200 | |||
leaf port-name { # SID 60201 | leaf port-name { // SID 60201 | |||
type string; | type string; | |||
} | } | |||
leaf port-fault { # SID 60202 | leaf port-fault { // SID 60202 | |||
type string; | type string; | |||
} | } | |||
} | } | |||
} | } | |||
4.5.1. Using SIDs in keys | 4.5.1. Using SIDs in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
60123 : { / last-event (SID 60123) / | 60123 : { / last-event (SID 60123) / | |||
77 : { / example-port-fault (SID 60200) / | 77 : { / example-port-fault (SID 60200) / | |||
1 : "0/4/21", / port-name (SID 60201) / | 1 : "0/4/21", / port-name (SID 60201) / | |||
2 : "Open pin 2" / port-fault (SID 60202) / | 2 : "Open pin 2" / port-fault (SID 60202) / | |||
} | } | |||
} | } | |||
skipping to change at page 23, line 41 ¶ | skipping to change at line 1002 ¶ | |||
{ | { | |||
60123 : { / last-event (SID 60123) / | 60123 : { / last-event (SID 60123) / | |||
47(60200) : { / event-port-fault (SID 60200) / | 47(60200) : { / event-port-fault (SID 60200) / | |||
1 : "0/4/21", / port-name (SID 60201) / | 1 : "0/4/21", / port-name (SID 60201) / | |||
2 : "Open pin 2" / port-fault (SID 60202) / | 2 : "Open pin 2" / port-fault (SID 60202) / | |||
} | } | |||
} | } | |||
} | } | |||
4.5.2. Using names in keys | 4.5.2. Using Names in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"event-log:last-event" : { | "event-log:last-event" : { | |||
"example-port:example-port-fault" : { | "example-port:example-port-fault" : { | |||
"port-name" : "0/4/21", | "port-name" : "0/4/21", | |||
"port-fault" : "Open pin 2" | "port-fault" : "Open pin 2" | |||
} | } | |||
} | } | |||
skipping to change at page 24, line 32 ¶ | skipping to change at line 1043 ¶ | |||
4.6. The 'anyxml' | 4.6. The 'anyxml' | |||
An anyxml representation node is used to serialize an arbitrary CBOR | An anyxml representation node is used to serialize an arbitrary CBOR | |||
content, i.e., its value can be any CBOR binary object. (The "xml" | content, i.e., its value can be any CBOR binary object. (The "xml" | |||
in the name is a misnomer that only applied to YANG-XML [RFC7950].) | in the name is a misnomer that only applied to YANG-XML [RFC7950].) | |||
An anyxml value MAY contain CBOR data items tagged with one of the | An anyxml value MAY contain CBOR data items tagged with one of the | |||
tags listed in Section 9.3. The tags listed in Section 9.3 SHALL be | tags listed in Section 9.3. The tags listed in Section 9.3 SHALL be | |||
supported. | supported. | |||
The following example shows a valid CBOR encoded anyxml | The following example shows a valid CBOR-encoded anyxml | |||
representation node instance consisting of a CBOR array containing | representation node instance consisting of a CBOR array containing | |||
the CBOR simple values 'true', 'null' and 'true'. | the CBOR simple values 'true', 'null', and 'true'. | |||
Definition example from [RFC7951]: | Definition example adapted from [RFC7951]: | |||
module bar-module { | module bar-module { | |||
... | ... | |||
anyxml bar; # SID 60000 | anyxml bar; // SID 60000 | |||
} | } | |||
4.6.1. Using SIDs in keys | 4.6.1. Using SIDs in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
60000 : [true, null, true] / bar (SID 60000) / | 60000 : [true, null, true] / bar (SID 60000) / | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
19 EA60 # unsigned(60000) | 19 EA60 # unsigned(60000) | |||
83 # array(3) | 83 # array(3) | |||
F5 # primitive(21) | F5 # primitive(21) | |||
F6 # primitive(22) | F6 # primitive(22) | |||
F5 # primitive(21) | F5 # primitive(21) | |||
4.6.2. Using names in keys | 4.6.2. Using Names in Keys | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"bar-module:bar" : [true, null, true] / bar (SID 60000) / | "bar-module:bar" : [true, null, true] / bar (SID 60000) / | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
6E # text(14) | 6E # text(14) | |||
6261722D6D6F64756C653A626172 # "bar-module:bar" | 6261722D6D6F64756C653A626172 # "bar-module:bar" | |||
83 # array(3) | 83 # array(3) | |||
F5 # primitive(21) | F5 # primitive(21) | |||
F6 # primitive(22) | F6 # primitive(22) | |||
F5 # primitive(21) | F5 # primitive(21) | |||
5. Encoding of 'yang-data' extension | 5. Encoding of the 'yang-data' Extension | |||
The yang-data extension [RFC8040] is used to define data structures | The yang-data extension [RFC8040] is used to define data structures | |||
in YANG that are not intended to be implemented as part of a | in YANG that are not intended to be implemented as part of a | |||
datastore. | datastore. | |||
The yang-data extension will specify a container that MUST be encoded | The yang-data extension will specify a container that MUST be encoded | |||
using the encoding rules of nodes of data trees as defined in | using the encoding rules of nodes of data trees, as defined in | |||
Section 4.2. | Section 4.2. | |||
Just like YANG containers, the yang-data extension can be encoded | Just like YANG containers, the yang-data extension can be encoded | |||
using either SIDs or names. | using either SIDs or names. | |||
Definition example from [I-D.ietf-core-comi] Appendix A: | Definition example adapted from Appendix A of [CORE-COMI]: | |||
module ietf-coreconf { | module ietf-coreconf { | |||
... | ... | |||
import ietf-restconf { | import ietf-restconf { | |||
prefix rc; | prefix rc; | |||
} | } | |||
rc:yang-data yang-errors { | rc:yang-data yang-errors { | |||
container error { | container error { | |||
skipping to change at page 26, line 34 ¶ | skipping to change at line 1133 ¶ | |||
leaf error-data-node { | leaf error-data-node { | |||
type instance-identifier; | type instance-identifier; | |||
} | } | |||
leaf error-message { | leaf error-message { | |||
type string; | type string; | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
5.1. Using SIDs in keys | 5.1. Using SIDs in Keys | |||
The yang-data extensions encoded using SIDs are carried in a CBOR map | The yang-data extensions encoded using SIDs are carried in a CBOR map | |||
containing a single item pair. The key of this item is set to the | containing a single item pair. The key of this item is set to the | |||
SID assigned to the yang-data extension container; the value is set | SID assigned to the yang-data extension container; the value is set | |||
to the CBOR encoding of this container as defined in Section 4.2. | to the CBOR encoding of this container, as defined in Section 4.2. | |||
This example shows a serialization example of the yang-errors yang- | This example shows a serialization example of the yang-errors yang- | |||
data extension as defined in [I-D.ietf-core-comi] using SIDs as | data extension, as defined in [CORE-COMI], using SIDs, as defined in | |||
defined in Section 3.2. | Section 3.2. | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
1024 : { / error (SID 1024) / | 1024 : { / error (SID 1024) / | |||
4 : 1011, / error-tag (SID 1028) / | 4 : 1011, / error-tag (SID 1028) / | |||
/ = invalid-value (SID 1011) / | / = invalid-value (SID 1011) / | |||
1 : 1018, / error-app-tag (SID 1025) / | 1 : 1018, / error-app-tag (SID 1025) / | |||
/ = not-in-range (SID 1018) / | / = not-in-range (SID 1018) / | |||
2 : 1740, / error-data-node (SID 1026) / | 2 : 1740, / error-data-node (SID 1026) / | |||
/ = timezone-utc-offset (SID 1740) / | / = timezone-utc-offset (SID 1740) / | |||
3 : "Maximum exceeded" / error-message (SID 1027) / | 3 : "Maximum exceeded" / error-message (SID 1027) / | |||
} | } | |||
} | } | |||
CBOR encoding: | CBOR encoding: | |||
A1 # map(1) | A1 # map(1) | |||
19 0400 # unsigned(1024) | 19 0400 # unsigned(1024) | |||
A4 # map(4) | A4 # map(4) | |||
04 # unsigned(4) | 04 # unsigned(4) | |||
19 03F3 # unsigned(1011) | 19 03F3 # unsigned(1011) | |||
01 # unsigned(1) | 01 # unsigned(1) | |||
19 03FA # unsigned(1018) | 19 03FA # unsigned(1018) | |||
02 # unsigned(2) | 02 # unsigned(2) | |||
19 06CC # unsigned(1740) | 19 06CC # unsigned(1740) | |||
03 # unsigned(3) | 03 # unsigned(3) | |||
70 # text(16) | 70 # text(16) | |||
4D6178696D756D206578636565646564 # "Maximum exceeded" | 4D6178696D756D206578636565646564 # "Maximum exceeded" | |||
5.2. Using names in keys | 5.2. Using Names in Keys | |||
The yang-data extensions encoded using names are carried in a CBOR | The yang-data extensions encoded using names are carried in a CBOR | |||
map containing a single item pair. The key of this item is set to | map containing a single item pair. The key of this item is set to | |||
the namespace qualified name of the yang-data extension container; | the namespace-qualified name of the yang-data extension container; | |||
the value is set to the CBOR encoding of this container as defined in | the value is set to the CBOR encoding of this container, as defined | |||
Section 4.2. | in Section 4.2. | |||
This example shows a serialization example of the yang-errors yang- | This example shows a serialization example of the yang-errors yang- | |||
data extension as defined in [I-D.ietf-core-comi] using names as | data extension, as defined in [CORE-COMI], using names, as defined | |||
defined Section 3.3. | Section 3.3. | |||
CBOR diagnostic notation: | CBOR diagnostic notation: | |||
{ | { | |||
"ietf-coreconf:error" : { | "ietf-coreconf:error" : { | |||
"error-tag" : "invalid-value", | "error-tag" : "invalid-value", | |||
"error-app-tag" : "not-in-range", | "error-app-tag" : "not-in-range", | |||
"error-data-node" : "timezone-utc-offset", | "error-data-node" : "timezone-utc-offset", | |||
"error-message" : "Maximum exceeded" | "error-message" : "Maximum exceeded" | |||
} | } | |||
skipping to change at page 28, line 42 ¶ | skipping to change at line 1224 ¶ | |||
# "timezone-utc-offset" | # "timezone-utc-offset" | |||
6D # text(13) | 6D # text(13) | |||
6572726F722D6D657373616765 # "error-message" | 6572726F722D6D657373616765 # "error-message" | |||
70 # text(16) | 70 # text(16) | |||
4D6178696D756D206578636565646564 # "Maximum exceeded" | 4D6178696D756D206578636565646564 # "Maximum exceeded" | |||
6. Representing YANG Data Types in CBOR | 6. Representing YANG Data Types in CBOR | |||
The CBOR encoding of an instance of a leaf or leaf-list | The CBOR encoding of an instance of a leaf or leaf-list | |||
representation node depends on the built-in type of that | representation node depends on the built-in type of that | |||
representation node. The following sub-section defines the CBOR | representation node. The following subsection defines the CBOR | |||
encoding of each built-in type supported by YANG as listed in | encoding of each built-in type supported by YANG, as listed in | |||
Section 4.2.4 of [RFC7950]. Each subsection shows an example value | Section 4.2.4 of [RFC7950]. Each subsection shows an example value | |||
assigned to a representation node instance of the discussed built-in | assigned to a representation node instance of the discussed built-in | |||
type. | type. | |||
6.1. The unsigned integer Types | 6.1. The Unsigned Integer Types | |||
Leafs of type uint8, uint16, uint32 and uint64 MUST be encoded using | Leafs of type uint8, uint16, uint32, and uint64 MUST be encoded using | |||
a CBOR unsigned integer data item (major type 0). | a CBOR unsigned integer data item (major type 0). | |||
The following example shows the encoding of an 'mtu' leaf | The following example shows the encoding of an 'mtu' leaf | |||
representation node instance set to 1280 bytes. | representation node instance set to 1280 bytes. | |||
Definition example from [RFC8344]: | Definition example adapted from [RFC8344]: | |||
leaf mtu { | leaf mtu { | |||
type uint16 { | type uint16 { | |||
range "68..max"; | range "68..max"; | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: 1280 | CBOR diagnostic notation: 1280 | |||
CBOR encoding: 19 0500 | CBOR encoding: 19 0500 | |||
6.2. The integer Types | 6.2. The Integer Types | |||
Leafs of type int8, int16, int32 and int64 MUST be encoded using | Leafs of type int8, int16, int32, and int64 MUST be encoded using | |||
either CBOR unsigned integer (major type 0) or CBOR negative integer | either a CBOR unsigned integer (major type 0) or a CBOR negative | |||
(major type 1), depending on the actual value. | integer (major type 1), depending on the actual value. | |||
The following example shows the encoding of a 'timezone-utc-offset' | The following example shows the encoding of a 'timezone-utc-offset' | |||
leaf representation node instance set to -300 minutes. | leaf representation node instance set to -300 minutes. | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
leaf timezone-utc-offset { | leaf timezone-utc-offset { | |||
type int16 { | type int16 { | |||
range "-1500 .. 1500"; | range "-1500 .. 1500"; | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: -300 | CBOR diagnostic notation: -300 | |||
CBOR encoding: 39 012B | CBOR encoding: 39 012B | |||
6.3. The 'decimal64' Type | 6.3. The 'decimal64' Type | |||
Leafs of type decimal64 MUST be encoded using a decimal fraction as | Leafs of type decimal64 MUST be encoded using a decimal fraction, as | |||
defined in Section 3.4.4 of [RFC8949]. | defined in Section 3.4.4 of [RFC8949]. | |||
The following example shows the encoding of a 'my-decimal' leaf | The following example shows the encoding of a 'my-decimal' leaf | |||
representation node instance set to 2.57. | representation node instance set to 2.57. | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
leaf my-decimal { | leaf my-decimal { | |||
type decimal64 { | type decimal64 { | |||
fraction-digits 2; | fraction-digits 2; | |||
range "1 .. 3.14 | 10 | 20..max"; | range "1 .. 3.14 | 10 | 20..max"; | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: 4([-2, 257]) | CBOR diagnostic notation: 4([-2, 257]) | |||
CBOR encoding: C4 82 21 19 0101 | CBOR encoding: C4 82 21 19 0101 | |||
6.4. The 'string' Type | 6.4. The 'string' Type | |||
Leafs of type string MUST be encoded using a CBOR text string data | Leafs of type string MUST be encoded using a CBOR text string data | |||
item (major type 3). | item (major type 3). | |||
The following example shows the encoding of a 'name' leaf | The following example shows the encoding of a 'name' leaf | |||
representation node instance set to "eth0". | representation node instance set to "eth0". | |||
Definition example from [RFC8343]: | Definition example adapted from [RFC8343]: | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
} | } | |||
CBOR diagnostic notation: "eth0" | CBOR diagnostic notation: "eth0" | |||
CBOR encoding: 64 65746830 | CBOR encoding: 64 65746830 | |||
6.5. The 'boolean' Type | 6.5. The 'boolean' Type | |||
Leafs of type boolean MUST be encoded using a CBOR simple value | Leafs of type boolean MUST be encoded using a CBOR simple value | |||
'true' (major type 7, additional information 21) or 'false' (major | 'true' (major type 7, additional information 21) or 'false' (major | |||
type 7, additional information 20). | type 7, additional information 20). | |||
The following example shows the encoding of an 'enabled' leaf | The following example shows the encoding of an 'enabled' leaf | |||
representation node instance set to 'true'. | representation node instance set to 'true'. | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
leaf enabled { | leaf enabled { | |||
type boolean; | type boolean; | |||
} | } | |||
CBOR diagnostic notation: true | CBOR diagnostic notation: true | |||
CBOR encoding: F5 | CBOR encoding: F5 | |||
6.6. The 'enumeration' Type | 6.6. The 'enumeration' Type | |||
skipping to change at page 31, line 17 ¶ | skipping to change at line 1341 ¶ | |||
Leafs of type enumeration MUST be encoded using a CBOR unsigned | Leafs of type enumeration MUST be encoded using a CBOR unsigned | |||
integer (major type 0) or CBOR negative integer (major type 1), | integer (major type 0) or CBOR negative integer (major type 1), | |||
depending on the actual value, or exceptionally as a tagged text | depending on the actual value, or exceptionally as a tagged text | |||
string (see below). Enumeration values are either explicitly | string (see below). Enumeration values are either explicitly | |||
assigned using the YANG statement 'value' or automatically assigned | assigned using the YANG statement 'value' or automatically assigned | |||
based on the algorithm defined in Section 9.6.4.2 of [RFC7950]. | based on the algorithm defined in Section 9.6.4.2 of [RFC7950]. | |||
The following example shows the encoding of an 'oper-status' leaf | The following example shows the encoding of an 'oper-status' leaf | |||
representation node instance set to 'testing'. | representation node instance set to 'testing'. | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
leaf oper-status { | leaf oper-status { | |||
type enumeration { | type enumeration { | |||
enum up { value 1; } | enum up { value 1; } | |||
enum down { value 2; } | enum down { value 2; } | |||
enum testing { value 3; } | enum testing { value 3; } | |||
enum unknown { value 4; } | enum unknown { value 4; } | |||
enum dormant { value 5; } | enum dormant { value 5; } | |||
enum not-present { value 6; } | enum not-present { value 6; } | |||
enum lower-layer-down { value 7; } | enum lower-layer-down { value 7; } | |||
skipping to change at page 31, line 39 ¶ | skipping to change at line 1363 ¶ | |||
} | } | |||
CBOR diagnostic notation: 3 | CBOR diagnostic notation: 3 | |||
CBOR encoding: 03 | CBOR encoding: 03 | |||
Values of 'enumeration' types defined in a 'union' type MUST be | Values of 'enumeration' types defined in a 'union' type MUST be | |||
encoded using a CBOR text string data item (major type 3) and MUST | encoded using a CBOR text string data item (major type 3) and MUST | |||
contain one of the names assigned by 'enum' statements in YANG (see | contain one of the names assigned by 'enum' statements in YANG (see | |||
also Section 6.12). The encoding MUST be enclosed by the enumeration | also Section 6.12). The encoding MUST be enclosed by the enumeration | |||
CBOR tag as specified in Section 9.3. | CBOR tag, as specified in Section 9.3. | |||
Definition example from [RFC7950]: | Definition example adapted from [RFC7950]: | |||
type union { | type union { | |||
type int32; | type int32; | |||
type enumeration { | type enumeration { | |||
enum unbounded; | enum unbounded; | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: 44("unbounded") | CBOR diagnostic notation: 44("unbounded") | |||
CBOR encoding: D8 2C 69 756E626F756E646564 | CBOR encoding: D8 2C 69 756E626F756E646564 | |||
6.7. The 'bits' Type | 6.7. The 'bits' Type | |||
Keeping in mind that bit positions are either explicitly assigned | Keeping in mind that bit positions are either explicitly assigned | |||
using the YANG statement 'position' or automatically assigned based | using the YANG statement 'position' or automatically assigned based | |||
on the algorithm defined in Section 9.7.4.2 of [RFC7950], each | on the algorithm defined in Section 9.7.4.2 of [RFC7950], each | |||
element of type bits could be seen as a set of bit positions (or | element of type bits could be seen as a set of bit positions (or | |||
offsets from position 0), that have a value of either 1, which | offsets from position 0) that have a value of either 1, which | |||
represents the bit being set or 0, which represents that the bit is | represents the bit being set, or 0, which represents that the bit is | |||
not set. | not set. | |||
Leafs of type bits MUST be encoded either using a CBOR array or byte | Leafs of type bits MUST be encoded either using a CBOR array (major | |||
string (major type 2), or exceptionally as a tagged text string (see | type 4) or byte string (major type 2) or exceptionally as a tagged | |||
below). In case CBOR array representation is used, each element is | text string (see below). In case CBOR array representation is used, | |||
either a positive integer (major type 0 with value 0 being | each element is either (1) a positive integer (major type 0 with | |||
disallowed) that can be used to calculate the offset of the next byte | value 0 being disallowed) that can be used to calculate the offset of | |||
string, or a byte string (major type 2) that carries the information | the next byte string or (2) a byte string (major type 2) that carries | |||
whether certain bits are set or not. The initial offset value is 0 | the information regarding whether certain bits are set or not. The | |||
and each unsigned integer modifies the offset value of the next byte | initial offset value is 0, and each unsigned integer modifies the | |||
string by the integer value multiplied by 8. For example, if the bit | offset value of the next byte string by the integer value multiplied | |||
offset is 0 and there is an integer with value 5, the first byte of | by 8. For example, if the bit offset is 0 and there is an integer | |||
the byte string that follows will represent bit positions 40 to 47 | with value 5, the first byte of the byte string that follows will | |||
both ends included. If the byte string has a second byte, it will | represent bit positions 40 to 47, with both ends included. If the | |||
carry information about bits 48 to 55 and so on. Within each byte, | byte string has a second byte, it will carry information about bits | |||
bits are assigned from least to most significant. After the byte | 48 to 55, and so on. Within each byte, bits are assigned from least | |||
string, the offset is modified by the number of bytes in the byte | to most significant. After the byte string, the offset is modified | |||
string multiplied by 8. Bytes with no bits set (zero bytes) at the | by the number of bytes in the byte string multiplied by 8. Bytes | |||
end of the byte string are never generated: If they would occur at | with no bits set (zero bytes) at the end of the byte string are never | |||
the end of the array, the zero bytes are simply omitted; if they | generated. If they occur at the end of the array, the zero bytes are | |||
occur at the end of a byte string preceding an integer, the zero | simply omitted; if they occur at the end of a byte string preceding | |||
bytes are removed and the integer adjusted upwards by the number of | an integer, the zero bytes are removed and the integer is adjusted | |||
zero bytes removed. An example follows. | upwards by the number of zero bytes that were removed. An example | |||
follows. | ||||
The following example shows the encoding of an 'alarm-state' leaf | The following example shows the encoding of an 'alarm-state' leaf | |||
representation node instance with the 'critical' (position 2), | representation node instance with the 'critical' (position 2), | |||
'warning' (position 8) and 'indeterminate' (position 128) flags set. | 'warning' (position 8), and 'indeterminate' (position 128) flags set. | |||
typedef alarm-state { | typedef alarm-state { | |||
type bits { | type bits { | |||
bit unknown; | bit unknown; | |||
bit under-repair; | bit under-repair; | |||
bit critical; | bit critical; | |||
bit major; | bit major; | |||
bit minor; | bit minor; | |||
bit warning { | bit warning { | |||
position 8; | position 8; | |||
skipping to change at page 33, line 29 ¶ | skipping to change at line 1439 ¶ | |||
} | } | |||
leaf alarm-state { | leaf alarm-state { | |||
type alarm-state; | type alarm-state; | |||
} | } | |||
CBOR diagnostic notation: [h'0401', 14, h'01'] | CBOR diagnostic notation: [h'0401', 14, h'01'] | |||
CBOR encoding: 83 42 0401 0E 41 01 | CBOR encoding: 83 42 0401 0E 41 01 | |||
In a number of cases the array would only need to have one element -- | In a number of cases, the array would only need to have one element | |||
a byte string with a few bytes inside. For this case, it is REQUIRED | -- a byte string with a few bytes inside. For this case, it is | |||
to omit the array element and have only the byte array that would | REQUIRED to omit the array element and have only the byte array that | |||
have been inside. To illustrate this, let us consider the same | would have been inside. To illustrate this, let us consider the same | |||
example YANG definition, but this time encoding only 'under-repair' | example YANG definition but this time encoding only 'under-repair' | |||
and 'critical' flags. The result would be | and 'critical' flags. The result would be | |||
CBOR diagnostic notation: h'06' | CBOR diagnostic notation: h'06' | |||
CBOR encoding: 41 06 | CBOR encoding: 41 06 | |||
Elements in the array MUST be either byte strings that do not end in | Elements in the array MUST be either byte strings that do not end in | |||
a zero byte, or positive unsigned integers, where byte strings and | a zero byte or positive unsigned integers, where byte strings and | |||
integers MUST alternate, i.e., adjacent byte strings or adjacent | integers MUST alternate, i.e., adjacent byte strings or adjacent | |||
integers are an error. An array with a single byte string MUST | integers are an error. An array with a single byte string MUST | |||
instead be encoded as just that byte string. An array with a single | instead be encoded as just that byte string. An array with a single | |||
positive integer is an error. Note that a recipient can handle | positive integer is an error. Note that a recipient can handle | |||
trailing zero bytes in the byte strings using the normal rules | trailing zero bytes in the byte strings using the normal rules | |||
without any issue, so an implementation MAY silently accept them. | without any issue, so an implementation MAY silently accept them. | |||
Values of 'bits' types defined in a 'union' type MUST be encoded | Values of 'bits' types defined in a 'union' type MUST be encoded | |||
using a CBOR text string data item (major type 3) and MUST contain a | using a CBOR text string data item (major type 3) and MUST contain a | |||
space-separated sequence of names of 'bits' that are set (see also | space-separated sequence of names of 'bits' that are set (see also | |||
Section 6.12). The encoding MUST be enclosed by the bits CBOR tag as | Section 6.12). The encoding MUST be enclosed by the bits CBOR tag, | |||
specified in Section 9.3. | as specified in Section 9.3. | |||
The following example shows the encoding of an 'alarm-state' leaf | The following example shows the encoding of an 'alarm-state' leaf | |||
representation node instance defined using a union type with the | representation node instance defined using a union type with the | |||
'under-repair' and 'critical' flags set. | 'under-repair' and 'critical' flags set. | |||
Definition example: | Definition example: | |||
leaf alarm-state-2 { | leaf alarm-state-2 { | |||
type union { | type union { | |||
type alarm-state; | type alarm-state; | |||
skipping to change at page 35, line 13 ¶ | skipping to change at line 1513 ¶ | |||
CBOR encoding: 50 1F1CE6A3F42660D888D92A4D8030476E | CBOR encoding: 50 1F1CE6A3F42660D888D92A4D8030476E | |||
6.9. The 'leafref' Type | 6.9. The 'leafref' Type | |||
Leafs of type leafref MUST be encoded using the rules of the | Leafs of type leafref MUST be encoded using the rules of the | |||
representation node referenced by the 'path' YANG statement. | representation node referenced by the 'path' YANG statement. | |||
The following example shows the encoding of an 'interface-state-ref' | The following example shows the encoding of an 'interface-state-ref' | |||
leaf representation node instance set to "eth1". | leaf representation node instance set to "eth1". | |||
Definition example from [RFC8343]: | Definition example adapted from [RFC8343]: | |||
typedef interface-state-ref { | typedef interface-state-ref { | |||
type leafref { | type leafref { | |||
path "/interfaces-state/interface/name"; | path "/interfaces-state/interface/name"; | |||
} | } | |||
} | } | |||
container interfaces-state { | container interfaces-state { | |||
list interface { | list interface { | |||
key "name"; | key "name"; | |||
skipping to change at page 35, line 40 ¶ | skipping to change at line 1540 ¶ | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: "eth1" | CBOR diagnostic notation: "eth1" | |||
CBOR encoding: 64 65746831 | CBOR encoding: 64 65746831 | |||
6.10. The 'identityref' Type | 6.10. The 'identityref' Type | |||
This specification supports two approaches for encoding identityref: | This specification supports two approaches for encoding identityref: | |||
as a YANG Schema Item iDentifier as defined in Section 3.2, or as a | as a YANG Schema Item iDentifier, as defined in Section 3.2, or as a | |||
name as defined in Section 6.8 of [RFC7951]. See Section 6.12 for an | name, as defined in Section 6.8 of [RFC7951]. See Section 6.12 for | |||
exceptional case when this representation needs to be tagged. | an exceptional case when this representation needs to be tagged. | |||
6.10.1. SIDs as identityref | 6.10.1. SIDs as 'identityref' | |||
When representation nodes of type identityref are implemented using | When representation nodes of type identityref are implemented using | |||
SIDs, they MUST be encoded using a CBOR unsigned integer data item | SIDs, they MUST be encoded using a CBOR unsigned integer data item | |||
(major type 0). (Note that, as they are not used in the position of | (major type 0). (Note that, as they are not used in the position of | |||
CBOR map keys, no delta mechanism is employed for SIDs used for | CBOR map keys, no delta mechanism is employed for SIDs used for | |||
identityref.) | identityref.) | |||
The following example shows the encoding of a 'type' leaf | The following example shows the encoding of a 'type' leaf | |||
representation node instance set to the value 'iana-if- | representation node instance set to the value 'iana-if- | |||
type:ethernetCsmacd' (SID 1880). | type:ethernetCsmacd' (SID 1880). | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
identity interface-type { | identity interface-type { | |||
} | } | |||
identity iana-interface-type { | identity iana-interface-type { | |||
base interface-type; | base interface-type; | |||
} | } | |||
identity ethernetCsmacd { | identity ethernetCsmacd { | |||
base iana-interface-type; | base iana-interface-type; | |||
skipping to change at page 36, line 31 ¶ | skipping to change at line 1579 ¶ | |||
leaf type { | leaf type { | |||
type identityref { | type identityref { | |||
base interface-type; | base interface-type; | |||
} | } | |||
} | } | |||
CBOR diagnostic notation: 1880 | CBOR diagnostic notation: 1880 | |||
CBOR encoding: 19 0758 | CBOR encoding: 19 0758 | |||
6.10.2. Name as identityref | 6.10.2. Name as 'identityref' | |||
Alternatively, an identityref MAY be encoded using a name as defined | Alternatively, an identityref MAY be encoded using a name, as defined | |||
in Section 3.3. When names are used, identityref MUST be encoded | in Section 3.3. When names are used, identityref MUST be encoded | |||
using a CBOR text string data item (major type 3). If the identity | using a CBOR text string data item (major type 3). If the identity | |||
is defined in different module than the leaf node containing the | is defined in a different module than the leaf node containing the | |||
identityref data node, the namespace qualified form MUST be used. | identityref data node, the namespace-qualified form MUST be used. | |||
Otherwise, both the simple and namespace qualified forms are | Otherwise, both the simple and namespace-qualified forms are | |||
permitted. Names and namespaces are defined in Section 3.3. | permitted. Names and namespaces are defined in Section 3.3. | |||
The following example shows the encoding of the identity 'iana-if- | The following example shows the encoding of the identity 'iana-if- | |||
type:ethernetCsmacd' using its namespace qualified name. This | type:ethernetCsmacd' using its namespace-qualified name. This | |||
example is described in Section 6.10.1. | example is described in Section 6.10.1. | |||
CBOR diagnostic notation: "iana-if-type:ethernetCsmacd" | CBOR diagnostic notation: "iana-if-type:ethernetCsmacd" | |||
CBOR encoding: 78 1b | CBOR encoding: 78 1B | |||
69616E612D69662D747970653A65746865726E657443736D616364 | 69616E612D69662D747970653A65746865726E657443736D616364 | |||
6.11. The 'empty' Type | 6.11. The 'empty' Type | |||
Leafs of type empty MUST be encoded using the CBOR null value (major | Leafs of type empty MUST be encoded using the CBOR null value (major | |||
type 7, additional information 22). | type 7, additional information 22). | |||
The following example shows the encoding of an 'is-router' leaf | The following example shows the encoding of an 'is-router' leaf | |||
representation node instance when present. | representation node instance when present. | |||
Definition example from [RFC8344]: | Definition example adapted from [RFC8344]: | |||
leaf is-router { | leaf is-router { | |||
type empty; | type empty; | |||
} | } | |||
CBOR diagnostic notation: null | CBOR diagnostic notation: null | |||
CBOR encoding: F6 | CBOR encoding: F6 | |||
6.12. The 'union' Type | 6.12. The 'union' Type | |||
skipping to change at page 37, line 40 ¶ | skipping to change at line 1633 ¶ | |||
* bits | * bits | |||
* enumeration | * enumeration | |||
* identityref | * identityref | |||
* instance-identifier | * instance-identifier | |||
See Section 9.3 for the assigned value of these CBOR tags. | See Section 9.3 for the assigned value of these CBOR tags. | |||
As mentioned in Section 6.6 and in Section 6.7, 'enumeration' and | As mentioned in Sections 6.6 and in 6.7, 'enumeration' and 'bits' are | |||
'bits' are encoded as a CBOR text string data item (major type 3) | encoded as a CBOR text string data item (major type 3) when defined | |||
when defined within a 'union' type. (This adds considerable | within a 'union' type. (This adds considerable complexity but is | |||
complexity, but is necessary because of an idiosyncrasy of the YANG | necessary because of an idiosyncrasy of the YANG data model for | |||
data model for unions; the workaround allows compatibility to be | unions; the work-around allows compatibility to be maintained with | |||
maintained with the encoding of overlapping unions in XML and JSON. | the encoding of overlapping unions in XML and JSON. See also | |||
See also Section 9.12 of [RFC7950].) | Section 9.12 of [RFC7950].) | |||
The following example shows the encoding of an 'ip-address' leaf | The following example shows the encoding of an 'ip-address' leaf | |||
representation node instance when set to "2001:db8:a0b:12f0::1". | representation node instance when set to "2001:db8:a0b:12f0::1". | |||
Definition example (adapted from [RFC6991]): | Definition example adapted from [RFC6991]: | |||
typedef ipv4-address { | typedef ipv4-address { | |||
type string { | type string { | |||
pattern | pattern | |||
'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' | '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' | |||
+ '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' | + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' | |||
+ '(%[\p{N}\p{L}]+)?'; | + '(%[\p{N}\p{L}]+)?'; | |||
} | } | |||
} | } | |||
skipping to change at page 38, line 45 ¶ | skipping to change at line 1686 ¶ | |||
type ip-address; | type ip-address; | |||
} | } | |||
CBOR diagnostic notation: "2001:db8:a0b:12f0::1" | CBOR diagnostic notation: "2001:db8:a0b:12f0::1" | |||
CBOR encoding: 74 323030313A6462383A6130623A313266303A3A31 | CBOR encoding: 74 323030313A6462383A6130623A313266303A3A31 | |||
6.13. The 'instance-identifier' Type | 6.13. The 'instance-identifier' Type | |||
This specification supports two approaches for encoding an instance- | This specification supports two approaches for encoding an instance- | |||
identifier, one based on YANG Schema Item iDentifier as defined in | identifier: one based on YANG Schema Item iDentifier, as defined in | |||
Section 3.2 and one based on names as defined in Section 3.3. See | Section 3.2, and one based on names, as defined in Section 3.3. See | |||
Section 6.12 for an exceptional case when this representation needs | Section 6.12 for an exceptional case when this representation needs | |||
to be tagged. | to be tagged. | |||
6.13.1. SIDs as instance-identifier | 6.13.1. SIDs as 'instance-identifier' | |||
SIDs uniquely identify a schema node. In the case of a single | SIDs uniquely identify a schema node. In the case of a single | |||
instance schema node, i.e., a schema node defined at the root of a | instance schema node, i.e., a schema node defined at the root of a | |||
YANG module or submodule or schema nodes defined within a container, | YANG module or submodule or schema nodes defined within a container, | |||
the SID is sufficient to identify this instance (representation | the SID is sufficient to identify this instance (representation | |||
node). (Note that no delta mechanism is employed for SIDs used for | node). (Note that no delta mechanism is employed for SIDs used for | |||
identityref, see Section 6.10.1.) | identityref, see Section 6.10.1.) | |||
In the case of a representation node that is an entry of a YANG list, | In the case of a representation node that is an entry of a YANG list, | |||
a SID is combined with the list key(s) to identify each instance | a SID is combined with the list key(s) to identify each instance | |||
within the YANG list(s). | within the YANG list(s). | |||
Instance identifiers of single instance schema nodes MUST be encoded | Instance-identifiers of single instance schema nodes MUST be encoded | |||
using a CBOR unsigned integer data item (major type 0) and set to the | using a CBOR unsigned integer data item (major type 0) and set to the | |||
targeted schema node SID. | targeted schema node SID. | |||
Instance identifiers of representation node entries of a YANG list | Instance-identifiers of representation node entries of a YANG list | |||
MUST be encoded using a CBOR array data item (major type 4) | MUST be encoded using a CBOR array data item (major type 4) | |||
containing the following entries: | containing the following entries: | |||
* The first entry MUST be encoded as a CBOR unsigned integer data | * The first entry MUST be encoded as a CBOR unsigned integer data | |||
item (major type 0) and set to the targeted schema node SID. | item (major type 0) and set to the targeted schema node SID. | |||
* The following entries MUST contain the value of each key required | * The following entries MUST contain the value of each key required | |||
to identify the instance of the targeted schema node. These keys | to identify the instance of the targeted schema node. These keys | |||
MUST be ordered as defined in the 'key' YANG statement, starting | MUST be ordered as defined in the 'key' YANG statement, starting | |||
from the top level list, and followed by each of the subordinate | from the top-level list, and followed by each subordinate list(s). | |||
list(s). | ||||
Examples within this section assume the definition of a schema node | Examples within this section assume the definition of a schema node | |||
of type 'instance-identifier': | of type 'instance-identifier': | |||
Definition example from [RFC7950]: | Definition example adapted from [RFC7950]: | |||
container system { | container system { | |||
... | ... | |||
leaf reporting-entity { | leaf reporting-entity { | |||
type instance-identifier; | type instance-identifier; | |||
} | } | |||
*First example:* | *First example:* | |||
The following example shows the encoding of the 'reporting-entity' | The following example shows the encoding of the 'reporting-entity' | |||
value referencing data node instance "/system/contact" (SID 1741). | value referencing data node instance "/system/contact" (SID 1741). | |||
Definition example from [RFC7317]: | Definition example adapted from [RFC7317]: | |||
container system { | container system { | |||
leaf contact { | leaf contact { | |||
type string; | type string; | |||
} | } | |||
leaf hostname { | leaf hostname { | |||
type inet:domain-name; | type inet:domain-name; | |||
} | } | |||
skipping to change at page 42, line 4 ¶ | skipping to change at line 1812 ¶ | |||
84 # array(4) | 84 # array(4) | |||
19 06C6 # unsigned(1734) | 19 06C6 # unsigned(1734) | |||
63 # text(3) | 63 # text(3) | |||
626F62 # "bob" | 626F62 # "bob" | |||
65 # text(5) | 65 # text(5) | |||
61646D696E # "admin" | 61646D696E # "admin" | |||
66 # text(6) | 66 # text(6) | |||
6672616E6365 # "france" | 6672616E6365 # "france" | |||
*Third example:* | *Third example:* | |||
The following example shows the encoding of the 'reporting-entity' | The following example shows the encoding of the 'reporting-entity' | |||
value referencing the list instance "/system/authentication/user" | value referencing the list instance "/system/authentication/user" | |||
(SID 1730) corresponding to username "jack". | (SID 1730), corresponding to username "jack". | |||
CBOR diagnostic notation: [1730, "jack"] | CBOR diagnostic notation: [1730, "jack"] | |||
CBOR encoding: | CBOR encoding: | |||
82 # array(2) | 82 # array(2) | |||
19 06C2 # unsigned(1730) | 19 06C2 # unsigned(1730) | |||
64 # text(4) | 64 # text(4) | |||
6A61636B # "jack" | 6A61636B # "jack" | |||
6.13.2. Names as instance-identifier | 6.13.2. Names as 'instance-identifier' | |||
An "instance-identifier" value is encoded as a text string that is | An 'instance-identifier' value is encoded as a text string that is | |||
analogous to the lexical representation in XML encoding; see | analogous to the lexical representation in XML encoding; see | |||
Section 9.13.2 of [RFC7950]. However, the encoding of namespaces in | Section 9.13.2 of [RFC7950]. However, the encoding of namespaces in | |||
instance-identifier values follows the rules stated in Section 3.3, | instance-identifier values follows the rules stated in Section 3.3, | |||
namely: | namely: | |||
* The leftmost (top-level) data node name is always in the namespace | * The leftmost (top-level) data node name is always in the | |||
qualified form. | namespace-qualified form. | |||
* Any subsequent data node name is in the namespace qualified form | * Any subsequent data node name is in the namespace-qualified form | |||
if the node is defined in a module other than its parent node, and | if the node is defined in a module other than its parent node; | |||
the simple form is used otherwise. This rule also holds for node | otherwise, the simple form is used. This rule also holds for node | |||
names appearing in predicates. | names appearing in predicates. | |||
For example, | For example, | |||
/ietf-interfaces:interfaces/interface[name='eth0']/ietf-ip:ipv4/ip | /ietf-interfaces:interfaces/interface[name='eth0']/ietf-ip:ipv4/ip | |||
is a valid instance-identifier value because the data nodes | is a valid instance-identifier value because the data nodes | |||
"interfaces", "interface", and "name" are defined in the module | "interfaces", "interface", and "name" are defined in the module | |||
"ietf-interfaces", whereas "ipv4" and "ip" are defined in "ietf-ip". | "ietf-interfaces", whereas "ipv4" and "ip" are defined in "ietf-ip". | |||
The resulting xpath MUST be encoded using a CBOR text string data | The resulting XML Path Language (XPath) MUST be encoded using a CBOR | |||
item (major type 3). | text string data item (major type 3). | |||
*First example:* | *First example:* | |||
This example is described in Section 6.13.1. | This example is described in Section 6.13.1. | |||
CBOR diagnostic notation: "/ietf-system:system/contact" | CBOR diagnostic notation: "/ietf-system:system/contact" | |||
CBOR encoding: | CBOR encoding: | |||
78 1c 2F696574662D73797374656D3A73797374656D2F636F6E74616374 | 78 1B 2F696574662D73797374656D3A73797374656D2F636F6E74616374 | |||
*Second example:* | *Second example:* | |||
This example is described in Section 6.13.1. | This example is described in Section 6.13.1. | |||
CBOR diagnostic notation (the line break is inserted for exposition | CBOR diagnostic notation (the line break is inserted for exposition | |||
only): | only): | |||
"/ietf-system:system/authentication/user[name='bob']/ | "/ietf-system:system/authentication/user[name='bob']/ | |||
authorized-key[name='admin'][country='france']/key-data" | authorized-key[name='admin'][country='france']/key-data" | |||
skipping to change at page 43, line 41 ¶ | skipping to change at line 1897 ¶ | |||
"/ietf-system:system/authentication/user[name='jack']" | "/ietf-system:system/authentication/user[name='jack']" | |||
CBOR encoding: | CBOR encoding: | |||
78 34 # text(52) | 78 34 # text(52) | |||
2F696574662D73797374656D3A73797374656D2F61757468656E74696361 | 2F696574662D73797374656D3A73797374656D2F61757468656E74696361 | |||
74696F6E2F757365725B6E616D653D276A61636B275D | 74696F6E2F757365725B6E616D653D276A61636B275D | |||
7. Content-Types | 7. Content-Types | |||
This specification defines the media-type application/yang-data+cbor, | This specification defines the media type application/yang-data+cbor, | |||
which can be used without parameters or with the id parameter set to | which can be used without parameters or with the id parameter set to | |||
either name or sid. | either name or sid. | |||
This media-type represents a YANG-CBOR document containing a | This media type represents a YANG-CBOR document containing a | |||
representation tree. If the media-type parameter id is present, | representation tree. If the media type parameter id is present, | |||
depending on its value, each representation node is identified by its | depending on its value, each representation node is identified by its | |||
associated namespace qualified name as defined in Section 3.3 | associated namespace-qualified name, as defined in Section 3.3 | |||
(id=name), or by its associated YANG SID (represented, e.g., in CBOR | (id=name), or by its associated YANG SID (represented, e.g., in CBOR | |||
map keys as a SID delta or via tag number 47) as defined in | map keys as a SID delta or via tag number 47), as defined in | |||
Section 3.2 (id=sid), respectively. If no id parameter is given, | Section 3.2 (id=sid), respectively. If no id parameter is given, | |||
both forms may be present. | both forms may be present. | |||
The format of an application/yang-data+cbor representation is that of | The format of an application/yang-data+cbor representation is that of | |||
a CBOR map, mapping names and/or SIDs (as defined above) into | a CBOR map, mapping names, and/or SIDs (as defined above) into | |||
instance values (using the rules defined in Section 4). | instance values (using the rules defined in Section 4). | |||
It is not foreseen at this point that the valid set of values for the | It is not foreseen at this point that the valid set of values for the | |||
id parameter will extend beyond name, sid, or being unset; if that | id parameter will extend beyond name, sid, or being unset; if that | |||
does happen, any new value is foreseen to be of the form | does happen, any new value is foreseen to be of the form | |||
[a-z][a-z0-9]*(-[a-z0-9]+)*. | [a-z][a-z0-9]*(-[a-z0-9]+)*. | |||
In summary, this document defines three content-types, which are | In summary, this document defines three content-types, which are | |||
intended for use by different classes of applications: | intended for use by different classes of applications: | |||
* application/yang-data+cbor; id=sid -- for use by applications that | * application/yang-data+cbor; id=sid -- for use by applications that | |||
need to be frugal with encoding space and text string processing | need to be frugal with encoding space and text string processing | |||
(e.g., applications running on constrained nodes [RFC7228], or | (e.g., applications running on constrained nodes [RFC7228] or | |||
applications with particular performance requirements); | applications with particular performance requirements); | |||
* application/yang-data+cbor; id=name -- for use by applications | * application/yang-data+cbor; id=name -- for use by applications | |||
that do not want to engage in SID management, and that have ample | that do not want to engage in SID management and that have ample | |||
resources to manage text-string based item identifiers (e.g., | resources to manage text-string-based item identifiers (e.g., | |||
applications that directly want to substitute application/ | applications that directly want to substitute application/ | |||
yang.data+json with a more efficient representation without any | yang.data+json with a more efficient representation without any | |||
other changes); | other changes); and | |||
* application/yang-data+cbor -- for use by more complex applications | * application/yang-data+cbor -- for use by more complex applications | |||
that can benefit from the increased efficiency of SID identifiers | that can benefit from the increased efficiency of SID identifiers | |||
but also need to integrate databases of YANG modules before SID | but also need to integrate databases of YANG modules before SID | |||
mappings are defined for them. | mappings are defined for them. | |||
All three content-types are based on the same representation | All three content-types are based on the same representation | |||
mechanisms, parts of which are simply not used in the first and | mechanisms, parts of which are simply not used in the first and | |||
second case. | second cases. | |||
How the use of one of these content types is selected in a transfer | How the use of one of these content-types is selected in a transfer | |||
protocol is outside the scope of this specification. The last | protocol is outside the scope of this specification. The last | |||
paragraph of Section 5.2 of [RFC8040] discusses how to indicate and | paragraph of Section 5.2 of [RFC8040] discusses how to indicate and | |||
request the usage of specific content-types in RESTCONF. Similar | request the usage of specific content-types in RESTCONF. Similar | |||
mechanisms are available in CoAP [RFC7252] using the Content-Format | mechanisms are available in the Constrained Application Protocol | |||
and Accept Options; [I-D.ietf-core-comi] demonstrates specifics on | (CoAP) [RFC7252] using the Content-Format and Accept Options; | |||
how Content-Format may be used to indicate the id=sid case. | [CORE-COMI] demonstrates specifics on how Content-Format may be used | |||
to indicate the id=sid case. | ||||
8. Security Considerations | 8. Security Considerations | |||
The security considerations of [RFC8949] and [RFC7950] apply. | The security considerations of [RFC8949] and [RFC7950] apply. | |||
This document defines an alternative encoding for data modeled in the | This document defines an alternative encoding for data modeled in the | |||
YANG data modeling language. As such, this encoding does not | YANG data modeling language. As such, this encoding does not | |||
contribute any new security issues in addition to those identified | contribute any new security issues in addition to those identified | |||
for the specific protocol or context for which it is used. | for the specific protocol or context for which it is used. | |||
To minimize security risks, software on the receiving side SHOULD | To minimize security risks, software on the receiving side SHOULD | |||
reject all messages that do not comply to the rules of this document | reject all messages that do not comply to the rules of this document | |||
and reply with an appropriate error message to the sender. | and reply with an appropriate error message to the sender. | |||
For instance, when the 'id' parameter to the media type is used, it | For instance, when the id parameter to the media type is used, it is | |||
is important to properly reject identifiers of the other type, to | important to properly reject identifiers of the other type to avoid | |||
avoid scenarios where different implementations interpret a given | scenarios where different implementations interpret a given content | |||
content in different ways. | in different ways. | |||
When SIDs are in use, the interpretation of encoded data not only | When SIDs are in use, the interpretation of encoded data not only | |||
relies on having the right YANG modules, but also on having the right | relies on having the right YANG modules but also on having the right | |||
SID mapping information. Management and evolution of that mapping | SID mapping information. Management and evolution of that mapping | |||
information therefore requires the same care as the management and | information therefore requires the same care as the management and | |||
evolution of the YANG modules themselves. The procedures in | evolution of the YANG modules themselves. The procedures in | |||
[I-D.ietf-core-sid] are being defined with this in mind. | [CORE-SID] are being defined with this in mind. | |||
9. IANA Considerations | 9. IANA Considerations | |||
9.1. Media-Types Registry | 9.1. Media Types Registry | |||
This document adds the following Media-Type to the "Media Types" | IANA has added the following media type to the "Media Types" registry | |||
registry. | [IANA.media-types]. | |||
+================+============================+===========+ | +================+============================+===========+ | |||
| Name | Template | Reference | | | Name | Template | Reference | | |||
+================+============================+===========+ | +================+============================+===========+ | |||
| yang-data+cbor | application/yang-data+cbor | RFC XXXX | | | yang-data+cbor | application/yang-data+cbor | RFC 9254 | | |||
+----------------+----------------------------+-----------+ | +----------------+----------------------------+-----------+ | |||
Table 2 | Table 2: Media Types Registry | |||
// RFC Ed.: please replace RFC XXXX with this RFC number and remove | ||||
this note. | ||||
Type name: application | Type name: application | |||
Subtype name: yang-data+cbor | Subtype name: yang-data+cbor | |||
Required parameters: N/A | Required parameters: N/A | |||
Optional parameters: id (see Section 7 of RFC XXXX) | ||||
Optional parameters: id (see Section 7 of RFC 9254) | ||||
Encoding considerations: binary (CBOR) | Encoding considerations: binary (CBOR) | |||
Security considerations: see Section 8 of RFC XXXX | ||||
Published specification: RFC XXXX | Security considerations: see Section 8 of RFC 9254 | |||
Interoperability considerations: N/A | ||||
Published specification: RFC 9254 | ||||
Applications that use this media type: applications that need a | ||||
concise and efficient representation of YANG-modeled data | ||||
Fragment identifier considerations: The syntax and semantics of | ||||
fragment identifiers specified for "application/yang-data+cbor" is | ||||
as specified for "application/cbor". (At publication of this | ||||
document, there is no fragment identification syntax defined for | ||||
"application/cbor".) | ||||
Additional information: | ||||
Magic number(s): N/A | ||||
File extension(s): N/A | ||||
Macintosh file type code(s): N/A | ||||
Person & email address to contact for further information: CORE WG | Person & email address to contact for further information: CORE WG | |||
mailing list (core@ietf.org), or IETF Applications and Real-Time | mailing list (core@ietf.org) or IETF Applications and Real-Time | |||
Area (art@ietf.org) | Area (art@ietf.org) | |||
Intended usage: COMMON | Intended usage: COMMON | |||
Restrictions on usage: none | ||||
Author/Change controller: IETF | ||||
9.2. CoAP Content-Formats Registry | Restrictions on usage: N/A | |||
This document adds the following Content-Format to the "CoAP Content- | Author: CoRE WG | |||
Formats", within the "Constrained RESTful Environments (CoRE) | ||||
Parameters" registry, where TBD3 comes from the "Expert Review" 0-255 | ||||
range and TBD1 and TBD2 come from the "IETF Review" 256-9999 range. | ||||
+============================+================+======+===========+ | Change controller: IETF | |||
| Content Type | Content Coding | ID | Reference | | ||||
+============================+================+======+===========+ | ||||
| application/yang-data+cbor | - | TBD1 | RFC XXXX | | ||||
+----------------------------+----------------+------+-----------+ | ||||
| application/yang- | - | TBD2 | RFC XXXX | | ||||
| data+cbor; id=name | | | | | ||||
+----------------------------+----------------+------+-----------+ | ||||
| application/yang- | - | TBD3 | RFC XXXX | | ||||
| data+cbor; id=sid | | | | | ||||
+----------------------------+----------------+------+-----------+ | ||||
Table 3 | 9.2. CoAP Content-Formats Registry | |||
// RFC Ed.: please replace TBDx with assigned IDs, remove the | IANA has added the following Content-Formats to the "CoAP | |||
requested ranges, and remove this note. | Content-Formats" subregistry, within the "Constrained RESTful | |||
// RFC Ed.: please replace RFC XXXX with this RFC number and remove | Environments (CoRE) Parameters" registry [IANA.core-parameters]. The | |||
this note. | registration procedure is "Expert Review" for the 0-255 range and | |||
"IETF Review" for the 256-9999 range. | ||||
+=====================================+==========+=====+===========+ | ||||
| Media Type | Encoding | ID | Reference | | ||||
+=====================================+==========+=====+===========+ | ||||
| application/yang-data+cbor | - | 340 | RFC 9254 | | ||||
+-------------------------------------+----------+-----+-----------+ | ||||
| application/yang-data+cbor; id=name | - | 341 | RFC 9254 | | ||||
+-------------------------------------+----------+-----+-----------+ | ||||
| application/yang-data+cbor; id=sid | - | 140 | RFC 9254 | | ||||
+-------------------------------------+----------+-----+-----------+ | ||||
Table 3: CoAP Content-Format Registry | ||||
9.3. CBOR Tags Registry | 9.3. CBOR Tags Registry | |||
In the registry "CBOR Tags" [IANA.cbor-tags], as per Section 9.2 of | IANA has allocated the following CBOR tag numbers in the "CBOR Tags" | |||
[RFC8949], IANA has allocated the CBOR tags in Table 4 for the YANG | registry [IANA.cbor-tags] defined in Section 9.2 of [RFC8949]. | |||
datatypes listed. | ||||
+=====+==================+============================+===========+ | +=====+==================+============================+===========+ | |||
| Tag | Data Item | Semantics | Reference | | | Tag | Data Item | Semantics | Reference | | |||
+=====+==================+============================+===========+ | +=====+==================+============================+===========+ | |||
| 43 | text string | YANG bits datatype; see | RFC XXXX | | | 43 | text string | YANG bits datatype; see | RFC 9254 | | |||
| | | Section 6.7 | | | | | | Section 6.7. | | | |||
+-----+------------------+----------------------------+-----------+ | +-----+------------------+----------------------------+-----------+ | |||
| 44 | text string | YANG enumeration datatype; | RFC XXXX | | | 44 | text string | YANG enumeration datatype; | RFC 9254 | | |||
| | | see Section 6.6. | | | | | | see Section 6.6. | | | |||
+-----+------------------+----------------------------+-----------+ | +-----+------------------+----------------------------+-----------+ | |||
| 45 | unsigned integer | YANG identityref datatype; | RFC XXXX | | | 45 | unsigned integer | YANG identityref datatype; | RFC 9254 | | |||
| | or text string | see Section 6.10. | | | | | or text string | see Section 6.10. | | | |||
+-----+------------------+----------------------------+-----------+ | +-----+------------------+----------------------------+-----------+ | |||
| 46 | unsigned integer | YANG instance-identifier | RFC XXXX | | | 46 | unsigned integer | YANG instance-identifier | RFC 9254 | | |||
| | or text string | datatype; see | | | | | or text string | datatype; see | | | |||
| | or array | Section 6.13. | | | | | or array | Section 6.13. | | | |||
+-----+------------------+----------------------------+-----------+ | +-----+------------------+----------------------------+-----------+ | |||
| 47 | unsigned integer | YANG Schema Item | RFC XXXX | | | 47 | unsigned integer | YANG Schema Item | RFC 9254 | | |||
| | | iDentifier (SID); see | | | | | | iDentifier (SID); see | | | |||
| | | Section 3.2. | | | | | | Section 3.2. | | | |||
+-----+------------------+----------------------------+-----------+ | +-----+------------------+----------------------------+-----------+ | |||
Table 4: CBOR tags defined by this specification | Table 4: CBOR Tags Registry | |||
// RFC Ed.: please replace RFC XXXX with RFC number and remove this | ||||
note | ||||
10. References | 10. References | |||
10.1. Normative References | 10.1. Normative References | |||
[IANA.cbor-tags] | [IANA.cbor-tags] | |||
IANA, "Concise Binary Object Representation (CBOR) Tags", | IANA, "Concise Binary Object Representation (CBOR) Tags", | |||
<https://www.iana.org/assignments/cbor-tags>. | <https://www.iana.org/assignments/cbor-tags>. | |||
[IANA.core-parameters] | ||||
IANA, "Constrained RESTful Environments (CoRE) | ||||
Parameters", | ||||
<https://www.iana.org/assignments/core-parameters/>. | ||||
[IANA.media-types] | ||||
IANA, "Media Types", | ||||
<https://www.iana.org/assignments/media-types/>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
<https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
skipping to change at page 48, line 39 ¶ | skipping to change at line 2150 ¶ | |||
Structure Extensions", RFC 8791, DOI 10.17487/RFC8791, | Structure Extensions", RFC 8791, DOI 10.17487/RFC8791, | |||
June 2020, <https://www.rfc-editor.org/info/rfc8791>. | June 2020, <https://www.rfc-editor.org/info/rfc8791>. | |||
[RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object | |||
Representation (CBOR)", STD 94, RFC 8949, | Representation (CBOR)", STD 94, RFC 8949, | |||
DOI 10.17487/RFC8949, December 2020, | DOI 10.17487/RFC8949, December 2020, | |||
<https://www.rfc-editor.org/info/rfc8949>. | <https://www.rfc-editor.org/info/rfc8949>. | |||
10.2. Informative References | 10.2. Informative References | |||
[I-D.ietf-core-comi] | [CORE-COMI] | |||
Veillette, M., Stok, P. V. D., Pelov, A., Bierman, A., and | Veillette, M., Ed., van der Stok, P., Ed., Pelov, A., | |||
I. Petrov, "CoAP Management Interface (CORECONF)", Work in | Bierman, A., and I. Petrov, Ed., "CoAP Management | |||
Progress, Internet-Draft, draft-ietf-core-comi-11, 17 | Interface (CORECONF)", Work in Progress, Internet-Draft, | |||
January 2021, <https://www.ietf.org/archive/id/draft-ietf- | draft-ietf-core-comi-11, 17 January 2021, | |||
core-comi-11.txt>. | <https://datatracker.ietf.org/doc/html/draft-ietf-core- | |||
comi-11>. | ||||
[I-D.ietf-core-sid] | [CORE-SID] Veillette, M., Ed., Pelov, A., Ed., Petrov, I., Ed., | |||
Veillette, M., Pelov, A., Petrov, I., Bormann, C., and M. | Bormann, C., and M. Richardson, "YANG Schema Item | |||
Richardson, "YANG Schema Item iDentifier (YANG SID)", Work | iDentifier (YANG SID)", Work in Progress, Internet-Draft, | |||
in Progress, Internet-Draft, draft-ietf-core-sid-18, 18 | draft-ietf-core-sid-18, 18 November 2021, | |||
November 2021, <https://www.ietf.org/archive/id/draft- | <https://datatracker.ietf.org/doc/html/draft-ietf-core- | |||
ietf-core-sid-18.txt>. | sid-18>. | |||
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | |||
and A. Bierman, Ed., "Network Configuration Protocol | and A. Bierman, Ed., "Network Configuration Protocol | |||
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | |||
<https://www.rfc-editor.org/info/rfc6241>. | <https://www.rfc-editor.org/info/rfc6241>. | |||
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | |||
RFC 6991, DOI 10.17487/RFC6991, July 2013, | RFC 6991, DOI 10.17487/RFC6991, July 2013, | |||
<https://www.rfc-editor.org/info/rfc6991>. | <https://www.rfc-editor.org/info/rfc6991>. | |||
skipping to change at page 49, line 38 ¶ | skipping to change at line 2198 ¶ | |||
[RFC8343] Bjorklund, M., "A YANG Data Model for Interface | [RFC8343] Bjorklund, M., "A YANG Data Model for Interface | |||
Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, | Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8343>. | <https://www.rfc-editor.org/info/rfc8343>. | |||
[RFC8344] Bjorklund, M., "A YANG Data Model for IP Management", | [RFC8344] Bjorklund, M., "A YANG Data Model for IP Management", | |||
RFC 8344, DOI 10.17487/RFC8344, March 2018, | RFC 8344, DOI 10.17487/RFC8344, March 2018, | |||
<https://www.rfc-editor.org/info/rfc8344>. | <https://www.rfc-editor.org/info/rfc8344>. | |||
Acknowledgments | Acknowledgments | |||
This document has been largely inspired by the extensive works done | This document has been largely inspired by the extensive work done by | |||
by Andy Bierman and Peter van der Stok on [I-D.ietf-core-comi]. | Andy Bierman and Peter van der Stok on [CORE-COMI]. [RFC7951] has | |||
[RFC7951] has also been a critical input to this work. The authors | also been a critical input to this work. The authors would like to | |||
would like to thank the authors and contributors to these two drafts. | thank the authors and contributors of these two documents. | |||
The authors would also like to acknowledge the review, feedback, and | The authors would also like to acknowledge the review, feedback, and | |||
comments from Ladislav Lhotka and Jürgen Schönwälder, and from the | comments from Ladislav Lhotka and Jürgen Schönwälder and from the | |||
document shepherd Marco Tiloca. Extensive comments helped us further | Document Shepherd Marco Tiloca. Extensive comments helped us further | |||
improve the document in the IESG review process; the authors would | improve the document in the IESG review process; the authors would | |||
like to call out specifically the feedback and guidance by the | like to call out specifically the feedback and guidance by the | |||
responsible AD Francesca Palombini and the significant improvements | responsible AD Francesca Palombini and the significant improvements | |||
suggested by IESG members Benjamin Kaduk and Rob Wilton. | suggested by IESG members Benjamin Kaduk and Rob Wilton. | |||
Authors' Addresses | Authors' Addresses | |||
Michel Veillette (editor) | Michel Veillette (editor) | |||
Trilliant Networks Inc. | Trilliant Networks Inc. | |||
610 Rue du Luxembourg | 610 Rue du Luxembourg | |||
Granby Quebec J2J 2V2 | Granby Quebec J2J 2V2 | |||
Canada | Canada | |||
Email: michel.veillette@trilliantinc.com | Email: michel.veillette@trilliantinc.com | |||
Ivaylo Petrov (editor) | Ivaylo Petrov (editor) | |||
Google Switzerland GmbH | Google Switzerland GmbH | |||
Brandschenkestrasse 110 | Brandschenkestrasse 110 | |||
CH-8002 Zurich | CH-8002 Zurich | |||
Switzerland | Switzerland | |||
Email: ivaylopetrov@google.com | Email: ivaylopetrov@google.com | |||
Alexander Pelov | Alexander Pelov | |||
Acklio | Acklio | |||
1137A avenue des Champs Blancs | 1137A avenue des Champs Blancs | |||
35510 Cesson-Sevigne | 35510 Cesson-Sevigne Cedex | |||
France | France | |||
Email: a@ackl.io | Email: a@ackl.io | |||
Carsten Bormann | Carsten Bormann | |||
Universität Bremen TZI | Universität Bremen TZI | |||
Postfach 330440 | Postfach 330440 | |||
D-28359 Bremen | D-28359 Bremen | |||
Germany | Germany | |||
Phone: +49-421-218-63921 | Phone: +49-421-218-63921 | |||
Email: cabo@tzi.org | Email: cabo@tzi.org | |||
End of changes. 178 change blocks. | ||||
405 lines changed or deleted | 450 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |