--- libaitrpc/src/srv.c 2014/12/18 00:50:06 1.23.6.6 +++ libaitrpc/src/srv.c 2015/01/15 20:31:18 1.24.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.23.6.6 2014/12/18 00:50:06 misho Exp $ +* $Id: srv.c,v 1.24.2.1 2015/01/15 20:31:18 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -63,12 +63,15 @@ static void *txUDPPacket(sched_task_t *); static void *rxBPFPacket(sched_task_t *); static void *txBPFPacket(sched_task_t *); -static sched_task_func_t cbProto[SOCK_BPF + 1][4] = { +/* SOCK_PIPE */ + +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 */ { NULL, NULL, NULL, NULL }, /* SOCK_RAW */ - { rxBPFPacket, freeClient, rxBPFPacket, txBPFPacket } /* SOCK_BPF */ + { rxBPFPacket, freeClient, rxBPFPacket, txBPFPacket }, /* SOCK_BPF */ + { NULL, NULL, NULL, NULL } /* SOCK_PIPE */ }; /* Global Signal Argument when kqueue support disabled */ @@ -729,7 +732,7 @@ rxBPFPacket(sched_task_t *task) rlen = read(TASK_FD(task), AIT_GET_BUF(&b), AIT_LEN(&b)); h = (struct bpf_hdr*) AIT_GET_BUF(&b); rlen -= h->bh_hdrlen; - if (rlen < h->bh_caplen || h->bh_caplen != h->bh_datalen || + if (rlen < h->bh_datalen || h->bh_caplen != h->bh_datalen || rlen < ETHER_HDR_LEN + sizeof(struct tagRPCCall)) { rpc_SetErr(ERPCMISMATCH, "Short RPC packet"); goto end; @@ -792,7 +795,7 @@ rxBPFPacket(sched_task_t *task) /* send RPC reply */ if (!noreply) - schedWrite(TASK_ROOT(task), cbProto[srv->srv_proto][CB_TXPACKET], + schedEvent(TASK_ROOT(task), cbProto[srv->srv_proto][CB_TXPACKET], c, TASK_FD(task), rpc, len); end: AIT_FREE_VAL(&b);