<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netconf-transaction-id-00" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-transaction-id-00"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="09"/>
    <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>Discussion of this document takes place on the
    Network Configuration Working Group mailing list (netconf@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netconf/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/netconf-wg/transaction-id"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>When a NETCONF client wishes to initiate a new configuration transaction
with a NETCONF server, a frequently occurring use case is for the
client to find out if the configuration has changed since the client
last communicated with the server.  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 transaction tag or timestamp for an entire
configuration datastore or YANG subtree, and offer clients a way to
read and compare this tag or timestamp.  If the tag or timestamp is
unchanged, clients can avoid performing expensive operations.  Such
tags and timestamps are referred to as a transaction id (txid) in this
document.</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, <xref target="RFC8040"/>,
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
<xref target="RFC7232"/>
"Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests".</t>
      <t>This document defines similar functionality for NETCONF,
<xref target="RFC6241"/>, and ties this in
with YANG-Push, <xref target="RFC8641"/>.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>This document uses the terminology defined in
<xref target="RFC6241"/>,
<xref target="RFC7950"/>,
<xref target="RFC8040"/>, and
<xref target="RFC8641"/>.</t>
      <t>In addition, this document defines the following terms:</t>
      <dl>
        <dt>Versioned node</dt>
        <dd>
          <t>A node in the instantiated YANG data tree for which
the server maintains a transaction id (txid) value.</t>
        </dd>
      </dl>
    </section>
    <section anchor="netconf-txid-extension">
      <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">
        <name>Use Cases</name>
        <t>The common use cases for such mecahnisms are briefly discussed here.</t>
        <dl>
          <dt>Initial configuration retrieval</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>Subsequent configuration retrieval</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>Configuration update with txid return</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>Conditional configuration change</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>Subscribe to configuration changes with txid return</dt>
          <dd>
            <t>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.</t>
          </dd>
        </dl>
      </section>
      <section anchor="general-txid-principles">
        <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 nodes, 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 <xref target="RFC7950"/> 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">
        <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"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config (txid: ?)                          |
       |     acls                                        |
       |                                                 |
       |   <------------------------------------------   |
       |   data (txid: 5152)                             |
       |     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.  Servers may assign values randomly.  In general,
no information can be derived by observing that some txid value is
numerically or lexicographically lower than another txid value.
The only operation defined on a pair of txid values is testing them
for equality.</t>
      </section>
      <section anchor="subsequent-configuration-retrieval">
        <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 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"><![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.  Specifically ace R8 is returned since ace R8 is a child of a node for which the request had a different txid than the server, and the client did not specify any matching txid for the ace R8 node.</name>
          <artwork type="call-flow"><![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"><![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="configuration-retrieval-from-the-candidate-datastore">
        <name>Configuration Retrieval from the Candidate Datastore</name>
        <t>When a client retrieves the configuration from the candidate
datastore, some of the configuration nodes may hold the same data as
the corresponding node in the running datastore.  In such cases, the
server MUST return the same txid value for nodes in the candidate
datastore as in the running datastore.</t>
        <t>If a node in the candidate datastore holds different data than in the
running datastore, the server has a choice of what to return.</t>
        <ul spacing="normal">
          <li>The server MAY return a txid-unknown value (e.g. "!").  This may
be convenient in servers that do not know a priori what txids will
be used in a future, possible commit of the canidate.</li>
          <li>If the txid-unknown value is not returned, the server MUST return
 he txid value the node will have after commit, assuming the client
 makes no further changes of the candidate datastore.</li>
        </ul>
        <t>See the example in <xref target="transactions-toward-the-candidate-datastore">Transactions toward the Candidate
Datastore</xref>.</t>
      </section>
      <section anchor="conditional-transactions">
        <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"><![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>The txids are updated on all versioned nodes that were modified themselves or have a child node that was modified.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     acls (txid: ?)                              |
       |                                                 |
       |   <------------------------------------------   |
       |   data                                          |
       |     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 one or more of the
configuration txid value(s) differs from the client's expectation,
the server MUST return at least one rpc-error with the following
values:</t>
        <artwork><![CDATA[
   error-tag:      operation-failed
   error-type:     protocol
   error-severity: error
]]></artwork>
        <t>Additionally, the error-info tag MUST contain an sx:structure
containing relevant details about one of the mismatching txids.
A server MAY send multiple rpc-errors when multiple txid mismatches
are detected.</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"><![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>
      <section anchor="transactions-toward-the-candidate-datastore">
        <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 at the time of the commit, the transaction was successfully executed.  If a client issues a get-config towards the candidate datastore, the server may choose to return the special txid-unknown value (e.g. "!") or the txid value that would be used if the candidate was committed without further changes (when that txid value is known in advance by the server).</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (operation: merge)                |
       |     config (txid: 5152)                         |
       |       acls (txid: 5152)                         |
       |         acl A1 (txid: 4711)                     |
       |           type ipv4                             |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (operation: merge)                |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: 4711)                     |
       |             ace R1 (txid: 4711)                 |
       |               matches ipv4 protocol tcp         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   ------------------------------------------>   |
       |   get-config                                    |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: ?)                        |
       |                                                 |
       |   <------------------------------------------   |
       |     config                                      |
       |       acls                                      |
       |         acl A1                                  |
       |           aces (txid: 7688  or !)               |
       |             ace R1 (txid: 7688 or !)            |
       |               matches ipv4 protocol tcp         |
       |             ace R2 (txid: 2219)                 |
       |               matches ipv4 dscp 21              |
       |                                                 |
       |   ------------------------------------------>   |
       |   commit (request new txid in response)         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="dependencies-within-transactions">
        <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>
        <sourcecode type="yang"><![CDATA[
module energy-example {
...

  container energy {
    leaf metering-enabled {
      type boolean;
      default false;
    }
  }

  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;
    }
  }
}
]]></sourcecode>
        <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"><![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"><![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.  Every such removal or (re)introduction
of a node counts as a configuration change from a txid perspective,
regardless of whether the change has any net configuration change
effect in the server.</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.  Both acl A1 and acl A2 have their txids updated, even though energy-tracing was already false for acl A1.</name>
          <artwork type="call-flow"><![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">
        <name>Other NETCONF Operations</name>
        <dl>
          <dt>discard-changes</dt>
          <dd>
            <t>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.</t>
          </dd>
          <dt>copy-config</dt>
          <dd>
            <t>The copy-config operation can be used to copy contents between
datastores.  The server MUST ensure the txid values are retained
and changed as if the data being copied had been sent in through an
edit-config operation.</t>
          </dd>
          <dt>delete-config</dt>
          <dd>
            <t>The server MUST ensure the datastore txid value is changed, unless it
was already empty.</t>
          </dd>
          <dt>commit</dt>
          <dd>
            <t>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">Conditional Transactions</xref> MUST be sent.</t>
          </dd>
        </dl>
      </section>
      <section anchor="yang-push-subscriptions">
        <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 <xref target="RFC8641"/> and a txid
mechanism MAY request that the server provides updated txid values in
YANG-Push subscription updates.</t>
        <figure>
          <name>A client requests a YANG-Push subscription for a given path with txid values included.  Later, when the server delivers a push-change-update notification, the txid is included.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   rpc                                           |
       |     establish-subscription                      |
       |       datastore running                         |
       |       datastore-xpath-filter /acls              |
       |       periodic 500                              |
       |       with-etag true                            |
       |                                                 |
       |   <------------------------------------------   |
       |   ok                                            |
       |                                                 |
       |   <------------------------------------------   |
       |   notification                                  |
       |     eventTime 2022-04-04T06:00:24.16Z           |
       |     push-change-update                          |
       |       id 89                                     |
       |       datastore-changes                         |
       |         yang-patch                              |
       |           patch-id 0                            |
       |           edit (txid: 8008)                     |
       |             edit-id edit1                       |
       |             operation delete                    |
       |             target /acls                        |
       |               value                             |
       |                 acl                             |
       |                   name A1                       |
       |                                                 |
       v                                                 v
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="txid-mechanisms">
      <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">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">
        <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
<xref target="RFC7232"/>.  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">General Txid Principles</xref>.  These
rules are chosen to be consistent with the ETag mechanism in
RESTCONF, <xref target="RFC8040"/>,
specifically sections 3.4.1.2, 3.4.1.3 and 3.5.2.</t>
      </section>
      <section anchor="the-last-modified-attribute-txid-mechanism">
        <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, <xref target="RFC6991"/>.</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
<xref target="RFC8040"/>,
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">General Txid Principles</xref>.  These rules
are chosen to be consistent with the Last-Modified mechanism in
RESTCONF, <xref target="RFC8040"/>,
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">
        <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">Conditional Transactions</xref> with an
error-info tag containing a txid-value-mismatch-error-info
structure.</t>
        <section anchor="candidate-datastore">
          <name>Candidate Datastore</name>
          <t>When servers return txid values in get-config and get-data operations
towards the candidate datastore, the txid values returned MUST adhere
to the following rules:</t>
          <ul spacing="normal">
            <li>If the versioned node holds the same data as in the running
datastore, the same txid value as the versioned node in running
MUST be used.</li>
            <li>If the versioned node is different in the candidata store
than in the running datastore, the server has a choice of what
to return. The server MAY return the special "txid-unknown" value "!".
If the txid-unknown value is not returned, the server MUST return
the txid value the versioned node will have if the client decides to commit the candidate datastore without further updates.</li>
          </ul>
        </section>
        <section anchor="namespaces-and-attribute-placement">
          <name>Namespaces and Attribute Placement</name>
          <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>
    <section anchor="txid-mechanism-examples">
      <name>Txid Mechanism Examples</name>
      <section anchor="initial-configuration-response">
        <name>Initial Configuration Response</name>
        <section anchor="with-etag">
          <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>
          <sourcecode type="xml"><![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>
]]></sourcecode>
          <t>The server's reply might then be:</t>
          <sourcecode type="xml"><![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>
]]></sourcecode>
          <t>To retrieve etag attributes for a specific ACL using an xpath
filter, a client might send:</t>
          <sourcecode type="xml"><![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>
]]></sourcecode>
          <t>To retrieve etag attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![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>
]]></sourcecode>
          <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>
          <sourcecode type="xml"><![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>
]]></sourcecode>
        </section>
        <section anchor="with-last-modified">
          <name>With last-modified</name>
          <t>To retrieve last-modified attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![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>
]]></sourcecode>
          <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>
          <sourcecode type="xml"><![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>
        <aces txid:last-modified="2022-03-20T16:20:11.333444Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>udp</protocol>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </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>
]]></sourcecode>
        </section>
      </section>
      <section anchor="configuration-response-pruning">
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <t>If a txid value is specified for a leaf, and the txid value matches,
the leaf value is pruned.</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
      </section>
      <section anchor="configuration-change">
        <name>Configuration Change</name>
        <t>A client that wishes to update the ace R1 protocol to tcp might send:</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <t>The server would update the protocol leaf in the running datastore,
and return an rpc-reply as follows:</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <t>A subsequent get-config request for "acls", with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
      </section>
      <section anchor="conditional-configuration-change">
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <t>A subsequent get-config request for acls, with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![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>
]]></sourcecode>
      </section>
      <section anchor="reading-from-the-candidate-datastore">
        <name>Reading from the Candidate Datastore</name>
        <t>Let's assume that a get-config towards the running datastore
currently contains the following data and txid values:</t>
        <sourcecode type="xml"><![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">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc4711">
      <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>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>A client issues discard-changes (to make the candidate datastore
equal to the running datastore), and issues an edit-config to
change the R1 protocol from udp to tcp, and then executes a
get-config with the txid-request attribute "?" set on the acl A1,
the server might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="13"
           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 txid:etag="!">
        <name>A1</name>
        <aces txid:etag="!">
          <ace txid:etag="!">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>tcp</protocol>
              </ipv4>
            </matches>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>Here, the txid-unknown value "!" is sent by the server.  This
particular server implementation does not know beforehand which
txid value would be used for this versioned node after commit.
It will be a value different from the current corresponding
txid value in the running datastore.</t>
        <t>In case the server is able to predict the txid value that would
be used for the versioned node after commit, it could respond
with that value instead.  Let's say the server knows the txid
would be "7688" if the candidate datastore was committed without
further changes, then it would respond with that value in each
place where the example shows "!" above.</t>
      </section>
      <section anchor="commit">
        <name>Commit</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>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="14"
    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>
]]></sourcecode>
        <t>Assuming the server accepted the transaction, it might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="15"
    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>
]]></sourcecode>
      </section>
      <section anchor="yang-push">
        <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>
        <sourcecode type="xml"><![CDATA[
<netconf:rpc message-id="16"
             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>
]]></sourcecode>
        <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>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="17"
    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>
]]></sourcecode>
        <t>A server might send a subscription update like this:</t>
        <sourcecode type="xml"><![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>
]]></sourcecode>
      </section>
    </section>
    <section anchor="yang-modules">
      <name>YANG Modules</name>
      <section anchor="base-module-for-txid-in-netconf">
        <name>Base module for txid in NETCONF</name>
        <sourcecode type="yang" markers="true"><![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 2023-03-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 
            the node in the candidate datastore has changed
            relative the running datastore, but not yet received
            a new txid value 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.";
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="additional-support-for-txid-in-yang-push">
        <name>Additional support for txid in YANG-Push</name>
        <sourcecode type="yang" markers="true"><![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;
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="nacm-access-control">
        <name>NACM Access Control</name>
        <t>NACM, <xref target="RFC8341"/>, access control
processing happens as usual, independently of any txid handling, if
supported by the server and enabled by the NACM configuration.</t>
        <t>It should be pointed out however, that when txid information is added
to a reply, it may occasionally be possible for a client to deduce
that a configuration change has happened in some part of the
configuration to which it has no access rights.</t>
        <t>For example, a client may notice that the root node txid has changed
while none of the subtrees it has access to have changed, and thereby
conclude that someone else has made a change to some part of the
configuration that is not acessible by the client.</t>
        <section anchor="hash-based-txid-algorithms">
          <name>Hash-based Txid Algorithms</name>
          <t>Servers that implement NACM and choose to implement a hash-based txid
algorithm over the configuration may reveal to a client that the
configuration of a subtree that the client has no access to is the
same as it was at an earlier point in time.</t>
          <t>For example, a client with partial access to the configuration might
observe that the root node txid was 1234. After a few configuration
changes by other parties, the client may again observe that the root
node txid is 1234.  It may then deduce that the configuration is the
same as earlier, even in the parts of the configuration it has no
access to.</t>
          <t>In some use cases, this behavior may be considered a feature, since it
allows a security client to verify that the configuration is the same
as expected, without transmitting or storing the actual configuration.</t>
        </section>
      </section>
      <section anchor="unchanged-configuration">
        <name>Unchanged Configuration</name>
        <t>It will also be possible for clients to deduce that a confiuration
change has not happened during some period, by simply observing that
the root node (or other subtree) txid remains unchanged.  This is
true regardless of NACM being deployed or choice of txid algorithm.</t>
        <t>Again, there may be use cases where this behavior may be considered a
feature, since it allows a security client to verify that the
configuration is the same as expected, without transmitting or storing
the actual configuration.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers the following capability identifier URN in
the 'Network Configuration Protocol (NETCONF) Capability URNs'
registry:</t>
      <artwork><![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
<xref target="RFC3688"/>.</t>
      <artwork><![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 <xref target="RFC6020"/>.</t>
      <artwork><![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><![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">
      <name>Changes</name>
      <section anchor="major-changes-in-03-since-02">
        <name>Major changes in -03 since -02</name>
        <ul spacing="normal">
          <li>Changed the logic around how txids are handled in the candidate
datastore, both when reading (get-config, get-data) and writing
(edit-config, edit-data). Introduced a special "txid-unknown"
value "!".</li>
          <li>Changed the logic of copy-config to be similar to edit-config.</li>
          <li>Clarified how txid values interact with when-dependencies
together with default values.</li>
          <li>Added content to security considerations.</li>
          <li>Added a high-level example for YANG-Push subscriptions with txid.</li>
          <li>Updated language about error-info sent at txid mismatch in an
edit-config: error-info with mismatch details MUST be sent when
mismatch detected, and that the server can choose one of the txid
mismatch occurrences if there is more than one.</li>
          <li>Some rewording and minor additions for clarification, based
on mailing list feedback.</li>
          <li>Divided RFC references into normative and informative.</li>
          <li>Corrected a logic error in the second figure (figure 6) in the
"Conditional Transactions" section</li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01">
        <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 <xref target="RFC8040"/>,
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">
        <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>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns">
              <organization/>
            </author>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund">
              <organization/>
            </author>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder">
              <organization/>
            </author>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman">
              <organization/>
            </author>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices.  It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages.  The NETCONF protocol operations are realized as remote procedure calls (RPCs).  This document obsoletes RFC 4741.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder">
              <organization/>
            </author>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language.  This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund">
              <organization/>
            </author>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols.  This document describes the syntax and semantics of version 1.1 of the YANG language.  YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification.  There are a small number of backward incompatibilities from YANG version 1.  This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman">
              <organization/>
            </author>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund">
              <organization/>
            </author>
            <author fullname="K. Watsen" initials="K." surname="Watsen">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm">
              <organization/>
            </author>
            <author fullname="E. Voit" initials="E." surname="Voit">
              <organization/>
            </author>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document describes a mechanism that allows subscriber applications to request a continuous and customized stream of updates from a YANG datastore.  Providing such visibility into updates enables new capabilities based on the remote mirroring and monitoring of configuration and operational state.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8641"/>
          <seriesInfo name="DOI" value="10.17487/RFC8641"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund">
              <organization/>
            </author>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
        <reference anchor="RFC7232">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7232"/>
          <seriesInfo name="DOI" value="10.17487/RFC7232"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman">
              <organization/>
            </author>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund">
              <organization/>
            </author>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability.  There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content.  This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoît 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,
Jason Sterne and Robert Varga.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
1aCo3e9cheafM5ue/XNVihsgu6zuqzt3755xN3CVusEAW7VRMeSt05bhFEil
sJ8aeC6RznTesD1rX7MLbMuV3l3osqetyRrCW5PIjXAZ2os6ESZ4Ie2Nq+y4
10Yhf8L+GT/Nx7Sn6Xl+fj0miw0Pzhl2/tOan2GsP2fTNj0ban4uZ1Gfnl1f
TFxfTHR+2oT/rdBoUaAk4q3kxAcdjyFMbHKCd7wuwvooXeo0RxNKWZnwBi80
hfPvYNYlaUFkWhTiM4IJD9J53BBHcA58rKq24ukdk7mpt8QMoT0DjrE8eZfR
Y1+P880oMN08xURUOCqIrxMOYbTyqM2xIFFwM2I6uCH04aSOD2cMaiujTxZx
lqeJ9w1l+sMfc3DdO3Luy+r1jP+mzpWLW8/XYjSjj9FHlFLr0ArE0wb9bPX7
ma6rZo42ijCSRlS5JIVHQDU55xhBmPdkmeng/iXwV9r/KytjyyavMajRAUiz
1m1fsJFP+ko1ZZazN16fGJ/2BflzjmoF+fNPGH82t9V/OoK8zwT2eq8afgXi
jCMc5x7VIyTytE1Izm4K9IWfWsFg01EN+ZG/zzNhIkbnXWtkicRkFQOJ3UaU
xv/8fX/3Hxs3xSuECZtG79zb7UGKn0NVQk63YKLK5A8I3/wdux4bVcclZ3Th
xhxHzCESRRl5lq1awv6zOabiU3hgoZNqjRY9JDraXqdX6YIivsmDwOpdGVu0
tXVAViYpTOfawr+34cZeqkZ1s3T+C1vjId7dGwJtnN5xopymj7NxOq4asiLx
IfM4EYoPyvIOuf050wLdufTBLLrI1Cwnf9Q1d48DnRVfsmEXfSe0imtj5Geb
ICz0yEZQ1BQLeZwl6JnrcwQMgTA5iFSQwM4Y7uKE5p5J/EVc11V20NQOB8Jc
rxK17C58TuK157zdCSMI3NStJ7WLhqc+xGuYLkZYu8Z8exusIwQZHECn5VM+
T+NRTDcnQR6CFjw/ZangpoXXLFqm1WHa4XefhnmPGM+Z9+G/Av5cvrvwqJeY
8C+MTRdb61XImBdpem0s/tRw+FL2zE8Ah4fNsL8CbPokIIw2VEzwH322oVde
1wTbbX31VIJGtWbYvb3dexelTaQH721iCt3s56qOush1Z19rXumEP9Wbtx5N
5We4ezPJ4slrweqM5F+kzrqV82dEHmSt1HvK4wX+SntckAJ1E93q5kdliYls
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
mIN2e0oBAA==

-->

</rfc>
