PERFORCE change 113733 for review
Robert Watson
rwatson at FreeBSD.org
Tue Jan 30 22:14:03 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=113733
Change 113733 by rwatson at 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);
More information about the p4-projects
mailing list