<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>

<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<?rfc rfcedstyle="yes"?>

<rfc number="7391" 
     category="std" 
     submissionType="IETF" 
     consensus="yes" 
     ipr="trust200902" 
     updates="5810, 7121">

<front>

    <title abbrev="ForCES Protocol Extensions">Forwarding and Control Element
    Separation (ForCES) Protocol Extensions</title>

        <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>
                </address>
        </author>
      
    <date month="October" year="2014" />

    <area>Routing</area>

    <workgroup>Internet Engineering Task Force</workgroup>

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

    <abstract>
      <t>
        Experience in implementing and deploying the Forwarding and Control
        Element Separation (ForCES) architecture
        has demonstrated the 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 document updates the semantics in RFCs 5810 and 7121
        to achieve that end goal.
      </t>

    </abstract>
  </front>

  <middle>

<section title="Introduction">
      <t>
        Experience in implementing and deploying the ForCES architecture
        has demonstrated the 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 the semantics in
        <xref target="RFC5810">the ForCES protocol specification</xref>
        to achieve that end goal.
      </t>
    <t> 
            This document describes and justifies the need for two small
            extensions that are backward compatible. This document also
            clarifies details of how dumping of a large table residing 
            on an FE (Forwarding Element) 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, this document updates the definition of the FE Protocol
  Object (FEPO) Logical Functional Block (LFB) in <xref target="RFC7121"/>.
            </t>
            <t>
                    While already supported, an FE response to a GET request 
                    of a large table that does not fit in a single Protocol
                    Layer (PL) message is not described in <xref target="RFC5810"/>.
                    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="Terminology">
        <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 Element (CE)
</t>
<t>
Forwarding Element (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 that 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 are 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 application) are
   prepended with a path to a component and sent to the FE. In the case
   of indexed tables, the component path can point to either 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 the following ways:
   <list style="symbols">
    <t>
    Dump the whole table and filter for the needed 2000 table rows.
    </t>
    <t>
    Send up to 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 a Network Element (NE)), then the application could take advantage of
    ForCES batching to send fewer large messages
    (each with different path entries for a total of 2000).
    </t>
   </list>
   As argued, while the above options exist, all are tedious.
   </t>

  </section>

  <section title="Error Codes">
  <t>
          <xref target="RFC5810"/> 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 then be 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 a normative update to the ForCES protocol 
   to address the issues discussed in <xref target="issues"></xref>.
   </t>
   <section title="Table Ranges">
    <t>
    We define a new TLV, TABLERANGE-TLV (type ID 0x0117), that will be 
    associated with the PATH-DATA-TLV in the same manner the KEYINFO-TLV is.
    <xref target="figy"></xref> shows how this new TLV is constructed.</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 (0x0117)              |     Length                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Start Index                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         End Index                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ]]></artwork>
   </figure>
    </t>
<t> <xref target="figx"></xref> illustrates a GET request for a range of rows
11 to 23 of a table with a component path of "1/6".</t> 
    <t>
   <figure title="ForCES Table Range Request Example" align="left" anchor="figx">
   <artwork><![CDATA[
   OPER = GET-TLV
          PATH-DATA-TLV:
            flags = F_SELTABRANGE, IDCount = 2, IDs = {1,6}
            TABLERANGE-TLV content = {11,23}
    ]]></artwork>
   </figure>

    </t>
    <t>
    The path flag F_SELTABRANGE (0x2, i.e., bit 1, where bit 0 is F_SELKEY
    as defined in <xref target="RFC5810"/>) MUST be set to indicate the 
    presence of the TABLERANGE-TLV. The path flag 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 combinations 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 a SPARSEDATA-TLV. The SPARSEDATA-TLV content
    will have the "I" (in Index-Length-Value (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>
            the response is to a range delete request. The result will either be:
            <list style="symbols">
                    <t>
                    a success if any of the rows that were requested are
                    deleted; or
                    </t>
                    <t>
                    a proper error code if none of the rows that were
                    requested can be deleted.
                    </t>
            </list>
    </t>
    <t>
    data is absent and an error code of E_EMPTY 
    with an optional content string describing the nature of the error is used
    (refer to <xref target="errc"></xref>).
    </t>
    <t>
    both a path key and path table range were stated on the path
    flags of the original request.  In such a case, an error code
    of E_INVALID_TFLAGS with an optional content string describing
    the nature of the error is used (refer to <xref target="errc"></xref>).
    </t>
    <t>
    other standard ForCES errors (such as Access Control List (ACL)
    constraints trying to retrieve contents of an unreadable table,
    accessing unknown components, etc.) occur.
    </t>
    </list>
    </t>

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

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

  <section title="New Codes" anchor="ncodes">
  <t>
          The EXTENDEDRESULT-TLV Result Value is 32 bits and is
          a superset of the RESULT-TLV Result Value defined in <xref target="RFC5810"/>. The new version
          code space is 32 bits as opposed to the code size
          of 8 bits in <xref target="RFC5810"/>. The first 8-bit values (256
          codes) are common to
          both code spaces.
  </t>
<?rfc compact="no"?>
  <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 timeout occurred 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>  <?rfc compact="yes"?>

  </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 the RESULT-TLV Result Value
   as specified in Section 7.1.7 of <xref target="RFC5810"/>. The main difference is that
   there is now a 32-bit Result Value (as opposed to the old 8-bit).
   </t>
   <t>
   The Optional Cause Content is defined to further disambiguate the
   Result Value. It is expected that UTF-8 string values will be used. The content
   Result Value is intended to be consumed by the (human) operator, and
   implementations may choose to specify different content for the same
   error code.

   Additionally, future codes may specify cause content 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 the FEPO LFB 
   (in <xref target="Appendix1"></xref>) to version 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 that an FE advertising FEPO version 1.2 MUST
   support EXTENDEDRESULT-TLVs at minimum.
   </t>
   <t>
   On an FE that 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 the other MUST reject setting
   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
   set up 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, let's say millions of rows.
            This requires that the FE delivers the response over multiple messages, 
            all using the same correlator X.
    </t>
    <t>
            The ForCES 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 shows
            that we can use
            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="Large Table Dump Time Sequence" 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 End Of
            Transaction (EOT) flag,
            MUST NOT carry any data.
            This allows us to mirror ForCES two-phase commit (2PC) messaging
            <xref target="RFC5810"></xref>
            where the last message is an empty commit message. A GET response
            will carry a RESULT-TLV in such a case. 
    </t>
 </section>
  </section>

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

   <t>This document updates &lt;https://www.iana.org/assignments/forces&gt;
   as follows:</t>

   <t>
   This document registers two new top-level TLVs and two new
   path flags; it also updates an IANA-registered FE Protocol Object
   Logical Functional Block (LFB). 
   </t>

   <t>
   <xref target="Appendix1"></xref> defines an update to the
   FE Protocol Object LFB to version&nbsp;1.2.  An entry for
   FE Protocol Object LFB version 1.2 has been added to the
   "Logical Functional Block (LFB) Class Names and Class Identifiers"
   sub-registry.
   </t>

   <t>
   The following new TLVs have been defined and added to the "TLV Types"
   sub-registry:
   <list style="symbols">
        <t>
                TABLERANGE-TLV (type ID 0x0117)
        </t>
        <t>
                EXTENDEDRESULT-TLV (type ID 0x0118)
        </t>
    </list>
    </t>
    <t>
    The "RESULT-TLV Result Values" sub-registry has been updated as
    follows:
    <list style="symbols">
        <t>
        Codes 0x21-0xFE are marked as 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 "EXTENDEDRESULT-TLV Result Values" sub-registry has been
     created. The codes 0x00-0xFF are mirrored from the "RESULT-TLV 
     Result Values" sub-registry. Any future allocations of this code range
     (in the range 0x21-0xFE) must be made only in the new
     "EXTENDEDRESULT-TLV Result Values" sub-registry 
     and not in the "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 are marked as 
     Unassigned with the IANA allocation policy of Specification Required 
     <xref target="RFC5226"></xref>. The Designated Expert (DE) needs to
     ensure that 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
     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 described in the ForCES
    protocol <xref target="RFC5810"></xref> apply to this document as well.
    </t>
    </section>
  </middle>


  <back>
    <references title="Normative References">

<reference anchor='RFC2119' target="http://www.rfc-editor.org/info/rfc2119">

<front>
<title abbrev='RFC Key Words'>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='Scott Bradner'>
<organization>Harvard University</organization>
<address>
<postal>
<street>1350 Mass. Ave.</street>
<street>Cambridge</street>
<street>MA 02138</street></postal>
<phone>- +1 617 495 3864</phone>
<email>sob@harvard.edu</email></address></author>
<date year='1997' month='March' />
</front>
<seriesInfo name='BCP' value='14' />
<seriesInfo name='RFC' value='2119' />
<format type='TXT' octets='4723' target='http://www.rfc-editor.org/rfc/rfc2119.txt' />
<format type='HTML' octets='17970' target='http://xml.resource.org/public/rfc/html/rfc2119.html' />
<format type='XML' octets='5777' target='http://xml.resource.org/public/rfc/xml/rfc2119.xml' />
</reference>

<reference anchor='RFC5810' target="http://www.rfc-editor.org/info/rfc5810">
<front>
<title>Forwarding and Control Element Separation (ForCES) Protocol Specification</title>
<author initials='A.' surname='Doria' fullname='A. Doria'>
<organization /></author>
<author initials='J.' surname='Hadi Salim' fullname='J. Hadi Salim'>
<organization /></author>
<author initials='R.' surname='Haas' fullname='R. Haas'>
<organization /></author>
<author initials='H.' surname='Khosravi' fullname='H. Khosravi'>
<organization /></author>
<author initials='W.' surname='Wang' fullname='W. Wang'>
<organization /></author>
<author initials='L.' surname='Dong' fullname='L. Dong'>
<organization /></author>
<author initials='R.' surname='Gopal' fullname='R. Gopal'>
<organization /></author>
<author initials='J.' surname='Halpern' fullname='J. Halpern'>
<organization /></author>
<date year='2010' month='March' />
</front>
<seriesInfo name='RFC' value='5810' />
<format type='TXT' octets='239754' target='http://www.rfc-editor.org/rfc/rfc5810.txt' />
</reference>

<reference anchor='RFC5811' target="http://www.rfc-editor.org/info/rfc5811">
<front>
<title>SCTP-Based Transport Mapping Layer (TML) for the Forwarding and Control Element Separation (ForCES) Protocol</title>
<author initials='J.' surname='Hadi Salim' fullname='J. Hadi Salim'>
<organization /></author>
<author initials='K.' surname='Ogawa' fullname='K. Ogawa'>
<organization /></author>
<date year='2010' month='March' />
</front>
<seriesInfo name='RFC' value='5811' />
<format type='TXT' octets='61443' target='http://www.rfc-editor.org/rfc/rfc5811.txt' />
</reference>

<reference anchor='RFC5812' target="http://www.rfc-editor.org/info/rfc5812">
<front>
<title>Forwarding and Control Element Separation (ForCES) Forwarding Element Model</title>
<author initials='J.' surname='Halpern' fullname='J. Halpern'>
<organization /></author>
<author initials='J.' surname='Hadi Salim' fullname='J. Hadi Salim'>
<organization /></author>
<date year='2010' month='March' />
</front>
<seriesInfo name='RFC' value='5812' />
<format type='TXT' octets='301491' target='http://www.rfc-editor.org/rfc/rfc5812.txt' />
</reference>

<reference anchor='RFC7121' target="http://www.rfc-editor.org/info/rfc7121">
<front>
<title>High Availability within a Forwarding and Control Element Separation (ForCES) Network Element</title>
<author initials='K.' surname='Ogawa' fullname='K. Ogawa'>
<organization /></author>
<author initials='W.' surname='Wang' fullname='W. Wang'>
<organization /></author>
<author initials='E.' surname='Haleplidis' fullname='E. Haleplidis'>
<organization /></author>
<author initials='J.' surname='Hadi Salim' fullname='J. Hadi Salim'>
<organization /></author>
<date year='2014' month='February' />
</front>
<seriesInfo name='RFC' value='7121' />
<format type='TXT' octets='62599' target='http://www.rfc-editor.org/rfc/rfc7121.txt' />
</reference>

<reference anchor='RFC5226' target="http://www.rfc-editor.org/info/rfc5226">
<front>
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
<author initials='T.' surname='Narten' fullname='T. Narten'>
<organization /></author>
<author initials='H.' surname='Alvestrand' fullname='H. Alvestrand'>
<organization /></author>
<date year='2008' month='May' />
</front>
<seriesInfo name='BCP' value='26' />
<seriesInfo name='RFC' value='5226' />
<format type='TXT' octets='66160' target='http://www.rfc-editor.org/rfc/rfc5226.txt' />
</reference>
    </references>

    <references title="Informative References">

<reference anchor='RFC3746' target="http://www.rfc-editor.org/info/rfc3746">
<front>
<title>Forwarding and Control Element Separation (ForCES) Framework</title>
<author initials='L.' surname='Yang' fullname='L. Yang'>
<organization /></author>
<author initials='R.' surname='Dantu' fullname='R. Dantu'>
<organization /></author>
<author initials='T.' surname='Anderson' fullname='T. Anderson'>
<organization /></author>
<author initials='R.' surname='Gopal' fullname='R. Gopal'>
<organization /></author>
<date year='2004' month='April' />
</front>
<seriesInfo name='RFC' value='3746' />
<format type='TXT' octets='98660' target='http://www.rfc-editor.org/rfc/rfc3746.txt' />
</reference>

    </references>


<section anchor="Appendix1" title="New FEPO Version">
<t>
This version of FEPO updates the earlier one given in <xref target="RFC7121"/>.
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 immediately
                      and transition to 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 there is 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 milliseconds
               </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 milliseconds
               </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 milliseconds
               </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,
                   but 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>

<section anchor="app-additional" title="Acknowledgments">
<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.&nbsp;Moonesamy (SM) worked hard to
   review our publication process.  Pearl Liang caught issues in the
   IANA text.</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>

  </back>
</rfc>
