--- libaitrpc/inc/aitrpc.h 2014/03/27 23:11:05 1.23.4.2 +++ libaitrpc/inc/aitrpc.h 2015/06/29 22:29:25 1.27.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitrpc.h,v 1.23.4.2 2014/03/27 23:11:05 misho Exp $ +* $Id: aitrpc.h,v 1.27.2.1 2015/06/29 22:29:25 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2014 +Copyright 2004 - 2015 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -62,14 +62,32 @@ SUCH DAMAGE. #include -#define RPC_VERSION 7 +#define RPC_VERSION 9 #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 */ #define RPC_REPLY 0x0 #define RPC_NOREPLY 0x1 +/* RPC call I/O direction */ + +#define RPC_REQ 0x0 +#define RPC_ACK 0x1 + /* RPC builtin registed calls */ #define CALL_TAG_MAX 65535 @@ -128,6 +146,7 @@ struct tagRPCCall { rpc_sess_t call_session; uint32_t call_len; + uint32_t call_seq; uint16_t call_crc; union { @@ -140,8 +159,9 @@ struct tagRPCCall { } call_rep; }; + uint8_t call_io; uint16_t call_tag; - uint16_t call_argc; + uint8_t call_argc; ait_val_t call_argv[0]; } __packed; /* size == 20 bytes */ #define RPC_CHK_NOREPLY(x) (ntohl((u_long) (x)->call_req.flags) & RPC_NOREPLY) @@ -272,12 +292,11 @@ void rpc_SetErr(int eno, char *estr, ...); * @type = type of socket * @flags = receive flags * @sa = check client address, if you use udp protocol - * @buf = buffer - * @blen = buffer length + * @pkt = RPC packet * return: -1 error, 0 EOF or or >0 readed bytes into buffer */ 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 * @@ -285,14 +304,21 @@ ssize_t rpc_Read(int sock, int type, int flags, sockad * @type = type of socket * @flags = send flags * @sa = send to client address, if you use udp protocol - * @buf = buffer - * @blen = buffer length + * @pkt = RPC packet + * @blen = write length * 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, - 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 * * @p = packet session @@ -360,16 +386,18 @@ void rpc_srv_endServer(rpc_srv_t ** __restrict psrv); * return: -1 error or 0 ok, infinite loop ... */ int rpc_srv_loopServer(rpc_srv_t * __restrict srv); -#define rpc_srv_execServer(_srv, _sync) do { assert((_srv)); \ - if (!(_srv)->srv_kill) { \ - pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \ - rpc_srv_loopServer, (_srv)); \ - if ((_sync)) \ - pthread_join((_srv)->srv_tid, (void**) (_sync)); \ - else \ - pthread_detach((_srv)->srv_tid); \ - } } while (0) -#define rpc_srv_killServer(_srv) (assert((_srv)), (_srv)->srv_blob.kill = 1, (_srv)->srv_kill = 1) +#define rpc_srv_execServer(_srv, _sync) \ + do { assert((_srv)); \ + if (!(_srv)->srv_kill) { \ + pthread_create(&(_srv)->srv_tid, NULL, (void*(*)(void*)) \ + rpc_srv_loopServer, (_srv)); \ + if ((_sync)) \ + pthread_join((_srv)->srv_tid, (void**) (_sync)); \ + else \ + 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 @@ -394,16 +422,38 @@ void rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) * return: -1 error or 0 ok, infinite loop ... */ int rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv); -#define rpc_srv_execBLOBServer(_srv) do { assert((_srv)); \ - if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \ - pthread_create(&(_srv)->srv_blob.tid, NULL, \ - (void*(*)(void*)) \ - rpc_srv_loopBLOBServer, (_srv)); \ - pthread_detach((_srv)->srv_blob.tid); \ - } \ - } while (0) +#define rpc_srv_execBLOBServer(_srv) \ + do { assert((_srv)); \ + if (!(_srv)->srv_kill && !(_srv)->srv_blob.kill) { \ + pthread_create(&(_srv)->srv_blob.tid, NULL, \ + (void*(*)(void*)) rpc_srv_loopBLOBServer, (_srv)); \ + pthread_detach((_srv)->srv_blob.tid); \ + } \ + } 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 * * @srv = RPC Server instance @@ -606,10 +656,11 @@ int rpc_pkt_Send(int sock, int type, sockaddr_t * __re * @type = Type of socket * @sa = Server address * @pkt = RPC packet + * @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, - ait_val_t * __restrict pkt); + ait_val_t * __restrict pkt, int seq); /* * rpc_pkt_Request() - Build RPC Request packet * @@ -619,16 +670,17 @@ int rpc_pkt_Receive(int sock, int type, sockaddr_t * _ * @vars = Function argument array of values, may be NULL * @noreply = We not want RPC reply * @nocrc = Without CRC calculation + * @seq = Sign packet with seq.no * return: -1 error or != -1 prepared bytes into packet */ 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 * * @pkt = Packet buffer - * @sess = RPC session info - * @tag = Function tag + * @sess = RPC session info, if =NULL don't check session + * @tag = Function tag, if =CALL_TAG_MAX don't check tag * @vars = Function argument array of values, may be NULL * @nocrc = Without CRC calculation * return: -1 error or != -1 return value from function @@ -678,6 +730,44 @@ rpc_cli_t *rpc_cli_openBLOBClient(rpc_cli_t * __restri * return: none */ 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