2  * Copyright (c) 2000-2017 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29  * Copyright (c) 1990, 1991, 1993 
  30  *      The Regents of the University of California.  All rights reserved. 
  32  * This code is derived from the Stanford/CMU enet packet filter, 
  33  * (net/enet.c) distributed as part of 4.3BSD, and code contributed 
  34  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 
  35  * Berkeley Laboratory. 
  37  * Redistribution and use in source and binary forms, with or without 
  38  * modification, are permitted provided that the following conditions 
  40  * 1. Redistributions of source code must retain the above copyright 
  41  *    notice, this list of conditions and the following disclaimer. 
  42  * 2. Redistributions in binary form must reproduce the above copyright 
  43  *    notice, this list of conditions and the following disclaimer in the 
  44  *    documentation and/or other materials provided with the distribution. 
  45  * 3. All advertising materials mentioning features or use of this software 
  46  *    must display the following acknowledgement: 
  47  *      This product includes software developed by the University of 
  48  *      California, Berkeley and its contributors. 
  49  * 4. Neither the name of the University nor the names of its contributors 
  50  *    may be used to endorse or promote products derived from this software 
  51  *    without specific prior written permission. 
  53  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  54  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  56  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  57  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  58  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  59  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  60  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  65  *      @(#)bpfdesc.h   8.1 (Berkeley) 6/10/93 
  67  * $FreeBSD: src/sys/net/bpfdesc.h,v 1.14.2.1 2000/03/19 05:55:36 rwatson Exp $ 
  70 #ifndef _NET_BPFDESC_H_ 
  71 #define _NET_BPFDESC_H_ 
  72 #include <sys/appleapiopts.h> 
  75  * The items in this header file should be wrapped in #ifdef KERNEL. 
  79 #include <sys/select.h> 
  80 #include <kern/thread_call.h> 
  81 #include <uuid/uuid.h> 
  84  * Descriptor associated with each open bpf file. 
  87         struct bpf_d    
*bd_next
;       /* Linked list of descriptors */ 
  89          * Buffer slots: two mbuf clusters buffer the incoming packets. 
  90          *   The model has three slots.  Sbuf is always occupied. 
  91          *   sbuf (store) - Receive interrupt puts packets here. 
  92          *   hbuf (hold) - When sbuf is full, put cluster here and 
  93          *                 wakeup read (replace sbuf with fbuf). 
  94          *   fbuf (free) - When read is done, put cluster here. 
  95          * On receiving, if sbuf is full and fbuf is 0, packet is dropped. 
  97         caddr_t         bd_sbuf
;        /* store slot */ 
  98         caddr_t         bd_hbuf
;        /* hold slot */ 
  99         caddr_t         bd_fbuf
;        /* free slot */ 
 100         int             bd_slen
;        /* current length of store buffer */ 
 101         int             bd_hlen
;        /* current length of hold buffer */ 
 102         u_int32_t       bd_scnt
;        /* number of packets in store buffer */ 
 103         u_int32_t       bd_hcnt
;        /* number of packets in hold buffer */ 
 105         int             bd_bufsize
;     /* absolute length of buffers */ 
 106         int             bd_hbuf_read
;   /* reading from hbuf */ 
 107         int             bd_headdrop
;    /* Keep newer packets */ 
 109         struct bpf_if  
*bd_bif
;         /* interface descriptor */ 
 110         u_int32_t       bd_rtout
;       /* Read timeout in 'ticks' */ 
 111         struct bpf_insn 
*bd_filter
;     /* filter code */ 
 112         u_int32_t       bd_rcount
;      /* number of packets received */ 
 113         u_int32_t       bd_dcount
;      /* number of packets dropped */ 
 115         u_char          bd_promisc
;     /* true if listening promiscuously */ 
 116         u_char          bd_state
;       /* idle, waiting, or timed out */ 
 117         u_char          bd_immediate
;   /* true to return on packet arrival */ 
 118         int             bd_async
;       /* non-zero if packet reception should generate signal */ 
 119         int             bd_sig
;         /* signal to send upon packet reception */ 
 123         struct sigio 
*  bd_sigio
;       /* information for async I/O */ 
 127         u_char          bd_selcoll
;     /* true if selects collide */ 
 129         struct proc 
*   bd_selproc
;     /* process that last selected us */ 
 131         u_char          bd_pad
;         /* explicit alignment */ 
 132         struct selinfo  bd_sel
;         /* bsd select info */ 
 134         int             bd_hdrcmplt
;    /* false to fill in src lladdr automatically */ 
 135         int             bd_seesent
;     /* true if bpf should see sent packets */ 
 136         int             bd_oflags
;      /* device open flags */ 
 137         thread_call_t   bd_thread_call
; /* for BPF timeouts with select */ 
 138         int             bd_traffic_class
; /* traffic service class */ 
 139         int             bd_flags
;       /* flags */ 
 142 #define BPF_REF_HIST    4               /* how many callers to keep around */ 
 143         void            *bd_ref_lr
[BPF_REF_HIST
]; 
 144         void            *bd_unref_lr
[BPF_REF_HIST
]; 
 146         int             bd_next_unref_lr
; 
 148         struct proc     
*bd_opened_by
; 
 152 /* Values for bd_state */ 
 153 #define BPF_IDLE                0    /* no select in progress or kqueue pending */ 
 154 #define BPF_WAITING             1    /* waiting for read timeout in select/kqueue */ 
 155 #define BPF_TIMED_OUT   2        /* read timeout has expired in select/kqueue */ 
 156 #define BPF_DRAINING    3        /* waiting for timeout routine to finish during close */ 
 158 /* Test whether a BPF is ready for read(). */ 
 159 #define bpf_ready(bd)   ((bd)->bd_hlen != 0 ||          \ 
 160                          (((bd)->bd_immediate || (bd)->bd_state == BPF_TIMED_OUT) && \ 
 163 /* Values for bd_flags */ 
 164 #define BPF_EXTENDED_HDR        0x0001  /* process req. the extended header */ 
 165 #define BPF_WANT_PKTAP          0x0002  /* knows how to handle DLT_PKTAP */ 
 166 #define BPF_FINALIZE_PKTAP      0x0004  /* finalize pktap header on read */ 
 167 #define BPF_KNOTE               0x0008  /* kernel note attached */ 
 168 #define BPF_DETACHING           0x0010  /* bpf_d is being detached */ 
 169 #define BPF_DETACHED            0x0020  /* bpf_d is detached */ 
 170 #define BPF_CLOSING             0x0040  /* bpf_d is being closed */ 
 171 #define BPF_TRUNCATE            0x0080  /* truncate the packet payload */ 
 172 #define BPF_PKTHDRV2            0x0100  /* pktap header version 2 */ 
 175  * Descriptor associated with each attached hardware interface. 
 178         struct bpf_if 
*bif_next
;        /* list of all interfaces */ 
 179         struct bpf_d 
*bif_dlist
;        /* descriptor list */ 
 180         u_int bif_dlt
;                  /* link layer type */ 
 181         u_int bif_hdrlen
;               /* length of header (with padding) */ 
 182         u_int bif_exthdrlen
;            /* length of ext header */ 
 183         struct ifnet 
*bif_ifp
;          /* corresponding interface */ 
 184         bpf_send_func   bif_send
; 
 185         bpf_tap_func    bif_tap
; 
 188 #endif /* KERNEL_PRIVATE */