<?xml version="1.0" encoding="utf-8"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
    which is available here: http://xml.resource.org. -->

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-westphal-lsr-isis-database-checksumming-01" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" version="3">

    <!-- ***** FRONT MATTER ***** -->

    <front>

        <title>IS-IS Database Fingerprinting</title>

        <author initials='R.' surname='Westphal' fullname='Renato Westphal'>
            <organization>NetDEF</organization>
            <address>
                <email>renato@netdef.org</email>
            </address>
        </author>

        <author initials='T.' surname='Przygienda' fullname='Tony Przygienda'>
            <organization>HPE Juniper Networking</organization>
            <address>
                <email>antoni.przygienda@hpe.com</email>
            </address>
        </author>

        <date/>

        <abstract>

            <t>
                In large IS-IS networks it is useful to quickly verify whether the link-state
                databases on all routers have synchronized properly and to derive a rough metric
                of flooding diffusion behavior. This document proposes a lightweight database
                fingerprinting mechanism for IS-IS along with YANG model extensions providing
                easy access to such information. For fast verification against a peer, an
                optional TLV carrying the database fingerprint is defined for inclusion in
                IIH and CSNP PDUs.
            </t>

        </abstract>

    </front>

    <middle>

        <section title="Introduction" anchor="intro">
            <t>
                In large IS-IS networks in stable state it is useful to observe
                whether all databases have synchronized properly and derive the delays involved
                in the propagation of information across the network.
            </t>
            <t>
                This document defines a database fingerprinting mechanism that allows for quick
                validation of database synchronization across all nodes. A node implementing this
                specification computes a fingerprint over all fragments per level. Alongside the
                fingerprint itself, the node reports the time elapsed since the fingerprint value
                last changed, i.e. since the most recent recomputation that produced a value
                differing from the previous one. This facilitates measurement of flooding
                behavior across the network.
            </t>
            <t>
                LSPs whose Remaining Lifetime is zero (including purged LSPs being retained
                for ZeroAgeLifetime <xref target="ISO10589"/>) <bcp14>MUST</bcp14> be excluded
                from the fingerprint calculation.
            </t>
            <t>
                A reference checksum algorithm for a fragment is given in <xref target="csum_algo"/>. The overall fingerprint
                is the XOR of all fragment checksums.
            </t>
        </section>

        <section title="Requirements Language" anchor="reqlang">
            <t>
                The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
                "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
                "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
                "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
                "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
                interpreted as described in BCP 14 <xref target="RFC2119"/>
                <xref target="RFC8174"/> when, and only when, they appear in all capitals, as
                shown here.
            </t>
        </section>

        <section title="IS-IS Database Fingerprint TLV" anchor="fp_tlv">
            <t>
                To allow routers to rapidly detect link-state database synchronization
                differences directly with neighbors without waiting for or exchanging full
                CSNPs, this document defines an optional top-level IS-IS TLV: the Database
                Fingerprint TLV.
            </t>
            <t>
                The Database Fingerprint TLV <bcp14>MAY</bcp14> be included in the following
                PDU types:
            </t>
            <ul>
                <li>Level 1 LAN IS-to-IS Hello PDU <xref target="ISO10589"/></li>
                <li>Level 2 LAN IS-to-IS Hello PDU <xref target="ISO10589"/></li>
                <li>Point-to-Point IS-to-IS Hello PDU <xref target="ISO10589"/></li>
                <li>Complete Sequence Numbers PDU (CSNP) <xref target="ISO10589"/></li>
            </ul>
            <t>
                The format of the Database Fingerprint TLV is shown in <xref target="fp_tlv_fig"/>.
            </t>

            <figure anchor="fp_tlv_fig">
                <name>Database Fingerprint TLV Format</name>
                <artwork align="left" name="" type="" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Type (TBA)   | Length (10/14)|     Level     |   Reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Database Fingerprint                      |
|                           (64 bits)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Last Update (optional, 32 bits)                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
            </figure>

            <dl newline="false" spacing="normal">
                <dt>Type:</dt>
                <dd>TBA (1 octet), to be allocated by IANA from the "IS-IS Top-Level TLV Codepoints" registry.</dd>
                <dt>Length:</dt>
                <dd>
                    10 or 14 octets. The Length field indicates whether the optional Last Update
                    field is present: 10 octets indicates only the Level, Reserved, and Database
                    Fingerprint fields are present; 14 octets indicates the optional 4-octet (32-bit)
                    Last Update field is also present.
                </dd>
                <dt>Level:</dt>
                <dd>
                    1 octet indicating the IS-IS level for the fingerprint: 1 for Level 1,
                    or 2 for Level 2. Values other than 1 and 2 are reserved and <bcp14>MUST</bcp14>
                    be ignored on receipt. In LAN Hello PDUs, the Level field <bcp14>MUST</bcp14>
                    match the level of the LAN Hello PDU. In Point-to-Point Hello PDUs, a router
                    <bcp14>MAY</bcp14> include up to two instances of this TLV (one for Level 1
                    and one for Level 2).
                </dd>
                <dt>Reserved:</dt>
                <dd>1 octet. <bcp14>MUST</bcp14> be set to 0 on transmission and ignored on receipt.</dd>
                <dt>Database Fingerprint:</dt>
                <dd>64-bit (8 octets) fingerprint for the specified level in network byte order, computed as defined in this document.</dd>
                <dt>Last Update:</dt>
                <dd>
                    Optional 32-bit (4 octets) unsigned integer in network byte order indicating
                    the time elapsed, in seconds, since the fingerprint value for this level's
                    LSDB was last changed. This provides the in-band equivalent of the YANG
                    <tt>last-update</tt> leaf. Its presence is indicated by the TLV Length being
                    set to 14.
                </dd>
            </dl>

            <t>
                When a router receives an IS-IS Hello PDU containing a Database Fingerprint TLV
                for a given level, it <bcp14>MAY</bcp14> compare the received fingerprint value
                against its locally computed fingerprint for that level. If the fingerprints
                match, the link-state databases for that level are verified to be synchronized.
                If the fingerprints differ, normal IS-IS database synchronization procedures
                (e.g., CSNP and PSNP exchanges) continue as specified in <xref target="ISO10589"/>.
            </t>
        </section>

        <section title="Yang Extensions for Database Fingerprint">

            <section title="Tree for the YANG Data Model">
              <t>This document uses the graphical representation of data models per <xref target="RFC8340"/>.</t>
              <t>The following shows the tree diagram of the module:</t>
	      <artwork align="left" name="" type="" alt=""><![CDATA[
      module: ietf-isis-db-fingerprint

        augment /rt:routing/rt:control-plane-protocols
                  /rt:control-plane-protocol/isis:isis
                  /isis:database/isis:levels:
          +--ro fingerprint
             +--ro value?         uint64
             +--ro last-update?   uint32
              ]]></artwork>
            </section>

      <section title="YANG Data Model">
        <t>
            The module augments the IS-IS YANG data model <xref target="RFC9130"/>, which in
            turn builds on the routing management model <xref target="RFC8349"/>. The
            fingerprint state is added under the IS-IS LSDB, which is defined as operational
            state, and therefore all nodes defined by this augmentation are operational state
            as well.
        </t>
        <t>The following is the YANG module:</t>
        <sourcecode name="ietf-isis-db-fingerprint@2026-10-13.yang" type="" markers="true"><![CDATA[
module ietf-isis-db-fingerprint {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-isis-db-fingerprint";
  prefix isis-db-fp;

  import ietf-routing {
    prefix rt;
    reference
      "RFC 8349: A YANG Data Model for Routing
       Management (NMDA Version)";
  }
  import ietf-isis {
    prefix isis;
    reference
      "RFC 9130: YANG Data Model for the IS-IS Protocol";
  }

  organization
    "IETF LSR - LSR Working Group";
  contact
    "WG Web:   <https://datatracker.ietf.org/wg/lsr>
     WG List:  <mailto:lsr@ietf.org>

     Author:    Renato Westphal
               <renato@netdef.org>
     Author:    Tony Przygienda
               <mailto:antoni.przygienda@hpe.com>
    ";
  description
    "The YANG module augments the base IS-IS YANG data model with
     operational state related to IS-IS LSDB fingerprinting.

     Copyright (c) 2026 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.";
  reference
    "RFC XXXX: IS-IS Database Fingerprinting";

  revision 2026-10-13 {
    description
      "Initial Version";
    reference
      "RFC XXXX: IS-IS Database Fingerprinting";
  }

  /* LSDB fingerprint */

  augment "/rt:routing/rt:control-plane-protocols/"
        + "rt:control-plane-protocol/isis:isis/isis:database/"
        + "isis:levels" {
    when "derived-from-or-self(../../../rt:type, 'isis:isis')" {
      description
        "This augment ISIS routing protocol when used";
    }
    description
      "Augments the IS-IS LSDB with the per-level database
       fingerprint.";
    container fingerprint {
      description
        "Information about the LSDB fingerprint for this level.";
      leaf value {
        type uint64;
        description
          "A 64-bit fingerprint derived from the set of LSPs at this
           level.

           The fingerprint is computed by XOR-combining a per-LSP
           component value for each LSP whose Remaining Lifetime is
           non-zero. LSPs whose Remaining Lifetime is zero (including
           purged LSPs retained during ZeroAgeLifetime) MUST be
           excluded from the calculation. The per-LSP component value
           is derived from the LSP identifier, the LSP checksum, and
           the LSP length, as specified in Appendix A of RFC XXXX.

           The fingerprint is intended for detecting potential LSDB
           synchronization differences. Different values indicate
           different LSDB contents; identical values do not guarantee
           equivalence due to possible collisions.";
      }
      leaf last-update {
        type uint32;
        units "seconds";
        description
          "Time elapsed since the fingerprint value for this level's
           LSDB last changed.

           The fingerprint is recomputed whenever the contents of the
           level's LSDB change. This leaf is reset to zero only when
           such a recomputation yields a value that differs from the
           previously computed one. A recomputation that yields the
           same value does not reset this leaf.";
      }
    }
  }
}
        ]]></sourcecode>
      </section>

        </section>

        <section title="Operational Considerations" anchor="operations">
            <t>
                The database fingerprint mechanism and the reported elapsed time
                (<tt>last-update</tt>) are intended to observe general database synchronization
                and propagation delays across the network in stable state. Measurement of
                flooding diffusion or synchronization events at sub-second granularity
                (under 1 second) is not intended by this specification.
            </t>
            <t>
                The database fingerprint mechanism assumes that nodes within the same flooding
                domain synchronize identical sets of Link State PDUs (LSPs). If LSP flooding
                is filtered or constrained for any reason (for example, due to policy-based
                flooding filters, mesh groups, or topology reduction mechanisms), the link-state
                databases on nodes separated by such filtering will not contain the same set
                of LSPs.
            </t>
            <t>
                Consequently, the computed fingerprint values will not be the same on both
                sides of the filtering boundary. Operators and network management systems
                must take any intentional flooding asymmetry or filtering into account when
                comparing database fingerprints between nodes, as a mismatch under these
                conditions does not indicate a protocol failure or synchronization defect.
            </t>
        </section>

        <section title="IANA Considerations" anchor="iana">

            <section title="IS-IS Top-Level TLV Codepoints Registry">
                <t>
                    This document requests that IANA allocate a new codepoint from the
                    "IS-IS Top-Level TLV Codepoints" registry:
                </t>
                <artwork align="left" name="" type="" alt=""><![CDATA[
   Value:     TBA
   Name:      Database Fingerprint
   IIH:       Y
   LSP:       N
   SNP:       Y
   Purge:     N
   Reference: RFC XXXX
]]></artwork>
            </section>

            <section title="IETF XML Registry">
                <t>
                    This document requests the registration of one URI in the "IETF XML Registry"
                    <xref target="RFC3688"/>. Following the format in <xref target="RFC3688"/>, the
                    following registration is requested:
                </t>

                <artwork align="left" name="" type="" alt=""><![CDATA[
   URI: urn:ietf:params:xml:ns:yang:ietf-isis-db-fingerprint
   Registrant Contact: The IESG.
   XML: N/A, the requested URI is an XML namespace.
]]></artwork>
            </section>

            <section title="YANG Module Names Registry">
                <t>
                    This document requests the registration of one YANG module in the "YANG Module
                    Names" registry <xref target="RFC6020"/>:
                </t>

                <artwork align="left" name="" type="" alt=""><![CDATA[
   Name:      ietf-isis-db-fingerprint
   Namespace: urn:ietf:params:xml:ns:yang:ietf-isis-db-fingerprint
   Prefix:    isis-db-fp
   Reference: RFC XXXX
]]></artwork>
            </section>

        </section>

        <section title="Security Considerations" anchor="security">
            <t>
                The fingerprint mechanism defined in this document is purely informational and
                does not influence protocol behavior. It does not introduce new attack vectors
                beyond those inherent in IS-IS itself. The fingerprint value is derived from
                information already present in the LSDB and does not leak additional data.
            </t>
        </section>

        <section title="Acknowledgments">
            <t>TBD</t>
        </section>

    </middle>

    <back>


        <references title="Normative References">

            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml'/>
            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3688.xml'/>
            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6020.xml'/>
            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml'/>
            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8349.xml'/>
            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9130.xml'/>

            <reference anchor="ISO10589">
                <front>
                    <title>Intermediate system to Intermediate system intra-domain
                        routeing information exchange protocol for use in conjunction with
                        the protocol for providing the connectionless-mode Network Service
                        (ISO 8473)
                    </title>
                    <author>
                        <organization abbrev="ISO">International Organization for Standardization</organization>
                    </author>
                    <date month="Nov" year="2002"/>
                </front>
                <seriesInfo name="ISO/IEC" value="10589:2002, Second Edition"/>
            </reference>

        </references> <!-- end of normative references -->

        <references title="Informative References">

            <xi:include href='https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8340.xml'/>

        </references> <!-- end of informative references -->

        <section title="Checksum Reference Algorithm" anchor="csum_algo">

            <figure>
                <artwork align="center" name="" type="" alt=""><![CDATA[
<CODE BEGINS>
    pub(crate) fn lsdb_fingerprint_component(&self) -> u64 {
        let mut result: u64 = 0;
        let system_id: &[u8] = self.lsp_id.system_id.as_ref();
        // The LSP ID (system ID + pseudonode ID + fragment number)
        // MUST be folded in full. Omitting the fragment number byte
        // would make every fragment of a given system/pseudonode
        // contribute the same value here, leaving the checksum and
        // length fields below as the only differentiators between
        // fragments; two fragments whose checksum and length happen
        // to agree (or whose combined XOR happens to cancel across
        // the LSDB) would then be indistinguishable to the
        // fingerprint, silently defeating its purpose.
        for i in system_id
            .iter()
            .chain(&[self.lsp_id.pseudonode, self.lsp_id.fragment])
        {
            result <<= 8;
            result ^= *i as u64;
        }
        // fragment checksum
        result ^= (self.cksum as u64) << 48;
        // This is equal to the PDU length advertised by the fragment
        result ^= (self.raw.len() as u64) << 32;
        result
    }
<CODE ENDS>
]]></artwork>
            </figure>

        </section>

    </back>

</rfc>
