From owner-p4-projects@FreeBSD.ORG Tue Jan 30 22:14:02 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 F138316A979; Tue, 30 Jan 2007 22:14:01 +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 AC0F716A8FA for ; Tue, 30 Jan 2007 22:14:01 +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 9BCBA13C47E for ; Tue, 30 Jan 2007 22:14:01 +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 l0UME1SW071237 for ; Tue, 30 Jan 2007 22:14:01 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 l0UME18J071234 for perforce@freebsd.org; Tue, 30 Jan 2007 22:14:01 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Tue, 30 Jan 2007 22:14:01 GMT Message-Id: <200701302214.l0UME18J071234@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 113733 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: Tue, 30 Jan 2007 22:14:03 -0000 http://perforce.freebsd.org/chv.cgi?CH=113733 Change 113733 by rwatson@rwatson_cinnamon on 2007/01/30 22:13:21 Rather than offering two length fields in bpf_zbuf (which must be equal), just have one length avoiding the whole issue. Affected files ... .. //depot/projects/zcopybpf/src/sys/net/bpf.h#3 edit .. //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.c#2 edit .. //depot/projects/zcopybpf/utils/zbuf_ioctl/zbuf_ioctl.c#2 edit .. //depot/projects/zcopybpf/utils/zbuf_tap/bpf_util.c#2 edit .. //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.c#2 edit .. //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.h#2 edit Differences ... ==== //depot/projects/zcopybpf/src/sys/net/bpf.h#3 (text+ko) ==== @@ -119,9 +119,8 @@ */ struct bpf_zbuf { void *bz_bufa; /* Location of 'a' zero-copy buffer. */ - size_t bz_bufalen; /* Size of 'a' zero-copy buffer. */ void *bz_bufb; /* Location of 'b' zero-copy buffer. */ - size_t bz_bufblen; /* Size of 'b' zero-copy buffer. */ + size_t bz_buflen; /* Size of zero-copy buffers. */ }; #define BIOCGBLEN _IOR('B',102, u_int) ==== //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.c#2 (text+ko) ==== @@ -398,8 +398,8 @@ ("bpf_zerocopy_ioctl_ackzbuf: not in zbuf mode")); // printf("bpf_zerocopy_ioctl_ackzbuf(td: %p, pid: %d, d: %p, " - // "bz.bz_bufa: %p, bz.bz_bufalen: %d)\n", td, td->td_proc->p_pid, - // d, bz->bz_bufa, bz->bz_bufalen); + // "bz.bz_bufa: %p, bz.bz_buflen: %d)\n", td, td->td_proc->p_pid, + // d, bz->bz_bufa, bz->bz_buflen); BPFD_LOCK(d); if (d->bd_hbuf == NULL) { @@ -445,20 +445,18 @@ if (d->bd_hbuf != NULL) { zb = (struct zbuf *)d->bd_hbuf; bz->bz_bufa = (void *)zb->zb_uaddr; - bz->bz_bufalen = zb->zb_size; + bz->bz_buflen = zb->zb_size; zb = (struct zbuf *)d->bd_sbuf; bz->bz_bufb = (void *)zb->zb_uaddr; - bz->bz_bufblen = zb->zb_size; } else if (d->bd_sbuf != NULL) { zb = (struct zbuf *)d->bd_sbuf; bz->bz_bufa = (void *)zb->zb_uaddr; - bz->bz_bufalen = zb->zb_size; + bz->bz_buflen = zb->zb_size; zb = (struct zbuf *)d->bd_fbuf; bz->bz_bufb = (void *)zb->zb_uaddr; - bz->bz_bufblen = zb->zb_size; } else { bz->bz_bufa = bz->bz_bufb = NULL; - bz->bz_bufalen = bz->bz_bufblen = 0; + bz->bz_buflen = 0; } BPFD_UNLOCK(d); return (0); @@ -503,7 +501,7 @@ if (d->bd_hbuf != NULL) { zb = (struct zbuf *)d->bd_hbuf; bz->bz_bufa = (void *)zb->zb_uaddr; - bz->bz_bufalen = zb->zb_size; + bz->bz_buflen = zb->zb_size; } BPFD_UNLOCK(d); return (0); @@ -532,13 +530,10 @@ return (EINVAL); /* - * Both buffers must be the same size and must not be zero in size. - * Alignment and other size validity checking is done in - * zbuf_setup(). + * Buffers must have a size greater than 0. Alignment and other size + * validity checking is done in zbuf_setup(). */ - if (bz->bz_bufalen != bz->bz_bufblen) - return (EINVAL); - if (bz->bz_bufalen == 0) + if (bz->bz_buflen == 0) return (EINVAL); /* @@ -556,12 +551,12 @@ /* * Allocate new buffers if required. */ - error = zbuf_setup(td, (vm_offset_t)bz->bz_bufa, bz->bz_bufalen, + error = zbuf_setup(td, (vm_offset_t)bz->bz_bufa, bz->bz_buflen, &zba); if (error) return (error); - error = zbuf_setup(td, (vm_offset_t)bz->bz_bufb, bz->bz_bufblen, + error = zbuf_setup(td, (vm_offset_t)bz->bz_bufb, bz->bz_buflen, &zbb); if (error) { zbuf_free(zba); @@ -583,7 +578,7 @@ d->bd_sbuf = (caddr_t)zba; d->bd_slen = 0; d->bd_hlen = 0; - d->bd_bufsize = bz->bz_bufalen; + d->bd_bufsize = bz->bz_buflen; BPFD_UNLOCK(d); return (0); } ==== //depot/projects/zcopybpf/utils/zbuf_ioctl/zbuf_ioctl.c#2 (text+ko) ==== @@ -54,17 +54,15 @@ bzero(&bz, sizeof(bz)); bz.bz_bufa = buf; - bz.bz_bufalen = buflen; bz.bz_bufb = (void *)0xffffffff; - bz.bz_bufalen = 0xffffffff; + bz.bz_buflen = buflen; if (ioctl(fd, BIOCACKZBUF, &bz) < 0) return (-1); return (0); } static int -bpf_getzbuf(int fd, char **bufa, size_t *bufalen, char **bufb, - size_t *bufblen) +bpf_getzbuf(int fd, char **bufa, char **bufb, size_t *buflen) { struct bpf_zbuf bz; @@ -72,22 +70,20 @@ if (ioctl(fd, BIOCGETZBUF, &bz) < 0) return (-1); *bufa = bz.bz_bufa; - *bufalen = bz.bz_bufalen; *bufb = bz.bz_bufb; - *bufblen = bz.bz_bufblen; + *buflen = bz.bz_buflen; return (0); } static int -bpf_setzbuf(int fd, char *bufa, size_t bufalen, char *bufb, size_t bufblen) +bpf_setzbuf(int fd, char *bufa, char *bufb, size_t buflen) { struct bpf_zbuf bz; bzero(&bz, sizeof(bz)); bz.bz_bufa = bufa; - bz.bz_bufalen = bufalen; bz.bz_bufb = bufb; - bz.bz_bufblen = bufblen; + bz.bz_buflen = buflen; if (ioctl(fd, BIOCSETZBUF, &bz) < 0) return (-1); return (0); @@ -117,11 +113,11 @@ * error. Abort program only if unable to set back to the original state. */ static void -bpf_test_setzbuf(char *desc, char *bufa, size_t bufalen, char *bufb, - size_t bufblen, int error) +bpf_test_setzbuf(char *desc, char *bufa, char *bufb, size_t buflen, + int error) { - size_t bufalen_check, bufblen_check; char *bufa_check, *bufb_check; + size_t buflen_check; int fd, ret; u_int mode; @@ -135,28 +131,31 @@ "bpf_test_setzbuf(%s): ioctl(BIOCSETBUFMODE, " "BPF_BUFMODE_ZBUF)", desc); - ret = bpf_setzbuf(fd, bufa, bufalen, bufb, bufblen); + ret = bpf_setzbuf(fd, bufa, bufb, buflen); if (ret == 0 && error != 0) { - warnx("bpf_test_setzbuf(%s): bpf_setzbuf(0x%x, %d, 0x%x, %d)" + warnx("bpf_test_setzbuf(%s): bpf_setzbuf(0x%x, 0x%x, %d)" " should fail with %d (%s) but returned 0", desc, - (uintptr_t)bufa, bufalen, (uintptr_t)bufb, bufblen, - error, strerror(error)); + (uintptr_t)bufa, (uintptr_t)bufb, buflen, error, + strerror(error)); goto out; } if (ret < 0 && error != errno) { - warnx("bpf_test_setzbuf(%s): bpf_setzbuf(0x%x, %d, 0x%x, %d)" + warnx("bpf_test_setzbuf(%s): bpf_setzbuf(0x%x, 0x%x, %d)" " should fail with %d (%s) but failed with %d (%s) " - "instead", desc, (uintptr_t)bufa, bufalen, - (uintptr_t)bufb, bufblen, error, strerror(error), errno, - strerror(errno)); + "instead", desc, (uintptr_t)bufa, (uintptr_t)bufb, + buflen, error, strerror(error), errno, strerror(errno)); goto out; } - ret = bpf_getzbuf(fd, &bufa_check, &bufalen_check, &bufb_check, - &bufblen_check); + ret = bpf_getzbuf(fd, &bufa_check, &bufb_check, &buflen_check); if (ret < 0) err(-1, "bpf_test_setzbuf(%s): bpf_getzbuf() to confirm " "results failed", desc); + if (bufa_check != bufa || bufb_check != bufb || + buflen != buflen_check) + errx(-1, "bpf_test_setzbuf(%s): getzbuf returned " + "(0x%x, 0x%x, %d)", desc, (uintptr_t)bufa_check, + (uintptr_t)bufb_check, buflen_check); out: close(fd); } @@ -180,11 +179,11 @@ int main(int argc, char *argv[]) { - size_t bufalen_real, bufblen_real, pagesize; + size_t buflen_real, pagesize; char *bufa_real, *bufb_real; pagesize = getpagesize(); - bufalen_real = bufblen_real = pagesize * USE_BUFFER_PAGES; + buflen_real = pagesize * USE_BUFFER_PAGES; bufa_real = mmap(NULL, pagesize * ALLOC_BUFFER_PAGES, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); @@ -200,55 +199,42 @@ /* * Query and make sure zbufs are not configured up front. */ - if (bpf_getzbuf(fd, &bufa, &bufalen, &bufb, &bufblen) < 0) + if (bpf_getzbuf(fd, &bufa, &bufb, &buflen) < 0) err(-1, "bpf_getzbuf"); #endif /* * Make sure that attempts to set just one buffer are rejected. */ - bpf_test_setzbuf("just_bufa", bufa_real, bufalen_real, NULL, 0, - EINVAL); - bpf_test_setzbuf("just_bufb", NULL, 0, bufb_real, bufblen_real, - EINVAL); + bpf_test_setzbuf("just_bufa", bufa_real, NULL, buflen_real, EINVAL); + bpf_test_setzbuf("just_bufb", NULL, bufb_real, buflen_real, EINVAL); /* * Set the aligned buffers with proper sizes. */ - bpf_test_setzbuf("align_good", bufa_real, bufalen_real, bufb_real, - bufblen_real, 0); + bpf_test_setzbuf("align_good", bufa_real, bufb_real, buflen_real, 0); /* * Try some non-aligned values. */ - bpf_test_setzbuf("nonalign_good", bufa_real, pagesize, bufb_real, - pagesize, 0); - bpf_test_setzbuf("nonalign_bufa", bufa_real + 4, pagesize, bufb_real, - pagesize, EINVAL); - bpf_test_setzbuf("nonalign_bufb", bufa_real, pagesize, bufb_real + 4, - pagesize, EINVAL); - bpf_test_setzbuf("nonalign_both", bufa_real + 4, pagesize, - bufb_real + 4, pagesize, EINVAL); + bpf_test_setzbuf("nonalign_good", bufa_real, bufb_real, pagesize, 0); + bpf_test_setzbuf("nonalign_bufa", bufa_real + 4, bufb_real, pagesize, + EINVAL); + bpf_test_setzbuf("nonalign_bufb", bufa_real, bufb_real + 4, pagesize, + EINVAL); /* - * Try some invalid sizes. + * Try an invalid size. */ - bpf_test_setzbuf("isize_good", bufa_real, pagesize, bufb_real, - pagesize, 0); - bpf_test_setzbuf("isize_bufa", bufa_real, pagesize + 4, bufb_real, - pagesize, EINVAL); - bpf_test_setzbuf("isize_bufb", bufa_real, pagesize, bufb_real, - pagesize + 4, EINVAL); - bpf_test_setzbuf("isize_both", bufa_real, pagesize + 4, bufb_real, - pagesize + 4, EINVAL); + bpf_test_setzbuf("isize_good", bufa_real, bufb_real, pagesize, 0); + bpf_test_setzbuf("isize_buflen", bufa_real, bufb_real, pagesize + 4, + EINVAL); /* * Try a ridiculously large size (based on a priori knowledge of the * size limit). */ - bpf_test_setzbuf("size_toobig", bufa_real, - ALLOC_BUFFER_PAGES * pagesize, bufb_real, pagesize, EINVAL); - bpf_test_setzbuf("size_toobig", bufa_real, pagesize, bufb_real, + bpf_test_setzbuf("size_toobig", bufa_real, bufb_real, ALLOC_BUFFER_PAGES * pagesize, EINVAL); /* @@ -263,8 +249,8 @@ if (bufa_real == MAP_FAILED) err(-1, "mmap"); - bpf_test_setzbuf("prot_readonly", bufa_real, pagesize, bufb_real, - pagesize, EFAULT); + bpf_test_setzbuf("prot_readonly", bufa_real, bufb_real, pagesize, + EFAULT); #if 0 /* @@ -280,20 +266,20 @@ if (bufa_real == MAP_FAILED) err(-1, "mmap"); - bpf_test_setzbuf("prot_writeonly", bufa_real, pagesize, bufb_real, - pagesize, EFAULT); + bpf_test_setzbuf("prot_writeonly", bufa_real, bufb_real, pagesize, + EFAULT); #endif if (munmap(bufa_real, pagesize * ALLOC_BUFFER_PAGES) < 0) err(-1, "munmap(bufa_real)"); - bufa_real = mmap(NULL, pagesize * ALLOC_BUFFER_PAGES, - 0, MAP_ANON, -1, 0); + bufa_real = mmap(NULL, pagesize * ALLOC_BUFFER_PAGES, 0, MAP_ANON, + -1, 0); if (bufa_real == MAP_FAILED) err(-1, "mmap"); - bpf_test_setzbuf("prot_none", bufa_real, pagesize, bufb_real, - pagesize, EFAULT); + bpf_test_setzbuf("prot_none", bufa_real, bufb_real, pagesize, + EFAULT); /* * Test other functions. ==== //depot/projects/zcopybpf/utils/zbuf_tap/bpf_util.c#2 (text+ko) ==== @@ -60,7 +60,7 @@ bzero(&bz, sizeof(bz)); bz.bz_bufa = buf; - bz.bz_bufalen = buflen; + bz.bz_buflen = buflen; if (ioctl(fd, BIOCACKZBUF, &bz) < 0) return (-1); return (0); @@ -105,7 +105,7 @@ if (ioctl(fd, BIOCGETZNEXT, &bz) < 0) return (-1); *buf = bz.bz_bufa; - *buflen = bz.bz_bufalen; + *buflen = bz.bz_buflen; return (0); } @@ -168,15 +168,14 @@ } int -bpf_setzbuf(int fd, void *bufa, u_int bufalen, void *bufb, u_int bufblen) +bpf_setzbuf(int fd, void *bufa, void *bufb, u_int buflen) { struct bpf_zbuf bz; bzero(&bz, sizeof(bz)); bz.bz_bufa = bufa; - bz.bz_bufalen = bufalen; bz.bz_bufb = bufb; - bz.bz_bufblen = bufblen; + bz.bz_buflen = buflen; if (ioctl(fd, BIOCSETZBUF, &bz) < 0) return (-1); ==== //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.c#2 (text+ko) ==== @@ -53,19 +53,19 @@ int main(int argc, char *argv[]) { - u_int bufalen, bufblen, buflen; u_char *bufa, *bufb, *buf; + u_int buflen, maxbuflen; char name[PATH_MAX]; int bpf_fd, tap_fd; int i, tap_unit; - bufblen = bufalen = getpagesize() * 2; + buflen = getpagesize() * 2; - bufa = mmap(NULL, bufalen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); + bufa = mmap(NULL, buflen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); if (bufa == MAP_FAILED) err(-1, "mmap"); - bufb = mmap(NULL, bufblen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); + bufb = mmap(NULL, buflen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); if (bufb == MAP_FAILED) err(-1, "mmap"); @@ -84,11 +84,11 @@ if (bpf_setbufmode(bpf_fd, BPF_BUFMODE_ZBUF) < 0) err(-1, "bpf_setbufmode(BPF_BUFMODE_ZBUF)"); - if (bpf_getzmax(bpf_fd, &buflen) < 0) + if (bpf_getzmax(bpf_fd, &maxbuflen) < 0) err(-1, "bpf_getzmax"); - printf("zmax: %d\n", buflen); + printf("zmax: %d\n", maxbuflen); - if (bpf_setzbuf(bpf_fd, bufa, bufalen, bufb, bufblen) < 0) + if (bpf_setzbuf(bpf_fd, bufa, bufb, buflen) < 0) err(-1, "bpf_setzbuf"); if (bpf_captureall(bpf_fd) < 0) @@ -100,7 +100,6 @@ while (1) { sleep(1); - if (bpf_getznext(bpf_fd, (void **)&buf, &buflen) < 0) err(-1, "bpf_getznext"); printf("bpf_getznext returned (0x%x, %d)\n", (uintptr_t)buf, @@ -110,8 +109,8 @@ printf("FIONREAD returned %d\n", i); if (buf != NULL) { if (bpf_ackzbuf(bpf_fd, buf, buflen) < 0) - err(-1, "bpf_ackzbuf(0x%x, %d)", (uintptr_t)buf, - buflen); + err(-1, "bpf_ackzbuf(0x%x, %d)", + (uintptr_t)buf, buflen); } } return (0); ==== //depot/projects/zcopybpf/utils/zbuf_tap/zbuf_tap.h#2 (text+ko) ==== @@ -41,8 +41,7 @@ int bpf_send(int fd, u_char *packet, u_int packetlen); int bpf_setbufmode(int fd, u_int bufmode); int bpf_setif(int fd, const char *ifname); -int bpf_setzbuf(int fd, void *bufa, u_int bufalen, void *bufb, - u_int bufblen); +int bpf_setzbuf(int fd, void *bufa, void *bufb, u_int buflen); void tap_close(int fd); int tap_getunit(int fd);