Diff for /libaitio/example/bpf.c between versions 1.4 and 1.5

version 1.4, 2013/12/15 22:57:20 version 1.5, 2016/08/18 09:06:31
Line 10 Line 10
 #include <assert.h>  #include <assert.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/param.h>  #include <sys/param.h>
 #include <sys/limits.h>  
 #include <sys/socket.h>  #include <sys/socket.h>
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
 #include <sys/mman.h>  #include <sys/mman.h>
 #include <net/if.h>  #include <net/if.h>
   #ifndef __linux__
   #include <sys/limits.h>
 #include <net/bpf.h>  #include <net/bpf.h>
 #include <machine/atomic.h>  #include <machine/atomic.h>
   #else
   #include <linux/if_ether.h>
   #endif
   
 #ifdef __FreeBSD__  #ifdef __FreeBSD__
 #include <net/ethernet.h>  #include <net/ethernet.h>
Line 61  static void * Line 65  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 };
   #ifndef __linux__
 #ifdef __FreeBSD__  #ifdef __FreeBSD__
         struct bpf_zbuf_header *bzh = buffer;          struct bpf_zbuf_header *bzh = buffer;
         struct icmphdr *icmp;          struct icmphdr *icmp;
Line 68  ShowPkt(void *buffer) Line 73  ShowPkt(void *buffer)
 #ifdef __OpenBSD__  #ifdef __OpenBSD__
         struct icmp *icmp;          struct icmp *icmp;
 #endif  #endif
   
         struct ether_header *eth;          struct ether_header *eth;
   #else
           struct icmphdr *icmp;
           struct ethhdr *eth;
   #endif
         struct ip *ip;          struct ip *ip;
         struct ip6_hdr *ipv6;          struct ip6_hdr *ipv6;
         struct arphdr *arp;          struct arphdr *arp;
Line 77  ShowPkt(void *buffer) Line 87  ShowPkt(void *buffer)
   
         assert(buffer);          assert(buffer);
   
   #ifndef __linux__
         eth = (struct ether_header *) buffer;          eth = (struct ether_header *) buffer;
   
         switch (ntohs(eth->ether_type)) {          switch (ntohs(eth->ether_type)) {
   #else
   #define ETHERTYPE_ARP 0x0806
   #define ETHERTYPE_IP 0x0800
   #define ETHERTYPE_IPV6 0x86dd
   #define ETHER_HDR_LEN sizeof(struct ethhdr)
   
           eth = (struct ethhdr *) buffer;
   
           switch (ntohs(eth->h_proto)) {
   #endif
                 case ETHERTYPE_ARP:                  case ETHERTYPE_ARP:
                         strlcpy(szWrk, "(ARP)", sizeof szWrk);                          strlcpy(szWrk, "(ARP)", sizeof szWrk);
                         break;                          break;
Line 92  ShowPkt(void *buffer) Line 113  ShowPkt(void *buffer)
                 default:                  default:
                         memset(szWrk, 0, sizeof szWrk);                          memset(szWrk, 0, sizeof szWrk);
         }          }
   #ifndef __linux__
         snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->ether_shost[0], eth->ether_shost[1],           snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->ether_shost[0], eth->ether_shost[1], 
                         eth->ether_shost[2], eth->ether_shost[3], eth->ether_shost[4], eth->ether_shost[5]);                          eth->ether_shost[2], eth->ether_shost[3], eth->ether_shost[4], eth->ether_shost[5]);
         snprintf(szLine, BUFSIZ, "ether_type: %04x%s, src_mac: %s, ", ntohs(eth->ether_type), szWrk, szStr);          snprintf(szLine, BUFSIZ, "ether_type: %04x%s, src_mac: %s, ", ntohs(eth->ether_type), szWrk, szStr);
         strlcat(szShow, szLine, USHRT_MAX);          strlcat(szShow, szLine, USHRT_MAX);
         snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->ether_dhost[0], eth->ether_dhost[1],           snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->ether_dhost[0], eth->ether_dhost[1], 
                         eth->ether_dhost[2], eth->ether_dhost[3], eth->ether_dhost[4], eth->ether_dhost[5]);                          eth->ether_dhost[2], eth->ether_dhost[3], eth->ether_dhost[4], eth->ether_dhost[5]);
   #else
           snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->h_source[0], eth->h_source[1], 
                           eth->h_source[2], eth->h_source[3], eth->h_source[4], eth->h_source[5]);
           snprintf(szLine, BUFSIZ, "ether_type: %04x%s, src_mac: %s, ", ntohs(eth->h_proto), szWrk, szStr);
           strlcat(szShow, szLine, USHRT_MAX);
           snprintf(szStr, BUFSIZ, "%02x:%02x:%02x:%02x:%02x:%02x", eth->h_dest[0], eth->h_dest[1], 
                           eth->h_dest[2], eth->h_dest[3], eth->h_dest[4], eth->h_dest[5]);
   #endif
         snprintf(szLine, BUFSIZ, "dst_mac: %s\n", szStr);          snprintf(szLine, BUFSIZ, "dst_mac: %s\n", szStr);
         strlcat(szShow, szLine, USHRT_MAX);          strlcat(szShow, szLine, USHRT_MAX);
   
   #ifndef __linux__
         switch (ntohs(eth->ether_type)) {          switch (ntohs(eth->ether_type)) {
   #else
   #define ARPOP_REVREQUEST 3
   #define ARPOP_REVREPLY 4
   #define ARPOP_INVREQUEST 8
   #define ARPOP_INVREPLY 9
   #define IPV6_FLOWLABEL_MASK 0x000fffff
   
           switch (ntohs(eth->h_proto)) {
   #endif
                 case ETHERTYPE_ARP:                  case ETHERTYPE_ARP:
                         arp = (struct arphdr*) (((caddr_t) eth) + ETHER_HDR_LEN);                          arp = (struct arphdr*) (((caddr_t) eth) + ETHER_HDR_LEN);
                         strlcat(szShow, "\t>>> ARP ...\n", USHRT_MAX);                          strlcat(szShow, "\t>>> ARP ...\n", USHRT_MAX);
Line 170  ShowPkt(void *buffer) Line 210  ShowPkt(void *buffer)
                         break;                          break;
         }          }
                   
   #ifndef __linux__
         if (Proto && (ntohs(eth->ether_type) == ETHERTYPE_IP || ntohs(eth->ether_type) == ETHERTYPE_IPV6))          if (Proto && (ntohs(eth->ether_type) == ETHERTYPE_IP || ntohs(eth->ether_type) == ETHERTYPE_IPV6))
   #else
           if (Proto && (ntohs(eth->h_proto) == ETHERTYPE_IP || ntohs(eth->h_proto) == ETHERTYPE_IPV6))
   #endif
                 switch (Proto) {                  switch (Proto) {
                         case IPPROTO_TCP:                          case IPPROTO_TCP:
                                 strlcat(szShow, "\t\t>>> TCP ...\n", USHRT_MAX);                                  strlcat(szShow, "\t\t>>> TCP ...\n", USHRT_MAX);
   #ifndef __linux__
                                 if (ntohs(eth->ether_type) == ETHERTYPE_IPV6)                                  if (ntohs(eth->ether_type) == ETHERTYPE_IPV6)
   #else
                                   if (ntohs(eth->h_proto) == ETHERTYPE_IPV6)
   #endif
                                         tcp = (struct tcphdr*) (((caddr_t) ipv6) + sizeof(struct ip6_hdr));                                          tcp = (struct tcphdr*) (((caddr_t) ipv6) + sizeof(struct ip6_hdr));
                                 else                                  else
                                         tcp = (struct tcphdr*) (((caddr_t) ip) + sizeof(struct ip));                                          tcp = (struct tcphdr*) (((caddr_t) ip) + sizeof(struct ip));
   
   #ifndef __linux__
                                 snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, seq: %u, ack: %u\n",                                   snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, seq: %u, ack: %u\n", 
                                                 ntohs(tcp->th_sport), ntohs(tcp->th_dport), tcp->th_seq, tcp->th_ack);                                                  ntohs(tcp->th_sport), ntohs(tcp->th_dport), tcp->th_seq, tcp->th_ack);
                                 strlcat(szShow, szLine, USHRT_MAX);                                  strlcat(szShow, szLine, USHRT_MAX);
Line 201  ShowPkt(void *buffer) Line 250  ShowPkt(void *buffer)
                                         strlcat(szWrk, "|CWR", sizeof szWrk);                                          strlcat(szWrk, "|CWR", sizeof szWrk);
                                 snprintf(szLine, BUFSIZ, "\t\toff: %s, win: %d, urp: %04x, cksum: %04x\n",                                   snprintf(szLine, BUFSIZ, "\t\toff: %s, win: %d, urp: %04x, cksum: %04x\n", 
                                                 szWrk, ntohs(tcp->th_win), ntohs(tcp->th_urp), ntohs(tcp->th_sum));                                                  szWrk, ntohs(tcp->th_win), ntohs(tcp->th_urp), ntohs(tcp->th_sum));
   #else
                                   snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, seq: %u, ack: %u\n", 
                                                   ntohs(tcp->source), ntohs(tcp->dest), tcp->seq, tcp->ack);
                                 strlcat(szShow, szLine, USHRT_MAX);                                  strlcat(szShow, szLine, USHRT_MAX);
                                   snprintf(szWrk, BUFSIZ, "%d", (u_char) tcp->doff);
                                   if (tcp->fin)
                                           strlcat(szWrk, "|FIN", sizeof szWrk);
                                   if (tcp->syn)
                                           strlcat(szWrk, "|SYN", sizeof szWrk);
                                   if (tcp->rst)
                                           strlcat(szWrk, "|RST", sizeof szWrk);
                                   if (tcp->psh)
                                           strlcat(szWrk, "|PUSH", sizeof szWrk);
                                   if (tcp->ack)
                                           strlcat(szWrk, "|ACK", sizeof szWrk);
                                   if (tcp->urg)
                                           strlcat(szWrk, "|URG", sizeof szWrk);
                                   /*
                                   if (tcp->ece)
                                           strlcat(szWrk, "|ECE", sizeof szWrk);
                                   if (tcp->cwr)
                                           strlcat(szWrk, "|CWR", sizeof szWrk);
                                           */
                                   snprintf(szLine, BUFSIZ, "\t\toff: %s, win: %d, urp: %04x, cksum: %04x\n", 
                                                   szWrk, ntohs(tcp->window), ntohs(tcp->urg_ptr), ntohs(tcp->check));
   #endif
                                   strlcat(szShow, szLine, USHRT_MAX);
                                 break;                                  break;
                         case IPPROTO_UDP:                          case IPPROTO_UDP:
                                 strlcat(szShow, "\t\t>>> UDP ...\n", USHRT_MAX);                                  strlcat(szShow, "\t\t>>> UDP ...\n", USHRT_MAX);
   #ifndef __linux__
                                 if (ntohs(eth->ether_type) == ETHERTYPE_IPV6)                                  if (ntohs(eth->ether_type) == ETHERTYPE_IPV6)
   #else
                                   if (ntohs(eth->h_proto) == ETHERTYPE_IPV6)
   #endif
                                         udp = (struct udphdr*) (((caddr_t) ipv6) + sizeof(struct ip6_hdr));                                          udp = (struct udphdr*) (((caddr_t) ipv6) + sizeof(struct ip6_hdr));
                                 else                                  else
                                         udp = (struct udphdr*) (((caddr_t) ip) + sizeof(struct ip));                                          udp = (struct udphdr*) (((caddr_t) ip) + sizeof(struct ip));
   
   #ifndef __linux__
                                 snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, len: %d, cksum: %04x\n",                                   snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, len: %d, cksum: %04x\n", 
                                                 ntohs(udp->uh_sport), ntohs(udp->uh_dport),                                                   ntohs(udp->uh_sport), ntohs(udp->uh_dport), 
                                                 ntohs(udp->uh_ulen), ntohs(udp->uh_sum));                                                  ntohs(udp->uh_ulen), ntohs(udp->uh_sum));
   #else
                                   snprintf(szLine, BUFSIZ, "\t\tsrc_port: %d, dst_port: %d, len: %d, cksum: %04x\n", 
                                                   ntohs(udp->source), ntohs(udp->dest), 
                                                   ntohs(udp->len), ntohs(udp->check));
   #endif
                                 strlcat(szShow, szLine, USHRT_MAX);                                  strlcat(szShow, szLine, USHRT_MAX);
                                 break;                                  break;
                         case IPPROTO_ICMP:                          case IPPROTO_ICMP:
Line 230  ShowPkt(void *buffer) Line 315  ShowPkt(void *buffer)
                                         icmp = (struct icmp*) (((caddr_t) ip) + sizeof(struct ip));                                          icmp = (struct icmp*) (((caddr_t) ip) + sizeof(struct ip));
 #endif  #endif
   
   #ifndef __linux__
                                 snprintf(szLine, BUFSIZ, "\t\ttype: %d, code: %d: cksum: %04x\n",                                   snprintf(szLine, BUFSIZ, "\t\ttype: %d, code: %d: cksum: %04x\n", 
                                                 icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));                                                  icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));
   #else
                                   snprintf(szLine, BUFSIZ, "\t\ttype: %d, code: %d: cksum: %04x\n", 
                                                   icmp->type, icmp->code, ntohs(icmp->checksum));
   #endif
                                 strlcat(szShow, szLine, USHRT_MAX);                                  strlcat(szShow, szLine, USHRT_MAX);
                                 break;                                  break;
                 }                  }
Line 248  main(int argc, char **argv) Line 338  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], szEA[STRSIZ], szMap[MAXPATHLEN] = { 0 }, *buffer = NULL;        char szStr[BUFSIZ], 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;
Line 291  main(int argc, char **argv) Line 381  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));#ifndef __linux__
        e_ether_ntoa(&ea, szEA, sizeof szEA); 
        printf("ethernet address is %s\n", szEA); 
 
 #ifdef __FreeBSD__  #ifdef __FreeBSD__
         dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, (flg) ? &bz : NULL);          dev = io_etherOpen(szStr, O_RDWR | O_NONBLOCK, 42, 0, (u_int*) &siz, (flg) ? &bz : NULL);
         if (dev == -1)          if (dev == -1)
Line 302  main(int argc, char **argv) Line 389  main(int argc, char **argv)
 #else  #else
         dev = io_etherOpen(szStr, O_RDWR, 42, 0, (u_int*) &siz, NULL);          dev = io_etherOpen(szStr, O_RDWR, 42, 0, (u_int*) &siz, NULL);
 #endif  #endif
   #else
           dev = io_etherOpen(szStr, 0, 42, 0, (u_int*) &siz, NULL);
   #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());
                 return 1;                  return 1;
         } else          } else
                 printf("dev=%d(%s)\n", dev, szStr);                  printf("dev=%d(%s)\n", dev, szStr);
   
   #ifndef __linux__
         if (ioctl(dev, BIOCGBLEN, &siz) == -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", siz);                  printf("BPF buffer len=%d\n", siz);
   #endif
   
         if (*szMap) {          if (*szMap) {
                 fd = open(szMap, O_RDWR);                  fd = open(szMap, O_RDWR);
Line 325  main(int argc, char **argv) Line 417  main(int argc, char **argv)
                 buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);                  buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
                 close(fd);                  close(fd);
         } else          } else
                buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);                buffer = mmap(NULL, siz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
         if (buffer == MAP_FAILED) {          if (buffer == MAP_FAILED) {
                 perror("mmap()");                  perror("mmap()");
                 io_etherClose(dev, &bz);                  io_etherClose(dev, &bz);

Removed from v.1.4  
changed lines
  Added in v.1.5


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