<?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.6.17 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duffy-csmp-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.1 -->
  <front>
    <title abbrev="CoAP Simple Management Protocol">Cisco's CoAP Simple Management Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-duffy-csmp-03"/>
    <author initials="P." surname="Duffy (ed)" fullname="Paul Duffy">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>paduffy@cisco.com</email>
      </address>
    </author>
    <date year="2022" month="October" day="24"/>
    <area>General</area>
    <workgroup>Independant Submission</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <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>
    <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 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>Onboarding.  Device startup registration and capabilities announcement with an NMS.</li>
        <li>Configuration management. Device acquisition of configuration from the NMS. Subsequent NMS configuration reads and updates to the device.</li>
        <li>Metrics reporting. Periodic device metrics reporting to the NMS. NMS on-demand metrics requests to a device.</li>
        <li>NMS commanded device operations. NMS command issuance to a single device or group of devices.</li>
        <li>Secure device firmware update.</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>The basic concepts of RESTful architecture.</li>
        <li>The operation, message formats, and terminology of CoAP <xref target="RFC7252"/>.</li>
        <li>Protocol Buffers <xref target="PB"/>, which is used to describe and encode CSMP message payloads.</li>
        <li>OpenAPI <xref target="OPENAPI"/> is the interface definition language used to define CSMP Device and NMS interfaces.</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>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.</li>
          <li>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).</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>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"/>.</li>
          <li>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).</li>
          <li>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"/>.</li>
          <li>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).</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://virtserver.swaggerhub.com/woobagooba/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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/TLVsGETFromDevice'
                - $ref: 'https://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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 and in order) ...
        1. Signature – verify the message signature.
        2. SignatureValidity – verify if the signature is still valid. 
        3. GroupMatch – check if the device belongs to the group for which the packet is intended.
        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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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://virtserver.swaggerhub.com/woobagooba/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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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://api.swaggerhub.com/domains/woobagooba/CSMPComponents/1.0#/components/schemas/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>/o</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>
          <section anchor="standard-tlvs">
            <name>Standard TLVs</name>
            <t>The message payloads of CSMP requests and responses MUST be formatted as a sequence of Type-Length-Value objects. Each TLV object has 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="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 for generic and RF Mesh device management.
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;

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

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

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

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

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

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

// TLV 7
// Session ID used by NMS to track device CSMP messaging.
// Assigned by the NMS, and 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 values of the requested TLVs will be sent to the NMS asynchronously.
// Class:: Generic
//

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

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

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

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

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

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

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

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

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

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

// 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 {
    uint32 posix = 1; // posix timestamp
  }
  oneof iso8601_present {
    string iso8601 = 2; // iso 8601 timestamp
  }
  oneof source_present {
    uint32 source = 3; // time service from. 1: local; 2: admin; 3: network
  }
}

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

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

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

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

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

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

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

message IPRouteRPLMetrics {
  oneof inetCidrRouteIndex_present {
    int32 inetCidrRouteIndex = 1; // refers to a particular index in the IPRoute table
  }
  oneof instanceIndex_present {
    int32 instanceIndex = 2; // Corresponding RPL instance of this route
  }
  oneof rank_present {
    int32 rank = 3; // advertised rank
  }
  oneof hops_present {
    int32 hops = 4; // not necessary now, but here so we can easily add later once we're propagating hops as a metric
  }
  oneof pathEtx_present {
    int32 pathEtx = 5;  // advertised path ethx
  }
  oneof linkEtx_present {
    int32 linkEtx = 6;  // next-hop link ETX
  }
  oneof rssiForward_present {
    sint32 rssiForward = 7; // forward RSSI value (relative to the device)
  }
  oneof rssiReverse_present {
    sint32 rssiReverse = 8; // reverse RSSI value (relative to the device)
  }
  oneof lqiForward_present {
    int32 lqiForward = 9; // forward LQI value
  }
  oneof lqiReverse_present {
    int32 lqiReverse = 10; // reverse LQI value
  }
  oneof dagSize_present {
    uint32 dagSize = 11; // nodes count of this pan (number of joined devices)
  }
  reserved 12 to 17; // Used by Itron.
  PhyModeInfo phyModeForward = 18; // forward phy mode value
  PhyModeInfo phyModeReverse = 19; // reverse phy mode value
}

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

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

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

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

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

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

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

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

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

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

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

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

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

  oneof dot1xEnabled_present {
    bool dot1xEnabled = 5; // Is dot1x enabled?
  }
  oneof securityLevel_present {
    uint32 securityLevel = 6; // security level
  }
  oneof rank_present {
    uint32 rank = 7;
  }
  oneof beaconValid_present {
    bool beaconValid = 8; // Is beacon valid (where invalid means receipt has timed-out/contact with PAN was lost)?  (PC frame for Wi-SUN)
  }  
  oneof beaconVersion_present {
    uint32 beaconVersion = 9; // beacon version (Wi-SUN PAN version).
  }
  oneof beaconAge_present {
    uint32 beaconAge = 10; // last heard beacon message in seconds  (PC frame for Wi-SUN).
  }
  oneof txPower_present {
    int32 txPower = 11; // transmit power value in dbm
  }
  oneof dagSize_present {
    uint32 dagSize = 12; // count of nodes joined to this PAN
  }
  oneof metric_present {
    uint32 metric = 13; // metric to border router (Wi-SUN Routing Cost)
  }
  oneof lastChanged_present {
    uint32 lastChanged = 14; // seconds since last PAN change (PAN ID change).
  }
  oneof lastChangedReason_present {
    uint32 lastChangedReason = 15; // 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.
  }
  oneof demoModeEnabled_present {
    bool demoModeEnabled = 16; // Is demo mode enabled?
  }
  oneof txFec_present {
    bool txFec = 17; // Is FEC enabled?
  }
  oneof phyMode_present {
    uint32 phyMode = 18; // phy operating mode value (as defined in section 5.2 of PHYWG Wi-SUN PHY Technical Specification - Amendment 1VA8)
  }
  reserved 19;
  repeated PhyModeInfo phyModeList = 20; // multi phy mode and transmit power value for adaptive modulation
}

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

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

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

message NMSSettings {
  oneof regIntervalMin_present {
    uint32 regIntervalMin = 1; // min interval of register trickle timer in seconds
  }
  oneof regIntervalMax_present {
    uint32 regIntervalMax = 2; // max interval of register trickle timer in seconds
  }
  // reserved = 3;
  // reserved = 4;
  // reserved = 5;
  // reserved = 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 {
    bool registered = 1; // True of device is registerd with NMS
  }
  oneof NMSAddr_present {
    bytes NMSAddr = 2; // IPv6 address of NMS
  }
  oneof NMSAddrOrigin_present {
    uint32 NMSAddrOrigin = 3;   // Mechanims used to get NMS's IPv6 address (fixed/DHCPv6/redirect by TLV6 ... values).
  }
  oneof lastReg_present {
    uint32 lastReg = 4; // time since last succesful registration in seconds
  }
  oneof lastRegReason_present {
    uint32 lastRegReason = 5; // 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.
  }
  oneof nextReg_present {
    uint32 nextReg = 6; // time to next registration attempt in seconds.
  }
  oneof NMSCertValid_present {
    bool NMSCertValid = 7; // True if NMS certificate is valid.
  }
}

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

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

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

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

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

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

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


// 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 a 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 NSM to the device.
// Note that a GroupAssign should not be sent over a 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 {
    uint32 inFrames = 1; // count for all received frames
  }
  oneof inFramesBeacon_present {
    uint32 inFramesBeacon = 2; // count for received beacon frames (Note: Wi-SUN does not use Beacon frames).
  }
  oneof inFramesData_present {
    uint32 inFramesData = 3; // count for received data frames
  }
  oneof inFramesAck_present {
    uint32 inFramesAck = 4; // count for received ack frames
  }
  oneof inFramesCmd_present {
    uint32 inFramesCmd = 5; // count for received command frames
  }
  oneof inFramesAsync_present {
    uint32 inFramesAsync = 6; // count for received async frames
  }
  oneof inFramesBcast_present {
    uint32 inFramesBcast = 7; // count for received broadcast frames
  }
  oneof inFramesUcast_present {
    uint32 inFramesUcast = 8; // count for received unicast frames
  }
  oneof outFrames_present {
    uint32 outFrames = 9; // count for all sent out frames
  }
  oneof outFramesBeacon_present {
    uint32 outFramesBeacon = 10; // count for sent out beacon frames
  }
  oneof outFramesData_present {
    uint32 outFramesData = 11; // count for sent out data frames
  }
  oneof outFramesAck_present {
    uint32 outFramesAck = 12; // count for sent out ack frames
  }
  oneof outFramesCmd_present {
    uint32 outFramesCmd = 13; // count for sent out command frames
  }
  oneof outFramesAsync_present {
    uint32 outFramesAsync = 14; // count for sent out async frames
  }
  oneof outFramesBcast_present {
    uint32 outFramesBcast = 15; // count for recesent outived broadcast frames
  }
  oneof outFramesUcast_present {
    uint32 outFramesUcast = 16; // count for sent out unicast frames
  }
}

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

message LowpanMacStats {
  LowpanMacCounters total = 1;  // total counter for lowpan mac layer
  LowpanMacCounters rf = 2;     // rf counter for lowpan mac layer
  reserved 3;                   // optional LowpanMacCounters plc = 3;
}

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

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

// TLV 65 - 75 are for firmware upgrade, detailed in CSMP specification.
//
message HardwareInfo {
  oneof hwId_present {
    string hwId = 1; // hardware information, max len 32
  }
  oneof vendorHwId_present {
    string vendorHwId = 2; // sub hardware information, max len 32
  }
}

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

message TransferRequest {
  HardwareInfo hwInfo = 1; // hardware information
  oneof fileHash_present {
    bytes fileHash = 2; // SHA256 hash value of image file, len 32
  }
  oneof fileName_present {
    string fileName = 3; // name of image file, max len 128
  }
  oneof version_present {
    string version = 4; // version number, man len 32
  }
  oneof fileSize_present {
    uint32 fileSize = 5; // total size of image file
  }
  oneof blockSize_present {
    uint32 blockSize = 6; // block size of image file
  }
  // reserved = 7;
  // reserved = 8;
  // reserved = 9;
  // reserved = 10;
  // reserved = 11;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 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 {
    uint32 total = 1; // reset count
  }
  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 {
    int32 sessionIndex = 1;  // session index
  }
  oneof protocol_present {
    uint32 protocol = 2; // 6 - TCP, 17 - UDP
  }
  oneof localAddress_present {
    bytes localAddress = 3; // ipv4 or ipv6 local address
  }
  oneof localPort_present {
    uint32 localPort = 4; // local port
  }
  oneof peerAddress_present {
    bytes peerAddress = 5; // ipv4 or ipv6 peer address
  }
  oneof peerPort_present {
    uint32 peerPort = 6; // peer port
  }
  oneof state_present {
    uint32 state = 7;
  }
  oneof role_present {
    uint32 role = 8; // 1 - server/incoming, 2 - client/outgoing
  }
}

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

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

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

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

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

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

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

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

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

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

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

message DHCP6Stats {
  oneof clientFramesSolicit_present {
    uint32 clientFramesSolicit = 1; // count for send out solicit packets
  }
  oneof clientFramesAdvertise_present {
    uint32 clientFramesAdvertise = 2; // count for send out advertise packets
  }
  oneof clientFramesRequest_present {
    uint32 clientFramesRequest = 3; // count for send out request packets
  }
  oneof clientFramesReply_present {
    uint32 clientFramesReply = 4; // count for send out reply packets
  }
  oneof relayFramesForward_present {
    uint32 relayFramesForward = 5; // count for DHCP relay packet which is forwarded by node
  }
  oneof relayFramesReply_present {
    uint32 relayFramesReply = 6; // count for DHCP relay packet which is relaied by node
  }
}

]]></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>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.</li>
          <li>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.</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>ImageBlock</li>
            <li>DescriptionRequest</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>A device MUST process the message if the contained GroupMatch TLV matches a group to which the device is assigned.</li>
          <li>A device MUST ignore the message if the message does not contain a GroupMatch TLV.</li>
          <li>A device MUST ignore the message if the GroupMatch TLV does not match a device group assignment.</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>If present, the Signature and SignatureValidity TLVs MUST be processed first.</li>
          <li>If present, the GroupMatch TLV MUST be processed next.</li>
          <li>The remaining payload TLVs MUST be processed in the order they appear in the payload.</li>
          <li>TLVs within a payload SHOULD NOT be duplicated.  In the case of a duplicate TLV, the last payload instance of TLV MUST be used.</li>
          <li>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"/>.</li>
          <li>TLV specific error handling is described in the OpenAPI definitions.</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="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/b75b04a851395ac25c26d94edaad4fe6716fa44f/Figure1.svg?raw=true"/>
            <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
          </artset>
        </figure>
        <ol spacing="normal" type="1"><li>Devices pre-populated into the NMS prior to deployment exist in the Unheard state.</li>
          <li>Upon receipt of a device registration request, the NMS records the device's presence on the network and the device enters the Registering state.</li>
          <li>NMS responds with a registration ACK payload containing configuration for the device.</li>
          <li>The device transitions to the Up state upon NMS receipt of a device metrics report.</li>
          <li>If subsequent metrics reports are lost (poor network conditions), the device transitions to the Down state. NMS receipt of a new metrics report transitions the device back to Up state.</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>A device MUST register when the device reboots (power cycled or receipt of RebootRequest TLV from the NMS).</li>
          <li>A device MUST register when its IP address has changed (usually indicating a network re-join).</li>
          <li>A device MUST register if its mesh parent has changed (mesh networks only).</li>
          <li>A device MUST register if it detects the NMS IP address has changed.</li>
          <li>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.</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="ascii-art"><![CDATA[
                              ┌──────┐                                                                      ┌───┐                    
                              │Device│                                                                      │NMS│                    
                              └──┬───┘                                                                      └─┬─┘                    
                              ╔══╧════════════════════════════════════════════════════════════════════════════╧═══╗                  
                              ║Registration Begin                                                                ░║                  
                              ╚══╤════════════════════════════════════════════════════════════════════════════╤═══╝                  
                                 │                                                                            │                      
          ╔═══════╤══════════════╪════════════════════════════════════════════════════════════════════════════╪═════════════════════╗
          ║ LOOP  │              │                                                                            │                     ║
          ╟───────┘              │                                                                            │                     ║
          ║                      │────┐                                                                       │                     ║
          ║                      │    │ [1] Wait random time tBackoff between 0 and tInterval                 │                     ║
          ║                      │<───┘                                                                       │                     ║
          ║                      │                                                                            │                     ║
          ║                      │                   [2] CON POST msgId = X++ to /r ...                       │                     ║
          ║                      │                   1. MUST contain DeviceID TLV                             │                     ║
          ║                      │                   2. MUST contain CurrentTime TLV                          │                     ║
          ║                      │                   3. MUST contain Device Information TLVs                  │                     ║
          ║                      │                   4. MAY contain SessionID TLV                             │                     ║
          ║                      │                   5. MAY contain GroupInfo TLV                             │                     ║
          ║                      │                   6. MAY contains ReportSubscribe TLV                      │                     ║
          ║                      │                                                                            │                     ║
          ║                      │ ───────────────────────────────────────────────────────────────────────────>                     ║
          ║                      │                                                                            │                     ║
          ║                      │────┐                                                                       │                     ║
          ║                      │    │ [3] Wait remaining time between tBackoff and tInterval                │                     ║
          ║                      │<───┘ Double tInterval up to tIntervalMax                                   │                     ║
          ║                      │                                                                            │                     ║
          ║                      │                                                                            │                     ║
          ║                      │  ╔═════════════════════════════════════════════════════════╗               │                     ║
          ║                      │  ║Continue loop until ACK receipt success and no redirect ░║               │                     ║
          ║                      │  ╚═════════════════════════════════════════════════════════╝               │                     ║
          ║                      │                                                                            │                     ║
          ║         ╔══════╤═════╪════════════════════════════════════════════════════════════════════════════╪═══════════╗         ║
          ║         ║ ALT  │  NMS redirects                                                                   │           ║         ║
          ║         ╟──────┘     │                                                                            │           ║         ║
          ║         ║            │                     [4] ACK msgID = X ...                                  │           ║         ║
          ║         ║            │                     1 Contains NMSRedirectRequest TLV.                     │           ║         ║
          ║         ║            │                     2 MUST contain Signing TLVs.                           │           ║         ║
          ║         ║            │ <───────────────────────────────────────────────────────────────────────────           ║         ║
          ║         ║            │                                                                            │           ║         ║
          ║         ║            │  ╔═══════════════╗                                                         │           ║         ║
          ║         ║            │  ║Continue loop ░║                                                         │           ║         ║
          ║         ╠════════════╪════════════════════════════════════════════════════════════════════════════╪═══════════╣         ║
          ║         ║ [NMS no redirect]                                                                       │           ║         ║
          ║         ║            │                     [5] ACK msgID = X ...                                  │           ║         ║
          ║         ║            │                     1. MAY contain SessionID TLV                           │           ║         ║
          ║         ║            │                     2. MAY contain GroupAssign TLV                         │           ║         ║
          ║         ║            │                     3. MAY contain ReportSubscribe TLV.                    │           ║         ║
          ║         ║            │                     4. MUST contain the Signing TLVs.                      │           ║         ║
          ║         ║            │ <───────────────────────────────────────────────────────────────────────────           ║         ║
          ║         ║            │                                                                            │           ║         ║
          ║         ║            │  ╔════════════════════╗                                                    │           ║         ║
          ║         ║            │  ║Break out of loop. ░║                                                    │           ║         ║
          ║         ╚════════════╪══╚════════════════════╝════════════════════════════════════════════════════╪═══════════╝         ║
          ╚══════════════════════╪════════════════════════════════════════════════════════════════════════════╪═════════════════════╝
                                 │                                                                            │                      
                              ╔══╧════════════════════════════════════════════════════════════════════════════╧═══╗                  
                              ║First Metrics Report                                                              ░║                  
                              ╚══╤════════════════════════════════════════════════════════════════════════════╤═══╝                  
                                 │        [6] NON POST msgID = X++ to /c ...                                  │                      
                                 │        1. MUST contain SessionID TLV.                                      │                      
                                 │        2. MUST contain CurrentTime TLV.                                    │                      
                                 │        3. MUST contain list of TLVs speficied by ReportSubscribe TLV       │                      
                                 │ ───────────────────────────────────────────────────────────────────────────>                      
                                 │                                                                            │                      
                              ╔══╧════════════════════════════════════════════════════════════════════════════╧═══╗                  
                              ║Registration Complete                                                             ░║                  
                              ╚══╤════════════════════════════════════════════════════════════════════════════╤═══╝                  
                              ╔══╧════════════════════════════════════════════════════════════════════════════╧═══╗                  
                              ║Continuing Metrics Reports                                                        ░║                  
                              ╚══╤════════════════════════════════════════════════════════════════════════════╤═══╝                  
                                 │                                                                            │                      
                    ╔═══════╤════╪════════════════════════════════════════════════════════════════════════════╪═══════════╗          
                    ║ LOOP  │    │                                                                            │           ║          
                    ╟───────┘    │                                                                            │           ║          
                    ║            │────┐                                                                       │           ║          
                    ║            │    │ [7] Wait random time tMetricsBackoff between 0 and                    │           ║          
                    ║            │<───┘  tMetricsInterval defined by ReportSubscribe                          │           ║          
                    ║            │                                                                            │           ║          
                    ║            │                                                                            │           ║          
                    ║            │ [8] NON POST msgId = X++ to /c ...                                         │           ║          
                    ║            │ 1. MUST contain Session ID TLV                                             │           ║          
                    ║            │ 2. MUST contain CurrentTime TLV                                            │           ║          
                    ║            │ 3. MUST contain the list of TLVS specified by previous ReportSubscribe TLV.│           ║          
                    ║            │ ───────────────────────────────────────────────────────────────────────────>           ║          
                    ║            │                                                                            │           ║          
                    ║            │────┐                                                                       │           ║          
                    ║            │    │ [9] Wait remaining time between tMetricsBackoff and                   │           ║          
                    ║            │<───┘  tMetrics Interval                                                    │           ║          
                    ║            │                                                                            │           ║          
                    ╚════════════╪════════════════════════════════════════════════════════════════════════════╪═══════════╝          
                              ┌──┴───┐                                                                      ┌─┴─┐                    
                              │Device│                                                                      │NMS│                    
                              └──────┘                                                                      └───┘     
        ]]></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>tIntervalMin defaults to 300 seconds (5 minutes). Also configurable via TLV 42/regIntervalMin field.</li>
            <li>tIntervalMax defaults to 3600 seconds (1 hour). Also configurable via TLV 42/regIntervalMax field.</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 a new CoAP CON POST request message 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 an 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>DeviceID (primary identifier of the device).</li>
            <li>CurrentTime (used to validate device local time).</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>SessionID</li>
            <li>GroupInfo (one per group)</li>
            <li>ReportSubscribe</li>
          </ol>
          <t>The following Device Information TLVs MUST be included in the registration POST:</t>
          <ol spacing="normal" type="1"><li>HardwareDesc</li>
            <li>InterfaceDesc (one per interface)</li>
            <li>IPAddress (one per address)</li>
            <li>NMSStatus (reason for the registration operation)</li>
            <li>WPANStatus</li>
            <li>RPLSettings</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>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.</li>
            <li>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.</li>
            <li>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.</li>
            <li>Signing TLVs MUST be included.</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>NMSRedirectRequest MUST be included.</li>
            <li>Signing TLVs MUST be included.</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>The registration ACK to the device indicates code 2.03 (Valid) and message ID match is confirmed as described in CoAP.</li>
            <li>The ACK response body does not contain an NMSRedirectRequest TLV.</li>
            <li>The first metrics report from the device is received by the NMS.</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>A primary metrics report using the interval and TLV ID set.</li>
          <li>A secondary metrics report using the heartbeat interval and heartbeat TLV ID set.</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>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.</li>
          <li>tlvList (the list of TLVs the device MUST report) is designated by the tlvId field of the ReportSubscribe TLV.</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>tMetricsInterval is designated by the intervalHeartBeat field of the ReportSubscribe TLV.</li>
          <li>tlvList is designated by the tlvIdHeartBeat field of the ReportSubscribe TLV.</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>InterfaceMetrics</li>
          <li>GroupInfo</li>
          <li>FirmwareImageInfo</li>
          <li>Uptime</li>
          <li>LowpanPhyStats</li>
          <li>DifServMetrics</li>
          <li>ReportSubscribe</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>SessionID</li>
          <li>CurrentTime</li>
          <li>The TLVs from tlvList. The entirety of all table entries MUST be included.</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 the required metrics TLVs.
    Wait an 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>Firmware download.  A new image is placed on one or more members of a device group.</li>
          <li>Image load.  Activate an image on one or more members of a device group at a scheduled time.</li>
          <li>Set backup image.  Optional designation of an image to be used when load of all other images fails.</li>
        </ol>
        <t>A device should implement the following mechanisms in support of firmware update:</t>
        <ol spacing="normal" type="1"><li>It is RECOMMENDED that vendors implement digital signing of images prior to image release to production.</li>
          <li>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.</li>
          <li>A device MUST be capable of storing at least two firmware images: the running image and at least one additional image.</li>
          <li>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.</li>
          <li>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).</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>A GroupMatch TLV MUST be included for the desired group.</li>
            <li>The 'a' option MUST be specified to randomize subsequent device responses.</li>
            <li>The request MAY contain an 'r' option to redirect the subsequent TransferResponse.</li>
            <li>The request MUST contain a TranferRequest TLV (meta-data for the file to be downloaded)</li>
            <li>The request MUST contain the Signing TLVs.</li>
          </ol>
          <t>Devices receiving a TransferRequest message:</t>
          <ol spacing="normal" type="1"><li>MUST process the Signing TLVs and the GroupMatch TLV as described in section 2.6.</li>
            <li>MUST wait the specified period when the 'a" option is included.</li>
            <li>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.</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>The request MUST contain the GroupMatch TLV for the desired group.</li>
            <li>The request MUST contain an ImageBlock TLV</li>
            <li>The request MAY contain the Signing TLVs.</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>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</li>
            <li>MUST cache the image block for final image assembly.</li>
            <li>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.</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>A GroupMatch TLV MUST be included for the desired group.</li>
              <li>The 'a' option MUST be specified to randomize subsequent device responses.</li>
              <li>The request MAY contain an 'r' option to redirect the subsequent LoadResponse.</li>
              <li>The request MUST contain a LoadRequest TLV (designating the image and time at which the image is to be activated).</li>
              <li>The request MUST contain the Signing TLVs.</li>
            </ol>
            <t>Devices receiving a LoadRequest message:</t>
            <ol spacing="normal" type="1"><li>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</li>
              <li>MUST wait the specified period when the 'a" option is included.</li>
              <li>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.</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>A GroupMatch TLV MUST be included for the desired group.</li>
              <li>The 'a' option MUST be specified to randomize subsequent device responses.</li>
              <li>The request MAY contain an 'r' option to redirect the subsequent CancelLoadResponse.</li>
              <li>The request MUST contain a CancelLoadRequest TLV (designating the image load to be cancelled).</li>
              <li>The request MUST contain the Signing TLVs.</li>
            </ol>
            <t>Devices receiving a CancelLoadRequest message:</t>
            <ol spacing="normal" type="1"><li>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</li>
              <li>MUST wait the specified period when the 'a" option is included.</li>
              <li>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.</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="ascii-art"><![CDATA[
     ┌───────┐                        ┌───────┐                                ┌───┐
     │Device1│                        │Device2│                                │NMS│
     └───┬───┘                        └───┬───┘                                └─┬─┘
         │                                │[1] NON POST to /c with options a, r  │  
         │                                │1. MUST contain GroupMatch TLV        │  
         │                                │2. MUST contain SetBackupRequest TLV  │  
         │                                │3. MUST contain Signing TLVs          │  
         │                                │<─────────────────────────────────────│  
         │                                │                                      │  
         ────┐                            │                                      │  
             │ [2] Set the specified image│                                      │  
         <───┘  as the backup image       │                                      │  
                                          │                                      │  
         │                                │                                      │  
         │                                ────┐                                  │  
         │                                    │ [3] Set the specified image      │  
         │                                <───┘  as the backup image             │  
         │                                                                       │  
         │                                │                                      │  
   ╔═════╧════════════════════════════════╧═════╗                                │  
   ║Wait random delay based on the "a" option. ░║                                │  
   ╚═════╤════════════════════════════════╤═════╝                                │  
         │                                │[4] NON POST to /c                    │  
         │                                │1. MUST contain SetBackupResponse TLV │  
         │                                │─────────────────────────────────────>│  
         │                                │                                      │  
         │                [5] NON POST to /c                                     │  
         │                1. MUST contain SetBackupResponse TLV                  │  
         │──────────────────────────────────────────────────────────────────────>│  
     ┌───┴───┐                        ┌───┴───┐                                ┌─┴─┐
     │Device1│                        │Device2│                                │NMS│
     └───────┘                        └───────┘                                └───┘    
        ]]></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>A GroupMatch TLV MUST be included for the desired group.</li>
            <li>The 'a' option MUST be specified to randomize subsequent device responses.</li>
            <li>The request MAY contain an 'r' option to redirect the subsequent SetBackupResponse.</li>
            <li>The request MUST contain a SetBackupRequest TLV (designating the image load to be cancelled).</li>
            <li>The request MUST contain the Signing TLVs.</li>
          </ol>
          <t>Devices receiving a SetBackupRequest message:</t>
          <ol spacing="normal" type="1"><li>MUST process the Signing TLVs and GroupMatch TLVs as described in section 2.6.</li>
            <li>MUST wait the specified period when the 'a" option is included.</li>
            <li>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.</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>A GroupMatch TLV MUST NOT be included for the designed device.</li>
          <li>The request MAY contain an 'r' option to redirect the subsequent PingResponse.</li>
          <li>The request MUST contain a PingRequest TLV (describing the Ping action to be performed).</li>
          <li>The request MUST contain the Signing TLVs.</li>
        </ol>
        <t>Devices receiving a PingRequest message:</t>
        <ol spacing="normal" type="1"><li>MUST process the Signing TLVs as described in section 2.6.</li>
          <li>MUST begin the requested Ping operation.</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>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).</li>
        <li>Layer 3 VPN may be used to provide confidentially, source authentication, and message integrity for messaging between Device and NMS.</li>
        <li>Layer 4 DTLS may be used to provide confidentially, source authentication, and message integrity for messaging between Device and NMS.</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>Jasvinder Bhasin, Cisco Systems, Inc. (jassi@cisco.com)</li>
        <li>Chris Hett, Landis+Gyr (Chris.Hett@landisgyr.com)</li>
        <li>Johannes van der Horst, MMB Networks (johannes.vanderhorst@mmbresearch.com)</li>
        <li>Klaus Hueske, Renesas (Klaus.Hueske@renesas.com).</li>
        <li>Hideyuki Kuribayashi, ROHM Semiconductor (Hideyuki.Kuribayashi@mnf.rohm.co.jp)</li>
        <li>Kit-Mui Leung, Cisco Systems, Inc. (kml@cisco.com)</li>
        <li>Huimin She, Cisco Systems, Inc. (hushe@cisco.com)</li>
        <li>Li Zhao, Cisco Systems, Inc. (liz3@cisco.com)</li>
      </ol>
    </section>
    <section anchor="appendixA">
      <name>Appendix A Registration Retry Example</name>
      <ol spacing="normal" type="1"><li>Device powers up.</li>
        <li>Device sets interval for 0 to 5 minutes.</li>
        <li>Device wait a random time between 2.5 and 5 minutes.</li>
        <li>Device sends a confirmable registration POST message.</li>
        <li>Device waits the rest of the interval until 5 minutes have passed.</li>
        <li>Device waits a random time between 5 and 10 minutes.</li>
        <li>Device sends the registration message again, with a new CoAP message ID.</li>
        <li>Device waits the rest of the interval until 10 minutes have passed.</li>
        <li>Device waits a random time between 10 and 20 minutes.</li>
        <li>Device sends the registration message again, with a new CoAP message ID.</li>
        <li>Device waits the rest of the interval until 20 minutes have passed.</li>
        <li>Device waits a random time between 20 and 40 minutes.</li>
        <li>Device sends the registration message again, with a new CoAP message ID.</li>
        <li>Device waits the rest of the interval until 40 minutes have passed.</li>
        <li>Device waits a random time between 40 and 60 minutes.</li>
        <li>Device sends the registration message again, with a new CoAP message ID.</li>
        <li>Device waits the rest of the interval until 60 minutes have passed.</li>
        <li>Repeat steps 15, 16, and 17 forever.</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>Abstract reworded to clarify multi-vendor aspects of CSMP.</li>
          <li>Introduction reworded to clarify multi-vendor aspects of CSMP.</li>
          <li>OpenAPI definitions are placed in-line.</li>
          <li>Protocol Buffer Definitions are placed in-line.</li>
          <li>Due to IETF author limits, all authors except the Editor have been credited in the Contributors section.</li>
        </ol>
      </section>
      <section anchor="draft-01-to-02">
        <name>draft 01 to 02</name>
        <ol spacing="normal" type="1"><li>"Cisco" added to title as requested.</li>
          <li>There are no IP disclosures to be made for this work. This point has been confirmed by Cisco legal.</li>
        </ol>
      </section>
      <section anchor="draft-02-to-03">
        <name>draft 02 to 03</name>
        <ol spacing="normal" type="1"><li>Trial attempt to convert Figures 2 and 6 to ASCII Art using PlantUML.</li>
        </ol>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <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="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" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba">
            <organization/>
          </author>
          <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" target="https://www.rfc-editor.org/info/rfc7252">
        <front>
          <title>The Constrained Application Protocol (CoAP)</title>
          <author fullname="Z. Shelby" initials="Z." surname="Shelby">
            <organization/>
          </author>
          <author fullname="K. Hartke" initials="K." surname="Hartke">
            <organization/>
          </author>
          <author fullname="C. Bormann" initials="C." surname="Bormann">
            <organization/>
          </author>
          <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>
  </back>
  <!-- ##markdown-source:
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
WI11wl7u/i6cSjdr/spPhnihaR/m0/ATrZnTN4b51H91TkYT3jEjm7DpWGc9
FgON25/H86xp7xazbfjF+dnRhazO44YTf423YhvPV+FW6GG5aQN06rumy3IY
BMHuRrfz9oIubTcdT77qhPJZ0+G+OuudLDXS/qu9s509iplf6jvginqhmn9x
Fxy8XXIc9d321vPAB6aPgzb9Fhb4cMrXvht+8UIuLB5OwEg/BKbaeKkublPQ
qINsGfiOZ9GS0+HmDUEiYlhmgANUQpnzNJ43fbMMC6UPlmVs/NESU5EEBOdx
FDSeygmvnj4HrbBmlxFqcl1ClBUVHl30cVhnOkrBv4s0U6bXOzB09ecDycP3
I9eWZU5L81lbsBVN+IYcQ9kqDcekQCTiSXdVIcrI2jgB7pmui5e07krVd0JU
L8X4rjujqtlu03gS9tCcPM8DNh7Mh0aNdsy2O6yKibqyjm+sD8iYo0wckp4h
DbM538by5ngLRcetgY0z8KdePBjMk0Js3lnOryGO/qogaYrL28t7Piobb7a9
nn1SwA4SGUPlGyl8tZX7ynWflI/1Hs2FJflxKV28jx3ygdj2z8+I+THbMM2+
O4N5KK6/tOr+TkbPLybPj9LkWVatOIpvZv702B8sAxZ/dDa+XRIVl3g5cRQk
S1LsUewPl/xkD1EW3eFDmNFzf/BmPlvyu6Kp+eMzND+AnflerUyBqUy1Wt5B
WdSuqryTe+q64Du7J++sESwvtFgwLDVG0I/jJeFanuvelYuaexsfjEctgwja
9s+jePBmKZ62zBA2S1tOm9QcbanP8ndulv1u2fbLim/LJdSYbRKrvatnS/gO
XQxpZGDT2QfFl9yFWfxInTHL6ecfWB3+2O7lZT2TjfZ9kGTP53hI/1hRlqLF
XhQ1okRo51nJbIYuUXo6EwinE+FMukO6k4/uBMzUSGkb4lDy+qL7x3wdw68J
RWwO4ihScXdqKE6u9rdsnt/ZsfSLXf83btcvQyx38ATcReP7xXvws/ceLOVr
py8OgPE2JaClFfmfiEfjb9ta+MWz85MzoO7ieVpOc13eRCvouu/FIbakIfiz
8Z+9e5QG/6vv3p5SxjhvBXT/VW9m7qRwsnK8cWNntcMhwkid1H2Sz4+Zqljy
jG7NRLdWEjr1iQ4BpeuqJs6z7QCm7AZtZvB9L85vx8+UrVDTpGgf1DTWNkHt
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
RgdcwXJE4XT+tgk2TxiRNh5TrBceT2tulNktTBSQPGXXTZ6bSwGlKk6u6iup
jbTjrXmXe2ctr/MEfnq9n2cmdE+sNtOq3UJvHqxGTJcJZnjfrOauWcQ6ZFFU
a4Na3us9xL1h5qj81IMgqYXUaqCZngMoNqiAE1/VgKleazWQuioBsklq80L6
ywQ0nipvIypDSovqwBKSqZysqzqEmGZvTbKirauigCXMp7PVca5O23eQeBC9
QxpSO355jh8SwJr+ArreMzDG9AbAd/FPF5cHx9/sH7zovT66bNFELs97JxeH
l9+cnO4f8CyODnov6NecSMLsM+giOZhmiWPZNwlv56OpzjPvxcm+N5v3o3CA
Gc2pMqhk7NjrUYFe+c1us/XMCymbj/20RA+9mPd/X+GFVK/lIFU0UpUux86f
r3VPrFFedHYOVA6ekyp/hjWi21COWdfX5YIOPWM3ApgxaBu4Yxfy4Vs9lvo/
SkZWjpAtM7BPj5Yc9wXWjklm0H+Ntm818nQtKRvPI2rgUQtnzO5G2WaRszQ5
UN+zOno+nw4jk6XMJVJ5SeDpC9ou9Q7kN709rBvaYept5wquya51QlGP6f4r
pn9ZGFR5PIsK0h0Doy+CykIy6nXJfQy87mZiqxUIudvxmX9eX1fGblJ3GaN+
EKqNVzMCvS+5WcHZuur7xunvz/kGZ/VF/1y7kisWQ/3OjUpfiLkmgxfaltzA
MAA0wCrayCAIakjDalFyCUNThzSrHWUBjeRa1V3FaDJaHbHYTUquYTC9lA7i
blR9+h5kpuzy8tuVO7CVSNy/pb4WeuMemEieXAuCNA9CAfTNzqbLY1JVUlvf
RGySTaWYWEpdcTpclKEIWpRwG73C+Fqnuyq/aHV4unCI0zpeg68XDNFbOETv
tO4mF74uH8LcaanElN2khNHorVeNKquHqonYTUqYiTXI4plUYstuUsdEGqDr
JD7zs3GDoXTDEj6iB5zGa1RxssnAC5fp5KKElZihgvBq3McnMd/7dMdzN+dW
2ebkPJ7l+7MuHXJhk7LhwEBfMDRVfLLYsk5FKJ9a2bA9VfKzwcC6bclm1kPr
GqINBpfQnAZDq/C54hbXA6uItybDzqKqyoSFdnUbPqEG5QNSNSLupyJbh45o
yTcs2f5IP9xShpMCymGqUnvwVfOyIk6m/7qJ55uVsIcaIPBpWACB9tJ/gj/4
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
5/SbqpOf9wvY/3V/YuZn8LfJNP/vpiv+NQpRSy/93Z3X9l5Wupmo2v7xiaq7
efLeq6gq8eZZ91o+BkibLkglDr3SZXyfIG3lPML5+4gVdPWLQP9FoL+rA+RO
8v0+RfvzJPDfqBvcKN7b7yDf7whYQ1eFlnnv6Nr468cW3u8u2v9ajdh78fv8
okU1/PvXH2n0TumHv8TNLYuwP7+g1DMSnCrKSrNlquz0l7i5hn/vNW7u653f
eSd2iMa+FaIxuIvxcGdQ8uEZjqHQAIx7BGVBaEYjYO4JlHxYRoT32fh+K13N
GYUDSehXHQPwrqB8dEX5ff8tP2H/sYagln74ixBbFmFu8Pee1JNvtk5Vnf4i
xBr+fUch9gu5L40w5a1G742ruN35fPAXcm/696d518Fq3vTWwy8Wsv77b4uR
mrvN8MHceZUA1d5m+Pjg5V11LpDvJ5LwToCpf75+UnaHQdhv+VWG9wNQ7g6D
AkGHEloZ9vJ2ROWfe8LTff35GYLz9W7OOh8ub53fIzgVFrrXICr/fYBz5wsU
7wecvKVO6amMtX5hUinjLpslwXUYz0tD99v3Ac5HN6o/pNH+c9jtP35h9nRB
WHxOrpVLs/cnzLzKS4AN/vz0pceyx4U/77/LHRc2yP6g81n8z/vfpar3/1nd
6U83W8b37m69H9D+UujUQNQsp9wnFdmjdKLvXE5TkwbmJjYZkPBCzszHAkKU
o0nljVTF+wopYyR3ZkulbY5uPSqnndklLaRMKeV/keyRKtktZ5fJJbflJDOg
nZmrQNgoGPnziIudbG5sYBZHyve0sk11gbIAc972ojQ3G8yDhdrTVncdILc7
pJSZnAvJuXPkDLRjj9TxxvE8WWYY/60eprACVNGlLFVUaqXINjkY/egqTsJs
zIWGuCATkscFFhDQouIzB2ltbkJSzje5taXiQ9Wdc5mvfLwfqyJTdKZFfekb
Y9K0hWmjEus6e0hpsMhINIQcqgG0hFVDrncrQLC2Qc/0TqlIVRbEyM8wd9PY
j0YqTZ0eyHwdTNN5whnNAAuT+cSV9XJ1BzPPOStiOsBRJrNMYYUO1S6whhhn
66PCUPpyeL6CFVASBl866fY+X0/a9ja/LCl4UlDAHeDozMx04CRIVTlON9ub
7U67q6HeVCvo5MVdMZj/4fv/ohG9miMFiqFz6Q1m1vX+zjywVwzLfeiGISYg
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
X5Z8gSiK+L0CfMfnFxjSmnmuFQIA

-->

</rfc>
