<?xml version='1.0' encoding='utf-8'?>
<!-- This template is for creating an Internet Draft using xml2rfc, which is available here: http://xml.resource.org. -->

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

<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="3"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
 (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-przygienda-rift-adrift-00"  ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" version="3">
    <!-- xml2rfc v2v3 conversion 2.45.3 -->
    <!-- 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>
        <!-- The abbreviated title is used in the page header - it is
         only necessary if the
         full title is longer than 39 characters -->

        <title abbrev="RIFT">AD-RIFT: Adaptive RIFT</title>
        <seriesInfo name="Internet-Draft" value="draft-przygienda-rift-adrift-00"/>
        <!-- add 'role="editor"' below for the editors if appropriate -->

        <!-- Another author who claims to be an editor -->

        <author fullname="Tony Przygienda" initials="A." surname="Przygienda" role="editor">
            <organization>Juniper Networks</organization>
            <address>
                <postal>
                    <street>1137 Innovation Way
                    </street>
                    <city>Sunnyvale</city>
                    <region>CA
                    </region>
                    <code>94089</code>
                    <country>USA
                    </country>
                </postal>
                <phone/>
                <email>prz@juniper.net
                </email>
                <uri/>
            </address>
        </author>

        <date year="2024"/>
        <!-- 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 -->

        <area>Routing</area>
        <workgroup>RIFT Working Group</workgroup>
        <!-- WG name at the upper left 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. -->

        <!-- 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>Adaptive RIFT (AD-RIFT for short) extends RIFT to carry additional link and node information, primarily
                traffic engineering related. This enables the southbound computation to optimally
                place traffic depending on available resources and usage. Additionally,
                a selective disaggregation, similar to negative disaggregation, is introduced that
                allows to balance northbound forwarding toward specific
                prefixes between nodes at the same level depending on resources
                available.

            </t>
        </abstract>
    </front>
    <middle>
        <section numbered="true" toc="default" anchor="intro_sec">
            <name>Introduction</name>
<t>
    RIFT in its original form <xref target="I-D.ietf-rift-rift"/> does not propagate any kind of metrics beside bandwidth and general cost. It
    also abstains from propagating dynamic metrics  across the fabric. In environments which rely on, for lack of a better
    term, adaptive routing; adaptive meaning here reaction to link usage or more complex metrics like delay,
    additional metrics are needed. One such use case is the placement of long-lived, fairly fat flows in the fabric and
    with some additional metrics and mechanisms RIFT is ideally suited for the task executed in a distributed way
    due to its absence on dependence on shortest path forwarding.
</t>
        </section>

        <section>
            <name>Extra Node Information TIE <em>AdditionalNodeTIEElement</em></name>
            <t>
                To start with, as a fairly obvious mechanism a new TIE, identical in its scope  to a node TIE is
                introduced. Those TIEs  SHOULD
                be flooded at low priority and contain different link metrics per traffic class
                in <em>AdditionalNodeInfoTIEElement</em> helping in the computation of southbound
                direction forwarding.
            </t>

            <t>
                Since the additional info contains many variables describing link properties for
                advanced computation the lack of such TIEs from a node may lead to its links not being
                considered for forwarding.
            </t>

        </section>
        <section>
            <name>Traffic Engineering Prefix Preference <em>TEPrefixPreferenceTIEElement</em></name>
            <t>
                Since for scaling reasons nodes in the south direction do not see full topology and operate
                under normal conditions using a default route only, another mechanism
                has to be used to steer traffic accordingly to available resources for prefixes that
                are exceptional in terms of available resources.
                A similar mechanism in the form of negative disaggregation is already implemented
                in RIFT, and it can be considered in a sense the most extreme form of traffic steering, namely
                complete rejection to accept traffic to a prefix.
                Accordingly, a new TIE type <em>TEPrefixPreferenceTIEElement</em> is introduced that carries a negative
                preference in regard to a traffic class for specific prefixes and follows the prefix TIE flooding scope.

                </t>
            <t> This mechanism preconditions, during north computation, just like
                with negative disaggregation, that a node modifies the next-hop gateway weights
                based on the next-hops of the less specific aggregate.

            </t>
            <t>
                In the southern direction the analogy to negative disaggregation holds as well. A ToF node
            performs computation from the view points of all nodes in its plane and on realization that
            it has less resources to a prefix than other ToFs it issues a <em>TEPrefixPreferenceTIEElement</em>.

            </t>

            <t>
                The analogy to negative disaggregation is imperfect however when it comes to transitivity.
                Generally, not all nodes northbound will issue a <em>TEPrefixPreferenceTIEElement</em>
                since the node with the best resource availability will abstain from generating it.
                Hence, the prefix is always reachable and northbound wise all the nodes at same level
                see same preference. However, a node could generate a <em>TEPrefixPreferenceTIEElement</em>
                for the prefix again southbound if it sees a large imbalance northbound of it though here
                an extended BAD computation can take care of this as well.
            </t>

            <t>
                In terms of preference negative disaggregation computation has to be performed first and
                only after the according gateways have been constructed or purged can the according
                TE prefix preference modify the gateway preferences further. Observe that negative
                disaggregation can operate on complete different prefix resolution than
                TE preference, i.e. negative disaggregation may choose to suppress forwarding to a
                prefix but TE preference may disaggregate a more specific prefix and still choose
                to forward towards it although negative disaggregation suppressed a less specific
                to some of the gateways already.
            </t>

            <t>
                Just like in case of negative disaggregation the lack of prefix preference
                advertisement from a node MUST be interpreted as the node accepting traffic to the prefix
                with maximum preference.
            </t>
        </section>

        <section>
            <name>Schema Extensions</name>

            <t>
            Due to changes in the TIEType adding new TIE type with a scope different from a prefix TIE scope new major version of
            the schema MUST be introduced, i.e. AD-RIFT is not compatible with normal RIFT although an attempt
            could be made to introduce a minor version with according <em>NodeCapabilities</em> extensions given
            the TIEs are completely optional.
            </t>

<figure align="center" anchor="first-simple"
title="RIFT information distribution">
<artwork align="center">
    <![CDATA[

/** Type of TIE.
*/
enum TIETypeType {
    Illegal                                     = 0,
    TIETypeMinValue                             = 1,
    /** first legal value */
    NodeTIEType                                 = 2,
    PrefixTIEType                               = 3,
    PositiveDisaggregationPrefixTIEType         = 4,
    NegativeDisaggregationPrefixTIEType         = 5,
    PGPrefixTIEType                             = 6,
    KeyValueTIEType                             = 7,
    ExternalPrefixTIEType                       = 8,
    PositiveExternalDisaggregationPrefixTIEType = 9,
    TEPrefixPreferenceTIEType                   = 10,
    AdditionalNodeInfoTIEType                   = 11,
    TIETypeMaxValue                             = 12,
}

typedef i8  TrafficClassType
/** The preference to carry traffic to this prefix compared to other nodes in the same level. Higher numbers
    show higher preference to carry traffic */
typedef i8  RelativePreferenceType

struct TEPrefixPreferenceTIEElement {
    1: required map<TrafficClassType, map<common.IPPrefixType, RelativePreferenceType>> prefixes;
}

typedef i32 DelayinNanoSecType
typedef i32 DelayVariationPerMilliSecinNanoSecType
typedef i32 PacketLossPerBillionPacketsType
typedef i32 AdministrativeGroupType

struct AdditionalLinkInfoTypePerTrafficClassType {
    1: optional PacketLossPerBillionPacketsType           loss;
    2: optional DelayVariationPerMilliSecinNanoSecType    delay_variation;
    3: optional common.BandwithInMegaBitsType             used_bandwidth;
    4: optional common.BandwithInMegaBitsType             maximum_available_bandwidth;
}

struct AdditionalLinkInfoType {
    1: optional DelayinNanoSecType                                                  min_delay;
    2: optional DelayinNanoSecType                                                  max_delay;
    3: optional common.BandwithInMegaBitsType                                       bandwidth;
    4: optional AdministrativeGroupType                                             admin_group;
   10: optional map<TrafficClassType, AdditionalLinkInfoTypePerTrafficClassType>    per_class_info;
}

struct AdditionalNodeInfoTIEElement {
    1: optional map<common.LinkIDType, AdditionalLinkInfoType>      links;
}

/** Single element in a TIE. */
union TIEElement {
    /** Used in case of enum common.TIETypeType.NodeTIEType. */
    1: optional NodeTIEElement     node;
    /** Used in case of enum common.TIETypeType.PrefixTIEType. */
    2: optional PrefixTIEElement          prefixes;
    /** Positive prefixes (always southbound). */
    3: optional PrefixTIEElement   positive_disaggregation_prefixes;
    /** Transitive, negative prefixes (always southbound) */
    5: optional PrefixTIEElement   negative_disaggregation_prefixes;
    /** Externally reimported prefixes. */
    6: optional PrefixTIEElement          external_prefixes;
    /** Positive external disaggregated prefixes (always southbound). */
    7: optional PrefixTIEElement
            positive_external_disaggregation_prefixes;
    /** Key-Value store elements. */
    9: optional KeyValueTIEElement keyvalues;
    /** <adrift>

        **/
   10: optional TEPrefixPreferenceTIEElement
            traffic_engineering_preference_prefix;
   11: optional AdditionalNodeInfoTIEElement
            additional_node;
   /** </adrift>

    **/
}
]]>
                </artwork>
            </figure>
        </section>
    </middle>

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

    <back>

        <references title='Normative References'>

            <xi:include href="http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-rift-rift.xml"/>


        </references>



        </back>
</rfc>
