/** * Creates listening socket to serve as a conduit between userland * applications and the system. Starts listening on all sockets * thereafter. */ void initiate_backend(engine *eng) { TRACE_BACKEND_FUNC_START(); struct pollfd pollfd[MAX_INLINKS]; uint polli; uint i; /* initializing main while loop parameters */ polli = 0; memset(pollfd, 0, sizeof(pollfd)); /* create listening socket */ create_listening_socket_for_eng(eng); TRACE_LOG("Engine %s is listening on port %d\n", eng->name, eng->listen_port); /* adjust pcapr context in engine */ if (!strcmp(eng->FIRST_BRICK(esrc)->brick->elib->getId(), "PcapReader")) { eng->pcapr_context = eng->FIRST_BRICK(esrc)->brick->private_data; } /* register iom socket */ for (i = 0; i < eng->no_of_sources; i++) { pollfd[polli].fd = eng->esrc[i]->dev_fd; pollfd[polli].events = POLLIN | POLLRDNORM; pollfd[polli].revents = 0; ++polli; } /* keep on running till engine stops */ while (eng->run == 1) { i = poll(pollfd, polli+1, 2500); /* if no packet came up, try polling again */ if (i <= 0) continue; for (i = 0; i < eng->no_of_sources; i++) if (!(pollfd[i].revents & POLLERR)) eng->iom.callback(eng->esrc[i]); #if 0 /* XXX - temporarily disabled */ /* process app reqs */ else if ((int)chlist[n].ident == eng->listen_fd) process_request_backend(eng, chlist); #endif /* pcap handling.. */ if (eng->pcapr_context != NULL) process_pcap_read_request(eng, eng->pcapr_context); } TRACE_BACKEND_FUNC_END(); }
/** * Creates listening socket to serve as a conduit between userland * applications and the system. Starts listening on all sockets * thereafter. */ void initiate_backend(engine *eng) { TRACE_BACKEND_FUNC_START(); struct epoll_event ev, events[EPOLL_MAX_EVENTS]; int epoll_fd, nfds, n; uint i, dev_flag; dev_flag = 0; /* set up the epolling structure */ epoll_fd = epoll_create(EPOLL_MAX_EVENTS); if (epoll_fd == -1) { TRACE_LOG("Engine %s failed to create an epoll fd!\n", eng->name); TRACE_BACKEND_FUNC_END(); return; } /* create listening socket */ create_listening_socket_for_eng(eng); /* register listening socket */ ev.events = EPOLLIN | EPOLLOUT; ev.data.fd = eng->listen_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, eng->listen_fd, &ev) == -1) { TRACE_LOG("Engine %s failed to exe epoll_ctl for fd: %d\n", eng->name, epoll_fd); TRACE_BACKEND_FUNC_END(); return; } TRACE_LOG("Engine %s is listening on port %d\n", eng->name, eng->listen_port); /* adjust pcapr context in engine */ if (!strcmp(eng->FIRST_BRICK(esrc)->brick->elib->getId(), "PcapReader")) { eng->pcapr_context = eng->FIRST_BRICK(esrc)->brick->private_data; } /* register iom socket */ for (i = 0; i < eng->no_of_sources; i++) { ev.events = EPOLLIN; ev.data.fd = eng->esrc[i]->dev_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, eng->esrc[i]->dev_fd, &ev) == -1) { TRACE_LOG("Engine %s failed to exe epoll_ctl for fd: %d\n", eng->name, epoll_fd); TRACE_BACKEND_FUNC_END(); return; } } /* keep on running till engine stops */ while (eng->run == 1) { nfds = epoll_wait(epoll_fd, events, EPOLL_MAX_EVENTS, EPOLL_TIMEOUT); if (nfds == -1) { TRACE_ERR("epoll error (engine: %s)\n", eng->name); TRACE_BACKEND_FUNC_END(); } for (n = 0; n < nfds; n++) { /* process dev work (check for all devs) */ for (i = 0; i < eng->no_of_sources; i++) { if (events[n].data.fd == eng->esrc[i]->dev_fd) { eng->iom.callback(eng->esrc[i]); /* continue epolling */ ev.data.fd = eng->esrc[i]->dev_fd; ev.events = EPOLLIN; if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, ev.data.fd, &ev) == -1) { TRACE_LOG("Engine %s failed to exe epoll_ctl for fd: %d\n", eng->name, epoll_fd); TRACE_BACKEND_FUNC_END(); return; } dev_flag = 1; } } if (dev_flag == 1) { dev_flag = 0; continue; } /* process app reqs */ if (events[n].data.fd == eng->listen_fd) process_request_backend(eng, epoll_fd); else {/* all other reqs coming from client socks */ ev.data.fd = events[n].data.fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, ev.data.fd, &ev) == -1) { TRACE_ERR("Can't delete client sock for epolling!\n"); TRACE_BACKEND_FUNC_END(); } close(ev.data.fd); } } /* pcap handling.. */ if (eng->pcapr_context != NULL) process_pcap_read_request(eng, eng->pcapr_context); } TRACE_BACKEND_FUNC_END(); }