Network Working Group                                          R. Braden
Request For Comments: 2209                                           ISI
Category: Informational                                         L. Zhang
                                                                   UCLA
                                                         September 1997

               Resource ReSerVation Protocol (RSVP) --
                  Version 1 Message Processing Rules

Status of this Memo


  This memo provides information for the Internet community.  It does
  not specify an Internet standard of any kind.  Distribution of this
  memo is unlimited.

Abstract

  This memo contains an algorithmic description of the rules used by an
  RSVP implementation for processing messages.  It is intended to
  clarify the version 1 RSVP protocol specification.

  This memo provides a generic description of the rules for the
  operation of Version 1 of RSVP [RFC 2205].  It is intended to outline
  a set of algorithms that will accomplish the needed function,
  omitting many details.

1. GENERIC DATA STRUCTURES

  This memo assumes the generic interface calls defined in [RFC 2005]
  and the following data structures.  An actual implementation may use
  additional or different data structures and interfaces.  The data
  structure fields that are shown are required unless they are
  explicitly labelled as optional.

  o    PSB -- Path State Block

       Each PSB holds path state for a particular (session, sender)
       pair, defined by SESSION and SENDER_TEMPLATE objects,
       respectively, received in a PATH message.











Braden & Zhang               Informational                      [Page 1]

RFC 2209                RSVP-Message Processing           September 1997


       PSB contents include the following values from a PATH message:

       -    Session

       -    Sender_Template

       -    Sender_Tspec

       -    The previous hop IP address and the Logical Interface
            Handle (LIH) from a PHOP object

       -    The remaining IP TTL

       -    POLICY_DATA and/or ADSPEC objects (optional)

       -    Non_RSVP flag

       -    E_Police flag

       -    Local_Only flag

       In addition, the PSB contains the following information provided
       by routing: OutInterface_list, which is the list of outgoing
       interfaces for this (sender, destination), and IncInterface,
       which is the expected incoming interface.  For a unicast
       destination, OutInterface_list contains one entry and
       IncInterface is undefined.

       Note that there may be more than one PSB for the same (session,
       sender) pair but different incoming interfaces.  At most one of
       these, which will have the Local_Only flag off, will be the PSB
       used for forwarding PATH messages downstream; we will refer to
       it as the "forwarding PSB" in the following.  The other PSB's
       will have the Local_Only flag on and an empty
       OutInterface_list.h The Local_Only flag is needed to correctly
       match PSB's against RSB's, by the rules of [RFC 2205].

  o    RSB -- Reservation State Block

       Each RSB holds a reservation request that arrived in a
       particular RESV message, corresponding to the triple:  (session,
       next hop, Filter_spec_list).  Here "Filter_spec_list" may be a
       list of FILTER_SPECs (for SE style), a single FILTER_SPEC (FF
       style), or empty (WF style).  We define the virtual object type
       "FILTER_SPEC*" for such a data structure.






Braden & Zhang               Informational                      [Page 2]

RFC 2209                RSVP-Message Processing           September 1997


       RSB contents include:

       -    Session specification

       -    Next hop IP address

       -    Filter_spec_list

       -    The outgoing (logical) interface OI on which the
            reservation is to be made or has been made.

       -    Style

       -    Flowspec

       -    A SCOPE object (optional, depending upon style)

       -    RESV_CONFIRM object that was received (optional)

  o    TCSB -- Traffic Control State Block

       Each TCSB holds the reservation specification that has been
       handed to traffic control for a specific outgoing interface.  In
       general, TCSB information is derived from RSB's for the same
       outgoing interface.  Each TCSB defines a single reservation for
       a particular triple: (session, OI, Filter_spec_list).   TCSB
       contents include:

       -    Session

       -    OI (Outgoing Interface)

       -    Filter_spec_list

       -    TC_Flowspec, the effective flowspec, i.e., the LUB over the
            corresponding FLOWSPEC values from matching RSB's.
            TC_Flowspec is passed to traffic control to make the actual
            reservation.

        -   Fwd_Flowspec, the updated object to be forwarded
            after merging.

       -    TC_Tspec, equal to Path_Te, the effective sender Tspec.

       -    Police Flags

            The flags are E_Police_Flag, M_Police_Flag, and
            B_Police_Flag.



Braden & Zhang               Informational                      [Page 3]

RFC 2209                RSVP-Message Processing           September 1997


       -    Rhandle, F_Handle_list

            Handles returned by the traffic control interface,
            corresponding to a flowspec and perhaps a list of filter
            specs.

       -    A RESV_CONFIRM object to be forwarded.

  o    BSB -- Blockade State Block

       Each BSB contains an element of blockade state.  Depending upon
       the reservation style in use, the BSB's may be per (session,
       sender_template) pair or per (session, PHOP) pair.  In practice,
       an implementation might embed a BSB within a PSB; however, for
       clarity we describe BSB's independently.

       The contents of a BSB include:

       -    Session

       -    Sender_Template (which is also a filter spec)

       -    PHOP

       -    FLOWSPEC Qb

       -    Blockade timer Tb

       The following Boolean Flag variables are used in this section:
       Path_Refresh_Needed, Resv_Refresh_Needed, Tear_Needed,
       Need_Scope, B_Merge, and NeworMod.  Refresh_PHOP_list is a
       variable-length list of PHOPs to be refreshed.

2. PROCESSING RULES

  MESSAGE ARRIVES

  Verify version number and RSVP checksum, and discard message if any
  mismatch is found.

  If the message type is not PATH or PTEAR or RACK and if the IP
  destination address does not match any of the addresses of the local
  interfaces, then forward the message to IP destination address and
  return.

  Parse the sequence of objects in the message.  If any required
  objects are missing or the length field of the common header does not
  match an object boundary, discard the message and return.



Braden & Zhang               Informational                      [Page 4]

RFC 2209                RSVP-Message Processing           September 1997


  Verify the INTEGRITY object, if any.  If the check fails, discard the
  message and return.

  Verify the consistent use of port fields.  If the DstPort in the
  SESSION object is zero but the SrcPort in a SENDER_TEMPLATE or
  FILTER_SPEC object is non-zero, then the message has a "conflicting
  source port" error; silently discard the message and return.

  Processing of POLICY_DATA objects will be specified in the future.

  Further processing depends upon message type.

  PATH MESSAGE ARRIVES

  Assume the PATH message arrives on interface InIf.

  Process the sender descriptor object sequence in the message as
  follows.  The Path_Refresh_Needed and Resv_Refresh_Needed flags are
  initially off.

  o    Search for a path state block (PSB) whose (session,
       sender_template) pair matches the corresponding objects in the
       message, and whose IncInterface matches InIf.

            During this search:

            1.   If a PSB is found whose session matches the
                 DestAddress and Protocol Id fields of the received
                 SESSION object, but the DstPorts differ and one is
                 zero, then build and send a "Conflicting Dst Port"
                 PERR message, drop the PATH message, and return.

            2.   If a PSB is found with a matching sender host but the
                 Src Ports differ and one of the SrcPorts is zero, then
                 build and send an "Ambiguous Path" PERR message, drop
                 the PATH message, and return.

            3.   If a forwarding PSB is found, i.e., a PSB that matches
                 the (session, sender_template) pair and whose
                 Local_Only flag is off, save a pointer to it in the
                 variable fPSB.  If none is found, set fPSB to NULL.

       o    If there was no matching PSB, then:

            1.   Create a new PSB.

            2.   Copy contents of the SESSION, SENDER_TEMPLATE,
                 SENDER_TSPEC, and PHOP (IP address and LIH) objects



Braden & Zhang               Informational                      [Page 5]

RFC 2209                RSVP-Message Processing           September 1997


                 into the PSB.

            3.   If the sender is from the local API, set
                 OutInterface_List to the single interface whose
                 address matches the sender address, and make
                 IncInterface undefined.  Otherwise, turn on the
                 Local_Only flag.

            4.   Turn on the Path_Refresh_Needed flag.

       o    Otherwise (there is a matching PSB):

            -    If the PHOP IP address, the LIH, or Sender_Tspec
                 differs between the message and the PSB, copy the new
                 value into the PSB and turn on the Path_Refresh_Needed
                 flag.  If the PHOP IP address or the LIH differ, also
                 turn on the Resv_Refresh_Needed flag.

       o    Call the resulting PSB the "current PSB" (cPSB).  Update
            the cPSB, as follows:

            -    Start or Restart the cleanup timer for the PSB.

            -    If the message contains an ADSPEC object, copy it into
                 the PSB.

            -    Copy E_Police flag from SESSION object into PSB.

            -    Store the received TTL into the PSB.
                 If the received TTL differs from Send_TTL in the RSVP
                 common header, set the Non_RSVP flag on in the PSB.

       o    If the PSB is new or if there is no route change
            notification in place, then perform the following routing
            manipulations, but not if the cPSB is from the local API.

            1.   Invoke the appropriate Route_Query routine using
                 DestAddress from SESSION and (for multicast routing)
                 SrcAddress from Sender_Template.

                 Call the results (Rt_OutL, Rt_InIf).

            2.   If the destination is multicast and Rt_InIf differs
                 from IncInterface in the cPSB, but fPSB points to the
                 cPSB, then do the following.

                 -    Turn on the Local_Only flag and clear the
                      OutInterface_list of the fPSB.  Set the fPSB



Braden & Zhang               Informational                      [Page 6]

RFC 2209                RSVP-Message Processing           September 1997


                      pointer to NULL.

                 -    Search for a PSB for the same (session,
                      sender_template) pair whose IncInterface matches
                      Rt_InIf.  If one is found, set fPSB to point to
                      it.

            3.   If the destination is multicast and Rt_InIf is the
                 same as IncInterface in the cPSB, but fPSB does not
                 point to the cPSB, then do the following.

                 -    Copy into the cPSB the OutInterface_list from the
                      PSB, if any, pointed to by fPSB.  Clear
                      OutInterface_list and turn on the Local_Only flag
                      in the PSB pointed to by fPSB, if any.

                 -    Turn off the Local_Only flag in the cPSB and set
                      fPSB to point to cPSB.

            4.   If Rt_OutL differs from OutInterface_list of the PSB
                 pointed to by fPSB, then:

                 -    Update the OutInterface_list of the PSB from
                      Rt_OutL, and then execute the PATH LOCAL REPAIR
                      event sequence below.

       o    If the Path_Refresh_Needed flag is now off, drop the PATH
            message and return.

            Otherwise (the path state is new or modified), do
            refreshes, upcalls, and state updates as follows.

            1.   If this PATH message came from a network interface and
                 not from a local application, make a Path Event upcall
                 for each local application for this session:

                      Call: <Upcall_Proc>( session-id, PATH_EVENT,
                                   flags, sender_tspec, sender_template
                                   [ , ADSPEC] [ , POLICY_DATA] )

            2.   If OutInterface_list is not empty, execute the PATH
                 REFRESH event sequence (below) for the sender defined
                 by the PSB.

            3.   Search for any matching reservation state, i.e., an
                 RSB whose Filter_spec_list includes a FILTER_SPEC
                 matching the SENDER_TEMPLATE and whose OI appears in
                 the OutInterface_list, and make this the `active RSB'.



Braden & Zhang               Informational                      [Page 7]

RFC 2209                RSVP-Message Processing           September 1997


                 If none is found, drop the PATH message and return.

            4.   Execute the RESV REFRESH sequence (below) for the PHOP
                 in the PSB.

            5.   Execute the event sequence UPDATE TRAFFIC CONTROL to
                 update the local traffic control state if necessary.
                 This sequence will turn on the Resv_Refresh_Needed
                 flag if the traffic control state has been modified in
                 a manner that should trigger a reservation refresh.
                 If so, execute the RESV REFRESH sequence for the PHOP
                 in the PSB.

       o    Drop the PATH message and return.

  PTEAR MESSAGE ARRIVES

       o    Search for a PSB whose (Session, Sender_Template) pair
            matches the corresponding objects in the message.  If no
            matching PSB is found, drop the PTEAR message and return.

       o    Forward a copy of the PTEAR message to each outgoing
            interface listed in OutInterface_list of the PSB.

       o    Find each RSB that matches this PSB, i.e., whose
            Filter_spec_list matches Sender_Template in the PSB and
            whose OI is included in OutInterface_list.

            1.   If the RSB style is explicit, then:
                 -    Delete from Filter_spec_list the FILTER_SPEC that
                      matches the PSB.

                 -    if Filter_spec_list is now empty, delete the RSB.

            2.   Otherwise (RSB style is wildcard) then:

                 -    If this RSB matches no other PSB, then delete the
                      RSB.

            3.   If an RSB was found, execute the event sequence UPDATE
                 TRAFFIC CONTROL (below) to update the traffic control
                 state to be consistent with the current reservation
                 and path state.

       o    Delete the PSB.

       o    Drop the PTEAR message and return.




Braden & Zhang               Informational                      [Page 8]

RFC 2209                RSVP-Message Processing           September 1997


  PERR MESSAGE ARRIVES

       o    Search for a PSB whose (SESSION, SENDER_TEMPLATE) pair
            matches the corresponding objects in the message.  If no
            matching PSB is found, drop the PERR message and return.

       o    If the previous hop address in the PSB is the local API,
            make an error upcall to the application:

                 Call: <Upcall_Proc>( session-id, PATH_ERROR,
                                Error_code, Error_value, Node_Addr,
                                Sender_Template [ , Policy_Data] )

            Any SENDER_TSPEC or ADSPEC object in the message is
            ignored.

            Otherwise, send a copy of the PERR message to the PHOP IP
            address.

       o    Drop the PERR message and return.

  RESV MESSAGE ARRIVES

       Initially, Refresh_PHOP_list is empty and the
       Resv_Refresh_Needed and NeworMod flags are off.  These variables
       are used to control immediate reservation refreshes.

       o    Determine the Outgoing Interface OI

            The logical outgoing interface OI is taken from the LIH in
            the NHOP object.  (If the physical interface is not implied
            by the LIH, it can be learned from the interface matching
            the IP destination address).

       o    Check the path state

            1.   If there are no existing PSB's for SESSION then build
                 and send a RERR message (as described later)
                 specifying "No path information", drop the RESV
                 message, and return.

            2.   If a PSB is found with a matching sender host but the
                 SrcPorts differ and one of the SrcPorts is zero, then
                 build and send an "Ambiguous Path" PERR message, drop
                 the RESV message, and return.






Braden & Zhang               Informational                      [Page 9]

RFC 2209                RSVP-Message Processing           September 1997


       o    Check for incompatible styles.

            If any existing RSB for the session has a style that is
            incompatible with the style of the message, build and send
            a RERR message specifying "Conflicting Style", drop the
            RESV message, and return.

       Process the flow descriptor list to make reservations, as
       follows, depending upon the style.  The following uses a filter
       spec list struct Filtss of type FILTER_SPEC* (defined earlier).

       For FF style: execute the following steps independently for each
       flow descriptor in the message, i.e., for each (FLOWSPEC,
       Filtss) pair.  Here the structure Filtss consists of the
       FILTER_SPEC from the flow descriptor.

       For SE style, execute the following steps once for (FLOWSPEC,
       Filtss), with Filtss consisting of the list of FILTER_SPEC
       objects from the flow descriptor.

       For WF style, execute the following steps once for (FLOWSPEC,
       Filtss), with Filtss an empty list.

       o    Check the path state, as follows.

            1.   Locate the set of PSBs (senders) that route to OI and
                 whose SENDER_TEMPLATEs match a FILTER_SPEC in Filtss.

                 If this set is empty, build and send an error message
                 specifying "No sender information", and continue with
                 the next flow descriptor in the RESV message.

            2.   If the style has explicit sender selection (e.g., FF
                 or SE) and if any FILTER_SPEC included in Filtss
                 matches more than one PSB, build and send a RERR
                 message specifying "Ambiguous filter spec" and
                 continue with the next flow descriptor in the RESV
                 message.

            3.   If the style is SE and if some FILTER_SPEC included in
                 Filtss matches no PSB, delete that FILTER_SPEC from
                 Filtss.

            4.   Add the PHOP from the PSB to Refresh_PHOP_list, if the
                 PHOP is not already on the list.






Braden & Zhang               Informational                     [Page 10]

RFC 2209                RSVP-Message Processing           September 1997


       o    Find or create a reservation state block (RSB) for
            (SESSION, NHOP).  If the style is distinct, Filtss is also
            used in the selection.  Call this the "active RSB".

       o    If the active RSB is new:

            1.   Set the session, NHOP, OI and style of the RSB from
                 the message.

            2.   Copy Filtss into the Filter_spec_list of the RSB.

            3.   Copy the FLOWSPEC and any SCOPE object from the
                 message into the RSB.

            4.   Set NeworMod flag on.

       o    If the active RSB is not new, check whether Filtss from the
            message contains FILTER_SPECs that are not in the RSB; if
            so, add the new FILTER_SPECs and turn on the NeworMod flag.

       o    Start or restart the cleanup timer on the active RSB, or,
            in the case of SE style, on each FILTER_SPEC of the RSB
            that also appears in Filtss.

       o    If the active RSB is not new, check whether STYLE, FLOWSPEC
            or SCOPE objects have changed; if so, copy changed object
            into RSB and turn on the NeworMod flag.

       o    If the message contained a RESV_CONFIRM object, copy it
            into the RSB and turn on NeworMod flag.

       o    If the NeworMod flag is off, continue with the next flow
            descriptor in the RESV message, if any.

       o    Otherwise (the NeworMod flag is on, i.e., the active RSB is
            new or modified), execute the UPDATE TRAFFIC CONTROL event
            sequence (below).  If the result is to modify the traffic
            control state, this sequence will turn on the
            Resv_Refresh_Needed flag and make a RESV_EVENT upcall to
            any local application.

            If the UPDATE TRAFFIC CONTROL sequence fails with an error,
            then delete a new RSB but restore the original reservation
            in an old RSB.

       o    Continue with the next flow descriptor.





Braden & Zhang               Informational                     [Page 11]

RFC 2209                RSVP-Message Processing           September 1997


       o    When all flow descriptors have been processed, check the
            Resv_Refresh_Needed flag.  If it is now on, execute the
            RESV REFRESH sequence (below) for each PHOP in
            Refresh_PHOP_list.

       o    Drop the RESV message and return.

            If processing a RESV message finds an error, a RERR message
            is created containing flow descriptor and an ERRORS object.
            The Error Node field of the ERRORS object is set to the IP
            address of OI, and the message is sent unicast to NHOP.

  RTEAR MESSAGE ARRIVES

       Processing of a RTEAR message roughly parallels the processing
       of the corresponding RESV message

       A RTEAR message arrives with an IP destination address matching
       outgoing interface OI.  Flag Resv_Refresh_Needed is initially
       off and Refresh_PHOP_list is empty.

       o    Determine the Outgoing Interface OI

            The logical outgoing interface OI is taken from the LIH in
            the NHOP object.  (If the physical interface is not implied
            by the LIH, it can be learned from the interface matching
            the IP destination address).

       o    Process the flow descriptor list in the RTEAR message to
            tear down local reservation state, as follows, depending
            upon the style.  The following uses a filter spec list
            struct Filtss of type FILTER_SPEC* (defined earlier).

            For FF style: execute the following steps independently for
            each flow descriptor in the message, i.e., for each
            (FLOWSPEC, Filtss) pair.  Here the structure Filtss
            consists of the FILTER_SPEC from the flow descriptor.

            For SE style, execute the following steps once for
            (FLOWSPEC, Filtss), with Filtss consisting of the list of
            FILTER_SPEC objects from the flow descriptor.

            For WF style, execute the following steps once for
            (FLOWSPEC, Filtss), with Filtss an empty list.







Braden & Zhang               Informational                     [Page 12]

RFC 2209                RSVP-Message Processing           September 1997


            1.   Find an RSB matching (SESSION, NHOP).  If the style is
                 distinct, Filtss is also used in the selection.  Call
                 this the "active RSB".  If no active RSB is found,
                 continue with next flow descriptor.

            2.   Check the style

                 If the active RSB has a style that is incompatible
                 with the style of the message, drop the RTEAR message
                 and return.

            3.   Delete from the active RSB each FILTER_SPEC that
                 matches a FILTER_SPEC in Filtss.

            4.   If all FILTER_SPECs have now been deleted from the
                 active RSB, delete the active RSB.

            5.   Execute the UPDATE TRAFFIC CONTROL event sequence
                 (below) to update the traffic control state to be
                 consistent with the reservation state.  If the result
                 is to modify the traffic control state, the
                 Resv_Refresh_Needed flag will be turned on and a
                 RESV_EVENT upcall will be made to any local
                 application.

            6.   Continue with the next flow descriptor.

       o    All flow descriptors have been processed.

            Build and send any RTEAR messages to be forwarded, in the
            following manner.

            1.   Select each PSB that routes to the outgoing interface
                 OI, and, for distinct style, that has a
                 SENDER_TEMPLATE matching Filtss.

            2.   Select a flow descriptor (Qj,Fj) (where Fj may be a
                 list) in the RTEAR message whose FILTER_SPEC matches
                 the SENDER_TEMPLATE in the PSB.  If not match is
                 found, return for next PSB.

                 -    Search for an RSB (for any outgoing interface) to
                      which the PSB routes and whose Filter_spec_list
                      includes the SENDER_TEMPLATE from the PSB.

                 -    If an RSB is found, add the PHOP of the PSB to
                      the Refresh_PHOP_list.




Braden & Zhang               Informational                     [Page 13]

RFC 2209                RSVP-Message Processing           September 1997


                 -    Otherwise (no RSB is found), add the flow
                      descriptor (Qj,Fj) to the new RTEAR message being
                      built, in a manner appropriate to the style.

                 -    Continue with the next PSB.

            3.   If the next PSB is for a different PHOP or the last
                 PSB has been processed, forward any RTEAR message that
                 has been built.

       o    If any PSB's were found in the preceding step, and if the
            Resv_Refresh_Needed flag is now on, execute the RESV
            REFRESH sequence (below) for each PHOP in
            Refresh_PHOP_list.

       o    Drop the RTEAR message and return.

  RERR MESSAGE ARRIVES

       A RERR message arrives through the (real) incoming interface
       In_If.

       o    If there is no path state for SESSION, drop the RERR
            message and return.

       o    If the Error Code = 01 (Admission Control failure), do
            special processing as follows:

            1.   Find or create a Blockade State Block (BSB), in the
                 following style-dependent manner.

                 For WF (wildcard) style, there will be one BSB per
                 (session, PHOP) pair.

                 For FF style, there will be one BSB per (session,
                 filter_spec) pair.  Note that an FF style RERR message
                 carries only one flow descriptor.

                 For SE style, there will be one BSB per (session,
                 filter_spec), for each filter_spec contained in the
                 filter spec list of the flow descriptor.

            2.   For each BSB in the preceding step, set (or replace)
                 its FLOWSPEC Qb with FLOWSPEC from the message, and
                 set (or reset) its timer Tb to Kb*R seconds.  If the
                 BSB is new, set its PHOP value, and set its
                 Sender_Template equal to the appropriate filter_spec
                 from the message.



Braden & Zhang               Informational                     [Page 14]

RFC 2209                RSVP-Message Processing           September 1997


            3.   Execute the RESV REFRESH event sequence (shown below)
                 for the previous hop PHOP, but only with the B_Merge
                 flag off.  That is, if processing in the RESV REFRESH
                 sequence reaches the point of turning the B_Merge flag
                 on (because all matching reservations are blockaded),
                 do not turn it on but instead exit the REFRESH
                 sequence and return here.

       o    Execute the following for each RSB for this session whose
            OI differs from In_If and whose Filter_spec_list has at
            least one filter spec in common with the FILTER_SPEC* in
            the RERR message.   For WF style, empty FILTER_SPEC*
            structures are assumed to match.

            1.   If Error_Code = 01 and the InPlace flag in the
                 ERROR_SPEC is 1 and one or more of the BSB's
                 found/created above has a Qb that is strictly greater
                 than Flowspec in the RSB, then continue with the next
                 matching RSB, if any.

            2.   If NHOP in the RSB is the local API, then:

                 -    If the FLOWSPEC in the RERR message is strictly
                      greater than the RSB Flowspec, then turn on the
                      NotGuilty flag in the ERROR_SPEC.

                 -    Deliver an error upcall to application:

                       Call: <Upcall_Proc>( session-id, RESV_ERROR,
                                       Error_code, Error_value,
                                          Node_Addr,  Error_flags,
                                          Flowspec, Filter_Spec_List
                                           [ , Policy_data] )

                      and continue with the next RSB.

            3.   If the style has wildcard sender selection, use the
                 SCOPE object SC.In from the RERR message to construct
                 a SCOPE object SC.Out to be forwarded.  SC.Out should
                 contain those sender addresses that appeared in SC.In
                 and that route to OI, as determined by scanning the
                 PSB's.  If SC.Out is empty, continue with the next
                 RSB.

            4.   Create a new RERR message containing the error flow
                 descriptor and send to the NHOP address specified by
                 the RSB.  Include SC.Out if the style has wildcard
                 sender selection.



Braden & Zhang               Informational                     [Page 15]

RFC 2209                RSVP-Message Processing           September 1997


            5.   Continue with the next RSB.

       o    Drop the RERR message and return.

  RESV CONFIRM ARRIVES

       o    If the (unicast) IP address found in the RESV_CONFIRM
            object in the RACK message matches an interface of the
            node, a confirmation upcall is made to the matching
            application:

                 Call: <Upcall_Proc>( session-id, RESV_CONFIRM,
                             Error_code, Error_value, Node_Addr,
                                 LUB-Used, nlist, Flowspec,
                                 Filter_Spec_List, NULL, NULL )

       o    Otherwise, forward the RACK message to the IP address in
            its RESV_CONFIRM object.

       Drop the RACK message and return.

  UPDATE TRAFFIC CONTROL

       The sequence is invoked by many of the message arrival sequences
       to set or adjust the local traffic control state in accordance
       with the current reservation and path state.  An implicit
       parameter of this sequence is the `active' RSB.

       If the result is to modify the traffic control state, this
       sequence notifies any matching local applications with a
       RESV_EVENT upcall.  If the state change is such that it should
       trigger immediate RESV refresh messages, it also turns on the
       Resv_Refresh_Needed flag.

       o    Compute the traffic control parameters using the following
            steps.

            1.   Initially the local flag Is_Biggest is off.

            2.   Consider the set of RSB's matching SESSION and OI from
                 the active RSB.  If the style of the active RSB is
                 distinct, then the Filter_spec_list must also be
                 matched.

                 -    Compute the effective kernel flowspec,
                      TC_Flowspec, as the LUB of the FLOWSPEC values in
                      these RSB's.




Braden & Zhang               Informational                     [Page 16]

RFC 2209                RSVP-Message Processing           September 1997


                 -    Compute the effective traffic control filter spec
                      (list) TC_Filter_Spec* as the union of the
                      Filter_spec_lists from these RSB's.

                 -    If the active RSB has a FLOWSPEC larger than all
                      the others, turn on the Is_Biggest flag.

            3.   Scan all RSB's matching session and Filtss, for all
                 OI.  Set TC_B_Police_flag on if TC_Flowspec is smaller
                 than, or incomparable to, any FLOWSPEC in those RSB's.

            4.   Locate the set of PSBs (senders) whose
                 SENDER_TEMPLATEs match Filter_spec_list in the active
                 RSB and whose OutInterface_list includes OI.

            5.   Set TC_E_Police_flag on if any of these PSBs have
                 their E_Police flag on.  Set TC_M_Police_flag on if it
                 is a shared style and there is more than one PSB in
                 the set.

            6.   Compute Path_Te as the sum of the SENDER_TSPEC objects
                 in this set of PSBs.

       o    Search for a TCSB matching SESSION and OI; for distinct
            style (FF), it must also match Filter_spec_list.

            If none is found, create a new TCSB.

       o    If TCSB is new:

            1.   Store TC_Flowspec, TC_Filter_Spec*, Path_Te, and the
                 police flags into TCSB.

            2.   Turn the Resv_Refresh_Needed flag on and make the
                 traffic control call:

                TC_AddFlowspec( OI, TC_Flowspec,
                             Path_Te, police_flags)
                              ->  Rhandle, Fwd_Flowspec

            3.   If this call fails, build and send a RERR message
                 specifying "Admission control failed" and with the
                 InPlace flag off.  Delete the TCSB, delete any
                 RESV_CONFIRM object from the active RSB, and return.







Braden & Zhang               Informational                     [Page 17]

RFC 2209                RSVP-Message Processing           September 1997


            4.   Otherwise (call succeeds), record Rhandle and
                 Fwd_Flowspec in the TCSB.  For each filter_spec F in
                 TC_Filter_Spec*, call:

                TC_AddFilter( OI, Rhandle, Session, F)
                                    -> Fhandle

            and record the returned Fhandle in the TCSB.

       o    Otherwise, if TCSB is not new but no effective kernel
            flowspec TC_Flowspec was computed earlier, then:

            1.   Turn on the Resv_Refresh_Needed flag.

            2.   Call traffic control to delete the reservation:

                TC_DelFlowspec( OI, Rhandle )

            3.   Delete the TCSB and return.

       o    Otherwise, if TCSB is not new but the TC_Flowspec, Path_Te,
            and/or police flags just computed differ from corresponding
            values in the TCSB, then:

            1.   If the TC_Flowspec and/or Path_Te values differ, turn
                 the Resv_Refresh_Needed flag on.

            2.   Call traffic control to modify the reservation:

                TC_ModFlowspec( OI, Rhandle, TC_Flowspec,
                               Path_Te, police_flags )
                                    -> Fwd_Flowspec

            3.   If this call fails, build and send a RERR message
                 specifying "Admission control failed" and with the
                 InPlace bit on.  Delete any RESV_CONFIRM object from
                 the active RSB and return.

            4.   Otherwise (the call succeeds), update the TCSB with
                 the new values and save Fwd_Flowspec in the TCSB.

       o    If the TCSB is not new but the TC_Filter_Spec* just
            computed differs from the FILTER_SPEC* in the TCSB, then:

            1.   Make an appropriate set of TC_DelFilter and
                 TC_AddFilter calls to transform the Filter_spec_list
                 in the TCSB into the new TC_Filter_Spec*.




Braden & Zhang               Informational                     [Page 18]

RFC 2209                RSVP-Message Processing           September 1997


            2.   Turn on the Resv_Refresh_Needed flag.

       o    If the active RSB contains a RESV_CONFIRM object, then:

            1.   If the Is_Biggest flag is on, move the RESV_CONFIRM
                 object into the TCSB and turn on the
                 Resv_Refresh_Needed flag. (This will later cause the
                 RESV REFRESH sequence to be invoked, which will either
                 forward or return the RESV_CONFIRM object, deleting it
                 from the TCSB in either case).

            2.   Otherwise, create and send a RACK message to the
                 address in the RESV_CONFIRM object.  Include the
                 RESV_CONFIRM object in the RACK message.  The RACK
                 message should also include an ERROR_SPEC object whose
                 Error_Node parameter is IP address of OI from the TCSB
                 and that specifies "No Error".

       o    If the Resv_Refresh_Needed flag is on and the RSB is not
            from the API, make a RESV_EVENT upcall to any matching
            application:

                 Call: <Upcall_Proc>( session-id, RESV_EVENT,
                             style, Flowspec, Filter_spec_list [ ,
                             POLICY_DATA] )

            where Flowspec and Filter_spec_list come from the TCSB and
            the style comes from the active RSB.

       o    Return to the event sequence that invoked this one.

  PATH REFRESH

       This sequence sends a path refresh for a particular sender,
       i.e., a PSB.  This sequence may be entered by either the
       expiration of a refresh timer or directly as the result of the
       Path_Refresh_Needed flag being turned on during the processing
       of a received PATH message.

       o    Insert TIME_VALUES object into the PATH message being
            built.  Compute the IP TTL for the PATH message as one less
            than the TTL value received in the message.  However, if
            the result is zero, return without sending the PATH
            message.

       o    Create a sender descriptor containing the SENDER_TEMPLATE,
            SENDER_TSPEC, and POLICY_DATA objects, if present in the
            PSB, and pack it into the PATH message being built.



Braden & Zhang               Informational                     [Page 19]

RFC 2209                RSVP-Message Processing           September 1997


       o    Send a copy of the PATH message to each interface OI in
            OutInterface_list.  Before sending each copy:

            1.   If the PSB has the E_Police flag on and if interface
                 OI is not capable of policing, turn the E_Police flag
                 on in the PATH message being built.

            2.   Pass the ADSPEC object and Non_RSVP flag present in
                 the PSB to the traffic control call TC_Advertise.
                 Insert the modified ADSPEC object that is returned
                 into the PATH message being built.

            3.   Insert into its PHOP object the interface address and
                 the LIH for the interface.

  RESV REFRESH

       This sequence sends a reservation refresh towards a particular
       previous hop with IP address PH.  This sequence may be entered
       by the expiration of a refresh timer, or invoked from the PATH
       MESSAGE ARRIVES, RESV MESSAGE ARRIVES, RTEAR MESSAGE ARRIVES, or
       RERR MESSAGE ARRIVES sequence.

       In general, this sequence considers each of the PSB's with PHOP
       address PH.  For a given PSB, it scans the TCSBs for matching
       reservations and merges the styles, FLOWSPECs and
       Filter_spec_list's appropriately.  It then builds a RESV message
       and sends it to PH.  The details depend upon the attributes of
       the style(s) included in the reservations.

       Initially the Need_Scope flag is off and the new_SCOPE object is
       empty.

       o    Create an output message containing INTEGRITY (if
            configured), SESSION, RSVP_HOP, and TIME_VALUES objects.

       o    Determine the style for these reservations from the first
            RSB for the session, and move the STYLE object into the
            proto-message.  (Note that the present set of styles are
            never themselves merged; if future styles can be merged,
            these rules will become more complex).

       o    If style is wildcard and if there are PSB's from more than
            one PHOP and if the multicast routing protocol does not use
            shared trees, set the Need_Scope flag on.






Braden & Zhang               Informational                     [Page 20]

RFC 2209                RSVP-Message Processing           September 1997


       o    Select each sender PSB whose PHOP has address PH.  Set the
            local flag B_Merge off and execute the following steps.

            1.   Select all TCSB's whose Filter_spec_list's match the
                 SENDER_TEMPLATE object in the PSB and whose OI appears
                 in the OutInterface_list of the PSB.

            2.   If the PSB is from the API, then:

                 -    If TCSB contains a CONFIRM object, then create
                      and send a RACK message containing the object and
                      delete the CONFIRM object from the TCSB.

                 -    Continue with next PSB.

            3.   If B_Merge flag is off then ignore a blockaded TCSB,
                 as follows.

                 -    Select BSB's that match this TCSB.  If a selected
                      BSB is expired, delete it.  If any of the
                      unexpired BSB's has a Qb that is not strictly
                      larger than TC_Flowspec, then continue processing
                      with the next TCSB.

                 However, if steps 1 and 2 result in finding that all
                 TCSB's matching this PSB are blockaded, then:

                 -    If this RESV REFRESH sequence was invoked from
                      RESV ERROR RECEIVED, then return to the latter.

                 -    Otherwise, turn on the B_Merge flag and restart
                      at step 1, immediately above.

            4.   Merge the flowspecs from this set of TCSB's, as
                 follows:

                 -    If B_Merge flag is off, compute the LUB over the
                      flowspec objects.  From each TCSB, use the
                      Fwd_Flowspec object if present, else use the
                      normal Flowspec object.











Braden & Zhang               Informational                     [Page 21]

RFC 2209                RSVP-Message Processing           September 1997


                      While computing the LUB, check for a RESV_CONFIRM
                      object in each TCSB.  If a RESV_CONFIRM object is
                      found:

                      -    If the flowspec (Fwd_Flowspec or Flowspec)
                           in that TCSB is larger than all other (non-
                           blockaded) flowspecs being compared, then
                           save this RESV_CONFIRM object for forwarding
                           and delete from the TCSB.

                      -    Otherwise (the corresponding flowspec is not
                           the largest), create and send a RACK message
                           to the address in the RESV_CONFIRM object.
                           Include the RESV_CONFIRM object in the RACK
                           message.  The RACK message should also
                           include an ERROR_SPEC object whose
                           Error_Node parameter is IP address of OI
                           from the TCSB and specifying "No Error".

                      -    Delete the RESV_CONFIRM object from the
                           TCSB.

                 -    Otherwise (B_Merge flag is on), compute the GLB
                      over the Flowspec objects of this set of TCSB's.

                 While computing the GLB, delete any RESV_CONFIRM
                 object object in any of these TCSB's.

            5.   (All matching TCSB's have been processed).  The next
                 step depends upon the style attributes.

                 Distinct reservation (FF) style

                      Use the Sender_Template as the merged
                      FILTER_SPEC.  Pack the merged (FLOWSPEC,
                      FILTER_SPEC, F_POLICY_DATA) triplet into the
                      message as a flow descriptor.

                 Shared wildcard reservation (WF) style

                      There is no merged FILTER_SPEC.  Merge (compute
                      the LUB of) the merged FLOWSPECS from the TCSB's,
                      across all PSB's for PH.








Braden & Zhang               Informational                     [Page 22]

RFC 2209                RSVP-Message Processing           September 1997


                 Shared distinct reservation (SE) style

                      Using the Sender_Template as the merged
                      FILTER_SPEC, form the union of the FILTER_SPECS
                      obtained from the TCSB's.  Merge (compute the LUB
                      of) the merged FLOWSPECS from the TCSB's, across
                      all PSB's for PH.

            6.   If the Need_Scope flag is on and the sender specified
                 by the PSB is not the local API:

                 -    Find each RSB that matches this PSB, i.e., whose
                      Filter_spec_list matches Sender_Template in the
                      PSB and whose OI is included in
                      OutInterface_list.

                 -    If the RSB either has no SCOPE list or its SCOPE
                      list includes the sender IP address from the PSB,
                      insert the sender IP address into new_SCOPE.

       o    (All PSB's for PH have been processed).  Finish the RESV
            message.

            1.   If Need_Scope flag is on but new_SCOPE is empty, no
                 RESV message should be sent; return.  Otherwise, if
                 Need_Scope is on, move new_SCOPE into the message.

            2.   If a shared reservation style is being built, move the
                 final merged FLOWSPEC object and filter spec list into
                 the message.

            3.   If a RESV_CONFIRM object was saved earlier, move it
                 into the new RESV message.

            4.   Set the RSVP_HOP object in the message to contain the
                 IncInterface address through which it will be sent and
                 the LIH from (one of) the PSB's.

       o    Send the message to the address PH.

  ROUTE CHANGE NOTIFICATION

       This sequence is triggered when routing sends a route change
       notification to RSVP.

       o    Each PSB is located whose SESSION matches the destination
            address and whose SENDER_TEMPLATE matches the source
            address (for multicast).



Braden & Zhang               Informational                     [Page 23]

RFC 2209                RSVP-Message Processing           September 1997


            1.   If the OutInterface_list from the notification differs
                 from that in the PSB, execute the PATH LOCAL REPAIR
                 sequence.

            2.   If the IncInterface from the notification differs from
                 that in the PSB, update the PSB.

  PATH LOCAL REPAIR

       The sequence is entered to effect local repair after a route
       change for a given PSB.

       o    Wait for a delay time of W seconds.

       o    Execute the PATH REFRESH event sequence (above) for the
            PSB.

References

  [Baker96]  Baker, F., "RSVP Cryptographic Authentication", Work in
       Progress.


  [RFC 2205]  Braden, R., Ed., Zhang, L., Berson, S., Herzog, S., and
       S. Jamin, "Resource ReSerVation Protocol (RSVP) -- Version 1
       FunctionalSpecification", RFC 2205, September 1997.

  [RFC 2207]  Berger, L. and T. O'Malley, "RSVP Extensions for IPSEC
       IPv4 Data Flows", RFC 2207, September 1997.

  [RSVP93]  Zhang, L., Deering, S., Estrin, D., Shenker, S., and D.
       Zappala, "RSVP: A New Resource ReSerVation Protocol", IEEE
       Network, September 1993.

Security Considerations

  Processing the RSVP INTEGRITY object [Baker96] is only mentioned in
  this memo, because the processing rules are described here only in
  general terms.  The RSVP support for IPSEC [RFC 2207] will imply
  modifications that have not yet been incorporated into these
  processing rules.










Braden & Zhang               Informational                     [Page 24]

RFC 2209                RSVP-Message Processing           September 1997


Authors' Addresses

  Bob Braden
  USC Information Sciences Institute
  4676 Admiralty Way
  Marina del Rey, CA 90292

  Phone: (310) 822-1511
  EMail: [email protected]


  Lixia Zhang
  UCLA Computer Science Department
  4531G Boelter Hall
  Los Angeles, CA 90095-1596 USA

  Phone: 310-825-2695
  EMail: [email protected]

































Braden & Zhang               Informational                     [Page 25]