<?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.16 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duffy-csmp-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.0 -->
  <front>
    <title abbrev="CoAP Simple Management Protocol">CoAP Simple Management Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-duffy-csmp-00"/>
    <author initials="P." surname="Duffy (ed)" fullname="Paul Duffy">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>paduffy@cisco.com</email>
      </address>
    </author>
    <author initials="J." surname="Bhasin" fullname="Jasvinder Bhasin">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>jassi@cisco.com</email>
      </address>
    </author>
    <author initials="K." surname="Leung" fullname="Kit-Mui Leung">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>kml@cisco.com</email>
      </address>
    </author>
    <author initials="H." surname="She" fullname="Huimin She">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>hushe@cisco.com</email>
      </address>
    </author>
    <author initials="L." surname="Zhou" fullname="Li Zhou">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>liz3@cisco.com</email>
      </address>
    </author>
    <date year="2022" month="August" day="17"/>
    <area>General</area>
    <workgroup>Independant Submission</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>CoAP Simple Management Protocol (CSMP) provides lifecycle management for resource constrained IoT devices deployed within large-scale, bandwidth constrained IoT networks. This document describes the design and operation of CSMP.</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 (optimized to operate for years on a single battery charge).</t>
      <t>A large LPWAN may contain millions of devices requiring a Network Management System (NMS) able to provide at-scale lifecycle management.  The management protocol must be able to operate within the constrained performance envelope of an LPWAN.  The management protocol must offer an efficient message encoding, be optimized for efficient and secure messaging flows across the LPWAN, and support 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 the CoAP Simple Management Protocol (CSMP), which provides management capabilities for constrained IoT devices deployed within large scale LPWANs.  Features include:</t>
      <ol spacing="normal" type="1"><li>Onboarding.  Device startup registration and capabilities anouncement 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="CSMPMSG"/>.</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="csmp-device-interface">
          <name>CSMP Device Interface</name>
          <t>A CSMP device MUST implement the interface specified within <xref target="CSMPDEV"/>.   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>
        </section>
        <section anchor="csmp-nms-interface">
          <name>CSMP NMS Interface</name>
          <t>A CSMP NMS MUST implement the interfaces specified within <xref target="CSMPNMS"/>. 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>
        </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="CSMPMSG"/>, 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>It is RECOMMENDED that a default port of 61628 be used.</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 NMS and Device 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="CSMPMSG"/>.</t>
          </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="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/e9c763102bee617e4f6f6a526d39de081660a25f/RegistrationConfigurationMetrics.svg?raw=true"/>
            <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
          </artset>
        </figure>
        <section anchor="device-registration-request">
          <name>Device Registration Request</name>
          <t>A device MUST implement two configurable parameters used to control the registration process, initially set at manufacture time, and MUST be maintained in durable storage.</t>
          <ol spacing="normal" type="1"><li>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 (if present).</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="svg" src="https://github.com/woobagooba/draft-ietf-is-csmp/blob/0f91f16aec32bee2238dabf5a972169dc4d93c69/SetDefaultImage.svg?raw=true"/>
              <artwork type="ascii-art"><![CDATA[Figure only available as SVG (PDF and HTML)]]></artwork>
            </artset>
          </figure>
          <t>The NMS MUST issue a NON POST to &lt;device-url&gt;/c configured as follows:</t>
          <ol spacing="normal" type="1"><li>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="CSMPMSG"/>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>As discussed in previous sections, a CSMP NMS signs outgoing Device messaging using an NMS private key.   Signing TLVs included in the message payload enable signature verification by a device using an NMS signing certificate\public key, thereby providing authenication of source and integrity check of the message incoming to the Device (without confidentially).</t>
      <t>Additional layer 2, 3, or 4 security mechanisms may be utilized to meet additional security requirements of specific deployment models. Examples include:</t>
      <ol spacing="normal" type="1"><li>Layer 2 802.1X/EAP-TLS may be used to provide mutual authenication of Device and NMS as well as distribution of a unique shared key to be used to subsequently encrypt and source authenticate communication.</li>
        <li>Layer 2 802.11i tactics may be used to distribute group keys useful for securing group wide (multicast) messaging.</li>
        <li>Layer 3 VPN may be used to secure messaging between Device and NMS.</li>
        <li>Layer 4 DTLS may be used to secure application specific messaging.</li>
      </ol>
      <t>Specific details of the usage profile for these additional security mechanisms are highly specific to the LPWAN deployment and are thus 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="implementation-status">
      <name>Implementation Status</name>
      <t>This specification documents the technical details of CSMP as it has been deployed by Cisco and partners since 2012.  Today, CSMP deployments manage many millions of LPWAN endpoints across a wide variety of energy utility and smart city applications.</t>
      <t>As this information is time dependent, the RFC Editor is requested to remove this section before publication.</t>
    </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>
  </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">
        <front>
          <title>Protocol Buffers</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="OPENAPI" target="https://www.openapis.org/">
        <front>
          <title>OpenAPI Initiative</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>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to express their gratitude to reviewers and early implementors, including but not limited to Chris Hett, Klaus Hueske, Hideki Tanaka, and Johannes van der Horst.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a3MbR7bYd1XpP0zkSl0gAUESfOhRthOKpCyuKYlXpOzd
m01tDQYNYlaDGew8SGFtp/Y/5EtSlfy5/SU5z37MDCjKq7U3dXfvLRkEZrpP
nz593uf01tbWwwdVM12mVVrk9XplnkVpPjMrA//k9cMHSVyb66Jc49fz4uGD
hw/qtM7gqePi6CK6TJerzESv4jy+Nkt4Ibooi7pIiuzhg3g6Lc3NPR6cFUke
L2HIWRnP661ZM5+vt5Jqudra2cEJ01X5LKrLpqonOztPdyYwdGniZ9E3Jjdl
DAPcFuX767JoVs+iM4E9hhkuaVm4rocP3ps1PDXDB2pT5qbeOsHJcPiqjvPZ
H+KsyAGEtakePlilz6L/BsCNoqoo69LMK/i0XuKH/45vxE29KMpnDx9E0Rb+
EwFuqmfRxTg6QdijgZkN+Xte10XcZPwTf1uU13Ge/jmuATTAT1olRXS5rmqz
hInO8mTMj5llnGbPolVMGPmvCT43Tople97fjKPni7hKc3/O38TVDW5kGfz2
aTP/MQbsbZ7323F0bpr82p/227TeetWk/g+fNuf7ZbZ5xpfj6HJh/PleNuky
zd23nzbZoqkWZvN05+Po3xZF4893nnpffdpkWfrnPX+uhw/yolzCyzeGSOnt
i+PJ7u5T+nzx/Bm/W8fltakB0rpeVc+2t2fmxmTFypTV+LoorjODY22v5Cxt
TYFS4Dd5lw+qHrToufvxzcXp66OLsw2T3N7ejmGOPF6l1RgWuR2M9wZ+gXdh
gWmdEvj48/Hlq4vXry43jHid1otmSrDeFsU0vsZ/tvm8p6aeb6UVnfjtaVZM
t83O1BzEe7tPdw7NdM88ffpkzzxOksmT6WTfzJ7uP5kc7O89frK/fQyvvF5W
W7vjnfHueB0vswBShCkCoPjQz+PEQnpy+t0vD+mJuUkTcyew/EgX3uM3ry5+
eYCPi+UKuGJeM4b7QXYPRfw/hfnV5Te/PMhX599VF800S5MxHYouvBfxOivi
GaB6niIFF3mFZxHEDMg3dx4fPtja2oriaVWXcUJy4iNyLBrg8MMIpr1JZ6aC
8z43yTqBp5fuaZgiKk1VNCVscwJzw/BpbmbRWXEVzWj3K/jvKivW8OUtIAq4
W4b426qSODOjaArS6jad1YvO6yDVUBJW4+hqkcIoRdLQnABMUqZTGLheGPwr
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

-->

</rfc>
