--- libaitrpc/src/srv.c 2015/06/29 22:29:26 1.26.2.8 +++ libaitrpc/src/srv.c 2015/06/30 14:11:55 1.26.2.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.26.2.8 2015/06/29 22:29:26 misho Exp $ +* $Id: srv.c,v 1.26.2.10 2015/06/30 14:11:55 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -70,12 +70,12 @@ static void *rxEXTPacket(sched_task_t *); static void *txEXTPacket(sched_task_t *); static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { - { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ - { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ - { rxUDPPacket, freeClient, rxUDPPacket, txUDPPacket }, /* SOCK_DGRAM */ - { rxRAWPacket, freeClient, rxRAWPacket, txRAWPacket }, /* SOCK_RAW */ - { rxBPFPacket, freeClient, rxBPFPacket, txBPFPacket }, /* SOCK_BPF */ - { rxEXTPacket, freeClient, rxEXTPacket, txEXTPacket } /* SOCK_EXT */ + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { rxUDPPacket, freeClient, NULL /*rxUDPPacket*/, txUDPPacket }, /* SOCK_DGRAM */ + { rxRAWPacket, freeClient, NULL /*rxRAWPacket*/, txRAWPacket }, /* SOCK_RAW */ + { rxBPFPacket, freeClient, NULL /*rxBPFPacket*/, txBPFPacket }, /* SOCK_BPF */ + { rxEXTPacket, freeClient, NULL /*rxEXTPacket*/, txEXTPacket } /* SOCK_EXT */ }; /* Global Signal Argument when kqueue support disabled */ @@ -313,6 +313,7 @@ rxPacket(sched_task_t *task) u_short crc; #endif u_char *buf = AIT_GET_BUF(&c->cli_buf); + u_char b[sizeof(struct tagRPCCall)]; struct tagRPCCall *rpc = (struct tagRPCCall*) buf; #ifdef TCP_SESSION_TIMEOUT struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; @@ -322,6 +323,11 @@ rxPacket(sched_task_t *task) TASK_ARG(task), ts, TASK_ARG(task), 0); #endif + /* prepare rx */ + len = recv(TASK_FD(task), b, sizeof b, MSG_PEEK); + if (len == sizeof b) + rlen = ntohl(((struct tagRPCCall*) b)->call_len); + rlen = recv(TASK_FD(task), buf, rlen, 0); if (rlen == -1) { /* close connection */ @@ -613,6 +619,7 @@ txRAWPacket(sched_task_t *task) RPC_RETVARS(c)); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); + rpc->call_argc ^= rpc->call_argc; rpc->call_rep.ret = RPC_ERROR(-1); rpc->call_rep.eno = RPC_ERROR(rpc_Errno);