Diff for /libaitio/example/bpf.c between versions 1.1.2.5 and 1.3.24.1

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);

Removed from v.1.1.2.5  
changed lines
  Added in v.1.3.24.1


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