Date: Wed, 31 Jan 2007 14:58:12 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 113764 for review Message-ID: <200701311458.l0VEwCdc002317@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113764 Change 113764 by rwatson@rwatson_cinnamon on 2007/01/31 14:57:30 Also call poll and select to see what the status of a bpf device is once a second. Set immediate mode. Probably want a run-time flag for this. Affected files ... .. //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.c#3 edit Differences ... ==== //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.c#3 (text+ko) ==== @@ -38,6 +38,8 @@ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/mman.h> +#include <sys/poll.h> +#include <sys/select.h> #include <sys/socket.h> #include <net/if.h> @@ -46,6 +48,7 @@ #include <err.h> #include <limits.h> #include <stdio.h> +#include <string.h> #include <unistd.h> #include "zbuf_tap.h" @@ -55,9 +58,12 @@ { u_char *bufa, *bufb, *buf; u_int buflen, maxbuflen; + struct pollfd pollfd; char name[PATH_MAX]; int bpf_fd, tap_fd; + struct timeval tv; int i, tap_unit; + fd_set set; buflen = getpagesize() * 2; @@ -91,6 +97,9 @@ if (bpf_setzbuf(bpf_fd, bufa, bufb, buflen) < 0) err(-1, "bpf_setzbuf"); + if (bpf_setimmediate(bpf_fd, 1) < 0) + err(-1, "bpf_setimmediate"); + if (bpf_captureall(bpf_fd) < 0) err(-1, "bpf_captureall"); @@ -100,13 +109,43 @@ while (1) { sleep(1); + /* + * Exercise various poll mechanisms to see which say + * something is ready to read. + */ if (bpf_getznext(bpf_fd, (void **)&buf, &buflen) < 0) err(-1, "bpf_getznext"); printf("bpf_getznext returned (0x%x, %d)\n", (uintptr_t)buf, buflen); + if (ioctl(bpf_fd, FIONREAD, &i) < 0) err(-1, "ioctl(FIONREAD)"); printf("FIONREAD returned %d\n", i); + + bzero(&pollfd, sizeof(pollfd)); + pollfd.fd = bpf_fd; + pollfd.events = POLLIN; + i = poll(&pollfd, 1, 0); + if (i < 0) + err(-1, "poll"); + if (i == 0) + printf("poll returned 0\n"); + else + printf("poll returned revents of 0x%x\n", + pollfd.revents); + + FD_ZERO(&set); + FD_SET(bpf_fd, &set); + bzero(&tv, sizeof(tv)); + tv.tv_sec = 0; + tv.tv_usec = 0; + if (select(bpf_fd + 1, &set, NULL, NULL, &tv) < 0) + err(-1, "select"); + if (FD_ISSET(bpf_fd, &set)) + printf("select returned readable\n"); + else + printf("select returned not readable\n"); + if (buf != NULL) { if (bpf_ackzbuf(bpf_fd, buf, buflen) < 0) err(-1, "bpf_ackzbuf(0x%x, %d)",
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701311458.l0VEwCdc002317>