INTERNET-DRAFT Bob Lindell Expiration: May 1999 ISI File: draft-lindell-rsvp-scrapi-01.txt SCRAPI - A Simple "Bare Bones" API for RSVP Version 2 November 17, 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: May 1999 [Page 1] INTERNET-DRAFT SCRAPI v.2 November 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. To provide simplicity, event upcalls to the application do not exist in SCRAPI. Because of the design choice, it may be difficult to use SCRAPI for applications which negotiate QoS with the network. Applications requiring this type of functionality should use the standard RAPI interface. There are three main functions included in this API, one which is used by the sender side, one to be used at the receiving end, and a function 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. Error reporting is handled in two distinct forms. The first is an aggregated error model that is unique to SCRAPI. SCRAPI includes a tri-valued error model with error states of "red", "yellow", or "green". This model gives feedback to an application on the status of reservations at an given time. The exact description of each error state will be described below. Second, it is possible to get an error number and corresponding error description after executing a SCRAPI sender, receiver, or close function. This is similar to the errno Lindell Expiration: May 1999 [Page 2] INTERNET-DRAFT SCRAPI v.2 November 1998 support in Unix. These error codes are of limited use, since they only provide feedback on an immediate failure of a request. This is most likely due to invalid arguments or some general system error. A timeout errno is returned if a timer expires on the sender or receiver calls. A timeout error does not abort the request, it is merely an indication that the timer has expired. Applications can abort a request following a timeout by closing the flow. There is support for applications which have polling based event loops using a system call such as select. Analogous functions to the RAPI interface for supporting this functionality is provided in SCRAPI. The remaining functions in the API are utility functions to ease the development of an interface which supports IPv4 and IPv6. These are documented in Appendix 1. These functions are not viewed as part of the SCRAPI API, but rather a collection of useful address manipulation functions which should be provided in system libraries. In the future, these functions will be removed in favor of system supplied functionality. The objective of these extensions was 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. 2. Functional Description The basic abstraction for the SCRAPI API is a flow. A flow is defined in terms of three parameters: the destination address, a protocol number, and the source address. This triple is used for the sender, receiver, status, and close operations in SCRAPI. 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 Lindell Expiration: May 1999 [Page 3] INTERNET-DRAFT SCRAPI v.2 November 1998 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. If any RSVP errors occur during a blocking sender or receiver API call, the call will unblock. Internal to SCRAPI, there is support for both IPv6 Flow Labels and the Generalized Port Identifier (GPI) [5]. These are not visible at the API. It is assumed that applications would continue to use port numbers to specify flows and that SCRAPI internally would convert these port numbers to either a Flow Label or a GPI value using system supplied functionality. A state diagram of the SCRAPI reservation API, for a given data flow, is shown in Figure 1. A sender call subscripted with zero designates a sender call with the bandwidth set to zero. Similarly, a receiver call subscripted with zero designates a receiver call with the reservation flag set to FALSE. Lindell Expiration: May 1999 [Page 4] INTERNET-DRAFT SCRAPI v.2 November 1998 +---------+ +----------| 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_close or scrapi_close scrapi_close or scrapi_sender(0) | scrapi_receiver(0) | V | | +---------+ | +---------------------->| Closed |<----------------------+ +---------+ Figure 1: SCRAPI API State Diagram 3. The Simplified Error Model of SCRAPI 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: May 1999 [Page 5] INTERNET-DRAFT SCRAPI v.2 November 1998 A state diagram of the SCRAPI error model, for a given data flow, is shown in Figure 2. A close operation takes the model from any state back to the red state. This was intentionally omitted to increase the clarity of the diagram. RSVP error reporting to an application is inherently ambiguous. Once an error message has been received, it is not always possible to determine when an error condition has cleared. With global knowledge, a solution would be to wait until enough time has expired relative to the refresh rates, and link reliability assumptions along a path, to assume that the lack of any subsequent error message is an indication that an error has cleared. Unfortunately, this information about refresh rates at any given point in the path is unknown to applications. The solution in SCRAPI is an attempt to match error messages with the receipt of other messages that could be used to indicate the clearing of a given error. For example, a CONFIRM message received subsequent to a RESV ERROR message might indicate that the error condition has cleared. A side effect of the solution is that error message refreshing will cause oscillatory behavior of the error model. Also, the error model may get stuck in a error state unless a complementary message is received to clear the error. Multicast only makes the problem worse. An application could be receiving refreshes of a PATH ERROR message from one branch of the multicast tree and RESV messages from another branch. Should the error state of this model be red or green? If we choose green, which is not entirely correct, it will oscillate into the red state when refreshes of the PATH ERROR are received. RSVP CONFIRM messages are not delivered reliably. SCRAPI should probably include a reliability model for confirmations so that the error model does not get stuck in a non-green state due to the loss of a CONFIRM message. In addition, for a multicast flow, a CONFIRM message can be a unreliable indication that a reservation has been successful. Lindell Expiration: May 1999 [Page 6] INTERNET-DRAFT SCRAPI v.2 November 1998 +---------+ +----------| Red |----------+ scrapi_sender +---------+ scrapi_receiver | | V V +---------+ +---------+ +-------| Yellow |<-----+ +----->| Yellow |-------+ | +---------+ | | +---------+ | | | | | | | | |scrapi_receiver(0) | | | | | | | | | | | | scrapi_sender(0)| | | | | | | | | scrapi_receiver | | scrapi_sender | | | +---------+ | | | +--------->| Yellow |<---------+ | | +---------+ | | | | RESV RESV or CONFIRM | CONFIRM | | | | | V | | +---------+ | +---------------------->| Green |<----------------------+ +--------->| |<---------+ | +---------+ | | | | | | PATH RESV | | ERROR ERROR | RESV | | CONFIRM | V V | | +---------+ +---------+ | +---| Red | | Red |---+ +---------+ +---------+ Figure 2: SCRAPI Error Model State Diagram 4. A Comparison to RAPI In this section, a brief comparison of SCRAPI and RAPI are provided in outline form. Lindell Expiration: May 1999 [Page 7] INTERNET-DRAFT SCRAPI v.2 November 1998 o SCRAPI is entirely flow based, there is no concept of a session. Calls to RAPI session operations are internally hidden by the sender, receiver, and close operations. o The SCRAPI sender command is simplified by not requiring sender templates or flow specifications. These are constructed internally based on a single bandwidth parameter provided. A RAPI based application has more control over specifying the contents of sender templates and flow specifications. o The SCRAPI receiver command is simplified by not requiring filter or flow specifications. These are constructed internally based on the sender templates and flow specifications received in a PATH message. In addition, the receiver command may be called prior to the receipt of any PATH messages without causing an error. A RAPI based application has more control over specifying the contents of filter and flow specifications, including making a reservation for an amount different than the senders flow specification. o A default SCRAPI callback function is defined to process RSVP messages. It supports automatic responses to PATH messages given prior information from a receiver call. It also maintains state for the simplified SCRAPI error model described in the previous section. A RAPI based application can define an arbitrary callback function which might implement a complex error model and contain functionality to perform QoS negotiation. 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. 5. Application Programming Interface Definition The section describes the functions of the SCRAPI API. It includes the error reporting capabilities and the asynchronous event support. Lindell Expiration: May 1999 [Page 8] INTERNET-DRAFT SCRAPI v.2 November 1998 5.1. Reservation API Description Function Name: scrapi_sender Syntax: int scrapi_sender( const struct sockaddr *destination, int protocol, const struct sockaddr *source, double bw, int ttl, unsigned long msecs ); Description: SCRAPI call for a data sender. The destination address, protocol number, and the source address of the data flow are supplied as the first three arguments. The source address may be wild, but a non-wild port must be provided. 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 address, protocol number, and source address). A value of 0 for the bw parameter unregisters a sender for this data flow. Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations will set an appropriate error code. Also See: scrapi_errno, scrapi_get_status Lindell Expiration: May 1999 [Page 9] INTERNET-DRAFT SCRAPI v.2 November 1998 Function Name: scrapi_receiver Syntax: int scrapi_receiver( const struct sockaddr *destination, int protocol, const struct sockaddr *source, int reserve, scrapi_service service, scrapi_style style, unsigned long msecs ); Description: SCRAPI call for a data receiver. The destination address, protocol number, and the source address of the data flow are supplied as the first three arguments. The source address can be set to NULL to choose any source. In addition, the source address can be specified with a wild port number of 0 to match a source address regardless of port number. Wild port number requests take precedence over any source requests. The reserve parameter should be set to TRUE or FALSE to turn on and off a reservation for that data flow respectively. The service parameter specifies the service, currently either Controlled Load or Guaranteed. 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 including removing a reservation request. Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations will set an appropriate error code. Also See: scrapi_errno, scrapi_get_status Lindell Expiration: May 1999 [Page 10] INTERNET-DRAFT SCRAPI v.2 November 1998 Function Name: scrapi_close Syntax: int scrapi_close( const struct sockaddr *destination, int protocol, const struct sockaddr *source ); Description: SCRAPI call to close a flow for sending and receiving. If the destination address is set to NULL, all flows will be closed and the other parameter values will be ignored. If the source address is set to NULL, the close applies to all possible sources. Return Values: TRUE if successful, FALSE otherwise. Unsuccessful operations will set an appropriate error code. Also See: scrapi_errno, scrapi_get_status 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. 5.2. Error Handling API Description Lindell Expiration: May 1999 [Page 11] INTERNET-DRAFT SCRAPI v.2 November 1998 The section describes the error reporting functions of the SCRAPI API. Function Name: scrapi_get_status Syntax: scrapi_status scrapi_get_status( const struct sockaddr *destination, int protocol, const struct sockaddr *source ); 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. If the source address is set to NULL, a yellow status indicates that the flow is valid but no reservation operation(s) as a sender or receiver has completed successfully. Once a single reservation completion has been detected for either a sender or receiver, the flow has a green status. If the source address is not set to NULL, the status applies only to the receiver for the specified source. Thus, if an application is both a sender and receiver for a the given flow, any relevant sender status information is ignored. Return Values: scrapi_status_red, scrapi_status_yellow, or scrapi_status_green. Lindell Expiration: May 1999 [Page 12] INTERNET-DRAFT SCRAPI v.2 November 1998 Function Name: scrapi_errno Syntax: int scrapi_errno( const struct sockaddr *destination, int protocol, const struct sockaddr *source ); Description: Set to the errno value of the last SCRAPI call for a given flow. Must be called with identical arguments given in a preceding SCRAPI function. Since failed SCRAPI functions may not have created a flow, or caused the closure of a flow, the errno may be transitory and should be observed immediately after the failure. Also See: scrapi_perror, scrapi_errlist Function Name: scrapi_perror Syntax: void scrapi_perror( const struct sockaddr *destination, int protocol, const struct sockaddr *source, const char *string ); Description: SCRAPI call to print an error message analogous to the perror() library call. Also See: scrapi_errno, scrapi_errlist Lindell Expiration: May 1999 [Page 13] INTERNET-DRAFT SCRAPI v.2 November 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. Also See: scrapi_errno, scrapi_perror 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. Lindell Expiration: May 1999 [Page 14] INTERNET-DRAFT SCRAPI v.2 November 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. 5.3. Asynchronous Event Loop API Description The section describes the asynchronous event functions of the SCRAPI API. Function Name: scrapi_poll_list Syntax: void scrapi_poll_list( fdset *set ); Description: SCRAPI call to get all API file descriptors to use in a subsequent select call. 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. 6. Application Code Templates This section provides examples, presented as code templates, to aid programmers in augmenting networking applications with SCRAPI calls. Lindell Expiration: May 1999 [Page 15] INTERNET-DRAFT SCRAPI v.2 November 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. 6.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. 6.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: May 1999 [Page 16] INTERNET-DRAFT SCRAPI v.2 November 1998 #include #define SAP(x) ((struct sockaddr *) (x)) void main(int argc, char *argv[]) { int fd,len; int timeout = 10000; /* wait for at most 10 seconds */ double bw = 1000; /* Average bandwidth 1Kbytes/sec */ struct SOCKADDR destination,source; scrapi_status status; char *hostname = "receive-hostname"; unsigned short port = 1111; /* translate host name or address */ if (!scrapi_sockaddr_parse(SAP(&destination),hostname, htons(port))) { fprintf(stderr,"Could not parse host address"); exit(1); } /* open, bind, and connect */ /* fd = socket(...); */ len = sizeof(source); if (getsockname(fd,SAP(&source),&len) == -1) { perror("getsockname"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_sender(SAP(&destination),IPPROTO_TCP,SAP(&source), bw,0,timeout)) scrapi_perror(SAP(&destination),IPPROTO_TCP,SAP(&source), "RSVP unable to reserve bandwidth"); status = scrapi_get_status(SAP(&destination),IPPROTO_TCP,NULL); /* run test */ if (status == scrapi_status_green) { status = scrapi_get_status(SAP(&destination),IPPROTO_TCP, NULL); if (status != scrapi_status_green) fprintf(stderr, "RSVP reservation lost during test!"); } scrapi_close(NULL,0,0); } Lindell Expiration: May 1999 [Page 17] INTERNET-DRAFT SCRAPI v.2 November 1998 6.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. #include #define SAP(x) ((struct sockaddr *) (x)) 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,SAP(&destination),&len) == -1) { perror("getsockname"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_receiver(SAP(&destination),IPPROTO_TCP,NULL,1, scrapi_service_cl,scrapi_style_distinct,timeout)) scrapi_perror(SAP(&destination),IPPROTO_TCP,NULL, "RSVP unable to reserve bandwidth"); /* run test */ scrapi_close(NULL,0,0); } 6.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: May 1999 [Page 18] INTERNET-DRAFT SCRAPI v.2 November 1998 #include #include #include #define SAP(x) ((struct sockaddr *) (x)) void callback(ClientData data, int mask) { if (!scrapi_dispatch()) Tk_DeleteFileHandler(data); } void main(int argc, char *argv[]) { int i,fd,len; fd_set set; struct SOCKADDR destination,source; double bw = 1000; /* Average bandwidth 1Kbytes/sec */ char *hostname = "receive-hostname"; unsigned short port = 1111; /* translate host name or address */ if (!scrapi_sockaddr_parse(SAP(&destination),hostname, htons(port))) { fprintf(stderr,"Could not parse host address"); exit(1); } len = sizeof(source); if (getsockname(fd,SAP(&source),&len) == -1) { perror("getsockname"); exit(1); } /* make an RSVP based reservation */ if (!scrapi_sender(SAP(&destination),IPPROTO_UDP,SAP(&source), bw,0,0)) scrapi_perror(SAP(&destination),IPPROTO_UDP,SAP(&source), "RSVP unable to reserve bandwidth"); if (!scrapi_receiver(SAP(&destination),IPPROTO_UDP,SAP(&source), 1,scrapi_service_cl,scrapi_style_distinct,0)) scrapi_perror(SAP(&destination),IPPROTO_UDP,SAP(&source), "RSVP unable to reserve bandwidth"); scrapi_poll_list(&set); for (i = 0;i < FD_SETSIZE; i++) { if (!FD_ISSET(i,&set)) Lindell Expiration: May 1999 [Page 19] INTERNET-DRAFT SCRAPI v.2 November 1998 continue; Tk_CreateFileHandler((ClientData) i,TK_READABLE, callback,(ClientData) i); } /* send data */ scrapi_close(NULL,0,0); } 7. Conclusion 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. 8. Security Considerations Security considerations are not discussed in this memo. 9. Acknowledgements The author would like to thank Steve Berson for helping to define this API. I would also like to thank Bob Braden for his help in improving the definition of the API and corresponding documentation. 10. 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. Lindell Expiration: May 1999 [Page 20] INTERNET-DRAFT SCRAPI v.2 November 1998 [4] Wroclawski, J., Specification of the Controlled Load Quality of Service, RFC 2211, September 1997. [5] Berger, L., O'Malley, T., RSVP Extensions for IPSEC Data Flows, RFC 2207, September 1997. 11. Author's Address Bob Lindell USC Information Sciences Institute 4676 Admiralty Way Marina del Rey, CA 90292 12. Appendix 1: Address Manipulation API Description These are utility functions to ease the development of an interface which supports IPv4 and IPv6. These are not viewed as part of the SCRAPI API, but rather a collection of useful address manipulation functions which should be provided in system libraries. In the future, these functions will be removed in favor of system supplied functionality. 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. Lindell Expiration: May 1999 [Page 21] INTERNET-DRAFT SCRAPI v.2 November 1998 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. Function Name: scrapi_sockaddr_get_addr Syntax: int scrapi_sockaddr_get_addr( const struct sockaddr *address, char *addr ); Description: Store the address field of the sockaddr structure to a network order binary representation of an address which starts at the memory location specified. Return Values: TRUE if successful, FALSE otherwise. Lindell Expiration: May 1999 [Page 22] INTERNET-DRAFT SCRAPI v.2 November 1998 Function Name: scrapi_sockaddr_set_addr Syntax: int scrapi_sockaddr_set_addr( struct sockaddr *address, char *addr ); Description: Load the address field of the sockaddr structure from a network order binary representation of an address which starts at the memory location specified. Return Values: TRUE if successful, FALSE otherwise. 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. Lindell Expiration: May 1999 [Page 23] INTERNET-DRAFT SCRAPI v.2 November 1998 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. Function Name: scrapi_sockaddr_length Syntax: int scrapi_sockaddr_length( struct sockaddr *address ); Description: Return the length of a struct sockaddr for the given address family. Return Values: The length if successful, 0 otherwise. Lindell Expiration: May 1999 [Page 24] INTERNET-DRAFT SCRAPI v.2 November 1998 Table of Contents 1. Introduction ................................................... 2 2. Functional Description ......................................... 3 3. The Simplified Error Model of SCRAPI ........................... 5 4. A Comparison to RAPI ........................................... 7 5. Application Programming Interface Definition ................... 8 5.1. Reservation API Description .................................. 9 5.2. Error Handling API Description ............................... 11 5.3. Asynchronous Event Loop API Description ...................... 15 6. Application Code Templates ..................................... 15 6.1. Unicast Performance Measurement Application .................. 16 6.1.1. Sender Application ......................................... 16 6.1.2. Receiver Application ....................................... 18 6.2. Multicast Multimedia Application ............................. 18 7. Conclusion ..................................................... 20 8. Security Considerations ........................................ 20 9. Acknowledgements ............................................... 20 10. References .................................................... 20 11. Author's Address .............................................. 21 12. Appendix 1: Address Manipulation API Description .............. 21 Lindell Expiration: May 1999 [Page 25]