<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.12 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lindblad-netconf-transaction-id-01" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <front>
    <title abbrev="NCTID">Transaction ID Mechanism for NETCONF</title>
    <seriesInfo name="Internet-Draft" value="draft-lindblad-netconf-transaction-id-01"/>
    <author initials="J." surname="Lindblad" fullname="Jan Lindblad">
      <organization>Cisco Systems</organization>
      <address>
        <email>jlindbla@cisco.com</email>
      </address>
    </author>
    <date year="2021" month="October" day="22"/>
    <area>General</area>
    <workgroup>NETCONF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>NETCONF clients and servers often need to have a synchronized view of
the server's configuration data stores.  The volume of configuration 
data in a server may be very large, while data store changes typically
are small when observed at typical client resynchronization intervals.</t>
      <t>Rereading the entire data store and analyzing the response for changes
is an inefficient mechanism for synchronization.  This document 
specifies an extension to NETCONF that allows clients and servers to
keep synchronized with a much smaller data exchange and without any
need for servers to store information about the clients.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/janlindblad/netconf-transaction-id"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>When a NETCONF client connects with a NETCONF server, a frequently 
occurring use case is for the client to find out if the configuration 
has changed since it was last connected.  Such changes could occur for 
example if another NETCONF client has made changes, or another system 
or operator made changes through other means than NETCONF.</t>
      <t>One way of detecting a change for a client would be to 
retrieve the entire configuration from the server, then compare 
the result with a previously stored copy at the client side.  This 
approach is not popular with most NETCONF users, however, since it 
would often be very expensive in terms of communications and 
computation cost.</t>
      <t>Furthermore, even if the configuration is reported to be unchanged, 
that will not guarantee that the configuration remains unchanged 
when a client sends a subsequent change request, a few moments later.</t>
      <t>Evidence of a transaction id feature being demanded by clients is that 
several server implementors have built proprietary and mutually 
incompatible mechanisms for obtaining a transaction id from a NETCONF 
server.</t>
      <t>RESTCONF, <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>, 
defines a mechanism for detecting changes in configuration subtrees 
based on Entity-tags (ETags).  In conjunction with this, RESTCONF 
provides a way to make configuration changes conditional on the server
confiuguration being untouched by others.  This mechanism leverages 
<eref target="https://tools.ietf.org/html/rfc7232">RFC 7232</eref> 
"Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests".</t>
      <t>This document defines similar functionality for NETCONF, 
<eref target="https://tools.ietf.org/html/rfc6241">RFC 6241</eref>.</t>
    </section>
    <section anchor="conventions-and-definitions" numbered="true" toc="default">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="netconf-transaction-id-extension" numbered="true" toc="default">
      <name>NETCONF Transaction id Extension</name>
      <t>This document describes a NETCONF extension which modifies the 
behavior of get-config, get-data, edit-config, edit-data,
discard-changes, copy-config, delete-config and commit such
that clients are able to conditionally retrieve and update the 
configuration in a NETCONF server.  NETCONF servers that support 
this extension MUST announce the capability 
"urn:ietf:params:netconf:capability:txid:1.0".</t>
      <t>Several low level mechanisms could be defined to fulfill the 
requirements for efficient client-server transaction id 
synchronization.  This document defines only one mechanism, but 
additional mechanisms could be added in future versions of this 
document, or in separate documents.</t>
      <t>The common use cases for such mecahnisms are briefly discussed here.</t>
      <dl>
        <dt>
Initial configuration retrieval  </dt>
        <dd>
          <t>When the client initially connects to a server, it may be interested 
to acquire a current view of (parts of) the server's configuration.<br/>
In order to be able to efficiently detect changes later, it may also 
be interested to store meta level transaction id information about 
subtrees of the configuration.</t>
        </dd>
        <dt>
Subsequent configuration retrieval  </dt>
        <dd>
          <t>When a client needs to reread (parts of) the server's configuration, 
it may be interested to leverage the transaction id meta data it has 
stored by requesting the server to prune the response so that it does 
not repeat configuration data that the client is already aware of.</t>
        </dd>
        <dt>
Configuration update with transaction id return  </dt>
        <dd>
          <t>When a client issues a transaction towards a server, it may be 
interested to also learn the new transaction id meta data the server 
has stored for the updated parts of the configuration.</t>
        </dd>
        <dt>
Configuration update with transaction id specification  </dt>
        <dd>
          <t>When a client issues a transaction towards a server, it may be 
interested to also specify the new transaction id meta data that the 
server stores for the updated parts of the configuration.</t>
        </dd>
        <dt>
Conditional configuration update  </dt>
        <dd>
          <t>When a client issues a transaction towards a server, it may specify 
transaction id data for the transaction in order to allow the server to 
verify that the client is up to date with any changes in the parts of 
the configuration that it is concerned with.  If the transaction id 
information in the server is different than the client expected, the 
server rejects the transaction with a specific error message.</t>
        </dd>
      </dl>
      <section anchor="general-principles" numbered="true" toc="default">
        <name>General Principles</name>
        <t>All transaction id mechanisms SHALL maintain a transaction id value for 
each configuration datastore supported by the server.  Some transaction 
id mechanisms will also maintain transaction id values for elements 
deeper in the YANG data tree.  The elements for which the server 
maintains transaction ids are collectively referred to as the 
"versioned elements".</t>
        <t>The server returning transaction id values for the versioned elements 
MUST ensure the transaction id values are changed every time there has 
been a configuration change at or below the element associated with 
the value.  This means any update of a config true element will result 
in a new transaction id value for all ancestor versioned elements, up 
to and including the datastore root itself.</t>
        <t>This also means a server MUST update the transaction id value for any 
elements that change as a result of a configuration change, regardless 
of source, even if the changed elements are not explicitly part 
of the change payload. An example of this is dependent data under 
YANG <eref target="https://tools.ietf.org/html/rfc7950">RFC 7950</eref> when- or 
choice-statements.</t>
        <t>The server MUST NOT change the transaction id value of a versioned 
element unless a child element of that element has been changed.  The 
server MUST NOT change any transaction id values due to changes in 
config false data.</t>
      </section>
      <section anchor="conditional-transactions" numbered="true" toc="default">
        <name>Conditional Transactions</name>
        <t>Conditional transactions are useful when a client is interested to
make a configuration change, being sure that the server configuration
has not changed since the client last inspected it.</t>
        <t>By supplying the latest transaction id values known to the client
in its change requests (edit-config etc.), it can request the server 
to reject the transaction in case any relevant changes have occurred 
at the server that the client is not yet aware of.</t>
        <t>This allows a client to reliably compute and send confiuguration 
changes to a server without either acquiring a global datastore lock 
for a potentially extended period of time, or risk that a change 
from another client disrupts the intent in the time window between a 
read (get-config etc.) and write (edit-config etc.) operation.</t>
        <t>If the server rejects the transaction because the configuration 
transaction id value differs from the client's expectation, the 
server MUST return an rpc-error with the following values:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
   error-tag:      operation-failed
   error-type:     protocol
   error-severity: error
]]></artwork>
        <t>Additionally, the error-info tag SHOULD contain an sx:structure
containing relevant details about the mismatching transaction ids.</t>
      </section>
      <section anchor="other-netconf-operations" numbered="true" toc="default">
        <name>Other NETCONF Operations</name>
        <dl>
          <dt>
discard-changes  </dt>
          <dd>
            <t>The discard-changes operation resets the candidate datastore to the 
contents of the running datastore.  The server MUST ensure the 
transaction id values in the candidate datastore get the same values 
as in the running datastore when this operation runs.</t>
          </dd>
          <dt>
copy-config  </dt>
          <dd>
            <t>The copy-config operation can be used to copy contents between 
datastores.  The server MUST ensure the transaction id values retain 
the same values as in the soruce datastore.</t>
          </dd>
          <dt/>
          <dd>
            <t>If copy-config is used to copy from a file, URL or other source that 
is not a datastore, the server MUST ensure the transaction id values 
are changed.</t>
          </dd>
          <dt>
delete-config  </dt>
          <dd>
            <t>The server MUST ensure the datastore transaction id value is changed.</t>
          </dd>
          <dt>
commit  </dt>
          <dd>
            <t>At commit, with regards to the transaction id values, the server MUST 
treat the contents of the candidate datastore as if any transaction id 
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 transaction id value mismatch, 
an rpc-error as described in section
<xref target="conditional-transactions" format="default">Conditional Transactions</xref> MUST be sent.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="etag-transaction-id-mechanism" numbered="true" toc="default">
      <name>ETag Transaction id Mechanism</name>
      <section anchor="etag-attribute" numbered="true" toc="default">
        <name>ETag attribute</name>
        <t>Central to the ETag configuration retrieval and update mechanism 
described in the following sections is a meta data XML attribute 
called "etag".  The etag attribute is defined in the namespace 
"urn:ietf:params:xml:ns:netconf:txid:1.0".</t>
        <t>Servers MUST maintain a top-level etag value for each configuration 
datastore they implement.  Servers SHOULD maintain etag values for 
YANG containers that hold configuration for different subsystems.<br/>
Servers MAY maintain etag values for any YANG container or list 
element they implement.</t>
        <t>The etag attribute values are opaque UTF-8 strings chosen freely, 
except that the etag string must not contain space, backslash 
or double quotes. The point of this restriction is to make it easy to 
reuse implementations that adhere to section 2.3.1 in 
<eref target="https://tools.ietf.org/html/rfc7232">RFC 7232</eref>.  The probability 
SHOULD be made very low that an etag value that has been used 
historically by a server is used again by that server.</t>
        <t>The detailed rules for when to update the etag value are described in 
section <xref target="configuration-update" format="default">Configuration Update</xref>.  These rules 
are chosen to be consistent with the ETag mechanism in 
RESTCONF, <eref target="https://tools.ietf.org/html/rfc8040">RFC 8040</eref>, 
specifically sections 3.4.1.2, 3.4.1.3 and 3.5.2.</t>
      </section>
      <section anchor="configuration-retreival" numbered="true" toc="default">
        <name>Configuration Retreival</name>
        <t>Clients MAY request the server to return etag attribute values in the 
response by adding one or more etag attributes in get-config or 
get-data requests.</t>
        <t>The etag attribute may be added directly on the get-config or get-data 
requests, in which case it pertains to the entire datastore.  A client
MAY also add etag attributes to zero or more individual elements in 
the get-config or get-data filter, in which case it pertains to the
subtree rooted at that element.</t>
        <t>For each element that the client requests etag attributes, the server 
MUST return etags for all versioned elements at or below that point 
that are part of the server's respone.  ETags are returned as 
attributes on the element they pertain to.  The datastore root etag 
value is returned on the top-level data tag in the response.</t>
        <t>If the client is requesting an etag value for an element that is not 
among the server's versioned elements, then the server MUST return the 
etag attribute on the closest ancestor that is a versioned element, 
and all children of that ancestor.  The datastore root is always a 
versioned element.</t>
        <section anchor="initial-configuration-response" numbered="true" toc="default">
          <name>Initial Configuration Response</name>
          <t>When the client adds etag attributes to a get-config or get-data 
request, it should specify the last known etag values it has seen for 
the elements it is asking about.  Initially, the client will not know 
any etag value and should use "?".</t>
          <t>To retrieve etag attributes across the entire NETCONF server 
configuration, a client might send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config txid:etag="?"/>
</rpc>
]]></artwork>
          <t>To retrieve etag attributes for a specific interface using an xpath 
filter, a client might send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter type="xpath"
      xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces"
      select=
        "/if:interfaces/if:interface[if:name='GigabitEthernet-0/0']"
      txid:etag="?"/>
  </get-config>
</rpc>
]]></artwork>
          <t>To retrieve etag attributes for "ietf-interfaces", but not for "nacm",
a client might send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
        txid:etag="?"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></artwork>
          <t>When a NETCONF server receives a get-config or get-data request 
containing txid:etag attributes with the value "?", it MUST return 
etag attributes for all versioned elements below this point included 
in the reply.</t>
          <t>If the server considers the container "interfaces" and the list 
"interface" elements to be versioned elements, the server's response 
to the request above might look like:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="def88884321">
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
                txid:etag="def88884321">
      <interface txid:etag="def88884321">
        <name>GigabitEthernet-0/0</name>
        <description>Management Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
      <interface txid:etag="abc12345678">
        <name>GigabitEthernet-0/1</name>
        <description>Upward Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
    </interfaces>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></artwork>
        </section>
        <section anchor="configuration-response-pruning" numbered="true" toc="default">
          <name>Configuration Response Pruning</name>
          <t>A NETCONF client that already knows some etag 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 "ietf-interfaces" that do not have the 
last known etag value "abc12345678", but include the entire 
configuration for "nacm", regardless of etags, a client might send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter>
      <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
        txid:etag="abc12345678"/>
      <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
    </filter>
  </get-config>
</rpc>
]]></artwork>
          <t>When a NETCONF server receives a get-config or get-data request 
containing an element with a client specified etag attribute, there 
are several different cases:</t>
          <ul spacing="normal">
            <li>The element is not a versioned element, i.e. the server does not 
maintain an etag value for this element.  In this case, the server 
MUST look up the closest ancestor that is a versioned element, and 
proceed as if the client had specified the etag value for that 
element.</li>
            <li>The element is a versioned element, and the client specified etag 
attribute value is different than the server's etag value for this
element.  In this case the server MUST return the contents as it would 
otherwise have done, adding the etag attributes of all child versioned 
elements to the response.  In case the client has specified etag 
attributes for some child elements, then these cases MUST be 
re-evaluated for those elements.</li>
            <li>The element is a versioned element, and the client specified etag 
attribute value matches the server's etag value.  In this case the 
server MUST return the element decorated with an etag attribute with 
the value "=", and child elements pruned.</li>
          </ul>
          <t>For list elements, pruning child elements means that key elements 
MUST be included in the response, and other child elements MUST NOT be 
included.  For containers, child elements MUST NOT be included.</t>
          <t>For example, assuming the NETCONF server configuration is the same as 
in the previous rpc-reply example, the server's response to request 
above might look like:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="def88884321">
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
                txid:etag="def88884321">
      <interface txid:etag="def88884321">
        <name>GigabitEthernet-0/0</name>
        <description>Management Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
      <interface txid:etag="=">
        <name>GigabitEthernet-0/1</name>
      </interface>
    </interfaces>
    <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"/>
      <groups>
        <group>
          <name>admin</name>
          <user-name>sakura</user-name>
          <user-name>joe</user-name>
        </group>
      </groups>
    </nacm>
  </data>
</rpc>
]]></artwork>
        </section>
      </section>
      <section anchor="configuration-update" numbered="true" toc="default">
        <name>Configuration Update</name>
        <t>Whenever the configuration on a server changes for any reason, the 
server MUST update the etag value for all versioned elements that 
have children that changed.</t>
        <t>If the change is due to a NETCONF client edit-config or edit-data 
request that includes the ietf-netconf-txid:with-etag presence 
container, the server MUST return the etag value of the targeted 
datastore as an attribute on the XML ok tag in the rpc-reply.</t>
        <t>The server MUST NOT change the etag value of a versioned element 
unless a child element of that element has been changed.  The server 
MUST NOT change any etag values due to changes in config false data.</t>
        <t>How the server selects a new etag value to use for the changed
elements is described in section <xref target="etag-attribute" format="default">ETag attribute</xref>.</t>
        <t>For example, if a client wishes to update the interface description
for interface "GigabitEthernet-0/1" to "Downward Interface", it might 
send:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
  <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>
      <candidate/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag/>
    <config>
      <interfaces 
        xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
        <interface>
          <name>GigabitEthernet-0/1</name>
          <description>Downward Interface</description>
        </interface>
      </interfaces>
    </config>
  </edit-config>
</rpc>
]]></artwork>
        <t>The server would update the description leaf in the candidate 
datastore, and return an rpc-reply as follows:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="ghi55550101"/>
</rpc-reply>
]]></artwork>
        <t>A subsequent get-config request for "ietf-interfaces", with 
txid:etag="?" might then return:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="ghi55550101">
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
                txid:etag="ghi55550101">
      <interface txid:etag="def88884321">
        <name>GigabitEthernet-0/0</name>
        <description>Management Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
      <interface txid:etag="ghi55550101">
        <name>GigabitEthernet-0/1</name>
        <description>Downward Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
    </interfaces>
  </data>
</rpc>
]]></artwork>
        <t>In case the server at this point received a configuration change from 
another source, such as a CLI operator, adding an MTU value for the 
interface "GigabitEthernet-0/0", a subsequent get-config request for 
"ietf-interfaces", with txid:etag="?" might then return:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="cli22223333">
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
                txid:etag="cli22223333">
      <interface txid:etag="cli22223333">
        <name>GigabitEthernet-0/0</name>
        <description>Management Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
        <mtu>768</mtu>
      </interface>
      <interface txid:etag="ghi55550101">
        <name>GigabitEthernet-0/1</name>
        <description>Downward Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
    </interfaces>
  </data>
</rpc>
]]></artwork>
        <section anchor="conditional-configuration-update" numbered="true" toc="default">
          <name>Conditional Configuration Update</name>
          <t>When a NETCONF client sends an edit-config or edit-data request to a
NETCONF server that implements this specification, the client MAY 
specify expected etag values on the versioned elements touched by the
transaction.</t>
          <t>If such an etag value differs from the etag value stored on the 
server, the server MUST reject the transaction and return an rpc-error 
as specified in section 
<xref target="conditional-transactions" format="default">Conditional Transactions</xref>.</t>
          <t>Additionally, the error-info tag MUST contain an sx:structure
etag-value-mismatch-error-info as defined in the module 
ietf-netconf-txid, with mismatch-path set to the instance identifier 
value identifying one of the versioned elements that had an etag value 
mismatch, and mismatch-etag-value set to the server's current value of 
the etag attribute for that versioned element.</t>
          <t>For example, if a client wishes to delete the interface 
"GigabitEthernet-0/1" 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 "ghi55550101"), 
regardless of any possible changes to other interfaces, it might send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"
     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>
      <candidate/>
    </target>
    <test-option>test-then-set</test-option>
    <ietf-netconf-txid:with-etag/>
    <config>
      <interfaces 
        xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
        <interface nc:operation="delete" 
                   txid:etag="ghi55550101">
          <name>GigabitEthernet-0/1</name>
        </interface>
      </interfaces>
    </config>
  </edit-config>
</rpc>
]]></artwork>
          <t>If interface "GigabitEthernet-0/1" has the etag value "ghi55550101",
as expected by the client, the transaction goes through, and the 
server responds something like:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="xyz77775511"/>
</rpc-reply>
]]></artwork>
          <t>A subsequent get-config request for "ietf-interfaces", with 
txid:etag="?" might then return:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
           xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <data txid:etag="xyz77775511">
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"
                txid:etag="xyz77775511">
      <interface txid:etag="def88884321">
        <name>GigabitEthernet-0/0</name>
        <description>Management Interface</description>
        <type>ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
      </interface>
    </interfaces>
  </data>
</rpc-reply>
]]></artwork>
          <t>In case interface "GigabitEthernet-0/1" did not have the expected etag 
value "ghi55550101", the server rejects the transaction, and might 
send:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" 
           xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces"
           xmlns:ietf-netconf-txid=
             "urn:ietf:params:xml:ns:yang:ietf-netconf-txid">
           message-id="1">
  <rpc-error>
    <error-type>protocol</error-type>
    <error-tag>operation-failed</error-tag>
    <error-severity>error</error-severity>
    <error-info>
      <ietf-netconf-txid:etag-value-mismatch-error-info>
        <ietf-netconf-txid:mismatch-path>
          /if:interfaces/if:interface[if:name="GigabitEthernet-0/0"]
        </ietf-netconf-txid:mismatch-path>
        <ietf-netconf-txid:mismatch-etag-value>
          cli22223333
        </ietf-netconf-txid:mismatch-etag-value>
      </ietf-netconf-txid:etag-value-mismatch-error-info>
    </error-info>
  </rpc-error>
</rpc-reply>
]]></artwork>
        </section>
      </section>
      <section anchor="etags-with-other-netconf-operations" numbered="true" toc="default">
        <name>ETags with Other NETCONF Operations</name>
        <t>The following NETCONF Operations also need some special considerations.</t>
        <dl>
          <dt>
discard-changes  </dt>
          <dd>
            <t>The server MUST ensure the etag attributes in the candidate 
datastore get the same values as in the running datastore when this 
operation runs.</t>
          </dd>
          <dt>
copy-config  </dt>
          <dd>
            <t>The server MUST ensure the etag attributes retain the same values as 
in the soruce datastore.</t>
          </dd>
          <dt/>
          <dd>
            <t>If copy-config is used to copy from a source that is not a datastore, 
the server MUST ensure etags are given new values.</t>
          </dd>
          <dt>
delete-config  </dt>
          <dd>
            <t>The server MUST ensure the datastore etag is given a new value.</t>
          </dd>
          <dt>
commit  </dt>
          <dd>
            <t>At commit, with regards to the etag values, the server MUST treat the 
contents of the candidate datastore as if any etag attributes provided
by the client were provided in a single edit-config towards the 
running datastore.  If the commit is rejected due to etag mismatch, 
the rpc-error message specified in section 
<xref target="conditional-configuration-update" format="default">Conditional Configuration Update</xref>
MUST be sent.</t>
          </dd>
        </dl>
        <t>The client MAY request that the new etag value is returned as an 
attribute on the ok response for a successful commit.  The client 
requests this by adding with-etag to the commit operation.</t>
        <t>For example, a client might send:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc message-id="1"
    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/>
  </commit>
</rpc>
]]></artwork>
        <t>Assuming the server accepted the transaction, it might respond:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
<rpc-reply message-id="1"
    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
    xmlns:txid="urn:ietf:params:xml:ns:netconf:txid:1.0">
  <ok txid:etag="ghi55550101"/>
</rpc-reply>
]]></artwork>
      </section>
    </section>
    <section anchor="yang-modules" numbered="true" toc="default">
      <name>YANG Modules</name>
      <sourcecode type="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;
  }

  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) 2021 IETF Trust and the persons identified as
     the document authors.  All rights reserved.

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

     This version of this YANG module is part of RFC XXXX; see
     the RFC itself for full legal notices.";

  revision 2021-11-01 {
    description
      "Initial revision";
    reference
      "RFC XXXX: Xxxxxxxxx";
  }

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

  grouping transaction-id-grouping {
    container with-etag {
      presence 
        "Indicates that the client requests the server to include a
         txid:etag transaction id in the rpc-reply";
    }
    description
      "Grouping for transaction id mechanisms, to be augmented into 
       rpcs that modify configuration data stores.";
  }

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

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

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

  sx:structure etag-value-mismatch-error-info {
    container etag-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 value.";
      }
      leaf mismatch-etag-value {
        type etag-t;
        description
          "Indicates server's value of the etag attribute for one
           mismatching element.";
      }
    }
  }
}
]]></sourcecode>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document registers the following capability identifier URN in
the 'Network Configuration Protocol (NETCONF) Capability URNs' 
registry:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  urn:ietf:params:netconf:capability:txid:1.0
]]></artwork>
      <t>This document registers two XML namespace URNs in the 'IETF XML
registry', following the format defined in 
<eref target="https://tools.ietf.org/html/rfc3688">RFC 3688</eref>.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
  URI: urn:ietf:params:xml:ns:netconf:txid:1.0

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

  Registrant Contact: The NETCONF WG of the IETF.

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

  prefix: ietf-netconf-txid

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

  RFC: XXXX
]]></artwork>
    </section>
    <section anchor="changes" numbered="true" toc="default">
      <name>Changes</name>
      <section anchor="major-changes-in-01-since-00" numbered="true" toc="default">
        <name>Major changes in -01 since -00</name>
        <ul spacing="normal">
          <li>Updated the text on numerous points in order to answer questions 
that appeared on the mailing list.</li>
          <li>Changed the document structure into a general transaction id part 
and one etag specific part.</li>
          <li>Renamed entag attribute to etag, prefix to txid, namespace to
urn:ietf:params:xml:ns:yang:ietf-netconf-txid.</li>
          <li>Set capability string to
urn:ietf:params:netconf:capability:txid:1.0</li>
          <li>Changed YANG module name, namespace and prefix to match names above.</li>
          <li>Harmonized/slightly adjusted etag value space with RFC 7232 and 
RFC 8040.</li>
          <li>Removed all text discussing etag values provided by the client 
(although this is still an interesting idea, if you ask the author)</li>
          <li>Clarified the etag attribute mechanism, especially when it comes to
matching against non-versioned elements, its cascading upwards in the 
tree and secondary effects from when- and choice-statements.</li>
          <li>Added a mechanism for returning the server assigned etag value in
get-config and get-data.</li>
          <li>Added section describing how the NETCONF discard-changes, 
copy-config, delete-config and commit operations work with respect to 
etags.</li>
          <li>Added IANA Considerations section.</li>
          <li>Removed all comments about open questions.</li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba">
            <organization/>
          </author>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>The author wishes to thank Benoit Claise for making this work happen,
and the following individuals, who all provided helpful comments:
Per Andersson, Kent Watsen, Andy Bierman, Robert Wilton, Qiufang Ma.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
