<?xml version="1.0" encoding="us-ascii"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"[]>
<?rfc toc="yes" ?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="no"?>
<?rfc rfcedstyle="yes"?>
<?rfc subcompact="no"?>
<?rfc compact="yes" ?>
<?rfc iprnotified="Yes" ?>
<?rfc strict="no" ?>
<rfc ipr="trust200902" category="std" docName="draft-chen-pce-h-discovery-10" obsoletes="" updates="" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="H-PCE-Determination">Hierarchical PCE Determination</title>
    <author initials="H" surname="Chen" fullname="Huaimo Chen">
      <organization>Futurewei</organization>
      <address>
        <postal>
          <street></street>
          <city>Boston, MA</city>
          <region></region>
          <code></code>
          <country>USA</country>
        </postal>
        <email>Huaimo.chen@futurewei.com</email>
      </address>
    </author>

 <author initials="M" fullname="Mehmet Toy" 
            surname="Toy">
      <organization>Verizon</organization>
      <address>
        <postal>
          <street> </street>
          <country>USA</country>
        </postal>
        <email>mehmet.toy@verizon.com</email>
<!-- mtoy054@yahoo.com -->
      </address>
 </author>


 <author initials="X" fullname="Xufeng Liu" 
            surname="Liu">
      <organization>Volta Networks</organization>
      <address>
        <postal>
          <street> </street>
          <city>McLean</city>
          <region>VA</region>
          <code></code>
          <country>USA</country>
        </postal>
        <email>xufeng.liu.ietf@gmail.com</email>
      </address>
    </author>

 <author initials="L" fullname="Lei Liu" 
            surname="Liu">
      <organization>Fujitsu</organization>
      <address>
        <postal>
          <street> </street>
          <city> </city>
          <region></region>
          <code></code>
          <country>USA</country>
        </postal>
        <email>liulei.kddi@gmail.com</email>
      </address>
    </author>

  <author fullname="Zhenqiang Li" initials="Z" surname="Li">
    	<organization>China Mobile</organization>
    	<address>
        <postal>
          <street>No.32 Xuanwumenxi Ave., Xicheng District</street>
          <city>Beijing</city>
          <code>100032</code>
          <country>P.R. China</country>
        </postal>
        <email>li_zhenqiang@hotmail.com</email>
      </address>
    </author>

<!--
 <author initials="V" fullname="Vic Liu" 
            surname="Liu">
      <organization>China Mobile</organization>
      <address>
        <postal>
          <street>No.32 Xuanwumen West Street, Xicheng District</street>
          <city>Beijing</city>
          <region></region>
          <code>100053</code>
          <country>China</country>
        </postal>
        <email>liuzhiheng@chinamobile.com</email>
      </address>
 </author>
-->

    <date year="2022" />
    <area>Routing</area>
    <workgroup>PCE Working Group</workgroup> 


<abstract>
<t>
This document presents extensions to 
the Path Computation Element Communication Protocol (PCEP) 
for determining parent child relations and 
exchanging the information between a parent and a child PCE 
in a hierarchical PCE system.
</t>
</abstract>

  </front>
  <middle>

    <section title="Introduction" toc="default">


    <t>A hierarchical PCE architecture is described in RFC 6805, in which a parent PCE has a number of child PCEs. A child PCE may also be a parent PCE, which has multiple child PCEs.  
</t>

    <t>For a parent PCE, it needs to obtain the information about each of its child PCEs. The information about a child PCE comprises the address or ID of the PCE and the domain for which the PCE is responsible. It may also include the position of the PCE, which indicates whether the PCE is a leaf (i.e., only a child) or branch (i.e., a child and also a parent).
In addition, the information may indicate 
whether the child PCE and its responsible domain 
is in a same organization as the parent PCE.
</t>

    <t>For a child PCE, it needs to obtain the information about its parent PCE, which includes the address or ID of the parent PCE. The information may also indicate whether 
the parent PCE is in a same organization as the child PCE. 
</t>

    <t>After a user configures a parent PCE and a child PCE 
over a session, this parent child PCE relation needs to be 
determined in the protocol level. 
This is similar to OSPF and BGP. 
After an adjacency between two OSPF routers is configured 
by a user, the OSPF protocol (refer to RFC 2328, Section 7) 
will determine whether the adjacency is allowed 
based on the parameters configured, 
and forms the OSPF adjacency after the determination. 
After a peer relation between two BGP routers is configured 
by a user, the BGP protocol (refer to RFC 4271, Section 8) 
will determine whether the peer is allowed 
based on the parameters configured, 
and forms the BGP peer relation after the determination.</t>
 

    <t>For a parent child PCE relation determination, 
the PCE protocol needs to check or confirm 
whether the parent child PCE relation is allowed based on
the parameters configured. 
If so, the child PCE has to send its parent PCE the information 
about it and vice versa.
</t>

    <t>This document presents extensions to the Path Computation Element Communication Protocol (PCEP) for 
determining parent child relations and 
exchanging the information between a parent and a child PCE in a hierarchical PCE system.
</t>

    </section>


    <section title="Terminology" toc="default">
    <t>The following terminology is used in this document.

    <list style="hanging">

       <t hangText="Parent Domain:">A domain higher up in a domain hierarchy such that it
   contains other domains (child domains) and potentially other links
   and nodes.</t>

       <t hangText="Child Domain:">A domain lower in a domain hierarchy such that it has a
   parent domain.</t>

       <t hangText="Parent PCE:">A PCE responsible for selecting a path across a parent
   domain and any number of child domains by coordinating with child
   PCEs and examining a topology map that shows domain inter-
   connectivity.</t>

       <t hangText="Child PCE:">A PCE responsible for computing the path across one or
   more specific (child) domains. A child PCE maintains a relationship
   with at least one parent PCE.</t>

       <t hangText="TED:">Traffic Engineering Database.</t>

     </list>
   </t>

   <t>This document uses terminology defined in <xref target="RFC5440"/>.</t>

    </section>


    <section title="Conventions Used in This Document" toc="default">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
      </section>


    <section title="Extensions to PCEP" toc="default"> 

    <t>

</t> 
    <t>This section describes the extensions to PCEP 
for determining the relation between a parent PCE and a child PCE and 
exchanging the information between a parent and a child PCE 
in a hierarchical PCE system.

A child PCE is simply called a child and 
a parent PCE is called a parent in the following sections.
</t>

    	<section title="Determination of Parent Child Relation" toc="default"> 

<t>
During a PCEP session establishment between two PCEP speakers,
each of them advertises its capabilities for Hierarchical PCE (H-PCE for short)
through the Open Message with the Open Object containing 
a new TLV to indicate its capabilities for H-PCE.

This new TLV is called H-PCE capability TLV. It has the following format.

<figure>
  <artwork> <![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 = TBD1        |            Length             |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |P|C|S|B|                Capability Flags                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Optional  Sub-TLVs                      |
    ~                                                               ~
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]>
  </artwork>
</figure>


The type of the TLV is TBD1. It has a length of 4 octets plus the size of optional Sub-TLVs.
The value of the TLV comprises a capability flags field of 32 bits,
which are numbered from the most significant as bit zero.
Some of them are defined as follows. The others are not defined and MUST be set to zero.
</t>

<t>
<list style="hanging">
    <t hangText="o">P (Parent - 1 bit): Bit 0 is used as P flag.
It is set to 1 indicating a parent.</t>
    <t hangText="o">C (Child - 1 bit): Bit 1 is used as C flag.
It is set to 1 indicating a child.</t>
    <t hangText="o">S (Same Org - 1 bit): Bit 2 is used as S flag.
It is set to 1 indicating a PCE in a same organization 
as its remote peer.</t>
    <t hangText="o">B (Both - 1 bit): Bit 3 is used as B flag.
It is set to 1 indicating a PCE as both a child and a parent.</t>
</list>
</t>

    <t>The following Sub-TLVs are defined:
<list style="hanging">
    <t hangText="o">A Domain Sub-TLV containing an AS number and optional area, and</t>
    <t hangText="o">PCE-ID Sub-TLV containing the ID of a PCE.</t>
</list>
</t>

</section>


    	<section title="Sub-TLVs" toc="default">  

    <t>When a child sends its parent a Open message, 
it places the information about it in the message 
through using some optional Sub-TLVs. 
When a parent sends each of its child PCEs a Open message, 
it puts the information about it in the message. 
</t>

        <section title="Domain Sub-TLV" toc="default"> 
<t>A domain is an AS or an area in an AS.
An AS is identified by an AS number.  
An area in an AS is identified by the combination of the AS and the area.

The former is indicated by an AS number and the latter by an area number.

A domain is represented by a domain Sub-TLV containing an AS number and
a optional area number.
</t>

    <t>The format of the domain Sub-TLV is shown below:

<figure>
  <artwork> <![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 (tTBD1)          |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                       AS Number (4 bytes)                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ~                      Optional  Area Number                    ~
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

where Length is four plus size of area number. 
  ]]>
  </artwork>
</figure>

</t>

<t>
An AS is represented by a domain Sub-TLV containing only the AS number of the AS.
In this case, the Length is four.
An area in an AS is represented by a domain Sub-TLV containing 
the AS number of the AS and the area number of the area.
In this case, the Length is eight.
</t>

<!--
    <t>The format of the Area-ID Sub-TLV is shown below:
  <artwork> <![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 (tTBD2)          |           Length (4)          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                      Area Number (4 bytes)                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]>
  </artwork></t>
-->

</section> 


        <section title="PCE ID Sub-TLV" toc="default"> 
    <t>An Identifier (ID) of a PCE (PCE ID for short) is 
a 32-bit number 
that uniquely identifies the PCE among all PCEs.
This 32-bit number for PCE ID SHOULD NOT be zero.
</t>

    <t>The format of the PCE ID Sub-TLV is shown below:

<figure>
  <artwork> <![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 (tTBD3)          |           Length (4)          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        PCE ID (4 bytes)                       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]>
The PCE ID Sub-TLV specifies an non zero number as the identifier of the PCE.
  </artwork>
</figure>

</t>

    <t>Alternatively, an IP address attached to a PCE can also be used 
as an identifier of the PCE. 

The format of an IPv4 address Sub-TLV is shown below:

<figure>
  <artwork> <![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 (tTBD4)          |           Length (4)          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     IPv4 Address (4 bytes)                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]>
  </artwork>
</figure>

The IPv4 address Sub-TLV specifies an IPv4 address associated with the PCE, 
which is used as the identifier of the PCE. 
</t>

    <t>The format of an IPv6 address Sub-TLV is shown below:

<figure>
  <artwork> <![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 (tTBD5)          |          Length (16)          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     IPv6 Address (16 bytes)                   |
  ~                                                               ~
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]>
  </artwork>
</figure>

The IPv6 Sub-TLV specifies an IPv6 address associated with the PCE, 
which is used as the identifier of the PCE.
</t>   
</section>

</section>



    <section title="Procedures" toc="default">

<!--
    <t>There are two types of procedures for 
parent-child PCE relation determination: 
auto-determination and configuration driven determination.</t>
 
    <t>For two PCEs belonging to two different service providers, there are some security concerns for automatically determining the parent child PCE relation without any configuration. 

For PCEs belonging to the same service provider, 
we can use auto-determination for determining the parent child PCE relations.

This section considers these two types of determinations.
</t>

     <section title="Configuration Driven Determination" toc="default">
-->

    <t>For two PCEs A and B configured as parent and child, 
they determine parent child relation through Open messages 
in the initialization phase.
 
The following is a sequence of events related.

<figure>
  <artwork> <![CDATA[ 
          A                                     B
     Configure B                           Configure A
     as its child                          as its parent      
                     Open (P=1, A's ID)
                    -------------------> Same as configured
                                           A is B's parent
                     Open (C=1, B's ID)
 Same as configured <-------------------
   B is A's child
   ]]>
   </artwork>
</figure>

A sends B a Open message with P=1 and A's ID 
after B is configured as its child on it.
B sends A a Open message with C=1 and B's ID 
after A is configured as its parent on it.
</t>

<t>
When A receives the Open message from B and 
determines C=1 and the PCE ID of B in the message is the same as the PCE ID of the child locally configured, 
B is A's child. 
</t>

<t>
When B receives the Open message from A and 
determines P=1 and the PCE ID of A in the message is the same as the PCE ID of the parent locally configured, 
A is B's parent. 
</t>

<t>
The Open message from child B to its parent A contains 
B's domain, which is represented by 
a domain Sub-TLV in the H-PCE capability TLV.
If child B is also a parent, the B flag in the TLV is set to 1.
</t>

<t>
The PCE ID in a Open message may be represented 
in one of the following ways: 

<list style="hanging">
    <t hangText="o">The source IP address of the message (i.e., PCE session).</t>
    <t hangText="o">A PCE ID Sub-TLV in the H-PCE capability TLV.</t> 
    <t hangText="o">An IP address Sub-TLV in the H-PCE capability TLV.</t>
</list>
When the IP address Sub-TLV is used, the address in the Sub-TLV MUST
be the same as the source IP address of the PCE session.
</t>

<t>
For a child that is a leaf, it is normally responsible for one domain, 
which is contained in the message to its parent. 
</t>

<t>
For a child that is a branch (i.e., also a parent of multiple child PCEs), 
it may be directly responsible for one domain,
which is contained in the message to its parent.
In addition, it is responsible for the domains of its child PCEs.
In other words, it is responsible for computing paths crossing 
the domains through working together with its child PCEs.
If these domains are all areas of an AS, 
the AS is included in the message to its parent.
</t>

<t>
A parent stores the information about each of its child PCEs received.
When the session to one of them is down, it removes the information about 
the child on that session. 
</t>

<t>
A child stores the information about its parent received.
When the session to the parent is down, it removes the information about
the parent.
</t>


<t>
If there already exists a session between A and B and 
the configurations on parent and child are issued on them,
the procedures above may be executed through bringing down
the existing session and establishing a new session between them.

Alternatively, 
they may determine parent child relation through using 
extended Notification messages in the same procedures 
as using Open messages described above without bringing down
the existing session. 
</t>

<t>
The following new Notification-type and Notification-value are
defined for H-PCE:

<list style="hanging">
    <t hangText="o"> Notification-type=5 (TBD): Determination of H-PCE 
    <list style="hanging">
       <t hangText="*"> Notification-value=1: The information about a parent PCE or a child PCE.
A Notification-type=5, Notification-value=1 indicates that the
PCE sends its peer the information about it and 
a TLV containing the information is in the Notification object.
The format and contents of the TLV is the same as the H-PCE capability TLV described above.
The only difference may be the type of the TLV.</t>
    </list> </t>
</list>
</t>

<!--
    </section>
-->

<!--
    <section title="Auto Determination" toc="default">

    <t>For two PCEs A and B 
belonging to the same service provider, 
their parent child PCE relation may be 
automatically determined 
without any configuration or 
with minimum configuration.
</t>

    <t>For a parent child PCE relation between two PCEs A and B 
to be automatically determined, 
two conditions need to be met. 
One is that both A and B know that 
they are in the same service provider.
The other is that one of them determines that 
it is the parent or child. 
</t>

    <t>After these two conditions are met, 
A and B may automatically determine their parent-child
relation through exchanging the messages 
in a way similar to the one described 
in the previous section.
</t>

    <t>If A (or B) is a child of another PCE X 
over the session between X and A (or B),
then it can determine that 
it is the parent over the session between A and B.
After the parent is determined between A and B, 
the child is implied.
</t>

    <t>If A (or B) is not any child of a PCE,
then it can not determine 
whether it is a parent or child over the session 
between A and B.
In this case, a configuration on A or B is needed
to indicate the parent or child.
</t>

    <t>Two PCEs A and B may know that they are 
in the same service provider through their domains. 
In general, the areas in an AS belong to a same 
service provider. 
After PCEs A and B know that they are responsible for
the areas in the same AS, they know that
they are in the same service provider.
</t>

    <t>For two PCEs A and B responsible 
for two different ASes, 
it is hard for them to determine whether they are 
in the same service provider. 
In this case, a configuration on A and B is needed
to indicate they are in the same service provider.
</t>

     </section>
-->

  </section>
 
</section>  
 


    <section title="Security Considerations" toc="default">
    <t> The mechanism described in this document does not raise any new security issues for the PCEP protocols.</t>
    </section>


    <section title="IANA Considerations" toc="default">
      <t>This section specifies requests for IANA allocation.</t>
    </section>
    
    
    <section title="Acknowledgement" toc="default">
      <t>The authors would like to Jescia Chen, Adrian Farrel for their valuable comments on this draft.</t>
    </section>


  </middle>
  <back>
    <references title="Normative References">
    <?rfc include="reference.RFC.2119.xml" ?>
    <?rfc include="reference.RFC.6805.xml" ?>
    <?rfc include="reference.RFC.5440.xml" ?>

    </references>
    <references title="Informative References">
      <?rfc include="reference.RFC.2328.xml" ?>
      <?rfc include="reference.RFC.4271.xml" ?>
<!--
      <?rfc include="reference.RFC.4105.xml" ?>
      <?rfc include="reference.RFC.4216.xml" ?>
      <?rfc include="reference.RFC.4655.xml" ?>
-->
       
    </references>


  </back>
</rfc>