<?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.7.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netconf-transaction-id-06" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netconf-transaction-id-06"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="22"/>
    <area>General</area>
    <workgroup>NETCONF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 51?>

<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 inefficient for synchronization.  This document
specifies a NETCONF extension 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>
    <?line 64?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>When a NETCONF client <xref target="RFC6241"/> 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 that 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 (e.g., local configuration).</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
may 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>Note that several server implementors have built proprietary and mutually
incompatible mechanisms for obtaining a transaction id from a NETCONF
server. This document solves the interoperability issue.</t>
      <t>RESTCONF, <xref target="RFC8040"/>,
defines a mechanism for detecting changes in configuration subtrees
based on Entity-Tags (ETags) and Last-Modified headers. An example is depicted in Appendix B.2.2 of <xref target="RFC8040"/></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
conditional requests per <xref section="13" sectionFormat="of" target="RFC9110"/>.</t>
      <t>This document defines similar mechanism 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, and 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.
<?line -6?>
      </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.</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 <tt>&lt;get-config&gt;</tt>, <tt>&lt;get-data&gt;</tt>, <tt>&lt;edit-config&gt;</tt>, <tt>&lt;edit-data&gt;</tt>,
<tt>&lt;discard-changes&gt;</tt>, <tt>&lt;copy-config&gt;</tt>, <tt>&lt;delete-config&gt;</tt>, and <tt>&lt;commit&gt;</tt> operations such
that clients are able to conditionally retrieve and update the
configuration in a NETCONF server.</t>
      <t>For servers implementing YANG-Push <xref target="RFC8641"/>, 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" <xref target="RFC9144"/>.</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 (<xref target="sec-etag"/>)
and the 'last-modified txid' mechanism (<xref target="sec-lm"/>). However, additional txid mechanisms may be defined in the future. Such mechanisms have to adhere
to the principles defined in <xref target="sec-principles"/>.</t>
      <t>This document is divided into a two
main 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="sample-use-cases">
        <name>Sample Use Cases</name>
        <t>The common use cases for txid mecahnisms are briefly discussed in this section.</t>
        <dl>
          <dt>Initial configuration retrieval:</dt>
          <dd>
            <t>When a 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 retrieve again (parts of) the server's configuration,
it may be interested to leverage the txid metadata 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 metadata that 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 metadata 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
metadata 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 updated txid
metadata for the changed data trees.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sec-principles">
        <name>General Txid Principles</name>
        <t>All servers implementing a txid mechanism MUST maintain a top level
server side txid (s-txid) metadata value for each configuration datastore
supported by the server.
Txid mechanism implementations MAY also maintain txid
metadata 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 implementations 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 a 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 that 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>A 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 <tt>&lt;get-config&gt;</tt> or <tt>&lt;get-data&gt;</tt> request (<xref section="3.1.1" sectionFormat="of" target="RFC8526"/>)
containing requests for txid values, and assuming no authorization or validation error is encountered,  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>
        <ul empty="true">
          <li>
            <t>The call flow examples in this document use 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>
          </li>
        </ul>
        <t>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. Servers may expose a configuration parameter
to control the history depth. Such control depends on the local server capabilities.
Refer to <xref target="sec-histo-size"/> for more considerations about history size.</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 assume or infer any semantic from txids. For example, clients must not 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 <tt>&lt;get-config&gt;</tt> or
<tt>&lt;get-data&gt;</tt> requests.  Txid values sent by a client are refered to as
c-txid.</t>
        <t>When a client sends 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 (i.e., does not return) that subtree from
the response.  Since the client already knows the txid for that 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><xref target="tab-rules"/> 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 anchor="tab-rules">
          <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 anchor="fig-pruning">
          <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 anchor="fig-oob-change">
          <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 depicted in <xref target="fig-oob-change"/>, 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 example shown in <xref target="fig-vn"/>, the client specifies the c-txid for a node that
the server does not maintain a s-txid for, i.e., it is not a
Versioned Node.</t>
        <figure anchor="fig-vn">
          <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., "=", "?", or "!") 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>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </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 (<tt>&lt;edit-config&gt;</tt>, for example), 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 (<tt>&lt;get-config&gt;</tt>, for example) and write (<tt>&lt;edit-config&gt;</tt>, for example) 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 <tt>&lt;rpc&gt;</tt> element to request the server
to return the new s-txid with the <tt>&lt;ok&gt;</tt> element.</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 anchor="fig-updated-all">
          <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-changes">
          <name>Error Response on Out-of-Band Changes</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 <tt>&lt;rpc-error&gt;</tt> with the following
values:</t>
          <artwork><![CDATA[
   error-tag:      operation-failed
   error-type:     protocol
   error-severity: error
]]></artwork>
          <t>Additionally, the error-info tag MUST contain an sx:structure <xref target="RFC8791"/>
containing relevant details about one of the mismatching txids.
A server MAY send multiple rpc-errors when multiple txid mismatches
are detected.</t>
          <figure anchor="fig-cond-fails">
            <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="sec-histo-size">
          <name>Txid History Size Consideration</name>
          <t>It may be tempting for a client implementor to send a single
c-txid value for the tree being edited.  In many 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 in the subtree below the
c-txid provided.</t>
          <t>Here the client is sending the same change as in
<xref target="base-edit-config">the example above</xref>, but with only a single
c-txid value that reflects the latest txid the client is
aware of anywhere in the configuration.</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                                      |
       |       acls                                      |
       |         acl A1 (txid: 8602)                     |
       |           aces                                  |
       |             ace R1                              |
       |               matches ipv4 protocol 6           |
       |               actions forwarding accept         |
       |                                                 |
       |   <------------------------------------------   |
       |   ok (txid: 9009)                               |
       v                                                 v
]]></artwork>
          </figure>
          <t>This approach works well in the example above because the c-txid
value 8602 is inherited down in the child nodes, from acl A1 to aces,
ace R1, and onwards. The server compares the c-txid value 8602
with the s-txid value in the data tree.  The server finds that the
values do not match (e.g., s-txid 7688 for ace R1 is not equal to
c-txid 8602), but finds that 8602 is a more recent txid than 7688
by looking in the server's Txid History, and therefore accepts the
transaction.</t>
          <t>Clients relying on the server's Txid History being long enough,
could see their changes rejected if some of the s-txid have
fallen out of the server's Txid History (e.g., if the txid 7688
happened so long ago that the it is no longer in the server's
Txid History).  Some servers may have a Txid History size of zero.
A client specifying a single c-txid value for a change like the one
above 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 using 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><tt>&lt;discard-changes&gt;</tt>:</dt>
          <dd>
            <t>The <tt>&lt;discard-changes&gt;</tt> 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><tt>&lt;copy-config&gt;</tt>:</dt>
          <dd>
            <t>The <tt>&lt;copy-config&gt;</tt>` 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><tt>&lt;delete-config&gt;</tt>:</dt>
          <dd>
            <t>The server MUST ensure the datastore txid value is changed, unless it
was already empty.</t>
          </dd>
          <dt><tt>&lt;commit&gt;</tt>:</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>
          <t>The etag attribute txid mechanism (<xref target="sec-etag"/>)</t>
        </li>
        <li>
          <t>The last-modified attribute txid mechanism (<xref target="sec-lm"/>)</t>
        </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="sec-etag">
        <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
<xref target="sec-principles"/>.  These
rules are chosen to be consistent with the ETag mechanism in
RESTCONF, specifically Sections <xref target="RFC8040" section="3.4.1.2" sectionFormat="bare"/>, <xref target="RFC8040" section="3.4.1.3" sectionFormat="bare"/> and <xref target="RFC8040" section="3.5.2" sectionFormat="bare"/> of <xref target="RFC8040"/>.</t>
      </section>
      <section anchor="sec-lm">
        <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 <xref target="sec-principles"/>.  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>
              <t>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.</t>
            </li>
            <li>
              <t>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.</t>
            </li>
          </ul>
        </section>
        <section anchor="namespaces-and-attribute-placement">
          <name>Namespaces and Attribute Placement</name>
          <t>The txid attributes are valid on the following NETCONF tags,
where xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" <xref target="RFC4741"/> <xref target="RFC6241"/>,
xmlns:ncds="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda" <xref target="RFC8526"/>,
xmlns:sn="urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications" <xref target="RFC8639"/>,
xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push" <xref target="RFC8641"/> <xref target="RFC8072"/>:</t>
          <t>In client messages sent to a server:</t>
          <ul spacing="normal">
            <li>
              <t>/nc:rpc/nc:get-config</t>
            </li>
            <li>
              <t>/nc:rpc/nc:get-config/nc:filter//*</t>
            </li>
            <li>
              <t>/nc:rpc/ncds:get-data</t>
            </li>
            <li>
              <t>/nc:rpc/ncds:get-data/ncds:subtree-filter//*</t>
            </li>
            <li>
              <t>/nc:rpc/ncds:get-data/ncds:xpath-filter//*</t>
            </li>
            <li>
              <t>/nc:rpc/nc:edit-config/nc:config</t>
            </li>
            <li>
              <t>/nc:rpc/nc:edit-config/nc:config//*</t>
            </li>
            <li>
              <t>/nc:rpc/ncds:edit-data/ncds:config</t>
            </li>
            <li>
              <t>/nc:rpc/ncds:edit-data/ncds:config//*</t>
            </li>
          </ul>
          <t>In server messages sent to a client:</t>
          <ul spacing="normal">
            <li>
              <t>/nc:rpc-reply/nc:data</t>
            </li>
            <li>
              <t>/nc:rpc-reply/nc:data//*</t>
            </li>
            <li>
              <t>/nc:rpc-reply/ncds:data</t>
            </li>
            <li>
              <t>/nc:rpc-reply/ncds:data//*</t>
            </li>
            <li>
              <t>/nc:rpc-reply/nc:ok</t>
            </li>
            <li>
              <t>/yp:push-update/yp:datastore-contents/yp:yang-patch/
yp:edit</t>
            </li>
            <li>
              <t>/yp:push-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp:value//*</t>
            </li>
            <li>
              <t>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit</t>
            </li>
            <li>
              <t>/yp:push-change-update/yp:datastore-contents/yp:yang-patch/
yp:edit/yp:value//*</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="txid-mechanism-examples">
      <name>Txid Mechanism Examples</name>
      <section anchor="initial-configuration-response">
        <name>Initial Configuration Response</name>
        <section anchor="with-etag">
          <name>With etag</name>
          <t>NOTE: In the etag examples below, we have chosen to use a txid
value consisting of "nc" followed by a monotonously increasing
integer.  This is convenient for the reader trying to make sense
of the examples, but is not an implementation requirement.  An
etag would often be implemented as a "random" string of characters.</t>
          <t>To retrieve etag attributes across the entire NETCONF server
configuration, a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config txid:etag="?"/>
</rpc>
]]></sourcecode>
          <t>The server's reply might then be:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="nc5152">
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"
          txid:etag="nc3072">
      <groups txid:etag="nc3072">
        <group txid:etag="nc3072">
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
          <t>To retrieve etag attributes for a specific ACL using an xpath
filter, a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter type="xpath"
      xmlns:acl=
        "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      select="/acl:acls/acl:acl[acl:name='A1']"
      txid:etag="?"/>
  </get-config>
</rpc>
]]></sourcecode>
          <t>To retrieve etag attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="3"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
Versioned Nodes, the server's response to the request above
might look like:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="3"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls xmlns=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
          txid:etag="nc5152">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc5152">
        <name>A2</name>
        <aces txid:etag="nc5152">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
        </section>
        <section anchor="with-last-modified">
          <name>With last-modified</name>
          <t>To retrieve last-modified attributes for "acls", but not for "nacm",
a client might send:</t>
          <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="4"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:last-modified="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
          <t>If the server considers "acls", "acl", "aces" and "acl" to be
Versioned Nodes, the server's response to the request above
might look like:</t>
          <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="4"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:last-modified="2022-04-01T12:34:56.789012Z">
      <acl txid:last-modified="2022-03-20T16:20:11.333444Z">
        <name>A1</name>
        <aces txid:last-modified="2022-03-20T16:20:11.333444Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:last-modified="2022-04-01T12:34:56.789012Z">
        <name>A2</name>
        <aces txid:last-modified="2022-04-01T12:34:56.789012Z">
          <ace txid:last-modified="2022-03-20T16:20:11.333444Z">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:last-modified="2022-04-01T12:34:56.789012Z">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>22</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></sourcecode>
        </section>
      </section>
      <section anchor="configuration-response-pruning">
        <name>Configuration Response Pruning</name>
        <t>A NETCONF client that already knows some txid values MAY request that
the configuration retrieval request is pruned with respect to the
client's prior knowledge.</t>
        <t>To retrieve only changes for "acls" that do not have the
last known etag txid value, a client might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="6"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711"/>
        </acl>
        <acl txid:etag="nc5152">
          <name>A2</name>
          <aces txid:etag="nc5152"/>
        </acl>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
        <t>Assuming the NETCONF server configuration is the same as
in the previous rpc-reply example, the server's response to request
above might look like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="="/>
  </data>
</rpc>
]]></sourcecode>
        <t>Or, if a configuration change has taken place under /acls since the
client was last updated, the server's response may look like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="6"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc6614">
      <acl txid:etag="=">
        <name>A1</name>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>22</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <ipv4>
                <source-port>
                  <port>830</port>
                </source-port>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case the client provides a txid value for a non-versioned node,
the server needs to treat the node as having the same txid value as
the closest ancestor that does have a txid value.</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl>
          <name>A2</name>
          <aces>
            <ace>
              <name>R7</name>
              <matches>
                <ipv4>
                  <dscp txid:etag="nc4711"/>
                </ipv4>
              </matches>
            </ace>
          </aces>
        </acl>
      </acls>
    </filter>
  </get-config>
</rpc>
]]></sourcecode>
        <t>If a txid value is specified for a leaf, and the txid value matches
(i.e. is identical to the server's txid value, or found earlier in
the server's Txid History), the leaf value is pruned.</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="7"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      <acl>
        <name>A2</name>
        <aces>
          <ace>
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp txid:etag="="/>
              </ipv4>
            </matches>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="configuration-change">
        <name>Configuration Change</name>
        <t>A client that wishes to update the ace R1 protocol to tcp might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="8">
  <edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
               xmlns:ietf-netconf-txid=
                "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
    <target>
      <running/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
    <config>
      <acls
        xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
        txid:etag="nc5152">
        <acl txid:etag="nc4711">
          <name>A1</name>
          <aces txid:etag="nc4711">
            <ace txid:etag="nc4711">
              <matches>
                <ipv4>
                  <protocol>6</protocol>
                </ipv4>
              </matches>
              <actions>
                <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                  acl:accept
                <forwarding>
              </actions>
            </ace>
          </aces>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></sourcecode>
        <t>The server would update the protocol leaf in the running datastore,
and return an rpc-reply as follows:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="8"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc7688"/>
</rpc-reply>
]]></sourcecode>
        <t>A subsequent get-config request for "acls", with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc7688">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="nc6614">
        <name>A2</name>
        <aces txid:etag="nc6614">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc5152">
            <name>R8</name>
            <matches>
              <udp>
                <source-port>
                  <port>22</port>
                </source-port>
              </udp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc6614">
            <name>R9</name>
            <matches>
              <tcp>
                <source-port>
                  <port>830</port>
                </source-port>
              </tcp>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case the server at this point received a configuration change from
another source, such as a CLI operator, removing ace R8 and R9 in
acl A2, a subsequent get-config request for acls, with txid:etag="?"
might then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="9"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="cli2222">
      <acl txid:etag="nc7688">
        <name>A1</name>
        <aces txid:etag="nc7688">
          <ace txid:etag="nc7688">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
      </section>
      <section anchor="conditional-configuration-change">
        <name>Conditional Configuration Change</name>
        <t>If a client wishes to delete acl A1 if and only if its configuration
has not been altered since this client last synchronized its
configuration with the server, at which point it received the etag
"nc7688" for acl A1, regardless of any possible changes to other
acls, it might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="10"
     xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0"
     xmlns:ietf-netconf-txid=
       "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
  <edit-config>
    <target>
      <running/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
    <config>
      <acls xmlns=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
        <acl nc:operation="delete"
             txid:etag="nc7688">
          <name>A1</name>
        </acl>
      </acls>
    </config>
  </edit-config>
</rpc>
]]></sourcecode>
        <t>If acl A1 now has the etag txid value "nc7688", as expected by the
client, the transaction goes through, and the server responds
something like:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="10"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></sourcecode>
        <t>A subsequent get-config request for acls, with txid:etag="?" might
then return:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="11"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc8008">
      <acl txid:etag="cli2222">
        <name>A2</name>
        <aces txid:etag="cli2222">
          <ace txid:etag="nc4711">
            <name>R7</name>
            <matches>
              <ipv4>
                <dscp>10</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc>
]]></sourcecode>
        <t>In case acl A1 did not have the expected etag txid value "nc7688"
when the server processed this request, nor was the client's txid
value found later in the server's Txid History, then the server
rejects the transaction, and might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list"
           xmlns:ietf-netconf-txid=
             "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
           message-id="11">
  <rpc-error>
    <error-type>protocol</error-type>
    <error-tag>operation-failed</error-tag>
    <error-severity>error</error-severity>
    <error-info>
      <ietf-netconf-txid:txid-value-mismatch-error-info>
        <ietf-netconf-txid:mismatch-path>
          /acl:acls/acl:acl[acl:name="A1"]
        </ietf-netconf-txid:mismatch-path>
        <ietf-netconf-txid:mismatch-etag-value>
          cli6912
        </ietf-netconf-txid:mismatch-etag-value>
      </ietf-netconf-txid:txid-value-mismatch-error-info>
    </error-info>
  </rpc-error>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="reading-from-the-candidate-datastore">
        <name>Reading from the Candidate Datastore</name>
        <t>Let's assume that a get-config towards the running datastore
currently contains the following data and txid values:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="12"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list"
      txid:etag="nc4711">
      <acl txid:etag="nc4711">
        <name>A1</name>
        <aces txid:etag="nc4711">
          <ace txid:etag="nc4711">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>17</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>A client issues discard-changes (to make the candidate datastore
equal to the running datastore), and issues an edit-config to
change the R1 protocol from udp (17) to tcp (6), and then executes a
get-config with the txid-request attribute "?" set on the acl A1,
the server might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="13"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data>
    <acls
      xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      <acl txid:etag="!">
        <name>A1</name>
        <aces txid:etag="!">
          <ace txid:etag="!">
            <name>R1</name>
            <matches>
              <ipv4>
                <protocol>6</protocol>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
          <ace txid:etag="nc2219">
            <name>R2</name>
            <matches>
              <ipv4>
                <dscp>21</dscp>
              </ipv4>
            </matches>
            <actions>
              <forwarding xmlns:acl=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
                acl:accept
              <forwarding>
            </actions>
          </ace>
        </aces>
      </acl>
    </acls>
  </data>
</rpc-reply>
]]></sourcecode>
        <t>Here, the txid-unknown value "!" is sent by the server.  This
particular server implementation does not know beforehand which
txid value would be used for this versioned node after commit.
It will be a value different from the current corresponding
txid value in the running datastore.</t>
        <t>In case the server is able to predict the txid value that would
be used for the versioned node after commit, it could respond
with that value instead.  Let's say the server knows the txid
would be "7688" if the candidate datastore was committed without
further changes, then it would respond with that value in each
place where the example shows "!" above.</t>
      </section>
      <section anchor="commit">
        <name>Commit</name>
        <t>The client MAY request that the new etag txid value is returned as an
attribute on the ok response for a successful commit.  The client
requests this by adding with-etag to the commit operation.</t>
        <t>For example, a client might send:</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="14"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
    xmlns:ietf-netconf-txid=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid"
  <commit>
    <ietf-netconf-txid:with-etag>true</ietf-netconf-txid:with-etag>
  </commit>
</rpc>
]]></sourcecode>
        <t>Assuming the server accepted the transaction, it might respond:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply message-id="14"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="nc8008"/>
</rpc-reply>
]]></sourcecode>
      </section>
      <section anchor="yang-push">
        <name>YANG-Push</name>
        <t>A client MAY request that the updates for one or more YANG-Push
subscriptions are annotated with the txid values.  The request might
look like this:</t>
        <sourcecode type="xml"><![CDATA[
<netconf:rpc message-id="16"
             xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
  <establish-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <yp:datastore-xpath-filter
        xmlns:acl=
          "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
      /acl:acls
    </yp:datastore-xpath-filter>
    <yp:on-change/>
    <ietf-netconf-txid-yp:with-etag>
      true
    </ietf-netconf-txid-yp:with-etag>
  </establish-subscription>
</netconf:rpc>
]]></sourcecode>
        <t>A server might send a subscription update like this:</t>
        <sourcecode type="xml"><![CDATA[
<notification
  xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"
  xmlns:ietf-netconf-txid-yp=
    "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push">
  <eventTime>2022-04-04T06:00:24.16Z</eventTime>
  <push-change-update
      xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-push">
    <id>89</id>
    <datastore-changes>
      <yang-patch>
        <patch-id>0</patch-id>
        <edit>
          <edit-id>edit1</edit-id>
          <operation>delete</operation>
          <target xmlns:acl=
            "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
            /acl:acls
          </target>
          <value>
            <acl xmlns=
              "urn:ietf:params:xml:ns:yang:ietf-access-control-list">
              <name>A1</name>
            </acl>
          </value>
        </edit>
        <ietf-netconf-txid-yp:etag-value>
          nc8008
        </ietf-netconf-txid-yp:etag-value>
      </yang-patch>
    </datastore-changes>
  </push-change-update>
</notification>
]]></sourcecode>
        <t>In case a client wishes to modify a previous subscription request in
order to no longer receive YANG-Push subscription updates, the request
might look like this:</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="17"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <modify-subscription
      xmlns=
        "urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications"
      xmlns:yp="urn:ietf:params:xml:ns:yang:ietf-yang-push"
      xmlns:ietf-netconf-txid-yp=
        "urn:ietf:params:xml:ns:yang:ietf-txid-yang-push">
    <id>1011</id>
    <yp:datastore
        xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
      ds:running
    </yp:datastore>
    <ietf-netconf-txid-yp:with-etag>
      false
    </ietf-netconf-txid-yp:with-etag>
  </modify-subscription>
</rpc>
]]></sourcecode>
      </section>
      <section anchor="nmda-compare">
        <name>NMDA Compare</name>
        <t>The following example is taken from section 5 of <xref target="RFC9144"/>.
It compares the difference between the operational and intended
datastores for a subtree under "interfaces".</t>
        <t>In this version of the example, the client requests that txid
values, in this case etag-values, are annotated to the result.</t>
        <sourcecode type="xml"><![CDATA[
<rpc message-id="101"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <compare xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
      xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"
      xmlns:ietf-netconf-txid-nmda-compare=
        "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <source>ds:operational</source>
    <target>ds:intended</target>
    <report-origin/>
    <ietf-netconf-txid-nmda-compare:with-etag>
      true
    </ietf-netconf-txid-nmda-compare:with-etag>
    <xpath-filter
        xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      /if:interfaces
    </xpath-filter>
  </compare>
</rpc>
]]></sourcecode>
        <t>RPC reply when a difference is detected:</t>
        <sourcecode type="xml"><![CDATA[
<rpc-reply
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    message-id="101">
  <differences
    xmlns="urn:ietf:params:xml:ns:yang:ietf-nmda-compare"
    xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
    xmlns:ietf-netconf-txid-nmda-compare=
      "urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare">
    <yang-patch>
      <patch-id>interface status</patch-id>
      <comment>
        diff between operational (source) and intended (target),
        with txid values taken from intended.
      </comment>
      <edit>
        <edit-id>1</edit-id>
        <operation>replace</operation>
        <target>/ietf-interfaces:interface=eth0/enabled</target>
        <value>
          <if:enabled>false</if:enabled>
        </value>
        <source-value>
          <if:enabled or:origin="or:learned">true</if:enabled>
        </source-value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          4004
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
      <edit>
        <edit-id>2</edit-id>
        <operation>create</operation>
        <target>/ietf-interfaces:interface=eth0/description</target>
        <value>
          <if:description>ip interface</if:description>
        </value>
        <ietf-netconf-txid-nmda-compare:etag-value>
          8008
        </ietf-netconf-txid-nmda-compare:etag-value>
      </edit>
    </yang-patch>
  </differences>
</rpc-reply>
]]></sourcecode>
        <t>The same response in RESTCONF (using JSON format):</t>
        <sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 24 Jan 2019 20:56:30 GMT
Server: example-server
Content-Type: application/yang-data+json

{ "ietf-nmda-compare:output" : {
    "differences" : {
      "ietf-yang-patch:yang-patch" : {
        "patch-id" : "interface status",
        "comment" : "diff between intended (source) and operational",
        "edit" : [
          {
            "edit-id" : "1",
            "operation" : "replace",
            "target" : "/ietf-interfaces:interface=eth0/enabled",
            "value" : {
              "ietf-interfaces:interface/enabled" : "false"
            },
            "source-value" : {
              "ietf-interfaces:interface/enabled" : "true",
              "@ietf-interfaces:interface/enabled" : {
                "ietf-origin:origin" : "ietf-origin:learned"
              }
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "4004"
          },
          {
            "edit-id" : "2",
            "operation" : "create",
            "target" : "/ietf-interfaces:interface=eth0/description",
            "value" : {
              "ietf-interface:interface/description" : "ip interface"
            },
            "ietf-netconf-txid-nmda-compare:etag-value": "8008"
          }
        ]
      }
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="yang-modules">
      <name>YANG Modules</name>
      <section anchor="base-module-for-txid-in-netconf">
        <name>Base module for txid in NETCONF</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid@2023-03-01.yang"><![CDATA[
module ietf-netconf-txid {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid';
  prefix ietf-netconf-txid;

  import ietf-netconf {
    prefix nc;
  }

  import ietf-netconf-nmda {
    prefix ncds;
  }

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

  import ietf-yang-types {
    prefix yang;
  }

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

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

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

  description
    "NETCONF Transaction ID aware operations for NMDA.

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

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

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

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

  revision 2023-03-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

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

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

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

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

      '?' This txid value is used by clients and is 
          guaranteed not to match any txid on the server.

      '!' This txid value used by servers to indicate 
          the node in the candidate datastore has changed
          relative to the running datastore, but not yet received
          a new txid value on the server.

      '=' This txid value used by servers to indicate 
          that contents has been pruned due to txid match
          between client and server.
      ";
  }

  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 to the running datastore, but not yet received
            a new txid value on the server.";
        }
        enum = {
          description "Txid value used by servers to indicate 
            that contents has been pruned due to txid match
            between client and server.";
        }
      }
    }
    description
      "Last-modified txid value representing a specific transaction.
       The txid values '?', '!' and '=' have special meaning.";
  }

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

  grouping txid-value-grouping {
    leaf etag-value {
      type etag-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    leaf last-modified-value {
      if-feature last-modified;
      type last-modified-t;
      description
        "Indicates server's txid value for a YANG node.";
    }
    description
      "Grouping for txid mechanisms, to be augmented into 
       output of rpcs that return txid metadata for configuration
       data stores.";
  }

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

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

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

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

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

  import ietf-yang-push {
    prefix yp;
    reference
      "RFC 8641: Subscriptions to YANG Datastores";
  }

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

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

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

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

  description
    "NETCONF Transaction ID aware operations for YANG Push.

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

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

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

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

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

  augment "/sn:establish-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       that apply specifically to datastore updates to RPC input.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:modify-subscription/sn:input" {
    description
      "This augmentation adds additional subscription parameters
       specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/sn:subscriptions/sn:subscription" {
    description
      "This augmentation adds additional subscription parameters
       specific to datastore updates.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/yp:push-change-update/yp:datastore-changes/" +
          "yp:yang-patch" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    uses ietf-netconf-txid:txid-value-grouping;
  }
}
]]></sourcecode>
      </section>
      <section anchor="additional-support-for-txid-in-nmda-compare">
        <name>Additional support for txid in NMDA Compare</name>
        <sourcecode type="yang" markers="true" name="ietf-netconf-txid-nmda-compare@2023-05-01.yang"><![CDATA[
module ietf-netconf-txid-nmda-compare {
  yang-version 1.1;
  namespace 
    'urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare';
  prefix ietf-netconf-txid-nmda-compare;

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

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

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

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

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

  description
    "NETCONF Transaction ID aware operations for NMDA Compare.

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

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

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

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

  revision 2023-05-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

  augment "/cmp:compare/cmp:input" {
    description
      "This augmentation makes it possible for clients to request
       txids to be returned.";
    uses ietf-netconf-txid:txid-grouping;
  }
  augment "/cmp:compare/cmp:output/cmp:compare-response/" +
          "cmp:differences/cmp:differences/cmp:yang-patch/cmp:edit" {
    description
      "This augmentation makes it possible for servers to return
      txid-values.";
    container most-recent {
      description "The txid value returned by the server MUST be the
        txid value pertaining to the target node in the source or 
        target datastores that is the most recent.";
      uses ietf-netconf-txid:txid-value-grouping;
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The YANG modules specified in this document define YANG types, groupings, structures and additional RPC parameters for data that is designed to be accessed via network management protocols such as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>. The lowest NETCONF layer is the secure transport layer, and the mandatory-to-implement secure transport is Secure Shell (SSH) <xref target="RFC6242"/>. The lowest RESTCONF layer is HTTPS, and the mandatory-to-implement secure transport is TLS <xref target="RFC8446"/>.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content.</t>
      <t>In the YANG modules published with this document, there is no configuration, state data, new RPCs or notifications.  This document defines additional XML attributes and headers, however, that merit consideration from a security perspective.</t>
      <section anchor="nacm-access-control">
        <name>NACM Access Control</name>
        <t>NACM, <xref target="RFC8341"/>, access control
processing happens as usual, independently of any txid handling, if
supported by the server and enabled by the NACM configuration.</t>
        <t>It should be pointed out however, that when txid information is added
to a reply, it may occasionally be possible for a client to deduce
that a configuration change has happened in some part of the
configuration to which it has no access rights.</t>
        <t>For example, a client may notice that the root node txid has changed
while none of the subtrees it has access to have changed, and thereby
conclude that someone else has made a change to some part of the
configuration that is not acessible by the client.</t>
        <section anchor="hash-based-txid-algorithms">
          <name>Hash-based Txid Algorithms</name>
          <t>Servers that implement NACM and choose to implement a hash-based txid
algorithm over the configuration may reveal to a client that the
configuration of a subtree that the client has no access to is the
same as it was at an earlier point in time.</t>
          <t>For example, a client with partial access to the configuration might
observe that the root node txid was 1234. After a few configuration
changes by other parties, the client may again observe that the root
node txid is 1234.  It may then deduce that the configuration is the
same as earlier, even in the parts of the configuration it has no
access to.</t>
          <t>In some use cases, this behavior may be considered a feature, since it
allows a security client to verify that the configuration is the same
as expected, without transmitting or storing the actual configuration.</t>
        </section>
      </section>
      <section anchor="unchanged-configuration">
        <name>Unchanged Configuration</name>
        <t>It will also be possible for clients to deduce that a configuration
change has not happened during some period, by simply observing that
the root node (or other subtree) txid remains unchanged.  This is
true regardless of NACM being deployed or choice of txid algorithm.</t>
        <t>Again, there may be use cases where this behavior may be considered a
feature, since it allows a security client to verify that the
configuration is the same as expected, without transmitting or storing
the actual configuration.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="netconf-capability-urn">
        <name>NETCONF Capability URN</name>
        <t>This document requets IANA to register the following capability identifier URN in
the 'Network Configuration Protocol (NETCONF) Capability URNs'
registry:</t>
        <artwork><![CDATA[
Capability: :txid
Capability Identifier: urn:ietf:params:netconf:capability:txid:1.0
Reference: RFC XXXX
]]></artwork>
      </section>
      <section anchor="ietf-xml-registry">
        <name>IETF XML Registry</name>
        <t>This document request IANA to register four XML namespace URIs in the the "ns"
subregistry within the "IETF XML Registry" <xref target="RFC3688"/>:</t>
        <artwork><![CDATA[
  URI: urn:ietf:params:xml:ns:netconf:txid:1.0
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  URI: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push
  Registrant Contact: The IESG.
  XML: N/A, the requested URIs are XML namespaces.

  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>
      </section>
      <section anchor="yang-module-names">
        <name>YANG Module Names</name>
        <t>This document requests IANA to register three module names in the "YANG
Module Names" subregistry <xref target="RFC6020"/> within the "YANG Parameters"
registry.</t>
        <artwork><![CDATA[
  name: ietf-netconf-txid
  prefix: ietf-netconf-txid
  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid
  maintained by IANA? N
  RFC: XXXX

  name: ietf-netconf-txid-yp
  prefix: ietf-netconf-txid-yp
  namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-txid-yang-push
  maintained by IANA? N
  RFC: XXXX

  name: ietf-netconf-txid-nmda-compare
  prefix: ietf-netconf-txid-nmda-compare
  namespace:
    urn:ietf:params:xml:ns:yang:ietf-netconf-txid-nmda-compare
  maintained by IANA? N
  RFC: XXXX
]]></artwork>
      </section>
    </section>
    <section anchor="changes">
      <name>Changes</name>
      <section anchor="major-changes-in-06-since-05">
        <name>Major changes in -06 since -05</name>
        <ul spacing="normal">
          <li>
            <t>Many language, style, spelling and formatting improvements thanks
to reviews by Reshad Rahman and Med Boucadair</t>
          </li>
          <li>
            <t>Clarified Txid History Size Consideration example</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-05-since-04">
        <name>Major changes in -05 since -04</name>
        <ul spacing="normal">
          <li>
            <t>Corrected namespace for reference to elements in ietf-yang-push</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-04-since-03">
        <name>Major changes in -04 since -03</name>
        <ul spacing="normal">
          <li>
            <t>Updated security considerations.</t>
          </li>
          <li>
            <t>Added several normative RFC references.</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-03-since-02">
        <name>Major changes in -03 since -02</name>
        <ul spacing="normal">
          <li>
            <t>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, ...).</t>
          </li>
          <li>
            <t>Added missing normative RFC references.</t>
          </li>
          <li>
            <t>Corrected the YANG-push namespace reference.</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Renamed YANG feature ietf-netconf-txid:txid-last-modified to
ietf-netconf-txid:last-modified in order to reduce redundant mentions
of "txid".</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Added note clarifying that the txid attributes used in the XML
encoding are never used in JSON (since RESTCONF uses HTTP headers
instead).</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Added note clarifying that this entire document is about config
true data only.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Corrected acl data model examples to conform to their YANG module.</t>
          </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>
            <t>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 "!".</t>
          </li>
          <li>
            <t>Changed the logic of copy-config to be similar to edit-config.</t>
          </li>
          <li>
            <t>Clarified how txid values interact with when-dependencies
together with default values.</t>
          </li>
          <li>
            <t>Added content to security considerations.</t>
          </li>
          <li>
            <t>Added a high-level example for YANG-Push subscriptions with txid.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Some rewording and minor additions for clarification, based
on mailing list feedback.</t>
          </li>
          <li>
            <t>Divided RFC references into normative and informative.</t>
          </li>
          <li>
            <t>Corrected a logic error in the second figure (figure 6) in the
"Conditional Transactions" section</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-02-since-01-1">
        <name>Major changes in -02 since -01</name>
        <ul spacing="normal">
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Changed name of "versioned elements". They are now called
"Versioned Nodes".</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Examples provided for the abstract mechanism level with simple
message flow diagrams.</t>
          </li>
          <li>
            <t>More examples on protocol level, and with ietf-interfaces as
example target module replaced with ietf-access-control to reduce
confusion.</t>
          </li>
          <li>
            <t>Explicit list of XPaths to clearly state where etag or
last-modified attributes may be added by clients and servers.</t>
          </li>
          <li>
            <t>Document introduction restructured to remove duplication between
sections and to allow multiple (etag and last-modified) txid
mechanisms.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
        </ul>
      </section>
      <section anchor="major-changes-in-01-since-00-1">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>
            <t>Updated the text on numerous points in order to answer questions
that appeared on the mailing list.</t>
          </li>
          <li>
            <t>Changed the document structure into a general transaction id part
and one etag specific part.</t>
          </li>
          <li>
            <t>Renamed entag attribute to etag, prefix to txid, namespace to
urn:ietf:params:xml:ns:yang:ietf-netconf-txid.</t>
          </li>
          <li>
            <t>Set capability string to
urn:ietf:params:netconf:capability:txid:1.0</t>
          </li>
          <li>
            <t>Changed YANG module name, namespace and prefix to match names above.</t>
          </li>
          <li>
            <t>Harmonized/slightly adjusted etag value space with RFC 7232 and
RFC 8040.</t>
          </li>
          <li>
            <t>Removed all text discussing etag values provided by the client
(although this is still an interesting idea, if you ask the author)</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Added a mechanism for returning the server assigned etag value in
get-config and get-data.</t>
          </li>
          <li>
            <t>Added section describing how the NETCONF discard-changes,
copy-config, delete-config and commit operations work with respect to
etags.</t>
          </li>
          <li>
            <t>Added IANA Considerations section.</t>
          </li>
          <li>
            <t>Removed all comments about open questions.</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC4741">
          <front>
            <title>NETCONF Configuration Protocol</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <date month="December" year="2006"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized on top of a simple Remote Procedure Call (RPC) layer. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4741"/>
          <seriesInfo name="DOI" value="10.17487/RFC4741"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC6242">
          <front>
            <title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
            <author fullname="M. Wasserman" initials="M." surname="Wasserman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document describes a method for invoking and running the Network Configuration Protocol (NETCONF) within a Secure Shell (SSH) session as an SSH subsystem. This document obsoletes RFC 4742. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6242"/>
          <seriesInfo name="DOI" value="10.17487/RFC6242"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC8072">
          <front>
            <title>YANG Patch Media Type</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document describes a method for applying patches to configuration datastores using data defined with the YANG data modeling language.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8072"/>
          <seriesInfo name="DOI" value="10.17487/RFC8072"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8526">
          <front>
            <title>NETCONF Extensions to Support the Network Management Datastore Architecture</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <author fullname="P. Shafer" initials="P." surname="Shafer"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="R. Wilton" initials="R." surname="Wilton"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>This document extends the Network Configuration Protocol (NETCONF) defined in RFC 6241 in order to support the Network Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
              <t>This document updates RFCs 6241 and 7950. The update to RFC 6241 adds new and operations and augments existing,, and operations. The update to RFC 7950 requires the usage of the YANG library (described in RFC 8525) by NETCONF servers implementing the NMDA.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8526"/>
          <seriesInfo name="DOI" value="10.17487/RFC8526"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="RFC8641">
          <front>
            <title>Subscription to YANG Notifications for Datastore Updates</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document describes a mechanism that allows subscriber applications to request a continuous and customized stream of updates from a YANG datastore. Providing such visibility into updates enables new capabilities based on the remote mirroring and monitoring of configuration and operational state.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8641"/>
          <seriesInfo name="DOI" value="10.17487/RFC8641"/>
        </reference>
        <reference anchor="RFC8791">
          <front>
            <title>YANG Data Structure Extensions</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Björklund" initials="M." surname="Björklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document describes YANG mechanisms for defining abstract data structures with YANG.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8791"/>
          <seriesInfo name="DOI" value="10.17487/RFC8791"/>
        </reference>
        <reference anchor="RFC9144">
          <front>
            <title>Comparison of Network Management Datastore Architecture (NMDA) Datastores</title>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="Y. Qu" initials="Y." surname="Qu"/>
            <author fullname="J. Tantsura" initials="J." surname="Tantsura"/>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>This document defines a Remote Procedure Call (RPC) operation to compare management datastores that comply with the Network Management Datastore Architecture (NMDA).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9144"/>
          <seriesInfo name="DOI" value="10.17487/RFC9144"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
        <reference anchor="RFC7232">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7232"/>
          <seriesInfo name="DOI" value="10.17487/RFC7232"/>
        </reference>
        <reference anchor="RFC7952">
          <front>
            <title>Defining and Using Metadata with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines a YANG extension that allows for defining metadata annotations in YANG modules. The document also specifies XML and JSON encoding of annotations and other rules for annotating instances of YANG data nodes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7952"/>
          <seriesInfo name="DOI" value="10.17487/RFC7952"/>
        </reference>
      </references>
    </references>
    <?line 3249?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoît Claise for making this work happen,
and the following individuals, who all provided helpful comments
and reviews:
Per Andersson, James Cumming, Kent Watsen, Andy Bierman, Robert Wilton,
Qiufang Ma, Jason Sterne, Robert Varga, Reshad Rahman and Med Boucadair.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
0pMLKXTSCf/xgwpo4iCnFEyP6DPGuw7KpIL3vEf8cmPEfZsE6hFmdgI4WvEG
9+FTtC9D6dWkbBe+dDVyZm3Xd7rt2JckZd2866/Mva7gX1dwsB087PVItIPQ
B1vepe+KF5dofA87WbREFLIzWw4VBg/TMDG5jEtJRlBerG+69y8np5hIywf3
u3fu3bPR9QHGP6CMb6gCBeTuxeWr6cF3ObNlQ2wEh6uerCnfLt6d+//y3fl1
tHG0593qtOBxN4prQXC1lm3orfFK9Gm8d1YgvRtR3X5dN5zhRsP6RcNC26nc
hDN8cUf6sfSr13CTubp69cZP5mNoV4UJ1WoFnN8cS7qmZ+jQ324pxcJawH5y
1nk+JFcCK44Onz2V5Jh50YfOZjnXLUWp+x5pnV7fRw0RUpWDXfTSuJixw/W0
sXXGS7N0w9b5ezOaprvwd8PX3SCJdfm6OshcgrFrNr3h7H5T0LCaZLC21aZx
bte8+jUTnd5V6t0Sst8h9xtMn40eflQmrAxJjEEvHPTvoypq8ZSLNKn7DeZL
5P7J96ZcZqPTIs/Sf2DK6aqs5bW3+dO1uCLqgykBv5Tx8CidZoM0irqU6sCk
kYadwIZP4dQwGSImz57nZZlKPTxyU8Q6J1R2hClV+skyGm4HhsHLpOb1212O
aPktu/XOV1A3Pwg0ZASHvzX1czPdxMcwjUaYKVYTjD/s8SWqWQIuIMld5Pya
qku85XyXs/ycneZOGwUHI50RlSVI3qETMOdGdT50khXdpX2PTtCqXsGNXpyc
OvOksKjsUjcuDToqV5ROfz2fup0Wpu1frOTEos1XV3J28cJXUXHufB55Rz+9
jpO2/Ibxsb/dMD6XkpUF5Y3TcRB94FBbFwI057Uy5SCt4C4Qz5GWerH70G1B
XsWNSkBGXZ0WVBGrIveKqNO9os/CsFdepEh+cTVmHLplDNvJpQiyuDZGaEDK
tXMxrWkAvyQ74jeuYUgCDlvnRMCGK41gerlHKoAC1XQ/Bm8BA2Gp+WBC1d7s
y5a54O8lFsNKq+Uj+qpv2V/9V7HMiYXoJvOC/+muj+JdjWZT+z7mzfNv1Yoc
d72Dnd7P3n1bu9dV4+O14jX4s4D7cef+zu56gzW7aHt9nc3Sw9BfmHwLULS6
qLxO4nFQir61CM2zBO96jCElUiIt9mm/X12mYQc2UlMJI6a4OE5Zq+thaxZ5
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
A9GHZxdYzIbm/wcEN6heWtoBAA==

-->

</rfc>
