HTTP/1.1 200 OK Date: Tue, 09 Apr 2002 09:52:59 GMT Server: Apache/1.3.20 (Unix) Last-Modified: Fri, 14 Aug 1998 13:07:00 GMT ETag: "361968-616d-35d43674" Accept-Ranges: bytes Content-Length: 24941 Connection: close Content-Type: text/plain INTERNET-DRAFT Bob Lindell Expiration: February 1999 ISI File: draft-lindell-rsvp-scrapi-00.txt SCRAPI - A Simple "Bare Bones" API for RSVP Version 1 August 7, 1998 Status of this 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 view the entire list of current Internet-Drafts, please check the "1id-abstracts.txt" listing contained in the Internet-Drafts Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net (Northern Europe), ftp.nis.garr.it (Southern Europe), munnari.oz.au (Pacific Rim), ftp.ietf.org (US East Coast), or ftp.isi.edu (US West Coast). Abstract This document describes SCRAPI, a simple 'bare bones' API for RSVP. The goal of this API is to produce an interface which simplifies the augmentation of applications with RSVP support. Lindell Expiration: February 1999 [Page 1] INTERNET-DRAFT SCRAPI v.1 July 1998 1. Introduction This document describes SCRAPI, a simple "Bare Bones" API for RSVP [1]. The goal of this API is produce an interface which simplifies the augmentation of applications with RSVP support. The main features of SCRAPI are: o Allow the addition of RSVP support to applications by adding a few lines of code. o Provide a portable interface which can be used with any vendor's RAPI implementation. o Avoid the introduction of RSVP specific data types and definitions. o Support IPv4 and IPv6 in a transparent manner. SCRAPI is layered on top of RAPI [2], an existing RSVP API, to provide portability across vendor implementations. Currently, SCRAPI has been tested only with the ISI implementation of RAPI. There are three main routines included in this API, one which is used by the sender side, one to be used at the receiving end, and a routine to finalize the entire API at the end of execution. This simple API should be easy to insert into networking applications which require RSVP support. The remaining routines in the API are utility functions to ease the development of an interface which supports IPv4 and IPv6. The objective is to provide enough functionality so that applications would not need to code explicitly for either IPv4 or IPv6, or use messy compilation conditionals to develop an interface to support both address families. As an example, a single data type for addresses is provided that is large enough to hold addresses from either address family. In addition, parsing an address string or performing a host name resolution for both address families is provided. To provide simplicity, event upcalls to the application do not exist in SCRAPI. For this reason, it would be difficult to use SCRAPI for applications which negotiate QoS with the network. Applications requiring this type of functionality should use the standard RAPI Lindell Expiration: February 1999 [Page 2] INTERNET-DRAFT SCRAPI v.1 July 1998 interface. 2. Functional Description Applications which use SCRAPI get a simplied service model. The average bandwidth specified by the sender is currently translated into the integrated services controlled load [4] or guaranteed service [3] with the given average bandwidth. The peak bandwidth and token bucket depth are set to twice the average bandwidth. Minimum policed unit and maximum packet size are set to 64 bytes and the largest MTU of all IP interfaces on the host. Sender and receiver side API calls can block, if requested, until a reservation request has completed. The notion of completion can be difficult to define for multicast flows. We will define completion in the content of SCRAPI calls to refer to either partial or full completion of the reservation request. A sender sources PATH messages using the Tspec described above. If blocking is requested with a non-zero timeout value, the sender blocks until the receipt of a single RESV event from any sender. If the specified flow is unicast, the call blocks until the reservation has completed. If the flow is multicast, then at least one receiver has a reservation in place when the call unblocks. A receiver waits for a PATH event from the sender, and if requested, makes a reservation in response using the sender's Tspec and Adspec for guaranteed service. For guaranteed service, the slack term is set to zero. If blocking is requested, the receiver blocks until the receipt of a CONFIRM event. For a multicast flow, a CONFIRM event can be a unreliable indication that a reservation has been successful. If any RSVP errors occur during a blocking sender or receiver API call, the call will unblock and return an error code. A state diagram of the SCRAPI reservation API, for a given data flow, is shown in Figure 1. A data flow, or RSVP session, is defined as a unique destination address, port and protocol number. SCRAPI provides a simple error status reporting on a per flow basis. Status can be in a "red", "yellow", or "green" state. The red state indicates that either the flow does not exist or is currently in an error state. Yellow state indicates that the reservation requests are pending, whereas green indicates that at least one request has completed. Lindell Expiration: February 1999 [Page 3] INTERNET-DRAFT SCRAPI v.1 July 1998 In the next section, the SCRAPI application programming interface is defined. In subsequent sections, usage examples are offered as templates for programmers who are attempting to embed SCRAPI calls into existing applications. +---------+ +----------| Closed |----------+ scrapi_sender +---------+ scrapi_receiver | | scrapi_sender | | scrapi_receiver +----+ | | +----+ | V V V V | | +---------+ +---------+ | +---| | | |---+ | Send | | Rcv | +-------| |<-----+ +----->| |-------+ | +---------+ | | +---------+ | | | | | | | | |scrapi_receiver(0) | | | | | | | | | | | | scrapi_sender(0)| | | | | | | | | scrapi_receiver | | scrapi_sender | | | +---------+ | | | +--------->| |<---------+ | | | SendRcv | | | scrapi_sender or +---| | | | scrapi_receiver | +---------+ | | | ^ | | | +----+ | | | | | scrapi_release scrapi_release scrapi_release scrapi_sender(0) | scrapi_receiver(0) | V | | +--------+ | +----------------------->| Closed |<----------------------+ +--------+ Figure 1: SCRAPI API State Diagram 3. Application Programming Interface Definition Lindell Expiration: February 1999 [Page 4] INTERNET-DRAFT SCRAPI v.1 July 1998 3.1. Reservation API Description Function Name: scrapi_sender Syntax: int scrapi_sender( const struct sockaddr *destination, int protocol, const struct sockaddr *source, scrapi_service service, double bw, int ttl, unsigned long msecs ); Description: SCRAPI call for a data sender. The destination address and protocol number of the data flow are supplied as the first two arguments. The source address of the data flow can be specified, or set to NULL to choose the system default. The service parameter specifies the service, currently either Controlled Load or Guaranteed. The bw parameter is the average bandwidth of the flow in bytes/sec. The ttl of the packets can be specified or set to 0 to choose the system default. If msecs is greater than 0, the call to scrapi_sender blocks msecs milliseconds to receive a reservation event from at least one recipient. The call will also unblock prematurely if any errors are detected during this period. This function can be called repeatedly by an application to modify any parameters associated with this data flow (same destination and protocol values). A value of 0 for the bw parameter unregisters the data flow. Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations set scrapi_errno to an appropriate error code. Also See: scrapi_errno, scrapi_get_status Lindell Expiration: February 1999 [Page 5] INTERNET-DRAFT SCRAPI v.1 July 1998 Function Name: scrapi_receiver Syntax: int scrapi_receiver( const struct sockaddr *destination, int protocol, const struct sockaddr *source, int reserve, scrapi_style style, unsigned long msecs ); Description: SCRAPI call for a data receiver. The destination address and protocol number of the data flow are supplied as the first two arguments. The source address of the data flow can be specified or can be set to NULL to choose any source. In addition, the source address can be specified with a port number of 0 to match a source address regardless of port number. The reserve parameter should be set to TRUE or FALSE to turn on and off a reservation for that data flow respectively. The style parameter specifies whether the reservation is shared among multiple senders. If msecs is greater than 0, the call to scrapi_receiver blocks msecs milliseconds to receive a reservation confirmation event. The call will also unblock prematurely if any errors are detected during this period. This function can be called repeatedly by an application to modify any parameters associated with this data flow (same destination and protocol values). Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations set scrapi_errno to an appropriate error code. Also See: scrapi_errno, scrapi_get_status Lindell Expiration: February 1999 [Page 6] INTERNET-DRAFT SCRAPI v.1 July 1998 Function Name: scrapi_close Syntax: int scrapi_close( const struct sockaddr *destination, int protocol ); Description: SCRAPI call to close either a sender or receiver flow. If the destination address is set to NULL, all flows will be closed and the protocol parameter value will be ignored. Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations set scrapi_errno to an appropriate error code. Enum Name: scrapi_service 1. scrapi_service_cl 2. scrapi_service_gs Description: Enumerated types for specificing the desired service. Currently, Integrated Services Controlled Load and Guaranteed are supported. Enum Name: scrapi_style 1. scrapi_style_shared 2. scrapi_style_distinct Description: Enumerated types for specificing the reservation style. Currently, shared (wildcard) and distinct styles are supported. Lindell Expiration: February 1999 [Page 7] INTERNET-DRAFT SCRAPI v.1 July 1998 Enum Name: scrapi_status 1. scrapi_status_red 2. scrapi_status_yellow 3. scrapi_status_green Description: Enumerated types for status condition of a flow. The meaning of these values is described in the scrapi_status() function description. 3.2. Asynchronous Event Loop API Description Function Name: scrapi_getfd Syntax: int scrapi_getfd( const struct sockaddr *destination, int protocol ); Description: SCRAPI call to get the API file descriptor to use in a subsequent select() call. Return Values: A file descriptor value if successful, -1 otherwise. Function Name: scrapi_dispatch Syntax: int scrapi_dispatch(); Description: SCRAPI call to poll the API for new events. Return Values: TRUE if successful, FALSE if RSVP support is no longer available. 3.3. Error Handling API Description Lindell Expiration: February 1999 [Page 8] INTERNET-DRAFT SCRAPI v.1 July 1998 Function Name: scrapi_get_status Syntax: scrapi_status scrapi_get_status( const struct sockaddr *destination, int protocol ); Description: SCRAPI call to get the status of a flow. If the status is red, either the flow was never defined or the flow is currently in an error state. A yellow status indicates that the flow is valid but no reservation operation(s) at the sender or receiver end has completed successfully. Once a single operation on either the sender or receiver end has completed successfully, the flow has a green status. Return Values: scrapi_stat_red, scrapi_stat_yellow, or scrapi_stat_green. Variable Name: scrapi_errno Syntax: extern int scrapi_errno; Description: Set to the return value of the last RAPI call made within the SCRAPI library. Also See: scrapi_errlist Function Name: scrapi_perror Syntax: void scrapi_perror( const char *string ); Description: SCRAPI call to print an error message analogous to the perror() library call. Lindell Expiration: February 1999 [Page 9] INTERNET-DRAFT SCRAPI v.1 July 1998 Function Name: scrapi_errlist Syntax: const char * scrapi_errlist( int errno ); Description: SCRAPI call to get an error message string for a given errno. Return Values: An error message string. Function Name: scrapi_stderr Syntax: void scrapi_stderr( FILE *file ); Description: Set the file pointer to be used by the SCRAPI library for standard error. If it is set to NULL, no messages are printed. The default value is stderr. Function Name: scrapi_debug Syntax: void scrapi_debug( FILE *file ); Description: Set the file pointer to be used by the SCRAPI library for debugging information. If it is set to NULL, no messages are printed. Debug messages include the logging of all asynchronous RSVP events. The default value is NULL. 3.4. Address Manipulation API Description Lindell Expiration: February 1999 [Page 10] INTERNET-DRAFT SCRAPI v.1 July 1998 Macro Name: SOCKADDR Description: A struct sockaddr data type that is large enough for both IPv4 and IPv6 addresses. Function Name: scrapi_sockaddr_multicast Syntax: int scrapi_sockaddr_multicast( const struct sockaddr *address ); Description: Determine if an address is multicast or unicast. Return Values: TRUE if multicast, FALSE otherwise. Function Name: scrapi_sockaddr_parse Syntax: int scrapi_sockaddr_parse( struct sockaddr *address const char *name, unsigned short port ); Description: Perform a host name lookup or parse an address and initialize a struct sockaddr structure. Return Values: TRUE if parsed, FALSE otherwise. Function Name: scrapi_sockaddr_print Syntax: const char * scrapi_sockaddr_print( const struct sockaddr *address ); Description: Pretty print an address. Return Values: A valid string if printable, NULL otherwise. Lindell Expiration: February 1999 [Page 11] INTERNET-DRAFT SCRAPI v.1 July 1998 Function Name: scrapi_sockaddr_get_port Syntax: unsigned short scrapi_sockaddr_get_port( const struct sockaddr *address ); Description: Get the port number. Return Values: The port number if successful, 0 otherwise. Function Name: scrapi_sockaddr_set_port Syntax: int scrapi_sockaddr_set_port( struct sockaddr *address, unsigned short port ); Description: Set the port number. Return Values: TRUE if successful, FALSE otherwise. Function Name: scrapi_sockaddr_any Syntax: int scrapi_sockaddr_any( struct sockaddr *address, int family ); Description: Initialize a struct sockaddr to the wildcard address and port number for the given address family. Return Values: TRUE if successful, FALSE otherwise. 4. Application Code Templates This section provides examples, presented as code templates, to aid programmers in augmenting networking applications with SCRAPI calls. Lindell Expiration: February 1999 [Page 12] INTERNET-DRAFT SCRAPI v.1 July 1998 One example contains two simplex applications which attempt to wait for a reservation to be put in place before sending data on the network. The other example is a full duplex multimedia type application which sends and receives data without waiting for completion of the reservation. 4.1. Unicast Performance Measurement Application The following example was derived from a network performance tool. It attempts to put in place a unicast reservation before measuring network performance. Waiting is accomplished using the timeout option in the sender and receiver calls. 4.1.1. Sender Application This sender application opens a TCP connection to the "receive-hostname" on port 1111 and attempts to reserve 1000 bytes/sec of average bandwidth. After waiting at most 10 seconds for a reservation to be put in place, this application streams data to the receiver to measure network performance and then closes the connection. Lindell Expiration: February 1999 [Page 13] INTERNET-DRAFT SCRAPI v.1 July 1998 #include void main(int argc, char *argv[]) { int timeout = 10000; /* wait for at most 10 seconds */ double bw = 1000; /* Average bandwidth 1Kbytes/sec */ struct SOCKADDR destination; char *hostname = "receive-hostname"; unsigned short port = 1111; /* translate host name or address */ if (!scrapi_sockaddr_parse((struct sockaddr *) &destination, hostname,htons(port))) { fprintf(stderr,"Could not parse host address"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_sender((struct sockaddr *) &destination,IPPROTO_TCP, NULL,scrapi_service_cl,bw,0,timeout)) scrapi_perror("RSVP unable to reserve bandwidth"); /* run test */ scrapi_close(NULL,0); } 4.1.2. Receiver Application This receiver application accepts a TCP connection and attempts to make a reservation. After waiting at most 10 seconds for a reservation to be put in place, this application consumes data from the sender to measure network performance and then closes the connection. Lindell Expiration: February 1999 [Page 14] INTERNET-DRAFT SCRAPI v.1 July 1998 #include #include void main(int argc, char *argv[]) { int fd,len,timeout = 10000; /* wait for at most 10 seconds */ struct SOCKADDR destination; /* open, bind, and listen for connection */ /* fd = accept(...); */ len = sizeof(destination); if (getsockname(fd,(struct sockaddr *) &destination,&len) == -1) { perror("getsockname"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_receiver((struct sockaddr *) &destination,IPPROTO_TCP, NULL,1,scrapi_style_distinct,timeout)) scrapi_perror("RSVP unable to reserve bandwidth"); /* run test */ scrapi_close(NULL,0); } 4.2. Multicast Multimedia Application This example highlights the inclusion of the SCRAPI API into a Tcl/Tk event loop of a multimedia application. This is a full duplex application that is sending and receiving data on the same address. This application does not wait for completion status from the reservation calls. Lindell Expiration: February 1999 [Page 15] INTERNET-DRAFT SCRAPI v.1 July 1998 #include #include #include void callback(ClientData data, int mask) { if (!scrapi_dispatch()) Tk_DeleteFileHandler(data); } void main(int argc, char *argv[]) { int fd; struct SOCKADDR destination; double bw = 1000; /* Average bandwidth 1Kbytes/sec */ char *hostname = "receive-hostname"; unsigned short port = 1111; /* translate host name or address */ if (!scrapi_sockaddr_parse((struct sockaddr *) &destination, hostname,htons(port))) { fprintf(stderr,"Could not parse host address"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_sender((struct sockaddr *) &destination,IPPROTO_UDP, NULL,scrapi_service_cl,bw,0,0)) scrapi_perror("RSVP unable to reserve bandwidth"); if (!scrapi_receiver((struct sockaddr *) &destination,IPPROTO_UDP, NULL,1,scrapi_style_distinct,0)) scrapi_perror("RSVP unable to reserve bandwidth"); fd = scrapi_getfd((struct sockaddr *) &destination,IPPROTO_UDP); Tk_CreateFileHandler((ClientData) fd,TK_READABLE,callback, (ClientData) fd); /* send data */ scrapi_close(NULL,0); } 5. Conclusion Lindell Expiration: February 1999 [Page 16] INTERNET-DRAFT SCRAPI v.1 July 1998 The SCRAPI interface provides a simple method to add RSVP support to many network applications. It supports both IPv4 and IPv6 and attempts to simplify user developed code to support both address families. Coding examples are provided to give additional guidance on the usage of this API. 6. Security Considerations Security considerations are not discussed in this memo. 7. Acknowledgements The author would like to thank Steve Berson for helping to define this API. 8. References [1] Braden, R., Ed., et. al., Resource Reservation Protocol (RSVP) - Version 1 Functional Specification, RFC 2205, September 1997. [2] Braden, R., Hoffman, D., RAPI -- An RSVP Application Programming Interface Version 5, Work In Progress, November 1997. [3] Shenker, S., Partridge, C., Guerin, R., Specification of Guaranteed Quality of Service, RFC 2212, September 1997. [4] Wroclawski, J., Specification of the Controlled Load Quality of Service, RFC 2211, September 1997. 9. Author's Address Bob Lindell USC Information Sciences Institute 4676 Admiralty Way Marina del Rey, CA 90292 Lindell Expiration: February 1999 [Page 17] INTERNET-DRAFT SCRAPI v.1 July 1998 Table of Contents 1. Introduction ................................................... 2 2. Functional Description ......................................... 3 3. Application Programming Interface Definition ................... 4 3.1. Reservation API Description .................................. 5 3.2. Asynchronous Event Loop API Description ...................... 8 3.3. Error Handling API Description ............................... 8 3.4. Address Manipulation API Description ......................... 10 4. Application Code Templates ..................................... 12 4.1. Unicast Performance Measurement Application .................. 13 4.1.1. Sender Application ......................................... 13 4.1.2. Receiver Application ....................................... 14 4.2. Multicast Multimedia Application ............................. 15 5. Conclusion ..................................................... 16 6. Security Considerations ........................................ 17 7. Acknowledgements ............................................... 17 8. References ..................................................... 17 9. Author's Address ............................................... 17 Lindell Expiration: February 1999 [Page 18]