From owner-p4-projects@FreeBSD.ORG Wed Jan 31 14:58:13 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0EEEF16A50E; Wed, 31 Jan 2007 14:58:13 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C018A16A503 for ; Wed, 31 Jan 2007 14:58:12 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id ADBA413C49D for ; Wed, 31 Jan 2007 14:58:12 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0VEwC0j002320 for ; Wed, 31 Jan 2007 14:58:12 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0VEwCdc002317 for perforce@freebsd.org; Wed, 31 Jan 2007 14:58:12 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Wed, 31 Jan 2007 14:58:12 GMT Message-Id: <200701311458.l0VEwCdc002317@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Cc: Subject: PERFORCE change 113764 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Jan 2007 14:58:13 -0000 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 #include #include +#include +#include #include #include @@ -46,6 +48,7 @@ #include #include #include +#include #include #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)",