version 1.1.2.13, 2013/06/25 19:28:48
|
version 1.1.2.15, 2013/06/26 12:30:17
|
Line 122 io_etherOpen(const char *csIface, int flags, int whdr,
|
Line 122 io_etherOpen(const char *csIface, int flags, int whdr,
|
return -1; |
return -1; |
} |
} |
|
|
if (ioctl(eth, BIOCIMMEDIATE, &n) == -1) { |
|
LOGERR; |
|
close(eth); |
|
return -1; |
|
} |
|
if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) { |
|
LOGERR; |
|
close(eth); |
|
return -1; |
|
} |
|
|
|
if (!zcbuf) { |
if (!zcbuf) { |
if (ioctl(eth, BIOCGBLEN, &n) == -1) { |
if (ioctl(eth, BIOCGBLEN, &n) == -1) { |
LOGERR; |
LOGERR; |
Line 189 io_etherOpen(const char *csIface, int flags, int whdr,
|
Line 178 io_etherOpen(const char *csIface, int flags, int whdr,
|
return -1; |
return -1; |
} |
} |
|
|
|
n = 1; |
|
if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) { |
|
LOGERR; |
|
io_etherClose(eth, zcbuf); |
|
return -1; |
|
} |
|
if (ioctl(eth, BIOCIMMEDIATE, &n) == -1) { |
|
LOGERR; |
|
io_etherClose(eth, zcbuf); |
|
return -1; |
|
} |
|
|
return eth; |
return eth; |
} |
} |
|
|
Line 246 nextZCbuf(void ** __restrict zcache, struct bpf_zbuf *
|
Line 247 nextZCbuf(void ** __restrict zcache, struct bpf_zbuf *
|
buf = ((caddr_t) *zcache) + sizeof(struct bpf_zbuf_header); |
buf = ((caddr_t) *zcache) + sizeof(struct bpf_zbuf_header); |
ackZCbuf(bzh); |
ackZCbuf(bzh); |
} else |
} else |
io_SetErr(EAGAIN, "kernel owns the buffer"); | io_SetErr(EAGAIN, "kernel owns the buffer A"); |
} else if (*zcache == zbuf->bz_bufa) { |
} else if (*zcache == zbuf->bz_bufa) { |
bzh = (struct bpf_zbuf_header *) zbuf->bz_bufb; |
bzh = (struct bpf_zbuf_header *) zbuf->bz_bufb; |
if (chkZCbuf(bzh)) { |
if (chkZCbuf(bzh)) { |
Line 256 nextZCbuf(void ** __restrict zcache, struct bpf_zbuf *
|
Line 257 nextZCbuf(void ** __restrict zcache, struct bpf_zbuf *
|
buf = ((caddr_t) *zcache) + sizeof(struct bpf_zbuf_header); |
buf = ((caddr_t) *zcache) + sizeof(struct bpf_zbuf_header); |
ackZCbuf(bzh); |
ackZCbuf(bzh); |
} else |
} else |
io_SetErr(EAGAIN, "kernel owns the buffer"); | io_SetErr(EAGAIN, "kernel owns the buffer B"); |
} |
} |
|
|
return rlen; |
return rlen; |
Line 276 ssize_t
|
Line 277 ssize_t
|
io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf) |
io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf) |
{ |
{ |
ssize_t rlen = 0; |
ssize_t rlen = 0; |
void **zcache = NULL; | void *zcache = NULL; |
|
|
if (!buf || !buflen) { |
if (!buf || !buflen) { |
io_SetErr(EINVAL, "invalid arguments"); |
io_SetErr(EINVAL, "invalid arguments"); |
Line 289 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
Line 290 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
LOGERR; |
LOGERR; |
} else { |
} else { |
#ifdef __FreeBSD__ |
#ifdef __FreeBSD__ |
rlen = nextZCbuf(zcache, (struct bpf_zbuf*) zcbuf, buf); | rlen = nextZCbuf(&zcache, (struct bpf_zbuf*) zcbuf, buf); |
#else |
#else |
io_SetErr(ENOTSUP, "bpf zero copy buffer mode is not supported"); |
io_SetErr(ENOTSUP, "bpf zero copy buffer mode is not supported"); |
#endif |
#endif |