Diff for /libaitio/example/bpf.c between versions 1.1.2.3 and 1.1.2.9

version 1.1.2.3, 2013/06/25 09:26:49 version 1.1.2.9, 2013/06/26 12:27:40
Line 79  ShowPkt(void *buffer) Line 79  ShowPkt(void *buffer)
         assert(buffer);          assert(buffer);
   
 #ifdef __FreeBSD__  #ifdef __FreeBSD__
        snprintf(szLine, BUFSIZ, "#Packet length: %d\n>>> Ethernet ...\n", flg ? bzh->bzh_kernel_len : bpf->bh_datalen);        bpf = (struct bpf_hdr*) (buffer + (flg ? sizeof(struct bpf_zbuf_header) : 0));
         snprintf(szLine, BUFSIZ, "#Packet length: %d/%d\n>>> Ethernet ...\n", flg ? bzh->bzh_kernel_len : bpf->bh_datalen, bpf->bh_datalen);
         strlcat(szShow, szLine, USHRT_MAX);          strlcat(szShow, szLine, USHRT_MAX);
        eth = (struct ether_header *) (buffer + (flg ? bzh->bzh_kernel_len : bpf->bh_hdrlen));        eth = (struct ether_header *) (buffer + (flg ? sizeof(struct bpf_zbuf_header) : 0) + bpf->bh_hdrlen);
 #else  #else
         snprintf(szLine, BUFSIZ, "#Packet length: %d\n>>> Ethernet ...\n", bpf->bh_datalen);          snprintf(szLine, BUFSIZ, "#Packet length: %d\n>>> Ethernet ...\n", bpf->bh_datalen);
         strlcat(szShow, szLine, USHRT_MAX);          strlcat(szShow, szLine, USHRT_MAX);
Line 299  main(int argc, char **argv) Line 300  main(int argc, char **argv)
         else          else
                 strlcpy(szStr, *argv, sizeof szStr);                  strlcpy(szStr, *argv, sizeof szStr);
   
#ifdef __FreeBSD_#ifdef __FreeBSD__
        dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, (u_int*) &siz, &bz);        dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, (u_int*) &siz, (flg) ? &bz : NULL);
         if (dev == -1)
                 dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, (u_int*) &siz, NULL);
 #else  #else
        dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, (u_int*) &siz, NULL);        dev = io_etherOpen(szStr, O_RDWR, 42, (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 310  main(int argc, char **argv) Line 313  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));
Line 427  main(int argc, char **argv) Line 345  main(int argc, char **argv)
                         if (poll(&pfd, 1, -1) == -1)                          if (poll(&pfd, 1, -1) == -1)
                                 break;                                  break;
   
#ifdef __FreeBSD__                        ret = io_etherRecv(dev, buffer, siz, bz);
                        if (flg) {                        if (ret == -1)
                                if (!NEXT_zbuf((void**) &buffer, &bz, &ret))                                printf("%d) io_etherRecv(%d) #%d - %s\n", i, ret, 
                                        continue;                                                io_GetErrno(), io_GetError());
                                if (Verbose) {                        if (Verbose) {
                                        printf("+readed %d bytes\n", ret);                                printf("%d) +readed %d bytes\n", i, ret);
                                        pthread_create(&tid, NULL, ShowPkt, buffer);                                pthread_create(&tid, NULL, ShowPkt, buffer);
                                }                                pthread_join(tid, NULL);
                        } 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  
                 }                  }
         } 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);

Removed from v.1.1.2.3  
changed lines
  Added in v.1.1.2.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>