1*10639SDarren.Reed@Sun.COM /* $NetBSD: bpfdesc.h,v 1.29 2009/03/14 14:46:10 dsl Exp $ */ 2*10639SDarren.Reed@Sun.COM 3*10639SDarren.Reed@Sun.COM /* 4*10639SDarren.Reed@Sun.COM * Copyright (c) 1990, 1991, 1993 5*10639SDarren.Reed@Sun.COM * The Regents of the University of California. All rights reserved. 6*10639SDarren.Reed@Sun.COM * 7*10639SDarren.Reed@Sun.COM * This code is derived from the Stanford/CMU enet packet filter, 8*10639SDarren.Reed@Sun.COM * (net/enet.c) distributed as part of 4.3BSD, and code contributed 9*10639SDarren.Reed@Sun.COM * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 10*10639SDarren.Reed@Sun.COM * Berkeley Laboratory. 11*10639SDarren.Reed@Sun.COM * 12*10639SDarren.Reed@Sun.COM * Redistribution and use in source and binary forms, with or without 13*10639SDarren.Reed@Sun.COM * modification, are permitted provided that the following conditions 14*10639SDarren.Reed@Sun.COM * are met: 15*10639SDarren.Reed@Sun.COM * 1. Redistributions of source code must retain the above copyright 16*10639SDarren.Reed@Sun.COM * notice, this list of conditions and the following disclaimer. 17*10639SDarren.Reed@Sun.COM * 2. Redistributions in binary form must reproduce the above copyright 18*10639SDarren.Reed@Sun.COM * notice, this list of conditions and the following disclaimer in the 19*10639SDarren.Reed@Sun.COM * documentation and/or other materials provided with the distribution. 20*10639SDarren.Reed@Sun.COM * 3. Neither the name of the University nor the names of its contributors 21*10639SDarren.Reed@Sun.COM * may be used to endorse or promote products derived from this software 22*10639SDarren.Reed@Sun.COM * without specific prior written permission. 23*10639SDarren.Reed@Sun.COM * 24*10639SDarren.Reed@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25*10639SDarren.Reed@Sun.COM * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26*10639SDarren.Reed@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27*10639SDarren.Reed@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28*10639SDarren.Reed@Sun.COM * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29*10639SDarren.Reed@Sun.COM * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30*10639SDarren.Reed@Sun.COM * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31*10639SDarren.Reed@Sun.COM * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32*10639SDarren.Reed@Sun.COM * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33*10639SDarren.Reed@Sun.COM * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34*10639SDarren.Reed@Sun.COM * SUCH DAMAGE. 35*10639SDarren.Reed@Sun.COM * 36*10639SDarren.Reed@Sun.COM * @(#)bpfdesc.h 8.1 (Berkeley) 6/10/93 37*10639SDarren.Reed@Sun.COM * 38*10639SDarren.Reed@Sun.COM * @(#) Header: bpfdesc.h,v 1.14 96/06/16 22:28:07 leres Exp (LBL) 39*10639SDarren.Reed@Sun.COM */ 40*10639SDarren.Reed@Sun.COM /* 41*10639SDarren.Reed@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 42*10639SDarren.Reed@Sun.COM * Use is subject to license terms. 43*10639SDarren.Reed@Sun.COM */ 44*10639SDarren.Reed@Sun.COM 45*10639SDarren.Reed@Sun.COM #ifndef _NET_BPFDESC_H_ 46*10639SDarren.Reed@Sun.COM #define _NET_BPFDESC_H_ 47*10639SDarren.Reed@Sun.COM 48*10639SDarren.Reed@Sun.COM #include <net/if.h> /* for IFNAMSIZ */ 49*10639SDarren.Reed@Sun.COM #include <sys/mutex.h> 50*10639SDarren.Reed@Sun.COM #include <sys/condvar.h> 51*10639SDarren.Reed@Sun.COM #include <sys/queue.h> 52*10639SDarren.Reed@Sun.COM 53*10639SDarren.Reed@Sun.COM /* 54*10639SDarren.Reed@Sun.COM * Descriptor associated with each open bpf file. 55*10639SDarren.Reed@Sun.COM */ 56*10639SDarren.Reed@Sun.COM struct bpf_d { 57*10639SDarren.Reed@Sun.COM LIST_ENTRY(bpf_d) bd_list; /* List of bpf_d */ 58*10639SDarren.Reed@Sun.COM LIST_ENTRY(bpf_d) bd_next; /* List attaced to bif_if */ 59*10639SDarren.Reed@Sun.COM /* 60*10639SDarren.Reed@Sun.COM * Buffer slots: two mbuf clusters buffer the incoming packets. 61*10639SDarren.Reed@Sun.COM * The model has three slots. Sbuf is always occupied. 62*10639SDarren.Reed@Sun.COM * sbuf (store) - Receive interrupt puts packets here. 63*10639SDarren.Reed@Sun.COM * hbuf (hold) - When sbuf is full, put cluster here and 64*10639SDarren.Reed@Sun.COM * wakeup read (replace sbuf with fbuf). 65*10639SDarren.Reed@Sun.COM * fbuf (free) - When read is done, put cluster here. 66*10639SDarren.Reed@Sun.COM * On receiving, if sbuf is full and fbuf is 0, packet is dropped. 67*10639SDarren.Reed@Sun.COM */ 68*10639SDarren.Reed@Sun.COM void * bd_sbuf; /* store slot */ 69*10639SDarren.Reed@Sun.COM void * bd_hbuf; /* hold slot */ 70*10639SDarren.Reed@Sun.COM void * bd_fbuf; /* free slot */ 71*10639SDarren.Reed@Sun.COM int bd_slen; /* current length of store buffer */ 72*10639SDarren.Reed@Sun.COM int bd_hlen; /* current length of hold buffer */ 73*10639SDarren.Reed@Sun.COM 74*10639SDarren.Reed@Sun.COM int bd_bufsize; /* absolute length of buffers */ 75*10639SDarren.Reed@Sun.COM 76*10639SDarren.Reed@Sun.COM struct bpf_if *bd_bif; /* interface descriptor */ 77*10639SDarren.Reed@Sun.COM ulong_t bd_rtout; /* Read timeout in 'ticks' */ 78*10639SDarren.Reed@Sun.COM struct bpf_insn *bd_filter; /* filter code */ 79*10639SDarren.Reed@Sun.COM size_t bd_filter_size; 80*10639SDarren.Reed@Sun.COM ulong_t bd_rcount; /* number of packets received */ 81*10639SDarren.Reed@Sun.COM ulong_t bd_dcount; /* number of packets dropped */ 82*10639SDarren.Reed@Sun.COM ulong_t bd_ccount; /* number of packets captured */ 83*10639SDarren.Reed@Sun.COM 84*10639SDarren.Reed@Sun.COM uchar_t bd_promisc; /* true if listening promiscuously */ 85*10639SDarren.Reed@Sun.COM uchar_t bd_state; /* idle, waiting, or timed out */ 86*10639SDarren.Reed@Sun.COM uchar_t bd_immediate; /* true to return on packet arrival */ 87*10639SDarren.Reed@Sun.COM int bd_hdrcmplt; /* false to fill in src lladdr */ 88*10639SDarren.Reed@Sun.COM int bd_seesent; /* true if bpf should see sent pkts */ 89*10639SDarren.Reed@Sun.COM int bd_async; /* non-zero if packet reception .. */ 90*10639SDarren.Reed@Sun.COM /* .. should generate signal */ 91*10639SDarren.Reed@Sun.COM int bd_nonblock; /* non-zero for non-blocking read */ 92*10639SDarren.Reed@Sun.COM pid_t bd_pgid; /* process or group id for signal */ 93*10639SDarren.Reed@Sun.COM int bd_timedout; 94*10639SDarren.Reed@Sun.COM struct pollhead bd_poll; 95*10639SDarren.Reed@Sun.COM timeout_id_t bd_callout; /* for BPF timeouts with select */ 96*10639SDarren.Reed@Sun.COM pid_t bd_pid; /* corresponding PID */ 97*10639SDarren.Reed@Sun.COM void *bd_sih; /* soft interrupt handle */ 98*10639SDarren.Reed@Sun.COM /* 99*10639SDarren.Reed@Sun.COM * Solaris specific bits after this. 100*10639SDarren.Reed@Sun.COM */ 101*10639SDarren.Reed@Sun.COM kmutex_t bd_lock; 102*10639SDarren.Reed@Sun.COM kcondvar_t bd_wait; 103*10639SDarren.Reed@Sun.COM uintptr_t bd_mcip; /* Where mac_client_handle_t gets put */ 104*10639SDarren.Reed@Sun.COM uintptr_t bd_promisc_handle; 105*10639SDarren.Reed@Sun.COM minor_t bd_dev; /* device number for this handle */ 106*10639SDarren.Reed@Sun.COM int bd_fmode; /* flags from bpfopen */ 107*10639SDarren.Reed@Sun.COM zoneid_t bd_zone; /* zoneid of the opening process */ 108*10639SDarren.Reed@Sun.COM int bd_inuse; 109*10639SDarren.Reed@Sun.COM int bd_waiting; 110*10639SDarren.Reed@Sun.COM /* 111*10639SDarren.Reed@Sun.COM * bd_promisc_flags is used to store the promiscuous state of the 112*10639SDarren.Reed@Sun.COM * the interface in BPF so that the correct mode of operation can 113*10639SDarren.Reed@Sun.COM * be kept across changing DLT or network interface. 114*10639SDarren.Reed@Sun.COM */ 115*10639SDarren.Reed@Sun.COM int bd_promisc_flags; 116*10639SDarren.Reed@Sun.COM }; 117*10639SDarren.Reed@Sun.COM 118*10639SDarren.Reed@Sun.COM 119*10639SDarren.Reed@Sun.COM /* Values for bd_state */ 120*10639SDarren.Reed@Sun.COM #define BPF_IDLE 0 /* no select in progress */ 121*10639SDarren.Reed@Sun.COM #define BPF_WAITING 1 /* waiting for read timeout in select */ 122*10639SDarren.Reed@Sun.COM #define BPF_TIMED_OUT 2 /* read timeout has expired in select */ 123*10639SDarren.Reed@Sun.COM 124*10639SDarren.Reed@Sun.COM /* 125*10639SDarren.Reed@Sun.COM * Description associated with the external representation of each 126*10639SDarren.Reed@Sun.COM * open bpf file. 127*10639SDarren.Reed@Sun.COM */ 128*10639SDarren.Reed@Sun.COM struct bpf_d_ext { 129*10639SDarren.Reed@Sun.COM int32_t bde_bufsize; 130*10639SDarren.Reed@Sun.COM uint8_t bde_promisc; 131*10639SDarren.Reed@Sun.COM uint8_t bde_state; 132*10639SDarren.Reed@Sun.COM uint8_t bde_immediate; 133*10639SDarren.Reed@Sun.COM int32_t bde_hdrcmplt; 134*10639SDarren.Reed@Sun.COM int32_t bde_seesent; 135*10639SDarren.Reed@Sun.COM pid_t bde_pid; 136*10639SDarren.Reed@Sun.COM uint64_t bde_rcount; /* number of packets received */ 137*10639SDarren.Reed@Sun.COM uint64_t bde_dcount; /* number of packets dropped */ 138*10639SDarren.Reed@Sun.COM uint64_t bde_ccount; /* number of packets captured */ 139*10639SDarren.Reed@Sun.COM char bde_ifname[IFNAMSIZ]; 140*10639SDarren.Reed@Sun.COM }; 141*10639SDarren.Reed@Sun.COM 142*10639SDarren.Reed@Sun.COM /* 143*10639SDarren.Reed@Sun.COM * Access to "layer 2" networking is provided through each such provider 144*10639SDarren.Reed@Sun.COM * delcaring a set of functions to use in the structure below. It has been 145*10639SDarren.Reed@Sun.COM * modeled around what's required to use the mac layer. All of the functions 146*10639SDarren.Reed@Sun.COM * below must be declared, even if only filled by a stub function. 147*10639SDarren.Reed@Sun.COM */ 148*10639SDarren.Reed@Sun.COM typedef struct bpf_provider_s { 149*10639SDarren.Reed@Sun.COM int bpr_unit; 150*10639SDarren.Reed@Sun.COM int (*bpr_open)(const char *, uintptr_t *, zoneid_t); 151*10639SDarren.Reed@Sun.COM void (*bpr_close)(uintptr_t); 152*10639SDarren.Reed@Sun.COM const char *(*bpr_name)(uintptr_t); 153*10639SDarren.Reed@Sun.COM int (*bpr_type)(uintptr_t); 154*10639SDarren.Reed@Sun.COM void (*bpr_sdu_get)(uintptr_t, uint_t *); 155*10639SDarren.Reed@Sun.COM int (*bpr_tx)(uintptr_t, mblk_t *); 156*10639SDarren.Reed@Sun.COM uintptr_t (*bpr_promisc_add)(uintptr_t, int, void *, uintptr_t *, 157*10639SDarren.Reed@Sun.COM int); 158*10639SDarren.Reed@Sun.COM void (*bpr_promisc_remove)(uintptr_t); 159*10639SDarren.Reed@Sun.COM int (*bpr_getlinkid)(const char *, datalink_id_t *, 160*10639SDarren.Reed@Sun.COM zoneid_t); 161*10639SDarren.Reed@Sun.COM void (*bpr_client_close)(uintptr_t); 162*10639SDarren.Reed@Sun.COM const char *(*bpr_client_name)(uintptr_t); 163*10639SDarren.Reed@Sun.COM int (*bpr_client_open)(uintptr_t, uintptr_t *); 164*10639SDarren.Reed@Sun.COM } bpf_provider_t; 165*10639SDarren.Reed@Sun.COM 166*10639SDarren.Reed@Sun.COM typedef struct bpf_provider_list { 167*10639SDarren.Reed@Sun.COM LIST_ENTRY(bpf_provider_list) bpl_next; 168*10639SDarren.Reed@Sun.COM bpf_provider_t *bpl_what; 169*10639SDarren.Reed@Sun.COM } bpf_provider_list_t; 170*10639SDarren.Reed@Sun.COM 171*10639SDarren.Reed@Sun.COM /* 172*10639SDarren.Reed@Sun.COM * The bpr_field from bpf_provider_t expects an integer that comes from 173*10639SDarren.Reed@Sun.COM * the list of defines below. 174*10639SDarren.Reed@Sun.COM */ 175*10639SDarren.Reed@Sun.COM #define BPR_MAC 1 176*10639SDarren.Reed@Sun.COM #define BPR_IPNET 2 177*10639SDarren.Reed@Sun.COM 178*10639SDarren.Reed@Sun.COM #define MBPF_OPEN(_m, _n, _p, _z) (_m)->bpr_open(_n, (uintptr_t *)_p, _z) 179*10639SDarren.Reed@Sun.COM #define MBPF_CLOSE(_m, _h) (_m)->bpr_close(_h) 180*10639SDarren.Reed@Sun.COM #define MBPF_NAME(_m, _h) (_m)->bpr_name(_h) 181*10639SDarren.Reed@Sun.COM #define MBPF_TYPE(_m, _h) (_m)->bpr_type(_h) 182*10639SDarren.Reed@Sun.COM #define MBPF_SDU_GET(_m, _h, _p) (_m)->bpr_sdu_get(_h, _p) 183*10639SDarren.Reed@Sun.COM #define MBPF_TX(_m, _h, _pkt) (_m)->bpr_tx(_h, _pkt) 184*10639SDarren.Reed@Sun.COM #define MBPF_PROMISC_ADD(_m, _h, _o, _d, _p, _f) \ 185*10639SDarren.Reed@Sun.COM (_m)->bpr_promisc_add(_h, _o, _d, _p, _f) 186*10639SDarren.Reed@Sun.COM #define MBPF_PROMISC_REMOVE(_m, _h) (_m)->bpr_promisc_remove(_h) 187*10639SDarren.Reed@Sun.COM #define MBPF_GET_LINKID(_m, _n, _ip, _z) \ 188*10639SDarren.Reed@Sun.COM (_m)->bpr_getlinkid(_n, _ip, _z) 189*10639SDarren.Reed@Sun.COM #define MBPF_CLIENT_CLOSE(_m, _h) (_m)->bpr_client_close(_h) 190*10639SDarren.Reed@Sun.COM #define MBPF_CLIENT_NAME(_m, _h) (_m)->bpr_client_name(_h) 191*10639SDarren.Reed@Sun.COM #define MBPF_CLIENT_OPEN(_m, _h, _p) (_m)->bpr_client_open((uintptr_t)_h, \ 192*10639SDarren.Reed@Sun.COM (uintptr_t *)_p) 193*10639SDarren.Reed@Sun.COM 194*10639SDarren.Reed@Sun.COM /* 195*10639SDarren.Reed@Sun.COM * Descriptor associated with each attached hardware interface. 196*10639SDarren.Reed@Sun.COM */ 197*10639SDarren.Reed@Sun.COM struct bpf_if { 198*10639SDarren.Reed@Sun.COM TAILQ_ENTRY(bpf_if) bif_next; /* list of all interfaces */ 199*10639SDarren.Reed@Sun.COM LIST_HEAD(, bpf_d) bif_dlist; /* list of all descriptors att'd */ 200*10639SDarren.Reed@Sun.COM uint_t bif_dlt; /* link layer type */ 201*10639SDarren.Reed@Sun.COM uint_t bif_hdrlen; /* length of header (with padding) */ 202*10639SDarren.Reed@Sun.COM /* 203*10639SDarren.Reed@Sun.COM * Solaris specific bits after this. 204*10639SDarren.Reed@Sun.COM */ 205*10639SDarren.Reed@Sun.COM uintptr_t bif_ifp; /* correspoding interface */ 206*10639SDarren.Reed@Sun.COM datalink_id_t bif_linkid; 207*10639SDarren.Reed@Sun.COM kmutex_t bif_lock; 208*10639SDarren.Reed@Sun.COM zoneid_t bif_zoneid; /* zone that the interface is in */ 209*10639SDarren.Reed@Sun.COM int bif_inuse; 210*10639SDarren.Reed@Sun.COM bpf_provider_t bif_mac; 211*10639SDarren.Reed@Sun.COM char bif_ifname[LIFNAMSIZ+1]; 212*10639SDarren.Reed@Sun.COM }; 213*10639SDarren.Reed@Sun.COM 214*10639SDarren.Reed@Sun.COM #ifdef _KERNEL 215*10639SDarren.Reed@Sun.COM typedef struct bpf_kstats_s { 216*10639SDarren.Reed@Sun.COM kstat_named_t kp_read_wait; 217*10639SDarren.Reed@Sun.COM kstat_named_t kp_write_ok; 218*10639SDarren.Reed@Sun.COM kstat_named_t kp_write_error; 219*10639SDarren.Reed@Sun.COM kstat_named_t kp_receive; 220*10639SDarren.Reed@Sun.COM kstat_named_t kp_capture; 221*10639SDarren.Reed@Sun.COM kstat_named_t kp_dropped; 222*10639SDarren.Reed@Sun.COM } bpf_kstats_t; 223*10639SDarren.Reed@Sun.COM 224*10639SDarren.Reed@Sun.COM int bpf_setf(struct bpf_d *, struct bpf_program *); 225*10639SDarren.Reed@Sun.COM #endif 226*10639SDarren.Reed@Sun.COM 227*10639SDarren.Reed@Sun.COM typedef void (*bpf_attach_fn_t)(uintptr_t, int, zoneid_t, int); 228*10639SDarren.Reed@Sun.COM typedef void (*bpf_detach_fn_t)(uintptr_t); 229*10639SDarren.Reed@Sun.COM typedef int (*bpf_provider_reg_fn_t)(bpf_provider_t *); 230*10639SDarren.Reed@Sun.COM 231*10639SDarren.Reed@Sun.COM extern bpf_provider_t *bpf_find_provider_by_id(int); 232*10639SDarren.Reed@Sun.COM extern void bpf_open_zone(const zoneid_t); 233*10639SDarren.Reed@Sun.COM extern int bpf_provider_tickle(char *, zoneid_t); 234*10639SDarren.Reed@Sun.COM 235*10639SDarren.Reed@Sun.COM #endif /* !_NET_BPFDESC_H_ */ 236