<?xml version="1.0"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-ietf-mpls-rmr-02" ipr="trust200902">

<front>
  <title>Resilient MPLS Rings</title>

  <author initials="K." surname="Kompella" fullname="Kireeti Kompella">
    <organization>Juniper Networks, Inc.</organization>
    <address>
      <postal>
	<street>1133 Innovation Drive</street>
	<city>Sunnyvale</city>
	<region>CA</region>
	<code>94089</code>
	<country>USA</country>
      </postal>
      <email>kireeti.kompella@gmail.com</email>
    </address>
  </author>

  <author fullname="Luis M. Contreras" initials="L.M." surname="Contreras">
    <organization>Telefonica</organization>
    <address>
      <postal>
        <street>Ronda de la Comunicacion</street>
        <street>Sur-3 building, 3rd floor</street>
        <city>Madrid</city>
        <code>28050</code>
        <country>Spain</country>
      </postal>
      <email>luismiguel.contrerasmurillo@telefonica.com</email>
      <uri>http://people.tid.es/LuisM.Contreras/</uri>
    </address>    
  </author>
  
  <date/>

  <area>Routing</area>
  <workgroup>MPLS WG</workgroup>

  <keyword>MPLS</keyword>
  <keyword>ring</keyword>
  <keyword>transport</keyword>

  <abstract>
    <t>
      This document describes the use of the MPLS control and data
      planes on ring topologies.  It describes the special nature of
      rings, and proceeds to show how MPLS can be effectively used in
      such topologies.  It describes how MPLS rings are configured,
      auto-discovered and signaled, as well as how the data plane
      works.  Companion documents describe the details of discovery
      and signaling for specific protocols.
    </t>
  </abstract>

  <note title="Requirements Language">
    <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>
  </note>
</front>

<middle>
  <section title="Introduction" anchor='intro'>
    <t>
      Rings are a very common topology in transport networks.  A ring
      is the simplest topology offering link and node resilience.
      Rings are nearly ubiquitous in access and aggregation networks.
      As MPLS increases its presence in such networks, and takes on a
      greater role in transport, it is imperative that MPLS handles
      rings well; this is not the case today.
    </t>
    <t>
      This document describes the special nature of rings, and the
      special needs of MPLS on rings.  It then shows how these needs
      can be met in several ways, some of which involve extensions to
      protocols such as IS-IS <xref target="RFC5305"/>, OSPF<xref
      target="RFC3630"/>, RSVP-TE <xref target="RFC3209"/> and LDP
      <xref target="RFC5036"/>.
    </t>
    <t>
      The intent of this document is to handle rings that "occur
      naturally".  Many access and aggregation networks in metros have
      their start as a simple ring.  They may then grow into more
      complex topologies, for example, by adding parallel links to the
      ring, or by adding "express" links.  The goal here is to discover
      these rings (with some guidance), and run MPLS over them
      efficiently.  The intent is not to construct rings in a mesh
      network, and use those for protection.
    </t>

    <section title='Definitions'>
      <t>
	A (directed) graph G = (V, E) consists of a set of vertices
	(or nodes) V and a set of edges (or links) E.  An edge is an
	ordered pair of nodes (a, b), where a and b are in V.  (In
	this document, the terms node and link will be used instead of
	vertex and edge.)
      </t>
      <t>
	A ring is a subgraph of G.  A ring consists of a subset of n
	nodes {R_i, 0 &le; i &lt; n} of V.  The directed edges {(R_i,
	R_i+1) and (R_i+1, R_i), 0 &le; i &lt; n-1} must be a subset
	of E (note that index arithmetic is done modulo n).  We define
	the direction from node R_i to R_i+1 as "clockwise" (CW) and
	the reverse direction as "anticlockwise" (AC).  As there may
	be several rings in a graph, we number each ring with a
	distinct ring ID RID.
	<figure anchor='Fig1' title="Ring with 8 nodes">
	  <artwork align='center'>

                  R0 . . . R1                 
                .             .               
             R7                 R2            
Anti-     |  .        Ring       .  |         
Clockwise |  .                   .  | Clockwise
          v  .      RID = 17     .  v         
             R6                 R3            
                .             .               
                  R5 . . . R4                 
	  </artwork>
	</figure>
      </t>
      <t>
	The following terminology is used for ring LSPs:
	<list style="hanging">
	  <t hangText="Ring ID (RID):">
	    A non-zero number that identifies a ring; this is unique
	    in some scope of a Service Provider's network.  A node may
	    belong to multiple rings.
	  </t>
	  <t hangText="Ring node:">
	    A member of a ring.  Note that a device may belong to
	    several rings.
	  </t>
	  <t hangText="Node index:">
	    A logical numbering of nodes in a ring, from zero upto one
	    less than the ring size.  Used purely for exposition in
	    this document.
	  </t>
	  <t hangText="Ring master:">
	    The ring master initiates the ring identification process.
	    Mastership is indicated in the IGP by a two-bit field.
	  </t>
	  <t hangText='Ring neighbors:'>
	    Nodes whose indices differ by one (modulo ring size).
	  </t>
	  <t hangText='Ring links:'>
	    Links that connnect ring neighbors.
	  </t>
	  <t hangText='Express links:'>
	    Links that connnect non-neighboring ring nodes.
	  </t>
	  <t hangText='Ring direction:'>
	    A two-bit field in the IGP indicating the direction of a
	    link.  The choices are:
	    <list style='hanging'>
	      <t hangText='UN: 00'> undefined link </t>
	      <t hangText='CW: 01'> clockwise ring link </t>
	      <t hangText='AC: 10'> anticlockwise ring link </t>
	      <t hangText='EX: 11'> express link </t>
	    </list>
	  </t>
	  <t hangText='Ring Identification:'>
	    The process of discovering ring nodes, ring links, link
	    directions, and express links.
	  </t>
	</list>
      </t>
      <t>
	The following notation is used for ring LSPs:
	<list style="hanging">
	  <t hangText="R_k:">
	    A ring node with index k.  R_k has AC neighbor R_(k-1) and
	    CW neighbor R_(k+1).
	  </t>
	  <t hangText="RL_k:">
	    A (unicast) Ring LSP anchored on node R_k.
	  </t>
	  <t hangText="CL_jk:">
	    A label allocated by R_j for RL_k in the CW direction.
	  </t>
	  <t hangText="AL_jk:">
	    A label allocated by R_j for RL_k in the AC direction.
	  </t>
	  <t hangText="P_jk (Q_jk):">
	    A Path (Resv) message sent by R_j for RL_k.
	  </t>
	</list>
      </t>
    </section>
  </section>

  <section title="Motivation">
    <t>
      A ring is the simplest topology that offers resilience.  This is
      perhaps the main reason to lay out fiber in a ring.  Thus,
      effective mechanisms for fast failover on rings are needed.
      Furthermore, there are large numbers of rings.  Thus,
      configuration of rings needs to be as simple as possible.
      Finally, bandwidth management on access rings is very important,
      as bandwidth is generally quite constrained here.
    </t>
    <t>
      The goals of this document are to present mechanisms for
      improved MPLS-based resilience in ring networks (using ideas
      that are reminiscent of Bidirectional Line Switched Rings), for
      automatic bring-up of LSPs, better bandwidth management and for
      auto-hierarchy.  These goals can be achieved using extensions to
      existing IGP and MPLS signaling protocols, using central
      provisioning, or in other ways.
    </t>
  </section>

  <section title="Theory of Operation">
    <t>
      Say a ring has ring ID RID.  The ring is provisioned by choosing
      one or more ring masters for the ring and assigning them the
      RID.  Other nodes in the ring may also be assigned this RID, or
      may be configured as "promiscuous".  Ring discovery then kicks
      in.  When each ring node knows its CW and AC ring neighbors and
      its ring links, and all express links have been identified, ring
      identification is complete.
    </t>
    <t>
      Once ring identification is complete, each node signals one or
      more ring LSPs RL_i.  RL_i, anchored on node R_i, consists of
      two counter-rotating unicast LSPs that start and end at R_i.  A
      ring LSP is "multipoint": any node R_j can use RL_i to send
      traffic to R_i; this can be in either the CW or AC directions,
      or both (i.e., load balanced).  Both of these counter-rotating
      LSPs are "active"; the choice of direction to send traffic to
      R_i is determined by policy at the node where traffic is
      injected into the ring.  The default is to send traffic along
      the shortest path.  Bidirectional connectivity between nodes R_i
      and R_j is achieved by using two different ring LSPs: R_i uses
      RL_j to reach R_j, and R_j uses RL_i to reach R_i.
    </t>
<!--
    <t>
      R_i also signals a multicast ring LSP ML_i.  ML_i has ingress
      R_i and consists of counter-rotating multicast LSPs that use the
      "drop-and-continue" paradigm.  Each node R_k "drops" the traffic
      to its associated non-ring nodes that are interested in the
      multicast traffic from R_i, and also "continues" the traffic to
      the next node in the ring (R_(i+1) in the CW direction).
    </t>
-->
    <section title="Provisioning">
      <t>
	The goal here is to provision rings with the absolute minimum
	configuration.  The exposition below aims to achieve that
	using auto-discovery via a link-state IGP (see <xref
	target='autodisc'/>).  Of course, auto-discovery can be
	overriden by configuration.  For example, a link that would
	otherwise be classified by auto-discovery as a ring link might
	be configured not to be used for ring LSPs.
      </t>
    </section>

    <section title='Ring Nodes'>
      <t>
	Ring nodes have a loopback address, and run a link-state IGP
	and an MPLS signaling protocol.  To provision a node as a ring
	node for ring RID, the node is simply assigned that RID.  A
	node may be part of several rings, and thus may be assigned
	several ring IDs.
      </t>
      <t>
	To simplify ring provisioning even further, a node N may be
	made "promiscuous" by being assigned an RID of 0.  A
	promiscuous node listens to RIDs in its IGP neighbors'
	link-state updates.  For every non-zero RID N hears from a
	neighbor, N joins the corresponding ring by taking on that
	RID.  In many situations, the use of promiscuous mode means
	that only one or two nodes in a ring needs to be provisioned;
	everything else is auto-discovered.
      </t>
      <t>
	A ring node indicates in its IGP updates the ring LSP
	signaling protocols it supports.  This can be LDP and/or
	RSVP-TE.  Ideally, each node should support both.
      </t>
    </section>

    <section title='Ring Links and Directions'>
      <t>
	Ring links must be MPLS-capable.  They are by default
	unnumbered, point-to-point (from the IGP point of view) and
	"auto-bundled".  The last attribute means that parallel links
	between ring neighbors are considered as a single link,
	without the need for explicit configuration for bundling (such
	as a Link Aggregation Group).  Note that each component may be
	advertised separately in the IGP; however, signaling messages
	and labels across one component link apply to all components.
	Parallel links between a pair of ring nodes is often the
	result of having multiple lambdas or fibers between those
	nodes.  RMR is primarily intended for operation at the packet
	layer; however, parallel links at the lambda or fiber layer
	result in parallel links at the packet layer.
      </t>
      <t>
	A ring link is not provisioned as belonging to the ring; it is
	discovered to belong to ring RID if both its adjacent nodes
	belong to RID.  A ring link's direction (CW or AC) is also
	discovered; this process is initiated by the ring's ring
	master.  Note that the above two attributes can be overridden
	by provisioning if needed; it is then up to the provisioning
	system to maintain consistency across the ring.
      </t>

      <section title='Express Links'>
	<t>
	  Express links are discovered once ring nodes, ring links and
	  directions have been established.  As defined earlier,
	  express links are links joining non-neighboring ring nodes;
	  often, this may be the result of optically bypassing ring
	  nodes.  The use of express links will be described in a
	  future version of this document.
	</t>
<!--
    <t>
    Express links are both clockwise and anticlockwise.  Thus,
    in <xref target='Fig2'/>, R_7 can reach R_3 in the CW direction
    via R_0 and R_2, treating (R_0, R_2) as CW.  
    </t>
-->
      </section>
    </section>

    <section title='Ring LSPs'>
      <t>
	Ring LSPs are not provisioned.  Once a ring node R_i knows its
	RID, its ring links and directions, it kicks off ring LSP
	signaling automatically.  R_i allocates CW and AC labels for
	each ring LSP RL_k.  R_i also initiates the creation of RL_i.
	As the signaling propagates around the ring, CW and AC labels
	are exchanged.  When R_i receives CW and AC labels for RL_k
	from its ring neighbors, primary and fast reroute (FRR) paths
	for RL_k are installed at R_i.  More details are given in
	<xref target='sig'/>.
      </t>
      <t>
	For RSVP-TE LSPs, bandwidths may be signaled in both
	directions.  However, these are not provisioned either;
	rather, one does "reverse call admission control".  When a
	service needs to use an LSP, the ring node where the traffic
	enters the ring attempts to increase the bandwidth on the LSP
	to the egress.  If successful, the service is admitted to the
	ring.
      </t>
    </section>
  
    <section title="Installing Primary LFIB Entries">
      <t>
	In setting up RL_k, a node R_j sends out two labels: CL_jk to
	R_j-1 and AL_jk to R_j+1.  R_j also receives two labels:
	CL_j+1,k from R_j+1, and AL_j-1,k from R_j-1.  R_j can now set
	up the forwarding entries for RL_k.  In the CW direction, R_j
	swaps incoming label CL_jk with CL_j+1,k with next hop R_j+1;
	these allow R_j to act as LSR for RL_k.  R_j also installs an
	LFIB entry to push CL_j+1,k with next hop R_j+1 to act as
	ingress for RL_k.  Similarly, in the AC direction, R_j swaps
	incoming label AL_jk with AL_j-1,k with next hop R_j-1 (as
	LSR), and an entry to push AL_j-1,k with next hop R_j-1 (as
	ingress).
      </t>
      <t>
	Clearly, R_k does not act as ingress for its own LSPs.
	However, if these LSPs use UHP, then R_k installs LFIB entries
	to pop CL_k,k for packets received from R_k-1 and to pop
	AL_k,k for packets received from R_k+1.
      </t>
    </section>

    <section title="Installing FRR LFIB Entries">
      <t>
	At the same time that R_j sets up its primary CW and AC LFIB
	entries, it can also set up the protection forwarding entries
	for RL_k.  In the CW direction, R_j sets up an FRR LFIB entry
	to swap incoming label CL_jk with AL_j-1,k with next hop
	R_j-1.  In the AC direction, R_j sets up an FRR LFIB entry to
	swap incoming label AL_jk with CL_j+1,k with next hop R_j+1.
	Again, R_k does not install FRR LFIB entries in this manner.
      </t>
    </section>

    <section title="Protection">
      <t>
	In this scheme, there are no protection LSPs as such -- no
	node or link bypass LSPs, no standby LSPs, no detours, and no
	LFA-type protection.  Protection is via the "other" direction
	around the ring, which is why ring LSPs are in
	counter-rotating pairs.  Protection works in the same way for
	link, node and ring LSP failures.
      </t>
      <t>
	If a node R_j detects a failure from R_j+1 -- either all links
	to R_j+1 fail, or R_j+1 itself fails, R_j switches traffic on
	all CW ring LSPs to the AC direction using the FRR LFIB
	entries.  If the failure is specific to a single ring LSP, R_j
	switches traffic just for that LSP.  In either case, this
	switchover can be very fast, as the FRR LFIB entries can be
	preprogrammed.  Fast detection and fast switchover lead to
	minimal traffic loss.
      </t>
      <t>
	R_j then sends an indication to R_j-1 that the CW direction is
	not working, so that R_j-1 can similarly switch traffic to the
	AC direction.  For RSVP-TE, this indication can be a PathErr
	or a Notify; other signaling protocols have similar
	indications.  These indications propagate AC until each
	traffic source on the ring AC of the failure uses the AC
	direction.  Thus, within a short period, traffic will be
	flowing in the optimal path, given that there is a failure on
	the ring.  This contrasts with (say) bypass protection, where
	until the ingress recomputes a new path, traffic will be
	suboptimal.
      </t>
      <t>
	Note that the failure of a node or a link will not necessarily
	affect all ring LSPs.  Thus, it is important to identify the
	affected LSPs (and switch them), but to leave the rest alone.
      </t>
      <t>
	One point to note is that when a ring node, say R_j, fails,
	RL_j is clearly unusable.  However, the above protection
	scheme will cause a traffic loop: R_j-1 detects a failure CW,
	and protects by sending CW traffic on RL_j back all the way to
	R_j+1, which in turn sends traffic to R_j-1, etc.  There are
	three proposals to avoid this:
	<list style='numbers'>
	  <t>
	    Each ring node acting as ingress sends traffic with a TTL
	    of at most 2*n, where n is the number of nodes in the ring.
	  </t>
	  <t>
	    A ring node sends protected traffic (i.e., traffic
	    switched from CW to AC or vice versa) with TTL just
	    large enough to reach the egress.
	  </t>
	  <t>
	    A ring node sends protected traffic with a special purpose
	    label below the ring LSP label.  A protecting node first
	    checks for the presence of this label; if present, it
	    means that the traffic is looping and MUST be dropped.
	  </t>
	</list>
	It is recommended that (2) be implemented.  The other methods
	are optional.
      </t>
    </section>
  </section>

  <section title='Autodiscovery' anchor='autodisc'>
    <section title='Overview'>
      <t>
	Auto-discovery proceeds in three phases.  The first phase is
	the announcement phase.  The second phase is the mastership
	phase.  The third phase is the ring identification phase.
	<figure anchor='Fig2' title="Ring with non-ring nodes and links">
	  <artwork align='center'>
               S1
              /   \
             |     R0 . . . R1          R0 has MV = 11
             |  .    \        .         R1 has MV = 10
             R7       \________ R2      All other nodes have MV = 00
Anti-     |  .                   .  |
clockwise |  .        Ring       .  | Clockwise
          v  .      RID = 17     .  v
             R6                 R3
                .             .
                  R5 . . . R4
                    \      /
                     \    /
                       An
	  </artwork>
	</figure>
      </t>
      <t>
	In what follows, we refer to a ring node and a rink link
	Type-Length-Value (TLV).  These are new TLVs that contain RIDs
	and associated flags.  A ring node TLV is a TLV that contains
	information for each ring that this node participates in.  A
	ring link TLV identifies a link and contains information about
	every ring that that link is part of.
	<figure title='Ring Node TLV Format'>
          <artwork align='center'>
 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 (TBD)  | Length = 6*N  |     Ring ID 1 (4 octets) ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      ... (RID continued)      |        Flags (2 octets)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 2 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |     Ring ID 2 (4 octets) ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      ... (RID continued)      |        Flags (2 octets)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... etc.                                                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
	</figure>
	<figure title='Ring Link TLV Format'>
          <artwork align='center'>
 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 (TBD)  | Length=8+6*N  |     My Interface Index ...    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... (continued, 4 octets)     |   Remote Interface Index ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... (continued, 4 octets)     |     Ring ID 1 (4 octets) ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      ... (RID continued)      |        Flags (2 octets)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 2 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |     Ring ID 2 (4 octets) ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      ... (RID continued)      |        Flags (2 octets)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... etc.                                                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
	</figure>
<!--
	<figure title='OSPF Ring Node TLV Format'>
          <artwork align='center'>
 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 (TBD)          |         Length = 8*N          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 1 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |         Pad (2 octets)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 2 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |         Pad (2 octets)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  ... etc.                                                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pad is set to zero when sending and ignored on receipt.
          </artwork>
	</figure>
	<figure title='OSPF Ring Link TLV Format'>
          <artwork align='center'>
 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 (TBD)          |       Length = 8 + 8*N        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 My Interface Index (4 octets)                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Remote Interface Index (4 octets)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 1 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |         Pad (2 octets)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Ring ID 2 (4 octets)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Flags (2 octets)        |         Pad (2 octets)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  ... etc.                                                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pad is set to zero when sending and ignored on receipt.
          </artwork>
	  </figure>
-->
	<figure title='Flags for a Ring Node TLV'>
          <artwork align='center'>
 0                   1          
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|MV |SS | SO  |G|   MBZ   |SU |M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
MV: Mastership Value
SS: Supported Signaling Protocols (10 = RSVP-TE; 01 = LDP)
SO: Supported OAM Protocols (100 = BFD; 010 = CFM; 001 = EFM)
G:  Node is a Grandmaster Clock (1 = True, 0 = False)
SU: Signaling Protocol to Use  (00 = none; 01 = LDP; 10 = RSVP-TE)
M : Elected Master (0 = no, 1 = yes)
          </artwork>
	</figure>
	<figure title='Flags for a Ring Link TLV'>
          <artwork align='center'>
 0                   1
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|RD |OAM|          MBZ          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RD:  Ring Direction
OAM: OAM Protocols (00 = none; 01 = BFD; 10 = CFM; 11 = EFM)
          </artwork>
	</figure>
      </t>
    </section>

    <section title='Ring Announcement Phase'>
      <t>
	Each node participating in an MPLS ring is assigned an RID; in
	the example, RID = 17.  A node is also provisioned with a
	mastership value.  Each node advertises a ring node TLV for
	each ring it is participating in, along with the associated
	flags.  It then starts timer T1.
      </t>
      <t>
	A node in promiscuous mode doesn't advertise any ring node TLVs.
	However, when it hears a ring node TLV from an IGP neighbor, it
	joins that ring, and sends its own ring node TLV with that RID.
      </t>
      <t>
	The announcement phase allows a ring node to discover other
	ring nodes in the same ring so that a ring master can be
	elected.
      </t>
    </section>

    <section title='Mastership Phase'>
      <t>
	When timer T1 fires, a node enters the mastership phase.  In
	this phase, each ring node N starts timer T2 and checks if it
	is master.  If it is the node with the lowest loopback address
	of all nodes with the highest mastership values, N declares
	itself master by readvertising its ring node TLV with the M
	bit set.
      </t>
      <t>
	When timer T2 fires, each node examines the ring node TLVs
	from all other nodes in the ring to identify the ring master.
	There should be exaclty one; if not, each node restarts timer
	T2 and tries again.  The nodes that set their M bit should be
	extra careful in advertising their M bit in subsequent tries.
      </t>
    </section>
    
    <section title='Ring Identification Phase'>
      <t>
	When there is exactly one ring master M, M enters the Ring
	Identification Phase.  M indicates that it has successfully
	completed this phase by advertising ring link TLVs.  This is
	the trigger for M's CW neighbor to enter the Ring
	Identification Phase.  This phase passes CW until all ring
	nodes have completed ring identification.
      </t>
      <t>
	In the Ring Identification Phase, a node X that has two or
	more IGP neighbors that belong to the ring picks one of them
	to be its CW ring neighbor.  If X is the ring master, it also
	picks a node as its AC ring neighbor.  If there are exactly
	two such nodes, this step is trivial.  If not, X computes a
	ring that includes all nodes that have completed the Ring
	Identification Phase (as seen by their ring link TLVs) and
	further contains the maximal number of nodes that belong to
	the ring.  Based on that, X picks a CW neighbor and inserts
	ring link TLVs with ring direction CW for each link to its CW
	neighbor; X also inserts a ring link TLV with direction AC for
	each link to its AC neighbor.  Then, X determines its express
	links.  These are links connected to ring nodes that are not
	ring neighbors.  X advertises ring link TLVs for express links
	by setting the link direction to "express link".
      </t>
    </section>

    <section title='Ring Changes'>
      <t>
	The main changes to a ring are:
	<list>
	  <t> ring link addition; </t>
	  <t> ring link deletion; </t>
	  <t> ring node addition; and </t>
	  <t> ring node deletion. </t>
	</list>
      </t>
      <t>
	The main goal of handling ring changes is (as much as
	possible) not to perturb existing ring operation.  Thus, if
	the ring master hasn't changed, all of the above changes
	should be local to the point of change.  Link adds just
	update the IGP; signaling should take advantage of the new
	capacity as soon as it learns.  Link deletions in the case
	of parallel links also show up as a change in capacity (until
	the last link in the bundle is removed.)
      </t>
      <t>
	The removal of the last ring link between two nodes, or the
	removal of a ring node is an event that triggers protection
	switching.  In a simple ring, the result is a broken ring.
	However, if a ring has express links, then it may be able to
	converge to a smaller ring with protection.  Details of this
	process will be given in a future version.
      </t>
      <t>
	The addition of a new ring node can also be handled
	incrementally.  Again, the details of this process will be
	given in a futre version.
      </t>
    </section>
  </section>

  <section title='Ring Signaling' anchor='sig'>
    <t>
      A future version of this document will specify
      protocol-independent details about ring LSP signaling.
    </t>
  </section>

  <section title='Ring OAM'>
    <t>
      Each ring node should advertise in its ring node TLV the OAM
      protocols it supports.  Each ring node is expected to run a
      link-level OAM over each ring link.  This should be an OAM
      protocol that both neighbors agree on.  The default hello
      time is 3.3 millisecond.
    </t>
    <t>
      Each ring node also sends OAM messages over each direction of
      its ring LSP.  This is a multi-hop OAM to check LSP liveness;
      typically, BFD would be used for this.  The node chooses the
      hello interval; the default is once a second.
    </t>
  </section>

  <section title='Security Considerations' anchor='sec-con'>
    <t>
      It is not anticipated that either the notion of MPLS rings or
      the extensions to various protocols to support them will cause
      new security loopholes.  As this document is updated, this
      section will also be updated.
    </t>
  </section>

  <section title='Acknowledgments'>
    <t>
      Many thanks to Pierre Bichon whose exemplar of self-organizing
      networks and whose urging for ever simpler provisioning led to
      the notion of promiscuous nodes.
    </t>
  </section>
  
  <section anchor="IANA" title="IANA Considerations">
    <t>
      There are no requests as yet to IANA for this document.
    </t>
  </section>
</middle>

<back>
  <references title='Normative References'>
    <?rfc include='reference.RFC.2119'?>
  </references>
  <references title='Informative References'>
    <?rfc include='reference.RFC.3209'?>
    <?rfc include='reference.RFC.3630'?>
    <?rfc include='reference.RFC.5036'?>
    <?rfc include='reference.RFC.5305'?>
  </references>
</back>
</rfc>
