--- libaitrpc/src/srv.c 2024/03/20 16:53:08 1.30.2.11 +++ libaitrpc/src/srv.c 2025/03/31 17:02:29 1.33.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.30.2.11 2024/03/20 16:53:08 misho Exp $ +* $Id: srv.c,v 1.33.2.1 2025/03/31 17:02:29 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 - 2024 +Copyright 2004 - 2025 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -69,6 +69,27 @@ static void *txBPFPacket(sched_task_t *); static void *rxEXTPacket(sched_task_t *); static void *txEXTPacket(sched_task_t *); +#ifdef __linux__ + #ifdef __mips__ + static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { rxUDPPacket, freeClient, NULL /*rxUDPPacket*/, txUDPPacket }, /* SOCK_DGRAM */ + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { rxRAWPacket, freeClient, NULL /*rxRAWPacket*/, txRAWPacket }, /* SOCK_RAW */ + { rxBPFPacket, freeClient, NULL /*rxBPFPacket*/, txBPFPacket }, /* SOCK_BPF */ + { rxEXTPacket, freeClient, NULL /*rxEXTPacket*/, txEXTPacket } /* SOCK_EXT */ + }; + #else + static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { + { 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 */ + }; + #endif +#else static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] = { { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ @@ -77,6 +98,7 @@ static sched_task_func_t cbProto[SOCK_MAX_SUPPORT][4] { rxBPFPacket, freeClient, NULL /*rxBPFPacket*/, txBPFPacket }, /* SOCK_BPF */ { rxEXTPacket, freeClient, NULL /*rxEXTPacket*/, txEXTPacket } /* SOCK_EXT */ }; +#endif /* Global Signal Argument when kqueue support disabled */ @@ -543,7 +565,7 @@ rxUDPPacket(sched_task_t *task) #endif rlen = recvfrom(TASK_FD(task), AIT_GET_BUF(&b), AIT_LEN(&b), 0, &sa.sa, &salen); rpc = (struct tagRPCCall*) AIT_GET_BUF(&b); - if (rlen < sizeof(struct tagRPCCall)) + if (!rpc || rlen < sizeof(struct tagRPCCall)) goto end; else len = ntohl(rpc->call_len); @@ -687,7 +709,7 @@ rxRAWPacket(sched_task_t *task) if (sa.sa.sa_family == AF_INET) { struct ip *h; h = (struct ip*) AIT_GET_BUF(&b); - if (rlen < ntohs(h->ip_len) || h->ip_p != IPPROTO_ERPC) + if (!h || rlen < ntohs(h->ip_len) || h->ip_p != IPPROTO_ERPC) goto end; else { rlen -= sizeof(struct ip); @@ -697,7 +719,7 @@ rxRAWPacket(sched_task_t *task) #ifdef IPV6_REMOVE_HEADER struct ip6_hdr *h; h = (struct ip6_hdr*) AIT_GET_BUF(&b); - if (rlen < ntohs(h->ip6_plen) || h->ip6_nxt != IPPROTO_ERPC) + if (!h || rlen < ntohs(h->ip6_plen) || h->ip6_nxt != IPPROTO_ERPC) goto end; else { rlen -= sizeof(struct ip6_hdr); @@ -707,7 +729,7 @@ rxRAWPacket(sched_task_t *task) rpc = (struct tagRPCCall*) AIT_GET_BUF(&b); #endif } - if (rlen < sizeof(struct tagRPCCall)) + if (!rpc || rlen < sizeof(struct tagRPCCall)) goto end; else len = ntohl(rpc->call_len); @@ -1014,7 +1036,7 @@ rxEXTPacket(sched_task_t *task) AIT_SET_BUF(&b, NULL, srv->srv_netbuf); rlen = read(TASK_FD(task), AIT_GET_BUF(&b), AIT_LEN(&b)); rpc = (struct tagRPCCall*) AIT_GET_BUF(&b); - if (rlen < sizeof(struct tagRPCCall)) + if (!rpc || rlen < sizeof(struct tagRPCCall)) goto end; else len = ntohl(rpc->call_len); @@ -1562,7 +1584,7 @@ rpc_srv_initServer(u_char InstID, int concurentClients /* init functions */ pthread_mutex_init(&srv->srv_funcs.mtx, NULL); SLIST_INIT(&srv->srv_funcs); - AVL_INIT(&srv->srv_funcs); + RB_INIT(&srv->srv_funcs); /* init scheduler */ srv->srv_root = schedBegin(); @@ -1571,8 +1593,7 @@ rpc_srv_initServer(u_char InstID, int concurentClients pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(concurentClients); @@ -1694,7 +1715,6 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) schedPolling(srv->srv_root, &ts, NULL); /* main rpc loop */ schedRun(srv->srv_root, &srv->srv_kill); - schedSignalDispatch(srv->srv_root, 0); /* close all clients connections & server socket */ for (i = 0; i < array_Size(srv->srv_clients); i++) { @@ -1724,7 +1744,7 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) AIT_FREE_VAL(&f->func_name); e_free(f); } - srv->srv_funcs.avlh_root = NULL; + srv->srv_funcs.rbh_root = NULL; RPC_FUNCS_UNLOCK(&srv->srv_funcs); return 0; @@ -1824,7 +1844,7 @@ rpc_srv_initServer2(u_char InstID, int concurentClient /* init functions */ pthread_mutex_init(&srv->srv_funcs.mtx, NULL); SLIST_INIT(&srv->srv_funcs); - AVL_INIT(&srv->srv_funcs); + RB_INIT(&srv->srv_funcs); /* init scheduler */ srv->srv_root = schedBegin(); @@ -1833,8 +1853,7 @@ rpc_srv_initServer2(u_char InstID, int concurentClient pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(concurentClients); @@ -1943,7 +1962,7 @@ rpc_srv_initServerExt(u_char InstID, int netBuf, int f /* init functions */ pthread_mutex_init(&srv->srv_funcs.mtx, NULL); SLIST_INIT(&srv->srv_funcs); - AVL_INIT(&srv->srv_funcs); + RB_INIT(&srv->srv_funcs); /* init scheduler */ srv->srv_root = schedBegin(); @@ -1952,8 +1971,7 @@ rpc_srv_initServerExt(u_char InstID, int netBuf, int f pthread_mutex_destroy(&srv->srv_funcs.mtx); e_free(srv); return NULL; - } else - schedSignalDispatch(srv->srv_root, 42); + } /* init pool for clients */ srv->srv_clients = array_Init(1);