<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 3.0.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc strict="yes"?>
<?rfc compact="yes"?>

<rfc ipr="trust200902" docName="draft-toutain-t2t-sid-extension-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="SID Extension">SID Extension to efficiently manipulate YANG Data Models</title>

    <author initials="L." surname="Toutain" fullname="Laurent Toutain">
      <organization>Institut MINES TELECOM; IMT Atlantique</organization>
      <address>
        <postal>
          <street>2 rue de la Chataigneraie</street> <street>CS 17607</street>
          <city>35576 Cesson-Sevigne Cedex</city>
          <country>France</country>
        </postal>
        <email>Laurent.Toutain@imt-atlantique.fr</email>
      </address>
    </author>
    <author initials="M." surname="Gudi" fullname="Manoj Gudi">
      <organization>Institut MINES TELECOM; IMT Atlantique</organization>
      <address>
        <postal>
          <street>2 rue de la Chataigneraie</street> <street>CS 17607</street>
          <city>35576 Cesson-Sevigne Cedex</city>
          <country>France</country>
        </postal>
        <email>manoj.gudi@imt-atlantique.net</email>
      </address>
    </author>
    <author initials="J. A." surname="Fernandez" fullname="Javier A. Fernandez">
      <organization>Institut MINES TELECOM; IMT Atlantique</organization>
      <address>
        <postal>
          <street>2 rue de la Chataigneraie</street> <street>CS 17607</street>
          <city>35576 Cesson-Sevigne Cedex</city>
          <country>France</country>
        </postal>
        <email>javier-alejandro.fernandez@imt-atlantique.fr</email>
      </address>
    </author>

    <date year="2024" month="March" day="26"/>

    
    <workgroup>t2t Research Group</workgroup>
    

    <abstract>


<?line 53?>

<t>As the Internet of Things (IoT) systems are becoming more pervasive with their rapid adoption, they are also becoming more complex in their architecture. Hence, a tool is required to generate prototype code based on the YANG models for constrained devices <xref target="RFC7228"/>  to improve interoperability and increase the reusability of software components. A novel approach is introduced in this document to generate software prototypes (also called stubs) in the C language for the CORECONF protocol <xref target="I-D.ietf-core-comi"/> using YANG Schema Item iDentifiers (YANG SID <xref target="I-D.ietf-core-sid"/>). These stubs greatly reduce the complexity of navigating the CORECONF structure by abstracting the corresponding YANG SIDs. This document elaborates on the procedure to generate YANG SIDs for a given YANG model of a system, which then generates C stubs using the tools developed by the authors with the help of an example (sensor.yang file).</t>



    </abstract>



  </front>

  <middle>


<?line 57?>

<section anchor="introduction"><name>Introduction</name>

<t>The YANG modeling language is very popular for node configuration and retrieving the the state of a device.<br />
XML and JSON are also two popular formats to serialize data in conformance with the data model. Recently, a 
new serialization format has
been published, allowing a more compact representation of the information. This new format is based on CBOR
and the YANG identifier; instead of being represented by a unique ASCII string, values are mapped to an unique integer.</t>

<t>The mapping between strings and integer is kept in a .sid file usually generated by tools such as pyang.</t>

<t>This document presents some extensions to the sid files that allow to ease the conversion between CBOR and JSON, as well as 
manipulating YANG Data Models in a constraint environment.</t>

</section>
<section anchor="yang-data-model"><name>YANG Data model</name>

<t>YANG is a modeling language to structure information and check its conformity. Each element of a YANG Data Model
is identified through an unique identifier. YANG is based on a hierarchical approach. During the serialization phase, 
data is represented either in XML or JSON. In this document we will use the JSON representation. <xref target="RFC7951"/> indicates how to 
form a JSON structure conforming to a YANG Data Model:</t>

<t><list style="symbols">
  <t>Leaves are represented as JSON objects, the key being the leaf name.</t>
  <t>Lists are defined through arrays.</t>
  <t>Identityref is a string containing the identifier in the YANG naming hierarchy for an identity.</t>
</list></t>

<t>The YANG Data Model, in <xref target="Fig-YDM"/>, is used to illustrate how data will be serialized. It defines a container
representing a physical object able to perform several measurements. The physical object is battery powered, has a status LED able 
to change color, and a list of attached sensors returning an integer value.</t>

<figure title="Example of a YANG Data Model for sensors" anchor="Fig-YDM"><artwork><![CDATA[
<CODE BEGINS> file "sensor.yang"
module sensor {
  yang-version 1.1;
  namespace "http://sensorexample.in/sensor-example";
  prefix sen1;

  identity battery-indicator-base-type {
    description
      "a base identity for battery level indicator";
  }

  identity high-level {
    base battery-indicator-base-type;
  }

  identity med-level {
    base battery-indicator-base-type;
  }

  identity low-level {
    base battery-indicator-base-type;
  }

  typedef battery-level {
    type identityref {
      base battery-indicator-base-type;
    }
  }

  container sensorObject {
    leaf statusLED {
      type enumeration {
        enum green  {value 0;}
        enum yellow {value 1;}
        enum red {value 2;}
      }
    }
    leaf battery {
        type battery-level;
    }    
    list sensorReadings {
      key "index";
      leaf index {
        type uint8;
      }
      leaf sensorValue {
        type uint32;
      }

    }
  }
}
<CODE ENDS>
]]></artwork></figure>

<t>The YANG tree regarding this Data Model is given in <xref target="Fig-YANG-tree"/>. The tree displays the module hierarchy. For the module "sensor", a container "sensorObject" contains two leaves ("statusLED", "battery") and a list ("sensorReadings").</t>

<figure title="YANG tree associated to the DM." anchor="Fig-YANG-tree"><artwork><![CDATA[
$ pyang -f tree sensor.yang 
module: sensor
  +--rw sensorObject
     +--rw statusLED?        enumeration
     +--rw battery?          battery-level
     +--rw sensorReadings* [index]
        +--rw index          uint8
        +--rw sensorValue?   uint32
]]></artwork></figure>

</section>
<section anchor="json-serialization"><name>JSON serialization</name>

<t>An example of data, serialized with JSON, and conforming to the YANG Data Model, is given in <xref target="Fig-JSON"/>. Embedded JSON Objects allow 
to represent the hierarchy. The key of the outer JSON Object is composed of the module name and the container name. The embedded JSON Object associated to this  contains the leaves as keys. The YANG list is represented by an JSON Array.</t>

<figure title="JSON structure conform to the YANG DM." anchor="Fig-JSON"><artwork><![CDATA[
{
  "sensor:sensorObject": {
    "statusLED": "green",
    "battery": "sensor:med-level",
    "sensorReadings": [
      {
        "index": 0,
        "sensorValue": 42
      },
      {
        "index": 1,
        "sensorValue": 22
      }
    ]
  }
}
]]></artwork></figure>

</section>
<section anchor="cbor-serialization"><name>CBOR Serialization</name>

<t>JSON notation is verbose for constrained networks and objects. To optimize the size of the representation, <xref target="RFC9254"/> defines a CBOR serialization, also used in CORECONF. YANG ASCII identifiers are replaced by unique number. In JSON, the uniqueness is guaranteed by the "namespace" URI, as shown in <xref target="Fig-YDM"/>. By construction, the rest of the identifiers are unique.</t>

<t>In CORECONF, the uniqueness is guaranteed through the use of positive integers called SID, which replace the ASCII identifiers. <xref target="I-D.ietf-core-sid"/> defines the allocation process. Module developers may ask for a SID range from their authority. For example, for an IETF module, the IANA will allocate a SID range.</t>

<t>The <xref target="Fig-SID-Alloc"/> shows an example of this conversion. The range is arbitrarily fixed between 60000 and 60099. Note that the module, the identities, and the leaves have an assigned SID.</t>

<figure title="JSON structure conform to the YANG DM." anchor="Fig-SID-Alloc"><artwork><![CDATA[
$ pyang --sid-generate-file=60000:100 --sid-list sensor.yang 

SID        Assigned to
​---------  --------------------------------------------------
60000      module sensor
60001      identity battery-indicator-base-type
60002      identity high-level
60003      identity low-level
60004      identity med-level
60005      data /sensor:sensorObject
60006      data /sensor:sensorObject/battery
60007      data /sensor:sensorObject/sensorReadings
60008      data /sensor:sensorObject/sensorReadings/index
60009      data /sensor:sensorObject/sensorReadings/sensorValue
60010      data /sensor:sensorObject/statusLED

File sensor@unknown.sid created
Number of SIDs available : 100
Number of SIDs used : 11
]]></artwork></figure>

<t>To perform the allocation, the pyang utility generates a .sid file in the JSON format, resulting in a YANG Data Model specified in <xref target="I-D.ietf-core-sid"/>. The <xref target="Fig-SID-file"/> gives an excerpt.</t>

<figure title="JSON structure conform to the YANG DM." anchor="Fig-SID-file"><artwork><![CDATA[
{
  "assignment-range": [
    {
      "entry-point": 60000,
      "size": 100
    }
  ],
  "module-name": "sensor",
  "module-revision": "unknown",
  "item": [
    {
      "namespace": "module",
      "identifier": "sensor",
      "status": "unstable",
      "sid": 60000
    },
    {
      "namespace": "identity",
      "identifier": "battery-indicator-base-type",
      "status": "unstable",
      "sid": 60001
    },
    ...
]]></artwork></figure>

<t>The serialization in CBOR of the JSON example in <xref target="Fig-JSON"/> is given in <xref target="Fig-CBOR"/>. Compared to the compacted representation of the JSON structure (152 Bytes), the CORECONF structure is 24 bytes long. Although the size is different, the structure remains the same. It is composed of embedded CBOR Maps (equivalent of JSON Object). The first key is a SID (60005 corresponds to the container). Embedded CBOR Maps use a delta notation to encode the keys. The key 5 corresponds to SID 60005+5, thus to the leaf "statusLED". Key 2 in the second CBOR Map corresponds to the YANG list "sensorReadings", and the elements of the list are stored in a CBOR Array.</t>

<t>Note that in this example, the enum for "statusLED" (60005+5) is an integer and the identityref for "battery" (60005+1) is also an integer pointing to the  SID "med-level" (60004).</t>

<figure title="JSON structure conform to the YANG DM." anchor="Fig-CBOR"><artwork><![CDATA[
b'a119ea65a305000119ea640282a2010002182aa201010216'

Diagnostic notation:
{60005: 
  {5: 0, 
   1: 60004, 
   2: [
     {1: 0, 
      2: 42}, 
     {1: 1, 
      2: 22}
     ]
  }
}
]]></artwork></figure>

</section>
<section anchor="conversion-between-json-and-cbor"><name>Conversion between JSON and CBOR</name>

<t>Even if the conversion between CBOR and JSON formats might look obvious, including data compatible with a YANG Data Model is not so trivial.
The reason is that JSON uses ASCII identifiers for readability and CBOR prefers integers for compactness. The <xref target="Tab-types"/> summarizes some YANG types when coded in JSON (<xref target="RFC7951"/>) or CBOR (<xref target="RFC8949"/>).</t>

<texttable title="YANG basic types in JSON and CBOR." anchor="Tab-types">
      <ttcol align='left'>YANG</ttcol>
      <ttcol align='left'>JSON</ttcol>
      <ttcol align='left'>CBOR</ttcol>
      <c>int8, int16, int32, uint8, uint16, uint32</c>
      <c>number</c>
      <c>+int, -int</c>
      <c>int64, uint64</c>
      <c>string</c>
      <c>+int, -int</c>
      <c>decimal64</c>
      <c>string</c>
      <c>CBOR Tag 4</c>
      <c>binary</c>
      <c>base64</c>
      <c>byte array</c>
      <c>bits</c>
      <c>string</c>
      <c>array</c>
      <c>boolean</c>
      <c>boolean</c>
      <c>boolean</c>
      <c>identityref</c>
      <c>string</c>
      <c>+int</c>
      <c>enumeration</c>
      <c>string</c>
      <c>+int</c>
</texttable>

<t>The conversion from CBOR to JSON is not direct, since the YANG type needs to be considered. For instance, a integer could be converted into a number, an enum, or an identityref. Note that for union, the conversion is simple since some CBOR Tags may be used to indicate how the integer is converted, but outside of the union, for a single value, there is no such clue.</t>

<t>On the other direction, a JSON string may correspond to a 64-bit long number, an enumeration, or an identityref.</t>

<t>To perform the conversion, the YANG type is needed, but popular tools such as yanglint or pyang are not currently manipulating CBOR representation. Furthermore, these tools cannot run on constrained devices. To overcome these problems, we propose to extend the .sid file with more information. The modified pyang code (see https://github.com/ltn22/pyang/tree/sid-extension) adds useful information to the .sid file when the "--sid-extension" argument is provided.</t>

<t>This extension contains a "type" key in the JSON Object describing the mapping between the SID and the identifier if the node is a leaf (see <xref target="Fig-SID-extension"/>).</t>

<figure title="SID &quot;type" anchor="Fig-SID-extension"><artwork><![CDATA[
...
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject",
      "status": "unstable",
      "sid": 60005
    },
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject/battery",
      "status": "unstable",
      "sid": 60006,
      "type": "identityref"
    },
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject/sensorReadings",
      "status": "unstable",
      "sid": 60007
    },
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject/sensorReadings/index",
      "status": "unstable",
      "sid": 60008,
      "type": "uint8"
    },
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject/sensorReadings/sensorValue",
      "status": "unstable",
      "sid": 60009,
      "type": "uint32"
    },
    {
      "namespace": "data",
      "identifier": "/sensor:sensorObject/statusLED",
      "status": "unstable",
      "sid": 60010,
      "type": {
        "0": "green",
        "1": "yellow",
        "2": "red"
      }
    }
...
]]></artwork></figure>

<t>The "type" key added to leaf nodes contains several information:</t>

<t><list style="symbols">
  <t>when the "type" key is not present, the node is a not leaf and there is no need for type conversion.</t>
  <t>when the value of "type" is a string, it gives the YANG type of the leaf, as defined in the YANG Data Model. If the YANG type derives from an identityref, the value "identityref" is given instead of the YANG type specified in the module. In that case, in the CBOR notation, there is a pair "{ ...., SID1: value1, ...} in the CBOR Map. A first lookup at the .sid file for SID1 returns that the type is "identityref", a second lookup for value1 in the "identity" namespace, returns the ASCII identifier.</t>
  <t>when the value of "type" is a JSON Object, then the leaf is a YANG enumeration, and the CBOR Map gives the mapping between integer and strings.</t>
  <t>when the value of "type" is a JSON Array, then the YANG leaf is a union. Elements of the Array list the possible types. In that case, the conversion is leaded by the CBOR Tags associated to the value.</t>
</list></t>

<!-- Should be https://github.com/alex-fddz/pycoreconf, some bugs items => item and pb with self.name -->
<t>We developed the pycoreconf Python module to facilitate the conversion between JSON and CBOR (https://github.com/ltn22/pycoreconf). The <xref target="Fig-pcc-ex"/> gives an example of a Python script using this module. It takes as input the .sid file and a JSON structure. It transforms it into a CBOR structure, and back to JSON representation.</t>

<figure title="pycoreconf module." anchor="Fig-pcc-ex"><sourcecode type="python"><![CDATA[
# pycoreconf sample: "basic"
# This script demonstrates the basic usage of pycoreconf
#  using a simple YANG datamodel.

import pycoreconf
import binascii
import cbor2 as cbor

# Create the model object
ccm = pycoreconf.CORECONFModel("sensor@unknown.sid")

# Read JSON configuration file
config_file = "output.json"

with open(config_file, "r") as f:
    json_data = f.read()
print("Input JSON config data =\n", json_data, sep='')

# Convert configuration to CORECONF/CBOR
cbor_data = ccm.toCORECONF(config_file) # can also take json_data
print("Encoded CBOR data (CORECONF payload) =", binascii.hexlify(cbor_data))
print (cbor.loads(cbor_data))

# Decode CBOR data back to JSON configuration data
decoded_json = ccm.toJSON(cbor_data)
print("Decoded config data =", decoded_json)
]]></sourcecode></figure>

<t>The resulting JSON structure of <xref target="Fig-JSON"/> is given in <xref target="Fig-pcc-res"/>. It shows that the JSON format can be converted to CBOR and vice versa, just by using the extended .sid file.</t>

<figure title="pycoreconf module." anchor="Fig-pcc-res"><artwork><![CDATA[
Input JSON config data =
{
  "sensor:sensorObject": {
    "statusLED": "green",
    "battery": "sensor:med-level",
    "sensorReadings": [
      {
        "index": 0,
        "sensorValue": 42
      },
      {
        "index": 1,
        "sensorValue": 22
      } 
    ]
  }
}

Encoded CBOR data (CORECONF payload) = b'a119ea65a305000119ea640282a2010002182aa201010216'
{60005: {5: 0, 1: 60004, 2: [{1: 0, 2: 42}, {1: 1, 2: 22}]}}
Decoded config data = {"sensor:sensorObject": {"statusLED": "green", "battery": "med-level", "sensorReadings": [{"index": 0, "sensorValue": 42}, {"index": 1, "sensorValue": 22}]}}
]]></artwork></figure>

</section>
<section anchor="navigating-the-coreconf-structure"><name>Navigating the CORECONF structure.</name>

<t>As we saw, the CORECONF data  is structured as a tree. The <xref target="Fig-coreconf-ex"/> gives an example for the example module described in <xref target="Fig-YDM"/>. The numbers are the SID associated to the YANG Data Model. <xref target="I-D.ietf-core-comi"/> defines how queries are made on this structure to get the full tree or a sub tree.</t>

<figure title="pycoreconf module." anchor="Fig-coreconf-ex"><artwork><![CDATA[
                      sensorObject
                         60005
           battery     LED |    sensorReadings
                +----------+----------+
                |          |          |
              60006      60010      60007
                                      |
               +-----------+----------+-----------+ 
        index  |           |          |           |  sensorValue
        +---------+ +----------+ +----------+ +----------+     
        |         | |          | |          | |          |
        60008 60009 60008  60009 60008  60009 60008  60009                                 

]]></artwork></figure>

<t>Requesting the SID corresponding to the module (60005), will return the full tree. Requesting "battery" leaf (60006) will return the leaf and the associated value, while requesting "sensorReadings" (60007) will return the subtree with all its values. Going deeper in this sub-tree imposes the use of keys. For instance, to get a specific "sensorValue" one must provide the key "index" (60008).</t>

<t>In <xref target="I-D.ietf-core-comi"/>, the series of keys needed to reach a specific element is provided either in the query string or in the fetch. Only one list is provided in <xref target="Fig-coreconf-ex"/>, but several lists can be embedded, and each level may require one or more keys. So, to be processed, the YANG Data Model as to be known.</t>

<t>To avoid parsing the YANG Data Model on a constrained device, we propose to summarize this information into a JSON Object, generated by pyang with the "--sid-extension" argument.</t>

<figure title="pycoreconf module." anchor="Fig-key-mapping"><sourcecode type="json"><![CDATA[
  "key-mapping": {
    "60007" : 
        [60008]
  }
]]></sourcecode></figure>

<t>The "key-mapping" key points out to a JSON Object, where the JSON key is a SID corresponding to a YANG list key, and the value is a JSON array containing the SIDs acting as a YANG key for that YANG list. The "key-mapping" JSON Object indicates:</t>

<t><list style="symbols">
  <t>that a SID is a YANG list, since its value appears as a JSON key in the "key-mapping" structure.</t>
  <t>the number of elements in the corresponding array indicates how many items are involved as a YANG list key. The value for these items can be taken from the request.</t>
  <t>the array also indicates which SIDs contain the value that must be compared to the YANG list key sent in the request.</t>
</list></t>

<t>With the information contained in the "key-mapping" structure, it is possible to browse any CORECONF structure and return the appropriate requested SID.</t>

</section>
<section anchor="linking-to-real-values"><name>Linking to real values</name>

<t>In some YANG Data Models, as the one provided in <xref target="Fig-YDM"/>, some leaf nodes might encompass information that extends beyond the model's boundaries.
For example, the "statusLED" leaf may require an action to be triggered when a value is written onto it, or the managed device might need to interact with a physical sensor when the "sensorValue" leaf is queried.
On the other hand, certain leaf nodes, such as "index", do not require any interaction as their values are directly stored in the database.</t>

<t>We wrote a script taking the .sid file obtained from pyang with the "--sid-extension" argument to produce template C code for these functions. We try keep SID transparent and use the YANG identifiers as much as possible, which are easier to manipulate by a programmer.</t>

<t>The tool aims to generate aliases for identifiers that also include details about their associated SIDs. This eliminates the need for developers to recall or verify SIDs during software development.</t>

<t><list style="symbols">
  <t>The tool is hosted at https://github.com/manojgudi/ccoreconf/tree/stub_generation/tools</t>
  <t>For the SID file above (sensor@unknown.sid), the second argument in the command- <em>"sensor_prototypes"</em> instructs the tool to create two files <em>sensor_prototypes.h</em> and <em>sensor_prototypes.c</em> for writing headers and function code, respectively. To generate the C code, simply run the tool:</t>
</list></t>

<figure><sourcecode type="bash"><![CDATA[
$ python generateStubs.py sensor@unknown.sid "sensor_prototypes"
]]></sourcecode></figure>

<figure><sourcecode type="c"><![CDATA[
//Headers
//-----------
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <cbor.h>

#define  SID_BATTERY             60006
#define  SID_INDEX               60008
#define  SID_SENSORVALUE         60009
#define  SID_STATUSLED           60010


#define read_sensorObject        read_60005
#define read_battery             read_60006
#define read_sensorReadings      read_60007
#define read_sensorValue         read_60009
#define read_statusLED           read_60010

char* keyMapping = "\xa1\x19\xeag\x81\x19\xeah";
enum StatusledEnum {green = 0, yellow = 1, red = 2};

void  read_sensorObject(void);
char *  read_battery(void);
void  read_sensorReadings(uint8_t index);
uint32_t  read_sensorValue(uint8_t index);
enum StatusledEnum read_statusLED(void);
]]></sourcecode></figure>

<figure><sourcecode type="C"><![CDATA[
//Code File
//-----------
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "sensor_prototypes.h"

/*
    This is an autogenerated function associated to 
    SID: 60005
    Module: data 
    Identifier: /sensor:sensorObject
    function params: 
    Stable: false
*/
void  read_sensorObject(void){
    // Initialize the leaf if it has a return type with a default value;
    // Do something with the leaf
}

/*
    This is an autogenerated function associated to 
    SID: 60006
    Module: data 
    Identifier: /sensor:sensorObject/battery
    function params: 
    Stable: false
*/
char *  read_battery(void){
    // Initialize the leaf if it has a return type with a default value;
    char * batteryInstance  = NULL;

    // Do something with the leaf
    // Return the leaf
    return batteryInstance;
}

/*
    This is an autogenerated function associated to 
    SID: 60007
    Module: data
    Identifier: /sensor:sensorObject/sensorReadings
    function params: /sensor:sensorObject/sensorReadings/index
    Stable: false
*/
void  read_sensorReadings(uint8_t index){
    // Initialize the leaf if it has a return type with a default value;
    // Do something with the leaf
}

/*
    This is an autogenerated function associated to 
    SID: 60009
    Module: data 
    Identifier: /sensor:sensorObject/sensorReadings/sensorValue
    function params: /sensor:sensorObject/sensorReadings/index
    Stable: false
*/
uint32_t  read_sensorValue(uint8_t index){
    // Initialize the leaf if it has a return type with a default value;
    uint32_t sensorValueInstance  = 0;

    // Do something with the leaf
    // Return the leaf 
    return sensorValueInstance;
}

/*
    This is an autogenerated function associated to 
    SID: 60010
    Module: data 
    Identifier: /sensor:sensorObject/statusLED
    function params: 
    Stable: false
*/
enum StatusledEnum read_statusLED(void){
    // Initialize the leaf if it has a return type with a default value;
    enum StatusledEnum statusLEDInstance;

    // Do something with the leaf
    // Return the leaf 
    return statusLEDInstance;
}
]]></sourcecode></figure>

</section>
<section anchor="understanding-stubs"><name>Understanding Stubs</name>

<t>Let us take a quick look at the generated code snippet to understand how they help abstract SIDs from the developers:</t>

<t>The first part of the <em>sensor_prototypes.h</em> contains pre-processor directives which basically store the identifiers with their corresponding SID values for quick access. The second part contains function prototypes which can be implemented later. Note that there <strong>will not be</strong> any function prototype generated to read SID keys (in this case <em>index</em>, with SID 60008).</t>

<figure><sourcecode type="c"><![CDATA[
// Aliases of the leaves mapped to their corresponding SID
#define  SID_BATTERY             60006
#define  SID_INDEX               60008
#define  SID_SENSORVALUE         60009
#define  SID_STATUSLED           60010

// Aliases of function prototypes linked to their function name containing SID value for quick and easy access
#define read_sensorObject        read_60005
#define read_battery             read_60006
#define read_sensorReadings      read_60007
#define read_sensorValue         read_60009
#define read_statusLED           read_60010

// The relation between certain identifiers and their sid keys is stored in keyMapping as a CBOR map
char* keyMapping = "\xa1\x19\xeag\x81\x19\xeah";
enum StatusledEnum {green = 0, yellow = 1, red = 2};

// Function prototypes of the getters which can be implemented by the developer later in its corresponding C file
// The return types of the functions are mapped according to the type of the leaf. The getters for non-leaves are mapped as void
void  read_sensorObject(void);
char *  read_battery(void);
void  read_sensorReadings(uint8_t index);
uint32_t  read_sensorValue(uint8_t index);
enum StatusledEnum read_statusLED(void);
]]></sourcecode></figure>

<t>Now let us understand what is generated in <em>sid_prototypes.c</em> by looking at the auto-generated function prototype <em>read_sensorValue</em>. The program auto-infers that the leaf <em>sensorValue</em> can only be reached through a valid SID key (that is, index), so a function trying to read <em>sensorValue</em> from its CORECONF instance will require a parameter <em>index</em>. Also, since <em>sensorValue</em> has a well-defined type in C, the function will try to return that <em>uint32_t</em>.</t>

<t>The program also maps the <em>enum</em> type from SID to a corresponding <em>enum</em> type in C, as shown for the leaf <em>statusLED</em>. The value of these enums is as specified in the corresponding YANG model. If unspecified, the values are auto-assigned.</t>

<t>For rest of the non-leaf functions and leaf nodes with type <em>identityref</em>, the program infers it to be a <em>char *</em> (since the types are non-standard).</t>

<figure><sourcecode type="c"><![CDATA[
uint32_t  read_sensorValue(uint8_t index){
    // Initialize the leaf if it has a return type with a default value;
    uint32_t sensorValueInstance  = 0;

    // Do something with the leaf
    // Return the leaf 
    return sensorValueInstance;
}
]]></sourcecode></figure>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC7228">
  <front>
    <title>Terminology for Constrained-Node Networks</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="M. Ersue" initials="M." surname="Ersue"/>
    <author fullname="A. Keranen" initials="A." surname="Keranen"/>
    <date month="May" year="2014"/>
    <abstract>
      <t>The Internet Protocol Suite is increasingly used on small devices with severe constraints on power, memory, and processing resources, creating constrained-node networks. This document provides a number of basic terms that have been useful in the standardization work for constrained-node networks.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7228"/>
  <seriesInfo name="DOI" value="10.17487/RFC7228"/>
</reference>

<reference anchor="RFC7951">
  <front>
    <title>JSON Encoding of Data Modeled with YANG</title>
    <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
    <date month="August" year="2016"/>
    <abstract>
      <t>This document defines encoding rules for representing configuration data, state data, parameters of Remote Procedure Call (RPC) operations or actions, and notifications defined using YANG as JavaScript Object Notation (JSON) text.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7951"/>
  <seriesInfo name="DOI" value="10.17487/RFC7951"/>
</reference>

<reference anchor="RFC8949">
  <front>
    <title>Concise Binary Object Representation (CBOR)</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <date month="December" year="2020"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
      <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="94"/>
  <seriesInfo name="RFC" value="8949"/>
  <seriesInfo name="DOI" value="10.17487/RFC8949"/>
</reference>

<reference anchor="RFC9254">
  <front>
    <title>Encoding of Data Modeled with YANG in the Concise Binary Object Representation (CBOR)</title>
    <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
    <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
    <author fullname="A. Pelov" initials="A." surname="Pelov"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="M. Richardson" initials="M." surname="Richardson"/>
    <date month="July" year="2022"/>
    <abstract>
      <t>YANG (RFC 7950) is a data modeling language used to model configuration data, state data, parameters and results of Remote Procedure Call (RPC) operations or actions, and notifications.</t>
      <t>This document defines encoding rules for YANG in the Concise Binary Object Representation (CBOR) (RFC 8949).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9254"/>
  <seriesInfo name="DOI" value="10.17487/RFC9254"/>
</reference>


<reference anchor="I-D.ietf-core-sid">
   <front>
      <title>YANG Schema Item iDentifier (YANG SID)</title>
      <author fullname="Michel Veillette" initials="M." surname="Veillette">
         <organization>Trilliant Networks Inc.</organization>
      </author>
      <author fullname="Alexander Pelov" initials="A." surname="Pelov">
         <organization>IMT Atlantique</organization>
      </author>
      <author fullname="Ivaylo Petrov" initials="I." surname="Petrov">
         <organization>Google Switzerland GmbH</organization>
      </author>
      <author fullname="Carsten Bormann" initials="C." surname="Bormann">
         <organization>Universität Bremen TZI</organization>
      </author>
      <author fullname="Michael Richardson" initials="M." surname="Richardson">
         <organization>Sandelman Software Works</organization>
      </author>
      <date day="22" month="December" year="2023"/>
      <abstract>
	 <t>   YANG Schema Item iDentifiers (YANG SID) are globally unique 63-bit
   unsigned integers used to identify YANG items, as a more compact
   method to identify YANG items that can be used for efficiency and in
   constrained environments (RFC 7228).  This document defines the
   semantics, the registration, and assignment processes of YANG SIDs
   for IETF managed YANG modules.  To enable the implementation of these
   processes, this document also defines a file format used to persist
   and publish assigned YANG SIDs.


   // The present version (–24) is intended to address the remaining
   // IESG comments.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-core-sid-24"/>
   
</reference>


<reference anchor="I-D.ietf-core-comi">
   <front>
      <title>CoAP Management Interface (CORECONF)</title>
      <author fullname="Michel Veillette" initials="M." surname="Veillette">
         <organization>Trilliant Networks Inc.</organization>
      </author>
      <author fullname="Peter Van der Stok" initials="P." surname="Van der Stok">
         <organization>consultant</organization>
      </author>
      <author fullname="Alexander Pelov" initials="A." surname="Pelov">
         <organization>IMT Atlantique</organization>
      </author>
      <author fullname="Andy Bierman" initials="A." surname="Bierman">
         <organization>YumaWorks</organization>
      </author>
      <author fullname="Carsten Bormann" initials="C." surname="Bormann">
         <organization>Universität Bremen TZI</organization>
      </author>
      <date day="4" month="March" year="2024"/>
      <abstract>
	 <t>   This document describes a network management interface for
   constrained devices and networks, called CoAP Management Interface
   (CORECONF).  The Constrained Application Protocol (CoAP) is used to
   access datastore and data node resources specified in YANG, or SMIv2
   converted to YANG.  CORECONF uses the YANG to CBOR mapping and
   converts YANG identifier strings to numeric identifiers for payload
   size reduction.  CORECONF extends the set of YANG based protocols,
   NETCONF and RESTCONF, with the capability to manage constrained
   devices and networks.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-core-comi-17"/>
   
</reference>




    </references>




  </back>

<!-- ##markdown-source:
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

-->

</rfc>

