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 /* 23*f195a053SDarren Reed * Copyright 2010 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/stream.h> 290a0e9771SDarren Reed #include <net/bpf.h> 300a0e9771SDarren Reed #include <net/bpfdesc.h> 310a0e9771SDarren Reed 320a0e9771SDarren Reed /* 330a0e9771SDarren Reed * This file provides the link to the functions required from the mac 340a0e9771SDarren Reed * module. It is currently in bpf, rather than mac (like ipnet_bpf) 350a0e9771SDarren Reed * because of the mac/dls split. The bpf driver needs to know when 360a0e9771SDarren Reed * interfaces appear and disappear and the best place for that is in 370a0e9771SDarren Reed * dls. Unfortunately all of the other functions used here are found 380a0e9771SDarren Reed * in the mac module, making it seem ill suited to being at home in 390a0e9771SDarren Reed * dls. Similarly it has even less purpose being in mac as it is 400a0e9771SDarren Reed * today. 410a0e9771SDarren Reed */ 420a0e9771SDarren Reed static int mac_bpf_open(const char *, uintptr_t *, zoneid_t); 430a0e9771SDarren Reed static void mac_bpf_close(uintptr_t); 440a0e9771SDarren Reed static const char *mac_bpf_name(uintptr_t); 450a0e9771SDarren Reed static int mac_bpf_type(uintptr_t); 460a0e9771SDarren Reed static void mac_bpf_sdu_get(uintptr_t, uint_t *); 470a0e9771SDarren Reed static int mac_bpf_tx(uintptr_t, mblk_t *); 480a0e9771SDarren Reed static uintptr_t mac_bpf_promisc_add(uintptr_t, int, void *, uintptr_t *, int); 490a0e9771SDarren Reed static void mac_bpf_promisc_remove(uintptr_t); 500a0e9771SDarren Reed static int mac_bpf_client_open(uintptr_t, uintptr_t *); 510a0e9771SDarren Reed static void mac_bpf_client_close(uintptr_t); 520a0e9771SDarren Reed static const char *mac_bpf_client_name(uintptr_t); 53b7ea883bSDarren Reed static int mac_bpf_getdlt(uintptr_t, uint_t *); 540a0e9771SDarren Reed static int mac_bpf_getlinkid(const char *, datalink_id_t *, zoneid_t); 55b7ea883bSDarren Reed static int mac_bpf_getzone(uintptr_t, zoneid_t *); 560a0e9771SDarren Reed 570a0e9771SDarren Reed bpf_provider_t bpf_mac = { 580a0e9771SDarren Reed BPR_MAC, 590a0e9771SDarren Reed mac_bpf_open, 600a0e9771SDarren Reed mac_bpf_close, 610a0e9771SDarren Reed mac_bpf_name, 620a0e9771SDarren Reed mac_bpf_type, 630a0e9771SDarren Reed mac_bpf_sdu_get, 640a0e9771SDarren Reed mac_bpf_tx, 650a0e9771SDarren Reed mac_bpf_promisc_add, 660a0e9771SDarren Reed mac_bpf_promisc_remove, 670a0e9771SDarren Reed mac_bpf_getlinkid, 680a0e9771SDarren Reed mac_bpf_client_close, 690a0e9771SDarren Reed mac_bpf_client_name, 70b7ea883bSDarren Reed mac_bpf_client_open, 71b7ea883bSDarren Reed mac_bpf_getzone, 72b7ea883bSDarren Reed mac_bpf_getdlt 730a0e9771SDarren Reed }; 740a0e9771SDarren Reed 750a0e9771SDarren Reed /*ARGSUSED*/ 760a0e9771SDarren Reed static int 770a0e9771SDarren Reed mac_bpf_open(const char *name, uintptr_t *mhandlep, zoneid_t zoneid) 780a0e9771SDarren Reed { 79b7ea883bSDarren Reed return (mac_open_by_linkname(name, (mac_handle_t *)mhandlep)); 800a0e9771SDarren Reed } 810a0e9771SDarren Reed 820a0e9771SDarren Reed static void 830a0e9771SDarren Reed mac_bpf_close(uintptr_t mhandle) 840a0e9771SDarren Reed { 850a0e9771SDarren Reed mac_close((mac_handle_t)mhandle); 860a0e9771SDarren Reed } 870a0e9771SDarren Reed 880a0e9771SDarren Reed static const char * 890a0e9771SDarren Reed mac_bpf_name(uintptr_t mhandle) 900a0e9771SDarren Reed { 910a0e9771SDarren Reed return (mac_name((mac_handle_t)mhandle)); 920a0e9771SDarren Reed } 930a0e9771SDarren Reed 940a0e9771SDarren Reed static int 950a0e9771SDarren Reed mac_bpf_type(uintptr_t mhandle) 960a0e9771SDarren Reed { 97*f195a053SDarren Reed return (mac_nativetype((mac_handle_t)mhandle)); 980a0e9771SDarren Reed } 990a0e9771SDarren Reed 1000a0e9771SDarren Reed static void 1010a0e9771SDarren Reed mac_bpf_sdu_get(uintptr_t mhandle, uint_t *mtup) 1020a0e9771SDarren Reed { 1030a0e9771SDarren Reed mac_sdu_get((mac_handle_t)mhandle, NULL, mtup); 1040a0e9771SDarren Reed } 1050a0e9771SDarren Reed 1060a0e9771SDarren Reed static int 1070a0e9771SDarren Reed mac_bpf_tx(uintptr_t chandle, mblk_t *pkt) 1080a0e9771SDarren Reed { 1090a0e9771SDarren Reed /* 1100a0e9771SDarren Reed * If the mac layer cannot deliver a packet as requested by BPF then 1110a0e9771SDarren Reed * simply have the mac layer drop it. BPF isn't interested in doing 1120a0e9771SDarren Reed * any amount of retry - that's left to the application. 1130a0e9771SDarren Reed */ 1140a0e9771SDarren Reed return (mac_tx((mac_client_handle_t)chandle, pkt, 0, 1150a0e9771SDarren Reed MAC_DROP_ON_NO_DESC, NULL)); 1160a0e9771SDarren Reed } 1170a0e9771SDarren Reed 1180a0e9771SDarren Reed static uintptr_t 1190a0e9771SDarren Reed mac_bpf_promisc_add(uintptr_t chandle, int how, void *arg, uintptr_t *promisc, 1200a0e9771SDarren Reed int flags) 1210a0e9771SDarren Reed { 1220a0e9771SDarren Reed return (mac_promisc_add((mac_client_handle_t)chandle, how, bpf_mtap, 1230a0e9771SDarren Reed arg, (mac_promisc_handle_t *)promisc, flags)); 1240a0e9771SDarren Reed } 1250a0e9771SDarren Reed 1260a0e9771SDarren Reed static void 1270a0e9771SDarren Reed mac_bpf_promisc_remove(uintptr_t phandle) 1280a0e9771SDarren Reed { 1290a0e9771SDarren Reed mac_promisc_remove((mac_promisc_handle_t)phandle); 1300a0e9771SDarren Reed } 1310a0e9771SDarren Reed 1320a0e9771SDarren Reed static int 1330a0e9771SDarren Reed mac_bpf_client_open(uintptr_t mhandle, uintptr_t *chandlep) 1340a0e9771SDarren Reed { 1350a0e9771SDarren Reed return (mac_client_open((mac_handle_t)mhandle, 1360a0e9771SDarren Reed (mac_client_handle_t *)chandlep, NULL, 1370a0e9771SDarren Reed MAC_OPEN_FLAGS_USE_DATALINK_NAME)); 1380a0e9771SDarren Reed } 1390a0e9771SDarren Reed 1400a0e9771SDarren Reed static void 1410a0e9771SDarren Reed mac_bpf_client_close(uintptr_t chandle) 1420a0e9771SDarren Reed { 1430a0e9771SDarren Reed mac_client_close((mac_client_handle_t)chandle, 0); 1440a0e9771SDarren Reed } 1450a0e9771SDarren Reed 1460a0e9771SDarren Reed static const char * 1470a0e9771SDarren Reed mac_bpf_client_name(uintptr_t chandle) 1480a0e9771SDarren Reed { 1490a0e9771SDarren Reed return (mac_client_name((mac_client_handle_t)chandle)); 1500a0e9771SDarren Reed } 1510a0e9771SDarren Reed 1520a0e9771SDarren Reed /*ARGSUSED*/ 1530a0e9771SDarren Reed static int 1540a0e9771SDarren Reed mac_bpf_getlinkid(const char *name, datalink_id_t *idp, zoneid_t zoneid) 1550a0e9771SDarren Reed { 1560a0e9771SDarren Reed int error; 1570a0e9771SDarren Reed 1580a0e9771SDarren Reed /* 1590a0e9771SDarren Reed * If at first we don't succeed, try again, just in case it is in 1600a0e9771SDarren Reed * hiding. The first call requires the datalink management daemon 1610a0e9771SDarren Reed * (the authorative source of information about name to id mapping) 1620a0e9771SDarren Reed * to be present and answering upcalls, the seond does not. 1630a0e9771SDarren Reed */ 1640a0e9771SDarren Reed error = dls_mgmt_get_linkid(name, idp); 1650a0e9771SDarren Reed if (error != 0) 1660a0e9771SDarren Reed error = dls_devnet_macname2linkid(name, idp); 1670a0e9771SDarren Reed 1680a0e9771SDarren Reed return (error); 1690a0e9771SDarren Reed } 170b7ea883bSDarren Reed 171b7ea883bSDarren Reed static int 172b7ea883bSDarren Reed mac_bpf_getzone(uintptr_t handle, zoneid_t *zip) 173b7ea883bSDarren Reed { 174b7ea883bSDarren Reed mac_perim_handle_t mph; 175b7ea883bSDarren Reed int error; 176b7ea883bSDarren Reed 177b7ea883bSDarren Reed mac_perim_enter_by_mh((mac_handle_t)handle, &mph); 178b7ea883bSDarren Reed error = dls_link_getzid(mac_name((mac_handle_t)handle), zip); 179b7ea883bSDarren Reed mac_perim_exit(mph); 180b7ea883bSDarren Reed return (error); 181b7ea883bSDarren Reed } 182b7ea883bSDarren Reed 183b7ea883bSDarren Reed static int 184b7ea883bSDarren Reed mac_bpf_getdlt(uintptr_t handle, uint_t *dltp) 185b7ea883bSDarren Reed { 186*f195a053SDarren Reed *dltp = mac_nativetype((mac_handle_t)handle); 187b7ea883bSDarren Reed 188b7ea883bSDarren Reed return (0); 189b7ea883bSDarren Reed } 190