<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.21 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duffy-csmp-08" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="CoAP Simple Management Protocol">Cisco's CoAP Simple Management Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-duffy-csmp-08"/>
    <author initials="P." surname="Duffy (ed)" fullname="Paul Duffy">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>paduffy@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="December" day="12"/>
    <area>General</area>
    <workgroup>Independant Submission</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 51?>

<t>CoAP Simple Management Protocol (CSMP) is purpose-built to provide lifecycle management for resource constrained IoT devices deployed within large-scale, bandwidth constrained IoT networks. CSMP offers an efficient transport and message encoding supporting classic NMS functions such as device on-boarding, device configuration, device status reporting, securing the network, etc.</t>
      <t>This document describes the design and operation of CSMP.  This document does not represent an IETF consensus.</t>
    </abstract>
  </front>
  <middle>
    <?line 57?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Low Power Wide Area Network (LPWAN) technologies provide long range, low power connectivity for Internet of Things (IoT) applications.  LPWANs typically operate over distances of several kilometers with link bandwidths as low as 10s of Kbps. LPWAN devices are often compute, storage and power constrained (often optimized to operate for years on a single battery charge).</t>
      <t>This specification describes the design and operation of Cisco's CSMP which today is in-field managing approximately 25 million LPWAN devices deployed by a number of vendors. These devices are supporting a variety of critical infrastructure use cases for electric, water, and gas utilities along with a variety of smart cities use cases (municipal lighting, etc.).</t>
      <t>There is industry demand that CSMP managed devices be more quickly and widely available for an ever expanding set of use cases. This specification in intended to promote development of interoperable CSMP device and management system implementations. It is anticipated that this specification will be referenced by several industry fora.</t>
      <t>CSMP features include:</t>
      <ol spacing="normal" type="1"><li>
          <t>Onboarding.  Device startup registration and capabilities announcement with an NMS.</t>
        </li>
        <li>
          <t>Configuration management. Device acquisition of configuration from the NMS. Subsequent NMS configuration reads and updates to the device.</t>
        </li>
        <li>
          <t>Metrics reporting. Periodic device metrics reporting to the NMS. NMS on-demand metrics requests to a device.</t>
        </li>
        <li>
          <t>NMS commanded device operations. NMS command issuance to a single device or group of devices.</t>
        </li>
        <li>
          <t>Secure device firmware update.</t>
        </li>
      </ol>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="protocol-specification">
      <name>Protocol Specification</name>
      <t>CSMP is a usage profile of the Constrained Application Protocol <xref target="RFC7252"/>, which is designed for implementing RESTful messaging for resource constrained devices.  It is fair to view CoAP as a binary encoded functional subset of HTTP operating over UDP which also supports multicast messaging.  Resources (addressable objects) transported within CSMP message payloads are implemented using the Protocol Buffers compact binary encoding <xref target="PB"/>.</t>
      <t>It is assumed the reader is familiar with:</t>
      <ol spacing="normal" type="1"><li>
          <t>The basic concepts of RESTful architecture.</t>
        </li>
        <li>
          <t>The operation, message formats, and terminology of CoAP <xref target="RFC7252"/>.</t>
        </li>
        <li>
          <t>Protocol Buffers <xref target="PB"/>, which is used to describe and encode CSMP message payloads.</t>
        </li>
        <li>
          <t>OpenAPI <xref target="OPENAPI"/> is the interface definition language used to define CSMP Device and NMS interfaces.</t>
        </li>
      </ol>
      <section anchor="coap-usage-profile">
        <name>CoAP Usage Profile</name>
        <t>The NMS and devices communicate directly using CoAP. Acting as a CoAP client, a device issues RESTful requests to read or modify specific resources (objects) exposed by the NMS server.  Likewise, the device serves requests from the NMS to manipulate resources exposed by the device.</t>
        <t>CSMP specializes the usage of CoAP in the following ways:</t>
        <ol spacing="normal" type="1"><li>
            <t>CSMP does not use the Token capabilities described in <xref target="RFC7252"/>.  Request/response messaging MUST be implemented using the "synchronous" form of a CON request with response piggybacked in the subsequent ACK.  A client MUST elide the Token field from the request message.  The server SHOULD ignore the Token if received from a client request.</t>
          </li>
          <li>
            <t>Due to high latencies typical of LPWAN technologies, a client MUST NOT use the CoAP retransmission model when sending a CON message to a server. After sending a CON message, the client MUST accept a response from the server at any time up until the device sends its next CON message (containing a new CoAP Message ID).</t>
          </li>
        </ol>
      </section>
      <section anchor="interface-specification">
        <name>Interface Specification</name>
        <t>CSMP defines a CSMP Device interface and a CSMP NMS interface. Each of these interfaces defines a set of resources (objects), the addresses at which these resources exist (URLs), and the methods (GET, PUT, POST, DELETE) which may be used to manipulate the resources to implement device management operations. The CSMP Device and CSMP NMS interfaces are expressed using the OpenAPI interface definition language.</t>
        <t>OpenAPI's heritage is the expression of interfaces typically constructed with HTTP and JSON.  This document defines a few conventions required to express a CoAP interface in OpenAPI:</t>
        <ol spacing="normal" type="1"><li>
            <t>The generic RESTful verb designators GET, PUT, POST, and DELETE are used along with the text presentation of a resource's URL. This is done for developer readability.  An actual implementation must properly encode the CoAP message Code field along with the Uri-Host, Uri-Port, Uri-Path, and Uri-Query options as described in <xref target="RFC7252"/>.</t>
          </li>
          <li>
            <t>CoAP Response codes of the form X.YZ are expressed in the OpenAPI as XYZ (the actual response code  is scaled by 100 in the OpenAPI rendering).</t>
          </li>
          <li>
            <t>Placeholder objects are defined in OpenAPI to represent the Protocol Buffer binary objects which will be transported in CoAP messaging payloads.  The actual binary objects are defined in a separate Protocol Buffer file <xref target="csmpTlvs"/>.</t>
          </li>
          <li>
            <t>CoAP supports the NON messaging pattern.  OpenAPI syntax always requires a response be defined.  The CSMP interface definitions will note when a response is for a COAP NON request and not an actual CoAP response (no response is sent).</t>
          </li>
        </ol>
        <section anchor="csmpDev">
          <name>CSMP Device Interface</name>
          <t>A CSMP device MUST implement the interface described below.  The interface definition is also available at <xref target="CSMPDEV"/> which is directly importable into development tooling.</t>
          <t>Various forms of the GET method are used for retrieving registration information, device information, and monitoring information from the devices.  Various forms of the POST method are used to deliver configuration and commands to devices.   Usage of this interface is detailed in the sections which follow.</t>
          <artwork><![CDATA[
openapi: 3.0.0
info:
  description: |
    CSMP Device Interface.  RFC 2119 language is used to indicate 
    normative statements.
  version: 1.0.1
  title: CSMP Device Interface.
servers:
  #
  # Placeholder for the actual device-url
  #
  - url: 'https://CsmpDevice/1.0.1'
  
paths:
  /c:
    get:
      description: |
        Retrieve TlvIndex TLV or specific list of TLVs from a device.
      parameters:
      - $ref: '#/components/parameters/qOption'
      - $ref: '#/components/parameters/aOption'
      - $ref: '#/components/parameters/rOption'
      
      responses:
        '205':
          description: |
            Successful return of requested TLVs or TlvIndex. 
            Device MUST return the requested specific TLVs when 
            the "q" param is included (full tables are allowed). 
            Device MUST return only TlvIndex when the "q" param 
            is omitted.
          content:
            application/octet-stream:
              schema:
                oneOf:
                - $ref: 'https://TLVsGETFromDevice'
                - $ref: 'https://TlvIndex' 
        '400':
          description: Bad Request.
        '401':
          description: Unauthorized.
        '402':
          description: Bad option.
        '403':
          description: TLV not found, response won't fit in MTU.
        '404':
          description: Not found.          
        '405':
          description: Method not allowed.
          
    post:
      description: Process TLV updates from the NMS.  
        The q option MUST NOT be used. 
        A device MUST process the following TLVs (if present, in order)
        1. Signature - verify the message signature.
        2. SignatureValidity - verify if the signature is still valid. 
        3. GroupMatch - confirm device belongs indicated group.
        4. The TLVs to be updated.
      parameters:
      - $ref: '#/components/parameters/aOption'
      - $ref: '#/components/parameters/rOption'
      
      requestBody:
        description: One or more TLVs to be POSTed to the device.
        required: true
        content:
          application/octet-stream:
            schema:
              $ref: 'https://TLVsPOSTableToDevice'
      responses:
        '201':
          description: TLVs have been updated.
        '400':
          description: Bad Request.
        '401':
          description: Unauthorized.
        '402':
          description: Bad option.
        '403':
          description: Forbidden.
        '404':
          description: Not found.          
        '405':
          description: Method not allowed.
          
  /c/{tlvIdPath}:
    get:
      description: |
        Retrieve single TLV from a device.    
      parameters:
      - $ref: '#/components/parameters/tlvIdPath'
      - $ref: '#/components/parameters/aOption'
      - $ref: '#/components/parameters/rOption'

      responses:
        '205':
          description: Return the requested TLV.  Full table retreival 
            is allowed.
          content:
            application/octet-stream:
              schema:
                $ref: 'https://TLVsGETFromDevice'
        '400':
          description: Bad Request.
        '401':
          description: Unauthorized.
        '402':
          description: Bad option.
        '403':                
          description: TLV not found, response won't fit in MTU.          
        '404':
          description: Not found.          
        '405':
          description: Method not allowed.          
    #
    # Note that POST is not permitted on this URL.
    #
#
# Query parameters used for device requests.
#
components:  
  parameters:
    qOption:
      description: Q option for request to device for one or  
        more specific TLVs. When present in a request, the 
        response payload MUST contain the requested TLVs. 
        If a TLV does not exist on the device, it MUST NOT be 
        returned in the response and no error should be indicated.
      in: query
      name: q
      required: false
      schema:
        type: string
        description: Format is <tlvID1>+<tlvID2>+<tlvID3>+...  
    aOption:
      description: |
        A option. When omitted, the request MUST be CON. 
        When present, request MUST be NON and the device 
        MUST wait random interval from time of receipt up 
        to "a" seconds before responding with a NON POST 
        to <nms-url>/c. This form is often used with multicast
        requests to devices, but may also be used for unicast 
        requests to devices.
      in: query
      name: a
      required: false
      schema:
        type: integer
        description: The device will wait random interval from 
          receipt up to "a" seconds before sending.
    rOption:
      description: |
        R option MAY be used with the A option to indicate device 
        MUST respond with a NON POST to specified URL (overriding 
        <nms-url>/c).
      in: query
      name: r
      required: false
      schema:
        type: string    

    tlvIdPath:
      description: Path param specifying TLV ID.
      in: path
      name: tlvIdPath
      required: true 
      schema:
        type: integer
]]></artwork>
        </section>
        <section anchor="csmpNms">
          <name>CSMP NMS Interface</name>
          <t>A CSMP NMS MUST implement the interface described below.  The interface definition is also available at <xref target="CSMPNMS"/> which is directly importable into development tooling.</t>
          <t>Various forms of the POST method are used for device registration, device metrics reporting, and asynchronous GET responses (resulting from a request including the "a" option and default response URL). Usage of this interface is detailed in the sections which follow.</t>
          <artwork><![CDATA[
openapi: 3.0.0
info:
  description: CSMP NMS Interface. RFC 2119 language is used to 
    indicate normative statements. 
  version: 1.0.1
  title: CSMP NMS Interface

servers:
  #
  # Placeholder for the actual nms-url.
  #
  - url: 'https://CsmpNms/1.0.0'
  
paths:
  /r:
    post:
      description: Device registration POST to the NMS. 
        RequestBody MAY include any of the RegistrationRequest
        TLVs (see CsmpComponents). RequestBody MUST include 
        DeviceID and CurrentTime TLVs. POSTs to this address MUST 
        be CON (acknowledged).
      requestBody:
        required: true
        content:
          application/octet-stream:
            schema:
              $ref: 'https://RegistrationRequestTLVs'
      responses:
        '203':
          description: Successful registration response to device. 
            The response MAY include any of the RegistrationResponse 
            TLVs (see CsmpComponents).
          content:
            application/octet-stream:
              schema:
                $ref: 'https://RegistrationResponseTLVs'
        '403':
          description: Duplicate DeviceID was received or DeviceID
            was not recognized or authorized by the NMS.  
            There is no payload in this response.
        '404':
          description: Multiple Session IDs were found for the device.  
            There is no payload for this response.
  /c:
    post:
      description: Devices POST periodic metrics, command responses, 
        events, and asychronous GET responses to the NMS. A POST to 
        this address MUST be NON (non acknowledged... to avoid 
        excessive acknowledgement, 4.03 or 4.04 conditions are handled
        silently by the NMS). RequestBody MAY include any of 
        TLVsPOSTAbleToNms TLVs (see CsmpComponents).  The RequestBody 
        MUST include the CurrentTime and SessionID TLVs 
        (see CsmpComponents).  
      requestBody:
        required: true
        content:
          application/octet-stream:
            schema:
              $ref: 'https://TLVsPostAbleToNMS'
      responses:
        '100':
          description: There is no response to this (NON) request 
            (100 is used to indicate no response).
]]></artwork>
        </section>
        <section anchor="csmpComp">
          <name>CSMP Common Components.</name>
          <t>This section contains definitions common to both the CSMP Device and NMS interfaces. The definitions are also available at <xref target="CSMPCOMP"/> which is directly importable into development tooling.</t>
          <artwork><![CDATA[
# OpenAPI version identifier - required for OpenAPI 3.0 domains
openapi: 3.0.0

info:
  title: CSMP Components
  description: Common components for CSMP APIs
  version: '1.0'

components:
  schemas:
    TLVsGetAbleFromDevice:
      description: |
        TLVs which are GET-able from a <device-url>/c.
        Metrics and settings.
      anyOf:
      - $ref: '#/components/schemas/TlvIndex'
      - $ref: '#/components/schemas/HardwareDesc'
      - $ref: '#/components/schemas/InterfaceDesc'  
      - $ref: '#/components/schemas/ReportSubscribe'
      - $ref: '#/components/schemas/IPAddress'
      - $ref: '#/components/schemas/IPRoute'
      - $ref: '#/components/schemas/CurrentTime'
      - $ref: '#/components/schemas/RPLSettings' 
      - $ref: '#/components/schemas/Uptime'
      - $ref: '#/components/schemas/InterfaceMetrics'
      - $ref: '#/components/schemas/IPRouteRPLMetrics'  
      - $ref: '#/components/schemas/Ieee8021xStatus'
      - $ref: '#/components/schemas/Ieee80211iStatus'  
      - $ref: '#/components/schemas/WPANStatus'
      - $ref: '#/components/schemas/DHCP6ClientStatus'
      - $ref: '#/components/schemas/NMSSettings'
      - $ref: '#/components/schemas/NMSStatus'
      - $ref: '#/components/schemas/Ieee8021xSettings'
      - $ref: '#/components/schemas/Ieee802154BeaconStats'
      - $ref: '#/components/schemas/RPLInstance'
      - $ref: '#/components/schemas/FirmwareImageInfo'  
      - $ref: '#/components/schemas/SysResetStats'
      - $ref: '#/components/schemas/MplStats'
      - $ref: '#/components/schemas/RPLStats' 
      - $ref: '#/components/schemas/DHCP6Stats'
      - $ref: '#/components/schemas/EventReport'  
      - $ref: '#/components/schemas/EventIndex'
      - $ref: '#/components/schemas/EventSubscribe'
      - $ref: '#/components/schemas/EventStats'
      - $ref: '#/components/schemas/NetworkRole'  
      - $ref: '#/components/schemas/NetStat'

    RegistrationRequestTLVs:
      description: |
        TLVs which may be contained in a registration POST request 
        to the NMS.
      anyOf:
      - $ref: '#/components/schemas/DeviceID'
      - $ref: '#/components/schemas/CurrentTime'
              
      - $ref: '#/components/schemas/HardwareDesc'
      - $ref: '#/components/schemas/InterfaceDesc'
      - $ref: '#/components/schemas/IPAddress'
      - $ref: '#/components/schemas/NMSStatus'
      - $ref: '#/components/schemas/WPANStatus'
      - $ref: '#/components/schemas/RPLSettings'
                
      - $ref: '#/components/schemas/SessionID'
      - $ref: '#/components/schemas/GroupInfo'
      - $ref: '#/components/schemas/ReportSubscribe'

    RegistrationResponseTLVs:
      description: |
        TLVs which may be contained in a registration response from 
        the NMS.
      anyOf:
      - $ref: '#/components/schemas/SessionID'
      - $ref: '#/components/schemas/GroupAssign'
      - $ref: '#/components/schemas/ReportSubscribe'
      - $ref: '#/components/schemas/DescriptionRequest'
      - $ref: '#/components/schemas/NMSRedirectRequest'

    TLVsPostAbleToNMS:
      description: |
        TLVs which may be POSTed to <nms-url>/c
        There are several situations under which this can occur ...
        1. Periodic metrics reports from a device.
        2. Command responses from a device.
        3. Asynchronous events reported by a device.
        4. Asynchronous GET responses from a device.
      anyOf:
      - $ref: '#/components/schemas/TlvIndex'
      - $ref: '#/components/schemas/DeviceID'
      - $ref: '#/components/schemas/NMSRedirectRequest'
      - $ref: '#/components/schemas/SessionID'
      - $ref: '#/components/schemas/HardwareDesc'
      - $ref: '#/components/schemas/InterfaceDesc'
      - $ref: '#/components/schemas/ReportSubscribe'
      - $ref: '#/components/schemas/IPAddress'
      - $ref: '#/components/schemas/IPRoute'
      - $ref: '#/components/schemas/CurrentTime'
      - $ref: '#/components/schemas/RPLSettings'
      - $ref: '#/components/schemas/Uptime'
      - $ref: '#/components/schemas/InterfaceMetrics'
      - $ref: '#/components/schemas/IPRouteRPLMetrics'
      - $ref: '#/components/schemas/PingResponse'
      - $ref: '#/components/schemas/Ieee8021xStatus'
      - $ref: '#/components/schemas/Ieee80211iStatus'
      - $ref: '#/components/schemas/WPANStatus'
      - $ref: '#/components/schemas/DHCP6ClientStatus'
      - $ref: '#/components/schemas/NMSSettings'
      - $ref: '#/components/schemas/NMSStatus'
      - $ref: '#/components/schemas/Ieee8021xSettings'
      - $ref: '#/components/schemas/Ieee802154BeaconStats'
      - $ref: '#/components/schemas/RPLInstance'
      - $ref: '#/components/schemas/GroupInfo'
      - $ref: '#/components/schemas/LowpanMacStats'
      - $ref: '#/components/schemas/LowpanPhySettings'
      - $ref: '#/components/schemas/TransferResponse'
      - $ref: '#/components/schemas/LoadResponse'
      - $ref: '#/components/schemas/CancelLoadResponse'
      - $ref: '#/components/schemas/SetBackupResponse'
      - $ref: '#/components/schemas/FirmwareImageInfo'
      - $ref: '#/components/schemas/SysResetStats'
      - $ref: '#/components/schemas/MplStats'
      - $ref: '#/components/schemas/RPLStats'
      - $ref: '#/components/schemas/DHCP6Stats'
      - $ref: '#/components/schemas/EventReport'
      - $ref: '#/components/schemas/EventIndex'
      - $ref: '#/components/schemas/EventStats'

    TLVsPostAbleToDevice:
      description: |
        TLVs which may be POSTed to <device-url>/c.
        Commands and settings.
      anyOf:
      - $ref: '#/components/schemas/NMSRedirectRequest'
      - $ref: '#/components/schemas/RPLSettings'
      - $ref: '#/components/schemas/PingRequest'
      - $ref: '#/components/schemas/RebootRequest'
      - $ref: '#/components/schemas/NMSSettings'
      - $ref: '#/components/schemas/Ieee8021xSettings'
      - $ref: '#/components/schemas/GroupMatch'
      - $ref: '#/components/schemas/LowpanPhySettings'
      - $ref: '#/components/schemas/TransferRequest'
      - $ref: '#/components/schemas/ImageBlock'
      - $ref: '#/components/schemas/LoadRequest'
      - $ref: '#/components/schemas/CancelLoadRequest'
      - $ref: '#/components/schemas/SetBackupRequest'
      - $ref: '#/components/schemas/SignatureValidity'
      - $ref: '#/components/schemas/Signature'
      - $ref: '#/components/schemas/SignatureSettings'
      - $ref: '#/components/schemas/NetworkRole'
      - $ref: '#/components/schemas/MplReset'
      - $ref: '#/components/schemas/EventSubscribe'

    TableTLVs:
      description: |
        Table TLVs.
      anyOf:
      - $ref: '#/components/schemas/HardwareDesc'
      - $ref: '#/components/schemas/InterfaceDesc'
      - $ref: '#/components/schemas/IPAddress'
      - $ref: '#/components/schemas/IPRoute'
      - $ref: '#/components/schemas/InterfaceMetrics'
      - $ref: '#/components/schemas/IPRouteRPLMetrics'
      - $ref: '#/components/schemas/Ieee802154BeaconStats'
      - $ref: '#/components/schemas/RPLInstance'
      - $ref: '#/components/schemas/FirmwareImageInfo'
      - $ref: '#/components/schemas/NetStat'
      - $ref: '#/components/schemas/CertBundle'        

    AllTLVs:
      description: |
        All CSMP defined TLVs.
        This is used as an editorial starting point for the 
        other TLV collections defined within.
      anyOf:
      - $ref: '#/components/schemas/TlvIndex'
      - $ref: '#/components/schemas/DeviceID'
      - $ref: '#/components/schemas/NMSRedirectRequest'
      - $ref: '#/components/schemas/SessionID'
      - $ref: '#/components/schemas/DescriptionRequest'
      - $ref: '#/components/schemas/HardwareDesc'
      - $ref: '#/components/schemas/InterfaceDesc'
      - $ref: '#/components/schemas/ReportSubscribe'
      - $ref: '#/components/schemas/IPAddress'
      - $ref: '#/components/schemas/IPRoute'
      - $ref: '#/components/schemas/CurrentTime'
      - $ref: '#/components/schemas/RPLSettings'
      - $ref: '#/components/schemas/Uptime'
      - $ref: '#/components/schemas/InterfaceMetrics'
      - $ref: '#/components/schemas/IPRouteRPLMetrics'
      - $ref: '#/components/schemas/PingRequest'
      - $ref: '#/components/schemas/PingResponse'
      - $ref: '#/components/schemas/RebootRequest'
      - $ref: '#/components/schemas/Ieee8021xStatus'
      - $ref: '#/components/schemas/Ieee80211iStatus'
      - $ref: '#/components/schemas/WPANStatus'
      - $ref: '#/components/schemas/DHCP6ClientStatus'
      - $ref: '#/components/schemas/NMSSettings'
      - $ref: '#/components/schemas/NMSStatus'
      - $ref: '#/components/schemas/Ieee8021xSettings'
      - $ref: '#/components/schemas/Ieee802154BeaconStats'
      - $ref: '#/components/schemas/RPLInstance'
      - $ref: '#/components/schemas/GroupAssign'
      - $ref: '#/components/schemas/GroupEvict'
      - $ref: '#/components/schemas/GroupMatch'
      - $ref: '#/components/schemas/GroupInfo'
      - $ref: '#/components/schemas/LowpanMacStats'
      - $ref: '#/components/schemas/LowpanPhySettings'
      - $ref: '#/components/schemas/TransferRequest'
      - $ref: '#/components/schemas/ImageBlock'
      - $ref: '#/components/schemas/LoadRequest'
      - $ref: '#/components/schemas/CancelLoadRequest'
      - $ref: '#/components/schemas/SetBackupRequest'
      - $ref: '#/components/schemas/TransferResponse'
      - $ref: '#/components/schemas/LoadResponse'
      - $ref: '#/components/schemas/CancelLoadResponse'
      - $ref: '#/components/schemas/SetBackupResponse'
      - $ref: '#/components/schemas/FirmwareImageInfo'
      - $ref: '#/components/schemas/SignatureValidity'
      - $ref: '#/components/schemas/Signature'
      - $ref: '#/components/schemas/SignatureSettings'
      - $ref: '#/components/schemas/SysResetStats'
      - $ref: '#/components/schemas/NetStat'
      - $ref: '#/components/schemas/NetworkRole'
      - $ref: '#/components/schemas/CertBundle'      
      - $ref: '#/components/schemas/MplStats'
      - $ref: '#/components/schemas/MplReset'
      - $ref: '#/components/schemas/RPLStats'
      - $ref: '#/components/schemas/DHCP6Stats'
      - $ref: '#/components/schemas/EventReport'
      - $ref: '#/components/schemas/EventIndex'
      - $ref: '#/components/schemas/EventSubscribe'
      - $ref: '#/components/schemas/EventStats'
      
    #
    # Object (TLV) placeholders to allow OpenAPI to compile.
    # Each of these is authoritatively defined in
    # the CSMP TLV definitions.
    #
    TlvIndex:
      type: object
    DeviceID:
      type: object
    NMSRedirectRequest:
      type: object
    SessionID:
      type: object
    DescriptionRequest:
      type: object
    HardwareDesc:
      type: object
    InterfaceDesc:
      type: object
    ReportSubscribe:
      type: object
    IPAddress:
      type: object
    IPRoute:
      type: object
    CurrentTime:
      type: object
    RPLSettings:
      type: object
    Uptime:
      type: object
    InterfaceMetrics:
      type: object
    IPRouteRPLMetrics:
      type: object
    PingRequest:
      type: object
    PingResponse:
      type: object
    RebootRequest:
      type: object
    Ieee8021xStatus:
      type: object
    Ieee80211iStatus:
      type: object
    WPANStatus:
      type: object
    DHCP6ClientStatus:
      type: object
    NMSSettings:
      type: object
    NMSStatus:
      type: object
    Ieee8021xSettings:
      type: object
    Ieee802154BeaconStats:
      type: object
    RPLInstance:
      type: object
    GroupAssign:
      type: object
    GroupEvict:
      type: object
    GroupMatch:
      type: object
    GroupInfo:
      type: object
    LowpanMacStats:
      type: object
    LowpanPhySettings:
      type: object
    TransferRequest:
      type: object
    ImageBlock:
      type: object
    LoadRequest:
      type: object
    CancelLoadRequest:
      type: object
    SetBackupRequest:
      type: object
    TransferResponse:
      type: object
    LoadResponse:
      type: object
    CancelLoadResponse:
      type: object
    SetBackupResponse:
      type: object
    FirmwareImageInfo:
      type: object
    SignatureValidity:
      type: object
    Signature:
      type: object
    SignatureSettings:
      type: object
    SysResetStats:
      type: object
    NetStat:
      type: object
    NetworkRole:
      type: object
    CertBundle:
      type: object
    MplStats:
      type: object
    MplReset:
      type: object
    RPLStats:
      type: object
    DHCP6Stats:
      type: object
    EventReport:
      type: object
    EventIndex:
      type: object
    EventSubscribe:
      type: object
    EventStats:
      type: object
]]></artwork>
        </section>
      </section>
      <section anchor="resources">
        <name>Resources</name>
        <t>CSMP devices and CSMP NMS use the CoAP GET, POST, and DELETE methods to manipulate the resources specified in <xref target="csmpTlvs"/>, which are the Protocol Buffer object payloads contained in the various CoAP requests and responses.  Usage of these payloads is detailed in the sections which follow.</t>
        <section anchor="base-url">
          <name>Base URL</name>
          <t>A CSMP server is located at a &lt;base-url&gt; of the form coap://hostname:port/&lt;base-path&gt;</t>
          <t>The &lt;base-path&gt; for all CSMP resources at a particular hostname:port MUST be identical.</t>
          <t>It is RECOMMENDED that a default &lt;base-path&gt; of "/." be used.</t>
          <t>Because an NMS CSMP request message may be multicast to a large number of devices, all CSMP devices within a multicast domain MUST have identical port and &lt;base-path&gt;.</t>
          <t>The following &lt;base-path&gt; are reserved for future use:</t>
          <ol spacing="normal" type="1"><li>
              <t>/o</t>
            </li>
          </ol>
          <t>Full details of the Device and NMS service URLs are defined in <xref target="csmpDev"/> and <xref target="csmpNms"/>.</t>
        </section>
        <section anchor="resource-encoding">
          <name>Resource Encoding</name>
          <t>The message payloads of CSMP requests and responses MUST be formatted as a sequence of Type-Length-Value objects.</t>
          <section anchor="standard-tlvs">
            <name>Standard TLVs</name>
            <t>Standard TLVs have the following format:</t>
            <artwork><![CDATA[
| Type | Length | Value |
]]></artwork>
            <t>The Type field is an unsigned integer identifying a specific CSMP TLV ID and MUST be encoded as a Protocol Buffers varint.</t>
            <t>The Length field is an unsigned integer containing the number of octets occupied by the Value field.  The Length field MUST be encoded as a Protocol Buffers varint.</t>
            <t>The Value field MUST contain the Protocol Buffers encoded TLV corresponding to the indicated Type.</t>
            <t>The set of objects defined by CSMP and their Type (TLV ID) are specified in <xref target="csmpTlvs"/>.</t>
          </section>
          <section anchor="vendor-defined-tlv">
            <name>Vendor Defined TLV</name>
            <t>The Vendor Defined TLV follows the same format as a Standard TLV with the following important extensions:</t>
            <t>The Type field MUST be set to 127.</t>
            <t>The Value field contains one or more SubTLVs of the format</t>
            <artwork><![CDATA[
| SubType | Length | Value|
]]></artwork>
            <t>The SubType field is an unsigned integer containing a vendor defined TLV ID and MUST be encoded as a Protocol Buffers varint.  The SubTypes 0 through 15 (inclusive) are reserved for use by this specification.  SubTypes 16 onward are available for vendor defined usage.</t>
            <t>The Length field is an unsigned integer containing the number of octets occupied by the Value field of the SubTLV.  The Length field MUST be encoded as a Protocol Buffers varint.</t>
            <t>The Value field MUST contain the Protocol Buffer encoded SubTLV value defined by the vendor.</t>
            <t>SubType 1 is reserved by this specification to indicate Vendor Private Enterprise Number (PEN).  SubType 1 MUST be the first SubTLV present in the TLV.  The corresponding Value field MUST be set to the vendor's PEN.</t>
            <t>Registration Procedures for Private Enterprise Numbers are described in <xref target="PEN"/>.</t>
          </section>
          <section anchor="csmpTlvs">
            <name>CSMP TLV Definitions</name>
            <t>This section contains the CSMP TLV definitions (defined using <xref target="PB"/>). The definitions are also available at <xref target="CSMPMSG"/> which is directly importable into development tooling.</t>
            <artwork><![CDATA[
syntax = "proto3";

/*
The definitions for CSMP TLVs.
This file is directly consumable by the Protocol Buffer tool chain.
Requirements are specified using the terminology and conventions as 
referenced in [RFC2119]. Requirements key words referenced in [RFC2119] 
must be capitalized. Full details re: Protocol Buffers are accessible 
at https://developers.google.com/protocol-buffers
*/

/*
CSMP TLV ID Mapping to Protocol Buffer messages.

A unique TLV ID MUST be assigned to each CSMP Protocol Buffer 
message (defined within).  An unused TLV ID MAY be assigned to a new 
message (the new TLV ID assignment MUST be recorded within, along with 
the defintion of the new message). A Reserved TLV ID MUST NOT be 
assigned to a message. An existing TLV ID assignment MUST NOT be 
re-assigned to a new message.

NOTE the legend.

- Unused: available for assignment.
- Reserved: not available for assignment.
- All other named messages are currently used by CSMP.

All TLV assignments MUST be recorded in the table below.  
Take care to maintain the numbering.

TLVID   Message
1       TlvIndex
2       DeviceID
3       Reserved
4       Unused
5       Unused
6       NMSRedirectRequest
7       SessionID
8       DescriptionRequest
9       Unused
10          Reserved
11          HardwareDesc
12          InterfaceDesc
13          ReportSubscribe
14          Reserved
15          Reserved
16          IPAddress
17          IPRoute
18          CurrentTime
19          Reserved
20          Reserved
21          RPLSettings
22          Uptime
23          InterfaceMetrics
24          Reserved
25          IPRouteRPLMetrics
26          Unused
27-29   Reserved
30          PingRequest
31          PingResponse
32          RebootRequest
33          Ieee8021xStatus
34          Ieee80211iStatus
35          WPANStatus
36          DHCP6ClientStatus
37-41   Reserved
42          NMSSettings
43          NMSStatus
44-46   Reserved
47          Ieee8021xSettings
48          Ieee802154BeaconStats
49-52   Reserved
53          RPLInstance
54          Reserved
55          GroupAssign
56          GroupEvict
57          GroupMatch
58          GroupInfo
59      Unused
60      Unused
61          Reserved
62          LowpanMacStats
63          LowpanPhySettings
64      Unused
65          TransferRequest
66          Reserved
67          ImageBlock
68          LoadRequest
69          CancelLoadRequest
70          SetBackupRequest
71          TransferResponse
72          LoadResponse
73          CancelLoadResponse
74          SetBackupResponse
75          FirmwareImageInfo
76          SignatureValidity
77          Signature
78          Reserved
79          SignatureSettings
80          Reserved
81          Reserved
82      Unused
83      Unused
84          Reserved
85      Unused
86          SysResetStats
87      Unused
88          Reserved
89      Unused
90      Unused
91-97   Reserved
98      Unused
99      Unused
100         Reserved
101     Unused
102     Unused
103     Unused
104     Unused
105     Unused
106     Unused
107         Reserved
108         Reserved
109     Unused
110-112 Reserved
113     Unused
114     Unused
115-117 Reserved
118     Unused
119     Unused
120-122 Reserved
123     Unused
124         NetStat
125         Reserved
126         Reserved
127     Vendor Defined TLV
128-131 Reserved
132-139 Unused
140         Reserved
141         NetworkRole
142-151 Reserved
152-154 Unused
155-157 Reserved
158-159 Unused
160-165 Reserved
166-169 Unused
170-171 Reserved
172     CertBundle
173-179 Unused
180     Reserved
181-199 Unused
200-202 Reserved
203-209 Unused
210         Reserved
211         Reserved
212-216 Unused
217-220 Reserved
221-239 Unused
240         Reserved
241         MplStats
242         MplReset
243-299 Unused
301-303 Reserved
304     Unused
305-307 Reserved
308-309 Unused
310-312 Reserved
313         RPLStats
314         DHCP6Stats
315     Reserved
316     Reserved
317-324 Unused
325-337 Reserved
338-339 Unused
340-399 Reserved
400-499 Unused
500         Reserved
501         Reserved
502         Reserved
503-509 Unused
510         Reserved
511     Reserved
512-519 Unused
520         Reserved
521         Reserved
522-529 Unused
530     Reserved
531     Reserved
532-539 Unused
540         Reserved
541-599 Unused
600-607 Reserved
608 ... Unused

*/

/*
Message definitions follow.

Tag notation used within ...

Class:: designates class of device for which the TLV is relevant. 
    Generic (any IP addressable device) 
    Mesh (Wi-SUN mesh devices)
    Others TBD.
*/

package csmp.tlvs;
option java_package = "com.cisco.cgms.protocols.csmp.tlvs";

// TLV 1
// A list of zero or more TLV IDs
// Class:: Generic
//

message TlvIndex {
  // list of TLV IDs (string encoded) supported by the device.
  repeated string tlvid = 1;    
}

// TLV 2
// Primary identifier for a specific device.
// Class:: Generic
//

message DeviceID {
  oneof type_present {
    // Set to 1 to indicate EUI-64 format.
    uint32 type = 1; 
  }
  oneof id_present {
    // The unique identifier of the device in EUI-64 format
    string id = 2; 
  }
}

// TLV 6
// Used by NMS to force device registration to a specific NMS.
// Class:: Generic
//

message NMSRedirectRequest {
  oneof url_present {
    // NMS <base-url> to which the device registration will be directed.  
    // MUST be formatted per section 6 of RFC 7252
    string url = 1;
  }
  oneof immediate_present {
    // True == device should immediately send registration request 
    // to the specificed NMS url.
    bool immediate = 2;  
  }
}

// TLV 7
// Session ID used by NMS to track device CSMP messaging.
// Assigned by the NMS, used in all subsequent Device to NMS messaging.
// Class:: Generic
//

message SessionID {
  oneof id_present {
    string id = 1; // session ID
  }
}

// TLV 8
// List of zero or more TLVs requested by the NMS from a Device.
// The requested TLV values will be sent to the NMS asynchronously.
// Class:: Generic
//

message DescriptionRequest {
  // list of TLV IDs in string format.
  repeated string tlvid = 1;    
}

// A list of hardware modules with their firmware versions.
//
message HardwareModule {
  oneof moduleType_present {
    // hardware module type. Rf Dsp=1, PLC Dsp=2, CPU=3, FPGA=4
    uint32 moduleType = 1; 
  }
  oneof firmwareRev_present {
    // firmware version of the hardware module
    string firmwareRev = 2; 
  }
}

// TLV 11
// This TLV contains hardware description information for the device.
// The contents of the fields are defined by the equivalently-named 
// fields in the entry of the SNMP MIB object entPhysicalTable.
// Class:: Generic
//

message HardwareDesc {
  oneof entPhysicalIndex_present {
    // index of this hardware being described.
    int32 entPhysicalIndex = 1; 
  }
  oneof entPhysicalDescr_present {
    // A textual description of physical entity.
    string entPhysicalDescr = 2; 
  }
  oneof entPhysicalVendorType_present {
    // An indication of the vendor-specific hardware type of the 
    // physical entity.
    bytes entPhysicalVendorType = 3; 
  }
  oneof entPhysicalContainedIn_present {
    // The value of entPhysicalIndex for the physical entity which 
    // 'contains' this physical entity.
    int32 entPhysicalContainedIn = 4;  
  }
  oneof entPhysicalClass_present {
    // An indication of the general hardware type of the physical 
    // entity.
    int32 entPhysicalClass = 5; 
  }
  oneof entPhysicalParentRelPos_present {
    // An indication of the relative position of this 'child' component 
    // among all its 'sibling' components.
    int32 entPhysicalParentRelPos = 6; 
  }
  oneof entPhysicalName_present {
    // The textual name of the physical entity.
    string entPhysicalName = 7; 
  }
  oneof entPhysicalHardwareRev_present {
    // The vendor-specific hardware revision string for the physical 
    // entity.
    string entPhysicalHardwareRev = 8; 
  }
  oneof entPhysicalFirmwareRev_present {
    // The vendor-specific firmware revision string for the physical 
    // entity.
    string entPhysicalFirmwareRev = 9; 
  }
  oneof entPhysicalSoftwareRev_present {
    // The vendor-specific software revision string for the physical 
    // entity.
    string entPhysicalSoftwareRev = 10; 
  }
  oneof entPhysicalSerialNum_present {
    // The vendor-specific serial number string for the physical 
    // entity.
    string entPhysicalSerialNum = 11; 
  }
  oneof entPhysicalMfgName_present {
    // The name of the manufacturer of this physical component.
    string entPhysicalMfgName = 12; 
  }
  oneof entPhysicalModelName_present {
    // The vendor-specific model name identifier string associated 
    // with this physical component.
    string entPhysicalModelName = 13; 
  }
  oneof entPhysicalAssetID_present {
    // This object is a user-assigned asset tracking identifier for 
    // the physical entity and provides non-volatile storage of this 
    // information.
    string entPhysicalAssetID = 14; 
  }
  oneof entPhysicalMfgDate_present {
    // This object contains the date of manufacturing of the managed 
    // entity.
    uint32 entPhysicalMfgDate = 15; 
  }
  oneof entPhysicalURIs_present {
    // This object contains additional identification information about 
    // the physical entity.
    string entPhysicalURIs = 16; 
  }
  oneof entPhysicalFunction_present {
    // This field can take the following values: METER = 1, 
    // RANGE_EXTENDER = 2, DA_GATEWAY = 3, CGE = 4, ROOT = 5, 
    // CONTROLLER = 6, SENSOR = 7, NETWORKNODE = 8.
    uint32 entPhysicalFunction = 17; 
  }
  oneof entPhysicalOUI_present {
    // uniquely identifies a vendor
    bytes entPhysicalOUI = 18; 
  }
  // This defines a list of hardware modules with their 
  // firmware versions
  repeated HardwareModule hwModule = 19; 
}

// TLV 12
// This TLV contains description information for an interface on 
// the device. The contents of these fields are defined by the 
// equivalently-named fields in the SNMP MIB object ifTable.
// Class:: Generic
//

message InterfaceDesc {
  oneof ifIndex_present {
    // A unique value, greater than zero, for each interface.
    int32 ifIndex = 1; 
  }
  oneof ifName_present {
    // The textual name of the interface.
    string ifName = 2; 
  }
  oneof ifDescr_present {
    // A textual string containing information about the interface.
    string ifDescr = 3; 
  }
  oneof ifType_present {
    // The type of interface.
    int32 ifType = 4; 
  }
  oneof ifMtu_present {
    // The size of the largest packet which can be sent/received 
    // on the interface, specified in octets.
    int32 ifMtu = 5; 
  }
  oneof ifPhysAddress_present {
    // The interface's address at its protocol sub-layer.
    bytes ifPhysAddress = 6; 
  }
}

// TLV 13
// This TLV specifies the periodic reporting of a set of TLVs.
// Class:: Generic
//

message ReportSubscribe {
  oneof interval_present {
    // The periodic time interval (in seconds) at which the device 
    // sends the tlvid set of tlvs.
    uint32 interval = 1; 
  }
  // The tlvs to be sent on the interval.
  repeated string tlvid = 2; 

  oneof intervalHeartBeat_present {
    // The periodic time interval at which the device sends the 
    // tlvidHeartBeat set of tlvs.
    uint32 intervalHeartBeat = 3; 
  }
  // The tlvs to be sent on the heartbeat interval.
  repeated string tlvidHeartBeat = 4; 
}

// TLV 16
// Describes a particular IP address (identified by the index) attached 
// to an interface.
// Class:: Generic
//

message IPAddress {
  oneof ipAddressIndex_present {
    // A unique value, greater than zero, for each IP address
    int32 ipAddressIndex = 1; 
  }
  oneof ipAddressAddrType_present {
    // Address type defined as integers : 
    // ipv4=1, ipvv6=2, ipv4z=3, ipv6z=4, ipv6am=5
    uint32 ipAddressAddrType = 2; 
  }
  oneof ipAddressAddr_present {
    // The IP address
    bytes ipAddressAddr = 3; 
  }
  oneof ipAddressIfIndex_present {
    // Index of the associated interface
    int32 ipAddressIfIndex = 4; 
  }
  oneof ipAddressType_present {
    // IP type defined as integers : 
    // unicast=1, anycast=2, broadcast=3
    uint32 ipAddressType = 5; 
  }
  oneof ipAddressOrigin_present {
    // Address origin defined as integers: 
    // other=1, manual=2, dhcp=4, linklayer=5, random=6
    uint32 ipAddressOrigin = 6; 
  }
  oneof ipAddressStatus_present {
    // status defined as integers: 
    // preferred=1, deprecated=2, invalid=3, inaccessible=4, unknown=5, 
    // tentative=6, duplicate=7, optimistic=8
    uint32 ipAddressStatus = 7; 
  }
  reserved 8;
  reserved 9;
  oneof ipAddressPfxLen_present {
    // The prefix length associated with the IP address.
    uint32 ipAddressPfxLen = 10; 
  }
}

// TLV 17
// Describes a particular IP route (identified by the index) attached 
// to an interface.
// Class:: Generic
//

message IPRoute {
  oneof inetCidrRouteIndex_present {
    // A unique value, greater than zero, for each route.
    int32 inetCidrRouteIndex = 1; 
  }
  oneof inetCidrRouteDestType_present {
    // Destination Addresss type defined as integers:
    // ipv4=1, ipvv6=2, ipv4z=3, ipv6z=4, ipv6am=5.
    uint32 inetCidrRouteDestType = 2; 
  }
  oneof inetCidrRouteDest_present {
    // IP address of the destination of the route.
    bytes inetCidrRouteDest = 3; 
  }
  oneof inetCidrRoutePfxLen_present {
    // Associated prefix length of the route destination.
    uint32 inetCidrRoutePfxLen = 4; 
  }
  oneof inetCidrRouteNextHopType_present {
    // Next hop Addresss type defined as integers: 
    // ipv4=1, ipvv6=2, ipv4z=3, ipv6z=4, ipv6am=5.
    uint32 inetCidrRouteNextHopType = 5; 
  }
  oneof inetCidrRouteNextHop_present {
    // IP address of the next hop of the route (device parent).
    bytes inetCidrRouteNextHop = 6;   
  }
  oneof inetCidrRouteIfIndex_present {
    // Index of the associated interface.
    int32 inetCidrRouteIfIndex = 7; 
  }
  reserved 8;
  reserved 9;
  reserved 10;
}

// TLV 18
// Contains the current time as maintainced on the device.
// For time stamping purposes, this tlvid MUST also be sent along with 
// every periodic metric report. It MAY contain a POSIX timestamp 
// or an ISO 8601 timestamp.
// Class:: Generic
//

message CurrentTime {
  oneof posix_present {
    // posix timestamp.
    uint32 posix = 1; 
  }
  oneof iso8601_present {
    // iso 8601 timestamp.
    string iso8601 = 2; 
  }
  oneof source_present {
    // time service from:
    // local=1, admin=2, network=3.
    uint32 source = 3; 
  }
}

// TLV 21
// For retrieving the RPL Settings on the device.
// Class:: Mesh
//

message RPLSettings {
  oneof ifIndex_present {
    // interface id
    int32 ifIndex = 1; 
  }
  oneof enabled_present {
    // whether RPL feature is enabled.
    bool enabled = 2; 
  }
  oneof dioIntervalMin_present {
    // min interval of DIO trickle timer in milliseconds.
    uint32 dioIntervalMin = 3; 
  }
  oneof dioIntervalMax_present {
    // max interval of DIO trickle timer in milliseconds.
    uint32 dioIntervalMax = 4; 
  }
  oneof daoIntervalMin_present {
    // min interval of DAO trickle timer in milliseconds.
    uint32 daoIntervalMin = 5; 
  }
  oneof daoIntervalMax_present {
    // max interval of DAO trickle timer in milliseconds.
    uint32 daoIntervalMax = 6; 
  }
  oneof mopType_present {
    // mode of operation for RPL. 1: non-storing mode; 2: storing mode.
    uint32 mopType = 7; 
  }
}

// TLV 22
// Contains the total system uptime of the device (seconds).
// Class:: Generic
//

message Uptime {
  oneof sysUpTime_present {
    // uptime info in seconds.
    uint32 sysUpTime = 1; 
  }
}

// TLV 23
// The statistics of an interface
// Class:: Generic
//

message InterfaceMetrics {
  oneof ifIndex_present {
    // A unique value, greater than zero, for each interface. 
    // Is same as in InterfaceDesc's ifIndex for the same interface.
    int32 ifIndex = 1; 
  }
  oneof ifInSpeed_present {
    // The speed at which the incoming packets are received on the 
    // interface.
    uint32 ifInSpeed = 2; 
  }
  oneof ifOutSpeed_present {
    // The speed at which the outgoing packets are transmitted on 
    // the interface.
    uint32 ifOutSpeed = 3; 
  }
  oneof ifAdminStatus_present {
    // The desired state of the interface.
    uint32 ifAdminStatus = 4; 
  }
  oneof ifOperStatus_present {
    // The current operational state of the interface.
    uint32 ifOperStatus = 5; 
  }
  oneof ifLastChange_present {
    // The value of sysUpTime at the time the interface entered its 
    // current operational state.
    uint32 ifLastChange = 6; 
  }
  oneof ifInOctets_present {
    // The total number of octets received on the interface, 
    // including framing characters.
    uint32 ifInOctets = 7; 
  }
  oneof ifOutOctets_present {
    // The total number of octets transmitted out of the interface, 
    // including framing characters.
    uint32 ifOutOctets = 8; 
  }
  oneof ifInDiscards_present {
    // The number of inbound packets which were chosen to be discarded 
    // even though no errors had been detected to prevent their being 
    // deliverable to a higher-layer protocol (application dependant).
    uint32 ifInDiscards = 9; 
  }
  oneof ifInErrors_present {
    // For packet-oriented interfaces, the number of inbound packets 
    // that contained errors preventing them from being deliverable to 
    // a higher-layer protocol (subset of ifInDiscards).
    uint32 ifInErrors = 10; 
  }
  oneof ifOutDiscards_present {
    // The number of outbound packets which were chosen to be discarded 
    // even though no errors had been detected to prevent their being 
    // transmitted.
    uint32 ifOutDiscards = 11; 
  }
  oneof ifOutErrors_present {
    // For packet-oriented interfaces, the number of outbound packets 
    // that could not be transmitted because of errors.
    uint32 ifOutErrors = 12; 
  }
}

// TLV 25
// Describes status of each RPL router
// Class:: Mesh
//

message IPRouteRPLMetrics {
  oneof inetCidrRouteIndex_present {
    // refers to a particular index in the IPRoute table.
    int32 inetCidrRouteIndex = 1; 
  }
  oneof instanceIndex_present {
    // Corresponding RPL instance of this route.
    int32 instanceIndex = 2; 
  }
  oneof rank_present {
    // advertised rank.
    int32 rank = 3; 
  }
  oneof hops_present {
    // Not currently used, future use of hops metric.
    int32 hops = 4; 
  }
  oneof pathEtx_present {
    // advertised path ethx.
    int32 pathEtx = 5;  
  }
  oneof linkEtx_present {
    // next-hop link ETX.
    int32 linkEtx = 6;  
  }
  oneof rssiForward_present {
    // forward RSSI value (relative to the device).
    sint32 rssiForward = 7; 
  }
  oneof rssiReverse_present {
    // reverse RSSI value (relative to the device).
    sint32 rssiReverse = 8; 
  }
  oneof lqiForward_present {
    // forward LQI value.
    int32 lqiForward = 9; 
  }
  oneof lqiReverse_present {
    // reverse LQI value.
    int32 lqiReverse = 10; 
  }
  oneof dagSize_present {
    // nodes count of this pan (number of joined devices).
    uint32 dagSize = 11; 
  }
  reserved 12 to 17;
  // forward phy mode value.
  PhyModeInfo phyModeForward = 18; 
  // reverse phy mode value.
  PhyModeInfo phyModeReverse = 19; 
}

// TLV 30
// Request the device to perform a ping operation to a 
// destination address.
// Class:: Generic
//

message PingRequest {
  oneof dest_present {
    // IP address to be pinged from the device.
    string dest = 1; 
  }
  oneof count_present {
    // number of times to ping.
    uint32 count = 2; 
  }
  oneof delay_present {
    // delay between ping in seconds.
    uint32 delay = 3; 
  }
}

// TLV 31
// Acquire the current status of the last PingRequest.
// Class:: Generic
//

message PingResponse {
  oneof sent_present {
    // number of packets sent
    uint32 sent = 1;  
  }
  oneof received_present {
    // number of packets received
    uint32 received = 2; 
  }
  oneof minRtt_present {
    // min round trip time
    uint32 minRtt = 3; 
  }
  oneof meanRtt_present {
    // mean round trip time
    uint32 meanRtt = 4; 
  }
  oneof maxRtt_present {
    // max round trip time
    uint32 maxRtt = 5; 
  }
  oneof stdevRtt_present {
    // standard deviation of the round trip time
    uint32 stdevRtt = 6; 
  }
  oneof src_present {
    // source IP address for the ping
    string src = 7; 
  }
}

// TLV 32
// Request a device to reboot.
// Class:: Generic
//

message RebootRequest {
  oneof flag_present {
    // 0 : reboot and transfer to designated running image. 
    // 1 : reboot and stop at bootloader CLI.
    uint32 flag = 1; 
  }
}

// TLV 33
// 802.1x status
// Class:: Mesh
//

message Ieee8021xStatus {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface.
    int32 ifIndex = 1; 
  }
  oneof enabled_present {
    // 802.1x enabled or not?
    bool enabled = 2; 
  }
  oneof identity_present {
    // subject name of certificate, max len 32
    string identity = 3; 
  }
  oneof state_present {
    // state of tls handshake
    uint32 state = 4; 
  }
  oneof pmKId_present {
    // hash value of pmk, len 16
    bytes pmkId = 5; 
  }
  oneof clientCertValid_present {
    // whether client cert is valid
    bool clientCertValid = 6; 
  }
  oneof caCertValid_present {
    // whether ca cert is valid
    bool caCertValid = 7; 
  }
  oneof privateKeyValid_present {
    // whether private key of client cert is valid
    bool privateKeyValid = 8; 
  }
  oneof rlyPanid_present {
    // panid of relay node
    uint32 rlyPanid = 9; 
  }
  oneof rlyAddress_present {
    // eui64 address of relay node, len 8
    bytes rlyAddress = 10; 
  }
  oneof rlyLastHeard_present {
    // last heard from relay node in seconds
    uint32 rlyLastHeard = 11; 
  }
}

// TLV 34
// 802.11i status
// Class:: Mesh
//

message Ieee80211iStatus {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface.
    int32 ifIndex = 1; 
  }
  oneof enabled_present {
    // 802.11i is eabled or not
    bool enabled = 2; 
  }
  oneof pmkId_present {
    // hash value of pmk, len 16
    bytes pmkId = 3; 
  }
  oneof ptkId_present {
    // hash value of ptk, len 16
    bytes ptkId = 4; 
  }
  oneof gtkIndex_present {
    // index of gtk
    int32 gtkIndex = 5; 
  }
  oneof gtkAllFresh_present {
    // whether all gtk are fresh
    bool gtkAllFresh = 6; 
  }
  // list of hash value for each gtk, hash len 8, max repeat 4
  repeated bytes gtkList = 7; 
  // list of lifetime for each gtk, hash len 8, max repeat 4
  repeated uint32 gtkLifetimes = 8; 
  oneof authAddress_present {
    // eui64 address of authenticate node
    bytes authAddress = 9; 
  }
}

message PhyModeInfo {
  oneof phyMode_present {
    // phy operating mode value (as defined in section 5.2 of 
    // PHYWG Wi-SUN PHY Technical Specification - Amendment 1VA8)
    uint32 phyMode = 1; 
  }
  oneof txPower_present {
    // transmit power value in dbm.
    int32 txPower = 2; 
  }
}

// TLV 35
// Configuration of WPAN-specific interface settings
// Class:: Mesh
//

message WPANStatus {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface.
    int32 ifIndex = 1; 
  }
  oneof SSID_present {
    // Max len 32 (Wi-SUN NetName).
    bytes SSID = 2; 
  }
  oneof panid_present {
    uint32 panid = 3;
  }
  reserved 4;

  oneof dot1xEnabled_present {
    // Is dot1x enabled?
    bool dot1xEnabled = 5; 
  }
  oneof securityLevel_present {
    // Security level
    uint32 securityLevel = 6; 
  }
  oneof rank_present {
    uint32 rank = 7;
  }
  oneof beaconValid_present {
    // Is beacon valid (where invalid means receipt has 
    // timed-out/contact with PAN was lost)?  (PC frame for Wi-SUN)
    bool beaconValid = 8; 
  }  
  oneof beaconVersion_present {
    // Beacon version (Wi-SUN PAN version).
    uint32 beaconVersion = 9; 
  }
  oneof beaconAge_present {
    // Last heard beacon message in seconds  (PC frame for Wi-SUN).
    uint32 beaconAge = 10; 
  }
  oneof txPower_present {
    // Transmit power value in dbm
    int32 txPower = 11; 
  }
  oneof dagSize_present {
    // Count of nodes joined to this PAN
    uint32 dagSize = 12; 
  }
  oneof metric_present {
    // Metric to border router (Wi-SUN Routing Cost)
    uint32 metric = 13; 
  }
  oneof lastChanged_present {
    // seconds since last PAN change (PAN ID change).
    uint32 lastChanged = 14; 
  }
  oneof lastChangedReason_present {
    // Reason for last PAN change: 
    // -1 == unknown, 
    // 0 == mesh initializing, 
    // 1 ==  mesh connectivity lost, 
    // 2 == GTK timeout,  
    // 3 == default route lost, 
    // 4 == migrated to better PAN, 
    // 5 == reserved.
    uint32 lastChangedReason = 15; 
  }
  oneof demoModeEnabled_present {
    // Is demo mode enabled?
    bool demoModeEnabled = 16; 
  }
  oneof txFec_present {
    // Is FEC enabled?
    bool txFec = 17; 
  }
  oneof phyMode_present {
    // Phy operating mode value (as defined in section 5.2 of 
    // PHYWG Wi-SUN PHY Technical Specification - Amendment 1VA8)
    uint32 phyMode = 18; 
  }
  reserved 19;
  // Multi phy mode and transmit power value for adaptive modulation.
  repeated PhyModeInfo phyModeList = 20; 
}

// TLV 36
// Status of DHCP6 client
// Class:: Generic
//

message DHCP6ClientStatus {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface
    int32 ifIndex = 1;
  }
  oneof ianaIAID_present {
    // TA ID value.
    uint32 ianaIAID = 2;
  }
  oneof ianaT1_present {
    // T1 value.
    uint32 ianaT1 = 3;
  }
  oneof ianaT2_present {
    // T2 value.
    uint32 ianaT2 = 4; 
  }
}

// TLV 42 
// Configure device reporting settings.
// Class:: Generic
//

message NMSSettings {
  oneof regIntervalMin_present {
    // Min interval of register trickle timer in seconds.
    uint32 regIntervalMin = 1; 
  }
  oneof regIntervalMax_present {
    // Max interval of register trickle timer in seconds.
    uint32 regIntervalMax = 2; 
  }
  reserved 3 to 6;
}

// TLV 43
// Registration status to NMS.
// NMS uses this TLV to record the reason for the registration 
// operation as recorded in the lastRegReason field of the TLV.
// Class:: Generic
//

message NMSStatus {
  oneof registered_present {
    // True if device is registerd with NMS.
    bool registered = 1; 
  }
  oneof NMSAddr_present {
    // IPv6 address of NMS.
    bytes NMSAddr = 2; 
  }
  oneof NMSAddrOrigin_present {
    // Mechanism used to get NMS's IPv6 address.
    // (fixed/DHCPv6/redirect by TLV6 ... values).
    uint32 NMSAddrOrigin = 3;   
  }
  oneof lastReg_present {
    // Time since last succesful registration in seconds.
    uint32 lastReg = 4; 
  }
  oneof lastRegReason_present {
    // Reason for last registration:
    // 1: coldstart,
    // 2: administrative,
    // 3: IP address changed,
    // 4: NMS changed,
    // 5: NMS redirect, 
    // 6: NMS error,
    // 7: IDevID, LDevID, or NMS certificate changed,
    // 8: outage recovery.
    uint32 lastRegReason = 5; 
  }
  oneof nextReg_present {
    // Time to next registration attempt in seconds.
    uint32 nextReg = 6; 
  }
  oneof NMSCertValid_present {
    // True if NMS certificate is valid.
    bool NMSCertValid = 7; 
  }
}

// TLV 47
// Device settings for 802.1x
// Class:: Mesh
//

message Ieee8021xSettings {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface.
    int32 ifIndex = 1; 
  }
  oneof secMode_present {
    // Security mode, non-security or security (Security Level from 
    // Aux Security Header of IEEE 802.15.4-2020).
    uint32 secMode = 2; 
  }
  oneof authIntervalMin_present {
    // Min interval of 802.1x trickle timer in seconds.
    uint32 authIntervalMin = 3; 
  }
  oneof authIntervalMax_present {
    // Max interval of 802.1x trickle timer in seconds.
    uint32 authIntervalMax = 4; 
  }
  oneof immediate_present {
    // True == do 802.1x authentication immediately,  
    // False == do 802.1x authentication at next authentication 
    // interval.
    bool immediate = 5; 
  }
}

// TLV 48
// Statistic of 802.15.4 beacon packets
// Class:: Mesh
//

message Ieee802154BeaconStats {
  oneof ifIndex_present {
    // It is RECOMMENDED this be set to 2 for the 6LowPAN interface.
    int32 ifIndex = 1; 
  }
  oneof inFrames_present {
    // Count of received beacon.
    uint32 inFrames = 10; 
  }
  oneof inFramesBeaconPAS_present {
    // Count of received PAS beacon.
    uint32 inFramesBeaconPAS = 11; 
  }
  oneof inFramesBeaconPA_present {
    // Count of received PA beacon.
    uint32 inFramesBeaconPA = 12; 
  }
  oneof inFramesBeaconPCS_present {
    // Count of received PCS beacon.
    uint32 inFramesBeaconPCS = 13; 
  }
  oneof inFramesBeaconPC_present {
    // Count of received PC beacon.
    uint32 inFramesBeaconPC = 14; 
  }
  oneof outFrames_present {
    // Count of all sent out beacon.
    uint32 outFrames = 20; 
  }
  oneof outFramesBeaconPAS_present {
    // Count of sent out PAS beacon.
    uint32 outFramesBeaconPAS = 21; 
  }
  oneof outFramesBeaconPA_present {
    // Count of sent out PA beacon.
    uint32 outFramesBeaconPA = 22;
  }
  oneof outFramesBeaconPCS_present {
    // Count of sent out PCS beacon.
    uint32 outFramesBeaconPCS = 23; 
  }
  oneof outFramesBeaconPC_present {
    // Count of sent out PC beacon.
    uint32 outFramesBeaconPC = 24; 
  }
}

// TLV 53
// Indicates RPL instance information
// Class:: Mesh
//

message RPLInstance {
  oneof instanceIndex_present {
    // Index for instance.
    int32 instanceIndex = 1; 
  }
  oneof instanceId_present {
    // Instance id.
    int32 instanceId = 2; 
  }
  oneof doDagId_present {
    // DODAG id, len 16.
    bytes doDagId = 3; 
  }
  oneof doDagVersionNumber_present {
    // DODAG version number of instance.
    int32 doDagVersionNumber = 4; 
  }
  oneof rank_present {
    // Rank value.
    int32 rank = 5; 
  }
  oneof parentCount_present {
    // Count of available parents (Wi-SUN candidate parent set).
    int32 parentCount = 6; 
  }
  oneof dagSize_present {
    // Node count of this DODAG.
    uint32 dagSize = 7; 
  }
  // Max repeat 3.
  repeated RPLParent parents = 8; 
  // Max repeat 3.   
  repeated RPLParent candidates = 9;  
}

message RPLParent {
  oneof parentIndex_present {
    // This parent's index in the RPLParent table.
    int32 parentIndex = 1; 
  }
  oneof instanceIndex_present {
    // A particular index in the RPLInstance table that this 
    // parent underlies.
    int32 instanceIndex = 2; 
  }
  oneof routeIndex_present {
    // A particular index in the IPRoute table that this 
    // parent underlies.
    int32 routeIndex = 3; 
  }
  oneof ipv6AddressLocal_present {
    // IPv6 linklocal address.
    bytes ipv6AddressLocal = 4; 
  }
  oneof ipv6AddressGlobal_present {
    // IPv6 global address.
    bytes ipv6AddressGlobal = 5; 
  }
  oneof doDagVersionNumber_present {
    // DODAG version number if RPL parent.
    uint32 doDagVersionNumber = 6; 
  }
  oneof pathEtx_present {
    // The parent's ETX back to the root.
    int32 pathEtx = 7;  
  }
  oneof linkEtx_present {
    // The node's ETX to its next-hop.
    int32 linkEtx = 8;  
  }
  oneof rssiForward_present {
    // Forward RSSI value.
    sint32 rssiForward = 9; 
  }
  oneof rssiReverse_present {
    // Reverse RSSI value.
    sint32 rssiReverse = 10; 
  }
  oneof lqiForward_present {
    // Forward LQI value.
    int32 lqiForward = 11; 
  }
  oneof lqiReverse_present {
    // Reverse LQI value.
    int32 lqiReverse = 12; 
  }
  oneof hops_present {
    // parent's hop value.
    int32 hops = 13; 
  }
}

// Groups in CSMP provide a mechanism to realize application 
// layer multicast in the network. A group is uniquely defined by 
// a type, id pair. Membership within a group type is exclusive,
// i.e., a device can be a member of only one group-id within a 
// group-type. However, a device can be a member of more than one 
// group of different group-types.

// A device is informed about its membership to a group using the
// GroupAssign TLV. On their very first boot, devices do not 
// belong to any group. A device is added to a group by sending a 
// GroupAssign TLV to the device. Receipt of a GroupAssign TLV 
// replaces any existing group assignments.  GroupAssign may occur 
// either by direct unicast to a device or in the registration 
// response from the NMS to the device.  Note that a GroupAssign 
// should not be sent over multicast, because it would possibly 
// cause some group members to change and some group members not 
// to change.

// Group membership information MUST be stored in persistent 
// storage so that once a device has been assigned any group it is 
// remembered across reboots.  A device will only process multicast 
// messages containing a GroupMatch TLV if the device belongs to a 
// group specified by the GroupMatch TLV.

// TLV 55
// Class:: Generic
//

message GroupAssign {
  oneof type_present {
    uint32 type = 1;
  }
  oneof id_present {
    uint32 id = 2;
  }
}

// TLV 57
// Class:: Generic
//

message GroupMatch {
  oneof type_present {
    uint32 type = 1;
  }
  oneof id_present {
    uint32 id = 2;
  }
}

// TLV 58
// Class:: Generic
// GET to a device for this TLV MAY illicit a response with one or 
// more GroupInfo TLVs. 
//

message GroupInfo {
  oneof type_present {
    uint32 type = 1;
  }
  oneof id_present {
    uint32 id = 2;
  }
}

message LowpanMacCounters {
  oneof inFrames_present {
    // Count of all received frames.
    uint32 inFrames = 1; 
  }
  oneof inFramesBeacon_present {
    // Count of received beacon frames (Note: Wi-SUN does 
    // not use Beacon frames).
    uint32 inFramesBeacon = 2; 
  }
  oneof inFramesData_present {
    // Count of received data frames.
    uint32 inFramesData = 3; 
  }
  oneof inFramesAck_present {
    // Count of received ack frames.
    uint32 inFramesAck = 4; 
  }
  oneof inFramesCmd_present {
    // Count of received command frames.
    uint32 inFramesCmd = 5; 
  }
  oneof inFramesAsync_present {
    // Count of received async frames.
    uint32 inFramesAsync = 6; 
  }
  oneof inFramesBcast_present {
    // Count of received broadcast frames.
    uint32 inFramesBcast = 7; 
  }
  oneof inFramesUcast_present {
    // Count of received unicast frames.
    uint32 inFramesUcast = 8; 
  }
  oneof outFrames_present {
    // Count of all sent out frames.
    uint32 outFrames = 9; 
  }
  oneof outFramesBeacon_present {
    // Count of sent out beacon frames.
    uint32 outFramesBeacon = 10; 
  }
  oneof outFramesData_present {
    // Count of sent out data frames.
    uint32 outFramesData = 11; 
  }
  oneof outFramesAck_present {
    // Count of sent out ack frames.
    uint32 outFramesAck = 12; 
  }
  oneof outFramesCmd_present {
    // Count of sent out command frames.
    uint32 outFramesCmd = 13; 
  }
  oneof outFramesAsync_present {
    // Count of sent out async frames.
    uint32 outFramesAsync = 14; 
  }
  oneof outFramesBcast_present {
    // Count of recesent outived broadcast frames.
    uint32 outFramesBcast = 15; 
  }
  oneof outFramesUcast_present {
    // Count of sent out unicast frames.
    uint32 outFramesUcast = 16; 
  }
}

// TLV 62
// Statistic of lowpan mac layer
// Class:: Mesh
//

message LowpanMacStats {
  // Total counter of lowpan mac layer.
  LowpanMacCounters total = 1;  
  // RF counter of lowpan mac layer.
  LowpanMacCounters rf = 2;     
  reserved 3;
}

// TLV 63
// Configuration of RF PHY
// Class:: Mesh
//

message LowpanPhySettings {
  oneof lowpanRF_present {
    // 1 == enable lowpan RF, 0 == disable.
    uint32 lowpanRF = 1; 
  }
  reserved 2;   
}

// TLV 65 - 75 are for firmware upgrade.
// Usage is detailed in main body of the CSMP specification.
//
message HardwareInfo {
  oneof hwId_present {
    // Hardware information, max len 32.
    string hwId = 1; 
  }
  oneof vendorHwId_present {
    // Sub hardware information, max len 32.
    string vendorHwId = 2; 
  }
}

// TLV 65
// Start to transfer firmware
// Class:: Generic
//

message TransferRequest {
  // Hardware information.
  HardwareInfo hwInfo = 1; 
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 2; 
  }
  oneof fileName_present {
    // Name of image file, max len 128.
    string fileName = 3; 
  }
  oneof version_present {
    // Version number, max len 32.
    string version = 4; 
  }
  oneof fileSize_present {
    // Total size of image file.
    uint32 fileSize = 5; 
  }
  oneof blockSize_present {
    // Block size of image file.
    uint32 blockSize = 6; 
  }
  reserved 7 to 11;
}

// TLV 67
// Class:: Generic
//

message ImageBlock {
  oneof fileHash_present{
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof blockNum_present {
    // Block number 0, 1, 2, etc.
    uint32 blockNum = 2; 
  }
  oneof blockData_present {
    // Block context, max len 1024.
    bytes blockData = 4; 
  }
}

// TLV 68
// Firmware load request
// Class:: Generic
//

message LoadRequest {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof loadTime_present {
    // UTC time to load image, set to 1 to load immediately.
    uint32 loadTime = 2; 
  }
}

// TLV 69
// Firmware cancel load request
// Class:: Generic
//

message CancelLoadRequest {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
}

// TLV 70
// Set firmware to backup slot
// Class:: Generic
//

message SetBackupRequest {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
}

/* ResponseCodes

enum {
  // The request was successfully processed.
  OK = 0;
  // Device hardware type does not match 
  // the request's hardware type.
  INCOMPATIBLE_HW = 1;   
  // Image operation cannot be completed, 
  // device only has partial image.
  IMAGE_INCOMPLETE = 2;
  // File hash does not match any image 
  // available on the device.  
  UNKNOWN_HASH = 3;   
  // Image download is denied, filesize 
  // of the new image is too large.    
  FILE_SIZE_TOO_BIG = 4;  
  // Image signature check failed.
  SIGNATURE_FAILED = 5;   
  // Invalid request.
  INVALID_REQ = 6;    
  // Invalid image block size.    
  INVALID_BLOCK_SIZE = 7;
  // Request cannot be processed, 
  // conflict with a pending device reboot. 
  PENDING_REBOOT = 8; 
  // Cancel reboot request cannot be processed, 
  // image is already running.    
  IMAGE_RUNNING = 9;      
}
*/

// TLV 71
// Response for TLV 65 TransferRequest
// Class:: Generic
//

message TransferResponse {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof response_present {
    // Refer to ResponseCodes.
    uint32 response = 2; 
  }
}

// TLV 72
// Response for TLV 68 LoadRequest
// Class:: Generic
//

message LoadResponse {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof response_present {
    // refer to ResponseCodes.
    uint32 response = 2; 
  }
  oneof loadTime_present {
    // UTC time to load image.
    uint32 loadTime = 3; 
  }
}

// TLV 73
// Response for TLV 69 CancelLoadRequest
// Class:: Generic
//

message CancelLoadResponse {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof response_present {
    // Refer to ResponseCodes.
    uint32 response = 2; 
  }
}

// TLV 74
// Class:: Generic
//

message SetBackupResponse {
  oneof fileHash_present {
    // SHA256 hash value of image file, len 32.
    bytes fileHash = 1; 
  }
  oneof response_present {
    // Refer to ResponseCodes.
    uint32 response = 2; 
  }
}

// TLV 75
// Image information
// Class:: Generic
//

message FirmwareImageInfo {
  oneof index_present {
    uint32 index = 1;
  }
  oneof fileHash_present {
    // SAH256 hash value of image file, len 32.
    bytes fileHash = 2; 
  }
  oneof fileName_present {
    // name of image file, max len 128.
    string fileName = 3; 
  }
  oneof version_present {
    // version number, man len 32.
    string version = 4; 
  }
  oneof fileSize_present {
    // total size of image file.
    uint32 fileSize = 5; 
  }
  oneof blockSize_present {
    // block size of image file.
    uint32 blockSize = 6; 
  }
  oneof bitmap_present {
    // bitmap of image file, max len 128. Big endian. 
    // 1 means block was received, 0 means block was not received.
    bytes bitmap = 7; 
  }
  oneof isDefault_present {
    // True if default image.
    bool isDefault = 8; 
  }
  oneof isRunning_present {
    // True if running image.
    bool isRunning = 9; 
  }
  oneof loadTime_present {
    // UTC time to load.  1 means load immediately.
    uint32 loadTime = 10; 
  }
  // hardware information
  HardwareInfo hwInfo = 11; 
  oneof bitmapOffset_present {
    // When present, MUST be set to indicate the start block 
    // number of bitmap.  Block numbering is 0 based.
    uint32 bitmapOffset = 12; 
  }
  reserved 13 to 15;
}

// TLV 76
// Class:: Generic
//

message SignatureValidity {
  oneof notBefore_present {
    // Posix time.
    uint32 notBefore = 1; 
  }
  oneof notAfter_present {
    // Posix time.
    uint32 notAfter = 2; 
  }
}

// TLV 77
// Class:: Generic
//

message Signature {
  oneof value_present {
    bytes value = 1;
  }
}

// TLV 79
// Configuration of signature check settings about message from NMS
// Class:: Generic
//

message SignatureSettings {
  oneof reqSignedPost_present {
    // Check signature in POST message from NMS?
    bool reqSignedPost = 1; 
  }
  oneof reqValidCheckPost_present {
    // Time valid check in POST message from NMS?
    bool reqValidCheckPost = 2; 
  }
  oneof reqTimeSyncPost_present {
    // Return fail when node doesn't have global time in 
    // POST message from NMS?
    bool reqTimeSyncPost = 3; 
  }
  oneof reqSecLocalPost_present {
    // Check signature in POST message from console?
    bool reqSecLocalPost = 4; 
  }
  oneof reqSignedResp_present {
    // Check signature in response message from NMS 
    // during registration?
    bool reqSignedResp = 5; 
  }
  oneof reqValidCheckResp_present {
    // Time valid check in response message from NMS 
    // during registration?
    bool reqValidCheckResp = 6; 
  }
  oneof reqTimeSyncResp_present {
    // Return fail when node doesn't have global time in 
    // response message from NMS during registration?
    bool reqTimeSyncResp = 7; 
  }
  oneof reqSecLocalResp_present {
    // Check signature in response message from console 
    // during registation?
    bool reqSecLocalResp = 8; 
  }
  oneof cert_present {
    // Certificate context, used to change NMS's 
    // certificate, max len 512.
    bytes cert = 9; 
  }
}

message HardwareResetCount {
  oneof total_present {
    uint32 total = 1;
  }
  oneof externalReset_present {
    // External reset reason.
    uint32 externalReset = 2; 
  }
  oneof powerOnReset_present {
    // Power on reset reason.
    uint32 powerOnReset = 3; 
  }
}

message SoftwareResetCount {
  oneof total_present {
    uint32 total = 1;
  }
  oneof FWLoadReset_present {
    // Firmware reload.
    uint32 FWLoadReset = 2; 
  }
  oneof CSMPRebootReset_present {
    // Reload forced by CSMP TLV.
    uint32 CSMPRebootReset = 3; 
  }
  oneof vendorProgramReset_present {
    // Reload forced by vendor's APP.
    uint32 vendorProgramReset = 4; 
  }
  oneof cfgLoadReset_present {
    // Reload config file.
    uint32 cfgLoadReset = 5; 
  }
}

message ExceptionResetCount {
  oneof total_present {
    uint32 total = 1;
  }
  oneof IWDGReset_present {
    // Watchdog forced reset.
    uint32 IWDGReset = 2; 
  }
  oneof cstackOverflowReset_present {
    // Stack over flow reset.
    uint32 cstackOverflowReset = 3; 
  }
  oneof EPFReset_present {
    // GPIO reset.
    uint32 EPFReset = 4; 
  }
}

// TLV 86
// Count of all types of reset in the system, include hardware reset, 
// software reset and exception reset.
// Class:: Generic
//

message SysResetStats {
  oneof total_present {
    // Reset counters.
    uint32 total = 1; 
  }
  HardwareResetCount hardwareReset = 2;
  SoftwareResetCount softwareReset = 3;
  ExceptionResetCount exceptionReset = 4;
}

// TLV 124
// Status of device network module, similar as netstat command in linux
// Class:: Generic
//

message NetStat {
  oneof sessionIndex_present {
    // Session index.
    int32 sessionIndex = 1;  
  }
  oneof protocol_present {
    // 6 TCP, 
    // 17 UDP.
    uint32 protocol = 2; 
  }
  oneof localAddress_present {
    //IPv4 or IPv6 local address.
    bytes localAddress = 3; 
  }
  oneof localPort_present {
    // Local port number.
    uint32 localPort = 4; 
  }
  oneof peerAddress_present {
    // IPv4 or IPv6 peer address.
    bytes peerAddress = 5; 
  }
  oneof peerPort_present {
    // Peer port number.
    uint32 peerPort = 6; 
  }
  oneof state_present {
    uint32 state = 7;
  }
  oneof role_present {
    // 1 - server/incoming, 
    // 2 - client/outgoing.
    uint32 role = 8; 
  }
}

// TLV 141
// Indicate the network role of device
// Class:: Generic
//

message NetworkRole {
  // 0 - SYSTEM_DEFAULT, 
  // 1 - TRANSIT_NODE, 
  // 2 - LEAF_NODE.
  uint32 preference = 1; 
}

message CertInfoEntry {
  oneof type_present {
    // 1 - FND public key,
    // 2 - 802.1x CA,
    // 3 - 802.1x public key,
    // 4 - iDevID public key.
    uint32 type = 1;   
  }
  oneof certSubj_present {
    // Certificate subject name, max length 128.
    string certSubj = 2;  
  }
  oneof certValidNotBefore_present {
    // Not before of valid time, max length 16.
    string certValidNotBefore = 3;  
  }
  oneof certValidNotAfter_present {
    // Not after of valid time, max length 16.
    string certValidNotAfter = 4;  
  }
  oneof certFingerprint_present {
    // Certificate finger print, max length 20.
    bytes certFingerprint = 5;  
  }
}

// TLV 172
// Device Certificate Bundle TLV.
//
message CertBundle {
  // Max repeat is 5.
  repeated CertInfoEntry certInfo = 1; 
}

// TLV 241
// Statistic of MPL packet
// Class:: Mesh
//

message MplStats {
  oneof dataSent_present {
    // Count of sent data packets.
    uint32 dataSent = 1; 
  }
  oneof dataReceived_present {
    // Count of received data packets.
    uint32 dataReceived = 2; 
  }
  oneof dataError_present {
    // Count of error data packets.
    uint32 dataError = 3; 
  }
  oneof dataSentDuplicate_present {
    // Count of duplicate sent data packets.
    uint32 dataSentDuplicate = 4; 
  }
  oneof dataReceivedDuplicate_present {
    // Count of duplicate received data packets.
    uint32 dataReceivedDuplicate = 5; 
  }
  oneof controlSent_present {
    // Count of send control packets.
    uint32 controlSent = 6; 
  }
  oneof controlReceived_present {
    // Count of received control packets.
    uint32 controlReceived = 7; 
  }
  oneof controlError_present {
    // Count of error control packets.
    uint32 controlError = 8; 
  }
}

// TLV 242
// Reset statistic of MPL packet
// Class:: Mesh
//

message MplReset {
  oneof stats_present {
    // True means reset MPL statistics.
    bool stats = 8; 
  }
}

// TLV 313
// Statistics for RPL messages
// Class:: Mesh
//

message RPLStats {
  oneof inFramesDIS_present {
    // Count of received DIS packets.
    uint32 inFramesDIS = 1; 
  }
  oneof inFramesDIO_present {
    // Count of received DIO packets.
    uint32 inFramesDIO = 2; 
  }
  oneof inFramesDAO_present {
    // Count of received DAO packets.
    uint32 inFramesDAO = 3; 
  }
  oneof outFramesDIS_present {
    // Count of sent DIS packets.
    uint32 outFramesDIS = 4; 
  }
  oneof outFramesDIO_present {
    // Count of sent DIO packets.
    uint32 outFramesDIO = 5; 
  }
  oneof outFramesDAO_present {
    // Count of sent DAO packets.
    uint32 outFramesDAO = 6; 
  }
  oneof outFramesNoPathDAO_present {
    // Count of sent no-path DAO packets.
    uint32 outFramesNoPathDAO = 7; 
  }
  oneof outFramesNS_present {
    // Count of sent neighbor solicit packets.
    uint32 outFramesNS = 8; 
  }
}

// TLV 314
// Statistics for DHCPv6 messages
// Class:: Generic
//

message DHCP6Stats {
  oneof clientFramesSolicit_present {
    // Count of sent solicit packets.
    uint32 clientFramesSolicit = 1; 
  }
  oneof clientFramesAdvertise_present {
    // Count of sent advertise packets.
    uint32 clientFramesAdvertise = 2; 
  }
  oneof clientFramesRequest_present {
    // Count of sent request packets.
    uint32 clientFramesRequest = 3; 
  }
  oneof clientFramesReply_present {
    // Count of sent reply packets.
    uint32 clientFramesReply = 4; 
  }
  oneof relayFramesForward_present {
    // Count of DHCP relay packets forwarded by node.
    uint32 relayFramesForward = 5; 
  }
  oneof relayFramesReply_present {
    // Count of DHCP relay packets relayed by node.
    uint32 relayFramesReply = 6; 
  }
}


]]></artwork>
          </section>
        </section>
        <section anchor="large-requests">
          <name>Large Requests</name>
          <t>A single CSMP TLV MUST NOT be larger than the space available in a single CoAP request message payload, minus the space occupied by mandatory TLVs.  CSMP requests containing large TLVs or many TLVs may exceed available space within a CoAP request / UDP datagram.</t>
          <t>If a POST request is larger than the UDP MTU, the request MUST be split into multiple POST requests with the TLVs spread across the message bodies. The server MUST be prepared to handle the TLVs in any order.</t>
          <t>If a GET request exceeds the UDP MTU because the max length of the "q" option is exceeded, the request MUST be split into multiple GET requests, each with a subset of the query option.</t>
          <t>The GET response from a server may not be able to fit all requested TLVs into the response.  The server will respond with only the TLVs it is able to fit within the message body.  A client SHOULD issue additional GET requests to obtain the missing TLVs.</t>
          <t>Recommended network MTU will be deployment / technology dependent.  For example, an MTU of 1024 is often used for large scale IEEE 802.15.4 mesh networks.</t>
        </section>
      </section>
      <section anchor="csmp-security-model">
        <name>CSMP Security Model</name>
        <t>The NMS signs outgoing device messaging.  Devices verify the signature to confirm source and integrity of incoming NMS messages.  NMS-Device trust is established with an NMS certificate/public key programmed into the device at time of manufacture.   Signing TLVs included in the message payload enable signature verification by a device.   The Signing TLVs are:</t>
        <ol spacing="normal" type="1"><li>
            <t>Signature TLV. When included, the Signature TLV MUST be the last TLV in a message payload. The signature is calculated over the first byte of the message payload up to but not including the Signature TLV itself. Unless otherwise specified, the signature MUST be calculated as ECDSA with SHA-256 signature cipher using the signer's (NMS) private key.  If the message signature is incorrect, the device MUST ignore the message.</t>
          </li>
          <li>
            <t>SignatureValidity TLV. The SignatureValidity TLV defines the validity period for the message.  The  SignatureValidity  TLV MUST be included when the Signature TLV is included. If the message is received outside the defined validity period, the device MUST ignore the message.</t>
          </li>
        </ol>
        <t>If either of the Signing TLVs are missing from a message payload, the device MUST ignore the message.</t>
        <t>Additional layer 2, 3, or 4 security mechanisms may be utilized to meet the requirements of specific deployment models (Wi-SUN layer 2 security, VPN at layer 3, DTLS at layer 4, etc.).  Details of these additional security mechanisms are out of scope of this specification.</t>
        <section anchor="signature-exemption">
          <name>Signature Exemption</name>
          <t>For situations in which a request payload signature adds overhead without improving security, the Signing TLVs may be elided for certain payloads. For example, the overhead of signing each block of a firmware update may be unnecessary as a full image integrity check is performed over the entire file and reported to the NMS.</t>
          <t>The signature exemptible TLVs are:</t>
          <ol spacing="normal" type="1"><li>
              <t>ImageBlock</t>
            </li>
            <li>
              <t>DescriptionRequest</t>
            </li>
          </ol>
          <t>The NMS MAY elide the Signing TLVs provided the request body contains only exemptible TLVs.  Otherwise, the Signing TLVs MUST be included.</t>
          <t>A device MAY accept incoming message payloads without Signing TLVs provided the payload contains only exemptible TLVs.</t>
        </section>
      </section>
      <section anchor="device-groups">
        <name>Device Groups</name>
        <t>CSMP groups are used to support multicast messaging to devices.</t>
        <t>A group is uniquely defined by a group-type/group-id pair. A device MAY be a member of multiple group-types, but MUST be a member of only one group-id within a group-type.  A device MUST support membership in at least two group types.</t>
        <t>The NMS assigns a device to a group using the GroupAssign TLV. On initial boot, a device has no group assignments. To be assigned to a device group, a GroupAssign TLV MUST be sent to the device either by a POST request from the NMS or within the response to the device's registration request to the NMS.</t>
        <t>The NMS removes a device from a group by POST-ing a GroupEvict TLV to the device.</t>
        <t>If a device's group assignment is changed at the NMS, upon receipt of the next metrics report from the device, the NMS MUST POST a new GroupAssign TLV to the device.</t>
        <t>Group assignments are not additive.  Assignments MUST be replaced upon receipt of a subsequent GroupAssign TLV.</t>
        <t>A GroupAssign TLV MUST NOT be sent within a multicast message.</t>
        <t>A GroupEvict TLV MUST NOT be sent within a multicast message.</t>
        <t>Devices MUST maintain group assignments in durable storage (across power cyclings / reboots).</t>
        <t>CSMP multicast messages MUST contain a GroupMatch TLV.  Upon receipt of a multicast CSMP message:</t>
        <ol spacing="normal" type="1"><li>
            <t>A device MUST process the message if the contained GroupMatch TLV matches a group to which the device is assigned.</t>
          </li>
          <li>
            <t>A device MUST ignore the message if the message does not contain a GroupMatch TLV.</t>
          </li>
          <li>
            <t>A device MUST ignore the message if the GroupMatch TLV does not match a device group assignment.</t>
          </li>
        </ol>
        <section anchor="reserved-group-types">
          <name>Reserved Group Types</name>
          <t>Group type 1 is reserved for configuration.</t>
          <t>Group type 2 is reserved for firmware.</t>
        </section>
      </section>
      <section anchor="device-tlv-processing-order">
        <name>Device TLV Processing Order</name>
        <t>A device processes message payload TLVs in the following order:</t>
        <ol spacing="normal" type="1"><li>
            <t>If present, the Signature and SignatureValidity TLVs MUST be processed first.</t>
          </li>
          <li>
            <t>If present, the GroupMatch TLV MUST be processed next.</t>
          </li>
          <li>
            <t>The remaining payload TLVs MUST be processed in the order they appear in the payload.</t>
          </li>
          <li>
            <t>TLVs within a payload SHOULD NOT be duplicated.  In the case of a duplicate TLV, the last payload instance of TLV MUST be used.</t>
          </li>
          <li>
            <t>The index field of a TLV table entry is used to determine uniqueness of the TLV.  TLVs with identical index values MUST be considered to be duplicates (table entry TLVs are identified in <xref target="csmpComp"/>.</t>
          </li>
          <li>
            <t>TLV specific error handling is described in the OpenAPI definitions.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="functional-description">
      <name>Functional Description</name>
      <t>This section describes the major operational flows of the CSMP protocol.</t>
      <section anchor="device-lifecyle-states">
        <name>Device Lifecyle States</name>
        <t>For understanding of CSMP device behavior, it is helpful to consider the NMS' view of device states and state transitions (presented below).</t>
        <t>The NMS views a device as transitioning through the following states:</t>
        <figure>
          <name>NMS View of Device State</name>
          <artset>
            <artwork type="ascii-art"><![CDATA[
                                                   
,--------.   ,---------.   ,-------------.   ,-----.   ,------.
| *start |-->| Unheard |-->| Registering |-->| Up  |-->| Down |
|        |   |         |   |             |<--|     |<--|      |
`--------'   `---------'   |             |   `-----'   |      |
                           |             |<------------|      |
                           `-------------'             `------'

    ]]></artwork>
          </artset>
        </figure>
        <ol spacing="normal" type="1"><li>
            <t>A device pre-populated into the NMS prior to deployment exists in the Unheard state.</t>
          </li>
          <li>
            <t>Upon receipt of a device registration request, the NMS records the device's presence on the network and the device enters the Registering state. The NMS responds with a Registration ACK payload containing configuration for the device.</t>
          </li>
          <li>
            <t>The device transitions to the Up state upon NMS receipt of a device metrics report (indicating device configuration was successful).   This is the normal operating state of a healthy device.</t>
          </li>
          <li>
            <t>If subsequent metrics reports are lost (poor network conditions, device failure, etc.), the device transitions to the Down state. NMS receipt of a new metrics report transitions the device back to the Up state.</t>
          </li>
          <li>
            <t>From the Up or Down state, a device may issue new registration requests due to a variety of reasons discussed below.</t>
          </li>
        </ol>
      </section>
      <section anchor="nms-discovery">
        <name>NMS Discovery</name>
        <t>A device requires the &lt;nms-base-url&gt; of its NMS.  Acquisition of the NMS URL may be accomplished via a variety of means including a DHCP option, pre-deployment administrative configuration setting, etc. The specific mechanism to be used is beyond the scope of this specification.</t>
        <t>For devices using DHCPv6 address assignment, a device MAY request DHCPv6 option 26484 sub-option 1 to obtain the URL of its NMS.</t>
      </section>
      <section anchor="device-registration-and-configuration">
        <name>Device Registration and Configuration</name>
        <t>Registration is the messaging flow via which a device announces its entry onto the network and provides a means for the NMS to push configuration information to the device.</t>
        <t>A device registers with an NMS by issuing a registration request to an NMS.  The NMS subsequently responds to reject or accept the registration, with device configuration included in a successful registration response.  A device issues a registration request for a variety of reasons:</t>
        <ol spacing="normal" type="1"><li>
            <t>A device MUST register when the device reboots (power cycled or receipt of RebootRequest TLV from the NMS).</t>
          </li>
          <li>
            <t>A device MUST register when its IP address has changed (usually indicating a network re-join).</t>
          </li>
          <li>
            <t>A device MUST register if its mesh parent has changed (mesh networks only).</t>
          </li>
          <li>
            <t>A device MUST register if it detects the NMS IP address has changed.</t>
          </li>
          <li>
            <t>A device MUST register upon receipt of NMSRedirectRequest TLV from the NMS.  This can be caused by the removal of a device from the NMS inventory but the device continues to communicate with a Session ID now unknown to the NMS.</t>
          </li>
        </ol>
        <t>A device and NMS implement the registration messaging flow depicted in Figure 2.</t>
        <figure>
          <name>Device Registration, Configuration, and Metrics</name>
          <artset>
            <artwork type="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e9c763102bee617e4f6f6a526d39de081660a25f/RegistrationConfigurationMetrics.svg?raw=true"/>
            <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
          </artset>
        </figure>
        <section anchor="device-registration-request">
          <name>Device Registration Request</name>
          <t>A device MUST implement two configurable parameters used to control the registration process, initially set at manufacture time, and MUST be maintained in durable storage.</t>
          <ol spacing="normal" type="1"><li>
              <t>tIntervalMin defaults to 300 seconds (5 minutes). Also configurable via TLV 42/regIntervalMin field.</t>
            </li>
            <li>
              <t>tIntervalMax defaults to 3600 seconds (1 hour). Also configurable via TLV 42/regIntervalMax field.</t>
            </li>
          </ol>
          <t>A device MUST issue registration requests using the following algorithm.</t>
          <artwork><![CDATA[
    Set tInterval = tIntervalMin.
    Wait an initial period between 0 and tInterval seconds.
    Do {
      1. Wait tBackoff seconds, where tBackoff is a random
        interval between tInterval/2 and tInterval seconds. 
        A tBackoff value in the latter half of the interval 
        ensures a minimum time between successive registration 
        attempts.
      2. Send new CoAP CON POST request to NMS <nms-base-url>/r.  
        The message payload MUST contain the registration TLVs 
        described in section 3.3.1.2.
      3. Wait the remaining (tInterval - tBackoff) seconds.
      4. Set tInterval to 2 * tInterval. 
        If tInterval is greater than tIntervalMax, 
        set tInterval to tIntervalMax.
    } While the device has not received ACK to its registration POST.
]]></artwork>
          <t>An example execution of a full registration POST retry sequence is presented in <xref target="appendixA"/>.</t>
          <t>If the device receives an ACK message with CoAP response code 2.03 (valid) from the NMS at any time before the device's next registration POST, the TLVs within the ACK message MUST be processed.</t>
        </section>
        <section anchor="registration-post-payload">
          <name>Registration POST Payload</name>
          <t>The following TLVs MUST be included in the device registration POST to the NMS:</t>
          <ol spacing="normal" type="1"><li>
              <t>DeviceID (primary identifier of the device).</t>
            </li>
            <li>
              <t>CurrentTime (used to validate device local time).</t>
            </li>
          </ol>
          <t>Previously registered devices SHOULD already have (durably stored) values for the Session ID, GroupInfo,and ReportSubscribe TLVs and MUST include these TLVs in the device registration POST to the NMS:</t>
          <ol spacing="normal" type="1"><li>
              <t>SessionID</t>
            </li>
            <li>
              <t>GroupInfo (one per group)</t>
            </li>
            <li>
              <t>ReportSubscribe</t>
            </li>
          </ol>
          <t>The following Device Information TLVs MUST be included in the registration POST:</t>
          <ol spacing="normal" type="1"><li>
              <t>HardwareDesc</t>
            </li>
            <li>
              <t>InterfaceDesc (one per interface)</t>
            </li>
            <li>
              <t>IPAddress (one per address)</t>
            </li>
            <li>
              <t>NMSStatus (reason for the registration operation)</t>
            </li>
            <li>
              <t>WPANStatus</t>
            </li>
            <li>
              <t>RPLSettings</t>
            </li>
          </ol>
          <t>Note that the SessionID, GroupAssign, and ReportSubscribe TLV set is considered to be generic device Configuration.  The Configuration TLV set is technology specific and MAY be extended with additional technology specific TLVs (beyond the scope of this specification).</t>
        </section>
        <section anchor="nms-registration-response">
          <name>NMS Registration Response</name>
          <t>Upon receipt of a registration request, the NMS looks up the information for the device identified by DeviceID to confirm correctness of the request.  See <xref target="csmpNms"/> for details of DeviceID and SessionID validation and related error response codes.</t>
          <t>If the device is found in inventory, authorized to register, and all other registration request content is confirmed to be valid, the NMS MUST send an ACK response message with response code 2.03(Valid)to the device.  The ACK takes one of two forms, depending upon whether or not the NMS will redirect the device to another NMS.</t>
          <t>In the case where the NMS is not redirecting, the response body to a valid registration request contains the following TLVs:</t>
          <ol spacing="normal" type="1"><li>
              <t>SessionID MUST be elided from the ACK if the SessionID  contained in the registration request is correct, otherwise the correct SessionID TLV MUST be included in the ACK.</t>
            </li>
            <li>
              <t>GroupAssign MUST be elided from the ACK if the GroupAssign  contained in the registration request is correct, otherwise the correct GroupAssign TLV MUST be included in the ACK.</t>
            </li>
            <li>
              <t>ReportSubscribe MUST be elided from the ACK if the ReportSubscribe contained in the registration request is correct, otherwise the correct ReportSubscribe TLV MUST be included in the ACK.</t>
            </li>
            <li>
              <t>Signing TLVs MUST be included.</t>
            </li>
          </ol>
          <t>In the case where the NMS is redirecting, the response body to a valid registration request contains the following TLVs:</t>
          <ol spacing="normal" type="1"><li>
              <t>NMSRedirectRequest MUST be included.</t>
            </li>
            <li>
              <t>Signing TLVs MUST be included.</t>
            </li>
          </ol>
          <t>When the response contains a SessionID TLV, the device MUST durably store this TLV and SessionID TLV MUST be included in all future CSMP requests to the NMS.</t>
          <t>When the response contains a GroupAssign TLV, the device MUST durably store the group-id (overwriting any other stored group-id for the same group-type) and MUST use the new GroupAssign values for comparison with all future receipt of GroupMatch TLVs.</t>
          <t>When the response contains a ReportSubscribe TLV, the device MUST begin reporting the indicated metrics TLVs (ignoring any TLVs requested by the ReportSubscribe which are unknown to the device).</t>
          <t>The NMS includes the NMSRedirectRequest TLV in a registration response to request the device register with an alternate NMS instance (load balancing, etc.). Upon receipt of this TLV, the device MUST cease registration attempts with the original NMS and start the registration process with the NMS indicated in the NMSRedirectRequest TLV.  If registration succeeds with this new NMS, all subsequent device CSMP messaging MUST be directed to this new NMS.   Note that device receipt of NMSRedirectRequest TLV is a one-time redirect and not persisted across device restarts.</t>
        </section>
        <section anchor="registration-complete">
          <name>Registration Complete</name>
          <t>The NMS considers device registration to be complete when all of the following conditions are met:</t>
          <ol spacing="normal" type="1"><li>
              <t>The registration ACK to the device indicates code 2.03 (Valid) and message ID match is confirmed as described in CoAP.</t>
            </li>
            <li>
              <t>The ACK response body does not contain an NMSRedirectRequest TLV.</t>
            </li>
            <li>
              <t>The first metrics report from the device is received by the NMS.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="device-metrics-reporting">
        <name>Device Metrics Reporting</name>
        <t>Upon receipt of a ReportSubscribe TLV, a device configures as many as two metrics reports:</t>
        <ol spacing="normal" type="1"><li>
            <t>A primary metrics report using the interval and TLV ID set.</t>
          </li>
          <li>
            <t>A secondary metrics report using the heartbeat interval and heartbeat TLV ID set.</t>
          </li>
        </ol>
        <t>The primary metrics report MUST be used for mains powered devices (with the secondary report disabled).  To conserve power, metrics reporting for low power devices MAY be split across primary and secondary reports, with the primary report configured to provide TLVs needed at more frequent interval and the secondary configured for TLVs required at a more relaxed interval.</t>
        <t>A device configures metrics parameters to control the device's primary metrics report as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>tMetricsInterval (how often a device MUST report its metrics) is typically set between 5 minutes and 8 hours (depends on application requirements). Designated by the interval field of the ReportSubscribe TLV.</t>
          </li>
          <li>
            <t>tlvList (the list of TLVs the device MUST report) is designated by the tlvId field of the ReportSubscribe TLV.</t>
          </li>
        </ol>
        <t>A device configures metrics parameters to control a device's secondary metrics report as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>tMetricsInterval is designated by the intervalHeartBeat field of the ReportSubscribe TLV.</t>
          </li>
          <li>
            <t>tlvList is designated by the tlvIdHeartBeat field of the ReportSubscribe TLV.</t>
          </li>
        </ol>
        <t>The TLV content of the primary and secondary metrics reports are deployment and application specific.  For example, the primary metrics report for a 6LoWPAN, mains-powered mesh node might be configured as:</t>
        <ol spacing="normal" type="1"><li>
            <t>InterfaceMetrics</t>
          </li>
          <li>
            <t>GroupInfo</t>
          </li>
          <li>
            <t>FirmwareImageInfo</t>
          </li>
          <li>
            <t>Uptime</t>
          </li>
          <li>
            <t>LowpanPhyStats</t>
          </li>
          <li>
            <t>DifServMetrics</t>
          </li>
          <li>
            <t>ReportSubscribe</t>
          </li>
        </ol>
        <t>TLV content of the secondary metrics report is similarly application specific and beyond the scope of this specification.</t>
        <t>For each configured metrics report, a device MUST commence reporting immediately after receipt of a successful registration ACK by sending a NON POST to &lt;nms-url&gt;/c containing the following TLVs:</t>
        <ol spacing="normal" type="1"><li>
            <t>SessionID</t>
          </li>
          <li>
            <t>CurrentTime</t>
          </li>
          <li>
            <t>The TLVs from tlvList. The entirety of all table entries MUST be included.</t>
          </li>
        </ol>
        <t>Following the initial metrics report, the device MUST implement the following algorithm for subsequent metric reports (for both primary and secondary report):</t>
        <artwork><![CDATA[
    Send a new CoAP NON POST to <nms-url>/c with required metrics TLVs.
    Wait initial random interval between 0 and tMetricsInterval seconds.
    Do {
        1. Wait tMetricsBackoff seconds, where tMetricsBackoff is 
          random value between tMetricsInterval/2 and tMetricsInterval
          seconds.
        2. Send a new CoAP NON POST message to <nms-url>/c 
          with the required metrics TLVs
        3. Wait the remaining (tMetricsInterval - tMetricsBackoff) 
          seconds so that the full tMetricsInterval has expired.
    } While the device has a valid IP address.
]]></artwork>
      </section>
      <section anchor="device-firmware-update">
        <name>Device Firmware Update</name>
        <t>CSMP defines a device firmware update process optimized for LPWANs. A key aspect of this process is the separation of image placement on a device from activation (execution) of the image on the device.</t>
        <t>The device firmware update process consists of three sub-flows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Firmware download.  A new image is placed on one or more members of a device group.</t>
          </li>
          <li>
            <t>Image load.  Activate an image on one or more members of a device group at a scheduled time.</t>
          </li>
          <li>
            <t>Set backup image.  Optional designation of an image to be used when load of all other images fails.</t>
          </li>
        </ol>
        <t>A device should implement the following mechanisms in support of firmware update:</t>
        <ol spacing="normal" type="1"><li>
            <t>It is RECOMMENDED that vendors implement digital signing of images prior to image release to production.</t>
          </li>
          <li>
            <t>It is RECOMMENDED that a device implement a secure bootloader which (upon device receipt of a LoadRequest TLV or at device power-up) validates the activated image's signature, loads the image from durable storage into operating memory, and transfers execution to the image.  Specific details of image signing and the secure bootloader are left to the vendor beyond the scope of this specification.</t>
          </li>
          <li>
            <t>A device MUST be capable of storing at least two firmware images: the running image and at least one additional image.</t>
          </li>
          <li>
            <t>It is RECOMMENDED that a device also support a backup image. A device boots into the backup image when the device is unable to boot into any other image.</t>
          </li>
          <li>
            <t>A device MUST be capable of scheduling an image load (activation) at a specific future time (i.e. the device must maintain a time source).</t>
          </li>
        </ol>
        <section anchor="firmware-image-format">
          <name>Firmware Image Format</name>
          <t>A CSMP firmware image file consists of three main parts: a CSMP defined image header, the vendor defined image binary, and the vendor defined image signature (as depicted below).</t>
          <table>
            <name>Firmware Image Format</name>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Size (octets)</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left">Begin Header</td>
              </tr>
              <tr>
                <td align="left">Header Version</td>
                <td align="left">4</td>
                <td align="left">32 bit unsigned integer which MUST be set to 2.</td>
              </tr>
              <tr>
                <td align="left">Header Length</td>
                <td align="left">4</td>
                <td align="left">32 bit unsigned integer which MUST be set to 256.</td>
              </tr>
              <tr>
                <td align="left">App Rev Major</td>
                <td align="left">4</td>
                <td align="left">Vendor specific 32 bit unsigned integer which is set to indicate the major revision number of the application image.</td>
              </tr>
              <tr>
                <td align="left">App Rev Minor</td>
                <td align="left">4</td>
                <td align="left">Vendor specific 32 bit unsigned integer which is set to indicate the minor revision number of the application image.</td>
              </tr>
              <tr>
                <td align="left">App Build</td>
                <td align="left">4</td>
                <td align="left">Vendor specific 32 bit unsigned integer which is set to indicate the build of the application image.</td>
              </tr>
              <tr>
                <td align="left">App Length</td>
                <td align="left">4</td>
                <td align="left">32 bit unsigned integer which MUST be set to the octet length of the Header + Image Binary field.</td>
              </tr>
              <tr>
                <td align="left">App Name</td>
                <td align="left">32</td>
                <td align="left">Vendor specific 32 octet string which is set to indicate the name of the application.</td>
              </tr>
              <tr>
                <td align="left">App SCC Branch</td>
                <td align="left">32</td>
                <td align="left">Vendor specific 32 octet string which is set to indicate the source code control system branch ID.</td>
              </tr>
              <tr>
                <td align="left">App SCC Commit</td>
                <td align="left">8</td>
                <td align="left">Vendor specific 8 octet string which is set to indicate the source code control system commit ID.</td>
              </tr>
              <tr>
                <td align="left">App SCC Flags</td>
                <td align="left">4</td>
                <td align="left">Vendor specific 32 bit unsigned integer which is set to indicate the source code control system build flags.</td>
              </tr>
              <tr>
                <td align="left">App Build Date</td>
                <td align="left">16</td>
                <td align="left">Vendor specific 16 octet string which is set to indicate the build date and time of the application image.</td>
              </tr>
              <tr>
                <td align="left">hwid</td>
                <td align="left">32</td>
                <td align="left">32 octet field which is RECOMMENDED to be set to a concatenation of a unique manufacturer ID and product model identifier.</td>
              </tr>
              <tr>
                <td align="left">sub_hwid</td>
                <td align="left">32</td>
                <td align="left">32 octet field which MAY be set for a manufacturer specific purpose, or functionally elided by filling with 0x20 (ASCII space character).</td>
              </tr>
              <tr>
                <td align="left">kernel_rev</td>
                <td align="left">16</td>
                <td align="left">16 octet field which MAY be set for a manufacturer specific purpose, or functionally elided by filling with 0x20 (ASCII space character).</td>
              </tr>
              <tr>
                <td align="left">sub_kernel_rev</td>
                <td align="left">16</td>
                <td align="left">16 octet field which MAY be set for a manufacturer specific purpose, or functionally elided by filling with 0x20 (ASCII space character).</td>
              </tr>
              <tr>
                <td align="left">Reserved</td>
                <td align="left">44</td>
                <td align="left">Pad to 256 octets, octets MUST be set to 0.</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left">End Header, Begin Image</td>
              </tr>
              <tr>
                <td align="left">Image Binary</td>
                <td align="left">Variable</td>
                <td align="left">Vendor specific image data.</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left">End Image, Begin Signature</td>
              </tr>
              <tr>
                <td align="left">Signature     Variable</td>
                <td align="left">Vendor specific image signature.</td>
                <td align="left">Calculated over entire content of this structure except the signature and pad fields.</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left">End Signature, Begin Pad</td>
              </tr>
              <tr>
                <td align="left">Pad</td>
                <td align="left">Variable</td>
                <td align="left">Optional pad field to enable image to fill vendor specific flash memory boundary.  When present, octets MUST be set to 0xFF.</td>
              </tr>
            </tbody>
          </table>
          <t>All multi-octet fields are encoded as little-endian.</t>
        </section>
        <section anchor="firmware-download">
          <name>Firmware Download</name>
          <t>An NMS implements the messaging flow depicted in Figure 3 and Figure 4 to download an image to a group of devices.  Unicast distribution is also supported, with the difference being use of unicast addresses, omission of the GroupMatch TLV and omission of the "a" query option.</t>
          <figure>
            <name>Firmware Download</name>
            <artset>
              <artwork type="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/aacaed091f902852e85446d63c393bbf62fc5885/FirmwareLoadA.svg?raw=true"/>
              <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
            </artset>
          </figure>
          <figure>
            <name>Firmware Download (cont)</name>
            <artset>
              <artwork type="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/aacaed091f902852e85446d63c393bbf62fc5885/FirmwareLoadB.svg?raw=true"/>
              <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
            </artset>
          </figure>
          <t>A firmware download begins with the NMS informing the device group of the meta-data of an image the NMS wishes to download, and the devices subsequently informing the NMS of the images already loaded on the devices.</t>
          <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>A GroupMatch TLV MUST be included for the desired group.</t>
            </li>
            <li>
              <t>The "a" option MUST be specified to randomize subsequent device responses.</t>
            </li>
            <li>
              <t>The request MAY contain an "r" option to redirect the subsequent TransferResponse.</t>
            </li>
            <li>
              <t>The request MUST contain a TranferRequest TLV (meta-data for the file to be downloaded)</t>
            </li>
            <li>
              <t>The request MUST contain the Signing TLVs.</t>
            </li>
          </ol>
          <t>Devices receiving a TransferRequest message:</t>
          <ol spacing="normal" type="1"><li>
              <t>MUST process the Signing TLVs and the GroupMatch TLV as described in section 2.6.</t>
            </li>
            <li>
              <t>MUST wait the specified period when the "a" option is included.</t>
            </li>
            <li>
              <t>MUST issue a NON POST request to &lt;nms-url&gt;/c which MUST contain the TransferResponse TLV.  The &lt;nms-url&gt; MUST be overridden by the "r" option if specified.</t>
            </li>
          </ol>
          <t>The NMS MUST proceed with image block transfer when at least one member of the target device group indicates Response Code of OK in the TransferResponse TLV.  Otherwise, the transfer MUST be aborted.</t>
          <t>Images are often multiple 100s of Kilobytes in size and likely require fragmentation into multiple blocks (N) to be transferred to a device.</t>
          <t>For the transfer of each image block, the NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>The request MUST contain the GroupMatch TLV for the desired group.</t>
            </li>
            <li>
              <t>The request MUST contain an ImageBlock TLV</t>
            </li>
            <li>
              <t>The request MAY contain the Signing TLVs.</t>
            </li>
          </ol>
          <t>To determine image download progress, the NMS MUST periodically include a DescriptionRequest TLV, requesting the FirmwareImageInfo TLV, in the image block request.  It is RECOMMENDED that the NMS request the FirmwareImageInfo TLV at 10% increments of the image download.  The NMS MUST request the FirmwareImageInfo TLV with the transfer of the last block of the image.</t>
          <t>Devices receiving the image block request message:</t>
          <ol spacing="normal" type="1"><li>
              <t>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</t>
            </li>
            <li>
              <t>MUST cache the image block for final image assembly.</t>
            </li>
            <li>
              <t>When the FirmwareImageInfo TLV is requested, the device MUST wait the specified period when the 'a' option is included and MUST issue a NON POST request to &lt;nms-url&gt;/c which MUST contain the FirmwareImageInfo TLV (meta-data for files loaded on the device). The &lt;nms-url&gt; MUST be overridden by the "r" option if specified.</t>
            </li>
          </ol>
          <t>Receipt of the final FirmwareImageInfo TLV enables the NMS to confirm the integrity of the completely downloaded image.</t>
        </section>
        <section anchor="image-activation">
          <name>Image Activation</name>
          <t>The messaging flow for scheduling image activation across a group of devices and cancelling a scheduled image activation are depicted in Figure 5 and described below.  Unicast activation is also supported, with the difference being use of unicast addresses, omission of the GroupMatch TLV and omission of the "a" query option.</t>
          <figure>
            <name>Image Activation</name>
            <artset>
              <artwork type="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/0f91f16aec32bee2238dabf5a972169dc4d93c69/ActivationFirmware.svg?raw=true"/>
              <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
            </artset>
          </figure>
          <section anchor="image-load">
            <name>Image Load</name>
            <t>An NMS implements the following message flow to command devices to designate an image as the active executable and the time at which the image is to be activated.</t>
            <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>A GroupMatch TLV MUST be included for the desired group.</t>
              </li>
              <li>
                <t>The "a" option MUST be specified to randomize subsequent device responses.</t>
              </li>
              <li>
                <t>The request MAY contain an "r" option to redirect the subsequent LoadResponse.</t>
              </li>
              <li>
                <t>The request MUST contain a LoadRequest TLV (designating the image and time at which the image is to be activated).</t>
              </li>
              <li>
                <t>The request MUST contain the Signing TLVs.</t>
              </li>
            </ol>
            <t>Devices receiving a LoadRequest message:</t>
            <ol spacing="normal" type="1"><li>
                <t>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</t>
              </li>
              <li>
                <t>MUST wait the specified period when the "a" option is included.</t>
              </li>
              <li>
                <t>MUST issue a NON POST request to &lt;nms-url&gt;/c which MUST contain the LoadResponse TLV (indicating success or reason for failure). The &lt;nms-url&gt; MUST be overridden by the "r" option if specified.</t>
              </li>
            </ol>
          </section>
          <section anchor="cancel-image-load">
            <name>Cancel Image Load</name>
            <t>An NMS implements the following message flow to cancel a previously scheduled image activation.</t>
            <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>A GroupMatch TLV MUST be included for the desired group.</t>
              </li>
              <li>
                <t>The "a" option MUST be specified to randomize subsequent device responses.</t>
              </li>
              <li>
                <t>The request MAY contain an "r" option to redirect the subsequent CancelLoadResponse.</t>
              </li>
              <li>
                <t>The request MUST contain a CancelLoadRequest TLV (designating the image load to be cancelled).</t>
              </li>
              <li>
                <t>The request MUST contain the Signing TLVs.</t>
              </li>
            </ol>
            <t>Devices receiving a CancelLoadRequest message:</t>
            <ol spacing="normal" type="1"><li>
                <t>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</t>
              </li>
              <li>
                <t>MUST wait the specified period when the "a" option is included.</t>
              </li>
              <li>
                <t>MUST issue a NON POST request to &lt;nms-url&gt;/c which MUST contain the CancelLoadResponse TLV (indicating success or reason for failure). The &lt;nms-url&gt; MUST be overridden by the "r" option if specified.</t>
              </li>
            </ol>
          </section>
        </section>
        <section anchor="set-backup-image">
          <name>Set Backup Image</name>
          <t>An NMS implements the following message flow to command a device to designate a stored image as the backup image.</t>
          <figure>
            <name>Set Backup Image</name>
            <artset>
              <artwork type="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/0f91f16aec32bee2238dabf5a972169dc4d93c69/SetDefaultImage.svg?raw=true"/>
              <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
            </artset>
          </figure>
          <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>A GroupMatch TLV MUST be included for the desired group.</t>
            </li>
            <li>
              <t>The "a" option MUST be specified to randomize subsequent device responses.</t>
            </li>
            <li>
              <t>The request MAY contain an "r" option to redirect the subsequent SetBackupResponse.</t>
            </li>
            <li>
              <t>The request MUST contain a SetBackupRequest TLV (designating the image load to be cancelled).</t>
            </li>
            <li>
              <t>The request MUST contain the Signing TLVs.</t>
            </li>
          </ol>
          <t>Devices receiving a SetBackupRequest message:</t>
          <ol spacing="normal" type="1"><li>
              <t>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</t>
            </li>
            <li>
              <t>MUST wait the specified period when the "a" option is included.</t>
            </li>
            <li>
              <t>MUST issue a NON POST request to &lt;nms-url&gt;/c which MUST contain the SetBackupResponse TLV (indicating success or reason for failure). The &lt;nms-url&gt; MUST be overridden by the "r" option if specified.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="device-commands">
        <name>Device Commands</name>
        <t>Many TLVs served by a device are used by the NMS to interrogate the device for configuration state and operational  status.  There are, however, several TLVs which direct a device to execute internal actions.  Examples of these TLVs are PingRequest and RebootRequest.</t>
        <t>Usage of a command TLVs is illustrated with the following PingRequest example directed at a single device.</t>
        <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>A GroupMatch TLV MUST NOT be included for the designed device.</t>
          </li>
          <li>
            <t>The request MAY contain an "r" option to redirect the subsequent PingResponse.</t>
          </li>
          <li>
            <t>The request MUST contain a PingRequest TLV (describing the Ping action to be performed).</t>
          </li>
          <li>
            <t>The request MUST contain the Signing TLVs.</t>
          </li>
        </ol>
        <t>Devices receiving a PingRequest message:</t>
        <ol spacing="normal" type="1"><li>
            <t>MUST process the Signing TLVs as described in section 2.6.</t>
          </li>
          <li>
            <t>MUST begin the requested Ping operation.</t>
          </li>
        </ol>
        <t>The NMS will subsequently interrogate the device with one or more GET requests to the device for the  PingResponse TLV.</t>
        <t>Note the specific messaging exchanges vary per the definition of each commands.  Details are provided within <xref target="csmpTlvs"/>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Threat models and appropriate mitigations are highly specific to individual CSMP/LPWAN deployments.</t>
      <t>CSMP defines only the NMS signing of outgoing Device messaging using an NMS private key (for Device commands and firmware load). Signing TLVs included in the message payload enable signature verification by a Device using an NMS signing certificate\public key.  The verified signature provides source authentication integrity check of the message incoming to the Device. Lifecycle management of the public/private keypair is out of scope of the specification.</t>
      <t>Where additional security mechanisms are needed (source and integrity checking of Device to NMS communication, confidentially of CSMP messaging, authentication and authorization of CSMP actors, replay protection), additional layer 2, 3, or 4 security mechanisms are utilized to meet security requirements of a specific deployment. Examples include:</t>
      <ol spacing="normal" type="1"><li>
          <t>Layer 2 802.1X/EAP-TLS is used to provide mutual authentication of Device and NMS as well as distribution of key material to be used with IEEE 802.15.4 frame security (providing confidentially, source authentication, and replay protection).</t>
        </li>
        <li>
          <t>Layer 3 VPN may be used to provide confidentially, source authentication, and message integrity for messaging between Device and NMS.</t>
        </li>
        <li>
          <t>Layer 4 DTLS may be used to provide confidentially, source authentication, and message integrity for messaging between Device and NMS.</t>
        </li>
      </ol>
      <t>Specific usage profile details for these additional security mechanisms are out of scope of this specification.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requires no IANA actions.</t>
    </section>
    <section anchor="contributors">
      <name>Contributors</name>
      <t>This work is based upon the considerable efforts of CSMP's original designer Gilman Tolle (with contributions from Phil Buonadonna, and Sumit Rangwala).  The Editor further acknowledges the contributions made to the content of this document by the following individuals:</t>
      <ol spacing="normal" type="1"><li>
          <t>Jasvinder Bhasin, Cisco Systems, Inc. (jassi@cisco.com)</t>
        </li>
        <li>
          <t>Chris Hett, Landis+Gyr (Chris.Hett@landisgyr.com)</t>
        </li>
        <li>
          <t>Johannes van der Horst, MMB Networks (johannes.vanderhorst@mmbresearch.com)</t>
        </li>
        <li>
          <t>Klaus Hueske, Renesas (Klaus.Hueske@renesas.com).</t>
        </li>
        <li>
          <t>Hideyuki Kuribayashi, ROHM Semiconductor (Hideyuki.Kuribayashi@mnf.rohm.co.jp)</t>
        </li>
        <li>
          <t>Kit-Mui Leung, Cisco Systems, Inc. (kml@cisco.com)</t>
        </li>
        <li>
          <t>Huimin She, Cisco Systems, Inc. (hushe@cisco.com)</t>
        </li>
        <li>
          <t>Li Zhao, Cisco Systems, Inc. (liz3@cisco.com)</t>
        </li>
      </ol>
    </section>
    <section anchor="appendixA">
      <name>Appendix A Registration Retry Example</name>
      <ol spacing="normal" type="1"><li>
          <t>Device powers up.</t>
        </li>
        <li>
          <t>Device sets interval for 0 to 5 minutes.</t>
        </li>
        <li>
          <t>Device wait a random time between 2.5 and 5 minutes.</t>
        </li>
        <li>
          <t>Device sends a confirmable registration POST message.</t>
        </li>
        <li>
          <t>Device waits the rest of the interval until 5 minutes have passed.</t>
        </li>
        <li>
          <t>Device waits a random time between 5 and 10 minutes.</t>
        </li>
        <li>
          <t>Device sends the registration message again, with a new CoAP message ID.</t>
        </li>
        <li>
          <t>Device waits the rest of the interval until 10 minutes have passed.</t>
        </li>
        <li>
          <t>Device waits a random time between 10 and 20 minutes.</t>
        </li>
        <li>
          <t>Device sends the registration message again, with a new CoAP message ID.</t>
        </li>
        <li>
          <t>Device waits the rest of the interval until 20 minutes have passed.</t>
        </li>
        <li>
          <t>Device waits a random time between 20 and 40 minutes.</t>
        </li>
        <li>
          <t>Device sends the registration message again, with a new CoAP message ID.</t>
        </li>
        <li>
          <t>Device waits the rest of the interval until 40 minutes have passed.</t>
        </li>
        <li>
          <t>Device waits a random time between 40 and 60 minutes.</t>
        </li>
        <li>
          <t>Device sends the registration message again, with a new CoAP message ID.</t>
        </li>
        <li>
          <t>Device waits the rest of the interval until 60 minutes have passed.</t>
        </li>
        <li>
          <t>Repeat steps 15, 16, and 17 forever.</t>
        </li>
      </ol>
    </section>
    <section anchor="appendix-b-change-log">
      <name>Appendix B Change Log</name>
      <section anchor="draft-00-to-01">
        <name>draft 00 to 01</name>
        <ol spacing="normal" type="1"><li>
            <t>Abstract reworded to clarify multi-vendor aspects of CSMP.</t>
          </li>
          <li>
            <t>Introduction reworded to clarify multi-vendor aspects of CSMP.</t>
          </li>
          <li>
            <t>OpenAPI definitions are placed in-line.</t>
          </li>
          <li>
            <t>Protocol Buffer Definitions are placed in-line.</t>
          </li>
          <li>
            <t>Due to IETF author limits, all authors except the Editor have been credited in the Contributors section.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-01-to-02">
        <name>draft 01 to 02</name>
        <ol spacing="normal" type="1"><li>
            <t>"Cisco" added to title as requested.</t>
          </li>
          <li>
            <t>There are no IP disclosures to be made for this work. This point has been confirmed by Cisco legal.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-02-to-03">
        <name>draft 02 to 03</name>
        <ol spacing="normal" type="1"><li>
            <t>Trial attempt to convert Figures 2 and 6 to ASCII Art using PlantUML.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-03-to-04">
        <name>draft 03 to 04</name>
        <ol spacing="normal" type="1"><li>
            <t>Formatted OpenAPI and Protocol Buffer content to fit 72 char margin.  NOTE due to limits on URL length, the OpenAPI content no longer will compile without modification.  Reader should refer to source URLs for actual working OpenAPI definitions.</t>
          </li>
          <li>
            <t>Removed -03 Figures 2 and 6 sequence diagram ASCII Art (generated from PlantUML ... still too wide) and restored the SVG.</t>
          </li>
          <li>
            <t>Converted Figure 1 state machine SVG to ASCII art (gag).</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-04-to-05">
        <name>draft 04 to 05</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision while associated code base work progresses.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-05-to-06">
        <name>draft 05 to 06</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision while associated code base work progresses.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-06-to-07">
        <name>draft 06 to 07</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision while open source code base integrates FreeRTOS contributions.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-07-to-08">
        <name>draft 07 to 08</name>
        <ol spacing="normal" type="1"><li>
            <t>Added Vendor Defined TLV details.</t>
          </li>
        </ol>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <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="PEN" target="https://www.iana.org/assignments/enterprise-numbers/assignment/apply/">
        <front>
          <title>Application for a Private Enterprise Number</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="PB" target="https://developers.google.com/protocol-buffers/docs/proto3">
        <front>
          <title>Protocol Buffers Version 3</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="OPENAPI" target="https://spec.openapis.org/oas/v3.0.0">
        <front>
          <title>OpenAPI Specification v3.0.0</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="CSMPNMS" target="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e0be5a31906eb3e9983e7cc28b24ed9482543784/CsmpNms-1.0.1.yaml">
        <front>
          <title>CSMP NMS Interface</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="CSMPDEV" target="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e0be5a31906eb3e9983e7cc28b24ed9482543784/CsmpDevice-1.0.1.yaml">
        <front>
          <title>CSMP Device Interface</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="CSMPCOMP" target="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e0be5a31906eb3e9983e7cc28b24ed9482543784/CsmpComponents-1.0.yaml">
        <front>
          <title>CSMP Components</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="CSMPMSG" target="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e0be5a31906eb3e9983e7cc28b24ed9482543784/CsmpTLVsPublic.proto">
        <front>
          <title>CSMP Payload Definitions</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC7252">
        <front>
          <title>The Constrained Application Protocol (CoAP)</title>
          <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
          <author fullname="K. Hartke" initials="K." surname="Hartke"/>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <date month="June" year="2014"/>
          <abstract>
            <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
            <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7252"/>
        <seriesInfo name="DOI" value="10.17487/RFC7252"/>
      </reference>
    </references>
    <?line 3384?>



  </back>
  <!-- ##markdown-source:
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
Xu9WBrAmWLm/gJfWJK3R7WXRFxnw3JqidR8BL6zdWruuACZnkX71hgLeWhio
XkrA2151TP1mxz+ofr/rHVW/tvBSu2CA1xZmancK8PrA8xoeWxgy+Dx45Wls
VuzQy9UOvYRxKOhQq3u4U/ntJfLDvUore3L2pQW8Oqg09c7osELVrypU/arb
fnXgfPHqsNKi0gNmzqqP093uVlr1Kr93Kr93K7/3Kr/3K78PvKMeep++cr/t
bre7cKDa524Fmm4Fmu4efHHgfHFYaVEZowdj9JwxepUxrCNL7pXw4Z5vAtZB
ZT9lFPgMUd3eYbsL55PVeqcHT16Z4Xe9y7bbtYFSV1n4Aj7fczrcwye7psM9
wNGeg6M9AGLPGnIfcAJczZY49uGJ1eIAWhw4owgbMTdm+GwHWllfyT60vjrs
truvTIve9na7t22vRm97B55YLbo+dPQsgcx+2mv3QFgy34LMABKO1aLXbfcs
ZPe8yO5ZyFaXffi0Zz+lLY5PAV5rRjvb3fYO7CFbTHFpdmd7D1ocOC0O4YnV
B+yDHWcf7FiypLo4xKeGUs1dIT7fq8xoR0RI+8lBe6dnqGSnB1DtOFDtAFQW
rnZ2ASqYqSVswOrtWnPf83KcvW3fWu1t97xPd9p7Fib2vKu/J6tvP+m197rW
dz3vdz0vJD34tmd9u1Ol2r2d2niwafcs3Ox56Whvt9ves/CzD/jad1Z+H/gi
ps1ULWzFXxVHds0uurrhbXiHuiJbt3TSddDKKInG82dHCSh6r1/rArZYSh0f
mZswUi51FWPSDckGmET3IZpwxTVEquJuYEbN0yuVCpQURO5nU1oCwJNg49u4
ffOBSoxO1P2aFLu6RKW1CG7fYO5znucMRAicIxrPOmVyX/wR0xHSlP4OSvB3
6v2XwYthNu0M42KYdYZ306KjTCZFR38r1qotmkmX/urrEoT/iPLMLvKESV2p
icKTzBOfYTfKdqFr2v2Ak4D2Vk1DSgy7IVnhxe66qaqt1kq44/d5NIvoSkQ+
ArDjEcyu+0dE0PNnP1kz6NFfV3k8xYqwVk5HLpuqb6l098sno1Py0mSyNEJT
yuMs+k5ZYH/glYKebuS2wjH6nnw4bYM0zNcQ4t84j9MS1CrshieCj38y/ccj
T+9oThQTlTUxMezo4qTuePyxII6w1tOD2Xjbp78+iPkDb0thCtDFUPfspBPi
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
M+Qr/71DVd/SAaDsu6ZgIUeqi/ObteD2ZyH4/oaciwB53qsnhkJDFadYFfC2
BoidYcTps0E6+J6ohXpvGJl2KeuEjIoVh3Y79jt/R99j7zeP6bBh8OsIZpuS
tos5+lJOGImqffoSc0jdR8ozWupqmc26Coz26N7zF1EYDcl/++csDGi8RZZE
1cWxevaHeagFRAlttbG1wFaduUHMaE6cynYP9FINDuo92J3FbQDNRzWfBTZ3
ZK9gYC1sA3Q/g6yaJ7Ecdhsqr3xgEcXPXXIhuQbUelfdGtkrYmBcvQ8kO9GA
suerdBPi0ckZJ/Qn3izJe11X+qZ8uo2JI5U0ANBGEl9ke7yh+Nrk8qbvtivz
A8CjPCUEeKWHE3lPB3YpOU3cI87pwsvzKOnRZdo0BqdZy9IFY9g91BV8fdpk
4/Iz4+ftt6LgeyHX1wd5RJKg06f1qRcreK+tMqn7u7+mXtFQMWSPVroKZz9W
a6BKRw1KFV4vX+XZXR5OVx6PvwIq7l9duWPW+/Ny8+H4bhH+ZMAhSSIeZcj+
vB5Rr5b95NMwmuHm/ozrfvrt8bsmqL9F4/oou1OIIrJ1Adefe1d+CMxo+PES
1NRxkj00DXODjdjTHJv5hvF05F39k6u3TaO8uzq99HWtPmm8gjwUCd12maMw
CPZUwk/FKZ8Lj7YCrmRn3b1Qq5b4o8velU/RfytS66rhW0HgfCwI7FoqBC8V
sDkwKpWXT8USZHkEaYR6ePDEfqQvZjzMqLAfBSqZmI98I+cZrUGlsndvt5Lr
TW4SJC6H88nhnWk8jTGUELX3qMRTUPvHwfIkcTr/tApeLxilNkYLeAUQNgUy
3vBrNlw5oUr2h5a/lX1gSEE7T7f7we3RlZ248SD4cFxhTroent/MDOd9Y77n
06v7XfQ+52DHxkBHuxPvjktYyPUKDxwaifncRImumgnkUy9HnUVR3pyt2gEf
m3qht/rwx0jD+wbYr7DPRtDVh14R1VvloVLGoZZ9Nwd5zuvD1qaq51G+pSrY
Olk625L0cEsVkq2YeFFKtMU9Z2vtdp1cAna4G3+pd9uKOwe/vMYP1e31NgB4
87eb25Pz745P3vY/nN3qCzuc2e11/+Lm9Pa7i8vjE/0CJ3V20n9LT2k6mtoj
ikUbaqOFczqiqIp2o5O0zB37iC9CQgB4e3EczOaDJB5ivYeWg1hJlnPUt/J+
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
7XabLk2fP/v/Ac8GSaT41QEA

-->

</rfc>
