Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jan 2007 22:14:01 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 113733 for review
Message-ID:  <200701302214.l0UME18J071234@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701302214.l0UME18J071234>