<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<!-- You want a table of contents -->
<?rfc symrefs="yes"?>
<!-- Use symbolic labels for references -->
<?rfc sortrefs="yes"?>
<!-- This sorts the references -->
<?rfc iprnotified="no" ?>
<!-- Change to "yes" if someone has disclosed IPR for the draft -->
<?rfc compact="yes"?>
<rfc category="std" docName="draft-ietf-anima-constrained-grasp-00"
     ipr="pre5378Trust200902">
  <front>
    <title abbrev="cGRASP">Constrained GeneRic Autonomic Signaling
    Protocol</title>

    <author fullname="Longwei Zhu" initials="L." surname="Zhu">
      <organization abbrev="BUPT">Beijing University of Posts and
      Telecommunications</organization>

      <address>
        <postal>
          <street>No. 10 Xitucheng Road</street>

          <city>Haidian District, Beijing</city>

          <country>China</country>
        </postal>

        <email>lwzhu@bupt.edu.cn</email>
      </address>
    </author>

    <author fullname="Sheng Jiang" initials="S." surname="Jiang">
      <organization abbrev="BUPT">Beijing University of Posts and
      Telecommunications</organization>

      <address>
        <postal>
          <street>No. 10 Xitucheng Road</street>

          <city>Haidian District, Beijing</city>

          <country>China</country>
        </postal>

        <email>shengjiang@bupt.edu.cn</email>
      </address>
    </author>

    <author fullname="Cheng Sheng" initials="C." surname="Sheng">
      <organization>Huawei Technologies</organization>

      <address>
        <postal>
          <street>Q14 Huawei Campus, No.156 Beiqing Road.</street>

          <city>Beijing</city>

          <country>China</country>
        </postal>

        <email>shengcheng@huawei.com</email>
      </address>
    </author>

    <area>Operations and Management</area>

    <workgroup>ANIMA</workgroup>

    <abstract>
      <t>This document proposes the UDP-based Constrained GeneRic Autonomic
      Signaling Protocol (cGRASP), which is designed to be a constrained and
      lightweight version of the GeneRic Autonomic Signaling Protocol(GRASP,
      or the standard GRASP), with shortened messages and a built-in
      reliability mechanism. cGRASP can work reliably over UDP, making it
      suitable for IoT, where lightweight and resource-constrained devices
      dominate. Given the established ecosystem of CoAP and aiming to promote
      cGRASP adoption in IoT, this document also focuses on the cGRASP
      transition from UDP to a CoAP-based framework, i.e., CoAP-based cGRASP.
      Furthermore, this document also discusses the potential way to adapt the
      cGRASP to work on the network without IP connectivity.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro" title="Introduction">
      <t>In IoT that has developed rapidly in recent years, the traditional
      centralized and human-centered network management methods have gradually
      shown defects such as low efficiency and high operating costs due to the
      growth in the number, heterogeneity, diversity, and the increasingly
      uncertain distribution of devices. Autonomic Network<xref
      target="RFC8993"/> empowers networks and devices with self-management
      capabilities, enabling them to self-configure, self-optimize,
      self-recover, and self-protect without human intervention, effectively
      improving the stability and reliability of the network, which meets the
      development needs and trends of IoT and is essential for implementing
      IoT applications such as smart homes, smart cities, and industrial
      IoT.</t>

      <t>As a new network management solution for TCP/IP networks, the
      Autonomic Network does not intend to break the existing IP-based network
      architecture. So does the GRASP<xref target="RFC8990"/>, the signaling
      protocol in the Autonomic Network. While located between the transport
      layer and the application layer, GRASP provides reliable and efficient
      services for nodes in the Autonomic Network, like parameter discovery,
      exchange, and negotiation, based on the TCP/IP protocols. Since it does
      not provide reliability mechanisms such as error detection,
      retransmission, and flow control<xref target="RFC8990"/>, GRASP must
      depend on the reliability mechanisms provided by the transport layer,
      particularly its synchronization and negotiation procedures based on one
      or more round(s) of message interaction. It is specified in <xref
      target="RFC8990"/> that GRASP unicast messages MUST use the reliable
      transport layer protocol, e.g., TCP.</t>

      <t>However, the reliability provided by TCP is not free. GRASP must
      tolerate the inevitable additional latency, control overhead, and memory
      consumption caused by complex reliability mechanisms of TCP, e.g., the
      resource consumption and control overhead associated with establishing,
      maintaining, and closing TCP connections. In addition, the size of the
      TCP/IP stack on which GRASP relies and the memory resources required to
      run it are not negligible, e.g., running a standard full TCP/IP stack
      requires at least tens to hundreds of KBs of data and code memory, and
      even TCP/IP stacks specifically designed and implemented for
      resource-constrained devices require tens of KBs of memory. However, the
      resource-constrained device typically has only about 50KB of memory<xref
      target="RFC7228"/>. Obviously, in the IoT networks dominated by
      resource-constrained devices with limited CPU, memory, and power
      resources, the resource footprint of the TCP/IP stack and its execution,
      especially the TCP, is likely to be a limiting factor in the deployment
      of the Autonomic Network and GRASP. Therefore, making GRASP lightweight
      and removing its dependence on TCP or even IP is of great significance
      for the deployment and promotion of GRASP in the IoT. In addition,
      considering the generally short length of interaction messages between
      IoT nodes, it is also necessary to shorten the length of GRASP messages
      with the best efforts, especially the control fields, which can also
      reduce the overhead of nodes in processing, parsing, and sending GRASP
      messages.</t>

      <t>Considering the demand for self-management and the
      resource-constrained feature of IoT devices, this document proposes the
      UDP-based Constrained GRASP (cGRASP). By reducing the length of fixed
      fields, and adding a built-in reliability mechanism with the
      acknowledgment and retransmission capability, cGRASP can provide
      reliable signaling services without relying on TCP. Since the wide
      adoption and mature ecosystem of CoAP<xref target="RFC7252"/> in
      low-power and low-bandwidth networks, migrating cGRASP from UDP-based to
      CoAP-based would significantly benefit its deployment in current IoT
      networks. Hence, the CoAP-based cGRASP is also considered and proposed
      in this document. In addition, to better address the need for
      self-management of the IoT, the possible IP-independent extension is
      discussed, which can extend the use of cGRASP to networks without IP
      connectivity.</t>
    </section>

    <section anchor="requirements" title="Requirements">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
      "SHALL&nbsp;NOT", "SHOULD", "SHOULD&nbsp;NOT", "RECOMMENDED",
      "NOT&nbsp;RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
      interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/> <xref
      target="RFC8174"/> when, and only when, they appear in all capitals, as
      shown here.</t>
    </section>

    <section anchor="reliability-mechannism"
             title="Built-in reliability mechanism">
      <t>cGRASP is designed to be UDP-based to avoid the additional control
      overhead and memory consumption caused by TCP, thus matching the
      capabilities of IoT nodes. Meanwhile, to ensure reliability, the cGRASP
      introduces a message-oriented built-in reliability mechanism.</t>

      <t>cGRASP uses the 16-bit random number called Nonce to implement the
      acknowledgment and retransmission mechanism for messages to avoid
      interaction failures caused by message losses. However, as discussed in
      <xref target="cgrasp-msg"/>, not all cGRASP messages require
      acknowledgment, such as multicast messages. The cGRASP messages that
      require acknowledgment are referred to in this document as confirmable
      messages, and the others that do not require acknowledgment are referred
      to as non-confirmable messages. The transmission of confirmable messages
      MUST use the reliability mechanism defined in this section, while
      non-confirmable messages do not.</t>

      <section anchor="reliable-transmission"
               title="Reliable transmission for confirmable cGRASP messages">
        <t>When sending a confirmable message, the cGRASP sender MUST generate
        a 16-bit random Nonce and append the Nonce to the message. Upon
        receipt of a confirmable message, the receiver MUST acknowledge
        immediately using the same Nonce as that of the received, or wait for
        a post-order message in the same direction and piggyback acknowledge
        with this message within the CGRASP_ACK_DELAYED_TIME. The latter is
        the delayed acknowledgment, if there is no corresponding message to be
        sent within the CGRASP_ACK_DELAYED_TIME, an ACK message MUST be sent
        immediately. cGRASP defines two new options, i.e., the REQ-ACK option
        and the ACK option. The REQ-ACK option is used to carry the Nonce
        generated by cGRASP for a specific confirmable message and MUST be
        added to this message as an option. The ACK option also contains a
        Nonce for acknowledging a corresponding confirmable message, which
        MUST be added as an option to an ACK message (immediate
        acknowledgment) or a post-order message in the same direction (delayed
        acknowledgment). The REQ-ACK option, the ACK option, and the ACK
        message are defined in <xref target="req-ack-option"/>, <xref
        target="ack-option"/>, and <xref target="cgrasp-msg"/>,
        respectively.</t>

        <t>The Nonce can be regarded as the unique identifier of a confirmable
        message before it is acknowledged. Thus, the cGRASP nodes MUST avoid
        Nonce conflicts among unacknowledged confirmable messages.
        Specifically, the Nonce SHOULD be generated by a pseudo-random number
        generator (PRNG) based on the locally generated unique seed to avoid
        the conflict of Nonce generated by different nodes in the same
        network. Meanwhile, the cGRASP instance SHOULD create and maintain a
        Nonce cache to record the Nonce used by confirmable messages. After
        generating a Nonce for a message, the cGRASP MUST check whether it
        conflicts with an existing entry in the Nonce cache, and if it
        doesn't, it SHOULD record the Nonce in the cache. Otherwise, the Nonce
        for the confirmable message MUST be regenerated. After the cGRASP node
        receives a message with an ACK option(or more than one ACK option), it
        SHOULD first extract the Nonce from it and check whether there is a
        corresponding entry with the same Nonce value in the Nonce cache; if
        not, the received message SHOULD be directly ignored. Otherwise, the
        cGRASP node SHOULD mark the Nonce entry as acknowledged and delete it
        when the corresponding cGRASP session is completed. It is worth
        emphasizing that confirmable messages marked as acknowledged SHOULD
        also be considered by the aforementioned Nonce conflict detection.</t>

        <t>The cGRASP sender MUST set the retransmission timer when sending a
        confirmable message; see <xref target="retransmission-timeout"/> for
        details on setting the timeout. If the cGRASP confirmable message does
        not get an acknowledgment within the retransmission timeout, then the
        message MUST be retransmitted. The retransmission message SHOULD keep
        the Nonce the same as the original message. However, when a
        confirmable message has been accepted and processed by the receiver
        but is retransmitted due to lost acknowledgment, the cGRASP can not
        identify the retransmission message and will repeatedly process it,
        which can be dangerous. Thus, the cGRASP receiver SHOULD record and
        cache the Nonces of confirmable messages that have been received and
        processed for each cGRASP session until it is completed and check
        whether the Nonce of each arriving message conflicts with the cached
        Nonces, if it doesn't, then accept and process it. Otherwise, which
        means the message is a retransmission message, cGRASP SHOULD discard
        it and send acknowledgment, to avoid duplicated processing of the
        retransmission and original messages due to the loss of the
        acknowledgment.</t>

        <t>The delayed acknowledgment mechanism can reduce the communication
        cost caused by the ACK message, but its waiting time may cause
        unnecessary delay, which reduces the efficiency of communication. In
        the actual cGRASP implementation, users SHOULD be allowed to enable or
        completely disable delayed acknowledgment according to their
        needs.</t>
      </section>

      <section anchor="retransmission-timeout"
               title="Retransmission and retransmission timeout">
        <t>The retransmission timeout for reliable transmission of cGRASP
        messages is CGRASP_RETRANS_TIMEOUT. If the cGRASP message is not
        acknowledged within the retransmission timeout and the number of
        retransmissions does not reach MAX_RETRANS, the message MUST be
        retransmitted and the retransmission timer SHOULD be reset, the
        retransmission timeout SHOULD be incremented to twice, and the number
        of retransmissions SHOULD be incremented by 1. If the cGRASP message
        is not acknowledged within the retransmission timeout and the number
        of retransmissions exceeds MAX_RETRANS, the retransmission MUST be
        discarded, and the transmission fails.</t>
      </section>
    </section>

    <section anchor="cgrasp-definition" title="cGRASP definition">
      <t>cGRASP has made modifications to the standard GRASP by reducing the
      fixed fields and introducing a message-oriented built-in reliability
      mechanism with the acknowledgment and retransmission capability based on
      Nonce. To achieve this, cGRASP redefines the Objective option in
      standard GRASP as the cGRASP Objective option and defines a new message
      named ACK message, along with two new options named REQ-ACK option and
      ACK option. However, cGRASP does not modify the discovery, negotiation,
      synchronization, and flooding procedures, as well as the defined options
      (except for the Objective option) of the standard GRASP. In addition,
      cGRASP still adheres to the High-Level Deployment Model and High-Level
      Design defined for GRASP, so as not to affect the signaling service
      provided by the protocol. In order to differentiate from standard GRASP,
      cGRASP instances SHOULD listen for messages using a new well-known port,
      CGRASP_LISTEN_PORT (TBD1).</t>

      <section anchor="cgrasp-msg-format" title="cGRASP message format">
        <t>Like standard GRASP, cGRASP messages continue to be transmitted in
        Concise Binary Object Representation (CBOR)<xref target="RFC8949"/>
        and be described using Concise Data Definition Language (CDDL)<xref
        target="RFC8610"/>. The session-id in the cGRASP message is shortened
        from 32 bits to 16 bits to minimize the length of the message, while
        the meanings of the other fields are still consistent with the
        standard GRASP message. In fragmentary CDDL, a cGRASP message follows
        the pattern:<figure>
            <artwork><![CDATA[
 cgrasp-message = (message .within message-structure) / noop-message
 message-structure = [C_MESSAGE_TYPE, session-id, ?initiator,
                      *cgrasp-option]
 C_MESSAGE_TYPE = 0..255
 session-id = 0..65535 ; up to 16 bits
 cgrasp-option = any
 ]]></artwork>
          </figure></t>
      </section>

      <section anchor="cgrasp-option" title="cGRASP option">
        <section anchor="cgrasp-objective-option"
                 title="cGRASP Objective option">
          <t>In fragmentary CDDL, a cGRASP Objective option follows the
          pattern:<figure>
              <artwork><![CDATA[
 cGRASP objective = [objective-num, objective-flags, loop-count, 
                 ?objective-value]
 objective-num = 0..255
 objective-value = any
 loop-count = 0..255
 objective-flags = uint .bits objective-flag
 objective-flag = &(
     F_DISC:    0; valid for discovery
     F_NEG:     1; valid for negotiation
     F_SYNCH:   2; valid for synchronization
     F_NEG_DRY: 3; negotiation is a dry run
 )
 ]]></artwork>
            </figure>Instead of using the text string with indefinite length
          (i.e., objective-name) as the unique identifier for the Objective
          option, the cGRASP Objective option is uniquely identified by an
          8-bit number (i.e., objective-num), with the remaining fields
          keeping consistent with the Objective option in standard GRASP. The
          first two bits of objective-num indicate the cGRASP Objective type
          (00, 01, and 10 stand for generic cGRASP Objective; 11 stands for
          privately defined cGRASP Objective), and represent the number of
          cGRASP Objective together with the remaining six bits. Each generic
          cGRASP Objective MUST be assigned a unique objective number and be
          made public to all cGRASP nodes when it's registered. When a private
          cGRASP Objective is defined, it MUST also be assigned a uniquely
          distinguishable objective number and be made public within the
          specific private domain.</t>

          <t>In cGRASP, the identifier of the cGRASP Objective option is
          changed from the text string with indefinite length to the 8-bit
          number, which can minimize the length of the cGRASP Objective
          option, and also can avoid the additional communication cost caused
          by excessively long objective-name text strings, and the overhead of
          byte-by-byte comparison and identification of objective-name in the
          standard GRASP.</t>
        </section>

        <section anchor="req-ack-option" title="REQ-ACK option">
          <t>The REQ-ACK option is used to indicate that the message MUST be
          acknowledged by the receiver. When a message needs acknowledgment
          (i.e., the confirmable message), the sender MUST generate the
          REQ-ACK option and add it to the message to request the receiver to
          acknowledge. The REQ-ACK option MUST NOT be allowed to appear in the
          non-confirmable message (like the Discovery message and the Flood
          Synchronization message) to avoid a large number of ACK messages in
          a short time. In fragmentary CDDL, a REQ-ACK option follows the
          pattern:<figure>
              <artwork><![CDATA[ 
 req-ack-option = [O_REQ_ACK, Nonce]
 Nonce = 0..65535
 ]]></artwork>
            </figure>Nonce is a 16-bit random number and MUST avoid local
          conflicts. The Nonce generation and conflict prevention mechanisms
          are described in <xref target="reliable-transmission"/>.</t>
        </section>

        <section anchor="ack-option" title="ACK option">
          <t>cGRASP also defines an ACK option for acknowledging messages
          carrying a REQ-ACK option. Upon receiving a message with the REQ-ACK
          option, as specified in <xref target="reliable-transmission"/>, the
          cGRASP receiver MUST either promptly send an ACK message with a
          corresponding ACK option; or wait a while for a post-order message
          in the same direction to be sent and add the ACK option to that
          message to piggyback acknowledge. The ACK option MUST only be
          allowed to appear in confirmable messages, as discussed in <xref
          target="cgrasp-msg"/>. In fragmentary CDDL, an ACK option follows
          the pattern:</t>

          <t><figure>
              <artwork><![CDATA[
 ack-option = [O_ACK, Nonce]
 Nonce = 0..65535; same as the req-ack option
 ]]></artwork>
            </figure>Where, the Nonce MUST be the same as the Nonce in the
          corresponding REQ-ACK option.</t>
        </section>
      </section>

      <section anchor="cgrasp-msg" title="cGRASP message">
        <t>cGRASP reserves all the message types and values of the standard
        GRASP, as well as the definitions of each related field. cGRASP
        extends its unicast messages to allow them to carry the REQ-ACK option
        or the ACK option, enabling cGRASP to implement a built-in reliability
        mechanism.</t>

        <t>All unicast messages used in the three procedures of discovery,
        negotiation, and synchronization of cGRASP MUST be acknowledged to
        ensure the reliability and operational efficiency of the interactions.
        At the same time, these unicast messages are allowed to carry zero or
        more ACK option(s) to acknowledge the confirmable message belonging to
        the same or different interaction session(s). In addition, Invalid
        messages are used to respond to invalid messages and contain related
        diagnostic information which if lost may affect the subsequent message
        interactions, thus its acknowledgment is necessary and MUST carry a
        REQ-ACK option. Similarly, the Invalid message can also carry zero or
        more ACK option(s) for acknowledgment.</t>

        <t>The Discovery message and Flood Synchronization message that is
        multicast, as well as the NOOP message that does not contain actual
        information, are not allowed to carry the REQ-ACK option or the ACK
        option, i.e., non-confirmable message, whose definition is the same as
        the standard GRASP and will not be repeated here. The CDDL definitions
        for messages with extension( i.e. the confirmable message) for
        reliability are defined as follows:<figure>
            <artwork><![CDATA[
 response-message = [M_RESPONSE, session-id, initiator, ttl,
                     req-ack-option, *ack-option, (+locator-option
                     // divert-option), ?cGRASP objective]
 ttl = 0..4294967295 ; in milliseconds
 
 request-negotiation-message = [M_REQ_NEG, session-id, req-ack-option,
                                *ack-option, cGRASP objective]
 
 request-synchronization-message = [M_REQ_SYN, session-id,
                                    req-ack-option,
                                    *ack-option, cGRASP objective]
 
 negotiation-message = [M_NEGOTIATE, session-id, req-ack-option,
                        *ack-option,cGRASP objective]
 
 end-message = [M_END, session-id, req-ack-option, *ack-option,
                cGRASP accept-option / decline-option]
 
 wait-message = [M_WAIT, session-id, req-ack-option, *ack-option,
                 waiting-time]
 waiting-time = 0..4294967295 ; in milliseconds
 
 synch-message = [M_SYNCH, session-id, req-ack-option, *ack-option,
                  cGRASP objective]
 
 invalid-message = [M_INVALID, session-id, req-ack-option, *ack-option,
                    ?any]
 ]]></artwork>
          </figure>In addition, cGRASP defines an ACK message for immediate
        acknowledgment. In fragmentary CDDL, an ACK message follows the
        pattern:<figure>
            <artwork><![CDATA[
 ack-message = [M_ACK, ack-option]
 ]]></artwork>
          </figure>The Nonce in the ACK option must be the same as the
        corresponding REQ-ACK option.</t>
      </section>

      <section anchor="cgrasp-constants" title="cGRASP constants">
        <t><list style="symbols">
            <t>CGRASP_LISTEN_PORT(TBD1)<vspace blankLines="1"/>A well-known
            UDP user port that every cGRASP-enabled network device MUST listen
            to for UDP-based messages.</t>

            <t>CGRASP_ACK_DELAYED_TIME(200 milliseconds)<vspace
            blankLines="1"/>The default maximum waiting time for delayed
            acknowledgment.</t>

            <t>CGRASP_RETRANS_TIMEOUT(2000 milliseconds)<vspace
            blankLines="1"/>The default timeout is used to determine that a
            cGRASP confirmable message needs to be resent.</t>

            <t>MAX_RETRANS(3)<vspace blankLines="1"/>The default maximum times
            of retransmission for confirmable messages.</t>
          </list> In addition, the constants for cGRASP also contain the
        ALL_CGRASP_NEIGHBORS, CGRASP_DEF_TIMEOUT, CGRASP_DEF_LOOPCT,
        CGRASP_DEF_MAX_SIZE, whose definitions and values are respectively
        same as the ALL_GRASP_NEIGHBORS, GRASP_DEF_TIMEOUT, GRASP_DEF_LOOPCT,
        GRASP_DEF_MAX_SIZE in GRASP<xref target="RFC8990"/>.</t>
      </section>
    </section>

    <section anchor="cgrasp-coap" title=" CoAP-based cGRASP">
      <t>CoAP<xref target="RFC7252"/> is a lightweight, RESTful protocol
      designed for resource-constrained IoT devices. It enables efficient
      communication in low-power and low-bandwidth networks, driving its wide
      adoption in IoT. Considering the growing demand for cGRASP and the
      mature ecosystem of CoAP, the transition from UDP to CoAP would
      significantly benefit the deployment of cGRASP in current IoT networks.
      Additionally, some works on extending CoAP messaging to work over non-IP
      network scenarios have been proposed, such as its adaptation to
      Bluetooth Low Energy (BLE) via CoAP over GATT<xref
      target="CoAPoverGATT"/>, which are of great help for the future cGRASP
      IP-independent extension. This section focuses on the exchange of
      CoAP-based cGRASP.</t>

      <section anchor="cgrasp-coap-overview"
               title="CoAP-based cGRASP overview">
        <t>To access the cGRASP service over CoAP, this document defines the
        well-known URI "grasp-coap" (to be assigned by IANA). The
        /.well-known/grasp-coap URI is used with "coap", "coaps", "coap+tcp",
        "coaps+tcp", "coaps+ws", or "coap+ws".</t>

        <t>CoAP maintains two logical sublayers: the request/response sublayer
        and the message sublayer. However, the request/response mechanism of
        CoAP conflicts with the interaction procedures of cGRASP. In
        particular, it's challenging to map the multiple rounds of
        negotiation-related cGRASP messages directly to the CoAP
        request-response. For this reason, and considering the built-in cGRASP
        reliability mechanism, this document utilizes Non-confirmable CoAP
        messages as carriers for cGRASP message distribution. To minimize
        modifications to CoAP, cGRASP over CoAP reuses CoAP messages but does
        not invoke their associated methods. In CoAP-based cGRASP, the cGRASP
        messages MUST be encapsulated as CoAP payloads with the content-format
        identifier application/cbor<xref target="RFC8949"/>. Upon receipt of
        the request with the /.well-known/grasp-coap URI, the CoAP instance
        MUST parse out the payload and forward it to the cGRASP instance,
        bypassing associated resource processing. The cGRASP instance SHOULD
        handle messages from CoAP according to its specification and SHOULD
        transmit subsequent messages via CoAP responses or new requests.</t>
      </section>

      <section anchor="cgrasp-procedure-coap"
               title="CoAP-based cGRASP interaction procedures">
        <t>A cGRASP discovery process will start with a multicast discovery
        message(M_DISCOVERY) on the local link, and nodes supporting the
        discovery objective will respond with discovery response(M_RESPONSE)
        messages. The cGRASP discovery message over CoAP SHOULD use the
        non-confirmable CoAP multicast Fetch request with the No-Response
        option<xref target="RFC7967"/> to suppress unnecessary responses and
        SHOULD use standard CoAP multicast addresses (e.g., 224.0.1.187 for
        IPv4, FF0X::FD for IPv6<xref target="RFC7252"/>). The discovery
        response over CoAP SHOULD use the CoAP unicast POST request. The
        following examples illustrate the cGRASP discovery and discovery
        response messages over CoAP, and the cGRASP M_RESPONSE and M_ACK over
        CoAP SHOULD use the CoAP token and message ID associated with each
        other for transaction matching:</t>

        <figure>
          <artwork><![CDATA[
cGRASP discovery initiator:
 (NON-confirmable) FETCH coap://FF02::13/.well-known/grasp-coap
 Content-format: application/cbor
 Accept: application/cbor
 No-Response
 Payload: cGRASP M_DISCOVERY

 (Non-confirmable) FETCH coap://224.0.1.187/.well-known/grasp-coap
 Content-format: application/cbor
 Accept: application/cbor
 No-Response
 Payload: cGRASP M_DISCOVERY

cGRASP discovery responder:
 (Non-confirmable) POST coap://2001:db8::1/.well-known/grasp-coap
 Content-format: application/cbor
 Accept: application/cbor
 Payload: cGRASP M_RESPONSE

cGRASP discovery initiator:
 (Non-confirmable) 2.04(Changed) 
 Content-format: application/cbor
 Payload: cGRASP M_ACK

]]></artwork>
        </figure>

        <t>Since the cGRASP flooding procedure performs network-wide
        synchronization by propagating a single flooding message, the cGRASP
        flooding over CoAP SHOULD use the non-confirmable CoAP multicast POST
        request with the No-Response option. Both the cGRASP discovery and
        flooding over CoAP SHOULD also maintain the relaying instance defined
        in <xref target="RFC8990"/> to expand the multicast scope. The
        following example illustrates the cGRASP flood message over CoAP:</t>

        <figure>
          <artwork><![CDATA[
cGRASP flooding initiator:
 (Non-confirmable) POST coap://FF02::13/.well-known/grasp-coap
 Content-format: application/cbor
 No-Response
 Payload: cGRASP M_FLOOD

]]></artwork>
        </figure>

        <t>The cGRASP negotiation is a bidirectional multi-round procedure.
        The negotiation-related messages over CoAP SHOULD use the
        non-confirmable CoAP POST request or their corresponding response. The
        following examples illustrate a cGRASP negotiation procedure over
        CoAP:</t>

        <figure>
          <artwork><![CDATA[
cGRASP negotiation initiator:
 (Non-confirmable) POST coap://2001:db8::1/.well-known/grasp
 Content-format: application/cbor
 Accept: application/cbor
 Payload: cGRASP M_REQ_NEG 
 with cGRASP objective[objective-num=0,expected-value="A"]

cGRASP negotiation responder:
 (Non-confirmable) 2.04(Changed)
 Content-format: application/cbor
 Payload: cGRASP M_WAIT with O_ACK

cGRASP negotiation responder:
 (Non-confirmable) POST coap://2001:db8::2/.well-known/grasp
 Content-format: application/cbor
 Accept: application/cbor
 Payload: cGRASP M_NEGOTIATE with O_ACK 
 and cGRASP objective[objective-num=0,expected-value="B"]

cGRASP negotiation initiator:
 (Non-confirmable) 2.04(Changed)
 Content-format: application/cbor
 Payload: cGRASP M_END with O_ACCEPT and O_ACK

cGRASP negotiation responder:
 (Non-confirmable) POST coap://2001:db8::2/.well-known/grasp
 Content-format: application/cbor
 No-Response
 Payload: cGRASP M_ACK

]]></artwork>
        </figure>
      </section>
    </section>

    <section anchor="ip-independent" title="IP-independent discussion">
      <t>In some IoT scenarios where the need for self-management is urgent,
      resource-constrained devices in it may not or choose not to support IP
      connectivity. Therefore, to improve the generality of cGRASP and better
      support the self-management requirements of the IoT, it is necessary to
      further discuss how cGRASP adapts to networks without the IP
      connection.</t>

      <section anchor="cgrasp-adapts-to-non-IP"
               title="How cGRASP adapts to networks without IP">
        <t>The GRASP and its constrained version cGRASP can only work in IP
        networks, due to the Locator options used by them. The Locator option
        is used to locate resources, services, devices, and interfaces on the
        network and is the basis for GRASP and cGRASP discovery, negotiation,
        and synchronization procedures. All the four Locator options defined
        in <xref target="RFC8990"/> have unique identification capabilities
        only within an IP network: O_IPv6_LOCATOR, O_IPv4_LOCATOR,
        O_FQDN_LOCATOR, O_URI_LOCATOR, which respectively depend on the IPv6
        address, IPv4 address, Fully Qualified Domain Name (FQDN), and Uniform
        Resource identifier (URI) for identification and location.</t>

        <t>Therefore, to enable the cGRASP to work without the IP connection
        and provide services to cGRASP-enabled nodes, it's necessary to select
        an identifier(such as the MAC address in the Ethernet) based on the
        environment and define a new Locator option in the cGRASP to identify
        and locate a device, interface, resource, or service that can remove
        dependence of the cGRASP on IP.</t>

        <t>Using cGRASP without the IP connection requires not only the
        definition of new Locator options but also the identification of
        cGRASP so that network nodes and devices can recognize cGRASP messages
        encapsulated in specific bearer protocol messages. For example, <xref
        target="RFC8990"/> designs GRASP as a user program, using a well-known
        port to identify GRASP messages. In practice, the protocol
        identification of cGRASP should be chosen and extended by the bearer
        protocol on which it depends, which is out of the scope of this
        document.</t>
      </section>

      <section anchor="cgrasp-over-ble"
               title="An example: Exchange cGRASP over BLE">
        <t>In the IoT, where the need for self-management is more urgent, the
        memory, energy, and computation overheads associated with IP
        connectivity and transmission may be unacceptable for its
        resource-constrained devices. In addition, considering the episodic
        feature of information interactions between IoT devices, some
        resource-constrained devices may prefer to use low-power and
        low-bandwidth network connections based on technologies such as
        Bluetooth Low Energy and Zigbee rather than IP connections. This
        section discusses how to adapt cGRASP to BLE environments without IP
        connectivity.</t>

        <t>The core protocol used to establish and manage communication
        between devices in BLE is the Generic Attribute Profile (GATT, Volume
        3 PART G in <xref target="BTCorev5.4"/>), which defines how data is
        transferred between two BLE devices based on the concepts of Services
        and Characteristics. In BLE, data is transferred and stored in the
        form of Characteristics, and the Service is a collection of
        Characteristics, both identified by a unique numeric ID called UUID.
        GATT is at the top layer of the BLE stack and can provide API
        interfaces directly to the upper-layer applications, so it is possible
        to discuss the cGRASP-over-GATT to exchange cGRASP over BLE.</t>

        <t>cGRASP-over-GATT can define and use one or more GATT
        Characteristic(s) to transport cGRASP messages. With the unique
        identification UUID of the GATT Characteristic, the device can easily
        recognize whether the transmitted data is a cGRASP message or not.
        Regarding address identification, BLE devices use a 48-bit device
        address as a device identifier<xref target="BTCorev5.4"/>. As
        described in <xref target="cgrasp-adapts-to-non-IP"/>, the
        cGRASP-over-GATT should define and register a new Locator option based
        on this identifier.</t>

        <t>However, since the read/write semantics of the GATT characteristic
        do not fully match the semantics of the actions associated with the
        cGRASP interaction procedures, how to bridge this gap is an important
        step in realizing cGRASP-over-GATT. In addition, BLE provides both
        reliable ("write without response", "notify") and unreliable ("write
        with response", "indicate") data transmission, and how to choose
        between the two modes of data transmission for cGRASP-over-GATT needs
        to be carefully considered.</t>
      </section>
    </section>

    <section anchor="iana-considerations" title="IANA Considerations">
      <section anchor="iana-cgrasp" title="IANA considerations for cGRASP">
        <t>This document defines the Constrained GeneRic Autonomic Signaling
        Protocol (cGRASP).</t>

        <t>As specified in <xref target="cgrasp-constants"/>, the IANA is
        requested to assign a USER PORT(CGRASP_LISTEN_PORT, TBD1) for use by
        cGRASP over UDP.</t>

        <t>Like the standard GRASP, cGRASP also requires IANA to create the
        "Constrained GeneRic Autonomic Signaling Protocol (cGRASP) Parameters"
        registry. The "Constrained GeneRic Autonomic Signaling Protocol
        (cGRASP) Parameters" should also include two subregistries: "cGRASP
        Messages and Options" and "cGRASP Objective Numbers".</t>

        <t>The "cGRASP Messages and Options" MUST retain all the entries in
        the "GRASP Messages and Options" subregistry assigned for the standard
        GRASP, and MUST also add three entries for the new message named
        "M_ACK", and the two new options named "O_REQ_ACK" and "O_ACK", whose
        initial values assigned by this document are like the
        following:<figure>
            <artwork><![CDATA[ 
 M_ACK = 10
 O_REQ_ACK = 107
 O_ACK = 108
 ]]></artwork>
          </figure></t>

        <t>The initial numbers for the "cGRASP Objective Numbers" subregistry
        assigned by this document are like the following:<figure>
            <artwork><![CDATA[ 
 0-9 for Experimental
 10-255 Unassigned
 ]]></artwork>
          </figure></t>
      </section>

      <section anchor="iana-cgrasp-over-coap"
               title="IANA considerations for CoAP-based cGRASP">
        <t>Considerations for IANA regarding CoAP-based cGRASP in this
        document are:</t>

        <t>* Assignment of the URI /.well-known/grasp-coap</t>

        <t>* Assignment of the media type "application/grasp-coap"</t>

        <t>* Assignment of the content format "application/grasp-coap"</t>

        <t>* Assignment of the resource type (rt=) "core.grasp-coap"</t>
      </section>
    </section>

    <section anchor="sec-considerations" title="Security Considerations">
      <section anchor="sec-considerations-cgrasp"
               title="Security considerations for cGRASP">
        <t>As a constrained version of GRASP, cGRASP must attach importance to
        the security considerations of GRASP discussed in <xref
        target="RFC8990"/>. In addition, given the limited capabilities and
        weak tamper resistance of constrained nodes, as well as their possible
        exposure to insecure environments, security issues associated with
        constrained nodes must not be ignored by the external secure
        infrastructure (e.g., the ACP) on which the cGRASP is based, e.g., the
        constrained code space and CPU for implementing cryptographic
        primitives.</t>
      </section>

      <section anchor="sec-considerations-cgrasp-coap"
               title="Security considerations for CoAP-based cGRASP">
        <t>The CoAP-based cGRASP should also concern all GRASP and cGRASP
        related security consideratiosns.</t>

        <t>TODO more security considerations.</t>
      </section>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include='reference.RFC.2119'?>

      <?rfc include='reference.RFC.7252'?>

      <?rfc include='reference.RFC.8174'?>

      <?rfc include='reference.RFC.8610'?>

      <?rfc include='reference.RFC.8990'?>

      <?rfc include='reference.RFC.8949'?>

      <reference anchor="BTCorev5.4"
                 target="https://www.bluetooth.com/specifications/specs/core-specification-5-4/">
        <front>
          <title>BLUETOOTH CORE SPECIFICATION Version 5.4</title>

          <author fullname="">
            <organization>Bluetooth Special Interest Group</organization>
          </author>

          <date day="31" month="January" year="2023"/>
        </front>
      </reference>
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.7228'?>

      <?rfc include='reference.RFC.7967'?>

      <?rfc include='reference.RFC.8993'?>

      <reference anchor="CoAPoverGATT"
                 target="https://datatracker.ietf.org/doc/draft-amsuess-core-coap-over-gatt/">
        <front>
          <title>CoAP over GATT (Bluetooth Low Energy Generic
          Attributes)</title>

          <author>
            <organization/>
          </author>

          <date/>
        </front>
      </reference>
    </references>
  </back>
</rfc>
