|
|
| version 1.1.2.2, 2013/06/25 09:22:10 | 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; |
| #ifdef __FreeBSD__ | void *bz = NULL; |
| struct bpf_zbuf *bz; | ether_addr_t ea; |
| #endif | |
| while ((ch = getopt(argc, argv, "hvwzs:p:f:")) != -1) | while ((ch = getopt(argc, argv, "hvwzs:p:f:")) != -1) |
| switch (ch) { | switch (ch) { |
| Line 301 main(int argc, char **argv) | Line 291 main(int argc, char **argv) |
| else | else |
| strlcpy(szStr, *argv, sizeof szStr); | strlcpy(szStr, *argv, sizeof szStr); |
| #ifdef __FreeBSD_ | printf("io_getmaciface(%s) -> %d\n", szStr, io_getmaciface(szStr, &ea)); |
| dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, &siz, &bz); | e_ether_ntoa(&ea, szEA, sizeof szEA); |
| printf("ethernet address is %s\n", szEA); | |
| #ifdef __FreeBSD__ | |
| dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, (flg) ? &bz : NULL); | |
| if (dev == -1) | |
| dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, NULL); | |
| #else | #else |
| dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, &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)"); |
| close(dev); | 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 0 | if (*szMap) { |
| #ifdef __FreeBSD__ | fd = open(szMap, O_RDWR); |
| ret = BPF_BUFMODE_ZBUF; | if (fd == -1) { |
| if (flg && !ioctl(dev, BIOCSETBUFMODE, (u_int*) &ret)) { | perror("open(map)"); |
| if (ioctl(dev, BIOCGETZMAX, &ret) == -1) { | io_etherClose(dev, &bz); |
| perror("ioctl(BIOCGETZMAX)"); | |
| close(dev); | |
| return 1; | return 1; |
| } | } |
| memset(&bz, 0, sizeof bz); | buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); |
| bz.bz_buflen = roundup(MIN(n, ret), getpagesize()); | close(fd); |
| bz.bz_bufa = mmap(NULL, bz.bz_buflen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); | } else |
| bz.bz_bufb = mmap(NULL, bz.bz_buflen, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); | buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); |
| if (bz.bz_bufa == MAP_FAILED || bz.bz_bufb == MAP_FAILED) { | if (buffer == MAP_FAILED) { |
| perror("mmap()"); | perror("mmap()"); |
| close(dev); | io_etherClose(dev, &bz); |
| return 1; | |
| } | |
| if (ioctl(dev, BIOCSETZBUF, &bz) == -1) { | |
| perror("ioctl(BIOCSETZBUF)"); | |
| munmap(bz.bz_bufa, bz.bz_buflen); | |
| munmap(bz.bz_bufb, bz.bz_buflen); | |
| close(dev); | |
| return 1; | |
| } else | |
| siz = bz.bz_buflen; | |
| } else { | |
| #endif | |
| flg = 0; | |
| if (siz) { | |
| if (ioctl(dev, BIOCSBLEN, &siz) == -1) { | |
| perror("ioctl(BIOCSBLEN)"); | |
| close(dev); | |
| return 1; | |
| } | |
| } else | |
| siz = n; | |
| #ifdef __FreeBSD__ | |
| } | |
| #endif | |
| printf("Set buffer len to %d\n", siz); | |
| if (!flg) { | |
| if (*szMap) { | |
| fd = open(szMap, O_RDWR); | |
| if (fd == -1) { | |
| perror("open(map)"); | |
| close(dev); | |
| 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()"); | |
| close(dev); | |
| return 1; | |
| } | |
| } | |
| memset(&ifr, 0, sizeof ifr); | |
| strlcpy(ifr.ifr_name, szStr, sizeof ifr.ifr_name); | |
| if (ioctl(dev, BIOCSETIF, (char*) &ifr) == -1) { | |
| perror("ioctl(BIOCSETIF)"); | |
| close(dev); | |
| #ifdef __FreeBSD__ | |
| if (flg) { | |
| munmap(bz.bz_bufa, bz.bz_buflen); | |
| munmap(bz.bz_bufb, bz.bz_buflen); | |
| } else | |
| #endif | |
| munmap(buffer, siz); | |
| return 1; | return 1; |
| } | } |
| n = 1; | |
| if (ioctl(dev, BIOCSHDRCMPLT, &n) == -1) { | |
| perror("ioctl(BIOCSHDRCMPLT)"); | |
| close(dev); | |
| #ifdef __FreeBSD__ | |
| if (flg) { | |
| munmap(bz.bz_bufa, bz.bz_buflen); | |
| munmap(bz.bz_bufb, bz.bz_buflen); | |
| } else | |
| #endif | |
| munmap(buffer, siz); | |
| return 1; | |
| } | |
| if (ioctl(dev, BIOCIMMEDIATE, &n) == -1) { | |
| perror("ioctl(BIOCIMMEDIATE)"); | |
| close(dev); | |
| #ifdef __FreeBSD__ | |
| if (flg) { | |
| munmap(bz.bz_bufa, bz.bz_buflen); | |
| munmap(bz.bz_bufb, bz.bz_buflen); | |
| } else | |
| #endif | |
| munmap(buffer, siz); | |
| return 1; | |
| } | |
| pfd.fd = dev; | pfd.fd = dev; |
| assert(!clock_gettime(CLOCK_REALTIME, &ts_start)); | assert(!clock_gettime(CLOCK_REALTIME, &ts_start)); |
| 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; |
| #ifdef __FreeBSD__ | ret = io_etherRecv(dev, buffer, siz, bz); |
| if (flg) { | if (!ret) |
| if (!NEXT_zbuf((void**) &buffer, &bz, &ret)) | continue; |
| continue; | if (ret == -1) |
| if (Verbose) { | printf("%d) io_etherRecv(%d) #%d - %s\n", i, ret, |
| printf("+readed %d bytes\n", ret); | io_GetErrno(), io_GetError()); |
| pthread_create(&tid, NULL, ShowPkt, buffer); | if (Verbose) { |
| } | printf("%d) +readed %d bytes\n", i, ret); |
| } else { | ShowPkt(buffer); |
| #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 | |
| } | } |
| } else { | } else { |
| pfd.events = POLLOUT; | pfd.events = POLLOUT; |
| for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { |
| #ifdef __FreeBSD__ | |
| if (poll(&pfd, 1, -1) == -1) | if (poll(&pfd, 1, -1) == -1) |
| break; | break; |
| #endif | |
| ret = write(dev, buffer, siz); | ret = io_etherSend(dev, buffer, siz); |
| if (ret == -1) | if (ret == -1) |
| printf("write(%d) #%d - %s\n", ret, errno, strerror(errno)); | printf("io_etherSend(%d) #%d - %s\n", ret, io_GetErrno(), io_GetError()); |
| if (Verbose) | if (Verbose) |
| printf("+writed %d bytes\n", ret); | printf("+writed %d bytes\n", ret); |
| } | } |
| } | } |
| assert(!clock_gettime(CLOCK_REALTIME, &ts_end)); | assert(!clock_gettime(CLOCK_REALTIME, &ts_end)); |
| #endif | |
| // 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); |