version 1.1.2.5, 2013/06/25 16:53:15
|
version 1.3.24.1, 2013/12/04 12:19:55
|
Line 61 static void *
|
Line 61 static void *
|
ShowPkt(void *buffer) |
ShowPkt(void *buffer) |
{ |
{ |
char Proto = 0, szStr[BUFSIZ], szLine[BUFSIZ], szWrk[BUFSIZ], szShow[USHRT_MAX] = { 0 }; |
char Proto = 0, szStr[BUFSIZ], szLine[BUFSIZ], szWrk[BUFSIZ], szShow[USHRT_MAX] = { 0 }; |
struct bpf_hdr *bpf = buffer; |
|
#ifdef __FreeBSD__ |
#ifdef __FreeBSD__ |
struct bpf_zbuf_header *bzh = buffer; |
struct bpf_zbuf_header *bzh = buffer; |
struct icmphdr *icmp; |
struct icmphdr *icmp; |
Line 78 ShowPkt(void *buffer)
|
Line 77 ShowPkt(void *buffer)
|
|
|
assert(buffer); |
assert(buffer); |
|
|
#ifdef __FreeBSD__ | eth = (struct ether_header *) buffer; |
snprintf(szLine, BUFSIZ, "#Packet length: %d\n>>> Ethernet ...\n", flg ? bzh->bzh_kernel_len : bpf->bh_datalen); | |
strlcat(szShow, szLine, USHRT_MAX); | |
eth = (struct ether_header *) (buffer + (flg ? bzh->bzh_kernel_len : bpf->bh_hdrlen)); | |
#else | |
snprintf(szLine, BUFSIZ, "#Packet length: %d\n>>> Ethernet ...\n", bpf->bh_datalen); | |
strlcat(szShow, szLine, USHRT_MAX); | |
eth = (struct ether_header *) (buffer + bpf->bh_hdrlen); | |
#endif | |
|
|
switch (ntohs(eth->ether_type)) { |
switch (ntohs(eth->ether_type)) { |
case ETHERTYPE_ARP: |
case ETHERTYPE_ARP: |
Line 246 ShowPkt(void *buffer)
|
Line 237 ShowPkt(void *buffer)
|
} |
} |
|
|
printf("%s===\n", szShow); |
printf("%s===\n", szShow); |
pthread_exit(NULL); | return NULL; |
} |
} |
|
|
// ---------------------- |
// ---------------------- |
Line 257 main(int argc, char **argv)
|
Line 248 main(int argc, char **argv)
|
u_int n, count = (u_int) -1; |
u_int n, count = (u_int) -1; |
register int i; |
register int i; |
int dev, fd, ret, siz = 0; |
int dev, fd, ret, siz = 0; |
char szStr[BUFSIZ], szMap[MAXPATHLEN] = { 0 }, *buffer = NULL; | char szStr[BUFSIZ], szEA[STRSIZ], szMap[MAXPATHLEN] = { 0 }, *buffer = NULL; |
struct ifreq ifr; |
struct ifreq ifr; |
struct pollfd pfd = { 0 }; |
struct pollfd pfd = { 0 }; |
pthread_t tid; |
pthread_t tid; |
char ch, mode = 'R'; |
char ch, mode = 'R'; |
struct timespec ts_start, ts_end; |
struct timespec ts_start, ts_end; |
void *bz = NULL; |
void *bz = NULL; |
|
ether_addr_t ea; |
|
|
while ((ch = getopt(argc, argv, "hvwzs:p:f:")) != -1) |
while ((ch = getopt(argc, argv, "hvwzs:p:f:")) != -1) |
switch (ch) { |
switch (ch) { |
Line 299 main(int argc, char **argv)
|
Line 291 main(int argc, char **argv)
|
else |
else |
strlcpy(szStr, *argv, sizeof szStr); |
strlcpy(szStr, *argv, sizeof szStr); |
|
|
|
printf("io_getmaciface(%s) -> %d\n", szStr, io_getmaciface(szStr, &ea)); |
|
e_ether_ntoa(&ea, szEA, sizeof szEA); |
|
printf("ethernet address is %s\n", szEA); |
|
|
#ifdef __FreeBSD__ |
#ifdef __FreeBSD__ |
dev = io_etherOpen(szStr, O_RDWR, 42, (u_int*) &siz, &bz); | dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, (flg) ? &bz : NULL); |
if (dev == -1) |
if (dev == -1) |
dev = io_etherOpen(szStr, O_RDWR, 42, (u_int*) &siz, NULL); | dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, NULL); |
#else |
#else |
dev = io_etherOpen(szStr, O_RDWR, 42, (u_int*) &siz, NULL); | dev = io_etherOpen(szStr, O_RDWR, 42, 0, (u_int*) &siz, NULL); |
#endif |
#endif |
if (dev == -1) { |
if (dev == -1) { |
printf("Error:: #%d - %s\n", io_GetErrno(), io_GetError()); |
printf("Error:: #%d - %s\n", io_GetErrno(), io_GetError()); |
Line 312 main(int argc, char **argv)
|
Line 308 main(int argc, char **argv)
|
} else |
} else |
printf("dev=%d(%s)\n", dev, szStr); |
printf("dev=%d(%s)\n", dev, szStr); |
|
|
if (ioctl(dev, BIOCGBLEN, &n) == -1) { | if (ioctl(dev, BIOCGBLEN, &siz) == -1) { |
perror("ioctl(BIOCGBLEN)"); |
perror("ioctl(BIOCGBLEN)"); |
io_etherClose(dev, &bz); |
io_etherClose(dev, &bz); |
return 1; |
return 1; |
} else |
} else |
printf("BPF buffer len=%d\n", n); | printf("BPF buffer len=%d\n", siz); |
|
|
if (!flg) { | if (*szMap) { |
if (*szMap) { | fd = open(szMap, O_RDWR); |
fd = open(szMap, O_RDWR); | if (fd == -1) { |
if (fd == -1) { | perror("open(map)"); |
perror("open(map)"); | |
io_etherClose(dev, &bz); | |
return 1; | |
} | |
buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); | |
close(fd); | |
} else | |
buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); | |
if (buffer == MAP_FAILED) { | |
perror("mmap()"); | |
io_etherClose(dev, &bz); |
io_etherClose(dev, &bz); |
return 1; |
return 1; |
} |
} |
|
buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); |
|
close(fd); |
|
} else |
|
buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); |
|
if (buffer == MAP_FAILED) { |
|
perror("mmap()"); |
|
io_etherClose(dev, &bz); |
|
return 1; |
} |
} |
|
|
pfd.fd = dev; |
pfd.fd = dev; |
Line 343 main(int argc, char **argv)
|
Line 337 main(int argc, char **argv)
|
if (mode == 'R') { |
if (mode == 'R') { |
pfd.events = POLLIN; |
pfd.events = POLLIN; |
for (i = 0; i < count; i++) { |
for (i = 0; i < count; i++) { |
if (poll(&pfd, 1, -1) == -1) | if ((ret = poll(&pfd, 1, -1)) == -1) |
break; |
break; |
|
|
#if 0 | ret = io_etherRecv(dev, buffer, siz, bz); |
#ifdef __FreeBSD__ | if (!ret) |
if (flg) { | continue; |
if (!NEXT_zbuf((void**) &buffer, &bz, &ret)) | if (ret == -1) |
continue; | printf("%d) io_etherRecv(%d) #%d - %s\n", i, ret, |
if (Verbose) { | io_GetErrno(), io_GetError()); |
printf("+readed %d bytes\n", ret); | if (Verbose) { |
pthread_create(&tid, NULL, ShowPkt, buffer); | printf("%d) +readed %d bytes\n", i, ret); |
} | ShowPkt(buffer); |
} else { | |
#endif | |
ret = read(dev, buffer, siz); | |
if (ret == -1) | |
printf("%d) read(%d) #%d - %s\n", i, ret, errno, strerror(errno)); | |
if (Verbose) { | |
printf("%d) +readed %d bytes\n", i, ret); | |
pthread_create(&tid, NULL, ShowPkt, buffer); | |
} | |
#ifdef __FreeBSD__ | |
} |
} |
#endif |
|
#endif |
|
} |
} |
} else { |
} else { |
pfd.events = POLLOUT; |
pfd.events = POLLOUT; |
Line 384 main(int argc, char **argv)
|
Line 366 main(int argc, char **argv)
|
} |
} |
assert(!clock_gettime(CLOCK_REALTIME, &ts_end)); |
assert(!clock_gettime(CLOCK_REALTIME, &ts_end)); |
|
|
if (!flg) | munmap(buffer, siz); |
munmap(buffer, siz); | |
io_etherClose(dev, &bz); |
io_etherClose(dev, &bz); |
|
|
time_spec_sub(&ts_end, &ts_start); |
time_spec_sub(&ts_end, &ts_start); |