<?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-03" 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-03"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="01"/>
    <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
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",
xmlns:ncds="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda",
xmlns:sn="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications",
xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push" and
xmlns:ypatch="urn:ietf:params:xml:ns:yang:ietf-yang-patch":</t>
          <t>In client messages sent to a server:</t>
          <ul spacing="normal">
            <li>/nc:rpc/nc:get-config</li>
            <li>/nc:rpc/nc:get-config/nc:filter//*</li>
            <li>/nc:rpc/ncds:get-data</li>
            <li>/nc:rpc/ncds:get-data/ncds:subtree-filter//*</li>
            <li>/nc:rpc/ncds:get-data/ncds:xpath-filter//*</li>
            <li>/nc:rpc/nc:edit-config/nc:config</li>
            <li>/nc:rpc/nc:edit-config/nc:config//*</li>
            <li>/nc:rpc/ncds:edit-data/ncds:config</li>
            <li>/nc:rpc/ncds:edit-data/ncds:config//*</li>
          </ul>
          <t>In server messages sent to a client:</t>
          <ul spacing="normal">
            <li>/nc:rpc-reply/nc:data</li>
            <li>/nc:rpc-reply/nc:data//*</li>
            <li>/nc:rpc-reply/ncds:data</li>
            <li>/nc:rpc-reply/ncds:data//*</li>
            <li>/nc:rpc-reply/nc:ok</li>
            <li>/yp:push-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit</li>
            <li>/yp:push-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit/ypatch:value//*</li>
            <li>/yp:push-change-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit</li>
            <li>/yp:push-change-update/yp:datastore-contents/ypatch:yang-patch/
ypatch:edit/ypatch:value//*</li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="txid-mechanism-examples">
      <name>Txid Mechanism Examples</name>
      <section anchor="initial-configuration-response">
        <name>Initial Configuration Response</name>
        <section anchor="with-etag">
          <name>With etag</name>
          <t>NOTE: In the etag examples below, we have chosen to use a txid
value consisting of "nc" followed by a monotonously increasing
integer.  This is convenient for the reader trying to make sense
of the examples, but is not an implementation requirement.  An
etag would often be implemented as a "random" string of characters.</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"><![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"><![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-yang-patch {
    prefix ypatch;
    reference
      "RFC 8072: YANG Patch Media Type";
  }

  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"><![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>
      <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-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="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="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="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>
        <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>
      </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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
q9c52gb37BiEMOjNrLq9PuJ/eP9LZLzIg7nbNmuJMJ3ZdF7HzgYvaf8njktx
PsU2Cj1MkYNH6toLLJsDet9YWRdbBWRqNurku77abAv0x9mDnsL019iHDrD8
k4EBq0WxPB06rRBTHtUnyEIQAw5PzCDFcioIURxowvlQzC6bnXshkIOVu+DQ
qY1CQGQeYEM47Cj0IC4HlmvrAJSQAoVz2AhSGiTsY032w54mK/ORv3PnKqm5
paMqoiMljjXIdyU9dB+4DKd3sunECy/Er2mGI/LWAj4vQ6z0Vb+c5eWCCNfI
S/JkFj+g0elfOyfHPvK/0Lya4QudU4pL3jHcWP76S+0YHWXH5Mp3E6tO9G9w
R7oBmaUTEDZ6vfuWiNBHbwdhJyhiNktXijeEBJTYLsgxuOxLB2pTmFhnfQw8
qdBg5HUxNfnjXGiACZw4BtG3lZ5EYn+CScglb+NuwdhstT83/beWwdlaSpdb
KuwJxWvKsiKcKEykRoHS6wF/YQY1yNPCHXMwjWVvCCEGOS887oyQHQZHYWGp
kdVSFo436jxMH+lZaZu6FkhMWKHBZxHZ4Z0WgTcilITcnN93zr2DoHSSlA0m
3YWpjVsaTspr5ai2iR3xVmMWetHU1xGki0nSeqJ0veWGLMp11+0Zff6lfp6I
Zhp12yAwF2+BzX/EFkbl/cJ5W1qKhj86jd0YhcT/73/93+/JcnQQ2xSQRsfl
G5C8mKCLTUjO1fTjGJNc/2vNSqPVsmVZ6vPVbRiAsjU6yvt3bz+Y6De+NzNc
ULqtLwL3334jkt0aZ0Narh3xzl44YmmHfOycGNeMR2itMaDTtXQPuntvf8Jj
vKLmz4EERhp9IrpHahkR1xn8eoft1QDfGNYuaVjjowNIu7Gu3VjX9I117Tdp
XeOQto9tXTPC1WCnzCbdQYb4C4lZg/65EGxKX8x2g7RQsshgWAuPahKph00v
bHQYm6WW6Lxt9H1k9UEjjVXNmqhjeIi+3jQpwzKR8NeTAc4XB983F90RLPKL
rNipNTuWeO1VBeHXzQe/0WWtlpN2cFsYoiuRcDsD/R8+6w7v+B6Wl1g95pIq
Mdbf5gZHTOjp2Fnylg6cRL/RUkNl31cfkNl3zOYfHSq5FNsfxkdtwPn7Pm4f
ifn3h1jP//tvtn3MmjO1HU0X65hxDPeayJ6kJRNhw3s+j7LohIV0y5db8e+g
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

-->

</rfc>
