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]