Diff for /libaitrpc/inc/aitrpc.h between versions 1.20 and 1.27.2.1

version 1.20, 2013/09/05 00:43:04 version 1.27.2.1, 2015/06/29 22:29:25
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2015
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 62  SUCH DAMAGE. Line 62  SUCH DAMAGE.
 #include <aitsched.h>  #include <aitsched.h>
   
   
#define RPC_VERSION             7#define RPC_VERSION             9
 #define RPC_DEFPORT             2611  #define RPC_DEFPORT             2611
   
   /* Additional ELWIX RPC supporting protocols */
   #ifndef SOCK_STREAM
   #define SOCK_STREAM             1       /* stream socket */
   #endif
   #ifndef SOCK_DGRAM
   #define SOCK_DGRAM              2       /* datagram socket */
   #endif
   #ifndef SOCK_RAW
   #define SOCK_RAW                3       /* raw-protocol interface */
   #endif
   #define SOCK_BPF                4       /* ethernet interface */
   #define SOCK_EXT                5       /* bi-directional pipe interface */
   
 /* RPC call request flags */  /* RPC call request flags */
   
 #define RPC_REPLY               0x0  #define RPC_REPLY               0x0
 #define RPC_NOREPLY             0x1  #define RPC_NOREPLY             0x1
   
   /* RPC call I/O direction */
   
   #define RPC_REQ                 0x0
   #define RPC_ACK                 0x1
   
 /* RPC builtin registed calls */  /* RPC builtin registed calls */
   
 #define CALL_TAG_MAX            65535  #define CALL_TAG_MAX            65535
Line 128  struct tagRPCCall { Line 146  struct tagRPCCall {
         rpc_sess_t      call_session;          rpc_sess_t      call_session;
   
         uint32_t        call_len;          uint32_t        call_len;
           uint32_t        call_seq;
         uint16_t        call_crc;          uint16_t        call_crc;
   
         union {          union {
Line 140  struct tagRPCCall { Line 159  struct tagRPCCall {
                 }       call_rep;                  }       call_rep;
         };          };
   
           uint8_t         call_io;
         uint16_t        call_tag;          uint16_t        call_tag;
        uint16_t        call_argc;        uint8_t             call_argc;
         ait_val_t       call_argv[0];          ait_val_t       call_argv[0];
 } __packed;                     /* size == 20 bytes */  } __packed;                     /* size == 20 bytes */
 #define RPC_CHK_NOREPLY(x)      (ntohl((u_long) (x)->call_req.flags) & RPC_NOREPLY)  #define RPC_CHK_NOREPLY(x)      (ntohl((u_long) (x)->call_req.flags) & RPC_NOREPLY)
Line 247  typedef struct { Line 267  typedef struct {
  */   */
 typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagRPCCall *, array_t *);  typedef int (*rpc_callback_t)(rpc_cli_t *, struct tagRPCCall *, array_t *);
   
   #define RPC_CALL_DEFINE(x)      int (x)(rpc_cli_t*, struct tagRPCCall*, array_t*)
   #define RPC_CALL_ARGS(arg1, arg2, arg3) rpc_cli_t* arg1, struct tagRPCCall* arg2, array_t* arg3
   #define RPC_CALL_STDARGS        RPC_CALL_ARGS(cli, rpc, iv)
   
   
 /* ----------------------------------------------------------------------- */  /* ----------------------------------------------------------------------- */
   
 /* Error support functions */  /* Error support functions */
Line 268  void rpc_SetErr(int eno, char *estr, ...); Line 292  void rpc_SetErr(int eno, char *estr, ...);
  * @type = type of socket   * @type = type of socket
  * @flags = receive flags   * @flags = receive flags
  * @sa = check client address, if you use udp protocol   * @sa = check client address, if you use udp protocol
 * @buf = buffer * @pkt = RPC packet
 * @blen = buffer length * return: -1 error, 0 EOF or or >0 readed bytes into buffer
 * return: -1 error or >-1 readed bytes into buffer 
  */   */
 ssize_t rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa,   ssize_t rpc_Read(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                unsigned char * __restrict buf, size_t blen);                ait_val_t * __restrict pkt);
 /*  /*
  * rpc_Write() - RPC write operation   * rpc_Write() - RPC write operation
  *   *
Line 281  ssize_t rpc_Read(int sock, int type, int flags, sockad Line 304  ssize_t rpc_Read(int sock, int type, int flags, sockad
  * @type = type of socket   * @type = type of socket
  * @flags = send flags   * @flags = send flags
  * @sa = send to client address, if you use udp protocol   * @sa = send to client address, if you use udp protocol
 * @buf = buffer * @pkt = RPC packet
 * @blen = buffer length * @blen = write length
 * return: -1 error or >-1 written bytes into buffer * return: -1 error, 0 EOF or >0 written bytes into buffer
  */   */
 ssize_t rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa,   ssize_t rpc_Write(int sock, int type, int flags, sockaddr_t * __restrict sa, 
                unsigned char * __restrict buf, size_t blen);                ait_val_t * __restrict pkt, size_t blen);
   
 /*  /*
    * rpc_pktFreeSpace() - Get free space for payload into RPC packet
    *
    * @c = RPC client 
    * return: remains free bytes from packet
    */
   size_t rpc_pktFreeSpace(rpc_cli_t * __restrict c);
   /*
  * rpc_chkPktSession() - Check RPC session   * rpc_chkPktSession() - Check RPC session
  *   *
  * @p = packet session   * @p = packet session
Line 356  void rpc_srv_endServer(rpc_srv_t ** __restrict psrv); Line 386  void rpc_srv_endServer(rpc_srv_t ** __restrict psrv);
  * return: -1 error or 0 ok, infinite loop ...   * return: -1 error or 0 ok, infinite loop ...
  */   */
 int rpc_srv_loopServer(rpc_srv_t * __restrict srv);  int rpc_srv_loopServer(rpc_srv_t * __restrict srv);
#define rpc_srv_execServer(_srv, _sync) do { assert((_srv)); \#define rpc_srv_execServer(_srv, _sync) \
                                                if (!(_srv)->srv_kill) { \        do { assert((_srv)); \
                                                        pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \                if (!(_srv)->srv_kill) { \
                                                                        rpc_srv_loopServer, (_srv)); \                        pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \
                                                        if ((_sync)) \                                        rpc_srv_loopServer, (_srv)); \
                                                                pthread_join((_srv)->srv_tid, (void**) (_sync)); \                        if ((_sync)) \
                                                        else \                                pthread_join((_srv)->srv_tid, (void**) (_sync)); \
                                                                pthread_detach((_srv)->srv_tid); \                        else \
                                                } } while (0)                                pthread_detach((_srv)->srv_tid); \
         } } while (0)
 #define rpc_srv_killServer(_srv) \
         (assert((_srv)), (_srv)->srv_blob.kill = 1, (_srv)->srv_kill = 1)
   
 /*  /*
  * rpc_srv_initBLOBServer() - Init & create BLOB Server   * rpc_srv_initBLOBServer() - Init & create BLOB Server
Line 389  void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 422  void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
  * return: -1 error or 0 ok, infinite loop ...   * return: -1 error or 0 ok, infinite loop ...
  */   */
 int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv);  int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv);
#define rpc_srv_execBLOBServer(_srv)    do { assert((_srv)); \#define rpc_srv_execBLOBServer(_srv) \
                                                if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \        do { assert((_srv)); \
                                                        pthread_create(&(_srv)->srv_blob.tid, NULL, \                if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \
                                                                        (void*(*)(void*)) \                        pthread_create(&(_srv)->srv_blob.tid, NULL, \
                                                                        rpc_srv_loopBLOBServer, (_srv)); \                                        (void*(*)(void*)) rpc_srv_loopBLOBServer, (_srv)); \
                                                        pthread_detach((_srv)->srv_blob.tid); \                        pthread_detach((_srv)->srv_blob.tid); \
                                                } \                } \
                                        } while (0)        } while (0)
   
 /*  /*
    * rpc_srv_initServer2() - Init & create layer2 RPC Server
    *
    * @InstID = Instance for authentication & recognition
    * @concurentClients = Concurent clients at same time to this server
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @csIface = Interface name for bind server, if NULL first interface on host
    * return: NULL == error or !=NULL bind and created RPC server instance
    */
   rpc_srv_t *rpc_srv_initServer2(u_char InstID, int concurentClients, int netBuf, 
                   const char *csIface);
   
   /*
    * rpc_srv_initServerExt() - Init & create pipe RPC Server
    *
    * @InstID = Instance for authentication & recognition
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @fd = File descriptor
    * return: NULL == error or !=NULL bind and created RPC server instance
    */
   rpc_srv_t *rpc_srv_initServerExt(u_char InstID, int netBuf, int fd);
   
   /*
  * rpc_srv_registerCall() - Register call to RPC server   * rpc_srv_registerCall() - Register call to RPC server
  *   *
  * @srv = RPC Server instance   * @srv = RPC Server instance
Line 569  int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_va Line 624  int rpc_cli_getBLOB(rpc_cli_t * __restrict cli, ait_va
 rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf,   rpc_cli_t *rpc_cli_openClient(unsigned char InstID, int netBuf, 
                 const char *csHost, unsigned short Port, int proto);                  const char *csHost, unsigned short Port, int proto);
 /*  /*
    * rpc_cli_reconnectClient() - Reconnecting client to RPC server
    *
    * @cli = RPC Client session
    * return: -1 error or 0 ok
    */
   int rpc_cli_reconnectClient(rpc_cli_t * __restrict cli);
   /*
  * rpc_cli_closeClient() - Close connection to RPC server and free resources   * rpc_cli_closeClient() - Close connection to RPC server and free resources
  *   *
  * @cli = RPC Client session   * @cli = RPC Client session
Line 583  void rpc_cli_closeClient(rpc_cli_t ** __restrict cli); Line 645  void rpc_cli_closeClient(rpc_cli_t ** __restrict cli);
  * @sa = Server address   * @sa = Server address
  * @pkt = RPC packet   * @pkt = RPC packet
  * @len = Length of packet   * @len = Length of packet
 * return: -1 error or !=-1 sended bytes * return: -1 error, 0  EOF or >0 sended bytes
  */   */
 int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa,   int rpc_pkt_Send(int sock, int type, sockaddr_t * __restrict sa, 
                 ait_val_t * __restrict pkt, int len);                  ait_val_t * __restrict pkt, int len);
Line 594  int rpc_pkt_Send(int sock, int type, sockaddr_t * __re Line 656  int rpc_pkt_Send(int sock, int type, sockaddr_t * __re
  * @type = Type of socket   * @type = Type of socket
  * @sa = Server address   * @sa = Server address
  * @pkt = RPC packet   * @pkt = RPC packet
 * return: -1 error or !=-1 sended bytes * @seq = Signed packet with seq.no
  * return: -1 error, 0 EOF or >0 received bytes
  */   */
 int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa,   int rpc_pkt_Receive(int sock, int type, sockaddr_t * __restrict sa, 
                ait_val_t * __restrict pkt);                ait_val_t * __restrict pkt, int seq);
 /*  /*
  * rpc_pkt_Request() - Build RPC Request packet   * rpc_pkt_Request() - Build RPC Request packet
  *   *
Line 607  int rpc_pkt_Receive(int sock, int type, sockaddr_t * _ Line 670  int rpc_pkt_Receive(int sock, int type, sockaddr_t * _
  * @vars = Function argument array of values, may be NULL   * @vars = Function argument array of values, may be NULL
  * @noreply = We not want RPC reply   * @noreply = We not want RPC reply
  * @nocrc = Without CRC calculation   * @nocrc = Without CRC calculation
    * @seq = Sign packet with seq.no
  * return: -1 error or != -1 prepared bytes into packet   * return: -1 error or != -1 prepared bytes into packet
  */   */
 int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess,   int rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t * __restrict sess, 
                unsigned short tag, array_t * __restrict vars, int noreply, int nocrc);                unsigned short tag, array_t * __restrict vars, int noreply, int nocrc, int seq);
 /*  /*
  * rpc_pkt_Replay() - Decode RPC Replay packet   * rpc_pkt_Replay() - Decode RPC Replay packet
  *   *
  * @pkt = Packet buffer   * @pkt = Packet buffer
 * @sess = RPC session info * @sess = RPC session info, if =NULL don't check session
 * @tag = Function tag * @tag = Function tag, if =CALL_TAG_MAX don't check tag
  * @vars = Function argument array of values, may be NULL   * @vars = Function argument array of values, may be NULL
  * @nocrc = Without CRC calculation   * @nocrc = Without CRC calculation
  * return: -1 error or != -1 return value from function   * return: -1 error or != -1 return value from function
Line 631  int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_ses Line 695  int rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_ses
  * @tag = Function tag for execution   * @tag = Function tag for execution
  * @in_vars = IN function argument array of values, may be NULL   * @in_vars = IN function argument array of values, may be NULL
  * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()   * @out_vars = OUT returned array of rpc values, if !=NULL must be free after use with ait_freeVars()
 * return: -1 error or != -1 ok result * return: -1 error, 0 ok result or 1 closed rpc connection
  */   */
 int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag,   int rpc_cli_execCall(rpc_cli_t *cli, int noreply, unsigned short tag, 
                 array_t * __restrict in_vars, array_t ** __restrict out_vars);                  array_t * __restrict in_vars, array_t ** __restrict out_vars);
Line 666  rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restri Line 730  rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restri
  * return: none   * return: none
  */   */
 void rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli);  void rpc_cli_closeBLOBClient(rpc_cli_t ** __restrict cli);
   
   
   /*
    * rpc_cli_openClient2() - Connect to layer2 RPC Server
    *
    * @InstID = InstID for RPC session request
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @csIface = Interface name for bind client, if NULL first interface on host
    * @csHost = Host ethernet address
    * return: NULL == error or !=NULL connection to RPC server established
    */
   rpc_cli_t *rpc_cli_openClient2(u_char InstID, int netBuf, 
                   const char *csIface, const char *csHost);
   /*
    * rpc_cli_closeClient2() - Close layer2 connection to RPC server and free resources
    *
    * @cli = RPC Client session
    * return: none
    */
   void rpc_cli_closeClient2(rpc_cli_t ** __restrict cli);
   
   
   /*
    * rpc_cli_openClientExt() - Connect to pipe RPC Server
    *
    * @InstID = InstID for RPC session request
    * @netBuf = Network buffer length (min:512 bytes), if =0 == BUFSIZ (also meaning max RPC packet)
    * @fd = File descriptor
    * return: NULL == error or !=NULL connection to RPC server established
    */
   rpc_cli_t *rpc_cli_openClientExt(u_char InstID, int netBuf, int fd);
   /*
    * rpc_cli_closeClientExt() - Close pipe connection to RPC server and free resources
    *
    * @cli = RPC Client session
    * return: none
    */
   void rpc_cli_closeClientExt(rpc_cli_t ** __restrict cli);
   
   
 #endif  #endif

Removed from v.1.20  
changed lines
  Added in v.1.27.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>