Beispiel #1
0
/**
 * 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();
}
Beispiel #2
0
/**
 * 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 dev_flag, i;

	/* initializing main while loop parameters */
	dev_flag = 0;
	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);

	/* 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++)
			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
	}
Beispiel #3
0
/**
 * 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();
}