--- libaitrpc/src/cli.c 2015/01/21 20:28:41 1.23.2.5 +++ libaitrpc/src/cli.c 2015/01/27 23:50:46 1.24.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: cli.c,v 1.23.2.5 2015/01/21 20:28:41 misho Exp $ +* $Id: cli.c,v 1.24.2.1 2015/01/27 23:50:46 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -351,9 +351,9 @@ rpc_pkt_Receive(int sock, int type, sockaddr_t * __res if (type == SOCK_STREAM) ret = rpc_Read(sock, type, !estlen ? MSG_PEEK : 0, NULL, buf, blen); else if (type == SOCK_EXT) { - ret = rpc_Read(sock, type, 0, NULL, AIT_GET_BUF(pkt), AIT_LEN(pkt)); - if (ret > 0) - estlen = ret; + ret = rpc_Read(sock, type, 0, NULL, buf, blen); + if (estlen) /* hack for skip sanity checks */ + ret += sizeof(struct tagRPCCall); } else if (type == SOCK_BPF) { ret = rpc_Read(sock, type, 0, sa, AIT_GET_BUF(pkt), AIT_LEN(pkt)); if (ret > 0) @@ -370,7 +370,7 @@ rpc_pkt_Receive(int sock, int type, sockaddr_t * __res } /* check for loop request */ - if (!(rpc->call_io & RPC_ACK)) + if (!estlen && !(rpc->call_io & RPC_ACK)) continue; /* check for response from known address */ @@ -379,9 +379,15 @@ rpc_pkt_Receive(int sock, int type, sockaddr_t * __res estlen = ntohl(rpc->call_len); if (estlen > AIT_LEN(pkt)) AIT_RE_BUF(pkt, estlen); + blen = estlen; buf = AIT_GET_BUF(pkt); + + if (type == SOCK_EXT) { + blen -= sizeof(struct tagRPCCall); + buf += sizeof(struct tagRPCCall); + } + rpc = (struct tagRPCCall*) buf; - blen = estlen; continue; } @@ -468,7 +474,7 @@ rpc_pkt_Request(ait_val_t * __restrict pkt, rpc_sess_t * * @pkt = Packet buffer * @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 * @nocrc = Without CRC calculation * return: -1 error or != -1 return value from function @@ -504,7 +510,7 @@ rpc_pkt_Replay(ait_val_t * __restrict pkt, rpc_sess_t rpc_SetErr(ERPCMISMATCH, "Get invalid RPC session"); return -1; } - if (ntohs(rpc->call_tag) != tag) { + if (tag != CALL_TAG_MAX && ntohs(rpc->call_tag) != tag) { rpc_SetErr(ERPCMISMATCH, "Get wrong RPC reply"); return -1; }