<?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-ietf-core-conditional-attributes-06" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.3 -->
  <front>
    <title abbrev="Conditional Attributes for CoRE">Conditional Attributes for Constrained RESTful Environments</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-core-conditional-attributes-06"/>
    <author initials="M." surname="Koster" fullname="Michael Koster">
      <organization>Dogtiger Labs</organization>
      <address>
        <postal>
          <street>524 H Street</street>
          <city>Antioch, CA</city>
          <code>94509</code>
          <country>USA</country>
        </postal>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Soloway" fullname="Alan Soloway">
      <organization>Qualcomm Technologies, Inc.</organization>
      <address>
        <postal>
          <street>5775 Morehouse Drive</street>
          <city>San Diego</city>
          <code>92121</code>
          <country>USA</country>
        </postal>
        <email>asoloway@qti.qualcomm.com</email>
      </address>
    </author>
    <author initials="B." surname="Silverajan" fullname="Bilhanan Silverajan" role="editor">
      <organization>Tampere University</organization>
      <address>
        <postal>
          <street>Kalevantie 4</street>
          <city>Tampere</city>
          <code>33100</code>
          <country>Finland</country>
        </postal>
        <email>bilhanan.silverajan@tuni.fi</email>
      </address>
    </author>
    <date year="2023" month="January" day="14"/>
    <area>art</area>
    <workgroup>CoRE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>CoRE</keyword>
    <keyword>CoAP</keyword>
    <keyword>Observe</keyword>
    <abstract>
      <t>This specification defines Conditional Notification and Control Attributes that work with CoAP Observe (RFC7641).</t>
    </abstract>
    <note>
      <name>Editor note</name>
      <t>The git repository for the draft is found at https://github.com/core-wg/conditional-attributes/</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>IETF Standards for machine-to-machine communication in constrained environments describe the Constrained Application Protocol (CoAP) <xref target="RFC7252"/>, a RESTful application protocol, as well as a set of related information standards that may be used to represent machine data and machine metadata in REST interfaces.</t>
      <t>This specification defines Conditional Notification and Control Attributes for use with CoAP Observe <xref target="RFC7641"/>.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</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>
      <t>This specification requires readers to be familiar with all the terms and concepts that are discussed in <xref target="RFC7252"/> and <xref target="RFC7641"/>.  This specification makes use of the following additional terminology:</t>
      <dl>
        <dt>Notification Band:</dt>
        <dd>
          <t>A resource value range that  may be bounded by a minimum and maximum value or may be unbounded having either a minimum or maximum value.</t>
        </dd>
      </dl>
    </section>
    <section anchor="binding_attributes">
      <name>Conditional Attributes</name>
      <t>This specification defines conditional attributes for use with CoRE Observe <xref target="RFC7641"/>. Conditional attributes provide fine-grained control of notification and synchronization of resource states. When observing a resource, a CoAP client conveys conditional attributes as metadata using the query component of a CoAP URI. A conditional attribute can be represented as a "name=value" query parameter or simply a "name" without a value. Multiple conditional attributes in a query component are separated with an ampersand "&amp;". A resource marked as Observable in its link description SHOULD support these conditional attributes.</t>
      <t>Note: In this draft, we assume that there are finite quantization effects in the internal or external updates to the value representing the state of a resource; specifically, that a resource state may be updated at any time with any valid value. We therefore avoid any continuous-time assumptions in the description of the conditional attributes and instead use the phrase "sampled value" to refer to a member of a sequence of values that may be internally observed from the resource state over time.</t>
      <section anchor="conditional-notification-attributes">
        <name>Conditional Notification Attributes</name>
        <t>Conditional Notification Attributes define the conditions that trigger a notification. Conditional Notification Attributes SHOULD be evaluated on all potential notifications from a resource, whether resulting from an internal server-driven sampling process or from external update requests to the server.</t>
        <t>The set of Conditional Notification Attributes defined here allows a client to control how often a notification is received and how much a representation state should change in order to trigger a notification. One or more Conditional Notification Attributes MAY be included in an Observe request.</t>
        <t>Conditional Notification Attributes are defined below:</t>
        <table anchor="notificationattributes">
          <name>Conditional Notification Attributes</name>
          <thead>
            <tr>
              <th align="left">Attribute</th>
              <th align="left">Name</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Greater Than</td>
              <td align="left">c.gt</td>
              <td align="left">xs:decimal</td>
            </tr>
            <tr>
              <td align="left">Less Than</td>
              <td align="left">c.lt</td>
              <td align="left">xs:decimal</td>
            </tr>
            <tr>
              <td align="left">Change Step</td>
              <td align="left">c.st</td>
              <td align="left">xs:decimal (&gt;0)</td>
            </tr>
            <tr>
              <td align="left">Notification Band</td>
              <td align="left">c.band</td>
              <td align="left">(none)</td>
            </tr>
            <tr>
              <td align="left">Edge</td>
              <td align="left">c.edge</td>
              <td align="left">xs:boolean</td>
            </tr>
          </tbody>
        </table>
        <section anchor="gt">
          <name>Greater Than (c.gt)</name>
          <t>When present, Greater Than indicates the upper limit value the sampled value SHOULD cross before triggering a notification. A notification is sent whenever the sampled value crosses the specified upper limit value, relative to the last reported value, and the time for "c.pmin" has elapsed since the last notification. The sampled value is sent in the notification. If the value continues to rise, no notifications are generated as a result of "c.gt". If the value drops below the upper limit value then a notification is sent, subject again to the "c.pmin" time.</t>
          <t>The Greater Than parameter can only be supported on resources with a scalar numeric value.</t>
        </section>
        <section anchor="lt">
          <name>Less Than (c.lt)</name>
          <t>When present, Less Than indicates the lower limit value the resource value SHOULD cross before triggering a notification. A notification is sent whenever the sampled value crosses the specified lower limit value, relative to the last reported value, and the time for "c.pmin" has elapsed since the last notification. The sampled value is sent in the notification. If the value continues to fall no notifications are generated as a result of "c.lt". If the value rises above the lower limit value then a new notification is sent, subject to the "c.pmin" time.</t>
          <t>The Less Than parameter can only be supported on resources with a scalar numeric value.</t>
        </section>
        <section anchor="st">
          <name>Change Step (c.st)</name>
          <t>When present, Change step indicates how much the value representing a resource state SHOULD change before triggering a notification, compared to the previous resource state. Upon reception of a query including the "c.st" attribute, the current resource state representing the most recently sampled value is reported, and then set as the last reported value (last_rep_v). When a subsequent sampled value or update of the resource state differs from the last reported state by an amount, positive or negative, greater than or equal to st, and the time for "c.pmin" has elapsed since the last notification, a notification is sent and the last reported value is updated to the new resource state sent in the notification. The change step MUST be greater than zero otherwise the receiver MUST return a CoAP error code 4.00 "Bad Request" (or equivalent).</t>
          <t>The Change Step parameter can only be supported on resources with a scalar numeric value.</t>
          <t>Note: due to sampling and other constraints, e.g. "c.pmin", the change in resource states received in two sequential notifications may differ by more than "c.st".</t>
        </section>
        <section anchor="band">
          <name>Notification Band (c.band)</name>
          <t>The Notification Band attribute allows a bounded or unbounded (based on a minimum or maximum) value range that may trigger multiple notifications. This enables use cases where different ranges result in differing behaviour. For example, in monitoring the temperature of machinery, whilst the temperature is in the normal operating range, only periodic updates are needed. However as the temperature moves to more abnormal ranges more frequent state updates may be sent to clients.</t>
          <t>Without a notification band, a transition across a Less Than (c.lt), or Greater Than (c.gt) limit only generates one notification.  This means that it is not possible to describe a case where multiple notifications are sent so long as the limit is exceeded.</t>
          <t>The "c.band" attribute works as a modifier to the behaviour of "c.gt" and "c.lt". Its use is determined only by its presence, and not its value. Therefore, if "c.band" is present in a query, "c.gt", "c.lt" or both, MUST be included.</t>
          <t>When "c.band" is present with "c.lt" but without "c.gt", the lower bound for the notification band (notification band minimum) is defined. Notifications occur when the resource value is equal to or above the notification band minimum. No maximum values exist for the band.</t>
          <t>When "c.band" is present with "c.gt" but without "c.lt", the upper bound for the notification band (notification band maximum) is defined. Notifications occur when the resource value is equal to or below the notification band maximum. No minimum values exist for the band.</t>
          <t>If "c.band" is specified in which the value of "c.gt" is less than that of "c.lt", in-band notification occurs. That is, notification occurs whenever the resource value is between the "c.gt" and "c.lt" values, including equal to "c.gt" or "c.lt".</t>
          <t>If "c.band" is specified in which the value of "c.gt" is greater than that of "c.lt", out-of-band notification occurs. That is, notification occurs when the resource value not between the "c.gt" and "c.lt" values, excluding equal to "c.gt" and "c.lt".</t>
          <t>The Notification Band parameter can only be supported on resources with a scalar numeric value.</t>
        </section>
        <section anchor="edge">
          <name>Edge (c.edge)</name>
          <t>When present, the Edge attribute indicates interest for receiving notifications of either the falling edge or the rising edge transition of a boolean resource state. When the value of the "c.edge" attribute is 0 (False), the server notifies the client each time a resource state changes from True to False. When the value of the "c.edge" attribute is 1 (True), the server notifies the client each time a resource state changes from False to True.</t>
          <t>The "c.edge" attribute can only be supported on resources with a boolean value.</t>
        </section>
      </section>
      <section anchor="conditional-control-attributes">
        <name>Conditional Control Attributes</name>
        <t>Conditional Control Attributes define the time intervals between consecutive notifications as well as the cadence of the evaluation of the conditions that trigger a notification. Conditional Control Attributes can be used to configure the internal server-driven sampling process for performing evaluations of the conditions of a resource. One or more Conditional Control Attributes MAY be included in an Observe request.</t>
        <t>Conditional Control Attributes are defined below:</t>
        <table anchor="controlattributes">
          <name>Conditional Control Attributes</name>
          <thead>
            <tr>
              <th align="left">Attribute</th>
              <th align="left">Name</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Minimum Period (s)</td>
              <td align="left">c.pmin</td>
              <td align="left">xs:decimal (&gt;0)</td>
            </tr>
            <tr>
              <td align="left">Maximum Period (s)</td>
              <td align="left">c.pmax</td>
              <td align="left">xs:decimal (&gt;0)</td>
            </tr>
            <tr>
              <td align="left">Minimum Evaluation Period (s)</td>
              <td align="left">c.epmin</td>
              <td align="left">xs:decimal (&gt;0)</td>
            </tr>
            <tr>
              <td align="left">Maximum Evaluation Period (s)</td>
              <td align="left">c.epmax</td>
              <td align="left">xs:decimal (&gt;0)</td>
            </tr>
            <tr>
              <td align="left">Confirmable Notification</td>
              <td align="left">c.con</td>
              <td align="left">xs:boolean</td>
            </tr>
          </tbody>
        </table>
        <section anchor="pmin">
          <name>Minimum Period (c.pmin)</name>
          <t>When present, Minimum Period indicates the minimum time, in seconds, between two consecutive notifications (whether or not the resource state has changed). In the absence of this parameter, the minimum period is up to the server. Minimum Period MUST be greater than zero otherwise the receiver MUST return a CoAP error code 4.00 "Bad Request" (or equivalent).</t>
          <t>A server MAY update the resource state with the last sampled value that occurred during the "c.pmin" interval, after the "c.pmin" interval expires.</t>
          <t>Note: due to finite quantization effects, the time between notifications may be greater than "c.pmin" even when the sampled value changes within the "c.pmin" interval. "c.pmin" may or may not be used to drive the internal sampling process.</t>
        </section>
        <section anchor="pmax">
          <name>Maximum Period (c.pmax)</name>
          <t>When present, Maximum Period indicates the maximum time, in seconds, between two consecutive notifications (regardless of whether or not the resource state has changed). In the absence of this parameter, the maximum period is up to the server. Maximum Period MUST be greater than zero and MUST be greater than or equal to Minimum Period (if present), otherwise the receiver MUST return a CoAP error code 4.00 "Bad Request" (or equivalent).</t>
        </section>
        <section anchor="epmin">
          <name>Minimum Evaluation Period (c.epmin)</name>
          <t>When present, Minimum Evaluation Period indicates the minimum time, in seconds, the client recommends to the server to wait between two consecutive evaluations of the conditions of a resource, since the client has no interest in the server doing more frequent evaluations. When the value of Minimum Evaluation Period expires after the previous evaluation, the server MAY immediately perform a new evaluation. In the absence of this parameter, the minimum evaluation period is not defined and thus not used by the server. The server MAY use "c.pmin", if defined, as a guidance on the desired evaluation cadence. Minimum Evaluation Period MUST be greater than zero, otherwise the receiver MUST return a CoAP error code 4.00 "Bad Request" (or equivalent).</t>
        </section>
        <section anchor="epmax">
          <name>Maximum Evaluation Period (c.epmax)</name>
          <t>When present, Maximum Evaluation Period indicates the maximum time, in seconds, the server MAY wait between two consecutive evaluations of the conditions of a resource. When the value of Maximum Evaluation Period expires after the previous evaluation, the server MUST immediately perform a new evaluation. In the absence of this parameter, the maximum evaluation period is not defined and thus not used by the server. Maximum Evaluation Period MUST be greater than zero and MUST be greater than Minimum Evaluation Period (if present), otherwise the receiver MUST return a CoAP error code 4.00 "Bad Request" (or equivalent).</t>
        </section>
        <section anchor="con">
          <name>Confirmable Notification (c.con)</name>
          <t>When present with a value of 1 (True), Confirmable Notification indicates a notification MUST be confirmable, i.e., the server MUST send the notification in a confirmable CoAP message, to request an acknowledgement from the client. When present with a value of 0 (False), Confirmable Notification indicates a notification can be confirmable or non-confirmable, i.e., it can be sent in a confirmable or a non-confirmable CoAP message.</t>
        </section>
      </section>
      <section anchor="server-processing-of-conditional-attributes">
        <name>Server processing of Conditional Attributes</name>
        <t>Conditional Notification Attributes and Conditional Control Attributes may be present in the same query. However, they are not defined at multiple prioritization levels. The server sends a notification whenever any of the parameter conditions are met, upon which it updates its last notification value and time to prepare for the next notification. Only one notification occurs when there are multiple conditions being met at the same time. As a general example, the pseudocode illustrated in <xref target="pseudocode"/> shows one way to determine when a notification is to be sent.</t>
      </section>
    </section>
    <section anchor="Implementation">
      <name>Implementation Considerations</name>
      <t>When "c.pmax" and "c.pmin" are equal, the expected behaviour is that notifications will be sent every (c.pmin == c.pmax) seconds. However, these notifications can only be fulfilled by the server on a best effort basis. Because "c.pmin" and "c.pmax" are designed as acceptable tolerance bounds for sending state updates, a query from an interested client containing equal "c.pmin" and "c.pmax" values must not be seen as a hard real-time scheduling contract between the client and the server.</t>
      <t>The use of the notification band minimum and maximum allows for a synchronization whenever a change in the resource value occurs. Theoretically this could occur in-line with the server internal sample period or as defined by the "c.epmin" and "c.epmax" values for determining the resource value. Implementors SHOULD consider the resolution needed before updating the resource, e.g. updating the resource when a temperature sensor value changes by 0.001 degree versus 1 degree.</t>
      <t>When a server has multiple observations with different measurement cadences as defined by the "c.epmin" and "c.epmax" values, the server MAY evaluate all observations when performing the measurement of any one observation.</t>
      <t>This specification defines conditional attributes that can be used with CoAP Observe relationships between CoAP clients and CoAP servers. However, it is recognised that the presence of one or more proxies between a client and a server can interfere with clients receiving resource updates, if a proxy does not supply resource representations when the value remains unchanged (e.g. if "c.pmax" is set, and the server sends multiple updates when the resource state contains the same value). A server SHOULD use the Max-Age option to mitigate this by setting Max-Age to be less than or equal to "c.pmax".</t>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>The security considerations in Section 11 of <xref target="RFC7252"/> apply. Additionally, the security considerations in Section 7 of <xref target="RFC7641"/> also apply.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This specification requests a new Conditional Attributes registry to ensure attributes map uniquely to parameter names.</t>
      <t>Note to IANA: Please replace "RFC XXXX" with the assigned RFC number in the table below.</t>
      <table>
        <thead>
          <tr>
            <th align="left">Attribute</th>
            <th align="left">Parameter</th>
            <th align="left">Value</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Minimum Period (s)</td>
            <td align="left">c.pmin</td>
            <td align="left">xs:decimal (&gt;0)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Maximum Period (s)</td>
            <td align="left">c.pmax</td>
            <td align="left">xs:decimal (&gt;0)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Minimum Evaluation Period (s)</td>
            <td align="left">c.epmin</td>
            <td align="left">xs:decimal (&gt;0)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Maximum Evaluation Period (s)</td>
            <td align="left">c.epmax</td>
            <td align="left">xs:decimal (&gt;0)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Confirmable Notification</td>
            <td align="left">c.con</td>
            <td align="left">xs:boolean</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Greater Than</td>
            <td align="left">c.gt</td>
            <td align="left">xs:decimal</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Less Than</td>
            <td align="left">c.lt</td>
            <td align="left">xs:decimal</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Change Step</td>
            <td align="left">c.st</td>
            <td align="left">xs:decimal (&gt;0)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Notification Band</td>
            <td align="left">c.band</td>
            <td align="left">(none)</td>
            <td align="left">RFC XXXX</td>
          </tr>
          <tr>
            <td align="left">Edge</td>
            <td align="left">c.edge</td>
            <td align="left">xs:boolean</td>
            <td align="left">RFC XXXX</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Hannes Tschofenig and Mert Ocak highlighted syntactical corrections in the usage of pmax and pmin in a query. David Navarro proposed allowing for pmax to be equal to pmin. Marco Tiloca provided an extensive review.</t>
    </section>
    <section anchor="contributors">
      <name>Contributors</name>
      <artwork><![CDATA[
Christian Groves
Australia
email: cngroves.std@gmail.com

Zach Shelby
ARM
Vuokatti
FINLAND
phone: +358 40 7796297
email: zach.shelby@arm.com

Matthieu Vial
Schneider-Electric
Grenoble
France
phone: +33 (0)47657 6522
eMail: matthieu.vial@schneider-electric.com

Jintao Zhu
Huawei
Xi’an, Shaanxi Province
China
email: jintao.zhu@huawei.com 
]]></artwork>
    </section>
    <section anchor="changelog">
      <name>Changelog</name>
      <t>draft-ietf-core-conditional-attributes-06</t>
      <ul spacing="normal">
        <li>Removed code block from Section 3.5</li>
        <li>Added an appendix containing pseudocode for server processing.</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-05</t>
      <ul spacing="normal">
        <li>Multiple (mostly editorial) clarifications and updates based on review comments on mailing list from Marco Tiloca.</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-04</t>
      <ul spacing="normal">
        <li>Reference code updated to include behaviour for edge attribute.</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-03</t>
      <ul spacing="normal">
        <li>Attribute names updated to create uniqueness for use as conditional observe attributes.</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-02</t>
      <ul spacing="normal">
        <li>Clarifications on usage and value of the band parameter</li>
        <li>Implementation considerations for proxies added</li>
        <li>Security considerations added</li>
        <li>IANA considerations added</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-01</t>
      <ul spacing="normal">
        <li>Clarifications on True and False values for Edge and Con Attributes</li>
        <li>Alan Soloway added as author</li>
      </ul>
      <t>draft-ietf-core-conditional-attributes-00</t>
      <ul spacing="normal">
        <li>Conditional Atttributes section from draft-ietf-core-dynlink-13 separated into own WG draft</li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <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>
      <reference anchor="RFC7641" target="https://www.rfc-editor.org/info/rfc7641">
        <front>
          <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
          <author fullname="K. Hartke" initials="K." surname="Hartke">
            <organization/>
          </author>
          <date month="September" year="2015"/>
          <abstract>
            <t>The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks.  The state of a resource on a CoAP server can change over time.  This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time.  The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7641"/>
        <seriesInfo name="DOI" value="10.17487/RFC7641"/>
      </reference>
      <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="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>
    </references>
    <section anchor="pseudocode">
      <name>Pseudocode: Processing Conditional Attributes</name>
      <t>This appendix is informative. It describes the possible logic of how a server processes conditional attributes to determine when to send a notification to a client.</t>
      <t>Note: The pseudocode is not exhaustive nor should it be treated as reference code. It depicts a subset of the conditional attributes described in this document.</t>
      <figure anchor="figattrint">
        <name>Pseudocode showing the logic for processing conditional attributes</name>
        <artwork><![CDATA[
// struct Resource {
//
//  bool band;
//  int pmin;
//  int pmax;
//  int epmin;
//  int epmax;
//  int st;
//  int gt;
//  int lt;
//  
//  time_t last_sampled_time;
//  time_t last_rep_time;

//  int curr_state;
//  int prev_state;   
//
//  ...
//
// };


boolean is_notifiable( Resource * r ) {

    time_t curr_time = get_current_time();

    #define BAND_EXISTS ( r->band )

    #define LT_EXISTS ( r->lt )
    #define GT_EXISTS ( r->gt )
   
    #define EPMIN_TRUE ( curr_time - r->last_sampled_time >= r->epmin )
    #define EPMAX_TRUE ( curr_time - r->last_sampled_time > r->epmax )
    
    #define PMIN_TRUE ( curr_time - r->last_reported_time >= r->pmin )
    #define PMAX_TRUE ( curr_time - r->last_reported_time > r->pmax )

    #define LT_TRUE ( r->curr_state < r->lt ^ r->prev_state < r->lt )
    #define GT_TRUE ( r->curr_state > r->gt ^ r->prev_state > r->gt )

    #define ST_TRUE ( abs( r->curr_state - r->prev_state ) >= r->st )

    #define INBAND_TRUE ( gt < lt && (gt <= curr_state && curr_state <= lt ))
    #define OUTOFBAND_TRUE ( lt < gt && (gt < curr_state || curr_state < lt ))
    
    #define BANDMIN_TRUE ( r->lt <= r->curr_state)
    #define BANDMAX_TRUE (r->curr_state <= r->gt)


    if PMAX_TRUE {
        return true;
    }
    
    if PMIN_TRUE {
        if !BAND_EXISTS {
            if LT_TRUE || GT_TRUE || ST_TRUE {
                return true;
            }
        }
        else {
         if ( ( BANDMIN_TRUE && !GT_EXISTS) || (BANDMAX_TRUE && !LT_EXISTS) || INBAND_TRUE || OUTOFBAND_TRUE ) {
             return true;
         }
        }
    }

    return false;
    
}

]]></artwork>
      </figure>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This appendix is informative. It provides some examples of the use of Conditional Attributes.</t>
      <t>Note: For brevity only the method or response code is shown in the header field.</t>
      <section anchor="minimum-period-cpmin-example">
        <name>Minimum Period (c.pmin) example</name>
        <figure anchor="figbindexp1">
          <name>Client registers and receives one notification of the current state and one of a new state state when c.pmin time expires.</name>
          <artwork><![CDATA[
        Observed   CLIENT  SERVER     Actual
    t   State         |      |         State
        ____________  |      |  ____________
    1                 |      |
    2    unknown      |      |     18.5 Cel
    3                 +----->|                  Header: GET
    4                 | GET  |                   Token: 0x4a
    5                 |      |                Uri-Path: temperature
    6                 |      |               Uri-Query: c.pmin="10"
    7                 |      |                 Observe: 0 (register)
    8                 |      |
    9   ____________  |<-----+                  Header: 2.05
   10                 | 2.05 |                   Token: 0x4a
   11    18.5 Cel     |      |                 Observe: 9
   12                 |      |                 Payload: "18.5 Cel"
   13                 |      |  ____________
   14                 |      |
   15                 |      |     23 Cel
   16                 |      |
   17                 |      |
   18                 |      |
   19                 |      |  ____________
   20   ____________  |<-----+                  Header: 2.05
   21                 | 2.05 |     26 Cel        Token: 0x4a
   22    26 Cel       |      |                 Observe: 20
   23                 |      |                 Payload: "26 Cel"
   24                 |      |
   25                 |      |
]]></artwork>
        </figure>
      </section>
      <section anchor="maximum-period-cpmax-example">
        <name>Maximum Period (c.pmax) example</name>
        <figure anchor="figbindexp2">
          <name>Client registers and receives one notification of the current state, one of a new state and one of an unchanged state when c.pmax time expires.</name>
          <artwork><![CDATA[
        Observed   CLIENT  SERVER     Actual
    t   State         |      |         State
        ____________  |      |  ____________
    1                 |      |
    2    unknown      |      |     18.5 Cel
    3                 +----->|                  Header: GET
    4                 | GET  |                   Token: 0x4a
    5                 |      |                Uri-Path: temperature
    6                 |      |               Uri-Query: c.pmax="20"
    7                 |      |                 Observe: 0 (register)
    8                 |      |
    9   ____________  |<-----+                  Header: 2.05
   10                 | 2.05 |                   Token: 0x4a
   11    18.5 Cel     |      |                 Observe: 9
   12                 |      |                 Payload: "18.5 Cel"
   13                 |      |
   14                 |      |
   15                 |      |  ____________
   16   ____________  |<-----+                  Header: 2.05
   17                 | 2.05 |     23 Cel        Token: 0x4a
   18    23 Cel       |      |                 Observe: 16
   19                 |      |                 Payload: "23 Cel"
   20                 |      |
   21                 |      |
   22                 |      |
   23                 |      |
   24                 |      |
   25                 |      |
   26                 |      |
   27                 |      |
   28                 |      |
   29                 |      |
   30                 |      |
   31                 |      |
   32                 |      |
   33                 |      |
   34                 |      |   
   35                 |      |
   36                 |      |  ____________
   37   ____________  |<-----+                  Header: 2.05
   38                 | 2.05 |     23 Cel        Token: 0x4a
   39    23 Cel       |      |                 Observe: 37
   40                 |      |                 Payload: "23 Cel"
   41                 |      |
   42                 |      |
]]></artwork>
        </figure>
      </section>
      <section anchor="greater-than-cgt-example">
        <name>Greater Than (c.gt) example</name>
        <figure anchor="figbindexp3">
          <name>Client registers and receives one notification of the current state and one of a new state when it passes through the greater than threshold of 25.</name>
          <artwork><![CDATA[
     Observed   CLIENT  SERVER     Actual
 t   State         |      |         State
     ____________  |      |  ____________
 1                 |      |
 2    unknown      |      |     18.5 Cel
 3                 +----->|                  Header: GET 
 4                 | GET  |                   Token: 0x4a
 5                 |      |                Uri-Path: temperature
 6                 |      |               Uri-Query: c.gt=25
 7                 |      |                 Observe: 0 (register)
 8                 |      |
 9   ____________  |<-----+                  Header: 2.05 
10                 | 2.05 |                   Token: 0x4a
11    18.5 Cel     |      |                 Observe: 9
12                 |      |                 Payload: "18.5 Cel"
13                 |      |                 
14                 |      |
15                 |      |  ____________
16   ____________  |<-----+                  Header: 2.05 
17                 | 2.05 |     26 Cel        Token: 0x4a
18    26 Cel       |      |                 Observe: 16
29                 |      |                 Payload: "26 Cel"
20                 |      |                 
21                 |      |
]]></artwork>
        </figure>
      </section>
      <section anchor="greater-than-cgt-and-period-max-cpmax-example">
        <name>Greater Than (c.gt) and Period Max (c.pmax) example</name>
        <figure anchor="figbindexp4">
          <name>Client registers and receives one notification of the current state, one when c.pmax time expires and one of a new state when it passes through the greater than threshold of 25.</name>
          <artwork><![CDATA[
     Observed   CLIENT  SERVER     Actual
 t   State         |      |         State
     ____________  |      |  ____________
 1                 |      |
 2    unknown      |      |     18.5 Cel
 3                 +----->|                  Header: GET 
 4                 | GET  |                   Token: 0x4a
 5                 |      |                Uri-Path: temperature
 6                 |      |         Uri-Query: c.pmax=20;c.gt=25
 7                 |      |                 Observe: 0 (register)
 8                 |      |
 9   ____________  |<-----+                  Header: 2.05 
10                 | 2.05 |                   Token: 0x4a
11    18.5 Cel     |      |                 Observe: 9
12                 |      |                 Payload: "18.5 Cel"
13                 |      |                 
14                 |      |
15                 |      |
16                 |      |
17                 |      |
18                 |      |
19                 |      |
20                 |      |
21                 |      |
22                 |      |
23                 |      |
24                 |      |
25                 |      |
26                 |      |
27                 |      |
28                 |      |
29                 |      |  ____________
30   ____________  |<-----+                  Header: 2.05
31                 | 2.05 |     23 Cel        Token: 0x4a
32    23 Cel       |      |                 Observe: 30
33                 |      |                 Payload: "23 Cel"
34                 |      |                 
35                 |      |
36                 |      |  ____________
37   ____________  |<-----+                  Header: 2.05 
38                 | 2.05 |     26 Cel        Token: 0x4a
39    26 Cel       |      |                 Observe: 37
40                 |      |                 Payload: "26 Cel"
41                 |      |                 
42                 |      |
]]></artwork>
        </figure>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
gkIYVamsgUCHUmLY15rm/04DrdTY5zVeNEL5RnOmCuUbyzEPzIkFw6dZFdag
AmNb0yargTl6TQKmQcE0X4NWsT/+kW3h931HMfChu+h97Ljtr+3N+9M3z12A
EQJclABdCL/+6sFzwNUUwBEDRdKv9/0Vb9eHWJZXmLWv6Al0oDFy7ojHx8Ak
ZHr7GcwbWAR8cF1iRkMMRuUQePwHV1vLFt1q5AcW/qL8ahjpd2/EwXyug/o3
gc7fgQHzbcF/HvWAC3+wpmAbJ9/ySIXtr7x2VzzgZ4W/21WkmzGuonutKK87
zzFsUb2Da+1a8NDqHGuN4I7w7ps6rVrGALSpZ8rZyjvroMwEBs1ejU60Hqpt
xDJ7DG4ODHRSCmFNshJmI9KeJ9G7PM3BiL1bitcW8eWtGCXSLpuqxUPMRXsr
qcjWeGyFGXev3hSnc/AlvQyOzaWI8LpP25FcjVkwaP1oChuOvDHvJIIM7tXR
4etTSD8P331/+I5aD8K80Ekplk1OSIPM51fvj2m2kM+cj9vZfU6dR1W5t52p
eYz/FDHWO2K/mf4dfTl8wJ4KheRuDdQXtOhvfq01sJdE0Ql7cXhKY/ca0IA2
d4Hl5zT5IOIJ27ncUznvg9Y1VJ+/T+XgLc+XE3cTimA83BQGgvgO6y4TXerc
7412egTj0cZ4GM5P8OiHqi6LVJnRL1uBUPNjVmPu10TlL2rjLJHHQ8iT4fdo
pwE2Nm5C5RFJimH4hqt7TCPHrUuqNbzlV1HCZxPWMzMRaUd12WqX6VGTMKk/
1HyDuIx3jUSP2oWCmtv5Tc3dnBw9vsWSxsi5u7J93KTjDtvHDy1HWY3t43Gt
y81sH+/Q0C6mVT4l39VUxPVxNyPH7Yz0HBm+WVJcrkf23oU53qvUThWF9Pm3
+mVrm6npd2yoQEa9d1S/jA93jvQLHNQNAMw29T4IBbXmuD56wLaz6787j8rn
/4Hz4Jf7vfHvzqNldX8H5/Gp7qLmelAS7kzhJhFw7fRuh51W3sbrcjOFRw9v
9ESVj2Ond0s73SQa6k+r/3Ga2zl8gxf5RB/ByK91Nnd7+HG3uo3b6YrNu91U
2+2m2m431Xa7qbbbTjWm8uzdbsLtdpm8qlbsIhnvqhW7TUTeVCt2H9e63KwV
u7R1uNfOnlpDo1bsdTNwr4OBDdHL+DNGL/2m0MWNaGLnTFQlpMFd5GpI0/Qi
m9uFM5vFMrcLZDaLYrqYtHH8csfgBRTt7qHLJ8ctdwtaFvn+GPTy06OVLtt5
1ziFBXePUu4YonxqfNKZ2VY+QVeosnmccucgBRC4KURpTSV1fHK7PBLikw4n
WmuoJ5EdkUmtIeiKUxos8u7fIZ8ksytztub6NaZpUizUEcHKG3TAFi8TPFw+
h5in1SrjNOZmGVjyWySfv1vtfxqrXU8yxztf/W65/SX9c1juoKsE2VV/7Co+
duR7XQaz0z52JXFdGVxX+taVu3Ulbl1ZW1fK1ulqPPuze+dybGNWt1E2oxK+
26YyO0FHJlhrqOcx3Ymi/wm6csbNE8Y7Z4uAwE25Ymt4ohPF24UnkCjeMUvU
4UlHilhrCG6ZMO599oSxLQf8DYKX/wM7om+CsnMAAA==

-->

</rfc>
