<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.12 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lindblad-netconf-transaction-id-02" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-lindblad-netconf-transaction-id-02"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2022" month="June" day="08"/>
    <area>General</area>
    <workgroup>NETCONF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>NETCONF clients and servers often need to have a synchronized view of
the server's configuration data stores.  The volume of configuration
data in a server may be very large, while data store changes typically
are small when observed at typical client resynchronization intervals.</t>
      <t>Rereading the entire data store and analyzing the response for changes
is an inefficient mechanism for synchronization.  This document
specifies an extension to NETCONF that allows clients and servers to
keep synchronized with a much smaller data exchange and without any
need for servers to store information about the clients.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/netconf-wg/netconf-etag"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>When a NETCONF client connects with a NETCONF server, a frequently
occurring use case is for the client to find out if the configuration
has changed since it was last connected.  Such changes could occur for
example if another NETCONF client has made changes, or another system
or operator made changes through other means than NETCONF.</t>
      <t>One way of detecting a change for a client would be to
retrieve the entire configuration from the server, then compare
the result with a previously stored copy at the client side.  This
approach is not popular with most NETCONF users, however, since it
would often be very expensive in terms of communications and
computation cost.</t>
      <t>Furthermore, even if the configuration is reported to be unchanged,
that will not guarantee that the configuration remains unchanged
when a client sends a subsequent change request, a few moments later.</t>
      <t>In order to simplify the task of tracking changes, a NETCONF server
could implement a meta level checksum over the configuration over a
datastore or YANG subtree, and offer clients a way to read and
compare this checksum.  If the checksum is unchanged, clients can
avoid performing expensive operations.  Such checksums are often
referred to as a configuration id or transaction id (txid).</t>
      <t>Evidence of a transaction id feature being demanded by clients is that
several server implementors have built proprietary and mutually
incompatible mechanisms for obtaining a transaction id from a NETCONF
server.</t>
      <t>RESTCONF, <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>,
defines a mechanism for detecting changes in configuration subtrees
based on Entity-Tags (ETags) and Last-Modified txid values.</t>
      <t>In conjunction with this, RESTCONF
provides a way to make configuration changes conditional on the server
confiuguration being untouched by others.  This mechanism leverages
<eref target="https://tools.ietf.org/html/rfc7232">RFC 7232</eref>
"Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests".</t>
      <t>This document defines similar functionality for NETCONF,
<eref target="https://tools.ietf.org/html/rfc6241">RFC 6241</eref>, and ties this in
with YANG-Push, <eref target="https://tools.ietf.org/html/rfc8641">RFC 8641</eref>.</t>
    </section>
    <section anchor="conventions-and-definitions" numbered="true" toc="default">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>This document uses the terminology defined in
<eref target="https://tools.ietf.org/html/rfc6241">RFC6241</eref>,
<eref target="https://tools.ietf.org/html/rfc7950">RFC7950</eref>,
<eref target="https://tools.ietf.org/html/rfc8040">RFC8040</eref>, and
<eref target="https://tools.ietf.org/html/rfc8641">RFC8641</eref>.</t>
      <t>In addition, this document defines the following terms:</t>
      <dl newline="false" spacing="normal">
        <dt>Versioned node</dt>
        <dd>
  A node in the instantiated YANG data tree for which
the server maintains a transaction id (txid) value.</dd>
      </dl>
    </section>
    <section anchor="netconf-txid-extension" numbered="true" toc="default">
      <name>NETCONF Txid Extension</name>
      <t>This document describes a NETCONF extension which modifies the
behavior of get-config, get-data, edit-config, edit-data,
discard-changes, copy-config, delete-config and commit such
that clients are able to conditionally retrieve and update the
configuration in a NETCONF server.</t>
      <t>For servers implementing YANG-Push, an extension for conveying txid
updates as part of subscription updates is also defined.</t>
      <t>Several low level mechanisms could be defined to fulfill the
requirements for efficient client-server txid synchronization.
This document defines two such mechanisms, the etag txid mechanism
and the last-modified txid mechanism. Additional mechanisms could
be added in future.</t>
      <section anchor="use-cases" numbered="true" toc="default">
        <name>Use Cases</name>
        <t>The common use cases for such mecahnisms are briefly discussed here.</t>
        <dl newline="false" spacing="normal">
          <dt>Initial configuration retrieval</dt>
          <dd>
  When the client initially connects to a server, it may be interested
to acquire a current view of (parts of) the server's configuration.
In order to be able to efficiently detect changes later, it may also
be interested to store meta level txid information for
subtrees of the configuration.</dd>
          <dt>Subsequent configuration retrieval</dt>
          <dd>
  When a client needs to reread (parts of) the server's configuration,
it may be interested to leverage the txid meta data it has
stored by requesting the server to prune the response so that it does
not repeat configuration data that the client is already aware of.</dd>
          <dt>Configuration update with txid return</dt>
          <dd>
  When a client issues a transaction towards a server, it may be
interested to also learn the new txid meta data the server
has stored for the updated parts of the configuration.</dd>
          <dt>Configuration update with txid specification</dt>
          <dd>
  When a client issues a transaction towards a server, it may be
interested to also specify the new txid meta data that the
server stores for the updated parts of the configuration.</dd>
          <dt>Conditional configuration change</dt>
          <dd>
  When a client issues a transaction towards a server, it may specify
txid meta data for the transaction in order to allow the server to
verify that the client is up to date with any changes in the parts of
the configuration that it is concerned with.  If the txid
meta data in the server is different than the client expected, the
server rejects the transaction with a specific error message.</dd>
          <dt>Subscribe to configuration changes with txid return</dt>
          <dd>
  When a client subscribes to configuration change updates through
YANG-Push, it may be interested to also learn the the updated txid
meta data for the changed data trees.</dd>
        </dl>
      </section>
      <section anchor="general-txid-principles" numbered="true" toc="default">
        <name>General Txid Principles</name>
        <t>All servers implementing a txid mechanism MUST maintain a txid meta
data value for each configuration datastore supported by the server.
Txid mechanism implementations MAY also maintain txid meta data
values for nodes deeper in the YANG data tree.  The nodes for
which the server maintains txids are collectively referred to as the
"versioned nodes".</t>
        <t>The server returning txid values for the versioned nodes
MUST ensure the txid values are changed every time there has
been a configuration change at or below the node associated with
the txid value.  This means any update of a config true node will
result in a new txid value for all ancestor versioned node, up
to and including the datastore root itself.</t>
        <t>This also means a server MUST update the txid value for any
nodes that change as a result of a configuration change, regardless
of source, even if the changed nodes are not explicitly part
of the change payload.  An example of this is dependent data under
YANG <eref target="https://tools.ietf.org/html/rfc7950">RFC 7950</eref> when- or
choice-statements.</t>
        <t>The server MUST NOT change the txid value of a versioned node
unless the node itself or a child node of that node has
been changed.  The server MUST NOT change any txid values due to
changes in config false data.</t>
      </section>
      <section anchor="initial-configuration-retrieval" numbered="true" toc="default">
        <name>Initial Configuration Retrieval</name>
        <t>When a NETCONF server receives a get-config or get-data request
containing requests for txid values, it MUST return txid values for
all versioned nodes below the point requested by the client in
the reply.</t>
        <t>The exact encoding varies by mechanism, but all txid mechanisms
would have a special "txid-request" txid value (e.g. "?") which is
guaranteed to never be used as a normal txid value.  Clients MAY use
this special txid value associated with one or more nodes in the
data tree to indicate to the server that they are interested in
txid values below that point of the data tree.</t>
        <figure>
          <name>Initial Configuration Retrieval.  The server returns the requested configuration, annotated with txid values.  The most recent change seems to have been an update to the R8 and R9 source-port.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |         aces (txid: 4711)                       |
       |           ace R1 (txid: 4711)                   |
       |             matches ipv4 protocol udp           |
       |       acl A2 (txid: 5152)                       |
       |         aces (txid: 5152)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp AF11              |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |           ace R9 (txid: 5152)                   |
       |             matches tcp source-port port 22     |
       v                                                 v
]]></artwork>
        </figure>
        <t>NOTE: In the call flow examples we are using a 4-digit, monotonously
increasing integer as txid.  This is convenient and enhances
readability of the examples, but does not reflect a typical
implementation.  In general, the only operation defined on a pair of txid values is testing them for equality.</t>
      </section>
      <section anchor="subsequent-configuration-retrieval" numbered="true" toc="default">
        <name>Subsequent Configuration Retrieval</name>
        <t>Clients MAY request the server to return txid values in the response
by adding one or more txid values received previously in get-config or
get-data requests.</t>
        <t>When a NETCONF server receives a get-config or get-data request
containing a node with a client specified txid value, there are
several different cases:</t>
        <ul spacing="normal">
          <li>The node is not a versioned node, i.e. the server does not
maintain a txid value for this node.  In this case, the server
MUST look up the closest ancestor that is a versioned node, and
use the txid value of that node as the txid value of this node in
the further handling below.  The datastore root is always a
versioned node.</li>
          <li>The client specified txid value is different than the server's
txid value for this node.  In this case the server MUST return
the contents as it would otherwise have done, adding the txid values
of all child versioned nodes to the response.  In case the client
has specified txid values for some child nodes, then these
cases MUST be re-evaluated for those child nodes.</li>
          <li>The node is a versioned node, and the client specified txid
value matches the server's txid value.  In this case the server MUST
return the node decorated with a special "txid-match" txid value
(e.g. "=") to the matching node, pruning any value and child nodes.
A server MUST NOT ever use the txid-match value (e.g. "=") as an
actual txid value.</li>
        </ul>
        <t>For list elements, pruning child nodes means that top-level
key nodes MUST be included in the response, and other child nodes
MUST NOT be included.  For containers, child nodes MUST NOT
be included.</t>
        <figure>
          <name>Response Pruning.  Client sends get-config request with known txid values.  Server prunes response where txid matches expectations.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |         aces (txid: 4711)                       |
       |       acl A2 (txid: 5152)                       |
       |         aces (txid: 5152)                       |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: =)                              |
       v                                                 v
]]></artwork>
        </figure>
        <figure>
          <name>Out of band change detected.  Client sends get-config request with known txid values.  Server provides update where changes have happened.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: 5152)                           |
       |       acl A1 (txid: 4711)                       |
       |       acl A2 (txid: 5152)                       |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls (txid: 6614)                           |
       |       acl A1 (txid: =)                          |
       |       acl A2 (txid: 6614)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp AF11              |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       v                                                 v
]]></artwork>
        </figure>
        <figure>
          <name>Versioned nodes.  Server lookup of dscp txid gives 4711, as closest ancestor is ace R7 with txid 4711.  Since the server's and client's txid match, the etag value is '=', and the leaf value is pruned.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls                                        |
       |       acls A2                                   |
       |         aces                                    |
       |           ace R7                                |
       |             matches                             |
       |               ipv4                              |
       |                 dscp (txid: 4711)               |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     acls                                        |
       |       acl A2                                    |
       |         aces                                    |
       |           ace R7                                |
       |             matches                             |
       |               ipv4                              |
       |                 dscp (txid: =)                  |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="conditional-transactions" numbered="true" toc="default">
        <name>Conditional Transactions</name>
        <t>Conditional transactions are useful when a client is interested
to make a configuration change, being sure that relevant parts of
the server configuration have not changed since the client last
inspected it.</t>
        <t>By supplying the latest txid values known to the client
in its change requests (edit-config etc.), it can request the server
to reject the transaction in case any relevant changes have occurred
at the server that the client is not yet aware of.</t>
        <t>This allows a client to reliably compute and send confiuguration
changes to a server without either acquiring a global datastore lock
for a potentially extended period of time, or risk that a change
from another client disrupts the intent in the time window between a
read (get-config etc.) and write (edit-config etc.) operation.</t>
        <t>Clients that are also interested to know the txid assigned to the
modified versioned nodes in the model immediately in the
response could set a flag in the rpc message to request the server
to return the new txid with the ok message.</t>
        <figure>
          <name>Conditional transaction towards the Running datastore successfully executed.  As all the txid values specified by the client matched those on the server, the transaction was successfully executed.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config (txid: 5152)                         |
       |       acls (txid: 5152)                         |
       |         acl A1 (txid: 4711)                     |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 protocol tcp         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
        </figure>
        <figure>
          <name>For all leaf objects that were changed, and all their ancestors, the txids are updated to the value returned in the ok message.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 7688)                             |
       |     acls (txid: 7688)                           |
       |       acl A1 (txid: 7688)                       |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol tcp           |
       |       acl A2 (txid: 6614)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp AF11              |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       v                                                 v
]]></artwork>
        </figure>
        <t>If the server rejects the transaction because the configuration
txid value differs from the client's expectation, the
server MUST return an rpc-error with the following values:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   error-tag:      operation-failed
   error-type:     protocol
   error-severity: error
]]></artwork>
        <t>Additionally, the error-info tag SHOULD contain an sx:structure
containing relevant details about the mismatching txids.</t>
        <figure>
          <name>Conditional transaction that fails a txid check.  The client wishes to ensure there has been no changes to the particular acl entry it edits, and therefore sends the txid it knows for this part of the configuration.  Since the txid has changed (out of band), the server rejects the configuration change request and reports an error with details about where the mismatch was detected.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config                                   |
       |     config                                      |
       |       acls                                      |
       |         acl A1 (txid: 4711)                     |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               ipv4 dscp AF22                    |
       |                                                 |
       |   <------------------------------------------   |
       |   rpc-error                                     |
       |     error-tag       operation-failed            |
       |     error-type      protocol                    |
       |     error-severity  error                       |
       |     error-info                                  |
       |       mismatch-path /acls/acl[A1]               |
       |       mismatch-etag-value 6912                  |
       v                                                 v
]]></artwork>
        </figure>
        <section anchor="transactions-toward-the-candidate-datastore" numbered="true" toc="default">
          <name>Transactions toward the Candidate Datastore</name>
          <t>When working with the Candidate datastore, the txid validation happens
at commit time, rather than at individual edit-config or edit-data
operations.  Clients add their txid attributes to the configuration
payload the same way.  In case a client specifies different txid
values for the same element in successive edit-config or edit-data
operations, the txid value specified last MUST be used by the server
at commit time.</t>
          <figure>
            <name>Conditional transaction towards the Candidate datastore successfully executed.  As all the txid values specified by the client matched those on the server, the transaction was successfully executed.</name>
            <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config                                   |
       |     config (txid: 5152)                         |
       |       acls (txid: 5152)                         |
       |         acl A1 (txid: 4711)                     |
       |           type ipv4                             |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config                                   |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 protocol tcp         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   commit (request new txid in response)         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="dependencies-within-transactions" numbered="true" toc="default">
        <name>Dependencies within Transactions</name>
        <t>YANG modules that contain when-statements referencing remote
parts of the model will cause the txid to change even in parts of the
data tree that were not modified directly.</t>
        <t>Let's say there is an energy-example.yang module that defines a
mechanism for clients to request the server to measure the amount of
energy that is consumed by a given access control rule.  The
energy-example module augments the access control module as follows:</t>
        <artwork type="yang" name="" align="left" alt=""><![CDATA[
  augment /acl:acls/acl:acl {
    when /energy-example:energy/energy-example:metering-enabled;
    leaf energy-tracing {
      type boolean;
      default false;
    }
    leaf energy-consumption {
      config false;
      type uint64;
      units J;
    }
  }
]]></artwork>
        <t>This means there is a system wide switch leaf metering-enabled in
energy-example which disables all energy measurements in the system when
set to false, and that there is a boolean leaf energy-tracing that
controls whether energy measurement is happening for each acl rule
individually.</t>
        <t>In this example, we have an initial configuration like this:</t>
        <figure>
          <name>Initial configuration for the energy example.  Note the energy metering-enabled leaf at the top and energy-tracing leafs under each acl.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     energy (txid: ?)                            |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 7688)                             |
       |     energy metering-enabled true (txid: 4711)   |
       |     acls (txid: 7688)                           |
       |       acl A1 (txid: 7688)                       |
       |         energy-tracing false                    |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol tcp           |
       |       acl A2 (txid: 6614)                       |
       |         energy-tracing true                     |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp AF11              |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       v                                                 v
]]></artwork>
        </figure>
        <t>At this point, a client updates metering-enabled to false.  This causes
the when-expression on energy-tracing to turn false, removing the leaf
entirely.  This counts as a configuration change, and the txid MUST be
updated appropriately.</t>
        <figure>
          <name>Transaction changing a single leaf.  This leaf is the target of a when-statement, however, which means other leafs elsewhere may be indirectly modified by this change.  Such indirect changes will also result in txid changes.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config                                      |
       |       energy metering-enabled false             |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 9118)                               |
       v                                                 v
]]></artwork>
        </figure>
        <t>After the transaction above, the new configuration state has the
energy-tracing leafs removed.</t>
        <figure>
          <name>The txid for the energy subtree has changed since that was the target of the edit-config.  The txids of the ACLs have also changed since the energy-tracing leafs are now removed by the now false when-expression.</name>
          <artwork type="call-flow" name="" align="left" alt=""><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     energy (txid: ?)                            |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 9118)                             |
       |     energy metering-enabled false (txid: 9118)  |
       |     acls (txid: 9118)                           |
       |       acl A1 (txid: 9118)                       |
       |         aces (txid: 7688)                       |
       |           ace R1 (txid: 7688)                   |
       |             matches ipv4 protocol tcp           |
       |       acl A2 (txid: 9118)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp AF11              |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="other-netconf-operations" numbered="true" toc="default">
        <name>Other NETCONF Operations</name>
        <dl newline="false" spacing="normal">
          <dt>discard-changes</dt>
          <dd>
  The discard-changes operation resets the candidate datastore to the
contents of the running datastore.  The server MUST ensure the
txid values in the candidate datastore get the same txid values
as in the running datastore when this operation runs.</dd>
          <dt>copy-config</dt>
          <dd>
  The copy-config operation can be used to copy contents between
datastores.  The server MUST ensure the txid values retain
the same txid values as in the soruce datastore.</dd>
          <dt/>
          <dd>If copy-config is used to copy from a file, URL or other source that
is not a datastore, the server MUST ensure the txid values
are changed for the versioned nodes that are changed or have child
nodes changed by the operation.</dd>
          <dt>delete-config</dt>
          <dd>
  The server MUST ensure the datastore txid value is changed, unless it
was already empty.</dd>
          <dt>commit</dt>
          <dd>
  At commit, with regards to the txid values, the server MUST
treat the contents of the candidate datastore as if any txid
value provided by the client when updating the candidate was provided
in a single edit-config towards the running datastore.  If the
transaction is rejected due to txid value mismatch,
an rpc-error as described in section
<xref target="conditional-transactions" format="default">Conditional Transactions</xref> MUST be sent.</dd>
        </dl>
      </section>
      <section anchor="yang-push-subscriptions" numbered="true" toc="default">
        <name>YANG-Push Subscriptions</name>
        <t>A client issuing a YANG-Push establish-subscription or
modify-subscription request towards a server that supports both
YANG-Push <eref target="https://tools.ietf.org/html/rfc8641">RFC 8641</eref> and a txid
mechanism MAY request that the server provides updated txid values in
YANG-Push subscription updates.</t>
      </section>
    </section>
    <section anchor="txid-mechanisms" numbered="true" toc="default">
      <name>Txid Mechanisms</name>
      <t>This document defines two txid mechanisms:</t>
      <ul spacing="normal">
        <li>The etag attribute txid mechanism</li>
        <li>The last-modified attribute txid mechanism</li>
      </ul>
      <t>Servers implementing this specification MUST support the etag
attribute txid mechanism and MAY support the last-modified
attribute txid mechanism.</t>
      <t>Section <xref target="netconf-txid-extension" format="default">NETCONF Txid Extension</xref> describes
the logic that governs all txid mechanisms.  This section describes
the mapping from the generic logic to specific mechanism and encoding.</t>
      <t>If a client uses more than one txid mechanism, such as both etag and
last-modified in a particular message to a server, or patricular
commit, the result is undefined.</t>
      <section anchor="the-etag-attribute-txid-mechanism" numbered="true" toc="default">
        <name>The etag attribute txid mechanism</name>
        <t>The etag txid mechanism described in this section is centered around
a meta data XML attribute called "etag".  The etag attribute is
defined in the namespace "urn:ietf:params:xml:ns:netconf:txid:1.0".
The etag attribute is added to XML elements in the NETCONF payload
in order to indicate the txid value for the YANG node represented by
the element.</t>
        <t>NETCONF servers that support this extension MUST announce the
capability "urn:ietf:params:netconf:capability:txid:etag:1.0".</t>
        <t>The etag attribute values are opaque UTF-8 strings chosen freely,
except that the etag string must not contain space, backslash
or double quotes. The point of this restriction is to make it easy to
reuse implementations that adhere to section 2.3.1 in
<eref target="https://tools.ietf.org/html/rfc7232">RFC 7232</eref>.  The probability
SHOULD be made very low that an etag value that has been used
historically by a server is used again by that server if the
configuration is different.</t>
        <t>It is RECOMMENDED that the same etag txid values are used across all
management interfaces (i.e. NETCONF, RESTCONF and any other the server
might implement), if it implements more than one.</t>
        <t>The detailed rules for when to update the etag value are described in
section <xref target="general-txid-principles" format="default">General Txid Principles</xref>.  These
rules are chosen to be consistent with the ETag mechanism in
RESTCONF, <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>,
specifically sections 3.4.1.2, 3.4.1.3 and 3.5.2.</t>
      </section>
      <section anchor="the-last-modified-attribute-txid-mechanism" numbered="true" toc="default">
        <name>The last-modified attribute txid mechanism</name>
        <t>The last-modified txid mechanism described in this section is
centered around a meta data XML attribute called "last-modified".
The last-modified attribute is defined in the namespace
"urn:ietf:params:xml:ns:netconf:txid:1.0".  The last-modified
attribute is added to XML elements in the NETCONF payload in
order to indicate the txid value for the YANG node represented by
the element.</t>
        <t>NETCONF servers that support this extension MUST announce the
capability
"urn:ietf:params:netconf:capability:txid:last-modified:1.0".</t>
        <t>The last-modified attribute values are yang:date-and-time values as
defined in ietf-yang-types.yang,
<eref target="https://datatracker.ietf.org/doc/html/rfc6991">RFC 6991</eref>.</t>
        <t>"2022-04-01T12:34:56.123456Z" is an example of what this time stamp
format looks like.  It is RECOMMENDED that the time stamps provided
by the server to closely match the real world clock.  Servers
MUST ensure the timestamps provided are monotonously increasing for
as long as the server's operation is maintained.</t>
        <t>It is RECOMMENDED that server implementors choose the number of
digits of precision used for the fractional second timestamps
high enough so that there is no risk that multiple transactions on
the server would get the same timestamp.</t>
        <t>It is RECOMMENDED that the same last-modified txid values are used
across all management interfaces (i.e. NETCONF and any other the
server might implement), except RESTCONF.</t>
        <t>RESTCONF, as defined in
<eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>,
is using a different format for the time stamps which is
limited to one second resolution.  Server implementors that support
the Last-Modified txid mechanism over both RESTCONF and other
management protocols are RECOMMENDED to use Last-Modified timestamps
that match the point in time referenced over RESTCONF, with the
fractional seconds part added.</t>
        <t>The detailed rules for when to update the last-modified value are
described in section
<xref target="general-txid-principles" format="default">General Txid Principles</xref>.  These rules
are chosen to be consistent with the Last-Modified mechanism in
RESTCONF, <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>,
specifically sections 3.4.1.1, 3.4.1.3 and 3.5.1.</t>
      </section>
      <section anchor="common-features-to-both-etag-and-last-modified-txid-mechanisms" numbered="true" toc="default">
        <name>Common features to both etag and last-modified txid mechanisms</name>
        <t>Clients MAY add etag or last-modified attributes to zero or
more individual elements in the get-config or get-data filter, in
which case they pertain to the subtree(s) rooted at the element(s)
with the attributes.</t>
        <t>Clients MAY also add such attributes directly to the get-config or
get-data tags (e.g. if there is no filter), in which case it
pertains to the txid value of the datastore root.</t>
        <t>Clients might wish to send a txid value that is guaranteed to never
match a server constructed txid.  With both the etag and
last-modified txid mechanisms, such a txid-request value is "?".</t>
        <t>Clients MAY add etag or last-modified attributes to the payload
of edit-config or edit-data requests, in which case they indicate
the client's txid value of that element.</t>
        <t>Clients MAY request servers that also implement YANG-Push to return
configuration change subsription updates with etag or
last-modified txid attributes.  The client requests this service by
adding a with-etag or with-last-modified flag with the value 'true'
to the subscription request or yang-push configuration.  The server
MUST then return such txids on the YANG Patch edit tag and to the
child elements of the value tag.  The txid attribute on the edit tag
reflects the txid associated with the changes encoded in this edit
section, as well as parent nodes.  Later edit sections in the same
push-update or push-change-update may still supercede the txid value
for some or all of the nodes in the current edit section.</t>
        <t>Servers returning txid values in get-config, edit-config, get-data,
edit-data and commit operations MUST do so by adding etag and/or
last-modified txid attributes to the data and ok tags.  When
servers prune output due to a matching txid value, the server
MUST add a txid-match attribute to the pruned element, and MUST set
the attribute value to "=", and MUST NOT send any element value.</t>
        <t>Servers returning a txid mismatch error MUST return an rpc-error
as defined in section
<xref target="conditional-transactions" format="default">Conditional Transactions</xref> with an
error-info tag containing a txid-value-mismatch-error-info
structure.</t>
        <t>The txid attributes are valid on the following NETCONF tags,
where xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0",
xmlns:ncds="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda",
xmlns:sn="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications",
xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-patch" and
xmlns:ypatch="urn:ietf:params:xml:ns:yang:ietf-yang-patch":</t>
        <t>In client messages sent to a server:</t>
        <ul spacing="normal">
          <li>/nc:rpc/nc:get-config</li>
          <li>/nc:rpc/nc:get-config/nc:filter//*</li>
          <li>/nc:rpc/ncds:get-data</li>
          <li>/nc:rpc/ncds:get-data/ncds:subtree-filter//*</li>
          <li>/nc:rpc/ncds:get-data/ncds:xpath-filter//*</li>
          <li>/nc:rpc/nc:edit-config/nc:config</li>
          <li>/nc:rpc/nc:edit-config/nc:config//*</li>
          <li>/nc:rpc/ncds:edit-data/ncds:config</li>
          <li>/nc:rpc/ncds:edit-data/ncds:config//*</li>
        </ul>
        <t>In server messages sent to a client:</t>
        <ul spacing="normal">
          <li>/nc:rpc-reply/nc:data</li>
          <li>/nc:rpc-reply/nc:data//*</li>
          <li>/nc:rpc-reply/ncds:data</li>
          <li>/nc:rpc-reply/ncds:data//*</li>
          <li>/nc:rpc-reply/nc:ok</li>
          <li>/yp:push-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit</li>
          <li>/yp:push-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit/ypatch:value//*</li>
          <li>/yp:push-change-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit</li>
          <li>/yp:push-change-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit/ypatch:value//*</li>
        </ul>
      </section>
    </section>
    <section anchor="txid-mechanism-examples" numbered="true" toc="default">
      <name>Txid Mechanism Examples</name>
      <section anchor="initial-configuration-response" numbered="true" toc="default">
        <name>Initial Configuration Response</name>
        <section anchor="with-etag" numbered="true" toc="default">
          <name>With etag</name>
          <t>NOTE: In the etag examples below, we have chosen to use a txid
value consisting of "nc" followed by a monotonously increasing
integer.  This is convenient for the reader trying to make sense
of the examples, but is not an implementation requirement.  An
etag would often be implemented as a "random" string of characters,
with no comes-before/after relation defined.</t>
          <t>To retrieve etag attributes across the entire NETCONF server
configuration, a client might send:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config txid:etag="?"/>
</rpc>
]]></artwork>
          <t>The server's reply might then be:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="nc5152">
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>udp</protocol>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"
          txid:etag="nc3072">
      <groups txid:etag="nc3072">
        <group txid:etag="nc3072">
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></artwork>
          <t>To retrieve etag attributes for a specific ACL using an xpath
filter, a client might send:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter type="xpath"
      xmlns:acl=
        "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      select="/acl:acls/acl:acl[acl:name='A1']"
      txid:etag="?"/>
  </get-config>
</rpc>
]]></artwork>
          <t>To retrieve etag attributes for "acls", but not for "nacm",
a client might send:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="3"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></artwork>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
versioned nodes, the server's response to the request above
might look like:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="3"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>udp</protocol>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></artwork>
        </section>
        <section anchor="with-last-modified" numbered="true" toc="default">
          <name>With last-modified</name>
          <t>To retrieve last-modified attributes for "acls", but not for "nacm",
a client might send:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:last-modified="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></artwork>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
versioned nodes, the server's response to the request above
might look like:</t>
          <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="4"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:last-modified="2022-04-01T12:34:56.789012Z">
      <acl txid:last-modified="2022-03-20T16:20:11.333444Z">
        <name>A1</name>
        <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
          <name>R1</name>
          <matches>
            <ipv4>
              <protocol>udp</protocol>
            </ipv4>
          </matches>
        </ace>
      </acl>
      <acl txid:last-modified="2022-04-01T12:34:56.789012Z">
        <name>A2</name>
        <aces txid:last-modified="2022-04-01T12:34:56.789012Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></artwork>
        </section>
      </section>
      <section anchor="configuration-response-pruning" numbered="true" toc="default">
        <name>Configuration Response Pruning</name>
        <t>A NETCONF client that already knows some txid values MAY request that
the configuration retrieval request is pruned with respect to the
client's prior knowledge.</t>
        <t>To retrieve only changes for "acls" that do not have the
last known etag txid value, a client might send:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711"/>
        </acl>
        <acl txid:etag="nc5152">
          <name>A2</name>
          <aces txid:etag="nc5152"/>
        </acl>
    </filter>
  </get-config>
</rpc>
]]></artwork>
        <t>Assuming the NETCONF server configuration is the same as
in the previous rpc-reply example, the server's response to request
above might look like:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="="/>
  </data>
</rpc>
]]></artwork>
        <t>Or, if a configuration change has taken place under /acls since the
client was last updated, the server's response may look like:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc6614">
      <acl txid:etag="=">
        <name>A1</name>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>22</port>
                </source-port>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>830</port>
                </source-port>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></artwork>
        <t>In case the client provides a txid value for a non-versioned node,
the server needs to treat the node as having the same txid value as
the closest ancestor that does have a txid value.</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl>
          <name>A2</name>
          <aces>
            <ace>
              <name>R7</name>
              <matches>
                <ipv4>
                  <dscp txid:etag="nc4711"/>
                </ipv4>
              </matches>
            </ace>
          </aces>
        </acl>
      </acls>
    </filter>
  </get-config>
</rpc>
]]></artwork>
        <t>If a txid value is specified for a leaf, and the txid value matches,
the leaf value is pruned.</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="7"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      <acl>
        <name>A2</name>
        <aces>
          <ace>
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp txid:etag="="/>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></artwork>
      </section>
      <section anchor="configuration-change" numbered="true" toc="default">
        <name>Configuration Change</name>
        <t>A client that wishes to update the ace R1 protocol to tcp might send:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8">
  <edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
               xmlns:ietf-netconf-txid=
                "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
    <target>
      <running/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true<ietf-netconf-txid:with-etag>
    <config>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711">
            <ace txid:etag="nc4711">
              <matches>
                <ipv4>
                  <protocol>tcp</protocol>
                </ipv4>
              </matches>
            </ace>
          </aces>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></artwork>
        <t>The server would update the protocol leaf in the running datastore,
and return an rpc-reply as follows:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="8"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc7688"/>
</rpc-reply>
]]></artwork>
        <t>A subsequent get-config request for "acls", with txid:etag="?" might
then return:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc7688">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>tcp</protocol>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>830</port>
                </source-port>
              </tcp>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></artwork>
        <t>In case the server at this point received a configuration change from
another source, such as a CLI operator, removing ace R8 and R9 in
acl A2, a subsequent get-config request for acls, with txid:etag="?"
might then return:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="cli2222">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>tcp</protocol>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></artwork>
      </section>
      <section anchor="conditional-configuration-change" numbered="true" toc="default">
        <name>Conditional Configuration Change</name>
        <t>If a client wishes to delete acl A1 if and only if its configuration
has not been altered since this client last synchronized its
configuration with the server, at which point it received the etag
"nc7688" for acl A1, regardless of any possible changes to other
acls, it might send:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"
     xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0"
     xmlns:ietf-netconf-txid=
       "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
  <edit-config>
    <target>
      <runnign/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true<ietf-netconf-txid:with-etag>
    <config>
      <acls xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl nc:operation="delete"
             txid:etag="nc7688">
          <name>A1</name>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></artwork>
        <t>If acl A1 now has the etag txid value "nc7688", as expected by the
client, the transaction goes through, and the server responds
something like:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="10"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></artwork>
        <t>A subsequent get-config request for acls, with txid:etag="?" might
then return:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="11"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc8008">
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>AF11</dscp>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></artwork>
        <t>In case acl A1 did not have the expected etag txid value "nc7688",
when the server processed this request, it rejects the transaction,
and might send:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
           xmlns:ietf-netconf-txid=
             "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
           message-id="11">
  <rpc-error>
    <error-type>protocol</error-type>
    <error-tag>operation-failed</error-tag>
    <error-severity>error</error-severity>
    <error-info>
      <ietf-netconf-txid:txid-value-mismatch-error-info>
        <ietf-netconf-txid:mismatch-path>
          /acl:acls/acl:acl[acl:name="A1"]
        </ietf-netconf-txid:mismatch-path>
        <ietf-netconf-txid:mismatch-etag-value>
          cli6912
        </ietf-netconf-txid:mismatch-etag-value>
      </ietf-netconf-txid:txid-value-mismatch-error-info>
    </error-info>
  </rpc-error>
</rpc-reply>
]]></artwork>
      </section>
      <section anchor="using-etags-with-other-netconf-operations" numbered="true" toc="default">
        <name>Using etags with Other NETCONF Operations</name>
        <t>The client MAY request that the new etag txid value is returned as an
attribute on the ok response for a successful commit.  The client
requests this by adding with-etag to the commit operation.</t>
        <t>For example, a client might send:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc message-id="12"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    xmlns:ietf-netconf-txid=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
  <commit>
    <ietf-netconf-txid:with-etag>true<ietf-netconf-txid:with-etag>
  </commit>
</rpc>
]]></artwork>
        <t>Assuming the server accepted the transaction, it might respond:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc-reply message-id="12"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></artwork>
      </section>
      <section anchor="yang-push" numbered="true" toc="default">
        <name>YANG-Push</name>
        <t>A client MAY request that the updates for one or more YANG Push
subscriptions are annotated with the txid values.  The request might
look like this:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<netconf:rpc message-id="13"
             xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
  <establish-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <yp:datastore-xpath-filter
        xmlns:acl=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      /acl:acls
    </yp:datastore-xpath-filter>
    <yp:periodic>
      <yp:period>500</yp:period>
    </yp:periodic>
    <ietf-netconf-txid-yp:with-etag>
      true
    </ietf-netconf-txid-yp:with-etag>
  </establish-subscription>
</netconf:rpc>
]]></artwork>
        <t>In case a client wishes to modify a previous subscription request in
order to no longer receive YANG Push subscription updates, the request
might look like this:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<rpc message-id="14"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <modify-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <id>1011</id>
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <ietf-netconf-txid-yp:with-etag>
      false
    </ietf-netconf-txid-yp:with-etag>
  </modify-subscription>
</rpc>
]]></artwork>
        <t>A server might send a subscription update like this:</t>
        <artwork type="xml" name="" align="left" alt=""><![CDATA[
<notification
  xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
  <eventTime>2022-04-04T06:00:24.16Z</eventTime>
  <push-change-update
      xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
    <id>89</id>
    <datastore-changes>
      <yang-patch>
        <patch-id>0</patch-id>
        <edit txid:etag="nc8008">
          <edit-id>edit1</edit-id>
          <operation>delete</operation>
          <target xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
            /acl:acls
          </target>
          <value>
            <acl xmlns=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
              <name>A1</name>
            </acl>
          </value>
        </edit>
      </yang-patch>
    </datastore-changes>
  </push-change-update>
</notification>
]]></artwork>
      </section>
    </section>
    <section anchor="yang-modules" numbered="true" toc="default">
      <name>YANG Modules</name>
      <section anchor="base-module-for-txid-in-netconf" numbered="true" toc="default">
        <name>Base module for txid in NETCONF</name>
        <artwork type="yang" name="" align="left" alt=""><![CDATA[
module ietf-netconf-txid {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid';
  prefix ietf-netconf-txid;

  import ietf-netconf {
    prefix nc;
  }

  import ietf-netconf-nmda {
    prefix ncds;
  }

  import ietf-yang-structure-ext {
    prefix sx;
  }

  import ietf-yang-types {
    prefix yang;
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <http://tools.ietf.org/wg/netconf/>
     WG List:  <netconf@ietf.org>

     Author:   Jan Lindblad
               <mailto:jlindbla@cisco.com>";

  description
    "NETCONF Transaction ID aware operations for NMDA.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.
     ";

  revision 2022-04-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

  typedef etag-t {
    type string {
      pattern ".* .*" {
        modifier invert-match;
      }
      pattern '.*".*' {
        modifier invert-match;
      }
      pattern ".*\\.*" {
        modifier invert-match;
      }
    }
    description 
      "Unique Entity-tag txid value representing a specific 
      transaction.  Could be any string that does not contain 
      spaces, double quotes or backslash.  The txid values '?' 
      and '=' have special meaning.";
  }

  typedef last-modified-t {
    type union {
      type yang:date-and-time;
      type enumeration {
        enum ? {
          description "Txid value used by clients that is 
            guaranteed not to match any txid on the server.";
        }
        enum = {
          description "Txid value used by servers to indicate 
            that contents has been pruned due to txid match
            between client and server.";
        }
      }
    }
    description
      "Last-modified txid value representing a specific transaction.
       The txid values '?' and '=' have special meaning.";
  }

  grouping txid-grouping {
    leaf with-etag {
      type boolean;
      description
        "Indicates whether the client requests the server to include
         a txid:etag txid attribute when the configuration has 
         changed.";
    }
    leaf with-last-modified {
      type boolean;
      description 
        "Indicates whether the client requests the server to include
         a txid:last-modified attribute when the configuration has 
         changed.";
    }
    description
      "Grouping for txid mechanisms, to be augmented into 
       rpcs that modify configuration data stores.";
  }

  augment /nc:edit-config/nc:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      edit-config operation";
  }

  augment /nc:commit/nc:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      commit operation";
  }

  augment /ncds:edit-data/ncds:input {
    uses txid-grouping;
    description
      "Injects the txid mechanisms into the 
      edit-data operation";
  }

  sx:structure txid-value-mismatch-error-info {
    container txid-value-mismatch-error-info {
      description
         "This error is returned by a NETCONF server when a client
          sends a configuration change request, with the additonal
          condition that the server aborts the transaction if the
          server's configuration has changed from what the client
          expects, and the configuration is found not to actually
          not match the client's expectation.";
      leaf mismatch-path {
        type instance-identifier;
        description
          "Indicates the YANG path to the element with a mismatching
           etag txid value.";
      }
      leaf mismatch-etag-value {
        type etag-t;
        description
          "Indicates server's txid value of the etag 
          attribute for one mismatching element.";
      }
      leaf mismatch-last-modified-value {
        type last-modified-t;
        description
          "Indicates server's txid value of the last-modified 
          attribute for one mismatching element.";
      }
    }
  }
}
]]></artwork>
      </section>
      <section anchor="additional-support-for-txid-in-yang-push" numbered="true" toc="default">
        <name>Additional support for txid in YANG-Push</name>
        <artwork type="yang" name="" align="left" alt=""><![CDATA[
module ietf-netconf-txid-yang-push {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push';
  prefix ietf-netconf-txid-yp;

  import ietf-subscribed-notifications {
    prefix sn;
    reference
      "RFC 8639: Subscription to YANG Notifications";
  }

  import ietf-netconf-txid {
    prefix ietf-netconf-txid;
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

  organization
    "IETF NETCONF (Network Configuration) Working Group";

  contact
    "WG Web:   <http://tools.ietf.org/wg/netconf/>
     WG List:  <netconf@ietf.org>

     Author:   Jan Lindblad
               <mailto:jlindbla@cisco.com>";

  description
    "NETCONF Transaction ID aware operations for YANG Push.

     Copyright (c) 2022 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.
     ";

  revision 2022-04-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

  augment "/sn:establish-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
        that apply specifically to datastore updates to RPC input.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:modify-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
        specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:subscriptions/sn:subscription" {
    description
      "This augmentation adds additional subscription parameters
        specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
}
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document registers the following capability identifier URN in
the 'Network Configuration Protocol (NETCONF) Capability URNs'
registry:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  urn:ietf:params:netconf:capability:txid:1.0
]]></artwork>
      <t>This document registers three XML namespace URNs in the 'IETF XML
registry', following the format defined in
<eref target="https://tools.ietf.org/html/rfc3688">RFC 3688</eref>.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  URI: urn:ietf:params:xml:ns:netconf:txid:1.0

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push

  Registrant Contact: The NETCONF WG of the IETF.

  XML: N/A, the requested URIs are XML namespaces.
]]></artwork>
      <t>This document registers two module names in the 'YANG Module Names'
registry, defined in <eref target="https://tools.ietf.org/html/rfc6020">RFC 6020</eref>.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  name: ietf-netconf-txid

  prefix: ietf-netconf-txid

  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid

  RFC: XXXX
]]></artwork>
      <t>and</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  name: ietf-netconf-txid-yp

  prefix: ietf-netconf-txid-yp

  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push

  RFC: XXXX
]]></artwork>
    </section>
    <section anchor="changes" numbered="true" toc="default">
      <name>Changes</name>
      <section anchor="major-changes-in-02-since-01" numbered="true" toc="default">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>A last-modified txid mechanism has been added (back).  This
mechanism aligns well with the Last-Modified mechanism defined in
RESTCONF <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>,
but is not a carbon copy.</li>
          <li>YANG Push functionality has been added.  This allows YANG Push
users to receive txid updates as part of the configuration updates.
This functionality comes in a separate YANG module, to allow
implementors to cleanly keep all this functionality out.</li>
          <li>Changed name of "versioned elements". They are now called
"versioned nodes".</li>
          <li>Clarified txid behavior for transactions toward the Candidate
datastore, and some not so common situations, such
as when a client specifies a txid for a non-versioned node, and
when there are when-statement dependencies across subtrees.</li>
          <li>Examples provided for the abstract mechanism level with simple
message flow diagrams.</li>
          <li>More examples on protocol level, and with ietf-interfaces as
example target module replaced with ietf-access-control to reduce
confusion.</li>
          <li>Explicit list of XPaths to clearly state where etag or
last-modified attributes may be added by clients and servers.</li>
          <li>Document introduction restructured to remove duplication between
sections and to allow multiple (etag and last-modified) txid
mechanisms.</li>
          <li>Moved the actual YANG module code into proper module files that
are included in the source document.  These modules can be compiled
as proper modules without any extraction tools.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00" numbered="true" toc="default">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>Updated the text on numerous points in order to answer questions
that appeared on the mailing list.</li>
          <li>Changed the document structure into a general transaction id part
and one etag specific part.</li>
          <li>Renamed entag attribute to etag, prefix to txid, namespace to
urn:ietf:params:xml:ns:yang:ietf-netconf-txid.</li>
          <li>Set capability string to
urn:ietf:params:netconf:capability:txid:1.0</li>
          <li>Changed YANG module name, namespace and prefix to match names above.</li>
          <li>Harmonized/slightly adjusted etag value space with RFC 7232 and
RFC 8040.</li>
          <li>Removed all text discussing etag values provided by the client
(although this is still an interesting idea, if you ask the author)</li>
          <li>Clarified the etag attribute mechanism, especially when it comes to
matching against non-versioned elements, its cascading upwards in the
tree and secondary effects from when- and choice-statements.</li>
          <li>Added a mechanism for returning the server assigned etag value in
get-config and get-data.</li>
          <li>Added section describing how the NETCONF discard-changes,
copy-config, delete-config and commit operations work with respect to
etags.</li>
          <li>Added IANA Considerations section.</li>
          <li>Removed all comments about open questions.</li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner">
            <organization/>
          </author>
          <date year="1997" month="March"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="B. Leiba">
            <organization/>
          </author>
          <date year="2017" month="May"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoit Claise for making this work happen,
and the following individuals, who all provided helpful comments:
Per Andersson, Kent Watsen, Andy Bierman, Robert Wilton, Qiufang Ma.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
f4eNbeSJK+OZe0WSOhP/r74Krnl4t7NV6OjmOV0pbeeWs0rfqfU83Wper3Qr
psvLgq+7aC+YGK3Wc3kWQzOB65k2j4RNEBtDo2d4RdMzGKHzsUgzxc5kUYq3
975bkY/SfGUMaHxRPLB1ac6a+5axNEM3h9q1OpDLPOd2gP50uEun/9M4a7Fl
C7Jloxdbmxsf2afQSmRhEDBsvtIKII1D83jTsQ9hspKl722qPWjoPnDs3X+F
rtJ4Qo7MeM9R6kvCmT5rsdeSrOzg+Tnbm8AyJfMPezezmft4nk/QZG0tsPN8
eir4oukyRysn+0+T8zyalZaySPOEbLzpQtL91yJVpzw9c1NV8E0zfS9WzyJJ
VVEttV9gShZUY6Qir6nzNEvyc0C08pxOewS7GntSAi0b320u0lK2rKk7FBm6
8woeGhrp0TMp9OxDDHLm2Vip9Fi76eNetv7wdRutHje8l/MoXSxgIICdfFDB
R2FaseYLAAoXOZrN42NrlltOjecjL287Cjqbp/Hc0hfcAF1OPdfJL0ou9Ff1
hoGMBUCaWbPFbqPXyLgbbaSdt8uFl6u6uWLfxck3MNx18NRNvAY62XG71wBq
V2urrv98KOEOkF3P7vatO3fWmN4+pPzQwVatRzgdQ1cZWestERWqmsJ6KuC5
RDrltGJ18Uixb1fNjdSdl7ALmdAUk5cm0UcywW3UftO7Gk+EvH6F7fdacfQH
/Hv0gtoY9y+Y67rKa8xoF1VfYwvbsmqdnnVV38oLyqdn13a/a7tf41Mn/N9r
33jSxvKJudGC0UCk8/rnU1VN09NCGFVRX7h0VxbsdRHWVVi9Y/nOndXmp8KI
dEiz9e2cNbdqJnIamwPoMCqO5+nADhHKhYGxiql3zBNc4vHdolFHWk4HfF/H
CqDu0jSzsTFxGVwBKjgADXfMsLVC+WAWp3OZeGVWS8mFzE5178idJi1XY/5N
jQt3EXW+0po0FcZLkBHq1PoWvz67xqGrd2NVFtUUb6aGXuFae0tAGU+BULrw
R4tUWecAWsMvWcTeslcrYm8/YPxsbmn7ckRsnzwftBoKPwNBw+3wrXv1drx+
Wt/x66sCIeCnlmVv2quhE/r3NgMmqrHtXCNLHgbLGGjhHqI0/vfT0ejnjaui
AXDAxPnW3VELUnwKJQbZ2YxpHyskFDCJvfKMEnKeqhO2J7lLcHy7jb1yszzy
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
AA==

-->

</rfc>
