예제 #1
0
/**
 * Simulate a Netmap NIOCRXSYNC ioctl:
 */
static int
ioctl_niocrxsync(int fd)
{
	uint32_t idx, port;

	idx = FD_TO_IDX(fd);
	if ((port = fd_port[idx].port) < RTE_DIM(ports) &&
			ports[port].fd == idx) {
		return (rx_sync_if(fd_port[idx].port));
	} else  {
		return (-EINVAL);
	}
}
예제 #2
0
/**
 * Doesn't support timeout other than 0 or infinite (negative) timeout
 */
int
rte_netmap_poll(struct pollfd *fds, nfds_t nfds, int timeout)
{
    int32_t count_it, ret;
    uint32_t i, idx, port;
    uint32_t want_rx, want_tx;

    if (timeout > 0)
        return -1;

    ret = 0;
    do {
        for (i = 0; i < nfds; i++) {

            count_it = 0;

            if (!FD_VALID(fds[i].fd) || fds[i].events == 0) {
                fds[i].revents = 0;
                continue;
            }

            idx = FD_TO_IDX(fds[i].fd);
            if ((port = fd_port[idx].port) >= RTE_DIM(ports) ||
                    ports[port].fd != idx) {

                fds[i].revents |= POLLERR;
                ret++;
                continue;
            }

            want_rx = fds[i].events & (POLLIN  | POLLRDNORM);
            want_tx = fds[i].events & (POLLOUT | POLLWRNORM);

            if (want_rx && rx_sync_if(port) > 0) {
                fds[i].revents = (uint16_t)
                                 (fds[i].revents | want_rx);
                count_it = 1;
            }
            if (want_tx && tx_sync_if(port) > 0) {
                fds[i].revents = (uint16_t)
                                 (fds[i].revents | want_tx);
                count_it = 1;
            }

            ret += count_it;
        }
    }
    while ((ret == 0 && timeout < 0) || timeout);

    return ret;
}