Diff for /libaitio/src/bpf.c between versions 1.7 and 1.8

version 1.7, 2015/01/19 23:32:30 version 1.8, 2016/08/18 09:06:31
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004 - 2014Copyright 2004 - 2016
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 63  io_etherClose(int eth, void **zcbuf) Line 63  io_etherClose(int eth, void **zcbuf)
         if (eth > STDERR_FILENO)          if (eth > STDERR_FILENO)
                 close(eth);                  close(eth);
   
         if (zcbuf && *zcbuf) {  
 #if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)  #if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
           if (zcbuf && *zcbuf) {
                 zbuf = *zcbuf;                  zbuf = *zcbuf;
                 munmap(zbuf->bz_bufb, zbuf->bz_buflen);                  munmap(zbuf->bz_bufb, zbuf->bz_buflen);
                 munmap(zbuf->bz_bufa, zbuf->bz_buflen);                  munmap(zbuf->bz_bufa, zbuf->bz_buflen);
                 e_free(*zcbuf);                  e_free(*zcbuf);
                 *zcbuf = NULL;                  *zcbuf = NULL;
 #endif  
         }          }
   #endif
 }  }
   
 #if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)  #if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
Line 114  allocZCbuf(u_int len) Line 114  allocZCbuf(u_int len)
  * @csIface = interface name   * @csIface = interface name
  * @flags = open flags   * @flags = open flags
  * @whdr = with complete headers   * @whdr = with complete headers
 * @wdlt = with data link type * @wdlt = with data link type, on Linux is protocol number
  * @buflen = buffer length   * @buflen = buffer length
  * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL   * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL
  * return: -1 error or >-1 bpf handle   * return: -1 error or >-1 bpf handle
Line 124  io_etherOpen(const char *csIface, int flags, u_int whd Line 124  io_etherOpen(const char *csIface, int flags, u_int whd
                 u_int *buflen, void **zcbuf)                  u_int *buflen, void **zcbuf)
 {  {
         int eth = -1;          int eth = -1;
         register int i;  
         char szStr[STRSIZ];          char szStr[STRSIZ];
         struct ifreq ifr;          struct ifreq ifr;
   #ifndef __linux__
           register int i;
         u_int n = 1;          u_int n = 1;
   #else
           sockaddr_t sa = {{ 0 }};
   #endif
   
 #if !defined(__FreeBSD__) || !defined(ZCBUF_ENABLE)  #if !defined(__FreeBSD__) || !defined(ZCBUF_ENABLE)
         if (zcbuf) {          if (zcbuf) {
Line 136  io_etherOpen(const char *csIface, int flags, u_int whd Line 140  io_etherOpen(const char *csIface, int flags, u_int whd
         }          }
 #endif  #endif
   
   #ifndef __linux__
         for (i = 0; i < BPF_DEV_MAX; i++) {          for (i = 0; i < BPF_DEV_MAX; i++) {
                 memset(szStr, 0, sizeof szStr);                  memset(szStr, 0, sizeof szStr);
                 snprintf(szStr, sizeof szStr, "/dev/bpf%d", i);                  snprintf(szStr, sizeof szStr, "/dev/bpf%d", i);
Line 143  io_etherOpen(const char *csIface, int flags, u_int whd Line 148  io_etherOpen(const char *csIface, int flags, u_int whd
                 if (eth > STDERR_FILENO)                  if (eth > STDERR_FILENO)
                         break;                          break;
         }          }
   #else
           eth = socket(AF_PACKET, whdr ? SOCK_RAW : SOCK_DGRAM, htons((u_short) wdlt));
   #endif
         if (eth < 3) {          if (eth < 3) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
Line 155  io_etherOpen(const char *csIface, int flags, u_int whd Line 163  io_etherOpen(const char *csIface, int flags, u_int whd
                 return -1;                  return -1;
         }          }
   
   #ifndef __linux__
         n = 1;          n = 1;
         if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) {          if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) {
                 LOGERR;                  LOGERR;
Line 224  io_etherOpen(const char *csIface, int flags, u_int whd Line 233  io_etherOpen(const char *csIface, int flags, u_int whd
                 close(eth);                  close(eth);
                 return -1;                  return -1;
         }          }
   #else
           memset(&ifr, 0, sizeof ifr);
           strlcpy(ifr.ifr_name, szStr, sizeof ifr.ifr_name);
           if (ioctl(eth, SIOCGIFINDEX, &ifr)) {
                   LOGERR;
                   close(eth);
                   return -1;
           }
   
           sa.sll.sll_family = AF_PACKET;
           sa.sll.sll_ifindex = ifr.ifr_ifindex;
           sa.sll.sll_protocol = htons((u_short) wdlt);
           if (bind(eth, &sa.sa, sizeof(sa.sll)) == -1) {
                   LOGERR;
                   close(eth);
                   return -1;
           }
   #endif
   
         return eth;          return eth;
 }  }
   
Line 311  ssize_t Line 338  ssize_t
 io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf)  io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf)
 {  {
         ssize_t rlen = 0;          ssize_t rlen = 0;
   #ifndef __linux__
         struct bpf_hdr *h;          struct bpf_hdr *h;
   #endif
   
         if (!buf || !buflen) {          if (!buf || !buflen) {
                 io_SetErr(EINVAL, "invalid arguments");                  io_SetErr(EINVAL, "invalid arguments");
Line 335  io_etherRecv(int eth, void * __restrict buf, size_t bu Line 364  io_etherRecv(int eth, void * __restrict buf, size_t bu
 #endif  #endif
         }          }
   
   #ifndef __linux__
         h = (struct bpf_hdr*) buf;          h = (struct bpf_hdr*) buf;
         rlen -= h->bh_hdrlen;          rlen -= h->bh_hdrlen;
   
Line 349  io_etherRecv(int eth, void * __restrict buf, size_t bu Line 379  io_etherRecv(int eth, void * __restrict buf, size_t bu
         }          }
   
         memmove(buf, buf + h->bh_hdrlen, rlen);          memmove(buf, buf + h->bh_hdrlen, rlen);
   #endif
         return rlen;          return rlen;
 }  }
   
   #ifndef __linux__
 /*  /*
  * io_etherFilter() - BPF filter routine   * io_etherFilter() - BPF filter routine
  *   *
Line 398  io_etherFilter(int eth, int io, struct bpf_insn * __re Line 430  io_etherFilter(int eth, int io, struct bpf_insn * __re
                 LOGERR;                  LOGERR;
         return ret;          return ret;
 }  }
   #endif

Removed from v.1.7  
changed lines
  Added in v.1.8


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