Diff for /libaitio/src/bpf.c between versions 1.5 and 1.6

version 1.5, 2013/12/15 22:57:20 version 1.6, 2014/02/08 22:06:17
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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2014
         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 114  io_getmaciface(const char *csIface, ether_addr_t * __r Line 114  io_getmaciface(const char *csIface, ether_addr_t * __r
 void  void
 io_etherClose(int eth, void **zcbuf)  io_etherClose(int eth, void **zcbuf)
 {  {
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
         struct bpf_zbuf *zbuf = NULL;          struct bpf_zbuf *zbuf = NULL;
 #endif  #endif
   
Line 122  io_etherClose(int eth, void **zcbuf) Line 122  io_etherClose(int eth, void **zcbuf)
                 close(eth);                  close(eth);
   
         if (zcbuf && *zcbuf) {          if (zcbuf && *zcbuf) {
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
                 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);
Line 132  io_etherClose(int eth, void **zcbuf) Line 132  io_etherClose(int eth, void **zcbuf)
         }          }
 }  }
   
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
 static inline struct bpf_zbuf *  static inline struct bpf_zbuf *
 allocZCbuf(u_int len)  allocZCbuf(u_int len)
 {  {
Line 178  allocZCbuf(u_int len) Line 178  allocZCbuf(u_int len)
  * return: -1 error or >-1 bpf handle   * return: -1 error or >-1 bpf handle
  */   */
 int  int
io_etherOpen(const char *csIface, int flags, int whdr, int wdlt, io_etherOpen(const char *csIface, int flags, u_int whdr, u_int wdlt, 
                 u_int *buflen, void **zcbuf)                  u_int *buflen, void **zcbuf)
 {  {
         int eth = -1;          int eth = -1;
Line 187  io_etherOpen(const char *csIface, int flags, int whdr, Line 187  io_etherOpen(const char *csIface, int flags, int whdr,
         struct ifreq ifr;          struct ifreq ifr;
         u_int n = 1;          u_int n = 1;
   
#ifndef __FreeBSD__#if !defined(__FreeBSD__) || !defined(ZCBUF_ENABLE)
         if (zcbuf) {          if (zcbuf) {
                 io_SetErr(ENOTSUP, "bpf zero copy buffer mode is not supported");                  io_SetErr(ENOTSUP, "bpf zero copy buffer mode is not supported");
                 return -1;                  return -1;
Line 219  io_etherOpen(const char *csIface, int flags, int whdr, Line 219  io_etherOpen(const char *csIface, int flags, int whdr,
                 close(eth);                  close(eth);
                 return -1;                  return -1;
         }          }
         if (wdlt && ioctl(eth, BIOCSDLT, &wdlt) == -1) {  
                 LOGERR;  
                 close(eth);  
                 return -1;  
         }  
         if (ioctl(eth, BIOCIMMEDIATE, &n) == -1) {          if (ioctl(eth, BIOCIMMEDIATE, &n) == -1) {
                 LOGERR;                  LOGERR;
                 close(eth);                  close(eth);
Line 246  io_etherOpen(const char *csIface, int flags, int whdr, Line 241  io_etherOpen(const char *csIface, int flags, int whdr,
                 if (buflen)                  if (buflen)
                         *buflen = n;                          *buflen = n;
         } else {          } else {
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
                 n = BPF_BUFMODE_ZBUF;                  n = BPF_BUFMODE_ZBUF;
                 if (ioctl(eth, BIOCSETBUFMODE, &n) == -1) {                  if (ioctl(eth, BIOCSETBUFMODE, &n) == -1) {
                         LOGERR;                          LOGERR;
Line 281  io_etherOpen(const char *csIface, int flags, int whdr, Line 276  io_etherOpen(const char *csIface, int flags, int whdr,
                 return -1;                  return -1;
         }          }
   
           n = wdlt;
           if (wdlt && ioctl(eth, BIOCSDLT, &n) == -1) {
                   LOGERR;
                   close(eth);
                   return -1;
           }
   
         return eth;          return eth;
 }  }
   
Line 308  io_etherSend(int eth, const void *buf, size_t buflen) Line 310  io_etherSend(int eth, const void *buf, size_t buflen)
         return wlen;          return wlen;
 }  }
   
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
 static inline void  static inline void
 ackZCbuf(struct bpf_zbuf_header *bzh)  ackZCbuf(struct bpf_zbuf_header *bzh)
 {  {
Line 381  io_etherRecv(int eth, void * __restrict buf, size_t bu Line 383  io_etherRecv(int eth, void * __restrict buf, size_t bu
                         return -1;                          return -1;
                 }                  }
         } else {          } else {
#ifdef __FreeBSD__#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE)
                 rlen = nextZCbuf(eth, (struct bpf_zbuf*) zcbuf, buf, buflen);                  rlen = nextZCbuf(eth, (struct bpf_zbuf*) zcbuf, buf, buflen);
                 if (!rlen)                  if (!rlen)
                         rlen = nextZCbuf(eth, (struct bpf_zbuf*) zcbuf, buf, buflen);                          rlen = nextZCbuf(eth, (struct bpf_zbuf*) zcbuf, buf, buflen);

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


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