version 1.1.2.10, 2013/06/25 09:29:34
|
version 1.1.2.11, 2013/06/25 10:58:22
|
Line 97 allocZCbuf(u_int len)
|
Line 97 allocZCbuf(u_int len)
|
int |
int |
io_etherOpen(const char *csIface, int flags, int whdr, u_int *buflen, void **zcbuf) |
io_etherOpen(const char *csIface, int flags, int whdr, u_int *buflen, void **zcbuf) |
{ |
{ |
int n = 1, eth = -1; | int eth = -1; |
register int i; |
register int i; |
char szStr[STRSIZ]; |
char szStr[STRSIZ]; |
struct ifreq ifr; |
struct ifreq ifr; |
|
u_int n = 1; |
|
|
|
#ifndef __FreeBSD__ |
|
if (zcbuf) { |
|
io_SetErr(ENOTSUP, "bpf zero copy buffer mode is not supported"); |
|
return -1; |
|
} |
|
#endif |
|
|
for (i = 0; i < BPF_DEV_MAX; i++) { |
for (i = 0; i < BPF_DEV_MAX; i++) { |
memset(szStr, 0, sizeof szStr); |
memset(szStr, 0, sizeof szStr); |
snprintf(szStr, sizeof szStr, "/dev/bpf%d", i); |
snprintf(szStr, sizeof szStr, "/dev/bpf%d", i); |
Line 124 io_etherOpen(const char *csIface, int flags, int whdr,
|
Line 132 io_etherOpen(const char *csIface, int flags, int whdr,
|
close(eth); |
close(eth); |
return -1; |
return -1; |
} |
} |
if (buflen && *buflen) { | |
if (!zcbuf) { | if (!zcbuf) { |
if (ioctl(eth, BIOCSBLEN, buflen) == -1) { | if (ioctl(eth, BIOCGBLEN, &n) == -1) { |
LOGERR; | LOGERR; |
close(eth); | close(eth); |
return -1; | return -1; |
} | } else |
} else { | n = (buflen && *buflen) ? MIN(n, *buflen) : n; |
| if (ioctl(eth, BIOCSBLEN, &n) == -1) { |
| LOGERR; |
| close(eth); |
| return -1; |
| } |
| if (buflen && *buflen) |
| *buflen = n; |
| } else { |
#ifdef __FreeBSD__ |
#ifdef __FreeBSD__ |
n = BPF_BUFMODE_ZBUF; | n = BPF_BUFMODE_ZBUF; |
if (ioctl(eth, BIOCSETBUFMODE, &n) == -1) { | if (ioctl(eth, BIOCSETBUFMODE, &n) == -1) { |
LOGERR; | LOGERR; |
close(eth); | close(eth); |
return -1; | return -1; |
} | |
if (ioctl(eth, BIOCGETZMAX, &n) == -1) { | |
LOGERR; | |
close(eth); | |
return -1; | |
} else | |
*buflen = MIN(n, *buflen); | |
if (!(*zcbuf = allocZCbuf(*buflen))) { | |
close(eth); | |
return -1; | |
} | |
if (ioctl(eth, BIOCSETZBUF, (struct bpf_zbuf*) *zcbuf) == -1) { | |
LOGERR; | |
io_etherClose(eth, zcbuf); | |
return -1; | |
} | |
#endif | |
} |
} |
|
if (ioctl(eth, BIOCGETZMAX, &n) == -1) { |
|
LOGERR; |
|
close(eth); |
|
return -1; |
|
} else |
|
n = (buflen && *buflen) ? MIN(n, *buflen) : n; |
|
if (!(*zcbuf = allocZCbuf(n))) { |
|
close(eth); |
|
return -1; |
|
} |
|
if (ioctl(eth, BIOCSETZBUF, (struct bpf_zbuf*) *zcbuf) == -1) { |
|
LOGERR; |
|
io_etherClose(eth, zcbuf); |
|
return -1; |
|
} |
|
if (buflen && *buflen) |
|
*buflen = n; |
|
#endif |
} |
} |
|
|
if (csIface) |
if (csIface) |
strlcpy(szStr, csIface, sizeof szStr); |
strlcpy(szStr, csIface, sizeof szStr); |
else if (io_get1stiface(szStr, sizeof szStr) == -1) { |
else if (io_get1stiface(szStr, sizeof szStr) == -1) { |