Internet DRAFT - draft-ietf-rserpool-api

draft-ietf-rserpool-api







Network Working Group                                       A. Silverton
Internet-Draft                                                    Q. Xie
Expires: April 20, 2006                                         Motorola
                                                               M. Tuexen
                                      Muenster Univ. of Applied Sciences
                                                            T. Dreibholz
                                            University of Duisburg-Essen
                                                        October 17, 2005


             Reliable Server Pooling Sockets API Extensions
                     draft-ietf-rserpool-api-00.txt

Status of this Memo

   By submitting this Internet-Draft, each author represents that any
   applicable patent or other IPR claims of which he or she is aware
   have been or will be disclosed, and any of which he or she becomes
   aware will be disclosed, in accordance with Section 6 of BCP 79.

   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."

   The list of current Internet-Drafts can be accessed at
   http://www.ietf.org/ietf/1id-abstracts.txt.

   The list of Internet-Draft Shadow Directories can be accessed at
   http://www.ietf.org/shadow.html.

   This Internet-Draft will expire on April 20, 2006.

Copyright Notice

   Copyright (C) The Internet Society (2005).

Abstract

   This document describes a sockets-like API for the Reliable Server
   Pooling (RSerPool) protocol suite.  This API provides applications
   within an RSerPool enabled system with a reliable communications
   layer via a highly-available socket interface (rsp_socket).



Silverton, et al.        Expires April 20, 2006                 [Page 1]

Internet-Draft                RSerPool API                  October 2005


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Send and Receive Data with HA Sockets  . . . . . . . . . . . .  3
     2.1.  Send Message By Pool Handle  . . . . . . . . . . . . . . .  4
     2.2.  Send Message By Pool Element Handle  . . . . . . . . . . .  4
   3.  Socket Utility Functions . . . . . . . . . . . . . . . . . . .  5
   4.  RSerPool Utility Functions . . . . . . . . . . . . . . . . . .  5
   5.  Example API Usage  . . . . . . . . . . . . . . . . . . . . . .  6
     5.1.  An ECHO Pool Element . . . . . . . . . . . . . . . . . . .  7
     5.2.  An ECHO Pool User  . . . . . . . . . . . . . . . . . . . .  8
   6.  Security Considerations  . . . . . . . . . . . . . . . . . . .  9
   7.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . .  9
   8.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . .  9
   9.  References . . . . . . . . . . . . . . . . . . . . . . . . . .  9
     9.1.  Normative References . . . . . . . . . . . . . . . . . . .  9
     9.2.  Informative References . . . . . . . . . . . . . . . . . .  9
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 10
   Intellectual Property and Copyright Statements . . . . . . . . . . 11
































Silverton, et al.        Expires April 20, 2006                 [Page 2]

Internet-Draft                RSerPool API                  October 2005


1.  Introduction

   This document describes a sockets-like API for the Reliable Server
   Pooling (RSerPool) protocol suite.  This API provides applications
   within an RSerPool enabled system [2] with a reliable communications
   layer via a highly-available socket interface (rsp_socket).

   The RSerPool API is intended to mimic the well-known UNIX sockets
   API.  The functions in this proposed extension to the sockets API are
   prefixed with "rsp_" to signify that they are highly-available
   RSerPool API calls.  Some new utility functions are defined as well.
   The API is intended to be extensible.


2.  Send and Receive Data with HA Sockets

   The UNIX sockets API contains several functions for sending and
   receiving data, e.g., send/recv, writev/readv, etc.  Here we provide
   RSerPool analogs of the most general of the IO functions, sendmsg and
   recvmsg (we pick this pair just to illustrate our general approach.
   More careful thinking should be put in here before deciding the exact
   syntax we will use for HA sockets).

   The intention is to retain as much as possible the basic UNIX
   programming model that many UNIX programmers have been familiar with.
   However, the semantics may be changed since we do not see the benefit
   for strictly mapping the semantics from UNIX sockets API.

   The following API call is used for sending a message with HA socket.

     ssize_t rsp_sendmsg(int sockfd,         /* HA socket descriptor */
                         struct msghdr *msg, /* message header struct */
                         int flags);         /* Options flags */

   The following API call is used for receiving a message with HA
   socket.

     ssize_t rsp_rcvmsg(int sockfd,         /* HA socket descriptor */
                        struct msghdr *msg, /* msg header struct */
                        int flags);         /* Options flags */

   The msg header stucture has RSERPOOL specific semantics.









Silverton, et al.        Expires April 20, 2006                 [Page 3]

Internet-Draft                RSerPool API                  October 2005


     struct msghdr {
       void           *msg_name;       /* RSERPOOL destination name    */
       int             msg_namelen;    /* Length of name               */
       struct iovec   *msg_iov;        /* Data blocks                  */
       size_t          msg_iovlen;     /* Number of blocks             */
       void           *msg_control;    /* RSERPOOL specific ancillary
                                          data                         */
       size_t          msg_controllen; /* Length of cmsg data          */
       unsigned        msg_flags;      /* RSERPOOL specific flags
                                          returned by recvmsg          */
     };

   For example, the *msg_name can be a pointer to a NULL terminated
   string that indicates the destination pool handle, or it can be a
   pointer to a structure that indicates a PE handle in a specific pool.

   The use of *msg_control and msg_flags parameter is TBD.  Some
   examples are, we can use them to indicate whether this message is
   allowed for failover, etc., or to use them to return a pointer to a
   PE handle indicating to whom the message was actually sent.

2.1.  Send Message By Pool Handle

   Using rsp_sendmsg to send to a pool handle:

     ....
     struct msghdr myMsg;
     char destinationPool[255];
     ....
     strcpy(destinationPool, "IETF-RSERPOOL-Server-cluster");
     myMsg.msg_name = destinationPool;
     myMsg.msg_namelen = strlen(destinationPool) + 1;

     /* set up the data pointer here */

     myMsg.msg_flags = FAILOVER_ALLOWED;
     ....
     ret = rsp_sendmsg(sock, &myMsg, myFlags);

     ....

   (Should this go in the example section?)

2.2.  Send Message By Pool Element Handle

   Using rsp_sendmsg to send to a specific PE handle (and the sender
   does not allow failover of this message):




Silverton, et al.        Expires April 20, 2006                 [Page 4]

Internet-Draft                RSerPool API                  October 2005


     ....
     struct msghdr myMsg;
     struct sockaddr_pehandle destPE; /* feilds TBD */
     ....
     /* (somehow) obtain and fill in destPE struct here */
     myMsg.msg_name = &destPE;
     myMsg.msg_namelen = sizeof(destPE);

     /* set up the data pointer here */

     myMsg.msg_flags = FAILOVER_NOT_ALLOWED;
     ....
     ret = rsp_sendmsg(sock, &myMsg, myFlags);

     ....

   (Should this go in the example section?)


3.  Socket Utility Functions

   These calls provide the basic functionality for controlling RSerPool
   HA sockets and obtaining information about active sockets.

   rsp_socket(): This call sets up necessary ASAP resources for this HA
   socket and returns a socket fd to the caller.

     ssize_t rsp_socket(TBD);

   rsp_close(): This call closes the specified HA socket (and releases
   the ASAP resources associated to this HA socket).

     ssize_t rsp_close(int sockfd);

   rsp_connect(): One possibility here is to use this call to pre-fetch
   the pool information.  The caller can put the destination pool handle
   in the parameter when making this call, and the ASAP layer will query
   the Pool Registrar for the named pool and if successful will store
   the query result in its local cache.  If the named pool does not
   exist in the Pool Registrar, an error is then returned to the caller
   of connect().

     ssize_t rsp_connect(sockfd, TBD);


4.  RSerPool Utility Functions

   A number of utility functions, not directly related to data IO, but



Silverton, et al.        Expires April 20, 2006                 [Page 5]

Internet-Draft                RSerPool API                  October 2005


   necessary all the same, are defined for the RSerPool sockets
   interface.

   rsp_register(): This function call is used to registry a PE as a
   member of a pool.  This call should be after socket();

     ssize_t rsp_register(sockfd, TBD);

   rsp_deregister(): This function call is used to remove, or
   deregister, a PE from a pool.

     ssize_t rsp_deregister(sockfd, TBD);

   rsp_getpoolinfo(): The caller uses this to get the details of a pool.
   The call should return a full PE list, together with the pool policy,
   PE load factor, etc. to the caller.  This can be the base for the
   basic mode operation (see the service draft) in which the user of
   RSERPOOL chooses to handle its own data sending but using RSERPOOL
   only for resolving pool handles.

     struct TBD rsp_getPoolInfo(sockfd, TBD);

   rsp_reportpefailure(): This call is used by an PU and PE to report an
   unreachable PE in a pool.

     ssize_t rsp_reportfailure(sockfd, TBD);

   rsp_notify(): A notify function is needed to pass various RSERPOOL as
   well as lower layer events back to the HA socket user.  Maybe we can
   model the notification mechanism after the SCTP socket extension?
   This is just a placeholder.

     ssize_t rsp_notify(TBD);

   rsp_forcefailover(): Not sure if this is really necessary as a
   separate API call, however, this functionality is needed to allow
   user of RSERPOOL to trigger a failover (the upper layer may want to
   take over the failure detection from RSERPOOL).

     ssize_t rsp_forcefailover(sockfd, TBD);


5.  Example API Usage

   This section demonstrates the usage of the RSerPool API.






Silverton, et al.        Expires April 20, 2006                 [Page 6]

Internet-Draft                RSerPool API                  October 2005


5.1.  An ECHO Pool Element


   int main()
   {
       int fd;
       struct sockaddr_in server_addr;
       struct rsp_info info;
       struct rsp_sndrcvinfo sinfo;
       struct rsp_loadinfo linfo;
       int len;
       char buf[1<<16];

       /* initialize the RSerPool implementation */
       memset(&info, 0, sizeof(struct rsp_info));
       rsp_initialize(&info);

       /* we want to provide an SCTP based echo server */
       fd  = rsp_socket(AF_INET, SOCK_DGRAM, IPPROTO_SCTP);

       /* we want to use all addresses and use the standard port number */
       memset(&server_addr, 0, sizeof(server_addr));
       server_addr.sin_family      = AF_INET;
   #ifdef HAVE_SIN_LEN
       server_addr.sin_len         = sizeof(struct sockaddr_in);
   #endif
       server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
       server_addr.sin_port        = htons(7);
       rsp_bind(fd, (const struct sockaddr *) &server_addr, sizeof(server_addr));

       /* we need to register ourself */
       memset(&linfo, 0, sizeof(struct rsp_loadinfo);
       linfo.policy = RSP_ROUND_ROBIN;
       rsp_register(fd, "echo", 4, &linfo);

       /* send back all received messages */
       while (1) {
           memset(&sinfo, 0, sizeof(struct rsp_sndrcvinfo));
           len = rsp_recvmsg(fd, (void *) buf, sizeof(buf), &sinfo, 0);
           rsp_sendmsg(fd, (const void *) buf, len, sinfo, 0);
       }

       /* the deregistration would also be done implicitly by rsp_close() */
       rsp_deregister(fd);
       rsp_close(fd);
       rsp_cleanup();
   }




Silverton, et al.        Expires April 20, 2006                 [Page 7]

Internet-Draft                RSerPool API                  October 2005


5.2.  An ECHO Pool User


   int main()
   {
       int fd, n, done;
       struct rsp_info info;
       fd_set rset;
       char buf[1<<16];

       /* initialize the RSerPool implementation */
       memset(&info, 0, sizeof(struct rsp_info));
       rsp_initialize(&info);

       /* we want to provide an SCTP based echo server */
       fd  = rsp_socket(AF_INET, SOCK_DGRAM, IPPROTO_SCTP);

       /* set the destination */
       rsp_connect(fd, "echo", 4);

       done = 0;
       FD_ZERO(&rset);

       while(!done) {
           FD_SET(0,  &rset);
           FD_SET(fd, &rset);
           /* wait for a packet from the server of stdin input */
           rsp_select(fd + 1, &rset, (fd_set *) NULL, (fd_set *), NULL, (struct timeval *) NULL);
           if (FD_ISSET(0, &rset)) {
               n = Read(0, (void *) buf, sizeof(buf));
               if (n == 0)
                   done = 1;
               else
                   rsp_sendmsg(fd, (const void *) buf, len, NULL, 0);
           }
           if (FD_ISSET(fd, &rset)) {
               n = rsp_recvmsg(fd, (void *) buf, sizeof(buf), NULL, 0);
               if(n > 0)
                   printf("%s", buf);
           }
       }
       rsp_close(fd);
       rsp_cleanup();
   }







Silverton, et al.        Expires April 20, 2006                 [Page 8]

Internet-Draft                RSerPool API                  October 2005


6.  Security Considerations

   The security threat analysis of RSerPool is found in [5].  This
   document does not introduce any new threats.


7.  IANA Considerations

   None


8.  Acknowledgements


9.  References

9.1.  Normative References

   [1]  Bradner, S., "Key words for use in RFCs to Indicate Requirement
        Levels", BCP 14, RFC 2119, March 1997.

9.2.  Informative References

   [2]  Tuexen, M., Xie, Q., Stewart, R., Shore, M., and J. Loughney,
        "Architecture for Reliable Server Pooling",
        draft-ietf-rserpool-arch-07 (work in progress), October 2003.

   [3]  Stewart, R., Xie, Q., Stillman, M., and M. Tuexen, "Aggregate
        Server Access Protocol (ASAP)", draft-ietf-rserpool-asap-09
        (work in progress), June 2004.

   [4]  Xie, Q., Stewart, R., and M. Stillman, "Endpoint Name Resolution
        Protocol (ENRP)", draft-ietf-rserpool-enrp-08 (work in
        progress), June 2004.

   [5]  Stillman, M., "Threats Introduced by Rserpool and Requirements
        for Security in Response to Threats",
        draft-ietf-rserpool-threats-02 (work in progress), Sept 2003.













Silverton, et al.        Expires April 20, 2006                 [Page 9]

Internet-Draft                RSerPool API                  October 2005


Authors' Addresses

   Aron J. Silverton
   Motorola, Inc.
   1301 E. Algonquin Road
   Room 2246
   Schaumburg, IL  60196
   US

   Phone: +1 847-576-8747
   Email: aron.j.silverton@motorola.com


   Qiaobing Xie
   Motorola, Inc.
   1501 W. Shure Drive, 2-F9
   Arlington Heights, IL  60004
   US

   Phone: +1 847-632/3028
   Email: qxie1@email.mot.com


   Michael Tuexen
   Muenster University of Applied Sciences
   Stegerwaldstrasse 39
   48565 Steinfurt
   Germany

   Email: tuexen@fh-muenster.de


   Thomas Dreibholz
   University of Duisburg-Essen, Institute for Experimental Mathematics
   Ellernstrasse 29
   45326 Essen, Nordrhein-Westfalen
   Germany

   Phone: +49 201 183-7637
   Fax:   +49 201 183-7673
   Email: dreibh@exp-math.uni-essen.de
   URI:   http://www.exp-math.uni-essen.de/~dreibh/









Silverton, et al.        Expires April 20, 2006                [Page 10]

Internet-Draft                RSerPool API                  October 2005


Intellectual Property Statement

   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the procedures with respect to rights in RFC documents can be
   found in BCP 78 and BCP 79.

   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at
   ietf-ipr@ietf.org.


Disclaimer of Validity

   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.


Copyright Statement

   Copyright (C) The Internet Society (2005).  This document is subject
   to the rights, licenses and restrictions contained in BCP 78, and
   except as set forth therein, the authors retain all their rights.


Acknowledgment

   Funding for the RFC Editor function is currently provided by the
   Internet Society.




Silverton, et al.        Expires April 20, 2006                [Page 11]