110639SDarren.Reed@Sun.COM /* $NetBSD: bpfdesc.h,v 1.29 2009/03/14 14:46:10 dsl Exp $ */ 210639SDarren.Reed@Sun.COM 310639SDarren.Reed@Sun.COM /* 410639SDarren.Reed@Sun.COM * Copyright (c) 1990, 1991, 1993 510639SDarren.Reed@Sun.COM * The Regents of the University of California. All rights reserved. 610639SDarren.Reed@Sun.COM * 710639SDarren.Reed@Sun.COM * This code is derived from the Stanford/CMU enet packet filter, 810639SDarren.Reed@Sun.COM * (net/enet.c) distributed as part of 4.3BSD, and code contributed 910639SDarren.Reed@Sun.COM * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 1010639SDarren.Reed@Sun.COM * Berkeley Laboratory. 1110639SDarren.Reed@Sun.COM * 1210639SDarren.Reed@Sun.COM * Redistribution and use in source and binary forms, with or without 1310639SDarren.Reed@Sun.COM * modification, are permitted provided that the following conditions 1410639SDarren.Reed@Sun.COM * are met: 1510639SDarren.Reed@Sun.COM * 1. Redistributions of source code must retain the above copyright 1610639SDarren.Reed@Sun.COM * notice, this list of conditions and the following disclaimer. 1710639SDarren.Reed@Sun.COM * 2. Redistributions in binary form must reproduce the above copyright 1810639SDarren.Reed@Sun.COM * notice, this list of conditions and the following disclaimer in the 1910639SDarren.Reed@Sun.COM * documentation and/or other materials provided with the distribution. 2010639SDarren.Reed@Sun.COM * 3. Neither the name of the University nor the names of its contributors 2110639SDarren.Reed@Sun.COM * may be used to endorse or promote products derived from this software 2210639SDarren.Reed@Sun.COM * without specific prior written permission. 2310639SDarren.Reed@Sun.COM * 2410639SDarren.Reed@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2510639SDarren.Reed@Sun.COM * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2610639SDarren.Reed@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2710639SDarren.Reed@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2810639SDarren.Reed@Sun.COM * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2910639SDarren.Reed@Sun.COM * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3010639SDarren.Reed@Sun.COM * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3110639SDarren.Reed@Sun.COM * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3210639SDarren.Reed@Sun.COM * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3310639SDarren.Reed@Sun.COM * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3410639SDarren.Reed@Sun.COM * SUCH DAMAGE. 3510639SDarren.Reed@Sun.COM * 3610639SDarren.Reed@Sun.COM * @(#)bpfdesc.h 8.1 (Berkeley) 6/10/93 3710639SDarren.Reed@Sun.COM * 3810639SDarren.Reed@Sun.COM * @(#) Header: bpfdesc.h,v 1.14 96/06/16 22:28:07 leres Exp (LBL) 3910639SDarren.Reed@Sun.COM */ 4010639SDarren.Reed@Sun.COM /* 4110639SDarren.Reed@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 4210639SDarren.Reed@Sun.COM * Use is subject to license terms. 4310639SDarren.Reed@Sun.COM */ 4410639SDarren.Reed@Sun.COM 4510639SDarren.Reed@Sun.COM #ifndef _NET_BPFDESC_H_ 4610639SDarren.Reed@Sun.COM #define _NET_BPFDESC_H_ 4710639SDarren.Reed@Sun.COM 4810639SDarren.Reed@Sun.COM #include <net/if.h> /* for IFNAMSIZ */ 4910639SDarren.Reed@Sun.COM #include <sys/mutex.h> 5010639SDarren.Reed@Sun.COM #include <sys/condvar.h> 5110639SDarren.Reed@Sun.COM #include <sys/queue.h> 5210639SDarren.Reed@Sun.COM 5310639SDarren.Reed@Sun.COM /* 54*11179SDarren.Reed@Sun.COM * Access to "layer 2" networking is provided through each such provider 55*11179SDarren.Reed@Sun.COM * delcaring a set of functions to use in the structure below. It has been 56*11179SDarren.Reed@Sun.COM * modeled around what's required to use the mac layer. All of the functions 57*11179SDarren.Reed@Sun.COM * below must be declared, even if only filled by a stub function. 58*11179SDarren.Reed@Sun.COM */ 59*11179SDarren.Reed@Sun.COM typedef struct bpf_provider_s { 60*11179SDarren.Reed@Sun.COM int bpr_unit; 61*11179SDarren.Reed@Sun.COM int (*bpr_open)(const char *, uintptr_t *, zoneid_t); 62*11179SDarren.Reed@Sun.COM void (*bpr_close)(uintptr_t); 63*11179SDarren.Reed@Sun.COM const char *(*bpr_name)(uintptr_t); 64*11179SDarren.Reed@Sun.COM int (*bpr_type)(uintptr_t); 65*11179SDarren.Reed@Sun.COM void (*bpr_sdu_get)(uintptr_t, uint_t *); 66*11179SDarren.Reed@Sun.COM int (*bpr_tx)(uintptr_t, mblk_t *); 67*11179SDarren.Reed@Sun.COM uintptr_t (*bpr_promisc_add)(uintptr_t, int, void *, uintptr_t *, 68*11179SDarren.Reed@Sun.COM int); 69*11179SDarren.Reed@Sun.COM void (*bpr_promisc_remove)(uintptr_t); 70*11179SDarren.Reed@Sun.COM int (*bpr_getlinkid)(const char *, datalink_id_t *, 71*11179SDarren.Reed@Sun.COM zoneid_t); 72*11179SDarren.Reed@Sun.COM void (*bpr_client_close)(uintptr_t); 73*11179SDarren.Reed@Sun.COM const char *(*bpr_client_name)(uintptr_t); 74*11179SDarren.Reed@Sun.COM int (*bpr_client_open)(uintptr_t, uintptr_t *); 75*11179SDarren.Reed@Sun.COM int (*bpr_getzone)(uintptr_t, zoneid_t *); 76*11179SDarren.Reed@Sun.COM int (*bpr_getdlt)(uintptr_t, uint_t *); 77*11179SDarren.Reed@Sun.COM } bpf_provider_t; 78*11179SDarren.Reed@Sun.COM 79*11179SDarren.Reed@Sun.COM typedef struct bpf_provider_list { 80*11179SDarren.Reed@Sun.COM LIST_ENTRY(bpf_provider_list) bpl_next; 81*11179SDarren.Reed@Sun.COM bpf_provider_t *bpl_what; 82*11179SDarren.Reed@Sun.COM } bpf_provider_list_t; 83*11179SDarren.Reed@Sun.COM 84*11179SDarren.Reed@Sun.COM /* 85*11179SDarren.Reed@Sun.COM * The bpr_field from bpf_provider_t expects an integer that comes from 86*11179SDarren.Reed@Sun.COM * the list of defines below. 87*11179SDarren.Reed@Sun.COM */ 88*11179SDarren.Reed@Sun.COM #define BPR_MAC 1 89*11179SDarren.Reed@Sun.COM #define BPR_IPNET 2 90*11179SDarren.Reed@Sun.COM 91*11179SDarren.Reed@Sun.COM #define MBPF_OPEN(_m, _n, _p, _z) (_m)->bpr_open(_n, (uintptr_t *)_p, _z) 92*11179SDarren.Reed@Sun.COM #define MBPF_CLOSE(_m, _h) (_m)->bpr_close(_h) 93*11179SDarren.Reed@Sun.COM #define MBPF_NAME(_m, _h) (_m)->bpr_name(_h) 94*11179SDarren.Reed@Sun.COM #define MBPF_TYPE(_m, _h) (_m)->bpr_type(_h) 95*11179SDarren.Reed@Sun.COM #define MBPF_SDU_GET(_m, _h, _p) (_m)->bpr_sdu_get(_h, _p) 96*11179SDarren.Reed@Sun.COM #define MBPF_TX(_m, _h, _pkt) (_m)->bpr_tx(_h, _pkt) 97*11179SDarren.Reed@Sun.COM #define MBPF_PROMISC_ADD(_m, _h, _o, _d, _p, _f) \ 98*11179SDarren.Reed@Sun.COM (_m)->bpr_promisc_add(_h, _o, _d, _p, _f) 99*11179SDarren.Reed@Sun.COM #define MBPF_PROMISC_REMOVE(_m, _h) (_m)->bpr_promisc_remove(_h) 100*11179SDarren.Reed@Sun.COM #define MBPF_GET_LINKID(_m, _n, _ip, _z) \ 101*11179SDarren.Reed@Sun.COM (_m)->bpr_getlinkid(_n, _ip, _z) 102*11179SDarren.Reed@Sun.COM #define MBPF_CLIENT_CLOSE(_m, _h) (_m)->bpr_client_close(_h) 103*11179SDarren.Reed@Sun.COM #define MBPF_CLIENT_NAME(_m, _h) (_m)->bpr_client_name(_h) 104*11179SDarren.Reed@Sun.COM #define MBPF_CLIENT_OPEN(_m, _h, _p) (_m)->bpr_client_open((uintptr_t)_h, \ 105*11179SDarren.Reed@Sun.COM (uintptr_t *)_p) 106*11179SDarren.Reed@Sun.COM #define MBPF_GET_ZONE(_m, _h, _zp) (_m)->bpr_getzone(_h, _zp) 107*11179SDarren.Reed@Sun.COM #define MBPF_GET_DLT(_m, _h, _dp) (_m)->bpr_getdlt(_h, _dp); 108*11179SDarren.Reed@Sun.COM #define MBPF_GET_HDRLEN(_m, _h, _dp) (_m)->bpr_gethdrlen(_h, _dp); 109*11179SDarren.Reed@Sun.COM 110*11179SDarren.Reed@Sun.COM 111*11179SDarren.Reed@Sun.COM /* 11210639SDarren.Reed@Sun.COM * Descriptor associated with each open bpf file. 11310639SDarren.Reed@Sun.COM */ 11410639SDarren.Reed@Sun.COM struct bpf_d { 11510639SDarren.Reed@Sun.COM LIST_ENTRY(bpf_d) bd_list; /* List of bpf_d */ 11610639SDarren.Reed@Sun.COM LIST_ENTRY(bpf_d) bd_next; /* List attaced to bif_if */ 11710639SDarren.Reed@Sun.COM /* 11810639SDarren.Reed@Sun.COM * Buffer slots: two mbuf clusters buffer the incoming packets. 11910639SDarren.Reed@Sun.COM * The model has three slots. Sbuf is always occupied. 12010639SDarren.Reed@Sun.COM * sbuf (store) - Receive interrupt puts packets here. 12110639SDarren.Reed@Sun.COM * hbuf (hold) - When sbuf is full, put cluster here and 12210639SDarren.Reed@Sun.COM * wakeup read (replace sbuf with fbuf). 12310639SDarren.Reed@Sun.COM * fbuf (free) - When read is done, put cluster here. 12410639SDarren.Reed@Sun.COM * On receiving, if sbuf is full and fbuf is 0, packet is dropped. 12510639SDarren.Reed@Sun.COM */ 12610639SDarren.Reed@Sun.COM void * bd_sbuf; /* store slot */ 12710639SDarren.Reed@Sun.COM void * bd_hbuf; /* hold slot */ 12810639SDarren.Reed@Sun.COM void * bd_fbuf; /* free slot */ 12910639SDarren.Reed@Sun.COM int bd_slen; /* current length of store buffer */ 13010639SDarren.Reed@Sun.COM int bd_hlen; /* current length of hold buffer */ 13110639SDarren.Reed@Sun.COM 13210639SDarren.Reed@Sun.COM int bd_bufsize; /* absolute length of buffers */ 13310639SDarren.Reed@Sun.COM 134*11179SDarren.Reed@Sun.COM uintptr_t bd_bif; /* interface pointer */ 13510639SDarren.Reed@Sun.COM ulong_t bd_rtout; /* Read timeout in 'ticks' */ 13610639SDarren.Reed@Sun.COM struct bpf_insn *bd_filter; /* filter code */ 13710639SDarren.Reed@Sun.COM size_t bd_filter_size; 13810639SDarren.Reed@Sun.COM ulong_t bd_rcount; /* number of packets received */ 13910639SDarren.Reed@Sun.COM ulong_t bd_dcount; /* number of packets dropped */ 14010639SDarren.Reed@Sun.COM ulong_t bd_ccount; /* number of packets captured */ 14110639SDarren.Reed@Sun.COM 14210639SDarren.Reed@Sun.COM uchar_t bd_promisc; /* true if listening promiscuously */ 14310639SDarren.Reed@Sun.COM uchar_t bd_state; /* idle, waiting, or timed out */ 14410639SDarren.Reed@Sun.COM uchar_t bd_immediate; /* true to return on packet arrival */ 14510639SDarren.Reed@Sun.COM int bd_hdrcmplt; /* false to fill in src lladdr */ 14610639SDarren.Reed@Sun.COM int bd_seesent; /* true if bpf should see sent pkts */ 14710639SDarren.Reed@Sun.COM int bd_async; /* non-zero if packet reception .. */ 14810639SDarren.Reed@Sun.COM /* .. should generate signal */ 14910639SDarren.Reed@Sun.COM int bd_nonblock; /* non-zero for non-blocking read */ 15010639SDarren.Reed@Sun.COM pid_t bd_pgid; /* process or group id for signal */ 15110639SDarren.Reed@Sun.COM int bd_timedout; 15210639SDarren.Reed@Sun.COM struct pollhead bd_poll; 15310639SDarren.Reed@Sun.COM timeout_id_t bd_callout; /* for BPF timeouts with select */ 15410639SDarren.Reed@Sun.COM pid_t bd_pid; /* corresponding PID */ 15510639SDarren.Reed@Sun.COM void *bd_sih; /* soft interrupt handle */ 15610639SDarren.Reed@Sun.COM /* 15710639SDarren.Reed@Sun.COM * Solaris specific bits after this. 15810639SDarren.Reed@Sun.COM */ 15910639SDarren.Reed@Sun.COM kmutex_t bd_lock; 16010639SDarren.Reed@Sun.COM kcondvar_t bd_wait; 161*11179SDarren.Reed@Sun.COM uintptr_t bd_mh; /* where mac_handle gets put */ 16210639SDarren.Reed@Sun.COM uintptr_t bd_mcip; /* Where mac_client_handle_t gets put */ 16310639SDarren.Reed@Sun.COM uintptr_t bd_promisc_handle; 16410639SDarren.Reed@Sun.COM minor_t bd_dev; /* device number for this handle */ 16510639SDarren.Reed@Sun.COM int bd_fmode; /* flags from bpfopen */ 16610639SDarren.Reed@Sun.COM zoneid_t bd_zone; /* zoneid of the opening process */ 16710639SDarren.Reed@Sun.COM int bd_inuse; 16810639SDarren.Reed@Sun.COM int bd_waiting; 169*11179SDarren.Reed@Sun.COM char bd_ifname[LIFNAMSIZ]; 170*11179SDarren.Reed@Sun.COM int bd_dlt; 171*11179SDarren.Reed@Sun.COM int bd_hdrlen; 172*11179SDarren.Reed@Sun.COM bpf_provider_t bd_mac; 173*11179SDarren.Reed@Sun.COM datalink_id_t bd_linkid; 17410639SDarren.Reed@Sun.COM /* 17510639SDarren.Reed@Sun.COM * bd_promisc_flags is used to store the promiscuous state of the 17610639SDarren.Reed@Sun.COM * the interface in BPF so that the correct mode of operation can 17710639SDarren.Reed@Sun.COM * be kept across changing DLT or network interface. 17810639SDarren.Reed@Sun.COM */ 17910639SDarren.Reed@Sun.COM int bd_promisc_flags; 18010639SDarren.Reed@Sun.COM }; 18110639SDarren.Reed@Sun.COM 18210639SDarren.Reed@Sun.COM 18310639SDarren.Reed@Sun.COM /* Values for bd_state */ 18410639SDarren.Reed@Sun.COM #define BPF_IDLE 0 /* no select in progress */ 18510639SDarren.Reed@Sun.COM #define BPF_WAITING 1 /* waiting for read timeout in select */ 18610639SDarren.Reed@Sun.COM #define BPF_TIMED_OUT 2 /* read timeout has expired in select */ 18710639SDarren.Reed@Sun.COM 18810639SDarren.Reed@Sun.COM /* 18910639SDarren.Reed@Sun.COM * Description associated with the external representation of each 19010639SDarren.Reed@Sun.COM * open bpf file. 19110639SDarren.Reed@Sun.COM */ 19210639SDarren.Reed@Sun.COM struct bpf_d_ext { 19310639SDarren.Reed@Sun.COM int32_t bde_bufsize; 19410639SDarren.Reed@Sun.COM uint8_t bde_promisc; 19510639SDarren.Reed@Sun.COM uint8_t bde_state; 19610639SDarren.Reed@Sun.COM uint8_t bde_immediate; 19710639SDarren.Reed@Sun.COM int32_t bde_hdrcmplt; 19810639SDarren.Reed@Sun.COM int32_t bde_seesent; 19910639SDarren.Reed@Sun.COM pid_t bde_pid; 20010639SDarren.Reed@Sun.COM uint64_t bde_rcount; /* number of packets received */ 20110639SDarren.Reed@Sun.COM uint64_t bde_dcount; /* number of packets dropped */ 20210639SDarren.Reed@Sun.COM uint64_t bde_ccount; /* number of packets captured */ 20310639SDarren.Reed@Sun.COM char bde_ifname[IFNAMSIZ]; 20410639SDarren.Reed@Sun.COM }; 20510639SDarren.Reed@Sun.COM 20610639SDarren.Reed@Sun.COM #ifdef _KERNEL 20710639SDarren.Reed@Sun.COM typedef struct bpf_kstats_s { 20810639SDarren.Reed@Sun.COM kstat_named_t kp_read_wait; 20910639SDarren.Reed@Sun.COM kstat_named_t kp_write_ok; 21010639SDarren.Reed@Sun.COM kstat_named_t kp_write_error; 21110639SDarren.Reed@Sun.COM kstat_named_t kp_receive; 21210639SDarren.Reed@Sun.COM kstat_named_t kp_capture; 21310639SDarren.Reed@Sun.COM kstat_named_t kp_dropped; 21410639SDarren.Reed@Sun.COM } bpf_kstats_t; 21510639SDarren.Reed@Sun.COM 21610639SDarren.Reed@Sun.COM int bpf_setf(struct bpf_d *, struct bpf_program *); 21710639SDarren.Reed@Sun.COM #endif 21810639SDarren.Reed@Sun.COM 21910639SDarren.Reed@Sun.COM typedef void (*bpf_attach_fn_t)(uintptr_t, int, zoneid_t, int); 22010639SDarren.Reed@Sun.COM typedef void (*bpf_detach_fn_t)(uintptr_t); 22110639SDarren.Reed@Sun.COM typedef int (*bpf_provider_reg_fn_t)(bpf_provider_t *); 222*11179SDarren.Reed@Sun.COM typedef LIST_HEAD(, bpf_provider_list) bpf_provider_head_t; 22310639SDarren.Reed@Sun.COM 22410639SDarren.Reed@Sun.COM extern bpf_provider_t *bpf_find_provider_by_id(int); 22510639SDarren.Reed@Sun.COM extern int bpf_provider_tickle(char *, zoneid_t); 226*11179SDarren.Reed@Sun.COM extern bpf_provider_head_t bpf_providers; 22710639SDarren.Reed@Sun.COM 22810639SDarren.Reed@Sun.COM #endif /* !_NET_BPFDESC_H_ */ 229