<?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.39 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duffy-csmp-11" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="CoAP Simple Management Protocol">Cisco's CoAP Simple Management Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-duffy-csmp-11"/>
    <author initials="P." surname="Duffy (ed)" fullname="Paul Duffy">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>paduffy@cisco.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="12"/>
    <area>General</area>
    <workgroup>Independant Submission</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 50?>

<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 56?>

<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 anchor="draft-08-to-09">
        <name>draft 08 to 09</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision while open source code base integrates FW update capabilities.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-09-to-10">
        <name>draft 09 to 10</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision as work continues on the open source code base.</t>
          </li>
        </ol>
      </section>
      <section anchor="draft-10-to-11">
        <name>draft 10 to 11</name>
        <ol spacing="normal" type="1"><li>
            <t>Keepalive revision as work continues on the open source code base.</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 3396?>



  </back>
  <!-- ##markdown-source:
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
2ICpUtEUWUgjIj5jJV2qi8qdNwUk5OQi0+Y4MBbS/2RcJNB+YO1p0QBwRYuo
RMHeaPbASazLY79xW4A3V8GrNX8f5iOM3jmG+az4iZae6RvDPRZ/dU2qDQZU
kea26lhXfeb7K7e/zublqr1bfHPFL66vzm5kdV6uOPEPGAq68nwVboUe1ps2
QKe+W3VZTqMoOtzudT/dUKTyquPJV91YPlt1uG+v+hdrjXT8/uhq/4icxNf6
DriiXqjVv3gKDj6tOY76bm/3TRQC08dBV/0WFvg05VjnFb94K9F5p1NQp0+B
qa68VDePBcjfUbkOfOezZM3pcPMVQSJiWGeAE5Q/mfOsPG/6Zh0WSh+sy9j4
ozWmIlH311kSrTyVC149fcvZoLyuc6hJfIAIK8onuG6sqMtSlpT/lHNNqWw/
g7Wr/36lk/GXOeHWZVNrc1z7iKtr6yvyDqWArDgmuf8Qd3qqMOEjcGM8+MwU
7sYn2Yrq0+n7SSjrU+6mJyNttX2nMSYsY3VCvY5YoTAfGtHaUeyesD7GNcq6
drE+IHWPUlFIfoIiLucckhTMMRxDR0+B3jMM0yAbDud50OlYQnnXCtZ3TfRN
vsTkFXdUNYk0Nt7pBH3bxs/2EhlDJdyofbVb+cq1pvjH+gVViDU5s5cufokd
8isx8P95is3vWa9Z7bsrmIfi/2uL8z9LEfqnGvS7VIPWFTDOsodZmJ6Hw3XA
4o+uJo9rouIWo/TGUb4mxZ5l4WjNT44QZckTPoQZvQmHH+ezNb+rq5+/P+Xz
V9A9f1HNU2DyiVbrGy3r0lWTxfJIxc39bJPlkyWC9Q8tPhjWGiMaZNmacK3P
dZ/KRU3cxK/Go9ZBBG37N0k2/LgWT1tnCJulrSdNao621mfViJd1v1u3/brH
t2UmWpltEqt9qrVL+A6FgqykatN9CPmHPIVZ/E7NMuvJ57+yOPxbm5zXtVau
tO+jvHwzxwv6l4qyFC32k2QlSoR2gZXRZeQSZaBTYnBWDU4pO6LgdDQnYKpC
yl+QxZLg1nVMz+BnTp6WwyxJlNecGoqzi/1vVs+fbFj6p17/v1yvX4dYnmAJ
eIrE90/rwf9468Fatnb64gQY76oEtLYg/9/EovG/W1v4p2Xnv50C9RTL03qS
6/oqWk3W/UUMYmsqgv9j7Gc/33OD/9XBupeUOi3YANl/M5iZWBLO1o3xMnZ6
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
7b3dbtP98vNn/z/w95HSIdcBAA==

-->

</rfc>
