10a0e9771SDarren Reed /* $NetBSD: bpfdesc.h,v 1.29 2009/03/14 14:46:10 dsl Exp $ */ 20a0e9771SDarren Reed 30a0e9771SDarren Reed /* 40a0e9771SDarren Reed * Copyright (c) 1990, 1991, 1993 50a0e9771SDarren Reed * The Regents of the University of California. All rights reserved. 60a0e9771SDarren Reed * 70a0e9771SDarren Reed * This code is derived from the Stanford/CMU enet packet filter, 80a0e9771SDarren Reed * (net/enet.c) distributed as part of 4.3BSD, and code contributed 90a0e9771SDarren Reed * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 100a0e9771SDarren Reed * Berkeley Laboratory. 110a0e9771SDarren Reed * 120a0e9771SDarren Reed * Redistribution and use in source and binary forms, with or without 130a0e9771SDarren Reed * modification, are permitted provided that the following conditions 140a0e9771SDarren Reed * are met: 150a0e9771SDarren Reed * 1. Redistributions of source code must retain the above copyright 160a0e9771SDarren Reed * notice, this list of conditions and the following disclaimer. 170a0e9771SDarren Reed * 2. Redistributions in binary form must reproduce the above copyright 180a0e9771SDarren Reed * notice, this list of conditions and the following disclaimer in the 190a0e9771SDarren Reed * documentation and/or other materials provided with the distribution. 200a0e9771SDarren Reed * 3. Neither the name of the University nor the names of its contributors 210a0e9771SDarren Reed * may be used to endorse or promote products derived from this software 220a0e9771SDarren Reed * without specific prior written permission. 230a0e9771SDarren Reed * 240a0e9771SDarren Reed * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 250a0e9771SDarren Reed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 260a0e9771SDarren Reed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 270a0e9771SDarren Reed * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 280a0e9771SDarren Reed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 290a0e9771SDarren Reed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 300a0e9771SDarren Reed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 310a0e9771SDarren Reed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 320a0e9771SDarren Reed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 330a0e9771SDarren Reed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 340a0e9771SDarren Reed * SUCH DAMAGE. 350a0e9771SDarren Reed * 360a0e9771SDarren Reed * @(#)bpfdesc.h 8.1 (Berkeley) 6/10/93 370a0e9771SDarren Reed * 380a0e9771SDarren Reed * @(#) Header: bpfdesc.h,v 1.14 96/06/16 22:28:07 leres Exp (LBL) 390a0e9771SDarren Reed */ 400a0e9771SDarren Reed /* 410a0e9771SDarren Reed * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 420a0e9771SDarren Reed * Use is subject to license terms. 430a0e9771SDarren Reed */ 440a0e9771SDarren Reed 450a0e9771SDarren Reed #ifndef _NET_BPFDESC_H_ 460a0e9771SDarren Reed #define _NET_BPFDESC_H_ 470a0e9771SDarren Reed 480a0e9771SDarren Reed #include <net/if.h> /* for IFNAMSIZ */ 490a0e9771SDarren Reed #include <sys/mutex.h> 500a0e9771SDarren Reed #include <sys/condvar.h> 510a0e9771SDarren Reed #include <sys/queue.h> 520a0e9771SDarren Reed 530a0e9771SDarren Reed /* 54*b7ea883bSDarren Reed * Access to "layer 2" networking is provided through each such provider 55*b7ea883bSDarren Reed * delcaring a set of functions to use in the structure below. It has been 56*b7ea883bSDarren Reed * modeled around what's required to use the mac layer. All of the functions 57*b7ea883bSDarren Reed * below must be declared, even if only filled by a stub function. 58*b7ea883bSDarren Reed */ 59*b7ea883bSDarren Reed typedef struct bpf_provider_s { 60*b7ea883bSDarren Reed int bpr_unit; 61*b7ea883bSDarren Reed int (*bpr_open)(const char *, uintptr_t *, zoneid_t); 62*b7ea883bSDarren Reed void (*bpr_close)(uintptr_t); 63*b7ea883bSDarren Reed const char *(*bpr_name)(uintptr_t); 64*b7ea883bSDarren Reed int (*bpr_type)(uintptr_t); 65*b7ea883bSDarren Reed void (*bpr_sdu_get)(uintptr_t, uint_t *); 66*b7ea883bSDarren Reed int (*bpr_tx)(uintptr_t, mblk_t *); 67*b7ea883bSDarren Reed uintptr_t (*bpr_promisc_add)(uintptr_t, int, void *, uintptr_t *, 68*b7ea883bSDarren Reed int); 69*b7ea883bSDarren Reed void (*bpr_promisc_remove)(uintptr_t); 70*b7ea883bSDarren Reed int (*bpr_getlinkid)(const char *, datalink_id_t *, 71*b7ea883bSDarren Reed zoneid_t); 72*b7ea883bSDarren Reed void (*bpr_client_close)(uintptr_t); 73*b7ea883bSDarren Reed const char *(*bpr_client_name)(uintptr_t); 74*b7ea883bSDarren Reed int (*bpr_client_open)(uintptr_t, uintptr_t *); 75*b7ea883bSDarren Reed int (*bpr_getzone)(uintptr_t, zoneid_t *); 76*b7ea883bSDarren Reed int (*bpr_getdlt)(uintptr_t, uint_t *); 77*b7ea883bSDarren Reed } bpf_provider_t; 78*b7ea883bSDarren Reed 79*b7ea883bSDarren Reed typedef struct bpf_provider_list { 80*b7ea883bSDarren Reed LIST_ENTRY(bpf_provider_list) bpl_next; 81*b7ea883bSDarren Reed bpf_provider_t *bpl_what; 82*b7ea883bSDarren Reed } bpf_provider_list_t; 83*b7ea883bSDarren Reed 84*b7ea883bSDarren Reed /* 85*b7ea883bSDarren Reed * The bpr_field from bpf_provider_t expects an integer that comes from 86*b7ea883bSDarren Reed * the list of defines below. 87*b7ea883bSDarren Reed */ 88*b7ea883bSDarren Reed #define BPR_MAC 1 89*b7ea883bSDarren Reed #define BPR_IPNET 2 90*b7ea883bSDarren Reed 91*b7ea883bSDarren Reed #define MBPF_OPEN(_m, _n, _p, _z) (_m)->bpr_open(_n, (uintptr_t *)_p, _z) 92*b7ea883bSDarren Reed #define MBPF_CLOSE(_m, _h) (_m)->bpr_close(_h) 93*b7ea883bSDarren Reed #define MBPF_NAME(_m, _h) (_m)->bpr_name(_h) 94*b7ea883bSDarren Reed #define MBPF_TYPE(_m, _h) (_m)->bpr_type(_h) 95*b7ea883bSDarren Reed #define MBPF_SDU_GET(_m, _h, _p) (_m)->bpr_sdu_get(_h, _p) 96*b7ea883bSDarren Reed #define MBPF_TX(_m, _h, _pkt) (_m)->bpr_tx(_h, _pkt) 97*b7ea883bSDarren Reed #define MBPF_PROMISC_ADD(_m, _h, _o, _d, _p, _f) \ 98*b7ea883bSDarren Reed (_m)->bpr_promisc_add(_h, _o, _d, _p, _f) 99*b7ea883bSDarren Reed #define MBPF_PROMISC_REMOVE(_m, _h) (_m)->bpr_promisc_remove(_h) 100*b7ea883bSDarren Reed #define MBPF_GET_LINKID(_m, _n, _ip, _z) \ 101*b7ea883bSDarren Reed (_m)->bpr_getlinkid(_n, _ip, _z) 102*b7ea883bSDarren Reed #define MBPF_CLIENT_CLOSE(_m, _h) (_m)->bpr_client_close(_h) 103*b7ea883bSDarren Reed #define MBPF_CLIENT_NAME(_m, _h) (_m)->bpr_client_name(_h) 104*b7ea883bSDarren Reed #define MBPF_CLIENT_OPEN(_m, _h, _p) (_m)->bpr_client_open((uintptr_t)_h, \ 105*b7ea883bSDarren Reed (uintptr_t *)_p) 106*b7ea883bSDarren Reed #define MBPF_GET_ZONE(_m, _h, _zp) (_m)->bpr_getzone(_h, _zp) 107*b7ea883bSDarren Reed #define MBPF_GET_DLT(_m, _h, _dp) (_m)->bpr_getdlt(_h, _dp); 108*b7ea883bSDarren Reed #define MBPF_GET_HDRLEN(_m, _h, _dp) (_m)->bpr_gethdrlen(_h, _dp); 109*b7ea883bSDarren Reed 110*b7ea883bSDarren Reed 111*b7ea883bSDarren Reed /* 1120a0e9771SDarren Reed * Descriptor associated with each open bpf file. 1130a0e9771SDarren Reed */ 1140a0e9771SDarren Reed struct bpf_d { 1150a0e9771SDarren Reed LIST_ENTRY(bpf_d) bd_list; /* List of bpf_d */ 1160a0e9771SDarren Reed LIST_ENTRY(bpf_d) bd_next; /* List attaced to bif_if */ 1170a0e9771SDarren Reed /* 1180a0e9771SDarren Reed * Buffer slots: two mbuf clusters buffer the incoming packets. 1190a0e9771SDarren Reed * The model has three slots. Sbuf is always occupied. 1200a0e9771SDarren Reed * sbuf (store) - Receive interrupt puts packets here. 1210a0e9771SDarren Reed * hbuf (hold) - When sbuf is full, put cluster here and 1220a0e9771SDarren Reed * wakeup read (replace sbuf with fbuf). 1230a0e9771SDarren Reed * fbuf (free) - When read is done, put cluster here. 1240a0e9771SDarren Reed * On receiving, if sbuf is full and fbuf is 0, packet is dropped. 1250a0e9771SDarren Reed */ 1260a0e9771SDarren Reed void * bd_sbuf; /* store slot */ 1270a0e9771SDarren Reed void * bd_hbuf; /* hold slot */ 1280a0e9771SDarren Reed void * bd_fbuf; /* free slot */ 1290a0e9771SDarren Reed int bd_slen; /* current length of store buffer */ 1300a0e9771SDarren Reed int bd_hlen; /* current length of hold buffer */ 1310a0e9771SDarren Reed 1320a0e9771SDarren Reed int bd_bufsize; /* absolute length of buffers */ 1330a0e9771SDarren Reed 134*b7ea883bSDarren Reed uintptr_t bd_bif; /* interface pointer */ 1350a0e9771SDarren Reed ulong_t bd_rtout; /* Read timeout in 'ticks' */ 1360a0e9771SDarren Reed struct bpf_insn *bd_filter; /* filter code */ 1370a0e9771SDarren Reed size_t bd_filter_size; 1380a0e9771SDarren Reed ulong_t bd_rcount; /* number of packets received */ 1390a0e9771SDarren Reed ulong_t bd_dcount; /* number of packets dropped */ 1400a0e9771SDarren Reed ulong_t bd_ccount; /* number of packets captured */ 1410a0e9771SDarren Reed 1420a0e9771SDarren Reed uchar_t bd_promisc; /* true if listening promiscuously */ 1430a0e9771SDarren Reed uchar_t bd_state; /* idle, waiting, or timed out */ 1440a0e9771SDarren Reed uchar_t bd_immediate; /* true to return on packet arrival */ 1450a0e9771SDarren Reed int bd_hdrcmplt; /* false to fill in src lladdr */ 1460a0e9771SDarren Reed int bd_seesent; /* true if bpf should see sent pkts */ 1470a0e9771SDarren Reed int bd_async; /* non-zero if packet reception .. */ 1480a0e9771SDarren Reed /* .. should generate signal */ 1490a0e9771SDarren Reed int bd_nonblock; /* non-zero for non-blocking read */ 1500a0e9771SDarren Reed pid_t bd_pgid; /* process or group id for signal */ 1510a0e9771SDarren Reed int bd_timedout; 1520a0e9771SDarren Reed struct pollhead bd_poll; 1530a0e9771SDarren Reed timeout_id_t bd_callout; /* for BPF timeouts with select */ 1540a0e9771SDarren Reed pid_t bd_pid; /* corresponding PID */ 1550a0e9771SDarren Reed void *bd_sih; /* soft interrupt handle */ 1560a0e9771SDarren Reed /* 1570a0e9771SDarren Reed * Solaris specific bits after this. 1580a0e9771SDarren Reed */ 1590a0e9771SDarren Reed kmutex_t bd_lock; 1600a0e9771SDarren Reed kcondvar_t bd_wait; 161*b7ea883bSDarren Reed uintptr_t bd_mh; /* where mac_handle gets put */ 1620a0e9771SDarren Reed uintptr_t bd_mcip; /* Where mac_client_handle_t gets put */ 1630a0e9771SDarren Reed uintptr_t bd_promisc_handle; 1640a0e9771SDarren Reed minor_t bd_dev; /* device number for this handle */ 1650a0e9771SDarren Reed int bd_fmode; /* flags from bpfopen */ 1660a0e9771SDarren Reed zoneid_t bd_zone; /* zoneid of the opening process */ 1670a0e9771SDarren Reed int bd_inuse; 1680a0e9771SDarren Reed int bd_waiting; 169*b7ea883bSDarren Reed char bd_ifname[LIFNAMSIZ]; 170*b7ea883bSDarren Reed int bd_dlt; 171*b7ea883bSDarren Reed int bd_hdrlen; 172*b7ea883bSDarren Reed bpf_provider_t bd_mac; 173*b7ea883bSDarren Reed datalink_id_t bd_linkid; 1740a0e9771SDarren Reed /* 1750a0e9771SDarren Reed * bd_promisc_flags is used to store the promiscuous state of the 1760a0e9771SDarren Reed * the interface in BPF so that the correct mode of operation can 1770a0e9771SDarren Reed * be kept across changing DLT or network interface. 1780a0e9771SDarren Reed */ 1790a0e9771SDarren Reed int bd_promisc_flags; 1800a0e9771SDarren Reed }; 1810a0e9771SDarren Reed 1820a0e9771SDarren Reed 1830a0e9771SDarren Reed /* Values for bd_state */ 1840a0e9771SDarren Reed #define BPF_IDLE 0 /* no select in progress */ 1850a0e9771SDarren Reed #define BPF_WAITING 1 /* waiting for read timeout in select */ 1860a0e9771SDarren Reed #define BPF_TIMED_OUT 2 /* read timeout has expired in select */ 1870a0e9771SDarren Reed 1880a0e9771SDarren Reed /* 1890a0e9771SDarren Reed * Description associated with the external representation of each 1900a0e9771SDarren Reed * open bpf file. 1910a0e9771SDarren Reed */ 1920a0e9771SDarren Reed struct bpf_d_ext { 1930a0e9771SDarren Reed int32_t bde_bufsize; 1940a0e9771SDarren Reed uint8_t bde_promisc; 1950a0e9771SDarren Reed uint8_t bde_state; 1960a0e9771SDarren Reed uint8_t bde_immediate; 1970a0e9771SDarren Reed int32_t bde_hdrcmplt; 1980a0e9771SDarren Reed int32_t bde_seesent; 1990a0e9771SDarren Reed pid_t bde_pid; 2000a0e9771SDarren Reed uint64_t bde_rcount; /* number of packets received */ 2010a0e9771SDarren Reed uint64_t bde_dcount; /* number of packets dropped */ 2020a0e9771SDarren Reed uint64_t bde_ccount; /* number of packets captured */ 2030a0e9771SDarren Reed char bde_ifname[IFNAMSIZ]; 2040a0e9771SDarren Reed }; 2050a0e9771SDarren Reed 2060a0e9771SDarren Reed #ifdef _KERNEL 2070a0e9771SDarren Reed typedef struct bpf_kstats_s { 2080a0e9771SDarren Reed kstat_named_t kp_read_wait; 2090a0e9771SDarren Reed kstat_named_t kp_write_ok; 2100a0e9771SDarren Reed kstat_named_t kp_write_error; 2110a0e9771SDarren Reed kstat_named_t kp_receive; 2120a0e9771SDarren Reed kstat_named_t kp_capture; 2130a0e9771SDarren Reed kstat_named_t kp_dropped; 2140a0e9771SDarren Reed } bpf_kstats_t; 2150a0e9771SDarren Reed 2160a0e9771SDarren Reed int bpf_setf(struct bpf_d *, struct bpf_program *); 2170a0e9771SDarren Reed #endif 2180a0e9771SDarren Reed 2190a0e9771SDarren Reed typedef void (*bpf_attach_fn_t)(uintptr_t, int, zoneid_t, int); 2200a0e9771SDarren Reed typedef void (*bpf_detach_fn_t)(uintptr_t); 2210a0e9771SDarren Reed typedef int (*bpf_provider_reg_fn_t)(bpf_provider_t *); 222*b7ea883bSDarren Reed typedef LIST_HEAD(, bpf_provider_list) bpf_provider_head_t; 2230a0e9771SDarren Reed 2240a0e9771SDarren Reed extern bpf_provider_t *bpf_find_provider_by_id(int); 2250a0e9771SDarren Reed extern int bpf_provider_tickle(char *, zoneid_t); 226*b7ea883bSDarren Reed extern bpf_provider_head_t bpf_providers; 2270a0e9771SDarren Reed 2280a0e9771SDarren Reed #endif /* !_NET_BPFDESC_H_ */ 229