bpf_mac.c revision 11179:bfcb8daf999a
1251881Speter/* 2251881Speter * CDDL HEADER START 3251881Speter * 4251881Speter * The contents of this file are subject to the terms of the 5251881Speter * Common Development and Distribution License (the "License"). 6251881Speter * You may not use this file except in compliance with the License. 7251881Speter * 8251881Speter * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9251881Speter * or http://www.opensolaris.org/os/licensing. 10251881Speter * See the License for the specific language governing permissions 11251881Speter * and limitations under the License. 12251881Speter * 13251881Speter * When distributing Covered Code, include this CDDL HEADER in each 14251881Speter * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15251881Speter * If applicable, add the following below this CDDL HEADER, with the 16251881Speter * fields enclosed by brackets "[]" replaced with your own identifying 17251881Speter * information: Portions Copyright [yyyy] [name of copyright owner] 18251881Speter * 19251881Speter * CDDL HEADER END 20251881Speter */ 21251881Speter 22251881Speter/* 23251881Speter * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24251881Speter * Use is subject to license terms. 25251881Speter */ 26251881Speter 27251881Speter#include <sys/types.h> 28251881Speter#include <sys/stream.h> 29251881Speter#include <net/bpf.h> 30251881Speter#include <net/bpfdesc.h> 31251881Speter 32251881Speter/* 33251881Speter * This file provides the link to the functions required from the mac 34251881Speter * module. It is currently in bpf, rather than mac (like ipnet_bpf) 35251881Speter * because of the mac/dls split. The bpf driver needs to know when 36251881Speter * interfaces appear and disappear and the best place for that is in 37251881Speter * dls. Unfortunately all of the other functions used here are found 38251881Speter * in the mac module, making it seem ill suited to being at home in 39251881Speter * dls. Similarly it has even less purpose being in mac as it is 40251881Speter * today. 41251881Speter */ 42251881Speterstatic int mac_bpf_open(const char *, uintptr_t *, zoneid_t); 43251881Speterstatic void mac_bpf_close(uintptr_t); 44251881Speterstatic const char *mac_bpf_name(uintptr_t); 45251881Speterstatic int mac_bpf_type(uintptr_t); 46251881Speterstatic void mac_bpf_sdu_get(uintptr_t, uint_t *); 47251881Speterstatic int mac_bpf_tx(uintptr_t, mblk_t *); 48251881Speterstatic uintptr_t mac_bpf_promisc_add(uintptr_t, int, void *, uintptr_t *, int); 49251881Speterstatic void mac_bpf_promisc_remove(uintptr_t); 50251881Speterstatic int mac_bpf_client_open(uintptr_t, uintptr_t *); 51251881Speterstatic void mac_bpf_client_close(uintptr_t); 52251881Speterstatic const char *mac_bpf_client_name(uintptr_t); 53251881Speterstatic int mac_bpf_getdlt(uintptr_t, uint_t *); 54251881Speterstatic int mac_bpf_getlinkid(const char *, datalink_id_t *, zoneid_t); 55251881Speterstatic int mac_bpf_getzone(uintptr_t, zoneid_t *); 56251881Speter 57251881Speterbpf_provider_t bpf_mac = { 58251881Speter BPR_MAC, 59251881Speter mac_bpf_open, 60251881Speter mac_bpf_close, 61251881Speter mac_bpf_name, 62251881Speter mac_bpf_type, 63251881Speter mac_bpf_sdu_get, 64251881Speter mac_bpf_tx, 65251881Speter mac_bpf_promisc_add, 66251881Speter mac_bpf_promisc_remove, 67251881Speter mac_bpf_getlinkid, 68251881Speter mac_bpf_client_close, 69251881Speter mac_bpf_client_name, 70251881Speter mac_bpf_client_open, 71251881Speter mac_bpf_getzone, 72251881Speter mac_bpf_getdlt 73251881Speter}; 74251881Speter 75251881Speter/*ARGSUSED*/ 76251881Speterstatic int 77251881Spetermac_bpf_open(const char *name, uintptr_t *mhandlep, zoneid_t zoneid) 78251881Speter{ 79251881Speter return (mac_open_by_linkname(name, (mac_handle_t *)mhandlep)); 80251881Speter} 81251881Speter 82251881Speterstatic void 83251881Spetermac_bpf_close(uintptr_t mhandle) 84251881Speter{ 85251881Speter mac_close((mac_handle_t)mhandle); 86251881Speter} 87251881Speter 88251881Speterstatic const char * 89251881Spetermac_bpf_name(uintptr_t mhandle) 90251881Speter{ 91251881Speter return (mac_name((mac_handle_t)mhandle)); 92251881Speter} 93251881Speter 94251881Speterstatic int 95251881Spetermac_bpf_type(uintptr_t mhandle) 96251881Speter{ 97251881Speter return (mac_type((mac_handle_t)mhandle)); 98251881Speter} 99251881Speter 100251881Speterstatic void 101251881Spetermac_bpf_sdu_get(uintptr_t mhandle, uint_t *mtup) 102251881Speter{ 103251881Speter mac_sdu_get((mac_handle_t)mhandle, NULL, mtup); 104251881Speter} 105251881Speter 106251881Speterstatic int 107251881Spetermac_bpf_tx(uintptr_t chandle, mblk_t *pkt) 108251881Speter{ 109251881Speter /* 110251881Speter * If the mac layer cannot deliver a packet as requested by BPF then 111251881Speter * simply have the mac layer drop it. BPF isn't interested in doing 112251881Speter * any amount of retry - that's left to the application. 113251881Speter */ 114251881Speter return (mac_tx((mac_client_handle_t)chandle, pkt, 0, 115251881Speter MAC_DROP_ON_NO_DESC, NULL)); 116251881Speter} 117251881Speter 118251881Speterstatic uintptr_t 119251881Spetermac_bpf_promisc_add(uintptr_t chandle, int how, void *arg, uintptr_t *promisc, 120251881Speter int flags) 121251881Speter{ 122251881Speter return (mac_promisc_add((mac_client_handle_t)chandle, how, bpf_mtap, 123251881Speter arg, (mac_promisc_handle_t *)promisc, flags)); 124251881Speter} 125251881Speter 126251881Speterstatic void 127251881Spetermac_bpf_promisc_remove(uintptr_t phandle) 128251881Speter{ 129251881Speter mac_promisc_remove((mac_promisc_handle_t)phandle); 130251881Speter} 131251881Speter 132251881Speterstatic int 133251881Spetermac_bpf_client_open(uintptr_t mhandle, uintptr_t *chandlep) 134251881Speter{ 135251881Speter return (mac_client_open((mac_handle_t)mhandle, 136251881Speter (mac_client_handle_t *)chandlep, NULL, 137251881Speter MAC_OPEN_FLAGS_USE_DATALINK_NAME)); 138251881Speter} 139251881Speter 140251881Speterstatic void 141251881Spetermac_bpf_client_close(uintptr_t chandle) 142251881Speter{ 143251881Speter mac_client_close((mac_client_handle_t)chandle, 0); 144251881Speter} 145251881Speter 146251881Speterstatic const char * 147251881Spetermac_bpf_client_name(uintptr_t chandle) 148251881Speter{ 149251881Speter return (mac_client_name((mac_client_handle_t)chandle)); 150251881Speter} 151251881Speter 152251881Speter/*ARGSUSED*/ 153251881Speterstatic int 154251881Spetermac_bpf_getlinkid(const char *name, datalink_id_t *idp, zoneid_t zoneid) 155251881Speter{ 156251881Speter int error; 157251881Speter 158251881Speter /* 159251881Speter * If at first we don't succeed, try again, just in case it is in 160251881Speter * hiding. The first call requires the datalink management daemon 161251881Speter * (the authorative source of information about name to id mapping) 162251881Speter * to be present and answering upcalls, the seond does not. 163251881Speter */ 164251881Speter error = dls_mgmt_get_linkid(name, idp); 165251881Speter if (error != 0) 166251881Speter error = dls_devnet_macname2linkid(name, idp); 167251881Speter 168251881Speter return (error); 169251881Speter} 170251881Speter 171251881Speterstatic int 172251881Spetermac_bpf_getzone(uintptr_t handle, zoneid_t *zip) 173251881Speter{ 174251881Speter mac_perim_handle_t mph; 175251881Speter int error; 176251881Speter 177251881Speter mac_perim_enter_by_mh((mac_handle_t)handle, &mph); 178251881Speter error = dls_link_getzid(mac_name((mac_handle_t)handle), zip); 179251881Speter mac_perim_exit(mph); 180251881Speter return (error); 181251881Speter} 182251881Speter 183251881Speterstatic int 184251881Spetermac_bpf_getdlt(uintptr_t handle, uint_t *dltp) 185251881Speter{ 186251881Speter *dltp = mac_type((mac_handle_t)handle); 187251881Speter 188251881Speter return (0); 189251881Speter} 190251881Speter