xref: /onnv-gate/usr/src/uts/common/io/bpf/bpf_mac.c (revision 11665:abe81921ae9e)
110639SDarren.Reed@Sun.COM /*
210639SDarren.Reed@Sun.COM  * CDDL HEADER START
310639SDarren.Reed@Sun.COM  *
410639SDarren.Reed@Sun.COM  * The contents of this file are subject to the terms of the
510639SDarren.Reed@Sun.COM  * Common Development and Distribution License (the "License").
610639SDarren.Reed@Sun.COM  * You may not use this file except in compliance with the License.
710639SDarren.Reed@Sun.COM  *
810639SDarren.Reed@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910639SDarren.Reed@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010639SDarren.Reed@Sun.COM  * See the License for the specific language governing permissions
1110639SDarren.Reed@Sun.COM  * and limitations under the License.
1210639SDarren.Reed@Sun.COM  *
1310639SDarren.Reed@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410639SDarren.Reed@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510639SDarren.Reed@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610639SDarren.Reed@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710639SDarren.Reed@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810639SDarren.Reed@Sun.COM  *
1910639SDarren.Reed@Sun.COM  * CDDL HEADER END
2010639SDarren.Reed@Sun.COM  */
2110639SDarren.Reed@Sun.COM 
2210639SDarren.Reed@Sun.COM /*
23*11665SDarren.Reed@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2410639SDarren.Reed@Sun.COM  * Use is subject to license terms.
2510639SDarren.Reed@Sun.COM  */
2610639SDarren.Reed@Sun.COM 
2710639SDarren.Reed@Sun.COM #include <sys/types.h>
2810639SDarren.Reed@Sun.COM #include <sys/stream.h>
2910639SDarren.Reed@Sun.COM #include <net/bpf.h>
3010639SDarren.Reed@Sun.COM #include <net/bpfdesc.h>
3110639SDarren.Reed@Sun.COM 
3210639SDarren.Reed@Sun.COM /*
3310639SDarren.Reed@Sun.COM  * This file provides the link to the functions required from the mac
3410639SDarren.Reed@Sun.COM  * module. It is currently in bpf, rather than mac (like ipnet_bpf)
3510639SDarren.Reed@Sun.COM  * because of the mac/dls split. The bpf driver needs to know when
3610639SDarren.Reed@Sun.COM  * interfaces appear and disappear and the best place for that is in
3710639SDarren.Reed@Sun.COM  * dls. Unfortunately all of the other functions used here are found
3810639SDarren.Reed@Sun.COM  * in the mac module, making it seem ill suited to being at home in
3910639SDarren.Reed@Sun.COM  * dls. Similarly it has even less purpose being in mac as it is
4010639SDarren.Reed@Sun.COM  * today.
4110639SDarren.Reed@Sun.COM  */
4210639SDarren.Reed@Sun.COM static int	mac_bpf_open(const char *, uintptr_t *, zoneid_t);
4310639SDarren.Reed@Sun.COM static void	mac_bpf_close(uintptr_t);
4410639SDarren.Reed@Sun.COM static const char *mac_bpf_name(uintptr_t);
4510639SDarren.Reed@Sun.COM static int	mac_bpf_type(uintptr_t);
4610639SDarren.Reed@Sun.COM static void	mac_bpf_sdu_get(uintptr_t, uint_t *);
4710639SDarren.Reed@Sun.COM static int	mac_bpf_tx(uintptr_t, mblk_t *);
4810639SDarren.Reed@Sun.COM static uintptr_t mac_bpf_promisc_add(uintptr_t, int, void *, uintptr_t *, int);
4910639SDarren.Reed@Sun.COM static void	mac_bpf_promisc_remove(uintptr_t);
5010639SDarren.Reed@Sun.COM static int	mac_bpf_client_open(uintptr_t, uintptr_t *);
5110639SDarren.Reed@Sun.COM static void	mac_bpf_client_close(uintptr_t);
5210639SDarren.Reed@Sun.COM static const char *mac_bpf_client_name(uintptr_t);
5311179SDarren.Reed@Sun.COM static int	mac_bpf_getdlt(uintptr_t, uint_t *);
5410639SDarren.Reed@Sun.COM static int	mac_bpf_getlinkid(const char *, datalink_id_t *, zoneid_t);
5511179SDarren.Reed@Sun.COM static int	mac_bpf_getzone(uintptr_t, zoneid_t *);
5610639SDarren.Reed@Sun.COM 
5710639SDarren.Reed@Sun.COM bpf_provider_t bpf_mac = {
5810639SDarren.Reed@Sun.COM 	BPR_MAC,
5910639SDarren.Reed@Sun.COM 	mac_bpf_open,
6010639SDarren.Reed@Sun.COM 	mac_bpf_close,
6110639SDarren.Reed@Sun.COM 	mac_bpf_name,
6210639SDarren.Reed@Sun.COM 	mac_bpf_type,
6310639SDarren.Reed@Sun.COM 	mac_bpf_sdu_get,
6410639SDarren.Reed@Sun.COM 	mac_bpf_tx,
6510639SDarren.Reed@Sun.COM 	mac_bpf_promisc_add,
6610639SDarren.Reed@Sun.COM 	mac_bpf_promisc_remove,
6710639SDarren.Reed@Sun.COM 	mac_bpf_getlinkid,
6810639SDarren.Reed@Sun.COM 	mac_bpf_client_close,
6910639SDarren.Reed@Sun.COM 	mac_bpf_client_name,
7011179SDarren.Reed@Sun.COM 	mac_bpf_client_open,
7111179SDarren.Reed@Sun.COM 	mac_bpf_getzone,
7211179SDarren.Reed@Sun.COM 	mac_bpf_getdlt
7310639SDarren.Reed@Sun.COM };
7410639SDarren.Reed@Sun.COM 
7510639SDarren.Reed@Sun.COM /*ARGSUSED*/
7610639SDarren.Reed@Sun.COM static int
mac_bpf_open(const char * name,uintptr_t * mhandlep,zoneid_t zoneid)7710639SDarren.Reed@Sun.COM mac_bpf_open(const char *name, uintptr_t *mhandlep, zoneid_t zoneid)
7810639SDarren.Reed@Sun.COM {
7911179SDarren.Reed@Sun.COM 	return (mac_open_by_linkname(name, (mac_handle_t *)mhandlep));
8010639SDarren.Reed@Sun.COM }
8110639SDarren.Reed@Sun.COM 
8210639SDarren.Reed@Sun.COM static void
mac_bpf_close(uintptr_t mhandle)8310639SDarren.Reed@Sun.COM mac_bpf_close(uintptr_t mhandle)
8410639SDarren.Reed@Sun.COM {
8510639SDarren.Reed@Sun.COM 	mac_close((mac_handle_t)mhandle);
8610639SDarren.Reed@Sun.COM }
8710639SDarren.Reed@Sun.COM 
8810639SDarren.Reed@Sun.COM static const char *
mac_bpf_name(uintptr_t mhandle)8910639SDarren.Reed@Sun.COM mac_bpf_name(uintptr_t mhandle)
9010639SDarren.Reed@Sun.COM {
9110639SDarren.Reed@Sun.COM 	return (mac_name((mac_handle_t)mhandle));
9210639SDarren.Reed@Sun.COM }
9310639SDarren.Reed@Sun.COM 
9410639SDarren.Reed@Sun.COM static int
mac_bpf_type(uintptr_t mhandle)9510639SDarren.Reed@Sun.COM mac_bpf_type(uintptr_t mhandle)
9610639SDarren.Reed@Sun.COM {
97*11665SDarren.Reed@Sun.COM 	return (mac_nativetype((mac_handle_t)mhandle));
9810639SDarren.Reed@Sun.COM }
9910639SDarren.Reed@Sun.COM 
10010639SDarren.Reed@Sun.COM static void
mac_bpf_sdu_get(uintptr_t mhandle,uint_t * mtup)10110639SDarren.Reed@Sun.COM mac_bpf_sdu_get(uintptr_t mhandle, uint_t *mtup)
10210639SDarren.Reed@Sun.COM {
10310639SDarren.Reed@Sun.COM 	mac_sdu_get((mac_handle_t)mhandle, NULL, mtup);
10410639SDarren.Reed@Sun.COM }
10510639SDarren.Reed@Sun.COM 
10610639SDarren.Reed@Sun.COM static int
mac_bpf_tx(uintptr_t chandle,mblk_t * pkt)10710639SDarren.Reed@Sun.COM mac_bpf_tx(uintptr_t chandle, mblk_t *pkt)
10810639SDarren.Reed@Sun.COM {
10910639SDarren.Reed@Sun.COM 	/*
11010639SDarren.Reed@Sun.COM 	 * If the mac layer cannot deliver a packet as requested by BPF then
11110639SDarren.Reed@Sun.COM 	 * simply have the mac layer drop it. BPF isn't interested in doing
11210639SDarren.Reed@Sun.COM 	 * any amount of retry - that's left to the application.
11310639SDarren.Reed@Sun.COM 	 */
11410639SDarren.Reed@Sun.COM 	return (mac_tx((mac_client_handle_t)chandle, pkt, 0,
11510639SDarren.Reed@Sun.COM 	    MAC_DROP_ON_NO_DESC, NULL));
11610639SDarren.Reed@Sun.COM }
11710639SDarren.Reed@Sun.COM 
11810639SDarren.Reed@Sun.COM static uintptr_t
mac_bpf_promisc_add(uintptr_t chandle,int how,void * arg,uintptr_t * promisc,int flags)11910639SDarren.Reed@Sun.COM mac_bpf_promisc_add(uintptr_t chandle, int how, void *arg, uintptr_t *promisc,
12010639SDarren.Reed@Sun.COM     int flags)
12110639SDarren.Reed@Sun.COM {
12210639SDarren.Reed@Sun.COM 	return (mac_promisc_add((mac_client_handle_t)chandle, how, bpf_mtap,
12310639SDarren.Reed@Sun.COM 	    arg, (mac_promisc_handle_t *)promisc, flags));
12410639SDarren.Reed@Sun.COM }
12510639SDarren.Reed@Sun.COM 
12610639SDarren.Reed@Sun.COM static void
mac_bpf_promisc_remove(uintptr_t phandle)12710639SDarren.Reed@Sun.COM mac_bpf_promisc_remove(uintptr_t phandle)
12810639SDarren.Reed@Sun.COM {
12910639SDarren.Reed@Sun.COM 	mac_promisc_remove((mac_promisc_handle_t)phandle);
13010639SDarren.Reed@Sun.COM }
13110639SDarren.Reed@Sun.COM 
13210639SDarren.Reed@Sun.COM static int
mac_bpf_client_open(uintptr_t mhandle,uintptr_t * chandlep)13310639SDarren.Reed@Sun.COM mac_bpf_client_open(uintptr_t mhandle, uintptr_t *chandlep)
13410639SDarren.Reed@Sun.COM {
13510639SDarren.Reed@Sun.COM 	return (mac_client_open((mac_handle_t)mhandle,
13610639SDarren.Reed@Sun.COM 	    (mac_client_handle_t *)chandlep,  NULL,
13710639SDarren.Reed@Sun.COM 	    MAC_OPEN_FLAGS_USE_DATALINK_NAME));
13810639SDarren.Reed@Sun.COM }
13910639SDarren.Reed@Sun.COM 
14010639SDarren.Reed@Sun.COM static void
mac_bpf_client_close(uintptr_t chandle)14110639SDarren.Reed@Sun.COM mac_bpf_client_close(uintptr_t chandle)
14210639SDarren.Reed@Sun.COM {
14310639SDarren.Reed@Sun.COM 	mac_client_close((mac_client_handle_t)chandle, 0);
14410639SDarren.Reed@Sun.COM }
14510639SDarren.Reed@Sun.COM 
14610639SDarren.Reed@Sun.COM static const char *
mac_bpf_client_name(uintptr_t chandle)14710639SDarren.Reed@Sun.COM mac_bpf_client_name(uintptr_t chandle)
14810639SDarren.Reed@Sun.COM {
14910639SDarren.Reed@Sun.COM 	return (mac_client_name((mac_client_handle_t)chandle));
15010639SDarren.Reed@Sun.COM }
15110639SDarren.Reed@Sun.COM 
15210639SDarren.Reed@Sun.COM /*ARGSUSED*/
15310639SDarren.Reed@Sun.COM static int
mac_bpf_getlinkid(const char * name,datalink_id_t * idp,zoneid_t zoneid)15410639SDarren.Reed@Sun.COM mac_bpf_getlinkid(const char *name, datalink_id_t *idp, zoneid_t zoneid)
15510639SDarren.Reed@Sun.COM {
15610639SDarren.Reed@Sun.COM 	int error;
15710639SDarren.Reed@Sun.COM 
15810639SDarren.Reed@Sun.COM 	/*
15910639SDarren.Reed@Sun.COM 	 * If at first we don't succeed, try again, just in case it is in
16010639SDarren.Reed@Sun.COM 	 * hiding. The first call requires the datalink management daemon
16110639SDarren.Reed@Sun.COM 	 * (the authorative source of information about name to id mapping)
16210639SDarren.Reed@Sun.COM 	 * to be present and answering upcalls, the seond does not.
16310639SDarren.Reed@Sun.COM 	 */
16410639SDarren.Reed@Sun.COM 	error = dls_mgmt_get_linkid(name, idp);
16510639SDarren.Reed@Sun.COM 	if (error != 0)
16610639SDarren.Reed@Sun.COM 		error = dls_devnet_macname2linkid(name, idp);
16710639SDarren.Reed@Sun.COM 
16810639SDarren.Reed@Sun.COM 	return (error);
16910639SDarren.Reed@Sun.COM }
17011179SDarren.Reed@Sun.COM 
17111179SDarren.Reed@Sun.COM static int
mac_bpf_getzone(uintptr_t handle,zoneid_t * zip)17211179SDarren.Reed@Sun.COM mac_bpf_getzone(uintptr_t handle, zoneid_t *zip)
17311179SDarren.Reed@Sun.COM {
17411179SDarren.Reed@Sun.COM 	mac_perim_handle_t mph;
17511179SDarren.Reed@Sun.COM 	int error;
17611179SDarren.Reed@Sun.COM 
17711179SDarren.Reed@Sun.COM 	mac_perim_enter_by_mh((mac_handle_t)handle, &mph);
17811179SDarren.Reed@Sun.COM 	error = dls_link_getzid(mac_name((mac_handle_t)handle), zip);
17911179SDarren.Reed@Sun.COM 	mac_perim_exit(mph);
18011179SDarren.Reed@Sun.COM 	return (error);
18111179SDarren.Reed@Sun.COM }
18211179SDarren.Reed@Sun.COM 
18311179SDarren.Reed@Sun.COM static int
mac_bpf_getdlt(uintptr_t handle,uint_t * dltp)18411179SDarren.Reed@Sun.COM mac_bpf_getdlt(uintptr_t handle, uint_t *dltp)
18511179SDarren.Reed@Sun.COM {
186*11665SDarren.Reed@Sun.COM 	*dltp = mac_nativetype((mac_handle_t)handle);
18711179SDarren.Reed@Sun.COM 
18811179SDarren.Reed@Sun.COM 	return (0);
18911179SDarren.Reed@Sun.COM }
190