10a0e9771SDarren Reed /* 20a0e9771SDarren Reed * CDDL HEADER START 30a0e9771SDarren Reed * 40a0e9771SDarren Reed * The contents of this file are subject to the terms of the 50a0e9771SDarren Reed * Common Development and Distribution License (the "License"). 60a0e9771SDarren Reed * You may not use this file except in compliance with the License. 70a0e9771SDarren Reed * 80a0e9771SDarren Reed * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90a0e9771SDarren Reed * or http://www.opensolaris.org/os/licensing. 100a0e9771SDarren Reed * See the License for the specific language governing permissions 110a0e9771SDarren Reed * and limitations under the License. 120a0e9771SDarren Reed * 130a0e9771SDarren Reed * When distributing Covered Code, include this CDDL HEADER in each 140a0e9771SDarren Reed * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150a0e9771SDarren Reed * If applicable, add the following below this CDDL HEADER, with the 160a0e9771SDarren Reed * fields enclosed by brackets "[]" replaced with your own identifying 170a0e9771SDarren Reed * information: Portions Copyright [yyyy] [name of copyright owner] 180a0e9771SDarren Reed * 190a0e9771SDarren Reed * CDDL HEADER END 200a0e9771SDarren Reed */ 210a0e9771SDarren Reed 220a0e9771SDarren Reed /* 230a0e9771SDarren Reed * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 240a0e9771SDarren Reed * Use is subject to license terms. 250a0e9771SDarren Reed */ 260a0e9771SDarren Reed 270a0e9771SDarren Reed #include <sys/types.h> 280a0e9771SDarren Reed #include <sys/param.h> 290a0e9771SDarren Reed #include <sys/stat.h> 300a0e9771SDarren Reed #include <sys/errno.h> 310a0e9771SDarren Reed #include <sys/uio.h> 320a0e9771SDarren Reed #include <sys/buf.h> 330a0e9771SDarren Reed #include <sys/modctl.h> 340a0e9771SDarren Reed #include <sys/open.h> 350a0e9771SDarren Reed #include <sys/kmem.h> 360a0e9771SDarren Reed #include <sys/conf.h> 370a0e9771SDarren Reed #include <sys/cmn_err.h> 380a0e9771SDarren Reed #include <sys/cred.h> 390a0e9771SDarren Reed #include <sys/sunddi.h> 400a0e9771SDarren Reed #include <sys/mac_provider.h> 410a0e9771SDarren Reed #include <sys/dls_impl.h> 420a0e9771SDarren Reed #include <inet/ipnet.h> 430a0e9771SDarren Reed 440a0e9771SDarren Reed extern int bpfopen(dev_t *devp, int flag, int otyp, cred_t *cred); 450a0e9771SDarren Reed extern int bpfclose(dev_t dev, int flag, int otyp, cred_t *cred); 460a0e9771SDarren Reed extern int bpfread(dev_t dev, struct uio *uio_p, cred_t *cred_p); 470a0e9771SDarren Reed extern int bpfwrite(dev_t dev, struct uio *uio, cred_t *cred); 480a0e9771SDarren Reed extern int bpfchpoll(dev_t, short, int, short *, struct pollhead **); 490a0e9771SDarren Reed extern int bpfioctl(dev_t, int, intptr_t, int, cred_t *, int *); 500a0e9771SDarren Reed extern int bpfilterattach(void); 510a0e9771SDarren Reed extern int bpfilterdetach(void); 520a0e9771SDarren Reed 530a0e9771SDarren Reed extern bpf_provider_t bpf_mac; 540a0e9771SDarren Reed extern bpf_provider_t bpf_ipnet; 550a0e9771SDarren Reed 560a0e9771SDarren Reed static int bpf_attach(dev_info_t *, ddi_attach_cmd_t); 570a0e9771SDarren Reed static void *bpf_create_inst(const netid_t); 580a0e9771SDarren Reed static void bpf_destroy_inst(const netid_t, void *); 590a0e9771SDarren Reed static int bpf_detach(dev_info_t *, ddi_detach_cmd_t); 600a0e9771SDarren Reed static int bpf_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); 610a0e9771SDarren Reed static int bpf_provider_add(bpf_provider_t *); 620a0e9771SDarren Reed static int bpf_provider_remove(bpf_provider_t *); 630a0e9771SDarren Reed static void bpf_shutdown_inst(const netid_t, void *); 640a0e9771SDarren Reed 650a0e9771SDarren Reed extern void bpfdetach(uintptr_t); 660a0e9771SDarren Reed extern int bpf_bufsize; 670a0e9771SDarren Reed extern int bpf_maxbufsize; 680a0e9771SDarren Reed 69*b7ea883bSDarren Reed bpf_provider_head_t bpf_providers; 700a0e9771SDarren Reed 710a0e9771SDarren Reed static struct cb_ops bpf_cb_ops = { 720a0e9771SDarren Reed bpfopen, 730a0e9771SDarren Reed bpfclose, 740a0e9771SDarren Reed nodev, /* strategy */ 750a0e9771SDarren Reed nodev, /* print */ 760a0e9771SDarren Reed nodev, /* dump */ 770a0e9771SDarren Reed bpfread, 780a0e9771SDarren Reed bpfwrite, /* write */ 790a0e9771SDarren Reed bpfioctl, /* ioctl */ 800a0e9771SDarren Reed nodev, /* devmap */ 810a0e9771SDarren Reed nodev, /* mmap */ 820a0e9771SDarren Reed nodev, /* segmap */ 830a0e9771SDarren Reed bpfchpoll, /* poll */ 840a0e9771SDarren Reed ddi_prop_op, 850a0e9771SDarren Reed NULL, 860a0e9771SDarren Reed D_MTSAFE, 870a0e9771SDarren Reed CB_REV, 880a0e9771SDarren Reed nodev, /* aread */ 890a0e9771SDarren Reed nodev, /* awrite */ 900a0e9771SDarren Reed }; 910a0e9771SDarren Reed 920a0e9771SDarren Reed static struct dev_ops bpf_ops = { 930a0e9771SDarren Reed DEVO_REV, 940a0e9771SDarren Reed 0, 950a0e9771SDarren Reed bpf_getinfo, 960a0e9771SDarren Reed nulldev, 970a0e9771SDarren Reed nulldev, 980a0e9771SDarren Reed bpf_attach, 990a0e9771SDarren Reed bpf_detach, 1000a0e9771SDarren Reed nodev, /* reset */ 1010a0e9771SDarren Reed &bpf_cb_ops, 1020a0e9771SDarren Reed (struct bus_ops *)0 1030a0e9771SDarren Reed }; 1040a0e9771SDarren Reed 1050a0e9771SDarren Reed extern struct mod_ops mod_driverops; 1060a0e9771SDarren Reed static struct modldrv bpfmod = { 1070a0e9771SDarren Reed &mod_driverops, "Berkely Packet Filter", &bpf_ops 1080a0e9771SDarren Reed }; 1090a0e9771SDarren Reed static struct modlinkage modlink1 = { MODREV_1, &bpfmod, NULL }; 1100a0e9771SDarren Reed 1110a0e9771SDarren Reed static dev_info_t *bpf_dev_info = NULL; 1120a0e9771SDarren Reed static net_instance_t *bpf_inst = NULL; 1130a0e9771SDarren Reed 1140a0e9771SDarren Reed int 1150a0e9771SDarren Reed _init() 1160a0e9771SDarren Reed { 1170a0e9771SDarren Reed int bpfinst; 1180a0e9771SDarren Reed 1190a0e9771SDarren Reed bpfinst = mod_install(&modlink1); 1200a0e9771SDarren Reed return (bpfinst); 1210a0e9771SDarren Reed } 1220a0e9771SDarren Reed 1230a0e9771SDarren Reed int 1240a0e9771SDarren Reed _fini(void) 1250a0e9771SDarren Reed { 1260a0e9771SDarren Reed int bpfinst; 1270a0e9771SDarren Reed 1280a0e9771SDarren Reed bpfinst = mod_remove(&modlink1); 1290a0e9771SDarren Reed return (bpfinst); 1300a0e9771SDarren Reed } 1310a0e9771SDarren Reed 1320a0e9771SDarren Reed int 1330a0e9771SDarren Reed _info(struct modinfo *modinfop) 1340a0e9771SDarren Reed { 1350a0e9771SDarren Reed int bpfinst; 1360a0e9771SDarren Reed 1370a0e9771SDarren Reed bpfinst = mod_info(&modlink1, modinfop); 1380a0e9771SDarren Reed return (bpfinst); 1390a0e9771SDarren Reed } 1400a0e9771SDarren Reed 1410a0e9771SDarren Reed static int 1420a0e9771SDarren Reed bpf_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 1430a0e9771SDarren Reed { 1440a0e9771SDarren Reed 1450a0e9771SDarren Reed switch (cmd) { 1460a0e9771SDarren Reed case DDI_ATTACH: 1470a0e9771SDarren Reed /* 1480a0e9771SDarren Reed * Default buffer size from bpf's driver.conf file 1490a0e9771SDarren Reed */ 1500a0e9771SDarren Reed bpf_bufsize = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 1510a0e9771SDarren Reed "buf_size", 32 * 1024); 1520a0e9771SDarren Reed /* 1530a0e9771SDarren Reed * Maximum buffer size from bpf's driver.conf file 1540a0e9771SDarren Reed */ 1550a0e9771SDarren Reed bpf_maxbufsize = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 1560a0e9771SDarren Reed "max_buf_size", 16 * 1024 * 1024); 1570a0e9771SDarren Reed 1580a0e9771SDarren Reed if (ddi_create_minor_node(dip, "bpf", S_IFCHR, 0, 1590a0e9771SDarren Reed DDI_PSEUDO, 0) == DDI_FAILURE) { 1600a0e9771SDarren Reed ddi_remove_minor_node(dip, NULL); 1610a0e9771SDarren Reed goto attach_failed; 1620a0e9771SDarren Reed } 1630a0e9771SDarren Reed bpf_dev_info = dip; 1640a0e9771SDarren Reed ddi_report_dev(dip); 1650a0e9771SDarren Reed 1660a0e9771SDarren Reed LIST_INIT(&bpf_providers); 1670a0e9771SDarren Reed 1680a0e9771SDarren Reed if (bpfilterattach() != 0) 1690a0e9771SDarren Reed goto attach_failed; 1700a0e9771SDarren Reed 171*b7ea883bSDarren Reed ipnet_set_itap(bpf_itap); 172*b7ea883bSDarren Reed VERIFY(bpf_provider_add(&bpf_ipnet) == 0); 173*b7ea883bSDarren Reed VERIFY(bpf_provider_add(&bpf_mac) == 0); 1740a0e9771SDarren Reed 1750a0e9771SDarren Reed /* 1760a0e9771SDarren Reed * Set up to be notified about zones coming and going 1770a0e9771SDarren Reed * so that proper interaction with ipnet is possible. 1780a0e9771SDarren Reed */ 1790a0e9771SDarren Reed bpf_inst = net_instance_alloc(NETINFO_VERSION); 1800a0e9771SDarren Reed if (bpf_inst == NULL) 1810a0e9771SDarren Reed goto attach_failed; 1820a0e9771SDarren Reed bpf_inst->nin_name = "bpf"; 1830a0e9771SDarren Reed bpf_inst->nin_create = bpf_create_inst; 1840a0e9771SDarren Reed bpf_inst->nin_destroy = bpf_destroy_inst; 1850a0e9771SDarren Reed bpf_inst->nin_shutdown = bpf_shutdown_inst; 1860a0e9771SDarren Reed if (net_instance_register(bpf_inst) != 0) { 1870a0e9771SDarren Reed net_instance_free(bpf_inst); 1880a0e9771SDarren Reed goto attach_failed; 1890a0e9771SDarren Reed } 1900a0e9771SDarren Reed 1910a0e9771SDarren Reed return (DDI_SUCCESS); 1920a0e9771SDarren Reed /* NOTREACHED */ 1930a0e9771SDarren Reed case DDI_RESUME: 1940a0e9771SDarren Reed return (DDI_SUCCESS); 1950a0e9771SDarren Reed /* NOTREACHED */ 1960a0e9771SDarren Reed default: 1970a0e9771SDarren Reed break; 1980a0e9771SDarren Reed } 1990a0e9771SDarren Reed 2000a0e9771SDarren Reed attach_failed: 2010a0e9771SDarren Reed 2020a0e9771SDarren Reed /* 2030a0e9771SDarren Reed * Use our own detach routine to toss 2040a0e9771SDarren Reed * away any stuff we allocated above. 2050a0e9771SDarren Reed */ 2060a0e9771SDarren Reed (void) bpfilterdetach(); 2070a0e9771SDarren Reed (void) bpf_detach(dip, DDI_DETACH); 2080a0e9771SDarren Reed return (DDI_FAILURE); 2090a0e9771SDarren Reed } 2100a0e9771SDarren Reed 2110a0e9771SDarren Reed static int 2120a0e9771SDarren Reed bpf_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 2130a0e9771SDarren Reed { 2140a0e9771SDarren Reed int error; 2150a0e9771SDarren Reed 2160a0e9771SDarren Reed switch (cmd) { 2170a0e9771SDarren Reed case DDI_DETACH: 2180a0e9771SDarren Reed if (net_instance_unregister(bpf_inst) != 0) 2190a0e9771SDarren Reed return (DDI_FAILURE); 2200a0e9771SDarren Reed net_instance_free(bpf_inst); 2210a0e9771SDarren Reed 222*b7ea883bSDarren Reed ipnet_set_itap(NULL); 2230a0e9771SDarren Reed error = bpfilterdetach(); 2240a0e9771SDarren Reed if (error != 0) 2250a0e9771SDarren Reed return (DDI_FAILURE); 226*b7ea883bSDarren Reed VERIFY(bpf_provider_remove(&bpf_ipnet) == 0); 227*b7ea883bSDarren Reed VERIFY(bpf_provider_remove(&bpf_mac) == 0); 2280a0e9771SDarren Reed 2290a0e9771SDarren Reed ASSERT(LIST_EMPTY(&bpf_providers)); 2300a0e9771SDarren Reed 2310a0e9771SDarren Reed ddi_prop_remove_all(dip); 2320a0e9771SDarren Reed 2330a0e9771SDarren Reed return (DDI_SUCCESS); 2340a0e9771SDarren Reed /* NOTREACHED */ 2350a0e9771SDarren Reed case DDI_SUSPEND: 2360a0e9771SDarren Reed case DDI_PM_SUSPEND: 2370a0e9771SDarren Reed return (DDI_SUCCESS); 2380a0e9771SDarren Reed /* NOTREACHED */ 2390a0e9771SDarren Reed default: 2400a0e9771SDarren Reed break; 2410a0e9771SDarren Reed } 2420a0e9771SDarren Reed return (DDI_FAILURE); 2430a0e9771SDarren Reed } 2440a0e9771SDarren Reed 2450a0e9771SDarren Reed /*ARGSUSED*/ 2460a0e9771SDarren Reed static int 2470a0e9771SDarren Reed bpf_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) 2480a0e9771SDarren Reed { 2490a0e9771SDarren Reed int error = DDI_FAILURE; 2500a0e9771SDarren Reed 2510a0e9771SDarren Reed switch (infocmd) { 2520a0e9771SDarren Reed case DDI_INFO_DEVT2DEVINFO: 2530a0e9771SDarren Reed *result = bpf_dev_info; 2540a0e9771SDarren Reed error = DDI_SUCCESS; 2550a0e9771SDarren Reed break; 2560a0e9771SDarren Reed case DDI_INFO_DEVT2INSTANCE: 2570a0e9771SDarren Reed *result = (void *)0; 2580a0e9771SDarren Reed error = DDI_SUCCESS; 2590a0e9771SDarren Reed break; 2600a0e9771SDarren Reed default: 2610a0e9771SDarren Reed break; 2620a0e9771SDarren Reed } 2630a0e9771SDarren Reed return (error); 2640a0e9771SDarren Reed } 2650a0e9771SDarren Reed 2660a0e9771SDarren Reed /* 2670a0e9771SDarren Reed * The two functions below work with and manage a list of providers that 2680a0e9771SDarren Reed * supply BPF with packets. Their addition and removal is only happens 2690a0e9771SDarren Reed * when the bpf module is attaching/detaching, thus there is no race 2700a0e9771SDarren Reed * condition to guard against with using locks as the kernel module system 2710a0e9771SDarren Reed * takes care of this for us. Similarly, bpf_provider_tickle() is called 2720a0e9771SDarren Reed * from bpf_setif, which implies an open file descriptor that would get 2730a0e9771SDarren Reed * in the way of detach being active. 2740a0e9771SDarren Reed */ 2750a0e9771SDarren Reed static int 2760a0e9771SDarren Reed bpf_provider_add(bpf_provider_t *provider) 2770a0e9771SDarren Reed { 2780a0e9771SDarren Reed bpf_provider_list_t *bp; 2790a0e9771SDarren Reed 2800a0e9771SDarren Reed LIST_FOREACH(bp, &bpf_providers, bpl_next) { 2810a0e9771SDarren Reed if (bp->bpl_what == provider) 2820a0e9771SDarren Reed return (EEXIST); 2830a0e9771SDarren Reed } 2840a0e9771SDarren Reed 2850a0e9771SDarren Reed 2860a0e9771SDarren Reed bp = kmem_alloc(sizeof (*bp), KM_SLEEP); 2870a0e9771SDarren Reed bp->bpl_what = provider; 2880a0e9771SDarren Reed LIST_INSERT_HEAD(&bpf_providers, bp, bpl_next); 2890a0e9771SDarren Reed 2900a0e9771SDarren Reed return (0); 2910a0e9771SDarren Reed } 2920a0e9771SDarren Reed 2930a0e9771SDarren Reed static int 2940a0e9771SDarren Reed bpf_provider_remove(bpf_provider_t *provider) 2950a0e9771SDarren Reed { 2960a0e9771SDarren Reed bpf_provider_list_t *bp; 2970a0e9771SDarren Reed 2980a0e9771SDarren Reed LIST_FOREACH(bp, &bpf_providers, bpl_next) { 2990a0e9771SDarren Reed if (bp->bpl_what == provider) 3000a0e9771SDarren Reed break; 3010a0e9771SDarren Reed } 3020a0e9771SDarren Reed 3030a0e9771SDarren Reed if (bp == NULL) 3040a0e9771SDarren Reed return (ESRCH); 3050a0e9771SDarren Reed 3060a0e9771SDarren Reed LIST_REMOVE(bp, bpl_next); 3070a0e9771SDarren Reed 3080a0e9771SDarren Reed kmem_free(bp, sizeof (*bp)); 3090a0e9771SDarren Reed 3100a0e9771SDarren Reed return (0); 3110a0e9771SDarren Reed } 3120a0e9771SDarren Reed 3130a0e9771SDarren Reed /* 3140a0e9771SDarren Reed * return a pointer to the structure that holds all of the functions 3150a0e9771SDarren Reed * available to be used to support a particular packet provider. 3160a0e9771SDarren Reed */ 3170a0e9771SDarren Reed bpf_provider_t * 3180a0e9771SDarren Reed bpf_find_provider_by_id(int who) 3190a0e9771SDarren Reed { 3200a0e9771SDarren Reed bpf_provider_list_t *b; 3210a0e9771SDarren Reed 3220a0e9771SDarren Reed LIST_FOREACH(b, &bpf_providers, bpl_next) { 3230a0e9771SDarren Reed if (b->bpl_what->bpr_unit == who) 3240a0e9771SDarren Reed return (b->bpl_what); 3250a0e9771SDarren Reed } 3260a0e9771SDarren Reed 3270a0e9771SDarren Reed return (NULL); 3280a0e9771SDarren Reed } 3290a0e9771SDarren Reed 3300a0e9771SDarren Reed /* 3310a0e9771SDarren Reed * This function is used by bpf_setif() to force an open() to be called on 3320a0e9771SDarren Reed * a given device name. If a device has been unloaded by the kernel, but it 3330a0e9771SDarren Reed * is still recognised, then calling this function will hopefully cause it 3340a0e9771SDarren Reed * to be loaded back into the kernel. When this function is called, it is 3350a0e9771SDarren Reed * not known which packet provider the name belongs to so all are tried. 3360a0e9771SDarren Reed */ 3370a0e9771SDarren Reed int 3380a0e9771SDarren Reed bpf_provider_tickle(char *name, zoneid_t zone) 3390a0e9771SDarren Reed { 3400a0e9771SDarren Reed bpf_provider_list_t *bp; 3410a0e9771SDarren Reed uintptr_t handle; 3420a0e9771SDarren Reed int tickled = 0; 3430a0e9771SDarren Reed 3440a0e9771SDarren Reed LIST_FOREACH(bp, &bpf_providers, bpl_next) { 3450a0e9771SDarren Reed handle = 0; 3460a0e9771SDarren Reed if (bp->bpl_what->bpr_open(name, &handle, zone) == 0) { 3470a0e9771SDarren Reed bp->bpl_what->bpr_close(handle); 3480a0e9771SDarren Reed tickled++; 3490a0e9771SDarren Reed } else if (bp->bpl_what->bpr_unit == BPR_MAC) { 3500a0e9771SDarren Reed /* 3510a0e9771SDarren Reed * For mac devices, sometimes the open/close is not 3520a0e9771SDarren Reed * enough. In that case, further provocation is 3530a0e9771SDarren Reed * attempted by fetching the linkid and trying to 3540a0e9771SDarren Reed * use that as the key for open, rather than the 3550a0e9771SDarren Reed * name. 3560a0e9771SDarren Reed */ 3570a0e9771SDarren Reed datalink_id_t id; 3580a0e9771SDarren Reed 3590a0e9771SDarren Reed if (bp->bpl_what->bpr_getlinkid(name, &id, 3600a0e9771SDarren Reed zone) == 0) { 3610a0e9771SDarren Reed if (bp->bpl_what->bpr_open(name, &handle, 3620a0e9771SDarren Reed zone) == 0) { 3630a0e9771SDarren Reed bp->bpl_what->bpr_close(handle); 3640a0e9771SDarren Reed tickled++; 3650a0e9771SDarren Reed } else { 3660a0e9771SDarren Reed mac_handle_t mh; 3670a0e9771SDarren Reed 3680a0e9771SDarren Reed if (mac_open_by_linkid(id, &mh) == 0) { 3690a0e9771SDarren Reed mac_close(mh); 3700a0e9771SDarren Reed tickled++; 3710a0e9771SDarren Reed } 3720a0e9771SDarren Reed } 3730a0e9771SDarren Reed } 3740a0e9771SDarren Reed } 3750a0e9771SDarren Reed 3760a0e9771SDarren Reed } 3770a0e9771SDarren Reed 3780a0e9771SDarren Reed if (tickled != 0) 3790a0e9771SDarren Reed return (EWOULDBLOCK); 3800a0e9771SDarren Reed 3810a0e9771SDarren Reed return (ENXIO); 3820a0e9771SDarren Reed } 3830a0e9771SDarren Reed 3840a0e9771SDarren Reed /* 3850a0e9771SDarren Reed * The following three functions provide the necessary callbacks into 3860a0e9771SDarren Reed * the netinfo API. This API is primarily used to trigger awareness of 3870a0e9771SDarren Reed * when a zone is being torn down, allowing BPF to drive IPNET to 3880a0e9771SDarren Reed * tell it which interfaces need to go away. 3890a0e9771SDarren Reed */ 3900a0e9771SDarren Reed /*ARGSUSED*/ 3910a0e9771SDarren Reed static void * 3920a0e9771SDarren Reed bpf_create_inst(const netid_t netid) 3930a0e9771SDarren Reed { 3940a0e9771SDarren Reed /* 3950a0e9771SDarren Reed * BPF does not keep any per-instance state, its list of 3960a0e9771SDarren Reed * interfaces is global, as is its device hash table. 3970a0e9771SDarren Reed */ 3980a0e9771SDarren Reed return ((void *)bpf_itap); 3990a0e9771SDarren Reed } 4000a0e9771SDarren Reed 4010a0e9771SDarren Reed /*ARGSUSED*/ 4020a0e9771SDarren Reed static void 4030a0e9771SDarren Reed bpf_shutdown_inst(const netid_t netid, void *arg) 4040a0e9771SDarren Reed { 4050a0e9771SDarren Reed } 4060a0e9771SDarren Reed 4070a0e9771SDarren Reed /*ARGSUSED*/ 4080a0e9771SDarren Reed static void 4090a0e9771SDarren Reed bpf_destroy_inst(const netid_t netid, void *arg) 4100a0e9771SDarren Reed { 4110a0e9771SDarren Reed } 412