static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; int fd = -1; CATransportFlags_t flags = CA_DEFAULT_FLAGS; while (!caglobals.ip.terminate) { ISSET(u6, readFds, CA_IPV6) else ISSET(u6s, readFds, CA_IPV6 | CA_SECURE) else ISSET(u4, readFds, CA_IPV4) else ISSET(u4s, readFds, CA_IPV4 | CA_SECURE) else ISSET(m6, readFds, CA_MULTICAST | CA_IPV6) else ISSET(m6s, readFds, CA_MULTICAST | CA_IPV6 | CA_SECURE) else ISSET(m4, readFds, CA_MULTICAST | CA_IPV4) else ISSET(m4s, readFds, CA_MULTICAST | CA_IPV4 | CA_SECURE) else if (FD_ISSET(caglobals.ip.netlinkFd, readFds)) { CAHandleNetlink(); break; } else { CAInterface_t *ifchanged = CAFindInterfaceChange(); if (ifchanged) { CAProcessNewInterface(ifchanged); } break; } (void)CAReceiveMessage(fd, flags); FD_CLR(fd, readFds); } }
static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; int fd = -1; CATransportFlags_t flags = CA_DEFAULT_FLAGS; while (!caglobals.ip.terminate) { ISSET(u6, readFds, CA_IPV6) else ISSET(u6s, readFds, CA_IPV6 | CA_SECURE) else ISSET(u4, readFds, CA_IPV4) else ISSET(u4s, readFds, CA_IPV4 | CA_SECURE) else ISSET(m6, readFds, CA_MULTICAST | CA_IPV6) else ISSET(m6s, readFds, CA_MULTICAST | CA_IPV6 | CA_SECURE) else ISSET(m4, readFds, CA_MULTICAST | CA_IPV4) else ISSET(m4s, readFds, CA_MULTICAST | CA_IPV4 | CA_SECURE) else if (FD_ISSET(caglobals.ip.netlinkFd, readFds)) { CAHandleNetlink(); break; } else if (FD_ISSET(caglobals.ip.shutdownFds[0], readFds)) { char buf[10] = {0}; ssize_t len = read(caglobals.ip.shutdownFds[0], buf, sizeof (buf)); if (-1 == len) { continue; } CAInterface_t *ifchanged = CAFindInterfaceChange(); if (ifchanged) { CAProcessNewInterface(ifchanged); OICFree(ifchanged); } break; } else { break; } (void)CAReceiveMessage(fd, flags); FD_CLR(fd, readFds); } }
static void CAReceiveHandler(void *data) { (void)data; OIC_LOG(DEBUG, TAG, "IN - CAReceiveHandler"); while (!caglobals.tcp.terminate) { CAReceiveMessage(); } ca_mutex_lock(g_mutexObjectList); // notify the thread g_threadCounts--; if (!g_threadCounts) { ca_cond_signal(g_condObjectList); } ca_mutex_unlock(g_mutexObjectList); OIC_LOG(DEBUG, TAG, "OUT - CAReceiveHandler"); }
static void CAFindReadyMessage() { fd_set readFds; struct timeval timeout = { .tv_sec = caglobals.tcp.selectTimeout }; FD_ZERO(&readFds); if (-1 != g_acceptServerFD) { FD_SET(g_acceptServerFD, &readFds); } if (-1 != caglobals.tcp.shutdownFds[0]) { FD_SET(caglobals.tcp.shutdownFds[0], &readFds); } if (-1 != caglobals.tcp.connectionFds[0]) { FD_SET(caglobals.tcp.connectionFds[0], &readFds); } uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && 0 <= svritem->fd) { FD_SET(svritem->fd, &readFds); } } int ret = select(caglobals.tcp.maxfd + 1, &readFds, NULL, NULL, &timeout); if (caglobals.tcp.terminate) { OIC_LOG_V(DEBUG, TAG, "Packet receiver Stop request received."); return; } if (0 >= ret) { if (0 > ret) { OIC_LOG_V(FATAL, TAG, "select error %s", strerror(errno)); } return; } CASelectReturned(&readFds, ret); } static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; if (g_acceptServerFD != -1 && FD_ISSET(g_acceptServerFD, readFds)) { CAAcceptConnection(); return; } else if (-1 != caglobals.tcp.connectionFds[0] && FD_ISSET(caglobals.tcp.connectionFds[0], readFds)) { // new connection was created from remote device. // exit the function to update read file descriptor. char buf[MAX_ADDR_STR_SIZE_CA] = {0}; ssize_t len = read(caglobals.tcp.connectionFds[0], buf, sizeof (buf)); if (-1 == len) { return; } OIC_LOG_V(DEBUG, TAG, "Received new connection event with [%s]", buf); FD_CLR(caglobals.tcp.connectionFds[0], readFds); return; } else { uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && svritem->fd >= 0) { if (FD_ISSET(svritem->fd, readFds)) { CAReceiveMessage(svritem->fd); FD_CLR(svritem->fd, readFds); } } } } }
static void CAFindReadyMessage() { fd_set readFds; struct timeval timeout = { .tv_sec = caglobals.tcp.selectTimeout }; FD_ZERO(&readFds); if (-1 != g_acceptServerFD) { FD_SET(g_acceptServerFD, &readFds); } if (-1 != caglobals.tcp.shutdownFds[0]) { FD_SET(caglobals.tcp.shutdownFds[0], &readFds); } uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && 0 <= svritem->fd) { FD_SET(svritem->fd, &readFds); } } int ret = select(caglobals.tcp.maxfd + 1, &readFds, NULL, NULL, &timeout); if (caglobals.tcp.terminate) { OIC_LOG_V(DEBUG, TAG, "Packet receiver Stop request received."); return; } if (0 >= ret) { if (0 > ret) { OIC_LOG_V(FATAL, TAG, "select error %s", strerror(errno)); } return; } CASelectReturned(&readFds, ret); } static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; if (g_acceptServerFD != -1 && FD_ISSET(g_acceptServerFD, readFds)) { CAAcceptConnection(); return; } else { uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && svritem->fd >= 0) { if (FD_ISSET(svritem->fd, readFds)) { CAReceiveMessage(svritem->fd); FD_CLR(svritem->fd, readFds); } } } } }