<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 2.7.0) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netconf-transaction-id-05" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.2 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-transaction-id-05"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="June" day="20"/>
    <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
configuration 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"/>, for config true data.  It also ties this in
with YANG-Push, <xref target="RFC8641"/>, and "Comparison of Network
Management Datastore Architecture (NMDA) Datastores",
<xref target="RFC9144"/>.  Config false data (operational data, state, statistics)
is left out of scope from this document.</t>
      <t>This document does not change the RESTCONF protocol in any way, and
is carefully written to allow implementations to share much of the
code between NETCONF and RESTCONF.  Note that the NETCONF txid
mechanism described in this document uses XML attributes, but the
RESTCONF mechanism relies on HTTP Headers instead, and use none of
the XML attributes described in this document, nor JSON Metadata
(see <xref target="RFC7952"/>).</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="RFC7952"/>,
<xref target="RFC8040"/>,
<xref target="RFC8641"/>, and
<xref target="RFC9144"/>.</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>
        <dt>Transaction-id Mechanism</dt>
        <dd>
          <t>A protocol implementation that fulfills the principles described in
the first part, <xref target="netconf-txid-extension">NETCONF Txid Extension</xref>, of
this document.</t>
        </dd>
        <dt>Txid</dt>
        <dd>
          <t>Abbreviation of Transaction-id</t>
        </dd>
        <dt>C-txid</dt>
        <dd>
          <t>Client side transaction-id, i.e. a txid value maintained or provided
by a NETCONF client application.</t>
        </dd>
        <dt>S-txid</dt>
        <dd>
          <t>Server side transaction-id, i.e. a txid value maintained or sent by
a NETCONF server.</t>
        </dd>
        <dt>Txid History</dt>
        <dd>
          <t>Temporally ordered list of txid values used by the server.  Allows
the server to determine if a given txid occurred more recently than
another txid.</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.  A similar
extension is also defined for servers implememnting
"Comparison of NMDA Datastores".</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.  This document is therefore divided into a two
parts; the first part discusses the txid mechanism in an abstract,
protocol-neutral way.  The second part,
<xref target="txid-mechanisms">Txid Mechanisms</xref>, then adds the protocol layer,
and provides concrete encoding examples.</t>
      <section anchor="use-cases">
        <name>Use Cases</name>
        <t>The common use cases for txid 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 top level
server side txid meta data value for each configuration datastore
supported by the server.  Server side txid is often abbreviated s-txid.
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>Server implementors MAY use the YANG extension statement
ietf-netconf-txid:versioned-node to inform potential clients about
which YANG nodes the server maintains a txid value for.  Another way
to discover (a partial) set of Versioned Nodes is for a client to
request the current configuration with txids.  The returned
configuration will then have the Versioned Nodes decorated with their
txid values.</t>
        <t>Regardless of whether the server declares the Versioned Nodes or not,
the set of Versioned Nodes in the server's YANG tree MUST remain
constant, except at system redefining events, such as software upgrades
or entitlement installations or removals.</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, and their
ancestors, 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, or any kind of metadata that the
server may maintain for YANG data tree nodes.</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, in the reply, return
txid values for all Versioned Nodes below the point requested by
the client.</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 anchor="fig-baseline">
          <name>Initial Configuration Retrieval.  The client annotated the get-config request itself with the txid request value, which makes the server return all txid values in the entire datastore, that also fall within the requested subtree filter.  The most recent change seems to have been an update to ace R8 and R9.</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 17            |
       |             actions forwarding accept           |
       |       acl A2 (txid: 5152)                       |
       |         aces (txid: 5152)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 5152)                   |
       |             matches tcp source-port port 22     |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <t>In the call flow examples in this document we are using a 4-digit,
monotonously increasing integer as txid.  This is convenient and
enhances readability of the examples, but does not necessarily
reflect a typical implementation.</t>
        <t>In principle, txid values are opaque strings that uniquely identify
a particular configuration state.  Servers are expected to know which
txid values it has used in the recent past, and in which order they
were assigned to configuration change transactions.  This information
is known as the server's Txid History.</t>
        <t>How many historical txid values to track is up to each server
implementor to decide, and a server MAY decide not to store any
historical txid values at all.  The more txid values in the server's
Txid History, the more efficient the client synchronization may be, as
described in the coming sections.</t>
        <t>Some server implementors may decide to use a monotonically increasing
integer as the txid value, or a timestamp.  Doing so obviously makes
it very easy for the server to determine the sequence of historical
transaction ids.</t>
        <t>Some server implementors may decide to use a completely different txid
value sequence, to the point that the sequence may appear completely
random to outside observers.  Clients MUST NOT generally assume that
servers use a txid value scheme that reveals information about the
temporal sequence of txid values.</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.  Txid values sent by a client are often abbreviated
c-txid.</t>
        <t>When a client sends in a c-txid value of a node that matches the
server's s-txid value for that Versioned Node, or matches a more recent
s-txid value in the server's Txid History,
the server prunes (does not return) that subtree from
the response.  Since the client already knows the txid for this part
of the data tree, or a txid that occurred more recently, it
is obviosuly already up to date with that part of the configuration.
Sending it again would be a waste of time and energy.</t>
        <t>The table below describes in detail how the client side (c-txid) and
server side txid (s-txid) values are determined and compared when the
server processes each data tree reply node from a get-config or
get-data request.</t>
        <t>Servers MUST process each of the config true nodes as follows:</t>
        <table>
          <name>The Txid rules for response pruning.</name>
          <thead>
            <tr>
              <th align="left">Case</th>
              <th align="left">Condition</th>
              <th align="left">Behavior</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">1. NO CLIENT TXID</td>
              <td align="left">In its request, the client did not specify a c-txid value for the current node, nor any ancestor of this node.</td>
              <td align="left">In this case, the server MUST return the current node according to the normal NETCONF specifications.  The rules below do not apply to the current node.  Any child nodes MUST also be evaluated with respect to these rules.</td>
            </tr>
            <tr>
              <td align="left">2. CLIENT ANCESTOR TXID</td>
              <td align="left">The client did not specify a c-txid value for the current node, but did specify a c-txid value for one or more ancestors of this node.</td>
              <td align="left">In this case, the current node MUST inherit the c-txid value of the closest ancestor node in the client's request that has a c-txid value.  Processing of the current node continues according to the rules below.</td>
            </tr>
            <tr>
              <td align="left">3. SERVER ANCESTOR TXID</td>
              <td align="left">The node is not a Versioned Node, i.e. the server does not maintain a s-txid value for this node.</td>
              <td align="left">In this case, the current node MUST inherit the server's s-txid value of the closest ancestor that is a Versioned Node (has a server side s-txid value).  The datastore root is always a Versioned Node.  Processing of the current node continues according to the rules below.</td>
            </tr>
            <tr>
              <td align="left">4. CLIENT TXID UP TO DATE</td>
              <td align="left">The client specified c-txid for the current node value is "up to date", i.e. it matches the server's s-txid value, or matches a s-txid value from the server's Txid History that is more recent than the server's s-txid value for this node.</td>
              <td align="left">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.</td>
            </tr>
            <tr>
              <td align="left">5. CLIENT TXID OUT OF DATE</td>
              <td align="left">The specified c-txid is "outdated" or "unknown" to the server, i.e. it does not match the server's s-txid value for this node, nor does the client c-txid value match any s-txid value in the server's Txid History that is more recent than the server's s-txid value for this node.</td>
              <td align="left">In this case the server MUST return the current node according to the normal NETCONF specifications.  If the current node is a Versioned Node, it MUST be decorated with the s-txid value.  Any child nodes MUST also be evaluated with respect to these rules.</td>
            </tr>
          </tbody>
        </table>
        <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>
        <t>Here follows a couple of examples of how the rules above are applied.
See <xref target="fig-baseline">the example above</xref> for the most recent server
configuration state that the client is aware of, before this happens:</t>
        <figure>
          <name>Response Pruning.  Client sends get-config request with known txid values.  Server prunes response where the c-txid matches expectations.  In this case, the server had no changes, and pruned the response at the earliest point offered by the client.</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>
        <t>In this case, the server's txid-based pruning saved a substantial
amount of information that is already known by the client to be sent
to and processed by the client.</t>
        <t>In the following example someone has made a change to the
configuration on the server.  This server has chosen to implement
a Txid History with up to 5 entries.  The 5 most recently used
s-txid values on this example server are currently: 4711, 5152, 5550,
6614, 7770 (most recent).  Then a client sends this request:</t>
        <figure>
          <name>Out of band change detected.  Client sends get-config request with known txid values.  Server provides updates only where changes have happened.</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: =)                      |
       |           ace R8 (txid: =)                      |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <t>In the example above, the server returns the acls container because
the client supplied c-txid value (5152) differs from the s-txid value
held by the server (6614), and 5152 is less recent in the server's
Txid History than 6614.  The client is apparently unaware of the
latest config developments in this part of the server config tree.</t>
        <t>The server prunes list entry acl A1 is because it has the same s-txid
value as the c-txid supplied by the client (4711). The server returns
the list entry acl A2 because 5152 (specified by the client) is less
recent than 6614 (held by the server).</t>
        <t>The container aces under acl A2 is returned because 5152 is less recent
than 6614. The server prunes ace R7 because the c-txid for this
node is 5152 (from acl A2), and 5152 is more recent than the closest
ancestor Versioned Node (with txid 4711).</t>
        <t>The server also prunes acl R8 because the server and client txids
exactly match (5152). Finally, acl R9 is returned because of its less
recent c-txid value given by the client (5152, on the closest ancestor
acl A2) than the s-txid held on the server (6614).</t>
        <t>In the next example, the client specifies the c-txid for a node that
the server does not maintain a s-txid for, i.e. it's not a
Versioned Node.</t>
        <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>
        <t>Here, the server looks up the closest ancestor node that is a
Versioned Node.  This particular server has chosen to keep a s-txid
for the list entry ace R7, but not for any of its children.  Thus
the server finds the server side s-txid value to be 4711 (from ace R7),
which matches the client's c-txid value of 4711.</t>
        <t>Servers MUST NOT ever use the special txid values, txid-match, txid-request, txid-unknown (e.g. "=", "?", "!") as actual
txid values.</t>
      </section>
      <section anchor="candidate-datastore-configuration-retrieval">
        <name>Candidate Datastore Configuration Retrieval</name>
        <t>When a client retrieves the configuration from the (or a) 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 s-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
 the s-txid value the node will have after commit, assuming the client
 makes no further changes of the candidate datastore.  If a client
 makes further changes in the candidate datastore, the s-txid value
 MAY change.</li>
        </ul>
        <t>See the example in
<xref target="candidate-datastore-transactions">Candidate Datastore Transactions</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 c-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 configuration
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 s-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 s-txid with the ok message.</t>
        <figure anchor="base-edit-config">
          <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 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
        </figure>
        <t>After the above edit-config, the client might issues a get-config to
observe the change.  It would look like this:</t>
        <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 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 6614)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       v                                                 v
]]></artwork>
        </figure>
        <t>When a client sends in a c-txid value of a node, the server MUST consider it a match if the server's s-txid value is identical to the client, or if the server's value is found earlier in the server's Txid History than the value supplied by the client.</t>
        <section anchor="error-response-on-out-of-band-change">
          <name>Error response on Out of band change</name>
          <t>If the server rejects the transaction because one or more of the
configuration s-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 <xref target="RFC8791"/>
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 c-txid it knows for this part of the configuration.  Since the s-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)                 |
       |               matches ipv4 dscp 20              |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   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="txid-history-size-consideration">
          <name>Txid History size consideration</name>
          <t>It may be tempting for a client implementor to send only the top
level c-txid value for the tree being edited.  In most cases, that
would certainly work just fine.  This is a way for the client to
request the server to go ahead with the change as long as there
has not been any changes more recent than the client provided c-txid.</t>
          <t>Here the client is sending the same change as in
<xref target="base-edit-config">the example above</xref>, but with only one top level
c-txid value.</t>
          <figure>
            <name>Conditional transaction towards the Running datastore successfully executed.  As all the c-txid values specified by the client were the same or more recent in the server's Txid History, so the transaction was successfully executed.</name>
            <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   edit-config (request new txid in response)    |
       |     config (txid: 5152)                         |
       |       acls                                      |
       |         acl A1                                  |
       |           aces                                  |
       |             ace R1                              |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 7688)                               |
       v                                                 v
]]></artwork>
          </figure>
          <t>This approach works well because the top level value is inherited
down in the child nodes and the server finds this value to either
match exactly or be a more recent s-txid value in the server's Txid
History.</t>
          <t>The only caveat is that by relying on the server's Txid History being
long enough, the change could be rejected if the top level c-txid has
fallen out of the server's Txid History.  Some servers may have a
Txid History size of zero.  A client specifying a single top-level
c-txid value towards such a server would not be able to get the
transaction accepted.</t>
        </section>
      </section>
      <section anchor="candidate-datastore-transactions">
        <name>Candidate Datastore Transactions</name>
        <t>When working with the (or a) Candidate datastore, the txid validation
happens at commit time, rather than at individual edit-config or
edit-data operations.  Clients add their c-txid attributes to the
configuration payload the same way.  In case a client specifies
different c-txid values for the same element in successive edit-config
or edit-data operations, the c-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 c-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 s-txid value that would be used if the candidate was committed without further changes (when that s-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 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   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 6           |
       |               actions forwarding accept         |
       |             ace R2 (txid: 2219)                 |
       |               matches ipv4 dscp 21              |
       |               actions forwarding accept         |
       |                                                 |
       |   ------------------------------------------>   |
       |   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 s-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 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 6614)                       |
       |         energy-tracing true                     |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       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 s-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 s-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 6             |
       |             actions forwarding accept           |
       |       acl A2 (txid: 9118)                       |
       |         aces (txid: 6614)                       |
       |           ace R7 (txid: 4711)                   |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |           ace R8 (txid: 5152)                   |
       |             matches udp source-port port 22     |
       |             actions forwarding accept           |
       |           ace R9 (txid: 6614)                   |
       |             matches tcp source-port port 830    |
       |             actions forwarding accept           |
       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
ietf-netconf-txid-yang-push.yang MAY request that the server
provides updated txid values in YANG-Push on-change subscription
updates.</t>
        <t>This functionality pertains only to on-change updates.  This RPC may
also be invoked over RESTCONF or other protocols, and might
therefore be encoded in JSON.</t>
        <t>To request txid values (e.g. etag), the client adds a flag in the
request (e.g. with-etag).  The server then returns the txid
(e.g. etag) value in the yang-patch payload (e.g. as etag-value).</t>
        <figure>
          <name>A client requests a YANG-Push subscription for a given path with txid value included.  When the server delivers a push-change-update notification, the txid value pertaining to the entire patch is included.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   rpc                                           |
       |     establish-subscription                      |
       |       datastore running                         |
       |       datastore-xpath-filter /acls              |
       |       on-change                                 |
       |       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                                  |
       |             edit-id edit1                       |
       |             operation delete                    |
       |             target /acls/acl[A1]                |
       |           edit                                  |
       |             edit-id edit2                       |
       |             operation merge                     |
       |             target /acls/acl[A2]/ace[R7]        |
       |               value                             |
       |                 matches ipv4 dscp 10            |
       |                 actions forwarding accept       |
       |           etag-value 8008                       |
       |                                                 |
       v                                                 v
]]></artwork>
        </figure>
      </section>
      <section anchor="comparing-yang-datastores">
        <name>Comparing YANG Datastores</name>
        <t>A client issuing an NMDA Datastore compare request towards a server
that supports ietf-netconf-txid-nmda-compare.yang MAY request that
the server provides updated txid values in the compare reply.
Besides NETCONF, this RPC may also be invoked over RESTCONF or other
protocols, and might therefore be encoded in JSON.</t>
        <t>To request txid values (e.g. etag), the client adds a flag in the
request (e.g. with-etag).  The server then returns the txid
(e.g. etag) value in the yang-patch payload (e.g. as etag-value).</t>
        <t>The txid value returned by the server MUST be the txid value
pertaining to the target node in the source or target datastores
that is the most recent.  If one of the datastores being
compared is not a configuration datastore, the txid in the
configuration datastore MUST be used.  If none of the datastores
being compared are a configuration datastore, then txid values
MUST NOT be returned at all.</t>
        <t>The txid to return is the one that pertains to the target node, or
in the case of delete, the closest surviving ancestor of the target
node.</t>
        <figure>
          <name>A client requests a NMDA Datastore compare for a given path with txid values included. When the server delivers the reply, the txid is included for each edit.</name>
          <artwork type="call-flow"><![CDATA[
     Client                                            Server
       |                                                 |
       |   ------------------------------------------>   |
       |   rpc                                           |
       |     compare                                     |
       |       source ds:running                         |
       |       target ds:operational                     |
       |       with-etag true                            |
       |                                                 |
       |   <------------------------------------------   |
       |   differences                                   |
       |     yang-patch                                  |
       |       patch-id 0                                |
       |       edit                                      |
       |         edit-id edit1                           |
       |         operation delete                        |
       |         target /acls/acl[A1]                    |
       |         etag-value 8008                         |
       |       edit                                      |
       |         edit-id edit2                           |
       |         operation merge                         |
       |         target /acls/acl[A2]/ace[R7]            |
       |           value                                 |
       |             matches ipv4 dscp 10                |
       |             actions forwarding accept           |
       |         etag-value 8008                         |
       |                                                 |
       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 strings chosen freely.  They MUST
consist of ASCII printable characters (VCHAR), except that the etag
string MUST NOT contain space, backslash or double quotes. The point of
these restrictions 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.  It is RECOMMENDED
that the etag txid has an encoding specific suffix, especially when it
is not encoded in XML.  E.g. a response encoded in JSON might append
"+json" at the end of the etag value. This is in line with the language
in <xref target="RFC7232"/> and traditions in the HTTP world at large.</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
feature last-modified defined in ietf-netconf-txid.yang.</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 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 candidate 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" <xref target="RFC4741"/> <xref target="RFC6241"/>,
xmlns:ncds="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda" <xref target="RFC8526"/>,
xmlns:sn="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications" <xref target="RFC8639"/>,
xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push" <xref target="RFC8641"/> <xref target="RFC8072"/>:</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/yp:yang-patch/
yp:edit</li>
            <li>/yp:push-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp:value//*</li>
            <li>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit</li>
            <li>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp: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.</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>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>22</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>830</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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
(i.e. is identical to the server's txid value, or found earlier in
the server's Txid History), 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>6</protocol>
                </ipv4>
              </matches>
              <actions>
                <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                  acl:accept
                <forwarding>
              </actions>
            </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>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>830</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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>
      <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">
        <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>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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, nor was the client's txid
value found later in the server's Txid History, then the server
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>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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 (17) to tcp (6), 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>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </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="14"
    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:on-change/>
    <ietf-netconf-txid-yp:with-etag>
      true
    </ietf-netconf-txid-yp:with-etag>
  </establish-subscription>
</netconf: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"
  xmlns:ietf-netconf-txid-yp=
    "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push">
  <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>
          <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>
        <ietf-netconf-txid-yp:etag-value>
          nc8008
        </ietf-netconf-txid-yp:etag-value>
      </yang-patch>
    </datastore-changes>
  </push-change-update>
</notification>
]]></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>
      </section>
      <section anchor="nmda-compare">
        <name>NMDA Compare</name>
        <t>The following example is taken from section 5 of <xref target="RFC9144"/>.
It compares the difference between the operational and intended
datastores for a subtree under "interfaces".</t>
        <t>In this version of the example, the client requests that txid
values, in this case etag-values, are annotated to the result.</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="101"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <compare xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
      xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"
      xmlns:ietf-netconf-txid-nmda-compare=
        "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <source>ds:operational</source>
    <target>ds:intended</target>
    <report-origin/>
    <ietf-netconf-txid-nmda-compare:with-etag>
      true
    </ietf-netconf-txid-nmda-compare:with-etag>
    <xpath-filter
        xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      /if:interfaces
    </xpath-filter>
  </compare>
</rpc>
]]></sourcecode>
        <t>RPC reply when a difference is detected:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    message-id="101">
  <differences
    xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
    xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
    xmlns:ietf-netconf-txid-nmda-compare=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <yang-patch>
      <patch-id>interface status</patch-id>
      <comment>
        diff between operational (source) and intended (target),
        with txid values taken from intended.
      </comment>
      <edit>
        <edit-id>1</edit-id>
        <operation>replace</operation>
        <target>/ietf-interfaces:interface=eth0/enabled</target>
        <value>
          <if:enabled>false</if:enabled>
        </value>
        <source-value>
          <if:enabled or:origin="or:learned">true</if:enabled>
        </source-value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          4004
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
      <edit>
        <edit-id>2</edit-id>
        <operation>create</operation>
        <target>/ietf-interfaces:interface=eth0/description</target>
        <value>
          <if:description>ip interface</if:description>
        </value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          8008
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
    </yang-patch>
  </differences>
</rpc-reply>
]]></sourcecode>
        <t>The same response in RESTCONF (using JSON format):</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 24 Jan 2019 20:56:30 GMT
Server: example-server
Content-Type: application/yang-data+json

{ "ietf-nmda-compare:output" : {
    "differences" : {
      "ietf-yang-patch:yang-patch" : {
        "patch-id" : "interface status",
        "comment" : "diff between intended (source) and operational",
        "edit" : [
          {
            "edit-id" : "1",
            "operation" : "replace",
            "target" : "/ietf-interfaces:interface=eth0/enabled",
            "value" : {
              "ietf-interfaces:interface/enabled" : "false"
            },
            "source-value" : {
              "ietf-interfaces:interface/enabled" : "true",
              "@ietf-interfaces:interface/enabled" : {
                "ietf-origin:origin" : "ietf-origin:learned"
              }
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "4004"
          },
          {
            "edit-id" : "2",
            "operation" : "create",
            "target" : "/ietf-interfaces:interface=eth0/description",
            "value" : {
              "ietf-interface:interface/description" : "ip interface"
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "8008"
          }
        ]
      }
    }
  }
}
]]></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" name="ietf-netconf-txid@2023-03-01.yang"><![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 Revised 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";
  }

  feature last-modified {
    description "Servers implementing this module MUST support the
      etag txid mechanism.  Servers MAY also support the 
      last-modified txid mechanism.  Support is shown by announcing
      this feature.";
  }

  extension versioned-node {
    description "This statement is used by servers to declare that a
      the server is maintaining a Txid for the YANG node with this
      statement.  Which YANG nodes are versioned nodes may be useful
      information for clients (especially during development).
      
      Servers are not required to use this statement to declare
      which nodes are versioned nodes.
      
      Example of use:

      container interfaces {
        ietf-netconf-txid:versioned-node;
        ...
      }
      ";
  }

  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 {
      if-feature 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.";
  }

  grouping txid-value-grouping {
    leaf etag-value {
      type etag-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    leaf last-modified-value {
      if-feature last-modified;
      type last-modified-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    description
      "Grouping for txid mechanisms, to be augmented into 
       output of rpcs that return txid metadata for 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 {
        if-feature last-modified;
        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" name="ietf-netconf-txid-yang-push@2022-04-01.yang"><![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-yang-push {
    prefix yp;
    reference
      "RFC 8641: Subscriptions to YANG Datastores";
  }

  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 Revised 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;
  }
  augment "/yp:push-change-update/yp:datastore-changes/" +
          "yp:yang-patch" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    uses ietf-netconf-txid:txid-value-grouping;
  }
}
]]></sourcecode>
      </section>
      <section anchor="additional-support-for-txid-in-nmda-compare">
        <name>Additional support for txid in NMDA Compare</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid-nmda-compare@2023-05-01.yang"><![CDATA[
module ietf-netconf-txid-nmda-compare {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare';
  prefix ietf-netconf-txid-nmda-compare;

  import ietf-nmda-compare {
    prefix cmp;
    reference
      "RFC 9144: Comparison of Network Management Datastore 
       Architecture (NMDA) Datastores";
  }

  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 NMDA Compare.

     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 Revised 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-05-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

  augment "/cmp:compare/cmp:input" {
    description
      "This augmentation makes it possible for clients to request
       txids to be returned.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/cmp:compare/cmp:output/cmp:compare-response/" +
          "cmp:differences/cmp:differences/cmp:yang-patch/cmp:edit" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    container most-recent {
      description "The txid value returned by the server MUST be the
        txid value pertaining to the target node in the source or 
        target datastores that is the most recent.";
      uses ietf-netconf-txid:txid-value-grouping;
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The YANG modules specified in this document define YANG types, groupings, structures and additional RPC parameters for data that is designed to be accessed via network management protocols such as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>. The lowest NETCONF layer is the secure transport layer, and the mandatory-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure transport is TLS <xref target="RFC8446"/>.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content.</t>
      <t>In the YANG modules published with this document, there is no configuration, state data, new RPCs or notifications.  This document defines additional XML attributes and headers, however, that merit consideration from a security perspective.</t>
      <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 configuration
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 four 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

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

  Registrant Contact: The IESG.

  XML: N/A, the requested URIs are XML namespaces.
]]></artwork>
      <t>This document registers three 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>
      <t>and</t>
      <artwork><![CDATA[
  name: ietf-netconf-txid-nmda-compare

  prefix: ietf-netconf-txid-nmda-compare

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

  RFC: XXXX
]]></artwork>
    </section>
    <section anchor="changes">
      <name>Changes</name>
      <section anchor="major-changes-in-05-since-04">
        <name>Major changes in -05 since -04</name>
        <ul spacing="normal">
          <li>Corrected namespace for reference to elements in ietf-yang-push</li>
        </ul>
      </section>
      <section anchor="major-changes-in-04-since-03">
        <name>Major changes in -04 since -03</name>
        <ul spacing="normal">
          <li>Updated security considerations.</li>
          <li>Added several normative RFC references.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-03-since-02">
        <name>Major changes in -03 since -02</name>
        <ul spacing="normal">
          <li>Updated language slightly regarding format of etag values, and some
recommendations for implementors that support etags in multiple management
protocols (NETCONF, RESTCONF, ...) and encodings (XML, JSON, ...).</li>
          <li>Added missing normative RFC references.</li>
          <li>Corrected the YANG-push namespace reference.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>Added optional to implement Txid History concept in order to make
the algorithm both more efficient and less verbose.  Servers may
still choose a Txid History size of zero, which makes the server
behavior the same as in earlier versions of this document.
Implementations that use txids consisting of a monotonically
increasing integer or timestamp will be able to determine the sequnce
of transactions in the history directly, making this trivially simple
to implement.</li>
          <li>Added extension statement versioned-node, which servers may use to
declare which YANG tree nodes are Versioned Nodes.  This is entirely
optional, however, but possibly useful to client developers.</li>
          <li>Renamed YANG feature ietf-netconf-txid:txid-last-modified to
ietf-netconf-txid:last-modified in order to reduce redundant mentions
of "txid".</li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>Changed YANG-push txid mechanism to use a simple leaf rather than
an attribute to convey txid information.  This is preferable since
YANG-push content may be requested using other protocols than NETCONF
and other encodings than XML.  By removing the need for XML
attributes in this context, the mechanism becomes significantly
more portable.</li>
          <li>Added a section and YANG module augmenting the RFC9144 NMDA
datastore compare operation to allow request and reply with txid
information.  This too is done with augments of plain leafs for
maximum portability.</li>
          <li>Added note clarifying that the txid attributes used in the XML
encoding are never used in JSON (since RESTCONF uses HTTP headers
instead).</li>
          <li>Added note clarifying that pruning happens when client and server
txids <em>match</em>, since the server sending information to the client
only makes sense when the information on the client is out of date.</li>
          <li>Added note clarifying that this entire document is about config
true data only.</li>
          <li>Rephrased slightly when referring to the candidate datastore to
keep making sense in the event that private candidate datastores
become a reality in the future.</li>
          <li>Added a note early on to more clearly lay out the structure of this
document, with a first part about the generic mechanism part, and a
second part about the two specific txid mechanisms.</li>
          <li>Corrected acl data model examples to conform to their YANG module.</li>
        </ul>
      </section>
      <section anchor="major-changes-in-draft-ietf-netconf-transaction-id-00-since-02">
        <name>Major changes in draft-ietf-netconf-transaction-id-00 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-1">
        <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-1">
        <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"/>
            <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="RFC4741">
          <front>
            <title>NETCONF Configuration Protocol</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <date month="December" year="2006"/>
            <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 on top of a simple Remote Procedure Call (RPC) layer. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4741"/>
          <seriesInfo name="DOI" value="10.17487/RFC4741"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <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="RFC6242">
          <front>
            <title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
            <author fullname="M. Wasserman" initials="M." surname="Wasserman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document describes a method for invoking and running the Network Configuration Protocol (NETCONF) within a Secure Shell (SSH) session as an SSH subsystem. This document obsoletes RFC 4742. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6242"/>
          <seriesInfo name="DOI" value="10.17487/RFC6242"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <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"/>
            <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"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <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="RFC8072">
          <front>
            <title>YANG Patch Media Type</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes a method for applying patches to configuration datastores using data defined with the YANG data modeling language.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8072"/>
          <seriesInfo name="DOI" value="10.17487/RFC8072"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <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>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8526">
          <front>
            <title>NETCONF Extensions to Support the Network Management Datastore Architecture</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document extends the Network Configuration Protocol (NETCONF) defined in RFC 6241 in order to support the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document updates RFCs 6241 and 7950. The update to RFC 6241 adds new and operations and augments existing,, and operations. The update to RFC 7950 requires the usage of the YANG library (described in RFC 8525) by NETCONF servers implementing the NMDA.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8526"/>
          <seriesInfo name="DOI" value="10.17487/RFC8526"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <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="RFC8791">
          <front>
            <title>YANG Data Structure Extensions</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Björklund" initials="M." surname="Björklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document describes YANG mechanisms for defining abstract data structures with YANG.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8791"/>
          <seriesInfo name="DOI" value="10.17487/RFC8791"/>
        </reference>
        <reference anchor="RFC9144">
          <front>
            <title>Comparison of Network Management Datastore Architecture (NMDA) Datastores</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="Y. Qu" initials="Y." surname="Qu"/>
            <author fullname="J. Tantsura" initials="J." surname="Tantsura"/>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>This document defines a Remote Procedure Call (RPC) operation to compare management datastores that comply with the Network Management Datastore Architecture (NMDA).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9144"/>
          <seriesInfo name="DOI" value="10.17487/RFC9144"/>
        </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"/>
            <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"/>
            <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"/>
            <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"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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="RFC7952">
          <front>
            <title>Defining and Using Metadata with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines a YANG extension that allows for defining metadata annotations in YANG modules. The document also specifies XML and JSON encoding of annotations and other rules for annotating instances of YANG data nodes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7952"/>
          <seriesInfo name="DOI" value="10.17487/RFC7952"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoit Claise for making this work happen,
and the following individuals, who all provided helpful comments:
Per Andersson, James Cumming, Kent Watsen, Andy Bierman, Robert Wilton,
Qiufang Ma, Jason Sterne and Robert Varga.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
RmKrh02yQNDv77BZbANs79XsaWJR5devBsePYCKAYTN9OvBXEzCsdrAb1C31
O7xqwdKgbQPqB9DbFWbITWzfctv8Ko8q3Na1qr7axtpyIokemULEzB/4Y7QM
O/ArltbmUGOTbsYiWU1oy7yCSbhJFrkIn1td2AlOoW5zjiLEUzLI5Q0ebbWD
Il5j7yY4c6MvG3Jt8MhvZyJT2q+WB5xqXWzlNzJY6zKgvBoZqAHmo/QMsNNR
Bny9zRe3d7R9b7S9PdrdG+7c+ztsmn0FGzQLmF5R9GzcjCx58uAhnF8i371i
qMypWF7YFUT12GX6DljrCXrLms/uZ1Q9BNw26SLgFfx3R4z5fgvE9ob6P2Hn
gkdb7on/HjtcfFxjTigwhDdJht0K/UDoWcMOIHJ8wwPjY82sWxfAc6zHsG/V
Zsg7v8rSgfe33cbB9Nfras22gIlqEMSSVAPaAJIaYE5YwrufdSto072LcjFi
yVub0SrAHjYvXK6KkqraYvq2aFrAmKVxv3K8QBvqkdTQJvlVLe1VAyc1yPz9
a3Onj3hx/9YkHbDGzvbOjoe6fiUivx6tnMRTfRVi2XLCDc/H16+e7qOwBwtK
WdpzxjUjIGYmdxiJ8Dplh6av0V2QasM/3Nnbu7gg8X/MPbHUa2R/kDqP0+o8
Fcu9RcXxlLXMWDA7SRPlNs/KhFTQXbKV9fDFckIZ11kV4GskorB6dN/Pr+IJ
j8i4W78D9GWUXggFOIQDv4S8uk3VrhfTqp4LJfTI2rn+nZTtWz/z5yyJB9Io
vDBXhdZLbps/0FXuXWcn5gpKZha4JB5Y1BK2CLWEdwyo1FwlQXwrympQlNlJ
lnfzn/74V+REVzV9tIIrz7plLbdJHlxbBjybjNxjmVad8SbxHWcU3up3bw+k
TDe558T+PQRIT4AfQq+eVkH92oJ5/QqwicMOrNfoeBVY824W5RqNGQr8ZuuB
80cA5iZ765hbe5oRiDDVQjd5XVLuALpyjBLun0WdPtrc4PuxGeDPaIMvxWbf
dmD9KE3eWw+Pm2ZDy1vVxq9x3pbvbuO5PY4b4QiW2cpym6u8VYN7B+uP0+p0
eyvNUaWbNBnlJpv8CG6KvP6ECOSjLe+Jx2LW2VcJwFvVYVSUIwanxz34OE1j
1Gn2jHKtdZj2bi/DRu1s8t729t5KJvmSPkIWves8d1ef5xgTi93sOJPUMiDr
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
KO/+BWg9wML/Bywu4yZm0AEA

-->

</rfc>
