rfc8990v4.xml   rfc8990.xml 
skipping to change at line 1183 skipping to change at line 1183
<xref target="RFC8949" format="default"/>. In this specification, they are described <xref target="RFC8949" format="default"/>. In this specification, they are described
using Concise Data Definition Language (CDDL) using Concise Data Definition Language (CDDL)
<xref target="RFC8610" format="default"/>. <xref target="RFC8610" format="default"/>.
Fragmentary CDDL is used to describe each item in this section. A complete and normative Fragmentary CDDL is used to describe each item in this section. A complete and normative
CDDL specification of GRASP is given in <xref target="cddl" format="default"/>, including constants such CDDL specification of GRASP is given in <xref target="cddl" format="default"/>, including constants such
as message types. as message types.
</t> </t>
<t>Every GRASP message, except the No Operation message, carries a Session ID (<xref target="SessionID" format="default"/>). <t>Every GRASP message, except the No Operation message, carries a Session ID (<xref target="SessionID" format="default"/>).
Options are then presented serially.</t> Options are then presented serially.</t>
<t>In fragmentary CDDL, every GRASP message follows the pattern:</t> <t>In fragmentary CDDL, every GRASP message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
grasp-message = (message .within message-structure) / noop-message grasp-message = (message .within message-structure) / noop-message
message-structure = [MESSAGE_TYPE, session-id, ?initiator, message-structure = [MESSAGE_TYPE, session-id, ?initiator,
*grasp-option] *grasp-option]
MESSAGE_TYPE = 0..255 MESSAGE_TYPE = 0..255
session-id = 0..4294967295 ; up to 32 bits session-id = 0..4294967295 ; up to 32 bits
grasp-option = any grasp-option = any
]]></artwork> ]]></sourcecode>
<t>The MESSAGE_TYPE indicates the type of the message and thus defines <t>The MESSAGE_TYPE indicates the type of the message and thus defines
the expected options. Any options received that are not consistent with the expected options. Any options received that are not consistent with
the MESSAGE_TYPE <bcp14>SHOULD</bcp14> be silently discarded. </t> the MESSAGE_TYPE <bcp14>SHOULD</bcp14> be silently discarded. </t>
<t>The No Operation (noop) message is described in <xref target="noop" format="default"/>.</t> <t>The No Operation (noop) message is described in <xref target="noop" format="default"/>.</t>
<t>The various MESSAGE_TYPE values are defined in <xref target="cddl" format="default"/>.</t> <t>The various MESSAGE_TYPE values are defined in <xref target="cddl" format="default"/>.</t>
<t>All other message elements are described below and formally defined in <xref target="cddl" format="default"/>.</t> <t>All other message elements are described below and formally defined in <xref target="cddl" format="default"/>.</t>
<t>If an unrecognized MESSAGE_TYPE is received in a unicast message, <t>If an unrecognized MESSAGE_TYPE is received in a unicast message,
an Invalid message (<xref target="invalid" format="default"/>) <bcp14>MAY</bcp14> be returned. Otherwise, the message an Invalid message (<xref target="invalid" format="default"/>) <bcp14>MAY</bcp14> be returned. Otherwise, the message
<bcp14>MAY</bcp14> be logged and <bcp14>MUST</bcp14> be discarded. If an unrecognized MESSAGE_TYPE is received <bcp14>MAY</bcp14> be logged and <bcp14>MUST</bcp14> be discarded. If an unrecognized MESSAGE_TYPE is received
skipping to change at line 1220 skipping to change at line 1220
to agree on a longer message size.</t> to agree on a longer message size.</t>
<t>The message parser used by GRASP should be configured to know about the GRASP_DEF_MAX_SIZE, or <t>The message parser used by GRASP should be configured to know about the GRASP_DEF_MAX_SIZE, or
any larger negotiated message size, so that it may defend against overly long messages.</t> any larger negotiated message size, so that it may defend against overly long messages.</t>
<t>The maximum size of multicast messages (M_DISCOVERY and M_FLOOD) depends on the link-layer <t>The maximum size of multicast messages (M_DISCOVERY and M_FLOOD) depends on the link-layer
technology or the link-adaptation layer in use.</t> technology or the link-adaptation layer in use.</t>
</section> </section>
<section anchor="DiscoveryMessage" numbered="true" toc="default"> <section anchor="DiscoveryMessage" numbered="true" toc="default">
<name>Discovery Message</name> <name>Discovery Message</name>
<t>In fragmentary CDDL, a Discovery message follows the pattern:</t> <t>In fragmentary CDDL, a Discovery message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
discovery-message = [M_DISCOVERY, session-id, initiator, objective] discovery-message = [M_DISCOVERY, session-id, initiator, objective]
]]></artwork> ]]></sourcecode>
<t> <t>
A discovery initiator sends a Discovery message A discovery initiator sends a Discovery message
to initiate a discovery process for a particular objective option. to initiate a discovery process for a particular objective option.
</t> </t>
<t> <t>
The discovery initiator sends all Discovery The discovery initiator sends all Discovery
messages via UDP to port GRASP_LISTEN_PORT at the link-local messages via UDP to port GRASP_LISTEN_PORT at the link-local
ALL_GRASP_NEIGHBORS multicast address on each link-layer interface in use by GRASP. ALL_GRASP_NEIGHBORS multicast address on each link-layer interface in use by GRASP.
skipping to change at line 1286 skipping to change at line 1286
loops (default value is GRASP_DEF_LOOPCT).</li> loops (default value is GRASP_DEF_LOOPCT).</li>
</ul> </ul>
<t>As mentioned in <xref target="discovw" format="default"/>, a Discovery message <bcp14>MAY</bcp14> be sent unicast to a peer node, <t>As mentioned in <xref target="discovw" format="default"/>, a Discovery message <bcp14>MAY</bcp14> be sent unicast to a peer node,
which <bcp14>SHOULD</bcp14> then proceed exactly as if the message had been multicast. which <bcp14>SHOULD</bcp14> then proceed exactly as if the message had been multicast.
</t> </t>
</section> </section>
<section anchor="ResponseMessage" numbered="true" toc="default"> <section anchor="ResponseMessage" numbered="true" toc="default">
<name>Discovery Response Message</name> <name>Discovery Response Message</name>
<t>In fragmentary CDDL, a Discovery Response message follows the pattern:</t> <t>In fragmentary CDDL, a Discovery Response message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
response-message = [M_RESPONSE, session-id, initiator, ttl, response-message = [M_RESPONSE, session-id, initiator, ttl,
(+locator-option // divert-option), ?objective] (+locator-option // divert-option), ?objective]
ttl = 0..4294967295 ; in milliseconds ttl = 0..4294967295 ; in milliseconds
]]></artwork> ]]></sourcecode>
<t> <t>
A node that receives a Discovery message <bcp14>SHOULD</bcp14> send a A node that receives a Discovery message <bcp14>SHOULD</bcp14> send a
Discovery Response message if and only if it can respond to the discovery. Discovery Response message if and only if it can respond to the discovery.
</t> </t>
<ul spacing="normal" empty="true"> <ul spacing="normal" empty="true">
<li>It <bcp14>MUST</bcp14> contain the same Session ID and initiator as the Discovery message. <li>It <bcp14>MUST</bcp14> contain the same Session ID and initiator as the Discovery message.
</li> </li>
<li>It <bcp14>MUST</bcp14> contain a time-to-live (ttl) for the validity of the response, given <li>It <bcp14>MUST</bcp14> contain a time-to-live (ttl) for the validity of the response, given
as a positive integer value in milliseconds. Zero implies a value significantly as a positive integer value in milliseconds. Zero implies a value significantly
skipping to change at line 1343 skipping to change at line 1343
option or a combination of multiple kinds of locator option or a combination of multiple kinds of locator
options that indicate the locator(s) of the discovery objective. options that indicate the locator(s) of the discovery objective.
</t> </t>
<t>More details on the processing of Discovery Responses are given in <t>More details on the processing of Discovery Responses are given in
<xref target="discmech" format="default"/>.</t> <xref target="discmech" format="default"/>.</t>
</section> </section>
<section anchor="RequestMessage" numbered="true" toc="default"> <section anchor="RequestMessage" numbered="true" toc="default">
<name>Request Messages</name> <name>Request Messages</name>
<t>In fragmentary CDDL, Request Negotiation and Request Synchronization messages follow the patterns:</t> <t>In fragmentary CDDL, Request Negotiation and Request Synchronization messages follow the patterns:</t>
<artwork><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
request-negotiation-message = [M_REQ_NEG, session-id, objective] request-negotiation-message = [M_REQ_NEG, session-id, objective]
request-synchronization-message = [M_REQ_SYN, session-id, objective] request-synchronization-message = [M_REQ_SYN, session-id, objective]
]]></artwork> ]]></sourcecode>
<t> <t>
A negotiation or synchronization requesting node A negotiation or synchronization requesting node
sends the appropriate Request message to the unicast address of the negotiation or sends the appropriate Request message to the unicast address of the negotiation or
synchronization counterpart, using the appropriate protocol and port numbers synchronization counterpart, using the appropriate protocol and port numbers
(selected from the discovery result). If the discovery result is an FQDN, (selected from the discovery result). If the discovery result is an FQDN,
it will be resolved first.</t> it will be resolved first.</t>
<t>A Request message <bcp14>MUST</bcp14> include the relevant objective option. In the case of <t>A Request message <bcp14>MUST</bcp14> include the relevant objective option. In the case of
Request Negotiation, the objective option <bcp14>MUST</bcp14> include the requested value. </t> Request Negotiation, the objective option <bcp14>MUST</bcp14> include the requested value. </t>
<t>When an initiator sends a Request Negotiation message, it <bcp14>MUST</bcp14> initialize a negotiation timer <t>When an initiator sends a Request Negotiation message, it <bcp14>MUST</bcp14> initialize a negotiation timer
skipping to change at line 1382 skipping to change at line 1382
<t>To avoid the highly unlikely race condition in which two nodes simultaneously request <t>To avoid the highly unlikely race condition in which two nodes simultaneously request
sessions with each other using the same Session ID (<xref target="SessionID" format="default"/>), sessions with each other using the same Session ID (<xref target="SessionID" format="default"/>),
a node <bcp14>MUST</bcp14> verify that the received Session ID is not already locally active a node <bcp14>MUST</bcp14> verify that the received Session ID is not already locally active
when it receives a Request message. In case of a clash, when it receives a Request message. In case of a clash,
it <bcp14>MUST</bcp14> discard the Request message, in which case the initiator will detect a timeout.</t> it <bcp14>MUST</bcp14> discard the Request message, in which case the initiator will detect a timeout.</t>
</section> </section>
<section anchor="NegotiationMessage" numbered="true" toc="default"> <section anchor="NegotiationMessage" numbered="true" toc="default">
<name>Negotiation Message</name> <name>Negotiation Message</name>
<t>In fragmentary CDDL, a Negotiation message follows the pattern:</t> <t>In fragmentary CDDL, a Negotiation message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
negotiation-message = [M_NEGOTIATE, session-id, objective] negotiation-message = [M_NEGOTIATE, session-id, objective]
]]></artwork> ]]></sourcecode>
<t>A negotiation counterpart sends a Negotiation message in response <t>A negotiation counterpart sends a Negotiation message in response
to a Request Negotiation message, a Negotiation message, or a to a Request Negotiation message, a Negotiation message, or a
Discovery message in rapid mode. A negotiation process Discovery message in rapid mode. A negotiation process
<bcp14>MAY</bcp14> include multiple steps.</t> <bcp14>MAY</bcp14> include multiple steps.</t>
<t>The Negotiation message <bcp14>MUST</bcp14> include the relevant <t>The Negotiation message <bcp14>MUST</bcp14> include the relevant
Negotiation Objective option, with its value updated according to Negotiation Objective option, with its value updated according to
progress in the negotiation. The sender <bcp14>MUST</bcp14> progress in the negotiation. The sender <bcp14>MUST</bcp14>
decrement the loop count by 1. If the loop count becomes zero, the decrement the loop count by 1. If the loop count becomes zero, the
message <bcp14>MUST NOT</bcp14> be sent. In this case, the message <bcp14>MUST NOT</bcp14> be sent. In this case, the
negotiation session has failed and will time out.</t> negotiation session has failed and will time out.</t>
</section> </section>
<section anchor="NegotiationEndingMessage" numbered="true" toc="default"> <section anchor="NegotiationEndingMessage" numbered="true" toc="default">
<name>Negotiation End Message</name> <name>Negotiation End Message</name>
<t>In fragmentary CDDL, a Negotiation End message follows the <t>In fragmentary CDDL, a Negotiation End message follows the
pattern:</t> pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
end-message = [M_END, session-id, accept-option / decline-option] end-message = [M_END, session-id, accept-option / decline-option]
]]></artwork> ]]></sourcecode>
<t> <t>
A negotiation counterpart sends a Negotiation End message to close A negotiation counterpart sends a Negotiation End message to close
the negotiation. It <bcp14>MUST</bcp14> contain either an Accept option or the negotiation. It <bcp14>MUST</bcp14> contain either an Accept option or
a Decline option, defined in <xref target="AcceptOption" format="default"/> and <xref target="DeclineOption" format="default"/>. It could be sent either by the requesting node a Decline option, defined in <xref target="AcceptOption" format="default"/> and <xref target="DeclineOption" format="default"/>. It could be sent either by the requesting node
or the responding node.</t> or the responding node.</t>
</section> </section>
<section anchor="ConfirmWaitingMessage" numbered="true" toc="default"> <section anchor="ConfirmWaitingMessage" numbered="true" toc="default">
<name>Confirm Waiting Message</name> <name>Confirm Waiting Message</name>
<t>In fragmentary CDDL, a Confirm Waiting message follows the pattern:</t> <t>In fragmentary CDDL, a Confirm Waiting message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
wait-message = [M_WAIT, session-id, waiting-time] wait-message = [M_WAIT, session-id, waiting-time]
waiting-time = 0..4294967295 ; in milliseconds waiting-time = 0..4294967295 ; in milliseconds
]]></artwork> ]]></sourcecode>
<t> <t>
A responding node sends a Confirm Waiting message to A responding node sends a Confirm Waiting message to
ask the requesting node to wait for a further ask the requesting node to wait for a further
negotiation response. It might be that the local negotiation response. It might be that the local
process needs more time or that the negotiation process needs more time or that the negotiation
depends on another triggered negotiation. This depends on another triggered negotiation. This
message <bcp14>MUST NOT</bcp14> include any other options. message <bcp14>MUST NOT</bcp14> include any other options.
When received, the waiting time value overwrites When received, the waiting time value overwrites
and restarts the current negotiation timer and restarts the current negotiation timer
(<xref target="RequestMessage" format="default"/>).</t> (<xref target="RequestMessage" format="default"/>).</t>
<t>The responding node <bcp14>SHOULD</bcp14> send a Negotiation, Negotiation End, or another <t>The responding node <bcp14>SHOULD</bcp14> send a Negotiation, Negotiation End, or another
Confirm Waiting message before the negotiation timer expires. If Confirm Waiting message before the negotiation timer expires. If
not, when the initiator's timer expires, the initiator <bcp14>MUST</bcp14> treat not, when the initiator's timer expires, the initiator <bcp14>MUST</bcp14> treat
the negotiation procedure as failed.</t> the negotiation procedure as failed.</t>
</section> </section>
<section anchor="SynchMessage" numbered="true" toc="default"> <section anchor="SynchMessage" numbered="true" toc="default">
<name>Synchronization Message</name> <name>Synchronization Message</name>
<t>In fragmentary CDDL, a Synchronization message follows the pattern:</t> <t>In fragmentary CDDL, a Synchronization message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
synch-message = [M_SYNCH, session-id, objective] synch-message = [M_SYNCH, session-id, objective]
]]></artwork> ]]></sourcecode>
<t>A node that receives a Request Synchronization, or <t>A node that receives a Request Synchronization, or
a Discovery message in rapid mode, sends back a unicast Synchronization a Discovery message in rapid mode, sends back a unicast Synchronization
message with the synchronization data, in the form of a GRASP option for the specific message with the synchronization data, in the form of a GRASP option for the specific
synchronization objective present in the Request Synchronization.</t> synchronization objective present in the Request Synchronization.</t>
</section> </section>
<section anchor="FloodMessage" numbered="true" toc="default"> <section anchor="FloodMessage" numbered="true" toc="default">
<name>Flood Synchronization Message</name> <name>Flood Synchronization Message</name>
<t>In fragmentary CDDL, a Flood Synchronization message follows the pattern:</t> <t>In fragmentary CDDL, a Flood Synchronization message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
flood-message = [M_FLOOD, session-id, initiator, ttl, flood-message = [M_FLOOD, session-id, initiator, ttl,
+[objective, (locator-option / [])]] +[objective, (locator-option / [])]]
ttl = 0..4294967295 ; in milliseconds ttl = 0..4294967295 ; in milliseconds
]]></artwork> ]]></sourcecode>
<t> <t>
A node <bcp14>MAY</bcp14> initiate flooding by sending an A node <bcp14>MAY</bcp14> initiate flooding by sending an
unsolicited Flood Synchronization message with synchronization unsolicited Flood Synchronization message with synchronization
data. This <bcp14>MAY</bcp14> be sent to port GRASP_LISTEN_PORT at data. This <bcp14>MAY</bcp14> be sent to port GRASP_LISTEN_PORT at
the link-local ALL_GRASP_NEIGHBORS multicast address, in accordance the link-local ALL_GRASP_NEIGHBORS multicast address, in accordance
with the rules in <xref target="synchproc" format="default"/>. with the rules in <xref target="synchproc" format="default"/>.
</t> </t>
<ul empty="true" spacing="normal"> <ul empty="true" spacing="normal">
skipping to change at line 1508 skipping to change at line 1508
objective, and if necessary communicate with them using the locator, objective, and if necessary communicate with them using the locator,
protocol, and port included in the locator option. Many objectives protocol, and port included in the locator option. Many objectives
will not need this mechanism, so they will be flooded with a null will not need this mechanism, so they will be flooded with a null
locator.</t> locator.</t>
<t>Cached entries <bcp14>MUST</bcp14> be ignored or deleted after <t>Cached entries <bcp14>MUST</bcp14> be ignored or deleted after
their lifetime expires.</t> their lifetime expires.</t>
</section> </section>
<section anchor="invalid" numbered="true" toc="default"> <section anchor="invalid" numbered="true" toc="default">
<name>Invalid Message</name> <name>Invalid Message</name>
<t>In fragmentary CDDL, an Invalid message follows the pattern:</t> <t>In fragmentary CDDL, an Invalid message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
invalid-message = [M_INVALID, session-id, ?any] invalid-message = [M_INVALID, session-id, ?any]
]]></artwork> ]]></sourcecode>
<t> <t>
This message <bcp14>MAY</bcp14> be sent by an implementation in This message <bcp14>MAY</bcp14> be sent by an implementation in
response to an incoming unicast message that it considers response to an incoming unicast message that it considers
invalid. The Session ID value <bcp14>MUST</bcp14> be copied from the invalid. The Session ID value <bcp14>MUST</bcp14> be copied from the
incoming message. The content <bcp14>SHOULD</bcp14> be diagnostic incoming message. The content <bcp14>SHOULD</bcp14> be diagnostic
information such as a partial copy of the invalid message up to the information such as a partial copy of the invalid message up to the
maximum message size. An M_INVALID message <bcp14>MAY</bcp14> be maximum message size. An M_INVALID message <bcp14>MAY</bcp14> be
silently ignored by a recipient. However, it could be used in silently ignored by a recipient. However, it could be used in
support of extensibility, since it indicates that the remote node support of extensibility, since it indicates that the remote node
does not support a new or obsolete message or option.</t> does not support a new or obsolete message or option.</t>
<t>An M_INVALID message <bcp14>MUST NOT</bcp14> be sent in response to an M_INVALID message.</t> <t>An M_INVALID message <bcp14>MUST NOT</bcp14> be sent in response to an M_INVALID message.</t>
</section> </section>
<section anchor="noop" numbered="true" toc="default"> <section anchor="noop" numbered="true" toc="default">
<name>No Operation Message</name> <name>No Operation Message</name>
<t>In fragmentary CDDL, a No Operation message follows the pattern:</t> <t>In fragmentary CDDL, a No Operation message follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
noop-message = [M_NOOP] noop-message = [M_NOOP]
]]></artwork> ]]></sourcecode>
<t> <t>
This message <bcp14>MAY</bcp14> be sent by an implementation that for practical reasons needs to This message <bcp14>MAY</bcp14> be sent by an implementation that for practical reasons needs to
initialize a socket. It <bcp14>MUST</bcp14> be silently ignored by a recipient.</t> initialize a socket. It <bcp14>MUST</bcp14> be silently ignored by a recipient.</t>
</section> </section>
</section> </section>
<section anchor="GRASPOptions" numbered="true" toc="default"> <section anchor="GRASPOptions" numbered="true" toc="default">
<name>GRASP Options</name> <name>GRASP Options</name>
<t>This section defines the GRASP options for the negotiation <t>This section defines the GRASP options for the negotiation
and synchronization protocol signaling. Additional and synchronization protocol signaling. Additional
skipping to change at line 1559 skipping to change at line 1559
<t>The Divert option is used to redirect a GRASP request to another <t>The Divert option is used to redirect a GRASP request to another
node, which may be more appropriate for the intended negotiation or synchronization. It node, which may be more appropriate for the intended negotiation or synchronization. It
may redirect to an entity that is known as a specific negotiation or synchronization may redirect to an entity that is known as a specific negotiation or synchronization
counterpart (on-link or off-link) or a default gateway. The Divert counterpart (on-link or off-link) or a default gateway. The Divert
option <bcp14>MUST</bcp14> only be encapsulated in Discovery Response messages. option <bcp14>MUST</bcp14> only be encapsulated in Discovery Response messages.
If found elsewhere, it <bcp14>SHOULD</bcp14> be silently ignored.</t> If found elsewhere, it <bcp14>SHOULD</bcp14> be silently ignored.</t>
<t>A discovery initiator <bcp14>MAY</bcp14> ignore a Divert option if it only requires direct <t>A discovery initiator <bcp14>MAY</bcp14> ignore a Divert option if it only requires direct
Discovery Responses. </t> Discovery Responses. </t>
<t>In fragmentary CDDL, the Divert option follows the pattern:</t> <t>In fragmentary CDDL, the Divert option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
divert-option = [O_DIVERT, +locator-option] divert-option = [O_DIVERT, +locator-option]
]]></artwork> ]]></sourcecode>
<t>The embedded locator option(s) (<xref target="LocatorOption" format="default"/>) <t>The embedded locator option(s) (<xref target="LocatorOption" format="default"/>)
point to diverted destination target(s) in response to a Discovery message. </t> point to diverted destination target(s) in response to a Discovery message. </t>
</section> </section>
<section anchor="AcceptOption" numbered="true" toc="default"> <section anchor="AcceptOption" numbered="true" toc="default">
<name>Accept Option</name> <name>Accept Option</name>
<t>The Accept option is used to indicate to the negotiation counterpart <t>The Accept option is used to indicate to the negotiation counterpart
that the proposed negotiation content is accepted.</t> that the proposed negotiation content is accepted.</t>
<t>The Accept option <bcp14>MUST</bcp14> only be encapsulated in Negotiation End <t>The Accept option <bcp14>MUST</bcp14> only be encapsulated in Negotiation End
messages. If found elsewhere, it <bcp14>SHOULD</bcp14> be silently ignored.</t> messages. If found elsewhere, it <bcp14>SHOULD</bcp14> be silently ignored.</t>
<t>In fragmentary CDDL, the Accept option follows the pattern:</t> <t>In fragmentary CDDL, the Accept option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
accept-option = [O_ACCEPT] accept-option = [O_ACCEPT]
]]></artwork> ]]></sourcecode>
</section> </section>
<section anchor="DeclineOption" numbered="true" toc="default"> <section anchor="DeclineOption" numbered="true" toc="default">
<name>Decline Option</name> <name>Decline Option</name>
<t>The Decline option is used to indicate to the negotiation <t>The Decline option is used to indicate to the negotiation
counterpart the proposed negotiation content is declined and to end the counterpart the proposed negotiation content is declined and to end the
negotiation process.</t> negotiation process.</t>
<t>The Decline option <bcp14>MUST</bcp14> only be encapsulated in <t>The Decline option <bcp14>MUST</bcp14> only be encapsulated in
Negotiation End messages. If found elsewhere, it <bcp14>SHOULD</bcp14> be Negotiation End messages. If found elsewhere, it <bcp14>SHOULD</bcp14> be
silently ignored.</t> silently ignored.</t>
<t>In fragmentary CDDL, the Decline option follows the pattern:</t> <t>In fragmentary CDDL, the Decline option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
decline-option = [O_DECLINE, ?reason] decline-option = [O_DECLINE, ?reason]
reason = text ; optional UTF-8 error message reason = text ; optional UTF-8 error message
]]></artwork> ]]></sourcecode>
<t>Note: there might be scenarios where an ASA wants <t>Note: there might be scenarios where an ASA wants
to decline the proposed value and restart the negotiation process. to decline the proposed value and restart the negotiation process.
In this case, it is an implementation choice whether to send a Decline In this case, it is an implementation choice whether to send a Decline
option or to continue with a Negotiation message, with an objective option or to continue with a Negotiation message, with an objective
option that contains a null value or one that contains a new option that contains a null value or one that contains a new
value that might achieve convergence.</t> value that might achieve convergence.</t>
</section> </section>
<section anchor="LocatorOption" numbered="true" toc="default"> <section anchor="LocatorOption" numbered="true" toc="default">
<name>Locator Options</name> <name>Locator Options</name>
skipping to change at line 1620 skipping to change at line 1620
and FQDNs include this information explicitly. In the case of the Locator URI option, and FQDNs include this information explicitly. In the case of the Locator URI option,
this information can be encoded in the URI itself.</t> this information can be encoded in the URI itself.</t>
<t>Note: It is assumed that all locators used in locator options are in scope throughout <t>Note: It is assumed that all locators used in locator options are in scope throughout
the GRASP domain. As stated in <xref target="hilev" format="default"/>, the GRASP domain. As stated in <xref target="hilev" format="default"/>,
GRASP is not intended to work across disjoint addressing GRASP is not intended to work across disjoint addressing
or naming realms. </t> or naming realms. </t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Locator IPv6 Address Option</name> <name>Locator IPv6 Address Option</name>
<t>In fragmentary CDDL, the Locator IPv6 Address option follows the pattern:</t> <t>In fragmentary CDDL, the Locator IPv6 Address option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
ipv6-locator-option = [O_IPv6_LOCATOR, ipv6-address, ipv6-locator-option = [O_IPv6_LOCATOR, ipv6-address,
transport-proto, port-number] transport-proto, port-number]
ipv6-address = bytes .size 16 ipv6-address = bytes .size 16
transport-proto = IPPROTO_TCP / IPPROTO_UDP transport-proto = IPPROTO_TCP / IPPROTO_UDP
IPPROTO_TCP = 6 IPPROTO_TCP = 6
IPPROTO_UDP = 17 IPPROTO_UDP = 17
port-number = 0..65535 port-number = 0..65535
]]></artwork> ]]></sourcecode>
<t>The content of this option is a binary IPv6 address followed by <t>The content of this option is a binary IPv6 address followed by
the protocol number and port number to be used.</t> the protocol number and port number to be used.</t>
<t>Note 1: The IPv6 address <bcp14>MUST</bcp14> normally have <t>Note 1: The IPv6 address <bcp14>MUST</bcp14> normally have
global scope. However, during initialization, a link-local address global scope. However, during initialization, a link-local address
<bcp14>MAY</bcp14> be used for specific objectives only (<xref target="secinst" format="default"/>). In this case, the <bcp14>MAY</bcp14> be used for specific objectives only (<xref target="secinst" format="default"/>). In this case, the
corresponding Discovery Response message <bcp14>MUST</bcp14> be corresponding Discovery Response message <bcp14>MUST</bcp14> be
sent via the interface to which the link-local address sent via the interface to which the link-local address
applies.</t> applies.</t>
<t>Note 2: A link-local IPv6 address <bcp14>MUST NOT</bcp14> be <t>Note 2: A link-local IPv6 address <bcp14>MUST NOT</bcp14> be
used when this option is included in a Divert option.</t> used when this option is included in a Divert option.</t>
<t>Note 3: The IPPROTO values are taken from the existing IANA <t>Note 3: The IPPROTO values are taken from the existing IANA
Protocol Numbers registry in order to specify TCP or UDP. If GRASP Protocol Numbers registry in order to specify TCP or UDP. If GRASP
requires future values that are not in that registry, a new requires future values that are not in that registry, a new
registry for values outside the range 0..255 will be needed.</t> registry for values outside the range 0..255 will be needed.</t>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Locator IPv4 Address Option</name> <name>Locator IPv4 Address Option</name>
<t>In fragmentary CDDL, the Locator IPv4 Address option follows the pattern:</t> <t>In fragmentary CDDL, the Locator IPv4 Address option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
ipv4-locator-option = [O_IPv4_LOCATOR, ipv4-address, ipv4-locator-option = [O_IPv4_LOCATOR, ipv4-address,
transport-proto, port-number] transport-proto, port-number]
ipv4-address = bytes .size 4 ipv4-address = bytes .size 4
]]></artwork> ]]></sourcecode>
<t>The content of this option is a binary IPv4 address followed by <t>The content of this option is a binary IPv4 address followed by
the protocol number and port number to be used.</t> the protocol number and port number to be used.</t>
<t>Note: If an operator has internal network address translation for IPv4, <t>Note: If an operator has internal network address translation for IPv4,
this option <bcp14>MUST NOT</bcp14> be used within the Divert option.</t> this option <bcp14>MUST NOT</bcp14> be used within the Divert option.</t>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Locator FQDN Option</name> <name>Locator FQDN Option</name>
<t>In fragmentary CDDL, the Locator FQDN option follows the pattern:</t> <t>In fragmentary CDDL, the Locator FQDN option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
fqdn-locator-option = [O_FQDN_LOCATOR, text, fqdn-locator-option = [O_FQDN_LOCATOR, text,
transport-proto, port-number] transport-proto, port-number]
]]></artwork> ]]></sourcecode>
<t>The content of this option is the FQDN <t>The content of this option is the FQDN
of the target followed by the protocol number and port number to of the target followed by the protocol number and port number to
be used. be used.
</t> </t>
<t>Note 1: Any FQDN that might not be valid throughout the <t>Note 1: Any FQDN that might not be valid throughout the
network in question, such as a Multicast DNS name <xref target="RFC6762" format="default"/>, <bcp14>MUST NOT</bcp14> be network in question, such as a Multicast DNS name <xref target="RFC6762" format="default"/>, <bcp14>MUST NOT</bcp14> be
used when this option is used within the Divert option.</t> used when this option is used within the Divert option.</t>
<t>Note 2: Normal GRASP operations are not expected to use this option. It is intended for <t>Note 2: Normal GRASP operations are not expected to use this option. It is intended for
special purposes such as discovering external services.</t> special purposes such as discovering external services.</t>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Locator URI Option</name> <name>Locator URI Option</name>
<t>In fragmentary CDDL, the Locator URI option follows the pattern:</t> <t>In fragmentary CDDL, the Locator URI option follows the pattern:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
uri-locator-option = [O_URI_LOCATOR, text, uri-locator-option = [O_URI_LOCATOR, text,
transport-proto / null, port-number / null] transport-proto / null, port-number / null]
]]></artwork> ]]></sourcecode>
<t>The content of this option is the URI of the target <t>The content of this option is the URI of the target
followed by the protocol number and port number to be used (or by null values if not required) followed by the protocol number and port number to be used (or by null values if not required)
<xref target="RFC3986" format="default"/>. <xref target="RFC3986" format="default"/>.
</t> </t>
<t>Note 1: Any URI which might not be valid throughout the network in question, <t>Note 1: Any URI which might not be valid throughout the network in question,
such as one based on a Multicast DNS name <xref target="RFC6762" format="default"/>, <bcp14>MUST NOT</bcp14> be used when such as one based on a Multicast DNS name <xref target="RFC6762" format="default"/>, <bcp14>MUST NOT</bcp14> be used when
this option is used within the Divert option.</t> this option is used within the Divert option.</t>
<t>Note 2: Normal GRASP operations are not expected to use this option. It is intended for <t>Note 2: Normal GRASP operations are not expected to use this option. It is intended for
special purposes such as discovering external services. Therefore, its use is not further special purposes such as discovering external services. Therefore, its use is not further
described in this specification.</t> described in this specification.</t>
skipping to change at line 1709 skipping to change at line 1709
</section> </section>
<section anchor="ObjOption" numbered="true" toc="default"> <section anchor="ObjOption" numbered="true" toc="default">
<name>Objective Options</name> <name>Objective Options</name>
<section anchor="ObjForm" numbered="true" toc="default"> <section anchor="ObjForm" numbered="true" toc="default">
<name>Format of Objective Options</name> <name>Format of Objective Options</name>
<t>An objective option is used to identify objectives for <t>An objective option is used to identify objectives for
the purposes of discovery, negotiation, or synchronization. the purposes of discovery, negotiation, or synchronization.
All objectives <bcp14>MUST</bcp14> be in the following format, All objectives <bcp14>MUST</bcp14> be in the following format,
described in fragmentary CDDL:</t> described in fragmentary CDDL:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
objective = [objective-name, objective-flags, objective = [objective-name, objective-flags,
loop-count, ?objective-value] loop-count, ?objective-value]
objective-name = text objective-name = text
objective-value = any objective-value = any
loop-count = 0..255 loop-count = 0..255
]]></artwork> ]]></sourcecode>
<t>All objectives are identified by a unique name that is a UTF-8 <t>All objectives are identified by a unique name that is a UTF-8
string <xref target="RFC3629" format="default"/>, to be compared string <xref target="RFC3629" format="default"/>, to be compared
byte by byte. </t> byte by byte. </t>
<t>The names of generic objectives <bcp14>MUST NOT</bcp14> include a colon (":") <t>The names of generic objectives <bcp14>MUST NOT</bcp14> include a colon (":")
and <bcp14>MUST</bcp14> be registered with IANA (<xref target="iana" format="default"/>).</t> and <bcp14>MUST</bcp14> be registered with IANA (<xref target="iana" format="default"/>).</t>
<t>The names of privately defined objectives <bcp14>MUST</bcp14> include at least one colon (":"). <t>The names of privately defined objectives <bcp14>MUST</bcp14> include at least one colon (":").
The string preceding the last colon in the name <bcp14>MUST</bcp14> be globally unique and in some The string preceding the last colon in the name <bcp14>MUST</bcp14> be globally unique and in some
way identify the entity or person defining the objective. The following three methods way identify the entity or person defining the objective. The following three methods
<bcp14>MAY</bcp14> be used to create such a globally unique string: <bcp14>MAY</bcp14> be used to create such a globally unique string:
skipping to change at line 1761 skipping to change at line 1761
or synchronization objective. Its format is defined in the or synchronization objective. Its format is defined in the
specification of the objective and may be a simple value specification of the objective and may be a simple value
or a data structure of any kind, as long as it can be represented in CBOR. or a data structure of any kind, as long as it can be represented in CBOR.
It is optional only in a Discovery or Discovery Response message.</t> It is optional only in a Discovery or Discovery Response message.</t>
</section> </section>
<section anchor="objective_flags" numbered="true" toc="default"> <section anchor="objective_flags" numbered="true" toc="default">
<name>Objective Flags</name> <name>Objective Flags</name>
<t>An objective may be relevant for discovery only, for discovery and negotiation, or <t>An objective may be relevant for discovery only, for discovery and negotiation, or
for discovery and synchronization. This is expressed in the objective by logical flag bits:</t> for discovery and synchronization. This is expressed in the objective by logical flag bits:</t>
<artwork align="left"><![CDATA[ <sourcecode type="cddl" name="grasp-fragments.cddl"><![CDATA[
objective-flags = uint .bits objective-flag objective-flags = uint .bits objective-flag
objective-flag = &( objective-flag = &(
F_DISC: 0 ; valid for discovery F_DISC: 0 ; valid for discovery
F_NEG: 1 ; valid for negotiation F_NEG: 1 ; valid for negotiation
F_SYNCH: 2 ; valid for synchronization F_SYNCH: 2 ; valid for synchronization
F_NEG_DRY: 3 ; negotiation is a dry run F_NEG_DRY: 3 ; negotiation is a dry run
)]]> )]]>
</artwork> </sourcecode>
<t>These bits are independent and may be combined appropriately, e.g., (F_DISC and F_SYNCH) or <t>These bits are independent and may be combined appropriately, e.g., (F_DISC and F_SYNCH) or
(F_DISC and F_NEG) or (F_DISC and F_NEG and F_NEG_DRY).</t> (F_DISC and F_NEG) or (F_DISC and F_NEG and F_NEG_DRY).</t>
<t>Note that for a given negotiation session, an objective must be used either for negotiation or for <t>Note that for a given negotiation session, an objective must be used either for negotiation or for
dry-run negotiation. Mixing the two modes in a single negotiation is not possible.</t> dry-run negotiation. Mixing the two modes in a single negotiation is not possible.</t>
</section> </section>
<section anchor="ConsOption" numbered="true" toc="default"> <section anchor="ConsOption" numbered="true" toc="default">
<name>General Considerations for Objective Options</name> <name>General Considerations for Objective Options</name>
<t>As mentioned above, objective options <bcp14>MUST</bcp14> be assigned a unique name. <t>As mentioned above, objective options <bcp14>MUST</bcp14> be assigned a unique name.
As long as privately defined objective options obey the rules above, this document As long as privately defined objective options obey the rules above, this document
skipping to change at line 2019 skipping to change at line 2019
</dt> </dt>
<dd><t>When GRASP discovery returns an IP address, it <bcp14>MUST</bcp14> be that of a node <dd><t>When GRASP discovery returns an IP address, it <bcp14>MUST</bcp14> be that of a node
within the secure environment (<xref target="reqsec" format="default"/>). If it returns within the secure environment (<xref target="reqsec" format="default"/>). If it returns
an FQDN or a URI, the ASA that receives it <bcp14>MUST NOT</bcp14> assume that the an FQDN or a URI, the ASA that receives it <bcp14>MUST NOT</bcp14> assume that the
target of the locator is within the secure environment.</t></dd> target of the locator is within the secure environment.</t></dd>
</dl> </dl>
</section> </section>
<section anchor="cddl" numbered="true" toc="default"> <section anchor="cddl" numbered="true" toc="default">
<name>CDDL Specification of GRASP</name> <name>CDDL Specification of GRASP</name>
<sourcecode name="" type="cddl" markers="true"><![CDATA[ <sourcecode name="grasp.cddl" type="cddl" markers="true"><![CDATA[
grasp-message = (message .within message-structure) / noop-message grasp-message = (message .within message-structure) / noop-message
message-structure = [MESSAGE_TYPE, session-id, ?initiator, message-structure = [MESSAGE_TYPE, session-id, ?initiator,
*grasp-option] *grasp-option]
MESSAGE_TYPE = 0..255 MESSAGE_TYPE = 0..255
session-id = 0..4294967295 ; up to 32 bits session-id = 0..4294967295 ; up to 32 bits
grasp-option = any grasp-option = any
message /= discovery-message message /= discovery-message
skipping to change at line 2503 skipping to change at line 2503
<li>CBOR diagnostic notation.</li> <li>CBOR diagnostic notation.</li>
<li>Similar, but showing the names of the constants. (Details of the flag bit encoding are omitted.) </li> <li>Similar, but showing the names of the constants. (Details of the flag bit encoding are omitted.) </li>
<li>Hexadecimal version of the CBOR wire format.</li> <li>Hexadecimal version of the CBOR wire format.</li>
</ol> </ol>
<t> <t>
Long lines are split for display purposes only.</t> Long lines are split for display purposes only.</t>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Discovery Example</name> <name>Discovery Example</name>
<t>The initiator (2001:db8:f000:baaa:28cc:dc4c:9703:6781) multicasts a Discovery message <t>The initiator (2001:db8:f000:baaa:28cc:dc4c:9703:6781) multicasts a Discovery message
looking for objective EX1:</t> looking for objective EX1:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[1, 13948744, h'20010db8f000baaa28ccdc4c97036781', ["EX1", 5, 2, 0]] [1, 13948744, h'20010db8f000baaa28ccdc4c97036781', ["EX1", 5, 2, 0]]
[M_DISCOVERY, 13948744, h'20010db8f000baaa28ccdc4c97036781', [M_DISCOVERY, 13948744, h'20010db8f000baaa28ccdc4c97036781',
["EX1", F_SYNCH_bits, 2, 0]] ["EX1", F_SYNCH_bits, 2, 0]]
h'84011a00d4d7485020010db8f000baaa28ccdc4c970367818463455831050200' h'84011a00d4d7485020010db8f000baaa28ccdc4c970367818463455831050200'
]]></artwork> ]]></artwork>
<t>A peer (2001:0db8:f000:baaa:f000:baaa:f000:baaa) responds with a locator:</t> <t>A peer (2001:0db8:f000:baaa:f000:baaa:f000:baaa) responds with a locator:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[2, 13948744, h'20010db8f000baaa28ccdc4c97036781', 60000, [2, 13948744, h'20010db8f000baaa28ccdc4c97036781', 60000,
[103, h'20010db8f000baaaf000baaaf000baaa', 6, 49443]] [103, h'20010db8f000baaaf000baaaf000baaa', 6, 49443]]
[M_RESPONSE, 13948744, h'20010db8f000baaa28ccdc4c97036781', 60000, [M_RESPONSE, 13948744, h'20010db8f000baaa28ccdc4c97036781', 60000,
[O_IPv6_LOCATOR, h'20010db8f000baaaf000baaaf000baaa', [O_IPv6_LOCATOR, h'20010db8f000baaaf000baaaf000baaa',
IPPROTO_TCP, 49443]] IPPROTO_TCP, 49443]]
h'85021a00d4d7485020010db8f000baaa28ccdc4c9703678119ea6084186750 h'85021a00d4d7485020010db8f000baaa28ccdc4c9703678119ea6084186750
20010db8f000baaaf000baaaf000baaa0619c123' 20010db8f000baaaf000baaaf000baaa0619c123'
]]></artwork> ]]></artwork>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Flood Example</name> <name>Flood Example</name>
<t>The initiator multicasts a Flood Synchronization message. The single objective has a null locator. There is no response:</t> <t>The initiator multicasts a Flood Synchronization message. The single objective has a null locator. There is no response:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[9, 3504974, h'20010db8f000baaa28ccdc4c97036781', 10000, [9, 3504974, h'20010db8f000baaa28ccdc4c97036781', 10000,
[["EX1", 5, 2, ["Example 1 value=", 100]],[] ] ] [["EX1", 5, 2, ["Example 1 value=", 100]],[] ] ]
[M_FLOOD, 3504974, h'20010db8f000baaa28ccdc4c97036781', 10000, [M_FLOOD, 3504974, h'20010db8f000baaa28ccdc4c97036781', 10000,
[["EX1", F_SYNCH_bits, 2, ["Example 1 value=", 100]],[] ] ] [["EX1", F_SYNCH_bits, 2, ["Example 1 value=", 100]],[] ] ]
h'86091a00357b4e5020010db8f000baaa28ccdc4c97036781192710 h'85091a00357b4e5020010db8f000baaa28ccdc4c97036781192710
828463455831050282704578616d706c6520312076616c75653d186480' 828463455831050282704578616d706c6520312076616c75653d186480'
]]></artwork> ]]></artwork>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Synchronization Example</name> <name>Synchronization Example</name>
<t>Following successful discovery of objective EX2, the initiator unicasts a Request Synchronization message:</t> <t>Following successful discovery of objective EX2, the initiator unicasts a Request Synchronization message:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[4, 4038926, ["EX2", 5, 5, 0]] [4, 4038926, ["EX2", 5, 5, 0]]
[M_REQ_SYN, 4038926, ["EX2", F_SYNCH_bits, 5, 0]] [M_REQ_SYN, 4038926, ["EX2", F_SYNCH_bits, 5, 0]]
h'83041a003da10e8463455832050500' h'83041a003da10e8463455832050500'
]]></artwork> ]]></artwork>
<t>The peer responds with a value:</t> <t>The peer responds with a value:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[8, 4038926, ["EX2", 5, 5, ["Example 2 value=", 200]]] [8, 4038926, ["EX2", 5, 5, ["Example 2 value=", 200]]]
[M_SYNCH, 4038926, ["EX2", F_SYNCH_bits, 5, ["Example 2 value=", 200]]] [M_SYNCH, 4038926, ["EX2", F_SYNCH_bits, 5, ["Example 2 value=", 200]]]
h'83081a003da10e8463455832050582704578616d706c6520322076616c75653d18c8' h'83081a003da10e8463455832050582704578616d706c6520322076616c75653d18c8'
]]></artwork> ]]></artwork>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Simple Negotiation Example</name> <name>Simple Negotiation Example</name>
<t>Following successful discovery of objective EX3, the initiator unicasts a Request Negotiation message:</t> <t>Following successful discovery of objective EX3, the initiator unicasts a Request Negotiation message:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[3, 802813, ["EX3", 3, 6, ["NZD", 47]]] [3, 802813, ["EX3", 3, 6, ["NZD", 47]]]
[M_REQ_NEG, 802813, ["EX3", F_NEG_bits, 6, ["NZD", 47]]] [M_REQ_NEG, 802813, ["EX3", F_NEG_bits, 6, ["NZD", 47]]]
h'83031a000c3ffd8463455833030682634e5a44182f' h'83031a000c3ffd8463455833030682634e5a44182f'
]]></artwork> ]]></artwork>
<t>The peer responds with immediate acceptance. Note that no objective is needed <t>The peer responds with immediate acceptance. Note that no objective is needed
because the initiator's request was accepted without change:</t> because the initiator's request was accepted without change:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[6, 802813, [101]] [6, 802813, [101]]
[M_END , 802813, [O_ACCEPT]] [M_END , 802813, [O_ACCEPT]]
h'83061a000c3ffd811865' h'83061a000c3ffd811865'
]]></artwork> ]]></artwork>
</section> </section>
<section numbered="true" toc="default"> <section numbered="true" toc="default">
<name>Complete Negotiation Example</name> <name>Complete Negotiation Example</name>
<t>Again the initiator unicasts a Request Negotiation message:</t> <t>Again the initiator unicasts a Request Negotiation message:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[3, 13767778, ["EX3", 3, 6, ["NZD", 410]]] [3, 13767778, ["EX3", 3, 6, ["NZD", 410]]]
[M_REQ_NEG, 13767778, ["EX3", F_NEG_bits, 6, ["NZD", 410]]] [M_REQ_NEG, 13767778, ["EX3", F_NEG_bits, 6, ["NZD", 410]]]
h'83031a00d214628463455833030682634e5a4419019a' h'83031a00d214628463455833030682634e5a4419019a'
]]></artwork> ]]></artwork>
<t>The responder starts to negotiate (making an offer):</t> <t>The responder starts to negotiate (making an offer):</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[5, 13767778, ["EX3", 3, 6, ["NZD", 80]]] [5, 13767778, ["EX3", 3, 6, ["NZD", 80]]]
[M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 6, ["NZD", 80]]] [M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 6, ["NZD", 80]]]
h'83051a00d214628463455833030682634e5a441850' h'83051a00d214628463455833030682634e5a441850'
]]></artwork> ]]></artwork>
<t>The initiator continues to negotiate (reducing its request, and note that the loop count is decremented):</t> <t>The initiator continues to negotiate (reducing its request, and note that the loop count is decremented):</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[5, 13767778, ["EX3", 3, 5, ["NZD", 307]]] [5, 13767778, ["EX3", 3, 5, ["NZD", 307]]]
[M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 5, ["NZD", 307]]] [M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 5, ["NZD", 307]]]
h'83051a00d214628463455833030582634e5a44190133' h'83051a00d214628463455833030582634e5a44190133'
]]></artwork> ]]></artwork>
<t>The responder asks for more time:</t> <t>The responder asks for more time:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[7, 13767778, 34965] [7, 13767778, 34965]
[M_WAIT, 13767778, 34965] [M_WAIT, 13767778, 34965]
h'83071a00d21462198895' h'83071a00d21462198895'
]]></artwork> ]]></artwork>
<t>The responder continues to negotiate (increasing its offer):</t> <t>The responder continues to negotiate (increasing its offer):</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[5, 13767778, ["EX3", 3, 4, ["NZD", 120]]] [5, 13767778, ["EX3", 3, 4, ["NZD", 120]]]
[M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 4, ["NZD", 120]]] [M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 4, ["NZD", 120]]]
h'83051a00d214628463455833030482634e5a441878' h'83051a00d214628463455833030482634e5a441878'
]]></artwork> ]]></artwork>
<t>The initiator continues to negotiate (reducing its request):</t> <t>The initiator continues to negotiate (reducing its request):</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[5, 13767778, ["EX3", 3, 3, ["NZD", 246]]] [5, 13767778, ["EX3", 3, 3, ["NZD", 246]]]
[M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 3, ["NZD", 246]]] [M_NEGOTIATE, 13767778, ["EX3", F_NEG_bits, 3, ["NZD", 246]]]
h'83051a00d214628463455833030382634e5a4418f6' h'83051a00d214628463455833030382634e5a4418f6'
]]></artwork> ]]></artwork>
<t>The responder refuses to negotiate further:</t> <t>The responder refuses to negotiate further:</t>
<artwork><![CDATA[ <artwork name="grasp-examples.txt" align="left"><![CDATA[
[6, 13767778, [102, "Insufficient funds"]] [6, 13767778, [102, "Insufficient funds"]]
[M_END , 13767778, [O_DECLINE, "Insufficient funds"]] [M_END , 13767778, [O_DECLINE, "Insufficient funds"]]
h'83061a00d2146282186672496e73756666696369656e742066756e6473' h'83061a00d2146282186672496e73756666696369656e742066756e6473'
]]></artwork> ]]></artwork>
<t>This negotiation has failed. If either side had sent <t>This negotiation has failed. If either side had sent
[M_END, 13767778, [O_ACCEPT]] it would have succeeded, converging [M_END, 13767778, [O_ACCEPT]] it would have succeeded, converging
on the objective value in the preceding M_NEGOTIATE. Note that apart on the objective value in the preceding M_NEGOTIATE. Note that apart
from the initial M_REQ_NEG, the process is symmetrical.</t> from the initial M_REQ_NEG, the process is symmetrical.</t>
</section> </section>
</section> </section>
 End of changes. 56 change blocks. 
56 lines changed or deleted 56 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/