/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* bos720 src/bos/kernel/net/bpfdesc.h 1.8.1.1 */ /* */ /* Licensed Materials - Property of IBM */ /* */ /* COPYRIGHT International Business Machines Corp. 1993,2014 */ /* All Rights Reserved */ /* */ /* US Government Users Restricted Rights - Use, duplication or */ /* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ /* */ /* IBM_PROLOG_END_TAG */ /* @(#)05 1.8.1.1 src/bos/kernel/net/bpfdesc.h, sysnet, bos720, 1439A_720 9/4/14 02:04:43 */ /* * COMPONENT_NAME: SYSNET * * FUNCTIONS: none * * ORIGINS: 26,27 * * * (C) COPYRIGHT International Business Machines Corp. 1993 * All Rights Reserved * Licensed Materials - Property of IBM * US Government Users Restricted Rights - Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from the Stanford/CMU enet packet filter, * (net/enet.c) distributed as part of 4.3BSD, and code contributed * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence * Berkeley Laboratory. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * bpfdesc.h 7.1 (Berkeley) 5/7/91 * * bpfdesc.h,v 1.10 92/02/24 21:28:24 mccanne Exp $ (LBL) */ #ifndef _H_BPFDESC #define _H_BPFDESC /* * Descriptor associated with each open bpf file. */ struct bpf_d { struct bpf_d *bd_next; /* Linked list of descriptors */ /* * Buffer slots: two mbuf clusters buffer the incoming packets. * The model has three slots. Sbuf is always occupied. * sbuf (store) - Receive interrupt puts packets here. * hbuf (hold) - When sbuf is full, put cluster here and * wakeup read (replace sbuf with fbuf). * fbuf (free) - When read is done, put cluster here. * On receiving, if sbuf is full and fbuf is 0, packet is dropped. */ caddr_t bd_sbuf; /* store slot */ caddr_t bd_hbuf; /* hold slot */ caddr_t bd_fbuf; /* free slot */ int bd_slen; /* current length of store buffer */ int bd_hlen; /* current length of hold buffer */ int bd_bufsize; /* absolute length of buffers */ struct bpf_if * bd_bif; /* interface descriptor */ u_long bd_rtout; /* Read timeout in 'ticks' */ struct bpf_insn *bd_filter; /* filter code */ u_long bd_rcount; /* number of packets received */ u_long bd_dcount; /* number of packets dropped */ u_char bd_promisc; /* true if listening promiscuously */ u_char bd_state; /* idle, waiting, or timed out */ u_char bd_immediate; /* true to return on packet arrival */ int bd_timedout; u_char bd_pad; /* explicit alignment */ u_short bd_selreq; /* requested select events */ dev_t bd_devno; /* devno for this descriptor */ /* * IMPORTANT: These two simple_lock_data_t elements must be the last * two entries of the bpf_d structure. * bpfopen() function depends on it. */ simple_lock_data_t bpf_slock; simple_lock_data_t bpf_readlock; /* lock to synchronize reading * by multiple threads on the same device */ }; /* * Mark a descriptor free by making it point to itself. * This is probably cheaper than marking with a constant since * the address should be in a register anyway. */ #define D_ISFREE(d) ((d) == (d)->bd_next) #define D_MARKFREE(d) ((d)->bd_next = (d)) #define D_MARKUSED(d) ((d)->bd_next = 0) /* * Descriptor associated with each attached hardware interface. */ struct bpf_if { struct bpf_if *bif_next; /* list of all interfaces */ long bif_dlist; /* Descriptor flag */ struct bpf_if **bif_driverp; /* pointer into softc */ u_int bif_dlt; /* link layer type */ u_int bif_hdrlen; /* length of header (with padding) */ struct ifnet *bif_ifp; /* corresponding interface */ #ifdef _AIX struct ndd *nddp; /* cooresponding ndd */ #endif /* _AIX */ simple_lock_data_t bpf_if_slock;/* Protects bif_dlist only */ }; #define BPF_LOCK_DECL() int _bpf_; #define BPF_LOCKINIT(b) { \ lock_alloc(&((b)->bpf_slock), LOCK_ALLOC_PIN, BPF_LOCK_FAMILY, (uint)b); \ simple_lock_init(&((b)->bpf_slock)); \ lock_alloc(&((b)->bpf_readlock), LOCK_ALLOC_PIN, BPF_LOCK_FAMILY, (uint)(b) + 1); \ simple_lock_init(&((b)->bpf_readlock)); \ } #define BPF_LOCK(b) _bpf_ = disable_lock(PL_IMP ,&((b)->bpf_slock)) #define BPF_UNLOCK(b) unlock_enable(_bpf_, &((b)->bpf_slock)) #define BPF_READ_LOCK(b) simple_lock(&((b)->bpf_readlock)) #define BPF_READ_UNLOCK(b) simple_unlock(&((b)->bpf_readlock)) /* Lock to protect bif_dlist */ #define BPF_IF_LOCK_DECL() int _bpf_if_; #define BPF_IF_LOCKINIT(d) { \ lock_alloc(&((d)->bpf_if_slock), LOCK_ALLOC_PIN, BPF_LOCK_FAMILY, (uint)d); \ simple_lock_init(&((d)->bpf_if_slock)); \ } #define BPF_IF_LOCK(d) _bpf_if_ = disable_lock(PL_IMP ,&((d)->bpf_if_slock)) #define BPF_IF_UNLOCK(d) unlock_enable(_bpf_if_, &((d)->bpf_if_slock)) /* Checkpoint/Restart data structures */ #define CRBPF_DESC 1 #define CRBPF_SBUF 2 #define CRBPF_HBUF 3 #define CRBPF_FBUF 4 #define CRBPF_FLTR 5 #define BPF_CRDATA_VERS 1 /* Structure for backing up bpf_d structure */ typedef struct bpf_d_crdata { char if_name[IFNAMSIZ]; /* store interface on which this bpf is attached to */ short if_unit; struct bpf_d d; /* store bpf descriptor */ } bpf_d_crdata_t; #endif /* _H_BPFDESC */