Internet Draft                                                 R. Braden
Expiration: December 1997                                            ISI
File: draft-ietf-rsvp-rapi-00.txt                             D. Hoffman
                                                        Sun Microsystems



           RAPI -- An RSVP Application Programming Interface

                               Version 5



                             June 16, 1997

Status of Memo

   This document is an Internet-Draft.  Internet-Drafts are working
   documents of the Internet Engineering Task Force (IETF), its areas,
   and its working groups.  Note that other groups may also distribute
   working documents as Internet-Drafts.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   To learn the current status of any Internet-Draft, please check the
   "1id-abstracts.txt" listing contained in the Internet- Drafts Shadow
   Directories on ds.internic.net (US East Coast), nic.nordu.net
   (Europe), ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific
   Rim).

Abstract

   This memo describes version 5 of RAPI, a specific API (application
   programming interface) for RSVP.  The RAPI interface is one
   realization of the generic API contained in the RSVP Functional
   Specification document, and it is being published for information
   only.  The RAPI interface is based upon a client library, whose calls
   are described here.

1. Introduction

   An Internet application uses some "API" ( Application Programming
   Interface) in order to request enhanced quality-of-service (QoS).  A
   local RSVP control program will then use the RSVP protocol to
   propagate the QoS request through the routers along path(s) for the



Braden, Hoffman        Expiration: December 1997                [Page 1]


Internet Draft                  RAPI v.5                       June 1997


   data flow.  Each router may accept or deny the request, depending
   upon its available resources.  In the case of failure, the local RSVP
   control program will return the decision to the requesting
   application via the API.

   This document describes a particular RSVP API implementation known as
   "RAPI".  RAPI is based on a client library linked with the
   application.  This document describes the calls to that library.
   There is at least one other documented API for RSVP, based on
   sockets.

   The following diagram shows RAPI's implementation model.  RSVP is
   implemented on a host by a user-level daemon program.  The procedures
   of the RSVP client library module interact with the local RSVP daemon
   program through a Unix-domain socket.  RAPI refers to the interface
   between the application and the RSVP client library.


                            H O S T           .      R O U T E R
                (RAPI)                        .
                  v                           .
     _____________v                           .
    |             |_______                    .
    |             x RSVP  |                   .
    |             x Client|                   .
    | Application x Lib   |   ____________    .      _____________
    |             x  rtns |  |            |   .     |             |
    |             x_______|  |    RSVP    |   .     |    RSVP     |
    |             |   |      |   Daemon   |   .     |   Daemon    |
    |_____________|   |      |____________|   .     |_____________|
               |      |        |   .    |     .       |    |    |
      USER     |      |        |   .    |     .       |    |    |
    ===========|======|========|===V====|=====.       |    |    |
      KERNEL   |      |_<____>_|   .    |___<_____>___|    |    |__>
               |       UNIX Pipe   .      RSVP messages    |    RSVP
               |                   .          .            |
               |              _____V______    .       _____V______
               |             |            |   .      |            |
               |             | Packet     |   .      |  Packet    |
               += DATA====>  | Classifier | =DATA==> | Classifier | ==>
                             |& Scheduler |   .      |& Scheduler |
                             |  (if any)  |   .      |            |
                             |____________|   .      |____________|








Braden, Hoffman        Expiration: December 1997                [Page 2]


Internet Draft                  RAPI v.5                       June 1997


   1.1 Reservation Model

      RSVP performs the signaling necessary to make a resource
      reservation for a simplex data flow sent to a unicast or multicast
      destination address.  Although RSVP distinguishes senders from
      receivers, the same application may act in both roles.

      RSVP assigns QoS to an specific multipoint-to-multipoint data flow
      known as a "session".  A session is defined by a particular
      transport protocol, IP destination address, and destination port.
      In order to receive data packets for a particular multicast
      session, a host must have joined the corresponding IP multicast
      group using the setsockopt call IP_ADD_MEMBERSHIP.

      A data source, or "sender", is defined by an IP source address and
      a source port.  A given session may have multiple senders S1, S2,
      ... Sn, and if the destination is a multicast address, multiple
      "receivers" R1, R2, ... Rm.  In the current version of RSVP, the
      ports used by RSVP for defining sessions and senders are
      restricted to be TCP/UDP port numbers.

      Under RSVP, QoS requests are made by the data receivers.  A QoS
      request contains a "flowspec" together with a "filter spec".  The
      flowspec includes an "Rspec", which defines the desired QoS and is
      used to control the packet scheduling mechanism in the router or
      host, and also a "Tspec", which defines the traffic expected by
      the receiver.  The filter spec controls packet classification to
      determine which sender(s)' data packets receive the corresponding
      QoS.

      The detailed manner in which reservations from different receivers
      are shared in the Internet is controlled by a reservation
      parameter known as the "reservation style".  The RSVP Functional
      Specification contains a definition and explanation of the
      different reservation styles.


   1.2 API Outline

      Using the RAPI interface, an application uses the txt _session()
      call to define an "API session" for sending a single simplex data
      flow and/or receiving such a data flow.  The txt _sender() call
      may then be used to register as a data sender, and/or the
      txt _reserve() call may be used to make a QoS reservation as a
      data receiver.The txt _sender and/or txt _reserve calls may be
      repeated with different parameters to dynamically modify the state
      at any time or they can be issued in null forms that retract the
      corresponding registration.  The application can call



Braden, Hoffman        Expiration: December 1997                [Page 3]


Internet Draft                  RAPI v.5                       June 1997


      txt _release() to close the session and delete all of its resource
      reservations.  The relationship among the RAPI library calls is
      summarized by the RAPI state diagram shown below.  Rapi_sender(0)
      and txt _reserve(0) represent null calls in that diagram.

      Note that a single API session, defined by a single txt _session
      call, can define only one sender at a time.  More than one API
      session may be established for the same RSVP session.  For
      example, suppose an application sends multiple UDP data flows,
      distinguished by source port.  It will call txt _session and
      txt _sender separately for each of these flows.

      The txt _session call allows the application to specify an "
      upcall" (or "callback") routine that will be invoked to signal
      RSVP state change and error events.  There are five types of
      upcalls.

      o    PATH_EVENT and RESV_EVENT upcalls signal the arrival or
           change of path state and reservation state, respectively, and
           deliver the relevant state information to the application.

      o    PATH_ERROR and RESV_ERROR upcalls signal the corresponding
           errors.

      o    PATH_CONFIRM upcalls signal the arrival of a CONFIRM message.


      The upcall routine is invoked indirectly (and synchronously) by
      the application, using the following mechanism.

      o    The application issues the RAPI library call txt _getfd() to
           learn the file descriptor of the Unix socket used by the API.

      o    The application detects read events on this file descriptor,
           either passing it directly in a select call or passing it to
           the notifier of another library (such as XLib, tk/tcl, RPC,
           etc.).

      o    When a read event on the file descriptor is signaled, the
           application calls txt _dispatch().  This drives the API to
           execute the upcall routine if appropriate.










Braden, Hoffman        Expiration: December 1997                [Page 4]


Internet Draft                  RAPI v.5                       June 1997


                              RAPI State Diagram

                                  +---------+
                                  | Closed  |<-----+
                                  +---------+      |
                                       |           |
                                 txt _session      |
                                       |           |
                              +----+   |      txt _release
                   PATH_EVENT |    V   V           |
                              |   +---------+      |
                              +---|         |------+
                                  | Session |
                       +----------|         |----------+
                 txt _sender      +---------+    txt _reserve
                       |           ^       ^           |
      txt _sender or   |           |       |           |   txt _reserve or
      PATH_EVENT or    | rapi_sender(0)    |           |   PATH_EVENT or
      RESV_EVENT or    |           |       |           |   CONFIRM_EVENT
      PATH_ERROR       |           |       |           |   or RESV_ERROR
              +----+   |           |  rapi_reserve(0)  |   +----+
              |    V   V           |       |           V   V    |
              |   +---------+      |       |      +---------+   |
              +---|         |------+       +------|         |---+
                  |  Send   |                     |   Rcv   |
          +-------|         |<-----+       +----->|         |-------+
          |       +---------+      |       |      +---------+       |
          |            |           |       |           |            |
          |            | rapi_reserve(0)   |           |            |
          |            |           |       |           |            |
          |            |           |  rapi_sender(0)   |            |
          |            |           |       |           |            |
          |     rapi_reserve       |       |      rapi_sender       |
          |            |          +---------+          |            |
          |            +--------->|         |<---------+            |
          |                       | SendRcv |                       |
          |    rapi_sender or +---|         |                       |
          |   rapi_reserve or |   +---------+                       |
          |     PATH_EVENT or |    ^   |                            |
          |     RESV_EVENT or +----+   |                            |
          |     CONFIRM_EVENT          |                            |
          |     or PATH_ERROR          |                            |
          |     or RESV_ERROR          |                            |
          |                      rapi_release              rapi_release
        rapi_release                   V                            |
          |                        +--------+                       |
          +----------------------->| Closed |<----------------------+
                                   +--------+



Braden, Hoffman        Expiration: December 1997                [Page 5]


Internet Draft                  RAPI v.5                       June 1997


      A synchronous error in a RAPI library routine returns an
      appropriate error code.  Asynchronous RSVP errors are delivered to
      the application via the RAPI upcall routine.  Text messages for
      synchronous and asynchronous error codes will be found in the file
      "rapi_err.h".

      The first rapi_session() call in a particular instance of the RAPI
      library opens a Unix-domain RAPI socket to the RSVP daemon and
      passes the session registration request across it.  If the
      application (or the daemon) crashes without properly closing the
      RAPI socket, the other side will be notified to perform a cleanup.
      In particular, if the user process terminates without explicitly
      closing the RAPI session, the daemon will delete the corresponding
      reservation state from the routers.





































Braden, Hoffman        Expiration: December 1997                [Page 6]


Internet Draft                  RAPI v.5                       June 1997


2. CLIENT LIBRARY SERVICES

   The RSVP API provides the client library calls defined in this
   section.  To use these calls, the application should include the file
   "rapi_lib.h" and "rsvp_intserv.h".

   A.   Create a Session

        The rapi_session call creates an API session.  If it succeeds,
        the call returns an opaque but non-zero session handle for use
        in subsequent calls related to this API session.  If the call
        fails synchronously, it returns zero (NULL_SID) and stores a
        RAPI error code into an integer variable pointed to by the
        "errnop" parameter.

        After a successful rapi_session call has been made, the
        application may receive upcalls of type RAPI_PATH_EVENT for the
        API session.

        unsigned int rapi_session(

             struct sockaddr *Dest,      /* Session: (Dst addr, port) */
             int         Protid,         /* Protocol Id               */
             int         flags,          /* flags                     */
             int         (*Event_rtn)(), /* Address of upcall routine */
             void        *Event_arg,     /* App argument to upcall    */
             int         *errnop         /* Place to return error code*/
             )


        The parameters are as follows.

        o    "Dest"

             This required parameter points to a sockaddr structure
             defining the destination IP (V4 or V6) address and a port
             number to which data will be sent.  The "Dest" and "Protid"
             parameters define an RSVP session.  If the "Protid"
             specifies UDP or TCP transport, the port corresponds to the
             appropriate transport port number.

        o    "Protid"

             The IP protocol ID for the session.  If it is omitted
             (i.e., zero), 17 (UDP) is assumed.

        o    "flags"




Braden, Hoffman        Expiration: December 1997                [Page 7]


Internet Draft                  RAPI v.5                       June 1997


             RAPI_GPI_SESSION (0x40) -- If set, this flag requests that
             this API session be defined in the GPI format used by the
             IPSEC extension of RSVP.  If this flag is set, the port
             number included in "Dest" is considered "virtual" (see the
             IPSEC specification for details), and any sender template
             and filter specifications must be in GPI format.

             RAPI_USE_INTSERV (0X10)  -- If set, IntServ formats are
             used in upcalls; otherwise, the Simplified format is used
             (see Section 4 below).

        o    "Event_rtn"

             This parameter is a pointer to an upcall routine that will
             be invoked to notify the application of RSVP errors and
             state change events.  The parameter may be NULL if there is
             no such routine.

        o    "Event_arg"

             This optional parameter points to an argument that will be
             passed in any invocation of the upcall routine.

        o    "errnop"

             The address of an integer into which a RAPI error code will
             be returned.

        An application can have multiple API sessions registered for the
        same or different RSVP sessions at the same time.  There can be
        at most one sender associated with each API session; however, an
        application can announce multiple senders for a given RSVP
        session by announcing each sender in a separate API session.

        Two API sessions for the same RSVP session, if they are
        receiving data, are assumed to have joined the same multicast
        group and will receive the same data packets.  At present, if
        two or more such sessions issue "rapi_reserve" calls, their
        reservation parameters must agree or the results will be
        undefined.   There is no check for such a conflict.
        Furthermore, the code does not disallow multiple API sessions
        for the same sender (defined by the host interface and the local
        UDP port) within the same RSVP session, i.e., for the same data
        flow.  If these API sessions are created by different
        application processes on the local host, the data packets they
        send will be merged but their sender declarations will not be.

   B.   Specify Sender Parameters



Braden, Hoffman        Expiration: December 1997                [Page 8]


Internet Draft                  RAPI v.5                       June 1997


        An application must issue a rapi_sender call if it intends to
        send a flow of data for which receivers may make reservations.
        This call defines, redefines, or deletes the parameters of that
        flow.  A rapi_sender call may be issued more than once for the
        same API session; the most recent one takes precedence.

        If there is a synchronous error, rapi_sender() returns a RAPI
        error code; otherwise, it returns zero.  Once a successful
        rapi_sender call has been made, the application may receive
        upcalls of type RAPI_RESV_EVENT or RAPI_PATH_ERROR.

        int rapi_sender(
               int              Sid,            /* Session ID         */
               int              flags,          /* Flags              */
               struct sockaddr *LHost,          /* Local Host         */
               rapi_filter_t   *SenderTemplate, /* Sender template    */
               rapi_tspec_t    *SenderTspec,    /* Sender Tspec       */
               rapi_adspec_t   *SenderAdspec,   /* Sender Adspec      */
               rapi_policy_t   *SenderPolicy,   /* Sender policy data */
               int              TTL;            /* Multicast data TTL */
             )


        The parameters are as follows.

        o    "Sid"

             This required parameter must be a session ID returned by a
             successful rapi_session call.

        o    "flags"

             No flags are currently defined for this call.

        o    "LHost"

             This optional parameter may point to a sockaddr structure
             specifying the IP source address and the UDP source port
             from which data will be sent, or it may be NULL.

             If the IP source address is INADDR_ANY, the API will use
             the default IP (V4 or V6) address of the local host.  This
             is sufficient unless the host is multihomed.  The port
             number may be zero if the protocol for the session does not
             have ports.

             A NULL "LHost" parameter indicates that the application
             wishes to withdraw its registration as a sender.  In this



Braden, Hoffman        Expiration: December 1997                [Page 9]


Internet Draft                  RAPI v.5                       June 1997


             case, the following parameters will all be ignored.

        o    "SenderTemplate"

             This optional parameter may be a pointer to a RAPI filter
             spec structure (see Section 4) specifying the format of
             data packets to be sent, or it may be NULL.

             If this parameter is omitted (NULL), a sender template will
             be created internally from the "Dest" and "LHost"
             parameters.  If a "SenderTemplate" parameter is present,
             the "LHost" parameter will be ignored.

             This parameter is required in order to declare the sender
             template for a session using IPSEC, i.e., a session created
             with the RAP_GPI_SESSION flag set.

        o    "SenderTspec"

             This required parameter is a pointer to a Tspec that
             defines the traffic that this sender will create.

        o    "SenderAdspec"

             This optional parameter may point to a  RAPI Adspec
             structure (see Section 4), or it may be NULL.

        o    "SenderPolicy"

             This optional parameter may be a pointer to a sender policy
             data structure, or it may be NULL.

        o    "TTL"

             This parameter specifies the IP TTL (Time-to-Live) value
             with which multicast data will be sent.  It allows RSVP to
             send its control messages with the same TTL scope as the
             data packets.













Braden, Hoffman        Expiration: December 1997               [Page 10]


Internet Draft                  RAPI v.5                       June 1997


   C.   Make, Modify, or Delete a Reservation

        The rapi_reserve procedure is called to make, modify, or delete
        a resource reservation for a session.  The call may be repeated
        with different parameters, allowing the application to modify or
        remove the reservation; the latest call will take precedence.
        Depending upon the parameters, each call may or may not result
        in new Admission Control calls, which could fail asynchronously.

        If there is a synchronous error in this call, rapi_reserve()
        returns a RAPI error code; otherwise, it returns zero.  Once
        this call has been successful, the application may receive an
        upcall of type RAPI_RESV_ERROR or RAPI_RESV_CONFIRM.

        An admission control failure (e.g., refusal of the QoS request)
        will be reported asynchronously by an upcall of type
        RAPI_RESV_ERROR.  A " No Path State" error code indicates that
        RSVP state from one or more of the senders specified in
        "filter_list" has not (yet) propagated all the way to the
        receiver; it may also indicate that one or more of the specified
        senders has closed its API and that its RSVP state has been
        deleted from the routers.

        int rapi_reserve(

               int              Sid,           /* Session ID       */
               int              flags,
               struct sockaddr *RHost,         /* Receive host addr*/
               int              StyleId,       /* Style ID         */
               rapi_stylex_t   *Style_Ext,     /* Style extension  */
               rapi_policy_t   *Rcvr_Policy,   /* Receiver policy  */

               int              FilterSpecNo,    /* # of filter specs */
               rapi_filter_t   *FilterSpec_list, /* List of filt specs*/
               int              FlowspecNo,      /* # of flowspecs   */
               rapi_flowspec_t *Flowspec_list    /* List of flowspecs*/
               )


        The parameters are as follows:

        o    "Sid"

             This required parameter must be a session ID returned by a
             successful rapi_session call.

        o    "flags"




Braden, Hoffman        Expiration: December 1997               [Page 11]


Internet Draft                  RAPI v.5                       June 1997


             Setting the RAPI_REQ_CONFIRM flag will request confirmation
             of the reservation, by means of a confirmation upcall (type
             RAPI_RESV_CONFIRM).

        o    "RHost"

             This optional parameter may be used to define the interface
             address on which data will be received.  It is useful for a
             multi-homed host.  If it is omitted or the host address is
             INADDR_ANY, the default interface will be assumed.

        o    "StyleId"

             This required parameter specifies the reservation style id
             (values defined below).

        o    "Style_Ext"

             This optional parameter is a pointer to a style-dependent
             extension to the parameter list, if any.

        o    "Rcvr_Policy"

             This optional parameter is a pointer to a policy data
             structure, or it is NULL.

        o    "FilterSpec_list", "FilterSpecNo"

             The "FilterSpec_list" parameter is a pointer to an area
             containing a sequential vector of RAPI filter spec objects.
             The number of objexts in this vector is specified in
             "FilterSpecNo".  If "FilterSpecNo" is zero, the
             "FilterSpec_list" parameter will be ignored.

        o    "Flowspec_list", "FlowspecNo"

             The "Flowspec_list" parameter is a pointer to an area
             containing a sequential vector of RAPI flow spec objects.
             The number of objects in this vector is specified in
             "FlowspecNo".  If "FlowspecNo" is zero, the "Flowspec_list"
             parameter will be ignored.

        If FlowspecNo is zero, the rapi_reserve call will remove the
        current reservation(s) for the specified session, and
        FilterSpec_list and Flowspec_list will be ignored.  Otherwise,
        the parameters depend upon the style, as follows.

        o    Wildcard Filter (WF)



Braden, Hoffman        Expiration: December 1997               [Page 12]


Internet Draft                  RAPI v.5                       June 1997


             Use "StyleId" = RAPI_RSTYLE_WILDCARD.  The "Flowspec_list"
             parameter may be empty (to delete the reservation) or else
             point to a single flowspec.  The "FilterSpec_list"
             parameter may be empty or it may point to a single filter
             spec containing appropriate wildcard(s).

        o    Fixed Filter (FF)

             Use "StyleId" = RAPI_RSTYLE_FIXED.  "FilterSpecNo" must
             equal "FlowspecNo".  Entries in "Flowspec_list" and
             "FilterSpec_list" parameters will correspond in pairs.

        o    Shared Explicit (SE)

             Use "StyleId" = RAPI_RSTYLE_SE.  The "Flowspec_list"
             parameter should point to a single flowspec.  The "
             FilterSpec_list" parameter may point to a list of any
             length.

































Braden, Hoffman        Expiration: December 1997               [Page 13]


Internet Draft                  RAPI v.5                       June 1997


   D.   Remove a Session

        The rapi_release call removes the reservation, if any, and the
        state corresponding to a given session handle.  This call will
        be made implicitly if the application terminates without closing
        its RSVP sessions.  If the session handle is invalid, the call
        returns a corresponding RAPI error code; otherwise, it returns
        zero.

           int {
7777777777777778        r99a99p99i9999r99e99l99e99a99s99e99}99(9999u99n99s99i99g99n99e99d9999i99n99t9999S99i99d9999)77777777777777778.fi

   E.   Get File Descriptor

        The rapi_getfd call may be used by the application to obtain the
        file descriptor associated with the Unix socket connected to the
        RSVP daemon, after a rapi_session() call has completed
        successfully and before rapi_release() is called.  When a socket
        read event is signaled on this file descriptor, the application
        should call rapi_dispatch(), described below.

           int {777r99a99p99i9999g99e99t7777d} ( unsigned int Sid )

        If Sid is illegal or undefined, this call returns -1; otherwise,
        it returns the file descriptor.

   F.   Dispatch API Event

        The application should call this routine whenever a read event
        is signaled on the file descriptor returned by rapi_getfd().
        Rapi_dispatch() may be called at any time, but it will generally
        have no effect unless there is a pending event associated with
        the Unix pipe.  Calling this routine may result in one or more
        upcalls to the application from any of the open API sessions
        known to this instance of the library.

        int rapi_dispatch( )

        If this call encounters an error, rapi_dispatch() returns a RAPI
        error code; otherwise, it returns zero,

   G.   RAPI Version

        int rapi_version( )

        This call returns a single integer that defines the version of
        the interface.  The returned value is composed of a major number
        and a minor number, encoded as 100*major + minor.  This call may



Braden, Hoffman        Expiration: December 1997               [Page 14]


Internet Draft                  RAPI v.5                       June 1997


        be used by an application to adapt to different versions.

        The API described in this document has major version number 5.

   H.   Upcalls

        An upcall (invoked by a call to rapi_dispatch()) executes the
        procedure whose address was specified by the "Event_rtn" in the
        rapi_register call.

        event_upcall(

             unsigned int   Sid,           /* Session ID  */
             int            EventType,     /* Event type  */

             int            Style,         /* Resv style  */
             int            ErrorCode,     /* (error event): err code */
             int            ErrorValue,    /* (error event): err value*/
             struct sockaddr *ErrorNode,   /* Node that detected error*/
             unsigned char  ErrorFlags,

             int            FilterSpecNo,  /* # of filter specs in list*/
             rapi_filter_t *FilterSpec_list,
             int            FlowspecNo,    /* # of flowspecs in list  */
             rapi_spec_t   *Flowspec_list,
             int            AdspecNo,      /* # of ADSPECs in list    */
             rapi_adspec_t *Adspec_list,
             void          *Event_arg      /* Supplied by application */


        The following parameters are used in the upcall:

        o    "Sid"

             This parameter must be a session ID returned by a
             successful rapi_register call.

        o    "EventType"

             Upcall event types.

        o    "Style"

             This parameter contains the style of the reservation; it is
             non-zero only for a RAPI_RESV_EVENT or RAPI_RESV_ERROR
             upcall.

        o    "ErrorCode, ErrorValue"



Braden, Hoffman        Expiration: December 1997               [Page 15]


Internet Draft                  RAPI v.5                       June 1997


             These values encode the error cause, and they are set only
             for a RAPI_PATH_ERROR or RAPI_RESV_ERROR event.  ErrorCode
             values are defined in "rapi_lib.h" and corresponding text
             strings are defined in "rapi_err.h".

        o    "ErrorNode"

             This is the IP (V4 or V6) address of the node that detected
             the error, and it is set only for a RAPI_PATH_ERROR or
             RAPI_RESV_ERROR event.

        o    "ErrorFlags"

             These error flags are set only for a RAPI_PATH_ERROR or
             RAPI_RESV_ERROR event.

             RAPI_ERRF_InPlace (0x01) -- The reservation failed, but
             another reservation (presumably smaller) reservation is
             still in place on the same interface.

             RAPI_ERRF_NotGuilty (0x02) --  The reservation failed, but
             the request from this client was merged with a larger
             reservation upstream, so this client's reservation might
             not have caused the failure.

        o    "FilterSpec_list", "FilterSpecNo"

             The "FilterSpec_list" parameter is a pointer to a malloc'd
             area containing a sequential vector of RAPI filter spec or
             sender template objects.  The number of objexts in this
             vector is specified in "FilterSpecNo".  If "FilterSpecNo"
             is zero, the "FilterSpec_list" parameter will be NULL.

        o    "Flowspec_list", "FlowspecNo"

             The "Flowspec_list" parameter is a pointer to an area
             containing a sequential vector of RAPI flowspec or Tspec
             objects.  The number of objects in this vector is specified
             in "FlowspecNo".  If "FlowspecNo" is zero, the
             "Flowspec_list" parameter will be NULL.

        o    "Adspec_list", "AdspecNo"

             The "Adspec_list" parameter is a pointer to an area
             containing a sequential vector of RAPI adspec objects.  The
             number of objects in this vector is specified in
             "AdspecNo".  If "AdspecNo" is zero, the "Adspec_list"
             parameter will be NULL.



Braden, Hoffman        Expiration: December 1997               [Page 16]


Internet Draft                  RAPI v.5                       June 1997


        o    "Event_arg"

             This is the value supplied in the rapi_register call.

        When the application's upcall procedure returns, the API will
        free any areas pointed to by "Flowspec_list" or
        "FilterSpec_list"; the application must copy any values it wants
        to save.

        The specific parameters depend upon "EventType", which may have
        one of the following values.

        o    RAPI_PATH_EVENT

             A path event indicates that RSVP sender ("Path") state from
             a remote node has arrived or changed at the local node.  A
             RAPI_PATH_EVENT upcall containing the complete current list
             of senders (or possibly no senders, after a path teardown)
             in the path state for the specified session will be
             triggered whenever the path state changes.

             "FilterSpec_list", "Flowspec_list", and "Adspec_list" will
             be of equal length, and corresponding entries will contain
             sender templates, sender Tspecs, and Adspecs, respectively,
             for all senders known at this node.  In general, a missing
             object will be indicated by an empty RAPI object.

             RAPI_PATH_EVENT upcalls are enabled by the initial
             rapi_session call.

        o    RAPI_RESV_EVENT

             A reservation event upcall indicates that reservation state
             has arrived or changed at the node, implying (but not
             assuring) that reservations have been established or
             deleted along the entire data path to one or more
             receivers.  RAPI_RESV_EVENT upcalls containing the current
             reservation state for the API session will be triggered
             whenever the reservation state changes.

             "Flowspec_list" will either contain one flowspec object or
             be empty (if the state has been torn down), and
             "FilterSpec_list" will contain zero or more corresponding
             filter spec objects. "Adspec_list" will be empty.

             RAPI_RESV_EVENT upcalls are enabled by a rapi_sender call;
             the sender template from the latter call will match the
             filter spec returned in a reservation event upcall.



Braden, Hoffman        Expiration: December 1997               [Page 17]


Internet Draft                  RAPI v.5                       June 1997


        o    RAPI_PATH_ERROR

             A path error upcall indicates that an asynchronous error
             has been found in the sender information specified in a
             rapi_sender call.

             The "ErrorCode" and "ErrorValue" parameters will specify
             the error.  "FilterSpec_list" and "Flowspec_list" will each
             contain one object, the sender template and corresponding
             sender Tspec (if any) in error, while "Adspec_list" will be
             empty.  If there is no sender Tspec, the object in
             "Flowspec_list" will be an empty RAPI object.  The
             "Adspec_list" will be empty.

             Path Error upcalls are enabled by a rapi_sender call, and
             the sender Tspec in that call will match the sender Tspec
             returned in a subsequent path error upcall.

        o    RAPI_RESV_ERROR

             A reservation error upcall indicates that an asynchronous
             reservation error has occurred.

             The "ErrorCode" and "ErrorValue" parameters will specify
             the error.  "Flowspec_list" will contain one flowspec,
             while "FilterSpec_list" may contain zero or more
             corresponding filter specs.  "Adspec_list" will be empty.

        o    RAPI_RESV_CONFIRM

             A confirmation upcall indicates that a reservation has been
             made at least up to an intermediate merge point, and
             probably (but not necessarily) all the way to at least one
             sender.  A confirmation upcall is enabled by a rapi_reserve
             call with the RAPI_REQ_CONFIRM flag set, and at most one
             confirmation upcall will result from each such call.

             The parameters of a confirmation upcall are the same as
             those for a reservation event upcall.

        The accompanying table summarizes the upcalls; here n is a non-
        negative integer.









Braden, Hoffman        Expiration: December 1997               [Page 18]


Internet Draft                  RAPI v.5                       June 1997


        Upcall           Enabled by    FilterSpecNo  FlowspecNo   AdspecNo

        Path event       rapi_session       n             n           n

        Path error       rapi_sender        1             1           0

        Resv event       rapi_sender      1 or 0        1 or 0        0

        Resv error       rapi_reserve       n             1           0

        Confirm          rapi_reserve       1             1           0

                        Table 1: Summary of Upcall Types


3. RAPI FORMATTING ROUTINES

   For convenience of applications, RAPI includes standard routines for
   displaying the contents of a RAPI flowspec object or Tspec object.
   To use these routines, include the file "rapi_lib.h".

   A.   Format a Flowspec

        The rapi_fmt_flowspec() call formats a given RAPI flowspec into
        a buffer of given address and size.  The output is truncated if
        the size is too small.

        void rapi_fmt_flowspec(

             rapi_flowspec_t  *specp,   /* Addr of RAPI flowspec*/
             char             *buffer,  /* Addr of buffer       */
             int               length   /* Length of buffer     */
             )


   B.   Format a Tspec

        The rapi_fmt_tspec() call formats a given RAPI Tspec into a
        buffer of given address and size.  The output is truncated if
        the size is too small.

        void rapi_fmt_tspec(

             rapi_tspec_t    *tspecp,  /* Addr of RAPI Tspec  */
             char            *buffer,  /* Addr of buffer      */
             int              length   /* Length of buffer    */
             )




Braden, Hoffman        Expiration: December 1997               [Page 19]


Internet Draft                  RAPI v.5                       June 1997


   C.   Format an Adspec

        The rapi_fmt_adspec() call formats a given RAPI Adspec into a
        buffer of given address and size.  The output is truncated if
        the size is too small.

        void rapi_fmt_adspec(

             rapi_adspec_t    *adspecp,  /* Addr of RAPI Adspec */
             char             *buffer,   /* Addr of buffer      */
             int               length    /* Length of buffer    */
             )


   D.   Format a Filter Spec

        The rapi_fmt_filtspec() call formats a given RAPI Filter Spec
        into a buffer of given address and size.  The output is
        truncated if the size is too small.

        void rapi_fmt_filtspec(

             rapi_filter_t    *filtp,    /* Addr of RAPI Filt Spec*/
             char             *buffer,   /* Addr of buffer        */
             int               length    /* Length of buffer      */
             )

























Braden, Hoffman        Expiration: December 1997               [Page 20]


Internet Draft                  RAPI v.5                       June 1997


4. RAPI OBJECTS

   Flowspecs, filter specs, sender templates, and sender Tspecs are
   encoded as variable-length RAPI objects.

   Every RAPI object begins with a header consisting of two words, the
   total length of the object in bytes and the type, respectively.  An
   empty object consists only of a header, with type zero and length 8
   bytes.

   Integrated services data structures are defined in: draft-ietf-
   intserv-rsvp-01.txt.

   o    Flowspecs

        There are two formats for RAPI flowspecs.  For more details, see
        "rapi_lib.h" and "rsvp_intserv.h".

        -    RAPI_FLOWSTYPE_Simplified

             This is a "simplified" format.  It consists of a simple
             list of parameters needed for either Guaranteed or
             Controlled Load service, using the service type
             QOS_GUARANTEED or QOS_CNTR_LOAD, respectively.  The RAPI
             client library routines will map this format to/from an
             appropriate Integrated Services data structure.

        -    RAPI_FLOWSTYPE_Intserv

             This flowspec must be a fully formatted Integrated Services
             flowspec data structure.

   o    Sender Tspecs

        There are two formats for RAPI Sender Tspecs.  For more details,
        see "rapi_lib.h" and "rsvp_intserv.h".

        -    RAPI_TSPECTYPE_Simplified

             This is a "simplified" format, consisting of a simple list
             of parameters with the service type QOS_TSPEC.  The RAPI
             client library routines will map this format to/from an
             appropriate Integrated Services data structure.

        -    RAPI_TSPECTYPE_Intserv

             This flowspec must be a fully formatted Integrated Services
             Tspec data structure.



Braden, Hoffman        Expiration: December 1997               [Page 21]


Internet Draft                  RAPI v.5                       June 1997


   o    Adspecs

        There are two formats for RAPI Adspecs.  For more details, see
        "rapi_lib.h" and "rsvp_intserv.h".

        -    RAPI_ADSTYPE_Simplified

             This is a "simplified" format, consisting of a list of
             Adspec parameters for all possible services.  The RAPI
             client library routines will map this format to/from an
             appropriate Integrated Services data structure.

        -    RAPI_ADSTYPE_Intserv

             This flowspec must be a fully formatted Integrated Services
             Tspec data structure.

        In an upcall, a flowspec, sender Tspec, or Adspec is by default
        delivered in simplified format; however, if the RAPI_USE_INTSERV
        flag is set in the rapi_session call, then the IntServ format is
        used in upcalls.

   o    Filter Specs and Sender Templates

        There are two formats for these objects.

        -    RAPI_FILTERFORM_BASE (RAPI_FILTERFORM_BASE6)

             This object consists of only a socket address structure,
             defining the IP (V4 or V6) address and port.

        -    RAPI_FILTERFORM_GPI (RAPI_FILTERFORM_GPI6)

             This object consists of only an address structure, defining
             the IP (V4 or V6) address and a 32-bit Generalized Port
             Identifier.  It is recommended for all IPSEC applications.
             Other non-TCP/non-UDP transports may also utilize this
             format in the future.

   o    Policy Data Objects

        (Not yet supported)









Braden, Hoffman        Expiration: December 1997               [Page 22]


Internet Draft                  RAPI v.5                       June 1997


APPENDIX A. Implementation

   This section contains some general remarks on the implementation of
   this API that is distributed with the ISI release of RSVP code.

   A.1 Protocols

      There are three protocol interfaces involved in invoking RSVP via
      the API.

      1.   Procedure Call Interface to Application

           The term "RAPI" (RSVP API) is used for the procedure call
           interface to applications, and for the data structures
           ("objects") used in that interface.  This document is
           primarily concerned with the RAPI interface.  This interface
           is realized by procedures included in the library routine
           librsvp.a, which is compiled from rapi_lib.c and rapi_fmt.c.

      2.   Application - Daemon Protocol

           The term "API" is used in the code for the local protocol
           across the Unix socket between the librsvp.a routines and the
           RSVP daemon rsvpd.  This protocol generally use RSVP object
           bodies but RAPI object framing.

      3.   RSVP Protocol

           The RSVP protocol is used in the Internet between RSVP daemon
           programs.

      The code is organized to make these three interfaces logically
      independent, so they can be changed independently.  Each of these
      three protocol interfaces has an independent version number,
      defined in rapi_lib.h, rsvp_api.h, and rsvp.h for RAPI, API, and
      RSVP, respectively.

      The RAPI call library librsvp.a includes routines that convert
      objects between RAPI and API formats.  Similarly, the file
      rsvp_api.c included in the RSVP daemon includes routines that
      convert between the API representation and the RSVP
      representation.  In some cases, these conversion procedures are
      identity transformations (i.e., pure copies); however, they
      provide the structure to allow any of the three interfaces to be
      changed in the future.

      There are two different object framing conventions.  RAPI and API
      objects have a two-word header -- a total length in bytes and a



Braden, Hoffman        Expiration: December 1997               [Page 23]


Internet Draft                  RAPI v.5                       June 1997


      format code -- and a body.  RSVP objects have a one-word header.
      In general, objects in the API interface (i.e., across the Unix
      socket) carry the two-word RAPI object header, but their body is
      that of the corresponding RSVP object.  Therefore, the API<->RSVP
      conversion in rsvp_api.c simply maps the framing convention.

      In the RAPI interface, the application is given some choice of
      data formats.  For example, QoS control objects (i.e., flowspecs,
      Tspecs, and Adspecs) can be represented in either the RSVP (really
      Int-Serv) format, which has complex packing, or in the more
      convenient Simplified format.  The RAPI library routines map
      between Simplified format and Int-Serv format, which is used
      across the API.

   A.2 RAPI Sessions

      Each instance of the RAPI library routines keeps a local (to the
      application process) table of open RAPI sessions; the index into
      this table is the session handle (a_sid) used locally.   The RSVP
      daemon keeps its own table of RAPI sessions.  From the daemon's
      viewpoint, a RAPI session is defined by the triple: (fd, pid,
      a_sid), where fd is the file descriptor for the Unix socket, pid
      is the Unix process id, and a_sid is an application session id
      received over fd from pid.

APPENDIX B. Implementation Restrictions

   This Appendix summarizes the features of the interface that have not
   been implemented in the latest (4.1a6) release of the ISI reference
   implementation of RSVP.

   o    The RAPI_FILTERFORM_GPI and RAPI_FILTERFORM_GPI objects and the
        session flag RAPI_GPI_SESSION are implemented in RAPI and the
        API, but the IPSEC extensions are not yet fully implemented in
        RSVP.

   o    The "SenderAdspec", and "SenderPolicy" parameters in a
        rapi_sender call are not implemented.

   o    The "Style_Ext" and "Rcvr_Policy" parameters in a rapi_reserve
        call are not implemented.










Braden, Hoffman        Expiration: December 1997               [Page 24]


Internet Draft                  RAPI v.5                       June 1997


APPENDIX C. CHANGES

   This document describes major version 5 of RAPI.  This version has
   the following differences from previous versions:

   o    The "Legacy" format has been removed.

   o    The rapi_fmt_filtspec() routine has been added.

   o    The two session flags RAPI_GPI_SESSION and RAPI_USE_INTSERV have
        been defined.

   o    The ErrorNode parameter in an upcall has been changed from a
        sockaddr to a pointer to a sockaddr structure, to accommodate
        IPv6.

   o    IPv4-specific Socket structures sockaddr_in have been changed to
        the more general form sockaddr, to accomodate IPv6.  The calling
        application should supply the appropriate form, sockaddr_in or
        sockaddr_in6, and cast it into a sockaddr for the call.































Braden, Hoffman        Expiration: December 1997               [Page 25]