<?xml version="1.0" encoding="US-ASCII"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- used by XSLT processors -->
<!-- OPTIONS, known as processing instructions (PIs) go here. -->
<!-- For a complete list and description of PIs,
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable PIs that most I-Ds might want to use. -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC): -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="3"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references: -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space:
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of popular PIs -->
<rfc category="exp" docName="draft-ietf-pce-state-sync-16" ipr="trust200902"
     obsoletes="" sortRefs="true" submissionType="IETF" symRefs="true"
     tocDepth="3" tocInclude="true" updates="" version="3" xml:lang="en">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->

  <front>
    <title abbrev="PCE State-Sync">State Synchronization Procedures between Stateful Path Computation Elements (PCEs)</title>

    <seriesInfo name="Internet-Draft" value="draft-ietf-pce-state-sync-16"/>

    <author fullname="Haomian Zheng" initials="H." surname="Zheng" role="editor">
      <organization>Huawei Technologies</organization>

      <address>
        <postal>
          <street>H1, Huawei Xiliu Beipo Village, Songshan Lake</street>

          <city>Dongguan</city>

          <region>Guangdong</region>

          <code>523808</code>

          <country>China</country>
        </postal>

        <phone/>

        <email>zhenghaomian@huawei.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Stephane Litkowski" initials="S" surname="Litkowski">
      <organization>Cisco</organization>

      <address>
        <!-- postal><street/><city/><region/><code/><country/></postal -->

        <!-- <phone/> -->

        <!-- <facsimile/> -->

        <email>slitkows.ietf@gmail.com</email>

        <!-- <uri/> -->
      </address>
    </author>

    <author fullname="Siva Sivabalan" initials="S." surname="Sivabalan">
      <organization>Ciena Corporation</organization>

      <address>
        <postal>
          <street/>

          <city/>

          <region/>

          <code/>

          <country/>
        </postal>

        <email>msiva282@gmail.com</email>
      </address>
    </author>

    <author fullname="Cheng Li" initials="C" surname="Li">
      <organization>Huawei Technologies</organization>

      <address>
        <postal>
          <street>Huawei Campus, No. 156 Beiqing Rd.</street>

          <city>Beijing</city>

          <region/>

          <code>100095</code>

          <country>China</country>
        </postal>

        <email>c.l@huawei.com</email>
      </address>
    </author>

    <author fullname="Daniel King" initials="D." surname="King">
      <organization>Old Dog Consulting</organization>

      <address>
        <email>daniel@olddog.co.uk</email>
      </address>
    </author>

    <date/>

    <area>Routing</area>

    <workgroup>PCE Working Group</workgroup>

    <!-- <keyword/> -->

    <abstract>
      <t>The Path Computation Element (PCE) Communication Protocol (PCEP)
      provides mechanisms for PCEs to perform path computation in response to
      a Path Computation Client (PCC) request. The stateful PCE extensions
      allow a PCE to maintain and control the state of Label Switched Paths
      (LSPs) using PCEP, independent of the path setup type used.</t>

      <t>A PCC can synchronize LSP state information to a stateful PCE, and
      can have PCEP sessions toward multiple PCEs. In some deployments,
      synchronizing LSP state directly between the stateful PCEs brings
      additional resiliency, for instance when a PCC-PCE session fails, and
      allows a single PCE to compute paths for a set of LSPs that are
      dependent on each other even when those LSPs are delegated to different
      PCEs.</t>

      <t>This document describes procedures for synchronizing LSP state
      between stateful PCEs across various deployment scenarios and for
      preventing computation loops. It is published as Experimental to
      gather implementation and deployment experience.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>

      <t>The Path Computation Element communication Protocol (PCEP) <xref
      format="default" target="RFC5440"/> provides mechanisms for Path
      Computation Elements (PCEs) to perform path computations in response to
      Path Computation Clients' (PCCs) requests.</t>

      <t>A stateful PCE <xref format="default" target="RFC8231"/> is capable
      of considering, for the purposes of path computation, not only the
      network state in terms of links and nodes (referred to as the Traffic
      Engineering Database or TED), but also the status of active services
      (previously computed paths), and currently reserved resources, stored in
      the Label Switched Paths Database (LSP-DB).</t>

      <t><xref format="default" target="RFC8051"/> describes general
      considerations for a stateful PCE deployment and examines its
      applicability and benefits, as well as its challenges and limitations
      through a number of use cases.</t>

      <t>A PCC can synchronize LSP state information to a stateful PCE. The
      stateful PCE extensions allow a redundancy scenario where a PCC can have
      redundant PCEP sessions toward multiple PCEs. In such a case, a PCC
      gives control of an LSP to a single PCE, and only one PCE is
      responsible for path computation for this delegated LSP. <xref
      format="default" target="RFC8231"/> does not specify any procedures for
      the exchange of LSP state between the PCEs themselves.</t>

      <t>This document describes procedures for synchronizing LSP state
      between peer stateful PCEs across various deployment scenarios, and
      for preventing computation loops. This is distinct from the
      communication between a child PCE and a parent PCE in the
      Hierarchical PCE architecture <xref format="default"
      target="RFC8751"/> (see <xref target="H-PCE"/>). The procedures
      apply to LSPs of any path setup type <xref format="default"
      target="RFC8408"/>. The problem is described in <xref
      target="problem"/>, the solution is outlined in <xref
      target="solution"/>, and the procedures and protocol extensions are
      specified in <xref target="procedures"/>.</t>

      <t>This document is published as Experimental. The computation
      priorities that determine which PCE computes are provisioned by the
      operator rather than advertised in PCEP, and each PCE decides on
      sub-delegation from its own view of the other PCEs. With two PCEs, both
      have the
      same view. With three or more, a PCE cannot observe the sessions
      between the other PCEs, so their views may differ for a time.
      In that case the computation may be less optimal, but no loop can
      occur (<xref target="failures"/>). There are no known
      implementations. The purpose of the experiment is to find out
      whether this approach is sufficient for sets of more than two PCEs, or
      whether the priorities need to be advertised in PCEP together with an
      explicit role change procedure. Deployments SHOULD keep the set of
      synchronised PCEs as small as their redundancy or scaling objective
      allows (<xref target="ops-design"/>).</t>

      <section anchor="Language" numbered="true" toc="default">
        <name>Requirements Language</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 format="default" target="RFC2119"/> <xref format="default"
        target="RFC8174"/> when, and only when, they appear in all capitals,
        as shown here.</t>
      </section>

      <section anchor="terminology" numbered="true" toc="default">
        <name>Terminology</name>

        <t>This document uses the terminology defined in <xref
        format="default" target="RFC5440"/>, <xref format="default"
        target="RFC8231"/>, and <xref format="default" target="RFC8232"/>.
        In addition, the following terms are used:</t>

        <dl spacing="normal">
          <dt>State-sync session:</dt>
          <dd>A PCEP session between two stateful PCEs for which the
          state-sync capability (<xref target="open"/>) has been
          negotiated and to which the procedures in this document
          apply.</dd>

          <dt>State-sync PCE set:</dt>
          <dd>A set of stateful PCEs connected by a full mesh of
          state-sync sessions, sharing LSP state for the same set of PCCs,
          LSPs, or association groups.</dd>

          <dt>Delegated PCE:</dt>
          <dd>The PCE to which a PCC has delegated an LSP (D flag set in
          the PCRpt sent by the PCC) <xref format="default"
          target="RFC8231"/>. The PCC interacts only with this PCE for
          that LSP.</dd>

          <dt>Sub-delegation:</dt>
          <dd>A delegated PCE passing control of an LSP to another
          PCE in the state-sync PCE set over a state-sync session, by setting
          the D flag in the forwarded PCRpt (<xref
          target="priority"/>). Sub-delegation is not visible to the
          PCC.</dd>

          <dt>Computing PCE:</dt>
          <dd>For a given LSP, PCC, or association group, the PCE with the
          highest computation priority (<xref target="priority"/>) among
          the reachable members of the state-sync PCE set. It computes paths for
          those LSPs, whether delegated directly by the PCC or
          sub-delegated by another PCE.</dd>

          <dt>Backup PCE:</dt>
          <dd>Any PCE in the state-sync PCE set other than the computing
          PCE. A backup PCE collects and forwards state and can take over
          computation according to its computation priority.</dd>
        </dl>
      </section>
    </section>

    <section anchor="problem" numbered="true" toc="default">
      <name>Problem Statement</name>

      <t>There are some use cases where inter-PCE state synchronization
      can bring additional resiliency to the design, for instance, when some
      PCC-PCE session fails. The inter-PCE state synchronization may also
      provide a faster update of the LSP state when such an event occurs.
      When, in a redundant PCE scenario, there is a need to compute a set of
      paths that are part of a group (so there is a dependency between the
      paths), there may be some cases where the computation of all paths in
      the group is not handled by the same PCE: this situation is called a
      split-brain. This split-brain scenario may lead to computation loops
      between PCEs or suboptimal path computation. Finally, synchronizing
      state between PCEs allows the maintenance of PCEP sessions with a large
      number of PCCs to be decoupled from path computation, which improves
      the scalability of the PCE architecture.</t>

      <t>In the scope of this document, the term 'computation loop' is used to
      describe the behavior of the PCEP message exchange looping between the PCC and the PCE
      or between PCEs, resulting in frequent path calculations, path reporting
      and path updates to the network, resulting in constant load on the PCE and
      oscillation of data plane traffic after each subsequent path update.</t>

      <t>This section contains illustrative examples to showcase the need for
      inter-PCE stateful PCEP sessions; further examples are provided in
      <xref target="examples"/>, <xref target="scaling"/>, and <xref
      target="scenarios"/>.</t>

      <section anchor="lsp-changes" numbered="true" toc="default">
        <name>Reporting LSP Changes</name>

        <t>When using a stateful PCE (<xref format="default"
        target="RFC8231"/>), a PCC can synchronize LSP state information to
        the stateful PCE. If the PCC grants control of the LSP to the PCE
        (called delegation <xref format="default" target="RFC8231"/>), the PCE
        can update the LSP parameters at any time. </t>

        <t>In a multi-PCE deployment (redundancy, load-balancing...), with the
        specification defined in <xref format="default" target="RFC8231"/>, when
        a PCE makes an update, the PCC is responsible for reporting the LSP
        parameter updates to all PCEs.</t>

        <t>This convergence delay may affect the reaction time of the other
        PCEs if they need to take action after being notified of the LSP
        parameter change.</t>

        <t>Apart from the synchronization from the PCC, it is also useful if
        there is a synchronization mechanism between the stateful PCEs. As
        a stateful PCE makes changes to its delegated LSPs, these changes
        (pending LSPs and the sticky resources <xref format="default"
        target="RFC7399"/>) can be synchronized to the other PCEs.</t>

        <figure anchor="twoPCEs">
          <name>Active and Standby PCEs</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC    |  LSP1
          +----------+
             /    \
            /      \
   +---------+    +---------+
   |  PCE1   |----|  PCE2   |
   +---------+    +---------+
            ]]>
          </artwork>
        </figure>

        <t>In <xref target="twoPCEs" />, PCE1 is responsible for computing
        paths for the PCC, and PCE2 is on standby. When there is a change in
        LSP1, the PCC reports it to PCE1. In addition, PCE1 synchronizes to
        PCE2 the intended state of LSP1, including pending LSP state and
        the sticky resources accounted for during path computation. This
        gives PCE2 visibility of state that the PCC has not yet confirmed,
        or has not yet been asked to apply, which a report from the PCC
        alone cannot provide at that point in time. PCE2 therefore has a
        more accurate view for its own computations and for taking over
        from PCE1.</t>

      </section>

      <section anchor="split-brain" numbered="true" toc="default">
        <name>Split-Brain</name>

        <t>In a resiliency case, a PCC has redundant PCEP sessions toward
        multiple PCEs. In such a case, a PCC gives control of an LSP to a
        single PCE only, and only this PCE is responsible for the path
        computation for the delegated LSP: the PCC achieves this by setting
        the D flag only toward the active PCE <xref format="default"
        target="RFC8231"/> selected for delegation. The election of the active
        PCE to delegate an LSP is controlled by each PCC. The PCC usually
        elects the active PCE by a locally configured policy (by setting a
        priority). Upon PCEP session failure, or active PCE failure, the PCC may
        decide to elect a new active PCE by sending a new Path Computation
        LSP State Report (PCRpt) message with the D flag set to this new
        active PCE. When the failed PCE or PCEP session comes back online, it
        will be up to the PCC implementation whether to revert back to the
        original PCE. Any change of the PCE that computes the path, whether
        the initial failover or a later reversion, may lead to some disruption
        of the existing path if the computation results of the two PCEs are
        not exactly the same. By considering a network with multiple PCCs and
        implementing multiple stateful PCEs for redundancy purposes, it is
        not likely that all PCCs delegate their LSPs to the same PCE.</t>

        <figure anchor="twoPCCs">
          <name>Two PCEs with Shared Responsibility</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP1
          +----------+
             /    \
            /      \
   +---------+    +---------+
   |  PCE1   |    |  PCE2   |
   +---------+    +---------+
           \       /
   *fail*   \     /
          +----------+
          |   PCC2   |  LSP2
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>In the example in <xref target="twoPCCs" />, PCC1 and PCC2 are
        configured to delegate their respective LSPs, LSP1 and LSP2, to PCE1.
        Therefore, PCE1 is responsible for computing paths for both LSPs. If
        the PCEP session between PCC2 and PCE1 fails, PCC2 delegates LSP2 to
        PCE2. PCE1 then remains responsible only for the path computation of
        LSP1, while PCE2 is responsible for the path computation of LSP2. Once
        the PCC2-PCE1 session is restored, PCC2 continues using PCE2 as the
        active PCE, assuming no preemption in this example. The result is a
        persistent situation where each PCE is responsible for a subset of path
        computations.</t>

        <t>This situation is called a split-brain scenario, where multiple PCEs
        perform computation independently in a deployment or use case that
        requires coordinated computation across a set of associated LSPs.</t>

        <t>Such lack of coordination is particularly problematic when one LSP
        path computation depends on another, for example for path disjointness
        (see <xref format="default" target="RFC8800"/>) or bidirectional LSPs
        (see <xref format="default" target="RFC9059"/>). The set of LSPs that
        are dependent on each other may start from different head-ends.</t>

        <figure anchor="linkDisjoint">
          <name>Managing Link-Disjoint LSPs</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
      _________________________________________
     /                                         \
    /        +------+            +------+       \
   |         | PCE1 |            | PCE2 |        |
   |         +------+            +------+        |
   |                                             |
   | +------+                          +------+  |
   | | PCC1 | ---------------------->  | PCC2 |  |
   | |      | <----------------------  |      |  |
   | +------+                          +------+  |
   |                                             |
   |                                             |
   | +------+                          +------+  |
   | | PCC3 | ---------------------->  | PCC4 |  |
   | |      | <----------------------  |      |  |
   | +------+                          +------+  |
   |                                             |
    \                                           /
     \_________________________________________/


      _________________________________________
     /                                         \
    /        +------+            +------+       \
   |         | PCE1 |            | PCE2 |        |
   |         +------+            +------+        |
   |                                             |
   | +------+           10             +------+  |
   | | PCC1 | ----- R1 ---- R2 ------- | PCC2 |  |
   | +------+       |        |         +------+  |
   |                |        |                   |
   |                |        |                   |
   | +------+       |        |         +------+  |
   | | PCC3 | ----- R3 ---- R4 ------- | PCC4 |  |
   | +------+                          +------+  |
   |                                             |
    \                                           /
     \_________________________________________/

            ]]>
          </artwork>
        </figure>

        <t>In <xref target="linkDisjoint" />, the requirement is to create two link-disjoint
        LSPs: PCC1-&gt;PCC2 and PCC3-&gt;PCC4. In the topology, all link cost
        metrics are set to 1 except for the link 'R1-R2', which has a metric of
        10. The PCEs are responsible for the path computation, and PCE1 is the
        active PCE for all PCCs in the nominal case.</t>

        <t><xref target="scenarios" /> provides several scenarios for illustrative purposes,
        and <xref target="examples"/> shows how the procedures of this document
        apply to them. There are many other cases where the solutions defined
        in this document are also applicable.</t>

      </section>

      <section anchor="scalability" numbered="true" toc="default">
        <name>Scalability</name>

        <t>If the number of PCCs is really high, it may be too
        resource-consuming for a single PCE instance to maintain all the PCEP
        sessions while at the same time performing all path computations.
        Decoupling PCEP session maintenance and computation across a group of
        PCEs that share LSP state allows increasing scaling of the PCE
        architecture. <xref target="scaling"/> gives an example.</t>
      </section>

      <section anchor="H-PCE" numbered="true" toc="default">
        <name>Relationship to H-PCE</name>

        <t><xref format="default" target="RFC8751"/> describes general
        considerations and use cases for the deployment of Stateful PCE(s)
        using the Hierarchical PCE <xref format="default" target="RFC6805"/>
        architecture. In this architecture, there is a clear need to
        communicate between a child stateful PCE and a parent stateful PCE.
        The procedures in this document address the synchronization of
        state between peer stateful PCEs and do not require deployment of a
        parent PCE. The use of these state-sync procedures within an H-PCE
        deployment is outside the scope of this document.</t>
      </section>
    </section>

    <section anchor="solution" numbered="true" toc="default">
      <name>Solution Overview</name>

      <t>The solution uses the following mechanisms, described in <xref
      target="procedures"/>:</t>

      <ul spacing="normal">
        <li>The state-sync session (<xref target="state-sync-session"/>,
        <xref target="open"/>): a PCEP session between stateful PCEs, with
        a new capability flag. Each PCE acts as both PCE and PCC to
        synchronise state.</li>

        <li>The state-sync PCE set: the PCEs that share state for a given
        set of PCCs, LSPs, or association groups, which MUST be connected in
        a full mesh of state-sync sessions (<xref target="updates"/>).</li>

        <li>The forwarding rules (<xref target="updates"/>, <xref
        target="priority"/>): a PCE forwards to its state-sync peers only
        the PCRpt messages it receives from a PCC, never a PCRpt received
        from a PCE; a PCUpd from the computing PCE is sent to all state-sync
        peers, but only the delegated PCE forwards it to the PCC. These
        rules prevent loops (<xref target="loop-avoidance"/>).</li>

        <li>The computation priority and sub-delegation (<xref
        target="priority-relationship"/>, <xref target="priority"/>): one
        PCE computes for each LSP, PCC, or association group. The other PCEs
        are backups in priority order. If the delegated PCE is not the
        computing PCE, it sub-delegates the LSP to that PCE using the D flag.</li>

        <li>A source list per LSP (<xref target="maintenance"/>) and a PCC
        information database (<xref target="Notif"/>), maintained in
        addition to the LSP-DB.</li>

        <li>The ORIGINAL-LSP-DB-VERSION TLV (<xref target="updates"/>) and
        the optional PCEP-PATH-VECTOR TLV (<xref target="loop-avoidance"/>).</li>
      </ul>

      <t>The solution builds upon the protocol extensions for stateful PCE in
      <xref format="default" target="RFC8231"/>, synchronization optimizations in
      <xref format="default" target="RFC8232"/>, and PCE-initiation in
      <xref format="default" target="RFC8281"/>.</t>

      <section anchor="state-sync-session" numbered="true" toc="default">
        <name>State-Sync Session</name>

        <t>This document specifies a mechanism to set up a PCEP session between the
        stateful PCEs. Creating a PCEP session between PCEs is already enabled for
        multiple scenarios like the one described in <xref format="default"
        target="RFC4655"/> (multiple PCEs that are handling part of a path
        computation) and <xref format="default" target="RFC6805"/>
        (hierarchical PCE). However, that earlier work focused only on the sessions
        between stateless PCEs. </t>

        <t>Stateful PCE brings additional features (LSP state
        synchronization, path update, delegation, ...).  Thus, some new
        behaviors need to be defined on the inter-PCE PCEP session.</t>

        <t>This inter-PCE PCEP session allows the exchange of LSP state between
        PCEs and is called a "state-sync session" in this document.</t>

        <t>For example, in the scenario in <xref target="partitioned" />,
        there is no possibility to compute disjointness as there is no PCE
        that is aware of both LSPs.</t>

        <figure anchor="partitioned">
          <name>Partitioned Visibility Amongst PCEs</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP: PCC1->PCC2
          +----------+
            /
       D=1 /
   +---------+       +---------+
   |  PCE1   |       |  PCE2   |
   +---------+       +---------+
                     / D=1
                    /
          +----------+
          |   PCC3   |  LSP: PCC3->PCC4
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>If we add a state-sync session as shown in <xref target="stateSynch" />,
        PCE1 will synchronize its LSP state to PCE2 via PCRpt messages; PCE2
        will similarly synchronize its state to PCE1. All the PCEs will be
        aware of all LSPs, even if a PCC-&gt;PCE session is down. PCEs will then
        be able to compute disjoint paths.</t>

        <figure anchor="stateSynch">
          <name>Partitioned Visibility With State Synchronization</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP : PCC1->PCC2
          +----------+
            /
       D=1 /
   +---------+ PCEP  +---------+
   |  PCE1   | ----- |  PCE2   |
   +---------+       +---------+
                     / D=1
                    /
          +----------+
          |   PCC3   |  LSP : PCC3->PCC4
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>The procedures associated with this state-sync session are defined
        in <xref format="default" target="procedures"/>.</t>

        <t>By just adding this state-sync session, it does not ensure that a
        path with LSP association-based <xref target="RFC8697"/> constraints can always be computed and
        does not prevent the computation loop, but it increases resiliency and
        ensures that PCEs will have the state information for all LSPs. Also,
        this session will allow a PCE to update the other PCEs, providing a
        faster synchronization mechanism than relying on PCCs only.</t>
      </section>

      <section anchor="priority-relationship" numbered="true" toc="default">
        <name>Computation Priority Relationship between PCEs</name>

        <t>As seen in <xref format="default" target="problem"/> and
        <xref format="default" target="scenarios"/>, performing a
        path computation in a split-brain scenario (multiple PCEs responsible
        for computation) may provide a non-optimal LSP placement, no path, or
        computation loops. To achieve better efficiency, an LSP association
        constraint-based computation may require that a single PCE performs
        the path computation for all LSPs in the association group. Note that it
        could be all LSPs belonging to a particular association group, or all
        LSPs from a particular PCC, or all LSPs in the network that need to be
        delegated to a single PCE based on the deployment scenarios.</t>

        <t>This document specifies a computation priority between the PCEs
        of a state-sync PCE set, from which a single computing PCE is
        determined, with the other PCEs acting as backups in priority order.
        Using this priority, PCEs agree on the PCE that will be responsible
        for the computation for a particular association group or set of
        LSPs. The priority can be set per association group, per PCC, or
        globally for all LSPs. The rest of the text considers the association
        group as an example.</t>

        <t>When a single PCE is performing the computation for a particular
        association group, no computation loop can happen, and an optimal
        placement will be provided. The other PCEs will only act as state
        collectors and forwarders.</t>

        <t>In the scenario described in <xref format="default"
        target="state-sync-session"/>, PCE1 and PCE2 will decide that PCE1
        will be responsible for the path computation of both LSPs. If we first
        configure PCC1-&gt;PCC2, PCE1 computes the shortest path as it is the
        only LSP in the disjoint-group that it is aware of:
        R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2 (shortest path). When PCC3-&gt;PCC4
        is configured, PCE2 will not perform computation even if it has
        delegation, but forwards the delegation via PCRpt message to PCE1
        through the state-sync session. PCE1 will then perform disjointness
        computation and will move PCC1-&gt;PCC2 onto R1-&gt;R2-&gt;PCC2 and
        provides an ERO to PCE2 for PCC3-&gt;PCC4: R3-&gt;R4-&gt;PCC4. The
        PCE2 will further update the PCC3 with the new path.</t>
      </section>
    </section>

    <section anchor="procedures" numbered="true" toc="default">
      <name>Procedures and Protocol Extensions</name>

      <section anchor="open" numbered="true" toc="default">
        <name>Opening a State-Sync Session and Capability Advertisement</name>

        <t>A PCE indicates its support of state-sync procedures during the
          PCEP Initialization phase <xref format="default" target="RFC5440"/>.
          The OPEN object in the Open message MUST contain the "Stateful PCE
          Capability" TLV defined in <xref format="default"
          target="RFC8231"/>. A new P (INTER-PCE-CAPABILITY) flag is
          introduced to indicate the support of state-sync.</t>

        <t>This document adds a new bit in the Flags field with:</t>

        <ul spacing="normal">
          <li>P (INTER-PCE-CAPABILITY - 1 bit - TBD4): If set to 1 by a PCE,
          the PCE indicates that the session MUST follow
          the state-sync procedures as described in this document. If the P
          bit is set by both PCEP speakers on the session, the procedures MUST be used.  If a
          PCEP speaker receives a STATEFUL-PCE-CAPABILITY TLV with P=0 while
          it advertised P=1, or if both PCEP speakers set the P flag to 0, the session is
          set up, but the state-sync procedures MUST NOT be applied on
          this session.  A PCE MAY decide to close a session if the received
          setting of the P flag is not acceptable. </li>
        </ul>

        <t>The U flag <xref format="default" target="RFC8231"/> MUST be set
          when sending the STATEFUL-PCE-CAPABILITY TLV with the P flag set. In
          case the U flag is not set along with the P flag, the state-sync
          capability is not enabled and it is considered as if the P flag is
          not set.</t>

        <t>The procedures of this document depend on the LSP-DB-VERSION TLV
          and the SPEAKER-ENTITY-ID TLV defined in <xref format="default"
          target="RFC8232"/>: a PCE that sets the P flag MUST support <xref
          format="default" target="RFC8232"/>. The S flag SHOULD be set
          together with the P flag so that the optimized synchronization
          procedures of <xref format="default" target="RFC8232"/> can be used
          on the state-sync session; this reduces the amount of state
          exchanged when a state-sync session is re-established. A full
          synchronization remains a valid behavior when the S flag is not
          set.</t>

        <t>The TLVs and the Notification-type defined in this document MUST
          NOT be sent on a session on which the state-sync capability has not
          been negotiated, and MUST be ignored if received on such a session.
          PCRpt and PCUpd messages received on such a session are processed
          according to <xref format="default" target="RFC8231"/> only and
          MUST NOT be forwarded to any state-sync session.</t>

        <t>State synchronization procedures are independent of support for other
          PCEP capabilities, for example the Path Setup Type capability defined
          in <xref format="default" target="RFC8408"/>. While two PCEs MUST
          support state-sync extensions to perform synchronization, they do not
          need to support a symmetrical set of additional capabilities. In cases
          of asymmetry, state-sync SHOULD continue; however, the PCE MUST handle
          information and behavior according to the specific rules defined for
          those capabilities, such as ignoring paths with an unsupported Path
          Setup Type or reporting an error as defined in the relevant capability
          specification. A PCE that does not support a capability needed for
          a set of LSPs cannot act as computing PCE for those LSPs; see
          <xref target="control"/>.</t>
      </section>

      <section anchor="sync" numbered="true" toc="default">
        <name>State Synchronization</name>

        <t>When the state-sync capability has been negotiated between stateful
        PCEs, each PCEP speaker will behave as a PCE and as a PCC at the same
        time regarding the state synchronization as defined in <xref
        format="default" target="RFC8231"/>. This means that each PCEP
        Speaker:</t>

        <ul spacing="normal">
          <li>MUST send a PCRpt message toward its neighbor with the S flag set
          for each LSP in its LSP database learned from a PCC. (PCC role)</li>

          <li>MUST send the End Of Synchronization Marker toward its neighbor
          when all LSPs have been reported. (PCC role)</li>

          <li>MUST wait for the LSP synchronization from its neighbor to end
          (receiving an End Of Synchronization Marker). (PCE role)</li>
        </ul>

        <t>The process of synchronization runs in parallel on each PCE (with
        no defined order). Before the LSP state synchronization starts, the
        PCEs exchange the information of the PCCs connected to them as
        described in <xref target="Notif"/>.</t>

        <t>The optimized state synchronization procedures of <xref
        format="default" target="RFC8232"/> SHOULD be used when the S flag
        has been set by both PCEs; see <xref target="open"/>.</t>

        <t>When a PCEP Speaker sends a PCRpt on a state-sync session, it MUST
        add the SPEAKER-ENTITY-ID TLV (defined in <xref format="default"
        target="RFC8232"/>) in the LSP Object, the value used will refer to
        the 'owner' PCC of the LSP. If a PCEP Speaker receives a PCRpt on a
        state-sync session without this TLV, it MUST discard the PCRpt message
        and it MUST reply with a PCErr message using error-type=6 (Mandatory
        Object missing) and error-value=TBD1 (SPEAKER-ENTITY-ID TLV
        missing).</t>

        <t>Errors during the synchronization are handled as specified in
        Section 5.6 of <xref format="default" target="RFC8231"/> and in <xref
        format="default" target="RFC8232"/>, which result in the session
        being closed. If the state-sync session fails before the End Of
        Synchronization Marker has been received, the state already received
        on that session is handled as for any state-sync session failure
        (<xref target="failures"/>).</t>
      </section>

      <section anchor="updates" numbered="true" toc="default">
        <name>Incremental Updates and Report Forwarding Rules</name>

        <t>During the life of an LSP, its state may change (path, constraints,
        operational state...), and a PCC will advertise a new PCRpt to the PCE
        for each such change.</t>

        <t>When propagating LSP state changes from a PCE to other PCEs, the
        sending PCE MUST propagate only the freshest state received from the
        PCC, as determined by the LSP-DB version semantics (see <xref
        target="maintenance"/>).</t>

        <t>When a PCE receives a new PCRpt from a PCC with the LSP-DB-VERSION
        TLV (defined in <xref format="default" target="RFC8232"/>),
        the PCE MUST forward the PCRpt to all its state-sync sessions and MUST
        add the appropriate SPEAKER-ENTITY-ID TLV in the PCRpt. In addition, it
        MUST add a new ORIGINAL-LSP-DB-VERSION TLV (described below). The
        ORIGINAL-LSP-DB-VERSION contains the LSP-DB-VERSION coming from the
        PCC.</t>

        <t>When a PCE receives a new PCRpt from a PCC without the
        LSP-DB-VERSION TLV, it MUST NOT forward the PCRpt on any state-sync
        sessions and MUST log such an event on the first occurrence for that
        PCC on the current PCEP session (so that the condition is visible to
        the operator without flooding the log).</t>

        <t>When a PCE receives a new PCRpt from a PCC with the R flag (Remove)
        set and an LSP-DB-VERSION TLV, the PCE MUST forward the PCRpt to all
        its state-sync sessions keeping the R flag set (Remove) and MUST add
        the appropriate SPEAKER-ENTITY-ID TLV and ORIGINAL-LSP-DB-VERSION TLV
        in the PCRpt message.</t>

        <t>When a PCE receives a PCRpt from a state-sync session, it MUST NOT
        forward the PCRpt to other state-sync sessions. This helps to prevent
        message loops between PCEs (see <xref target="loop-avoidance"/>). As
        a consequence, a full mesh of state-sync sessions between the PCEs of
        a state-sync PCE set is REQUIRED (see <xref target="example3"/> and
        <xref target="ops-design"/>).</t>

        <t>When a PCRpt is forwarded, all the original objects and values are
        kept. As an example, the PLSP-ID used in the forwarded PCRpt will be
        the same as the original one used by the PCC. Thus, an implementation
        supporting this document MUST consider SPEAKER-ENTITY-ID TLV and
        PLSP-ID together to uniquely identify an LSP on the state-sync
        session.</t>

        <t>The ORIGINAL-LSP-DB-VERSION TLV is encoded as shown in
        <xref target="DBver" /> and MUST always contain the LSP-DB-VERSION
        received from the owner PCC of the LSP. </t>

        <t>The Length field is set to 8 because the version value is encoded as
        a 64-bit quantity (8 octets).</t>

        <figure anchor="DBver">
          <name>The ORIGINAL-LSP-DB-VERSION TLV</name>
          <artwork name="" type="" align="left" 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=TBD2           |            Length=8           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 LSP State DB Version Number                   |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            ]]>
          </artwork>
        </figure>

        <t>Using the ORIGINAL-LSP-DB-VERSION TLV allows a PCE to keep using
        optimized synchronization (<xref format="default" target="RFC8232"/>)
        with another PCE. In such a case, the PCE will send a PCRpt to another
        PCE with both ORIGINAL-LSP-DB-VERSION TLV and LSP-DB-VERSION TLV. The
        ORIGINAL-LSP-DB-VERSION TLV will contain the version number as
        allocated by the PCC, while the LSP-DB-VERSION will contain the version
        number allocated by the local PCE.</t>
      </section>

      <section anchor="maintenance" numbered="true" toc="default">
        <name>Maintaining LSP States from Different Sources</name>

        <t>When a PCE receives a PCRpt on a state-sync session, it stores the
        LSP information into the original PCC address context (as the LSP
        belongs to the PCC). A PCE MUST maintain a single state for a
        particular LSP and MUST maintain the list of sources (the source list)
        from which it learned that state.</t>

        <t>A PCEP speaker may receive state information for a particular LSP
        from different sources: the PCC that owns the LSP (through a regular
        PCEP session) and some PCEs (through PCEP state-sync sessions). The
        freshness of the state is determined by the version number allocated
        by the owner PCC: the LSP-DB-VERSION when the state is received from
        the PCC, and the ORIGINAL-LSP-DB-VERSION when the state is received
        from a PCE. A received state is "fresher" than the stored state when
        its version number is greater than the stored version number, taking
        wrap-around into account. A PCEP speaker MUST always keep the freshest
        state in its LSP database, overriding the previously received
        information.</t>

        <t>A PCE, receiving a PCRpt from a PCC, updates the state of the LSP
        in its LSP-DB with the newly received information. When receiving a
        PCRpt from another PCE, a PCE updates the LSP state only if the
        ORIGINAL-LSP-DB-VERSION present in the PCRpt indicates it is fresher
        than the current ORIGINAL-LSP-DB-VERSION of the stored LSP state. This
        ensures that a PCE never tries to update its stored LSP state with
        old information. Each time a PCE updates an LSP state in its LSP-DB,
        it MUST clear the source list associated with the LSP state and MUST
        re-initialize it with the address of the speaker from which the
        fresher state was received. When a PCE receives a PCRpt that has an
        ORIGINAL-LSP-DB-VERSION (if coming from a PCE) or an LSP-DB-VERSION
        (if coming from the PCC) equal to the current ORIGINAL-LSP-DB-VERSION
        of the stored LSP state, it MUST add the source speaker address to the
        source list, if not already present.</t>

        <t>When a PCE receives a PCRpt with the R flag set (LSP deletion) from
        a particular source, it MUST remove this particular source from the
        source list associated with this LSP.</t>

        <t>When the source list becomes empty as a result of PCRpt messages
        with the R flag set, the LSP state MUST be removed. This means that
        all the sources currently associated with the stored state must send
        a PCRpt with R=1 for an LSP to make the PCE remove the LSP state. The
        replacement of a stored state by a fresher one re-initializes the
        source list but is not a deletion, and a source list that becomes
        empty because of a state-sync session failure does not remove the
        LSP state either (<xref target="failures"/>).</t>
      </section>

      <section anchor="priority" numbered="true" toc="default">
        <name>Computation Priority between PCEs and Sub-delegation</name>

        <t>A computation priority is necessary to ensure that a single PCE
        will perform the computation for all the LSPs in an association group:
        this will allow for a more optimized LSP placement and will prevent
        computation loops.</t>

        <t>The operator MUST provision, on every PCE of a state-sync PCE set,
        the computation priority of every PCE of the set, including the local
        PCE, so that all the PCEs that handle LSPs in a common LSP association
        group are aware of each other and of each other's computation
        priority; see <xref target="control"/> and <xref
        target="ops-design"/>. Note that there is no need for the PCC to be
        aware of this. The computation priority is a number ranging from 0 to
        7, where 0 represents the lowest priority, while 7 represents the
        highest. The PCE having the highest priority MUST be responsible for
        the computation. If several PCEs have the same priority value, their
        IP address MUST be used as a tie-breaker to provide a rank: the
        highest IP address has more priority. An IPv4 address MUST be
        converted to its IPv4-mapped IPv6 form before comparison, per <xref
        format="default" target="RFC4291"/>.</t>

        <t>The computation priorities are configured through local operator
        policy on each PCE. The priority for local and remote PCEs can be set
        at the global level, so that the highest priority PCE handles all
        path computations, or at a more granular level (per association group
        or per PCC), so that a PCE has the highest priority for only a subset
        of LSPs or association groups. The most specific configured level
        applies; see <xref target="control"/> for the precedence rules. If a
        PCE has no computation priority configured for a remote PCE at any
        level, it MUST treat that PCE as having priority 0. In future, PCEs
        could also advertise and discover these parameters via PCEP; those
        details are out of the scope of this document and left for future
        specification (see <xref target="intro"/>).</t>

        <t>A PCEP Speaker receiving a PCRpt from a PCC with the D flag set
        that does not have the highest computation priority MUST forward
        the PCRpt on all state-sync sessions (as per <xref format="default"
        target="updates"/>) and MUST set the D flag on the state-sync session
        toward the highest priority PCE; the D flag MUST be unset on all other
        state-sync sessions. This behavior is similar to the delegation
        behavior handled at the PCC side and is called a sub-delegation (the
        PCE sub-delegates the control of the LSP to another PCE). When a PCEP
        Speaker sub-delegates an LSP to another PCE, it loses control of the
        LSP and MUST NOT update it by its own decision. When a PCE receives a
        PCRpt with the D flag set on a state-sync session, it is granted
        control over the LSP as a regular PCE would be. A PCE that has been
        granted control by sub-delegation MUST NOT sub-delegate the LSP
        further, even if, from its own view, another PCE has a higher
        computation priority: the view of the delegated PCE governs the LSPs
        it received from its PCCs. Sub-delegation is therefore never deeper
        than one level.</t>

        <t>Sub-delegation is not visible to the PCC. The PCC continues to
        interact only with the PCE to which it delegated the LSP: it receives
        PCUpd messages only from that PCE and sends its PCRpt messages to it.
        The sub-delegated PCE never acts toward the PCC directly; it may not
        even have a PCEP session with that PCC.</t>

        <t>When a PCE holds the delegation for an LSP directly from the PCC,
        is the highest priority PCE, and needs to update this LSP, it MUST
        send a PCUpd message to all state-sync sessions and to the PCC
        session on which it received the delegation. The D flag MUST be unset
        in the PCUpd sent on the state-sync sessions and MUST be set in the
        PCUpd sent to the PCC. In the case of sub-delegation, the computing
        PCE MUST send the PCUpd to all state-sync sessions (it has no direct
        delegation from a PCC). The D flag MUST be set in the PCUpd sent on
        the state-sync session to the PCE that sub-delegated this LSP and
        MUST be unset in the PCUpd sent on the other state-sync sessions.</t>

        <t>Sending the PCUpd to all state-sync sessions keeps all PCEs aware
        of the path updates that have been sent toward the PCC but not yet
        confirmed by a corresponding PCRpt, and avoids transient state
        divergence during re-optimization.</t>

        <t>The PCUpd sent over a state-sync session MUST contain the
        SPEAKER-ENTITY-ID TLV in the LSP Object (the value used MUST identify
        the target PCC). The PLSP-ID used is the original PLSP-ID generated by
        the PCC and learned from the forwarded PCRpt. If a PCE receives a
        PCUpd on a state-sync session without the SPEAKER-ENTITY-ID TLV, it
        MUST discard the PCUpd and MUST reply with a PCErr message using
        error-type=6 (Mandatory Object missing) and error-value=TBD1
        (SPEAKER-ENTITY-ID TLV missing).</t>

        <t>A receiving PCE that currently holds delegation for that LSP on an
        active PCEP session to the PCC identified by SPEAKER-ENTITY-ID MUST
        forward the PCUpd to that PCC and MUST remove the SPEAKER-ENTITY-ID
        TLV from the LSP Object. A receiving PCE that does not currently hold
        delegation for that LSP on an active PCEP session to that PCC MUST
        NOT forward the PCUpd to the PCC; it keeps the update only for state
        tracking and for subsequent synchronization logic.</t>

        <t>The PCUpd is acknowledged through the PCRpt originated by the
        PCC. When the PCC receives the PCUpd from the delegated PCE, it
        acknowledges it with a PCRpt as per <xref format="default"
        target="RFC8231"/>. On receiving this PCRpt, the
        delegated PCE applies the forwarding rules defined in <xref
        target="updates"/> on the state-sync sessions, so the acknowledgement
        is relayed to the computing PCE. The PCRpt received by a PCE that did
        not originate the PCUpd is not required to carry the Stateful PCE
        Request Parameters (SRP) object <xref format="default"
        target="RFC8231"/>, and any SRP-ID-number it carries is
        scoped to that PCEP session (per <xref format="default"
        target="RFC8231"/>). Therefore, a PCE MUST NOT rely on the SRP object
        to correlate a PCRpt received on a state-sync session with a PCUpd it
        sent.</t>

        <t>The computing PCE MUST correlate the relayed PCRpt with
        its PCUpd using the identity of the LSP, that is, the
        SPEAKER-ENTITY-ID TLV together with the PLSP-ID, which are preserved
        end to end by the forwarding rules. The ORIGINAL-LSP-DB-VERSION TLV
        establishes that the relayed PCRpt is fresher than the state the PCUpd
        was computed from. The content of the PCRpt (including any
        LSP-ERROR-CODE TLV <xref format="default" target="RFC8231"/>) tells
        the computing PCE whether its update was applied or rejected. The
        delegated PCE handles the SRP object on its session with the PCC as
        per <xref format="default" target="RFC8231"/>.</t>

        <section anchor="failures" numbered="true" toc="default">
          <name>State-Sync Session Failure, Switch-over, and Reversion</name>

          <t>A failure may be detected through loss of
          reachability to the peer, state-sync session failure, or a local
          policy that marks the PCE as temporarily unusable.
          The trigger and threshold are determined by local policy. The
          Redelegation Timeout and State Timeout procedures of
          <xref format="default" target="RFC8231"/> do not apply to
          state-sync sessions.</t>

          <t>On failure of a state-sync session, the local PCE:</t>

          <ul spacing="normal">
            <li>MUST remove the failed peer from the source list of every LSP
            state in which it appears. If the source list becomes empty, the
            LSP state
            MUST be retained and marked as stale until refreshed or removed
            by the procedures of <xref
            target="maintenance"/>; it MUST NOT be removed because of the
            failure. Stale state SHOULD continue to be used for path
            computation.</li>

            <li>MUST remove the PCC information entries whose only source was
            the failed peer (<xref target="Notif"/>). LSP state is retained
            even when no PCC information entry remains for its PCC.</li>

            <li>MUST consider any sub-delegation received from the failed
            peer as revoked, and MUST NOT send further PCUpd messages for
            those LSPs.</li>

            <li>MUST re-evaluate the sub-delegation of every LSP it had
            sub-delegated to the failed peer, using the same priority policy
            for the reachable state-sync peers, and either
            sub-delegate the LSP to the next highest priority PCE (D flag set
            in the PCRpt sent to that PCE, unset towards the others) or, if it
            is itself the highest priority reachable PCE, perform the
            computation itself.</li>
          </ul>

          <t>No re-synchronisation with the other peers is triggered by the
          failure of a single state-sync session, as the same LSP state is
          normally still held, with the owner PCC and the other peers
          remaining as sources. If the PCC detects failure of the PCE to which it
          delegated the LSP, the PCC uses the existing delegation procedures
          of <xref format="default" target="RFC8231"/>, and the newly
          delegated PCE applies <xref target="priority"/>. The PCC does not
          need to know
          the PCE priority ranking.</t>

          <t>A PCE that receives a sub-delegation MUST accept it and act as
          computing PCE for that LSP even if, from its own view, a PCE with a
          higher computation priority is reachable. The sub-delegating PCE
          uses its own view for the LSPs received from its PCCs; the
          receiving PCE cannot sub-delegate them again. When the PCEs of a set have
          different views of which peers are reachable, different LSPs of an
          association group may therefore temporarily have different
          computing PCEs. This gives less optimal results for association-based
          computation (<xref target="pri-assoc"/>) but cannot create a
          message loop or a computation loop, because the forwarding rules
          and the limit of one sub-delegation still apply. Such a
          condition SHOULD be reported to the operator (<xref
          target="ops-verify"/>).</t>

          <t>When a state-sync session to a higher priority PCE is
          re-established, the state synchronisation of <xref
          target="sync"/> MUST complete before any sub-delegation towards
          that PCE. This means that the End Of Synchronization Marker has been
          received from that PCE. The delegated PCE MAY then revert the
          sub-delegation to it (D flag set in the PCRpt sent to the
          returning PCE, unset towards the previous computing PCE). Local policy
          determines whether to revert. As with the initial switch-over,
          reversion may disrupt the existing path if the two PCEs compute
          different results (<xref
          target="split-brain"/>).</t>
        </section>

        <section anchor="Notif" numbered="true" toc="default">
          <name>Information Received via Open Message from PCC</name>

          <t>To ensure uniform information across all PCEs, each PCE needs
          to relay the information it receives from the PCCs in the Open
          message to other PCEs via the state-sync session. This includes
          various PCC capabilities and parameters such as Maximum Segment
          Identifier (SID) Depth (MSD). Each PCE records this information,
          together with the source(s) it was learned from (the direct
          session with the PCC and/or state-sync peers), in a PCC
          information database. This database is used, in particular, to
          select a peer with a session to a given PCC (<xref
          target="init"/>).</t>

          <t>As per <xref target="RFC5440"/>, the PCEP Notification message
          (PCNtf) can be sent by a PCEP speaker to notify its peer of a
          specific event. A PCE MUST notify the other state-sync PCEs of the
          information it receives from the PCC's open message. Section 7.14
          of <xref target="RFC5440"/> specifies the NOTIFICATION object. This
          document adds a new Notification-type=TBD6 (Inter-PCE State-sync)
          and two Notification-values (Notification-value=1 (Add PCC's Open
          Information) and Notification-value=2 (Remove PCC's Open
          Information)).</t>

          <t>For Notification-type=TBD6, the NOTIFICATION object encodes the
          SPEAKER-ENTITY-ID TLV (with values that identify the PCC) and any
          other TLV that can be carried inside the OPEN object as a way to
          signal the PCC's information it received via the open message to
          other state-sync PCEs.</t>

          <ul>
            <li>Notification-value=1: Add PCC's Open Information. On session
            establishment with a PCC, a PCE with state-sync capability MUST
            send this notification to other state-sync PCEs with the
            SPEAKER-ENTITY-ID TLV with values that identify the PCC and any
            other TLVs encoded in the OPEN object received from the PCC. On
            session establishment with a state-sync PCE, the PCE MUST also
            send this notification for each of the PCCs with which it
            currently has a session established. The PCE MUST send these
            notifications prior to the State Synchronization (described in
            <xref target="sync"/>). Note that the PCNtf can be used to carry
            multiple NOTIFICATION objects, one for each PCC. On receiving
            this notification, the PCE adds the information to its PCC
            information database and records the sending peer as a
            source.</li>

            <li>Notification-value=2: Remove PCC's Open Information. When a
            PCE with state-sync capability clears the state of a PCC whose
            session has gone down, that is, on expiry of the State Timeout
            Interval of <xref format="default" target="RFC8231"/>, it MUST
            send this notification to other state-sync PCEs with the
            SPEAKER-ENTITY-ID TLV with values that identify the PCC. It is
            not sent on session down while the PCE still retains the PCC's
            state. On receiving this notification, the PCE removes the
            sending peer from the sources of the entry, and removes the
            entry when no source is left.</li>
          </ul>

          <t>A PCE may receive this Notification from multiple PCEs that a
          given PCC has a session with, and uses the recorded sources in a
          similar way to the source list of <xref target="maintenance"/>.
          In case of the termination of a state-sync session, the entries
          whose only source was that peer are removed (<xref
          target="failures"/>); upon re-establishment, the
          Notification-value=1 exchange rebuilds them before LSP state
          synchronization starts.</t>
        </section>

        <section anchor="pri-assoc" numbered="true" toc="default">
          <name>Association Group</name>

          <t>All LSPs belonging to the same association group MUST be
          configured with the same computation priorities for the PCEs. A PCE
          only computes a path using an association-group constraint if it
          has control of all of the LSPs in the association group, either by
          delegation from the PCC or by sub-delegation. Otherwise, an
          implementation MAY use a local policy on the PCE to decide whether
          it does not compute a path at all for this set of LSPs, or whether
          it computes a path by relaxing the association-group constraint.</t>

          <t>The same local policy applies if the PCE does not control all
          LSPs in the group because the priorities for an association group
          are not configured
          consistently on all PCEs, because a state-sync session is down
          (<xref target="failures"/>), or because a newly added PCE has not yet
          been provisioned (and is therefore treated as priority 0, <xref
          target="priority"/>). No LSP state is removed in any of
          these cases.</t>
        </section>

      </section>

      <section anchor="passive" numbered="true" toc="default">
        <name>Passive Stateful Procedures</name>

        <t>In the passive stateful PCE architecture <xref format="default"
        target="RFC8231"/>, the PCC is responsible for triggering a path
        computation request using a PCReq message to its PCE. There is no
        delegation, and hence no sub-delegation, in this mode; only the
        request is forwarded. If a PCE receives a PCReq for an LSP and finds
        that it does not have the highest computation priority for this LSP,
        or group, it MUST forward the PCReq message to the highest priority
        PCE over the state-sync session. When the highest priority PCE
        receives the PCReq, it computes the path and generates a Path
        Computation Reply (PCRep) message toward the PCE that forwarded the
        request. This PCE MUST then forward the PCRep to the requesting PCC
        on the session on which the PCReq was received. The handling of the
        LSP object and the SPEAKER-ENTITY-ID TLV in PCReq and PCRep is similar
        to PCRpt/PCUpd messages. If a PCC sends a PCReq for the same LSP to
        several PCEs, each of them forwards it in this way and the PCC
        receives one PCRep per PCReq, all computed by the same PCE.</t>
      </section>

      <section anchor="init" numbered="true" toc="default">
        <name>PCE Initiation Procedures</name>

        <t>A PCE may not have a direct PCEP session to a PCC to initiate an LSP
        as per <xref format="default" target="RFC8281"/>. A PCE MAY send the
        Path Computation LSP Initiate Request (PCInitiate) message on a
        state-sync session to another PCE to request it to create a
        PCE-initiated LSP on its behalf. The requesting PCE MUST select a
        peer that, according to its PCC information database (<xref
        target="Notif"/>), has a session with the head-end PCC. The
        PCInitiate is sent only to the selected peer. If the selected PCE is
        able to initiate the LSP, it reports it on the state-sync session via
        a PCRpt message, and the resulting LSP state reaches all the PCEs of
        the set through the normal PCRpt forwarding rules (<xref
        target="updates"/>). If the selected PCE does not have a session to
        the head-end, for example because the PCC information was stale or
        because the session went down in the meantime, it MUST send a PCErr
        message with Error-type=24 (LSP instantiation error) and
        Error-value=TBD5 (No PCEP session with the headend). The requesting
        PCE MAY then retry via another available state-sync PCE that has a
        session with the head-end.</t>
      </section>

      <section anchor="loop-avoidance" numbered="true" toc="default">
        <name>Loop Prevention and Loop Detection</name>

        <t>The forwarding rules in this document prevent message loops
        between PCEs: a PCRpt or PCUpd received on a state-sync session
        is never forwarded to another state-sync session (<xref
        target="updates"/>, <xref target="priority"/>), a PCE that has
        received a sub-delegation never sub-delegates further (<xref
        target="priority"/>), and the PCEs of a state-sync PCE set are
        connected in a full mesh. Following these rules, each PCEP message is
        relayed at
        most once between PCEs and cannot loop. Computation loops are
        prevented by the
        computation priority, which ensures that a single PCE computes for
        all the LSPs of an association group.</t>

        <t>The optional PCEP-PATH-VECTOR TLV defined below is used for
        diagnosis rather than loop prevention. It records the PCEP speakers
        through which a message has passed, allowing a speaker to detect a
        message returning to it following a misconfiguration or an
        implementation error. Other uses, such as recording hop-by-hop
        information, are outside the scope of this document.</t>

        <section anchor="path-vector-tlv" numbered="true" toc="default">
          <name>PCEP-PATH-VECTOR TLV</name>

          <t>This document introduces the PCEP-PATH-VECTOR TLV (type TBD3) to
          be encoded in the LSP Object with the format shown in <xref
          target="pathVector" />.</t>

          <figure anchor="pathVector">
            <name>The PCEP-PATH-VECTOR TLV</name>
            <artwork name="" type="" align="left" 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=TBD3       |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              PCEP-SPEAKER-INFORMATION#1                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              ...                                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              ...                                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              PCEP-SPEAKER-INFORMATION#n                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              ]]>
            </artwork>
          </figure>

          <t>The TLV format and padding rules are as per <xref format="default"
          target="RFC5440"/>.</t>

          <t>The PCEP-SPEAKER-INFORMATION field has the format shown in
          <xref target="speakerInfo" />.</t>

          <figure anchor="speakerInfo">
            <name>The PCEP-SPEAKER-INFORMATION</name>
            <artwork name="" type="" align="left" 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Length                    |      ID Length                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//              Speaker Entity identity (variable)             //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//              Sub-TLVs (optional)                            //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              ]]>
            </artwork>
          </figure>

          <ul spacing="normal">
            <li>Length: defines the total length of the PCEP-SPEAKER-INFORMATION
            field.</li>

            <li>ID Length: defines the length of the Speaker Entity identity field,
            not counting any padding.</li>

            <li>Speaker Entity identity: same as the value portion of the
            SPEAKER-ENTITY-ID TLV. Padded with trailing zeros to a 4-byte
            boundary.</li>

            <li>The PCEP-SPEAKER-INFORMATION may also carry some optional sub-TLVs,
            so each PCEP speaker can add local information that could be recorded.
            This document does not define any sub-TLVs.</li>
          </ul>

          <t>The PCEP-PATH-VECTOR TLV MAY be carried in the LSP Object. Its
          usage is purely optional; its absence does not affect loop
          prevention.</t>

          <t>The list of speakers within the PCEP-PATH-VECTOR TLV MUST be
          ordered. When sending a PCEP message (PCRpt, PCUpd, or
          PCInitiate), a PCEP Speaker MAY add the PCEP-PATH-VECTOR TLV with a
          PCEP-SPEAKER-INFORMATION containing its own information. If the
          PCEP message sent is the result of a previously received PCEP
          message, and if the PCEP-PATH-VECTOR TLV was already present in the
          initial message, the PCEP speaker SHOULD append a new
          PCEP-SPEAKER-INFORMATION containing its own information at the end
          of the TLV.</t>

          <t>If a PCEP speaker receives a message with a PCEP-PATH-VECTOR
          TLV and finds its speaker information already present in the
          PCEP-PATH-VECTOR TLV, this represents a message loop: it MUST
          ignore the PCEP message and SHOULD log it as an error (<xref
          target="ops-verify"/>). This check applies whenever the TLV is
          present.</t>
        </section>
      </section>
    </section>

    <section anchor="Security" numbered="true" toc="default">
      <name>Security Considerations</name>

      <t>The security considerations described in <xref format="default"
      target="RFC8231"/>, <xref format="default" target="RFC8232"/>, <xref
      format="default" target="RFC8281"/>, and <xref format="default"
      target="RFC5440"/> apply to the extensions described in this document
      as well. Additional considerations related to state synchronization and
      sub-delegation between stateful PCEs are introduced, as they could be
      spoofed and could be used as an attack vector. An attacker could
      attempt to create too much state in an attempt to load the PCEP peer.
      The PCEP peer could respond with a PCErr message as described in <xref
      format="default" target="RFC8231"/>. An attacker could impact LSP
      operations by creating a bogus state. Further, state synchronization
      between stateful PCEs could provide an adversary with the opportunity
      to eavesdrop on the network. A compromised or misbehaving
      PCE can cause more harm than on an isolated PCC-PCE session. Bogus
      state injected on one state-sync session is propagated throughout
      the state-sync PCE set. Through sub-delegation, it can also affect
      LSPs of PCCs that have no direct session with that PCE. Securing
      both state-sync and PCC-PCE sessions using
      Transport Layer Security (TLS) <xref format="default"
      target="RFC8253"/> <xref format="default"
      target="I-D.ietf-pce-pceps-tls13"/> with mutual authentication, as per
      the recommendations and best current practices in <xref
      format="default" target="RFC9325"/>, is RECOMMENDED. State-sync
      sessions SHOULD be accepted only from provisioned peers.</t>
    </section>

    <section anchor="Imp" title="Implementation Status">
      <t>[Note to the RFC Editor - remove this section before publication, as
      well as remove the reference to RFC 7942.]</t>

      <t>This section records the status of known implementations of the
      protocol defined by this specification at the time of posting of this
      Internet-Draft, and is based on a proposal described in <xref
      target="RFC7942"/>. The description of implementations in this section
      is intended to assist the IETF in its decision processes in progressing
      drafts to RFCs. Please note that the listing of any individual
      implementation here does not imply endorsement by the IETF. Furthermore,
      no effort has been spent to verify the information presented here that
      was supplied by IETF contributors. This is not intended as, and must not
      be construed to be, a catalog of available implementations or their
      features. Readers are advised to note that other implementations may
      exist.</t>

      <t>According to <xref target="RFC7942"/>, "this will allow reviewers and
      working groups to assign due consideration to documents that have the
      benefit of running code, which may serve as evidence of valuable
      experimentation and feedback that have made the implemented protocols
      more mature. It is up to the individual working groups to use this
      information as they see fit".</t>

      <t>At the time of posting this document, there are no
      known implementations of this mechanism. It is believed that some
      vendors are considering implementations, but these plans are too vague
      to make any further assertions.  </t>
    </section>

    <section anchor="ops" numbered="true" toc="default">
      <name>Operational Considerations</name>

      <t>All manageability requirements and considerations listed in <xref
      target="RFC5440"/>, <xref target="RFC8231"/>, <xref target="RFC8232"/>,
      and <xref target="RFC8281"/> apply to the PCEP protocol extensions
      defined in this document. In addition, the requirements and
      considerations listed in this section apply.</t>

      <section anchor="ops-design" numbered="true" toc="default">
        <name>Deployment Design Guidelines</name>

        <t>The PCEs that share state for a given set of PCCs, LSPs, or
        association groups MUST be connected by state-sync sessions in a
        full mesh (<xref target="updates"/>, <xref target="example3"/>).
        The full mesh requirement applies to the participating state-sync
        PCE set, not necessarily to every PCE in an operator network.
        Operators can size each state-sync set according to the LSP
        associations, PCCs, and redundancy policy for which state must be
        shared. Two or three PCEs are typical for redundancy.
        Load sharing (<xref target="scaling"/>) may need more, with
        per-association or per-PCC priorities. For association-based
        computation, the set needs to include every PCE that can receive
        delegation for an LSP in the group. Operators SHOULD use the smallest
        set that meets the objective (<xref target="intro"/>).</t>

        <t>The computation priorities MUST be provisioned consistently on
        all PCEs of the set, at every configuration level in use (<xref
        target="control"/>). Inconsistent provisioning does not create loops
        (<xref target="loop-avoidance"/>), but it prevents association-based
        computation and can cause an LSP to be sub-delegated to a PCE that
        does not expect it. A PCE added to the set is treated as priority 0
        until provisioned (<xref target="priority"/>), so it can be
        introduced without disruption. The provisioned priorities determine
        how computation is
        shared between the PCEs.</t>
      </section>

      <section title="Control of Function and Policy" toc="default" anchor="control">
        <t>An operator MUST be allowed to configure the capability to support
        state-sync procedures for an inter-PCE session. They MUST be allowed to
        configure a computation priority of the local and remote PCEs at the global
        level. They SHOULD also be allowed to configure the computation priority of the
        local and remote PCEs per association (or a range of them). Further, they
        SHOULD also be allowed to configure computation priority per PCC (or a range of
        them). An implementation MAY support other such configuration levels for
        computation priority of the local and remote PCEs.</t>

        <t>The association-group priority takes precedence over the PCC
        priority, and the PCC priority takes precedence over the global
        priority. The most specific configured level therefore applies.
        The same precedence rules MUST apply on all the PCEs of the set.
        Where the PCEs of a set do not support the same capabilities (<xref
        target="open"/>), the operator should assign the priorities so that
        a PCE is never the highest priority PCE for LSPs it cannot
        compute.</t>
      </section>

      <section title="Information and Data Models" toc="default">
        <t>The PCEP YANG module
        <xref target="RFC9826"/> does not include support for state-sync. It can be extended to include, at the very least:</t>
        <ul>
        <li>Indicate whether state-sync is supported at the local and remote peer</li>
        <li>Enablement and disablement of state-sync capability</li>
        <li>Indicate whether the PCEP session between PCEs has state-sync enabled</li>
        <li>View the sources via which LSP information is received</li>
        <li>View the PCC information database, including PCCs learned via state-sync peers</li>
        <li>Setting computation priority as per <xref target="control"/></li>
        <li>View which PCE is the computing PCE for an LSP and any sub-delegation</li>
        </ul>

      </section>

      <section title="Liveness Detection and Monitoring" toc="default">
        <t>Mechanisms defined in this document do not imply any new liveness
        detection and monitoring requirements in addition to those already
        listed in <xref target="RFC5440"/> and <xref target="RFC8231"/>.</t>
      </section>

      <section anchor="ops-verify" title="Verify Correct Operations" toc="default">
        <t>In addition to the verification requirements listed in <xref
        target="RFC5440"/>, an operator MUST be able to verify that
        state-sync sessions are established to all members of the state-sync
        PCE set (the full mesh) and that the computation priorities are
        provisioned consistently across the members. Priority consistency
        needs to be checked through the management system, as priorities
        are not exchanged in PCEP.
        An implementation SHOULD raise an alarm when a configured state-sync
        session is down, when a sub-delegation is received for an LSP for
        which the local PCE does not consider itself the computing PCE
        (<xref target="failures"/>), and when a message is ignored because of
        the PCEP-PATH-VECTOR TLV check (<xref target="path-vector-tlv"/>).</t>
      </section>

      <section title="Requirements On Other Protocols" toc="default">
        <t>Mechanisms defined in this document do not imply any new
        requirements on other protocols.</t>
      </section>

      <section title="Impact On Network Operations" toc="default">
        <t>Mechanisms defined in this document improve the network operations
        by alleviating the problems described in <xref target="problem"/>.  The
		"full mesh" requirement applies only among PCEs that participate in
		inter-PCE state synchronization for the same set of PCCs or
		associations. In operational deployments, this typically involves
		a small number of PCEs (e.g., two or three for redundancy), making
		a full mesh feasible for deterministic state consistency and loop
		prevention; see <xref target="ops-design"/> for other use cases.</t>
      </section>
    </section>

    <section anchor="Acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>

      <t>Thanks to <xref format="default" target="I-D.knodel-terminology"/>
      for urging better use of terms.</t>

      <t>Thanks to Andrew Stone for shepherding this document and for providing
      useful reviews and comments. Thanks to Ketan Talaulikar for the
      detailed AD review.</t>
    </section>

    <section anchor="IANA" numbered="true" toc="default">
      <name>IANA Considerations</name>

      <t>This document requests IANA actions to allocate code points for the
      protocol elements defined in this document. All the registries
      referred to in this section are part of the "Path Computation Element
      Protocol (PCEP) Numbers" registry group
      (https://www.iana.org/assignments/pcep/).</t>

      <section anchor="IANA-error" numbered="true" toc="default">
        <name>PCEP-Error Object</name>

        <t>This document defines a new Error-Value within the "Mandatory
        Object Missing" Error-Type and a new Error-Value within the "LSP
        instantiation error" Error-Type. IANA is requested to allocate the
        new error values within the "PCEP-ERROR Object Error Types and
        Values" registry, as follows:</t>

        <table align="left">
          <thead>
            <tr>
              <th align="center">Error-Type</th>

              <th align="left">Meaning</th>

              <th align="left">Reference</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td align="center">6</td>

              <td align="left">Mandatory Object Missing</td>

              <td align="left">
                <xref format="default" target="RFC5440"/>
              </td>
            </tr>

            <tr>
              <td align="center"/>

              <td align="left">Error-value=TBD1: SPEAKER-ENTITY-ID TLV
              missing</td>

              <td align="left">This document</td>
            </tr>

            <tr>
              <td align="center">24</td>

              <td align="left">LSP instantiation error</td>

              <td align="left">
                <xref format="default" target="RFC8281"/>
              </td>
            </tr>

            <tr>
              <td align="center"/>

              <td align="left">Error-value=TBD5: No PCEP session with the
              headend</td>

              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="IANA-TLV" numbered="true" toc="default">
        <name>PCEP TLV Type Indicators</name>

        <t>IANA is requested to allocate new TLV Type Indicator values within
        the "PCEP TLV Type Indicators" registry, as follows:</t>

        <table align="left">
          <thead>
            <tr>
              <th align="center">Value</th>

              <th align="center">Meaning</th>

              <th align="center">Reference</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td align="center">TBD2</td>

              <td align="center">ORIGINAL-LSP-DB-VERSION TLV</td>

              <td align="center">This document</td>
            </tr>

            <tr>
              <td align="center">TBD3</td>

              <td align="center">PCEP-PATH-VECTOR TLV</td>

              <td align="center">This document</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="IANA-cap" numbered="true" toc="default">
        <name>STATEFUL-PCE-CAPABILITY TLV</name>

        <t>IANA is requested to allocate a new bit value in the
        "STATEFUL-PCE-CAPABILITY TLV Flag Field" registry, as follows:</t>

        <table align="left">
          <thead>
            <tr>
              <th align="center">Bit</th>

              <th align="center">Description</th>

              <th align="center">Reference</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td align="center">TBD4</td>

              <td align="center">INTER-PCE-CAPABILITY</td>

              <td align="center">This document</td>
            </tr>
          </tbody>
        </table>
      </section>

      <section anchor="IANA-notif" numbered="true" toc="default">
        <name>Notification Object</name>

        <t>IANA is requested to allocate a new Notification Type and
        Notification Values within the "Notification Object" registry, as
        follows:</t>

        <table align="left">
          <thead>
            <tr>
              <th align="center">Notification-type</th>

              <th align="left">Meaning</th>

              <th align="left">Reference</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td align="center">TBD6</td>

              <td align="left">Inter-PCE State-sync</td>

              <td align="left">
                This document
              </td>
            </tr>

            <tr>
              <td align="center"/>

              <td align="left">Notification-value=1: Add PCC's Open Information</td>

              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="center"/>

              <td align="left">Notification-value=2: Remove PCC's Open Information</td>

              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4291.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5440.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8231.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8232.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8281.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8408.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8253.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8697.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9826.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>
      </references>

      <references>
        <name>Informative References</name>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4655.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6805.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7399.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9325.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9552.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8051.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8751.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8800.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9059.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-pce-pceps-tls13.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-knodel-terminology.xml"
                    xmlns:xi="http://www.w3.org/2001/XInclude"/>

      </references>
    </references>

    <section anchor="examples" numbered="true" toc="default">
      <name>Examples</name>

      <t>The examples in this appendix are for illustrative purposes only, to show how
      the behavior of the state-sync inter-PCE session works.</t>

      <section anchor="example1" numbered="true" toc="default">
        <name>Example 1 - Successful disjoint paths (requiring reroute)</name>

        <figure anchor="disjointReroute">
          <name>Disjoint Paths Requiring Reroute</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
      _________________________________________
     /                                         \
    /        +------+            +------+       \
   |         | PCE1 |            | PCE2 |        |
   |         +------+            +------+        |
   |                                             |
   | +------+           10             +------+  |
   | | PCC1 | ----- R1 ---- R2 ------- | PCC2 |  |
   | +------+       |        |         +------+  |
   |                |        |                   |
   |                |        |                   |
   | +------+       |        |         +------+  |
   | | PCC3 | ----- R3 ---- R4 ------- | PCC4 |  |
   | +------+                          +------+  |
   |                                             |
    \                                           /
     \_________________________________________/


          +----------+
          |   PCC1   |  LSP : PCC1->PCC2
          +----------+
            /
       D=1 /
   +---------+    +---------+
   |  PCE1   |----|  PCE2   |
   +---------+    +---------+
                   / D=1
                  /
          +----------+
          |   PCC3   |  LSP : PCC3->PCC4
          +----------+

PCE1 computation priority 100
PCE2 computation priority 200
            ]]>
          </artwork>
        </figure>

        <t>Consider the PCEP sessions in <xref target="disjointReroute" />, where computation
        priority is global for all the LSPs, and a link-disjoint path between LSPs
        PCC1-&gt;PCC2 and PCC3-&gt;PCC4 is required.</t>

        <t>Consider the PCC1-&gt;PCC2 is configured first, and PCC1 delegates
        the LSP to PCE1, but as PCE1 does not have the highest computation
        priority, it sub-delegates the LSP to PCE2 by sending a PCRpt with D=1
        and including the SPEAKER-ENTITY-ID TLV over the state-sync session.
        PCE2 receives the PCRpt, and as it has delegation for this LSP, it
        computes the shortest path: R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2. It then
        sends a PCUpd to PCE1 (including the SPEAKER-ENTITY-ID TLV) with the
        computed ERO. PCE1 forwards the PCUpd to PCC1 (removing the
        SPEAKER-ENTITY-ID TLV). PCC1 acknowledges the PCUpd by a PCRpt to PCE1.
        PCE1 forwards the PCRpt to PCE2.</t>

        <t>When PCC3-&gt;PCC4 is configured, PCC3 delegates the LSP to PCE2,
        PCE2 can compute a disjoint path as it has knowledge of both LSPs and
        has delegation also for both. The only solution found is to move
        PCC1-&gt;PCC2 LSP on another path, PCE2 can move PCC1-&gt;PCC2 as it
        has sub-delegation for it. It creates a new PCUpd with a new ERO:
        R1-&gt;R2-PCC2 toward PCE1 which forwards to PCC1. PCE2 sends a PCUpd
        to PCC3 with the path: R3-&gt;R4-&gt;PCC4.</t>

        <t>In this setup, PCEs are able to find a disjoint path, while without
        state-sync and computation priority, they could not.</t>
      </section>

      <section anchor="example2" numbered="true" toc="default">
        <name>Example 2 - Successful disjoint paths (simultaneous turnup)</name>

        <figure anchor="disjointTurnup">
          <name>Disjoint Paths with Simultaneous Turnup</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
      _____________________________________
     /                                     \
    /        +------+        +------+       \
   |         | PCE1 |        | PCE2 |        |
   |         +------+        +------+        |
   |                                         |
   | +------+         100          +------+  |
   | |      | -------------------- |      |  |
   | | PCC1 | ----- R1 ----------- | PCC2 |  |
   | +------+       |              +------+  |
   |    |           |                  |     |
   |  6 |           | 2                | 2   |
   |    |           |                  |     |
   | +------+       |              +------+  |
   | | PCC3 | ----- R3 ----------- | PCC4 |  |
   | +------+               10     +------+  |
   |                                         |
    \                                       /
     \_____________________________________/


          +----------+
          |   PCC1   |  LSP : PCC1->PCC2
          +----------+
            /     \
       D=1 /       \ D=0
   +---------+    +---------+
   |  PCE1   |----|  PCE2   |
   +---------+    +---------+
        D=0 \      / D=1
             \    /
          +----------+
          |   PCC3   |  LSP : PCC3->PCC4
          +----------+

PCE1 computation priority 200
PCE2 computation priority 100
            ]]>
          </artwork>
        </figure>

        <t>In this example (see <xref target="disjointTurnup" />), suppose both
        LSPs are configured almost at the same time. PCE2 sub-delegates
        PCC3-&gt;PCC4 to PCE1 while PCE1 keeps delegation for PCC1-&gt;PCC2,
        PCE1 computes a path for PCC1-&gt;PCC2 and PCC3-&gt;PCC4, and can
        achieve disjointness computation easily. No computation loop happens
        in this case.</t>
      </section>

      <section anchor="example3" numbered="true" toc="default">
        <name>Example 3 - Unfeasible disjoint paths (insufficient state-sync sessions)</name>

        <figure anchor="unfeasibleDisjoint">
          <name>Unfeasible Disjoint Paths</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
      _________________________________________
     /                                         \
    /        +------+            +------+       \
   |         | PCE1 |            | PCE2 |        |
   |         +------+            +------+        |
   |                                             |
   | +------+           10             +------+  |
   | | PCC1 | ----- R1 ---- R2 ------- | PCC2 |  |
   | +------+       |        |         +------+  |
   |                |        |                   |
   |                |        |                   |
   | +------+       |        |         +------+  |
   | | PCC3 | ----- R3 ---- R4 ------- | PCC4 |  |
   | +------+                          +------+  |
   |                                             |
    \                                           /
     \_________________________________________/


          +----------+
          |   PCC1   |  LSP : PCC1->PCC2
          +----------+
            /
       D=1 /
   +---------+    +---------+    +---------+
   |  PCE1   |----|  PCE2   |----|  PCE3   |
   +---------+    +---------+    +---------+
                   / D=1
                  /
          +----------+
          |   PCC3   |  LSP : PCC3->PCC4
          +----------+

PCE1 computation priority 100
PCE2 computation priority 200
PCE3 computation priority 300
            ]]>
          </artwork>
        </figure>

        <t>With the PCEP sessions as in <xref target="unfeasibleDisjoint" />,
        consider the need to have link disjoint LSPs PCC1-&gt;PCC2 and PCC3-&gt;PCC4.</t>

        <t>Suppose PCC1-&gt;PCC2 is configured first, PCC1 delegates the LSP
        to PCE1, but as PCE1 does not have the highest computation priority,
        it will sub-delegate the LSP to PCE2 (as it is not aware of PCE3 and has
        no way to reach it). PCE2 cannot compute a path for PCC1-&gt;PCC2 as
        it does not have the highest priority and is not allowed to
        sub-delegate the LSP again toward PCE3 as per <xref format="default"
        target="priority"/>.</t>

        <t>When PCC3-&gt;PCC4 is configured, PCC3 delegates the LSP to PCE2
        that performs sub-delegation to PCE3. As PCE3 will have knowledge of
        only one LSP in the group, it cannot compute disjointness and can
        decide to fall back to a less constrained computation to provide a
        path for PCC3-&gt;PCC4. In this case, it will send a PCUpd to PCE2
        that will be forwarded to PCC3.</t>

        <t>Disjointness cannot be achieved in this scenario because of lack of
        state-sync session between PCE1 and PCE3, but no computation loop
        happens. Thus it is required for all PCEs that support state-sync to
        have full mesh sessions between each other (<xref
        target="updates"/>).</t>
      </section>
    </section>

    <section anchor="scaling" numbered="true" toc="default">
      <name>Using Computation Priority and State-Sync Sessions to Increase Scaling</name>

      <t>The computation priority and state-sync session architecture can be
      used to increase the scaling of the PCE architecture (<xref
      target="scalability"/>). Using computation priorities and state-sync
      sessions may allow to create groups of PCEs that manage a subset of
      the PCCs and perform some or no path computations. Decoupling PCEP
      session maintenance and computation will allow increasing scaling of
      the PCE architecture.</t>

        <figure anchor="scalable">
          <name>Improved Scalability</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
            +----------+
            |  PCC500  |
          +----------+-+
          |   PCC1   |
          +----------+
            /     \
           /       \
   +---------+   +---------+
   |  PCE1   |---|  PCE2   |
   +---------+   +---------+
        |    \  /    |
        |     \/     |
        |     /\     |
        |    /  \    |
   +---------+   +---------+
   |  PCE3   |---|  PCE4   |
   +---------+   +---------+
           \       /
            \     /
          +----------+
          |  PCC501  |
          +----------+-+
            |  PCC1000 |
            +----------+
            ]]>
          </artwork>
        </figure>

      <t>In <xref target="scalable" />, two groups of PCEs are created: PCE1/2 maintain
      PCEP sessions with PCC1 up to PCC500, while PCE3/4 maintain PCEP
      sessions with PCC501 up to PCC1000. All four PCEs form one state-sync
      PCE set with a full mesh of state-sync sessions. A granular computation
      priority policy is set up as follows to load-share computation between
      PCEs:</t>

      <ul spacing="normal">
        <li>PCE1 has priority 200 for association ID 1 up to 300, association
        source 0.0.0.0. All other PCEs have a decreasing priority for those
        associations.</li>

        <li>PCE3 has priority 200 for association ID 301 up to 500,
        association source 0.0.0.0. All other PCEs have a decreasing priority
        for those associations.</li>
      </ul>

      <t>If some PCCs delegate LSPs with association ID 1 up to 300 and
      association source 0.0.0.0, the receiving PCE (if not PCE1) will
      sub-delegate the LSPs to PCE1. PCE1 becomes responsible for the
      computation of these LSP associations while PCE3 is responsible for the
      computation of another set of associations.</t>

      <t>The procedures described in this document could help greatly in
      load-sharing between a group of stateful PCEs (see <xref
      target="ops-design"/>).</t>
    </section>

    <section anchor="scenarios" numbered="true" toc="default">
      <name>Scenarios</name>

        <t>This appendix provides several scenarios for illustrative purposes,
           based on the topology of <xref target="linkDisjoint"/>.
           There are many other cases where the solution defined in this document is also
           applicable.</t>

        <section anchor="Scenario1" numbered="true" toc="default">
        <name>Scenario 1</name>

        <t>In the normal case (PCE1 as active PCE), consider that
        PCC1-&gt;PCC2 LSP is configured first with the link disjointness
        constraint, PCE1 sends a PCUpd message to PCC1 with the Explicit Routing Object (ERO):
        R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2 (shortest path). PCC1 signals and
        installs the path. When PCC3-&gt;PCC4 is configured, the PCEs already
        knows the path of PCC1-&gt;PCC2 and can compute a link-disjoint path:
        the solution requires to move PCC1-&gt;PCC2 onto a new path to let
        room for the new LSP. PCE1 sends a PCUpd message to PCC1 with the new
        ERO: R1-&gt;R2-&gt;PCC2 and a PCUpd to PCC3 with the following ERO:
        R3-&gt;R4-&gt;PCC4. In the normal case, there is no issue for PCE1 to
        compute a link-disjoint path.</t>
        </section>

        <section anchor="Scenario2" numbered="true" toc="default">
        <name>Scenario 2</name>

        <t>Consider that PCC1 lost its PCEP session with PCE1 (all other PCEP
        sessions are UP) as shown in <xref target="scene2" />. PCC1 delegates its LSP to PCE2.</t>

        <figure anchor="scene2">
          <name>Scenario 2</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP: PCC1->PCC2
          +----------+
                  \
                   \ D=1
   +---------+    +---------+
   |  PCE1   |    |  PCE2   |
   +---------+    +---------+
       D=1 \       / D=0
            \     /
          +----------+
          |   PCC3   |  LSP: PCC3->PCC4
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>Consider that the PCC1-&gt;PCC2 LSP is configured first with the
        link disjointness constraint, PCE2 (which is the new active
        PCE for PCC1) sends a PCUpd message to PCC1 with the ERO:
        R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2 (shortest path). When PCC3-&gt;PCC4
        is configured, PCE1 is not aware of LSPs from PCC1 anymore, so it
        cannot compute a disjoint path for PCC3-&gt;PCC4 and will send a PCUpd
        message to PCC3 with the shortest path ERO: R3-&gt;R4-&gt;PCC4. When
        PCC3-&gt;PCC4 LSP will be reported to PCE2 by PCC3, PCE2 will ensure
        disjointness computation and will correctly move PCC1-&gt;PCC2 (as it
        owns delegation for this LSP) on the following path:
        R1-&gt;R2-&gt;PCC2. With this sequence of events and these PCEP
        sessions, disjointness is ensured.</t>
      </section>

      <section anchor="Scenario3" numbered="true" toc="default">
        <name>Scenario 3</name>

        <figure anchor="scene3">
          <name>Scenario 3</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP: PCC1->PCC2
          +----------+
            /     \
       D=1 /       \ D=0
   +---------+    +---------+
   |  PCE1   |    |  PCE2   |
   +---------+    +---------+
                   / D=1
                  /
          +----------+
          |   PCC3   |  LSP: PCC3->PCC4
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>Consider the PCEP sessions in <xref target="scene3" />, and the PCC1-&gt;PCC2 LSP is
        configured first with the link disjointness constraint, PCE1 computes
        the shortest path as it is the only LSP in the disjoint association
        group that it is aware of: R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2 (shortest
        path). When PCC3-&gt;PCC4 is configured, PCE2 must compute a disjoint
        path for this LSP. The only solution found is to move PCC1-&gt;PCC2
        LSP on another path, but PCE2 cannot do it as it does not have
        delegation for this LSP. In this setup, PCEs are not able to find a
        disjoint path.</t>
      </section>

      <section anchor="Scenario4" numbered="true" toc="default">
        <name>Scenario 4</name>

        <figure anchor="scene4">
          <name>Scenario 4</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
          +----------+
          |   PCC1   |  LSP: PCC1->PCC2
          +----------+
            /     \
       D=1 /       \ D=0
   +---------+    +---------+
   |  PCE1   |    |  PCE2   |
   +---------+    +---------+
        D=0 \      / D=1
             \    /
          +----------+
          |   PCC3   |  LSP: PCC3->PCC4
          +----------+
            ]]>
          </artwork>
        </figure>

        <t>Consider the PCEP sessions in <xref target="scene4" />, and that PCEs are configured to
        fall-back to the shortest path if disjointness cannot be found as
        described in <xref format="default" target="RFC8800"/>. The
        PCC1-&gt;PCC2 LSP is configured first, PCE1 computes the shortest path
        as it is the only LSP in the disjoint association group that it is
        aware of: R1-&gt;R3-&gt;R4-&gt;R2-&gt;PCC2 (shortest path). When
        PCC3-&gt;PCC4 is configured, PCE2 must compute a disjoint path for
        this LSP. The only solution found is to move PCC1-&gt;PCC2 LSP on
        another path, but PCE2 cannot do it as it does not have delegation for
        this LSP. PCE2 then provides the shortest path for PCC3-&gt;PCC4:
        R3-&gt;R4-&gt;PCC4. When PCC3 receives the ERO, it reports it back to
        both PCEs. When PCE1 becomes aware of the PCC3-&gt;PCC4 path, it
        recomputes the constrained shortest path first (CSPF) algorithm and
        provides a new path for PCC1-&gt;PCC2: R1-&gt;R2-&gt;PCC2. The new
        path is reported back to all PCEs by PCC1. PCE2 also recomputes CSPF
        to take into account the new reported path. The new computation does
        not lead to any path update.</t>
        </section>

        <section anchor="Scenario5" numbered="true" toc="default">
        <name>Scenario 5</name>

        <figure anchor="scene5">
          <name>Scenario 5</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
      _____________________________________
     /                                     \
    /        +------+        +------+       \
   |         | PCE1 |        | PCE2 |        |
   |         +------+        +------+        |
   |                                         |
   | +------+         100          +------+  |
   | |      | -------------------- |      |  |
   | | PCC1 | ----- R1 ----------- | PCC2 |  |
   | +------+       |              +------+  |
   |    |           |                  |     |
   |  6 |           | 2                | 2   |
   |    |           |                  |     |
   | +------+       |              +------+  |
   | | PCC3 | ----- R3 ----------- | PCC4 |  |
   | +------+               10     +------+  |
   |                                         |
    \                                       /
     \_____________________________________/

            ]]>
          </artwork>
        </figure>

        <t>Now, consider a new network topology in <xref target="scene5" /> with the same PCEP sessions as
        the previous example. Suppose that both LSPs are configured almost at
        the same time. PCE1 will compute a path for PCC1-&gt;PCC2 while PCE2
        will compute a path for PCC3-&gt;PCC4. As each PCE is not aware of the
        path of the second LSP in the association group (not reported yet),
        each PCE is computing the shortest path for the LSP. PCE1 computes
        ERO: R1-&gt;PCC2 for PCC1-&gt;PCC2 and PCE2 computes ERO:
        R3-&gt;R1-&gt;PCC2-&gt;PCC4 for PCC3-&gt;PCC4. When these shortest
        paths will be reported to each PCE, each PCE will recompute
        disjointness. PCE1 will provide a new path for PCC1-&gt;PCC2 with ERO:
        PCC1-&gt;PCC2. PCE2 will also provide a new path for PCC3-&gt;PCC4
        with ERO: R3-&gt;PCC4. When those new paths will be reported to both
        PCEs, this will trigger CSPF again. PCE1 will provide a new more
        optimal path for PCC1-&gt;PCC2 with ERO: R1-&gt;PCC2 and PCE2 will
        also provide a more optimal path for PCC3-&gt;PCC4 with ERO:
        R3-&gt;R1-&gt;PCC2-&gt;PCC4. So we come back to the initial state.
        When those paths are reported to both PCEs, this will trigger CSPF
        again. An infinite loop of CSPF computation is then happening with a
        permanent flap of paths because of the split-brain situation.</t>

        <t>Another common example to note would be two LSPs with link-diverse paths that
        share a common node in their path but are delegated to different PCEs. In case of the
        common node failure, both PCEs would detect the same, and each could independently
        compute a new path that might both choose the same new link.</t>

        <t>This permanent computation loop comes from the inconsistency
        between the state of the LSPs as seen by each PCE due to the
        split-brain: each PCE is trying to modify at the same time its
        delegated path based on the last received path information, which de
        facto invalidates this received path information.</t>

        </section>

        <section anchor="Scenario6" numbered="true" toc="default">
        <name>Scenario 6</name>

        <figure anchor="scene6">
          <name>Scenario 6</name>
          <artwork name="" type="" align="left" alt="">
            <![CDATA[
         Domain/Area 1        Domain/Area 2
      ________________      ________________
     /                \    /                \
    /        +------+ |   |  +------+        \
   |         | PCE1 | |   |  | PCE3 |        |
   |         +------+ |   |  +------+        |
   |                  |   |                  |
   |         +------+ |   |  +------+        |
   |         | PCE2 | |   |  | PCE4 |        |
   |         +------+ |   |  +------+        |
   |                  |   |                  |
   | +------+         |   |        +------+  |
   | | PCC1 |         |   |        | PCC2 |  |
   | +------+         |   |        +------+  |
   |                  |   |                  |
   |                  |   |                  |
   | +------+         |   |        +------+  |
   | | PCC3 |         |   |        | PCC4 |  |
   | +------+         |   |        +------+  |
    \                 |   |                  |
     \_______________/     \________________/
            ]]>
          </artwork>
        </figure>

        <t>In the example in <xref target="scene6" />, suppose that the disjoint LSPs from PCC1 to
        PCC2 and from PCC4 to PCC3 are created. All the PCEs have the
        knowledge of both domain topologies (e.g. using BGP-LS <xref
        format="default" target="RFC9552"/>). For operation/management
        reasons, each domain uses its own group of redundant PCEs. PCE1/PCE2
        in domain 1 have PCEP sessions with PCC1 and PCC3 while PCE3/PCE4 in
        domain 2 have PCEP sessions with PCC2 and PCC4. As PCE1/2 does not
        know about LSPs from PCC2/4, and PCE3/4 do not know about LSPs from
        PCC1/3, there is no possibility to compute the disjointness
        constraint. This scenario can also be seen as a split-brain scenario.
        This multi-domain architecture (with multiple groups of PCEs) can also
        be used in a single domain, where an operator wants to limit the
        failure domain by creating multiple groups of PCEs, maintaining a
        subset of PCCs. As for the multi-domain example, there will be no
        possibility to compute the disjoint path starting from the head-ends
        managed by different PCE groups.</t>

        <t>In this document, we specify a solution that addresses the
        possibility to compute LSP association-based constraints (like
        disjointness) in split-brain scenarios while preventing computation
        loops.</t>
        </section>

    </section>

    <section numbered="false" toc="default">
      <name>Contributors</name>

      <artwork align="left" alt="" name="" type=""><![CDATA[
Dhruv Dhody
Huawei
India

Email: dhruv.ietf@gmail.com
    ]]></artwork>
    </section>

  </back>
</rfc>
