<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml2rfc.tools.ietf.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced. 
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3654 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3654.xml">
<!ENTITY RFC3746 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3746.xml">
<!ENTITY RFC5657 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5657.xml">
<!ENTITY I-D.narten-iana-considerations-rfc2434bis SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.narten-iana-considerations-rfc2434bis.xml">
<!ENTITY RFC5812 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5812.xml">
<!ENTITY RFC5810 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5810.xml">
<!ENTITY RFC5226 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY RFC5811 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5811.xml">
<!ENTITY RFC7121 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7121.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml2rfc.tools.ietf.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?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="4"?>
<!-- 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" ?>
<!-- Start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" ipr="trust200902" docName="draft-ietf-forces-protoextension-06" updates="7121,5810">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

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

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
         full title is longer than 39 characters -->

    <title abbrev="ForCES Protocol Extensions">ForCES Protocol Extensions</title>

    <!-- add 'role="editor"' below for the editors if appropriate -->
    <!-- Another author who claims to be an editor -->

	<author fullname="Jamal Hadi Salim" initials="J." surname="Hadi Salim">
		<organization>Mojatatu Networks</organization>
		<address>
			<postal>
				<street>Suite 400, 303 Moodie Dr.</street>
				<city>Ottawa</city>
				<code>K2H 9R4</code>
				<region>Ontario</region>
				<country>Canada</country>
			</postal>
			<email>hadi@mojatatu.com</email>
			<!-- uri and facsimile elements may also be added -->
		</address>
	</author>
      
    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->

    <!-- Meta-data Declarations -->
    <date year="2014" />

    <area>Routing</area>

    <workgroup>Internet Engineering Task Force</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword>ForCES</keyword>
    <keyword>Protocol</keyword>
    <keyword>Extension</keyword>

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->

    <abstract>
      <t>
	Experience in implementing and deploying ForCES architecture
	has demonstrated need for a few small extensions both to ease
	programmability and to improve wire efficiency of some transactions.
	The ForCES protocol is extended with a table range operation
	and a new extension for error handling.
	This documents updates both RFC 5810 and RFC 7121
	semantics to achieve that end goal.
      </t>

    </abstract>
  </front>

  <middle>

<section title="Introduction">
      <t>
	Experience in implementing and deploying ForCES architecture
	has demonstrated need for a few small extensions both to ease
	programmability and to improve wire efficiency of some transactions.
	This document describes a few extensions to
	<xref target="RFC5810">the ForCES Protocol Specification</xref>
	semantics to achieve that end goal.
      </t>
    <t> 
	    This document describes and justifies the need for 2 small
	    extensions which are backward compatible. The document also
	    clarifies details of how dumping of a large table residing 
	    on an FE (Forwarding Engine) is achieved.  To summarize:
        <list style="numbers">
	    <t>
		    A table range operation to allow a controller or
		    control application to request an arbitrary
		    range of table rows is introduced.
	    </t>
	    <t>
		    Additional error codes returned to the controller
		    (or control application) by an FE are introduced.
		    Additionally a new extension to carry details on error
		    codes is introduced. As a result the (FE Protocol Object)
		    FEPO LFB is updated
		    over the definition in <xref target="RFC7121"></xref>.
	    </t>
	    <t>
		    While already supported, an FE response to a GET request 
		    of a large table which does not fit in a single PL
		    message is not described in <xref target="RFC5810"></xref>.
		    This document clarifies the details.
	    </t>
        </list>
   </t>

    <section title="Terminology and Conventions">
      <t/>

      <section 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"></xref>.</t>
      </section>

 <section title="Definitions">
	<t> This document reiterates the terminology defined in several ForCES
		documents <xref target="RFC3746"></xref>,
		<xref target="RFC5810"></xref>,
		<xref target="RFC5811"></xref>, and
		<xref target="RFC5812"></xref> 
	for the sake of contextual clarity.</t>

  
      <t><list style="hanging">
      
<t>
Control Engine (CE)
</t>
<t>
Forwarding Engine (FE)
</t>
<t>
FE Model
</t>
<t>
LFB (Logical Functional Block) Class (or type)
</t>
<t>
LFB Instance
</t>
<t>
LFB Model
</t>
<t>
LFB Metadata
</t>
<t>ForCES Component
</t>
<t>
LFB Component
</t>
<t>
	ForCES Protocol Layer (ForCES PL)
</t>
<t>
	ForCES Protocol Transport Mapping Layer (ForCES TML)
</t>
	</list></t>
    </section>

    </section>
  </section>

<section title="Problem Overview" anchor="issues">
<t>
In this section we present sample use cases to illustrate
each challenge being addressed.
</t>

  <section title="Table Ranges">
   <t>
   Consider, for the sake of illustration, an FE table with
   1 million reasonably sized table rows which are sparsely populated. 
   Assume, again for the sake of illustration, that there are 2000 table
   rows sparsely populated between the row indices 23-10023.
   </t>

   <t>
   Implementation experience has shown that existing
   approaches for retrieving or deleting a sizable 
   number of table rows to be both programmatically tedious and 
   inefficient on utilization of both compute and wire resources.
   </t>
   <t>
   By Definition, ForCES GET and DEL requests sent from a controller 
   (or control app) are
   prepended with a path to a component and sent to the FE. In the case
   of indexed tables, the component path can either point to a table or a
   table row index. 
   </t>
   <t>
   As an example, a control application attempting to retrieve the first
   2000 table rows appearing between row indices 23 and 10023 can achieve
   its goal in one of:
   <list style="symbols">
    <t>
    Dump the whole table and filter for the needed 2000 table rows.
    </t>
    <t>
    Send upto 10000 ForCES PL requests, incrementing the index by
    one each time, and stop when the needed 2000 
    entries are retrieved.
    </t>
    <t>
    If the application had knowledge of which table rows existed
    (not unreasonable given the controller is supposed to be aware of
    state within an NE), then the application could take advantage of
    ForCES batching to send fewer large messages
    (each with different path entries for a total of two thousand).
    </t>
   </list>
   As argued, while the above options exist, all are tedious.
   </t>

  </section>

  <section title="Error codes">
  <t>
	  <xref target="RFC5810"></xref> has defined a generic set of error codes
	  that are to be returned to the CE from an FE. Deployment experience
	  has shown that it would be useful to have more fine grained error
	  codes. As an example, the error code E_NOT_SUPPORTED could be mapped
	  to many FE error source possibilities that need to be then interpreted by
	  the caller based on some understanding of the nature of the sent
	  request. This makes debugging more time consuming.
  </t>
    </section>

</section>

  <section title="Protocol Update">
   <t>
   This section describes normative update to the ForCES protocol 
   for issues discussed in <xref target="issues"></xref>.
   </t>
   <section title="Table Ranges">
    <t>
    We define a new TLV, TABLERANGE-TLV (type ID 0x117) that will be 
    associated with the PATH-DATA TLV in the same manner the KEYINFO-TLV is.
    </t>

    <t>
<figure title="ForCES table range request Layout" align="left" anchor="figy">
   <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 (0x117)               |     Length                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Start Index                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         End Index                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ]]></artwork>
   </figure>
    </t>
    <t>
    <xref target="figy"></xref> shows how this new TLV is constructed.
    </t>

    <t>
   <figure title="ForCES table range request" align="left" anchor="figx">
   <artwork><![CDATA[
   OPER = GET
          PATH-DATA:
            flags = F_SELTABRANGE,  IDCount = 2, IDs = {1,6}
            TABLERANGE-TLV content = {11,23}
    ]]></artwork>
   </figure>
    </t>
    <t>
    <xref target="figx"></xref> illustrates a GET request for a
    range of rows 11 to 23 of a table with component 
    path of "1/6".
    </t>
    <t>
    Path flag of F_SELTABRANGE (0x2 i.e bit 1, where bit 0 is F_SELKEY
    as defined in RFC 5810) MUST be set to indicate the 
    presence of the TABLERANGE-TLV. The pathflag bit F_SELTABRANGE
    can only be used in a GET or DEL and is mutually exclusive with F_SELKEY.
    The FE MUST enforce the path flag constraints and ensure that the selected
    path belongs to a defined indexed table component. Any violation of these
    constraints MUST be rejected with
    an error code of E_INVALID_TFLAGS with a description of 
    what the problem is when using extended error reporting 
    (refer to <xref target="errc"></xref>). 
    </t>
    <t>
    It should be noted that there are combination of path selection mechanisms
    that should not appear together for the sake of simplicity of operations.
    These include: TABLERANGE-TLV and KEYINFO-TLV as well as multiple 
    nested TABLERANGE-TLVs.
    </t>

    <t>
    The TABLERANGE-TLV contents constitute:
    <list style="symbols">
      <t>
	      A 32 bit start index. An index of 0 implies the 
	      beginning of the table row.
      </t>
      <t>
	      A 32 bit end index. A value of 0xFFFFFFFF implies
	      the last entry.
      </t>
    </list>
     
    </t>

    <t>
    The response for a table range query will either be:
    <list style="symbols">
    <t>
    The requested table data returned (when at least one referenced row is
    available); in such a case, a response with
    a path pointing to the table and whose data content 
    contains the row(s) will be sent to the CE. The data content
    MUST be encapsulated in  sparsedata TLV. The sparse data TLV content
    will have the "I" (in ILV) for each table row indicating the table indices.
    </t>
    <t>
    An EXTENDEDRESULT-TLV (refer to <xref target="etlv"></xref>) when:
    <list style="symbols">
    <t>
	    Response is to a range delete request. The Result will either be:
	    <list style="symbols">
		    <t>
		    A success if any of the requested-for rows is deleted
		    </t>
		    <t>
		    A proper error code if none of the requested for rows can
		    be deleted
		    </t>
	    </list>
    </t>
    <t>
    data is absent where the result code of E_EMPTY 
    with an optional content string describing the nature of the error
    (refer to <xref target="errc"></xref>).
    </t>
    <t>
    When both a path key and path table range are reflected on the
    the pathflags, an error code of E_INVALID_TFLAGS 
    with an optional content string describing the nature of the 
    error (refer to <xref target="errc"></xref>).
    </t>
    <t>
    other standard ForCES errors (such as ACL constraints trying to retrieve
    contents of an unreadable table), accessing unknown components etc.
    </t>
    </list>
    </t>

    </list>
    </t>
  </section>

    <section title="Error Codes" anchor="errc">
     <t>
	     We define several things:
	     <list style="numbers">
	     <t>
		     A new set of error codes.
	     </t>
	     <t>
		     Allocating some reserved codes for private use.
	     </t>
	     <t>
		    A new TLV, EXTENDEDRESULT-TLV (0x118) that will carry
		    a code (which will be a superset of what is currently 
		    specified in <xref target="RFC5810"></xref>) but also an 
		    optional cause content.
		    This is illustrated in <xref target="fig2"></xref>.
	     </t>
	     </list>
     </t>

  <section title="New Codes" anchor="ncodes">
  <t>
	  EXTENDEDRESULT-TLV Result Value is 32 bits and is
	  a superset of RFC 5810 Result TLV Result Value. The new version
	  code space is 32 bits as opposed to the RFC 5810 code size
	  of 8 bits. The first 8 bit values(256 codes) are common to
	  both code spaces.
  </t>
  <texttable anchor="table_codes" title="New codes">
      <ttcol align='left' width='20%'>Code</ttcol>
      <ttcol align='left' width='30%'>Mnemonic</ttcol>
      <ttcol align='left' width='50%'>Details</ttcol>
      <c>0x18</c> <c>E_TIMED_OUT</c><c>A time out occured while processing the message</c>
      <c>0x19</c> <c>E_INVALID_TFLAGS</c><c>Invalid table flags</c>
      <c>0x1A</c> <c>E_INVALID_OP</c><c>Requested operation is invalid</c>
      <c>0x1B</c> <c>E_CONGEST_NT</c><c>Node Congestion notification</c>
      <c>0x1C</c> <c>E_COMPONENT_NOT_A_TABLE</c><c>Component not a table</c>
      <c>0x1D</c> <c>E_PERM</c><c>Operation not permitted</c>
      <c>0x1E</c> <c>E_BUSY</c><c>System is Busy</c>
      <c>0x1F</c> <c>E_EMPTY</c><c>Table is empty</c>
      <c>0x20</c> <c>E_UNKNOWN</c><c>A generic catch all error code. Carries a string to further extrapolate what the error implies.</c>
  </texttable>

  </section>
  <section title="Private Vendor Codes" anchor="vcodes ">
  <t>
   Codes 0x100-0x200 are reserved for use as private codes. Since
   these are freely available it is expected that the FE and CE
   side implementations will both understand/interpret the semantics 
   of any used codes and avoid any conflicts.
  </t>
  </section>
  <!--
-->
  <section title="Extended Result TLV" anchor="etlv">

  <t>

   <figure title="EXTENDEDRESULT-TLV" align="left" anchor="fig2">
  <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 = EXTENDEDRESULT-TLV   |              Length           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        Result Value                           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Optional Cause content                     |
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ]]></artwork>
   </figure>
   </t>

   <t>
    <list style="symbols">
   <t>
    Like all other ForCES TLVs, the EXTENDEDRESULT-TLV is expected to be
    32 bit aligned.
   </t>
   <t>
   The EXTENDEDRESULT-TLV  Result Value derives and extends from the 
   same current namespace that is used by RESULT-TLV  Result Value
   as specified in RFC 5810, section 7.1.7. The main difference is that
   we now have a 32 bit result value (as opposed to old 8 bit).
   </t>
   <t>
   The optional result content is defined to further disambiguate the
   result value. It is expected UTF-8 string values to be used. The content
   result value is intended to be consumed by the (human) operator and
   implementations may choose to specify different contents for the same
   error code.
   Additionally, future codes may specify cause contents to be of types
   other than string.
   
   </t>
   <t>
    It is recommended that the maximum size of the cause string should
    not exceed 32 bytes. The cause string is not standardized by this
    document.
   </t>
   </list>
   </t>

    <section title="Extended Result Backward compatibility" anchor="bcompat">
   <t>
   To support backward compatibility, we update and the FEPO LFB 
   (in <xref target="Appendix1"></xref>) version to 1.2. We also add
   a new component ID 16 (named EResultAdmin) and a capability Component 
   ID 32 (named EResultCapab).
   </t>
   <t>
   An FE will advertise its capability to support extended TLVs via the 
   EResultCapab table. When an FE is capable of responding with
   both extended results and older result TLVs, it will have two table
   rows one for each supported value. By default an FE capable of supporting both
   modes will assume the lowest common denominator i.e
   EResultAdmin will be EResultNotSupported; and will issue responses using
   RESULT-TLVs. It should be noted an FE advertising FEPO version 1.2 MUST
   support EXTENDEDRESULT-TLVs at minimum.
   </t>
   <t>
   On an FE which supports both RESULT-TLVs and EXTENDEDRESULT-TLVs, 
   a master CE can turn on support for extended results
   by setting the EResultAdmin value to 2 in which case the FE MUST switch over to
   sending only EXTENDEDRESULT-TLVs. Likewise a master CE can turn
   off extended result responses by writing a 1 to the EResultAdmin.
   An FE that does not support one mode or other MUST reject setting
   of EResultAdmin to a value it does not support by responding with
   an error code of E_NOT_SUPPORTED. It is expected that all CEs 
   participating in a high availability(HA) mode be capable of supporting
   FEPO version 1.2 whenever EResultAdmin is set to strict
   support of EXTENDEDRESULT-TLVs. The consensus between CEs in an HA
   setup to set strict support of EXTENDEDRESULT-TLVs
   is out of scope for this document.
   </t>
    </section>
    </section>
  </section>

 <section title="Large Table Dumping" anchor="largeobj">
    <t>
	    Imagine a GET request to a path that is a table i.e a table dump.
	    Such a request is sent to the FE with a specific correlator, say X.
	    Imagine this table to have a large number of entries at the FE.
	    For the sake of illustration, lets say millions of rows.
	    This requires that the FE delivers the response over multiple messages, 
	    all using the same correlator X.
    </t>
    <t>
	    The protocol document <xref target="RFC5810"></xref> does not 
	    adequately describe how a large multi-part GET response 
	    message is delivered. The text in this section clarifies.
	    We limit the discussion to a table object only.
    </t>
    <t>
	    Implementation experience of dumping large tables indicates we can 
	    use the transaction flags to indicate that a GET response is the 
	    beginning, middle or end of a multi-part message. In other words 
	    we mirror the effect of an atomic transaction sent by a CE to an FE.
    </t>

  <t>

   <figure title="EXTENDEDRESULT-TLV" align="left" anchor="fig3">
  <artwork><![CDATA[
         CE PL                                                  FE PL

           |                                                      |
           | (0) Query, Path-to-a-large-table, OP=GET             |
           |----------------------------------------------------->|
           |                correlator = X                        |
           |                                                      |
           | (1) Query-Response, SOT,AT, OP=GET-RESPONSE, DATA    |
           |<-----------------------------------------------------|
           |                correlator = X                        |
           |             DATA TLV (SPARSE/FULL)                   |
           |                                                      |
           | (2) Query-Response, MOT,AT, OP=GET-RESPONSE, DATA    |
           |<-----------------------------------------------------|
           |                correlator = X                        |
           |             DATA TLV (SPARSE/FULL)                   |
           |                                                      |
           | (3) Query-Response, MOT,AT, OP=GET-RESPONSE, DATA    |
           |<-----------------------------------------------------|
           |                correlator = X                        |
           |             DATA TLV (SPARSE/FULL)                   |
           .                                                      .
           .                                                      .
           .                                                      .
           .                                                      .
           |                                                      |
           | (N) Query-Response, MOT,AT, OP=GET-RESPONSE, DATA    |
           |<-----------------------------------------------------|
           |                correlator = X                        |
           |             DATA TLV (SPARSE/FULL)                   |
           |                                                      |
           | (N) Query-Response, EOT,AT, OP=GET-RESPONSE          |
           |<-----------------------------------------------------|
           |                correlator = X                        |
           |             RESULT TLV (SUCCESS)                     |
           |                                                      |
  ]]></artwork>
   </figure>
   </t>

    <t>
	    The last message to go to the CE, which carries the EOT flag,
	    MUST NOT carry any data.
	    This allows us to mirror ForCES 2PC messaging
	    <xref target="RFC5810"></xref>
	    where the last message is an empty commit message. GET response
	    will carry a result code TLV in such a case. 
    </t>
 </section>
  </section>

  <section anchor="Acknowledgements" title="Acknowledgements">
   <t>
	  The author would like to thank Evangelos Haleplidis and 
	  Joel Halpern for discussions that made this document better.
	  Adrian Farrel did an excellent AD review of the document
	  which improved the quality of this document.
	  Tobias Gondrom did the Security Directorate review.
	  Brian Carpenter did the Gen-ART review.
	  Nevil Brownlee performed the Operations Directorate review.
	  S Moonesamy(SM) worked hard to review our publication
	  process. Pearl Liang caught issues in the IANA specification.
   </t>
   <t>
	   The author would like to thank the following IESG members who 
	   reviewed and improved this document: Alia Atlas, Barry Leiba,
	   Brian Haberman, Kathleen Moriarty, Richard Barnes, and
	   Spencer Dawkins.
   </t>
  </section>
<!--
-->

    <!-- Possibly a 'Contributors' section ... -->

    <section anchor="IANA" title="IANA Considerations">
    <t>
    This document registers two new top Level TLVs and two new
    path flags and updates an IANA registered FE Protocol object
    Logical Functional Block (LFB). 
    </t>
    <t>
	    The <xref target="Appendix1"></xref> defines an update
	    to the FE Protocol Object LFB to version 1.2. 
	 The IANA registry
         https://www.iana.org/assignments/forces
	 sub-registy "Logical Functional Block (LFB) Class Names and 
	 Class Identifiers" will need to be append for FE Protocol Object
	 LFB version 1.2 and this document reflected in the reference column.
    </t>

    <t>
	    Updates are required to the "TLV types"
	    subregistry for the TLVs below.
    </t>
    <t>
	    The following new TLVs are defined:
    <list style="symbols">
	<t>
		TABLERANGE-TLV (type ID 0x117)
	</t>
	<t>
		EXTENDEDRESULT-TLV (type ID 0x118)
	</t>
    </list>
    </t>

    <t>
	    subregistry "RESULT-TLV Result Values" is affected by the entries
	    below.
    </t>
    <t>
	   The Defined RESULT-TLV Result Values are changed:
    <list style="symbols">
	<t>
	codes 0x21-0xFE are unassigned.
	</t>
	<t>
	codes 0x18-0x20 are defined by this document in 
	<xref target="ncodes"></xref>.
	</t>
	<t>
	codes 0x100-0x200 are reserved for private use.
	</t>
    </list>
    </t>
    <t>
     A new sub-registry for EXTENDEDRESULT-TLV Result Values needs to
     be created. The codes 0x00-0xff are mirrored from the RESULT-TLV 
     Result Values sub-registry. Any new allocations of this code range
     (in the range 0x21-0xfe) must happen only within the new sub-registry 
     and not in RESULT-TLV Result Values sub-registry. 
     The codes 0x100-0x200 are reserved for private use as described earlier
     and the code ranges 0x21-0xfe and 0x201-0xffffffff should be marked as 
     Unassigned with the IANA allocation policy of Specification Required 
     <xref target="RFC5226"></xref>. The Designated Expert (DE) needs to ensure 
     existing deployments are not broken by any specified request. The DE should
     post a given code request to the ForCES WG mailing list (or a successor 
     designated by the Area Director) for any comment and review.
     The DE should then either approve or deny the registration request,
     publish a notice of the decision to the ForCES WG mailing list or its 
     successor, and inform IANA of his/her decision.  A denial notice
     must be justified by an explanation and, in the cases where it is
     possible, concrete suggestions on how the request can be modified so
     as to become acceptable.
    </t>

    </section>

    <section anchor="Security" title="Security Considerations">
    <t>
	    The security considerations that have been described in the ForCES
	    protocol <xref target="RFC5810"></xref> apply to this document as well.
	    </t>
    </section>
  </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->

    <references title="Normative References">
      <!--rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"-->
      &RFC2119;
      &RFC5810;
      &RFC5811;
      &RFC5812;
      &RFC7121;
      &RFC5226;

    </references>

    <references title="Informative References">
      <!-- Here we use entities that we defined at the beginning. -->

    &RFC3746;
    </references>

    <!-- Change Log

v00 2009-02-17  EH   Initial version
 -->

<section anchor="Appendix1" title="Appendix A - New FEPO version">
<t>
This version of FEPO updates the earlier one given in RFC 7121.
The xml has been validated against the schema defined in 
<xref target="RFC5812"></xref>.
</t>
<figure>
	<artwork align="center"><![CDATA[

<LFBLibrary xmlns="urn:ietf:params:xml:ns:forces:lfbmodel:1.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="lfb-schema.xsd" provides="FEPO">
   <!-- XXX -->
   <dataTypeDefs>
      <dataTypeDef>
         <name>CEHBPolicyValues</name>
         <synopsis>
            The possible values of CE heartbeat policy
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>CEHBPolicy0</name>
                  <synopsis>
                      The CE will send heartbeats to the FE
                      every CEHDI timeout if no other messages
                      have been sent since.
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>CEHBPolicy1</name>
                  <synopsis>
                      The CE will not send heartbeats to the FE
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>FEHBPolicyValues</name>
         <synopsis>
             The possible values of FE heartbeat policy
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>FEHBPolicy0</name>
                  <synopsis>
                      The FE will not generate any heartbeats
                      to the CE
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>FEHBPolicy1</name>
                  <synopsis>
                     The FE generates heartbeats to the CE every FEHI 
                     if no other messages have been sent to the CE.
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>FERestartPolicyValues</name>
         <synopsis>
            The possible values of FE restart policy
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>FERestartPolicy0</name>
                  <synopsis>
                     The FE restarts its state from scratch
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>HAModeValues</name>
         <synopsis>
            The possible values of HA modes
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>NoHA</name>
                  <synopsis>
                     The FE is not running in HA mode
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>ColdStandby</name>
                  <synopsis>
                     The FE is running in HA mode cold Standby
                  </synopsis>
               </specialValue>
               <specialValue value="2">
                  <name>HotStandby</name>
                  <synopsis>
                     The FE is running in HA mode hot Standby
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>CEFailoverPolicyValues</name>
         <synopsis>
            The possible values of CE failover policy
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>CEFailoverPolicy0</name>
                  <synopsis>
                      The FE should stop functioning immediate and
                      transition to the FE OperDisable state
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>CEFailoverPolicy1</name>
                  <synopsis>
                      The FE should continue forwarding even
                      without an associated CE for CEFTI. The 
                      FE goes to FE OperDisable when the CEFTI
                      expires and no association. Requires 
                      graceful restart support.
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>FEHACapab</name>
         <synopsis>
            The supported HA features
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>GracefullRestart</name>
                  <synopsis>
                     The FE supports Graceful Restart
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>HA</name>
                  <synopsis>
                     The FE supports HA
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>CEStatusType</name>
         <synopsis>Status values. Status for each CE</synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <specialValues>
               <specialValue value="0">
                  <name>Disconnected</name>
                  <synopsis>No connection attempt with the CE yet
                  </synopsis>
               </specialValue>
               <specialValue value="1">
                  <name>Connected</name>
                  <synopsis>The FE connection with the CE at the TML
                     has been completed
                  </synopsis>
               </specialValue>
               <specialValue value="2">
                  <name>Associated</name>
                  <synopsis>The FE has associated with the CE
                  </synopsis>
               </specialValue>
               <specialValue value="3">
                  <name>IsMaster</name>
                  <synopsis>The CE is the master (and associated)
                  </synopsis>
               </specialValue>
               <specialValue value="4">
                  <name>LostConnection</name>
                  <synopsis>The FE was associated with the CE but 
                     lost the connection
                  </synopsis>
               </specialValue>
               <specialValue value="5">
                  <name>Unreachable</name>
                  <synopsis>The CE is deemed as unreachable by the FE
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
      <dataTypeDef>
         <name>StatisticsType</name>
         <synopsis>Statistics Definition</synopsis>
         <struct>
            <component componentID="1">
               <name>RecvPackets</name>
               <synopsis>Packets Received</synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="2">
               <name>RecvErrPackets</name>
               <synopsis>Packets Received from CE with errors
               </synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="3">
               <name>RecvBytes</name>
               <synopsis>Bytes Received from CE</synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="4">
               <name>RecvErrBytes</name>
               <synopsis>Bytes Received from CE in Error</synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="5">
               <name>TxmitPackets</name>
               <synopsis>Packets Transmitted to CE</synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="6">
               <name>TxmitErrPackets</name>
               <synopsis>
                  Packets Transmitted to CE that incurred
                  errors
               </synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="7">
               <name>TxmitBytes</name>
               <synopsis>Bytes Transmitted to CE</synopsis>
               <typeRef>uint64</typeRef>
            </component>
            <component componentID="8">
               <name>TxmitErrBytes</name>
               <synopsis>Bytes Transmitted to CE incurring errors
               </synopsis>
               <typeRef>uint64</typeRef>
            </component>
         </struct>
      </dataTypeDef>
      <dataTypeDef>
         <name>AllCEType</name>
         <synopsis>Table Type for AllCE component</synopsis>
         <struct>
            <component componentID="1">
               <name>CEID</name>
               <synopsis>ID of the CE</synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="2">
               <name>Statistics</name>
               <synopsis>Statistics per CE</synopsis>
               <typeRef>StatisticsType</typeRef>
            </component>
            <component componentID="3">
               <name>CEStatus</name>
               <synopsis>Status of the CE</synopsis>
               <typeRef>CEStatusType</typeRef>
            </component>
         </struct>
      </dataTypeDef>
      <dataTypeDef>
         <name>ExtendedResultType</name>
         <synopsis>
             Possible extended result support
         </synopsis>
         <atomic>
            <baseType>uchar</baseType>
            <rangeRestriction>
              <allowedRange min="1" max="2"/>
            </rangeRestriction>
            <specialValues>
               <specialValue value="1">
                  <name>EResultNotSupported</name>
                  <synopsis>
                      Extended Results are not supported
                  </synopsis>
               </specialValue>
               <specialValue value="2">
                  <name>EResultSupported</name>
                  <synopsis>
                      Extended Results are supported
                  </synopsis>
               </specialValue>
            </specialValues>
         </atomic>
      </dataTypeDef>
   </dataTypeDefs>
   <LFBClassDefs>
      <LFBClassDef LFBClassID="2">
         <name>FEPO</name>
         <synopsis>
            The FE Protocol Object, with EXtended Result control
         </synopsis>
         <version>1.2</version>
         <components>
            <component componentID="1" access="read-only">
               <name>CurrentRunningVersion</name>
               <synopsis>Currently running ForCES version</synopsis>
               <typeRef>uchar</typeRef>
            </component>
            <component componentID="2" access="read-only">
               <name>FEID</name>
               <synopsis>Unicast FEID</synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="3" access="read-write">
               <name>MulticastFEIDs</name>
               <synopsis>
                  the table of all multicast IDs
               </synopsis>
               <array type="variable-size">
                  <typeRef>uint32</typeRef>
               </array>
            </component>
            <component componentID="4" access="read-write">
               <name>CEHBPolicy</name>
               <synopsis>
                  The CE Heartbeat Policy
               </synopsis>
               <typeRef>CEHBPolicyValues</typeRef>
            </component>
            <component componentID="5" access="read-write">
               <name>CEHDI</name>
               <synopsis>
                  The CE Heartbeat Dead Interval in millisecs
               </synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="6" access="read-write">
               <name>FEHBPolicy</name>
               <synopsis>
                  The FE Heartbeat Policy
               </synopsis>
               <typeRef>FEHBPolicyValues</typeRef>
            </component>
            <component componentID="7" access="read-write">
               <name>FEHI</name>
               <synopsis>
                  The FE Heartbeat Interval in millisecs
               </synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="8" access="read-write">
               <name>CEID</name>
               <synopsis>
                  The Primary CE this FE is associated with
               </synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="9" access="read-write">
               <name>BackupCEs</name>
               <synopsis>
                  The table of all backup CEs other than the
                  primary
               </synopsis>
               <array type="variable-size">
                  <typeRef>uint32</typeRef>
               </array>
            </component>
            <component componentID="10" access="read-write">
               <name>CEFailoverPolicy</name>
               <synopsis>
                  The CE Failover Policy
               </synopsis>
               <typeRef>CEFailoverPolicyValues</typeRef>
            </component>
            <component componentID="11" access="read-write">
               <name>CEFTI</name>
               <synopsis>
                  The CE Failover Timeout Interval in millisecs
               </synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="12" access="read-write">
               <name>FERestartPolicy</name>
               <synopsis>
                  The FE Restart Policy
               </synopsis>
               <typeRef>FERestartPolicyValues</typeRef>
            </component>
            <component componentID="13" access="read-write">
               <name>LastCEID</name>
               <synopsis>
                  The Primary CE this FE was last associated
                  with
               </synopsis>
               <typeRef>uint32</typeRef>
            </component>
            <component componentID="14" access="read-write">
               <name>HAMode</name>
               <synopsis>
                  The HA mode used
               </synopsis>
               <typeRef>HAModeValues</typeRef>
            </component>
            <component componentID="15" access="read-only">
               <name>AllCEs</name>
               <synopsis>The table of all CEs</synopsis>
               <array type="variable-size">
                  <typeRef>AllCEType</typeRef>
               </array>
             </component>
             <component componentID="16" access="read-write">
               <name>EResultAdmin</name>
               <synopsis>
                   Turn Extended results off or on.
                   default to off
               </synopsis>
               <typeRef>ExtendedResultType</typeRef>
               <defaultValue>1</defaultValue>
            </component>
         </components>
         <capabilities>
            <capability componentID="30">
               <name>SupportableVersions</name>
               <synopsis>
                  the table of ForCES versions that FE supports
               </synopsis>
               <array type="variable-size">
                  <typeRef>uchar</typeRef>
               </array>
            </capability>
            <capability componentID="31">
               <name>HACapabilities</name>
               <synopsis>
                  the table of HA capabilities the FE supports
               </synopsis>
               <array type="variable-size">
                  <typeRef>FEHACapab</typeRef>
               </array>
            </capability>
             <capability componentID="32">
               <name>EResultCapab</name>
               <synopsis>
                  the table of supported result capabilities
               </synopsis>
               <array type="variable-size">
                  <typeRef>ExtendedResultType</typeRef>
               </array>
           </capability>
         </capabilities>
         <events baseID="61">
            <event eventID="1">
               <name>PrimaryCEDown</name>
               <synopsis>
                  The primary CE has changed
               </synopsis>
               <eventTarget>
                  <eventField>LastCEID</eventField>
               </eventTarget>
               <eventChanged/>
               <eventReports>
                  <eventReport>
                     <eventField>LastCEID</eventField>
                  </eventReport>
               </eventReports>
            </event>
            <event eventID="2">
               <name>PrimaryCEChanged</name>
               <synopsis>A New primary CE has been selected
               </synopsis>
               <eventTarget>
                  <eventField>CEID</eventField>
               </eventTarget>
               <eventChanged/>
               <eventReports>
                  <eventReport>
                     <eventField>CEID</eventField>
                  </eventReport>
               </eventReports>
            </event>
         </events>
      </LFBClassDef>
   </LFBClassDefs>
</LFBLibrary>
	]]></artwork>
</figure>
	</section>

  </back>
</rfc>
