--- libaitrpc/inc/aitrpc.h 2012/05/14 08:39:05 1.8 +++ libaitrpc/inc/aitrpc.h 2012/05/15 16:06:13 1.8.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitrpc.h,v 1.8 2012/05/14 08:39:05 misho Exp $ +* $Id: aitrpc.h,v 1.8.2.1 2012/05/15 16:06:13 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -57,11 +57,12 @@ SUCH DAMAGE. #include #endif #include +#include #include #include -#define RPC_VERSION 3 +#define RPC_VERSION 4 #define RPC_DEFPORT 2611 /* RPC call request flags */ @@ -115,8 +116,8 @@ typedef struct { uint8_t sess_version; uint8_t sess_timeout; uint32_t sess_program; - uint32_t sess_process; -} __packed rpc_sess_t; + uint16_t sess_process; +} __packed rpc_sess_t; /* size == 8 bytes */ /* Server managment RPC functions ... */ @@ -131,7 +132,7 @@ typedef struct tagRPCFunc { array_t *func_vars; void *func_parent; - struct tagRPCFunc *func_next; + TAILQ_ENTRY(tagRPCFunc) func_node; } rpc_func_t; @@ -157,7 +158,7 @@ struct tagRPCCall { }; uint16_t call_crc; -} __packed; +} __packed; /* size == 28 bytes */ /* Network BLOB packet - Header */ @@ -174,14 +175,12 @@ struct tagBLOBHdr { /* Network RPC client & server elements */ typedef struct { - io_sockaddr_t cli_sa; // host info - int cli_sock; // socket fd - pthread_t cli_tid; // TID of thread + int cli_id; /* slot id */ + int cli_sock; /* socket fd */ + io_sockaddr_t cli_sa; /* host address */ + ait_val_t cli_buf; /* network buffer */ - cmd_type_t cli_kill; - - void *cli_parent; // pointer to parent rpc_srv_t for server or to rpc_sess_t for client - int cli_netbuf; // size of network buffer size + void *cli_parent; /* pointer to parent rpc_srv_t for server or to rpc_sess_t for client */ } rpc_cli_t; @@ -196,16 +195,16 @@ typedef struct tagBLOB { } rpc_blob_t; typedef struct { - rpc_sess_t srv_session; // RPC session registration info - int srv_numcli; // maximum concurent client connections - int srv_netbuf; // size of network buffer size + rpc_sess_t srv_session; /* RPC session registration info */ + int srv_netbuf; /* size of network buffer */ - rpc_cli_t srv_server; // RPC server socket - rpc_cli_t *srv_clients; // connected rpc client sockets + sched_root_task_t *srv_root; /* RPC server scheduler */ + intptr_t srv_kill; /* Scheduler condition variable */ - rpc_func_t *srv_funcs; // registered functions list + rpc_cli_t srv_server; /* RPC server socket */ + array_t *srv_clients; /* connected rpc client sockets */ - cmd_type_t srv_kill; + TAILQ_HEAD(, tagRPCFunc) srv_funcs; /* RPC functions list */ struct { cmd_type_t state; // BLOB server state: ==0 disable | !=0 enable @@ -215,7 +214,7 @@ typedef struct { rpc_cli_t *clients; // connected blob client sockets rpc_blob_t *blobs; // registered blob variables list - } srv_blob; + } srv_blob; } rpc_srv_t; @@ -241,21 +240,28 @@ inline const char *rpc_GetError(); /* - * rpc_chkPktSession() - Check session in RPC packet + * rpc_chkPktSession() - Check RPC session * * @p = packet session * @s = active session - * return: -1 error or 0 ok + * return: -1, 1, 2, 3 are errors or 0 ok */ inline int rpc_chkPktSession(rpc_sess_t *p, rpc_sess_t *s); /* - * rpc_addPktSession() - Add session into RPC packet + * rpc_addPktSession() - Prepare session into network format * * @p = packet session - * @s = active session + * @s = host session * return: -1 error or 0 ok */ inline int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t *s); +/* + * rpc_register_srvServices() - Register internal service functions + * + * @srv = RPC server instance + * return: -1 error or 0 ok + */ +int rpc_register_srvServices(rpc_srv_t * __restrict srv); /* RPC Server side functions */ @@ -267,13 +273,12 @@ inline int rpc_addPktSession(rpc_sess_t *p, rpc_sess_t * @regProcID = ProcessID for authentication & recognition * @concurentClients = Concurent clients at same time to this server * @netBuf = Network buffer length, if =0 == BUFSIZ (also meaning max RPC packet) - * @family = Family type, AF_INET, AF_INET6 or AF_LOCAL * @csHost = Host name or address for bind server, if NULL any address * @Port = Port for bind server, if Port == 0 default port is selected * return: NULL == error or !=NULL bind and created RPC server instance */ rpc_srv_t *rpc_srv_initServer(u_int regProgID, u_int regProcID, int concurentClients, - int netBuf, u_short family, const char *csHost, u_short Port); + int netBuf, const char *csHost, u_short Port); /* * rpc_srv_endServer() - Destroy RPC server, close all opened sockets and free resources *