xref: /onnv-gate/usr/src/uts/common/io/bpf/bpf_mac.c (revision 10639:368f1335a058)
1*10639SDarren.Reed@Sun.COM /*
2*10639SDarren.Reed@Sun.COM  * CDDL HEADER START
3*10639SDarren.Reed@Sun.COM  *
4*10639SDarren.Reed@Sun.COM  * The contents of this file are subject to the terms of the
5*10639SDarren.Reed@Sun.COM  * Common Development and Distribution License (the "License").
6*10639SDarren.Reed@Sun.COM  * You may not use this file except in compliance with the License.
7*10639SDarren.Reed@Sun.COM  *
8*10639SDarren.Reed@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10639SDarren.Reed@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10639SDarren.Reed@Sun.COM  * See the License for the specific language governing permissions
11*10639SDarren.Reed@Sun.COM  * and limitations under the License.
12*10639SDarren.Reed@Sun.COM  *
13*10639SDarren.Reed@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10639SDarren.Reed@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10639SDarren.Reed@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10639SDarren.Reed@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10639SDarren.Reed@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10639SDarren.Reed@Sun.COM  *
19*10639SDarren.Reed@Sun.COM  * CDDL HEADER END
20*10639SDarren.Reed@Sun.COM  */
21*10639SDarren.Reed@Sun.COM 
22*10639SDarren.Reed@Sun.COM /*
23*10639SDarren.Reed@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*10639SDarren.Reed@Sun.COM  * Use is subject to license terms.
25*10639SDarren.Reed@Sun.COM  */
26*10639SDarren.Reed@Sun.COM 
27*10639SDarren.Reed@Sun.COM #include <sys/types.h>
28*10639SDarren.Reed@Sun.COM #include <sys/stream.h>
29*10639SDarren.Reed@Sun.COM #include <net/bpf.h>
30*10639SDarren.Reed@Sun.COM #include <net/bpfdesc.h>
31*10639SDarren.Reed@Sun.COM 
32*10639SDarren.Reed@Sun.COM /*
33*10639SDarren.Reed@Sun.COM  * This file provides the link to the functions required from the mac
34*10639SDarren.Reed@Sun.COM  * module. It is currently in bpf, rather than mac (like ipnet_bpf)
35*10639SDarren.Reed@Sun.COM  * because of the mac/dls split. The bpf driver needs to know when
36*10639SDarren.Reed@Sun.COM  * interfaces appear and disappear and the best place for that is in
37*10639SDarren.Reed@Sun.COM  * dls. Unfortunately all of the other functions used here are found
38*10639SDarren.Reed@Sun.COM  * in the mac module, making it seem ill suited to being at home in
39*10639SDarren.Reed@Sun.COM  * dls. Similarly it has even less purpose being in mac as it is
40*10639SDarren.Reed@Sun.COM  * today.
41*10639SDarren.Reed@Sun.COM  */
42*10639SDarren.Reed@Sun.COM static int	mac_bpf_open(const char *, uintptr_t *, zoneid_t);
43*10639SDarren.Reed@Sun.COM static void	mac_bpf_close(uintptr_t);
44*10639SDarren.Reed@Sun.COM static const char *mac_bpf_name(uintptr_t);
45*10639SDarren.Reed@Sun.COM static int	mac_bpf_type(uintptr_t);
46*10639SDarren.Reed@Sun.COM static void	mac_bpf_sdu_get(uintptr_t, uint_t *);
47*10639SDarren.Reed@Sun.COM static int	mac_bpf_tx(uintptr_t, mblk_t *);
48*10639SDarren.Reed@Sun.COM static uintptr_t mac_bpf_promisc_add(uintptr_t, int, void *, uintptr_t *, int);
49*10639SDarren.Reed@Sun.COM static void	mac_bpf_promisc_remove(uintptr_t);
50*10639SDarren.Reed@Sun.COM static int	mac_bpf_client_open(uintptr_t, uintptr_t *);
51*10639SDarren.Reed@Sun.COM static void	mac_bpf_client_close(uintptr_t);
52*10639SDarren.Reed@Sun.COM static const char *mac_bpf_client_name(uintptr_t);
53*10639SDarren.Reed@Sun.COM static int	mac_bpf_getlinkid(const char *, datalink_id_t *, zoneid_t);
54*10639SDarren.Reed@Sun.COM 
55*10639SDarren.Reed@Sun.COM bpf_provider_t bpf_mac = {
56*10639SDarren.Reed@Sun.COM 	BPR_MAC,
57*10639SDarren.Reed@Sun.COM 	mac_bpf_open,
58*10639SDarren.Reed@Sun.COM 	mac_bpf_close,
59*10639SDarren.Reed@Sun.COM 	mac_bpf_name,
60*10639SDarren.Reed@Sun.COM 	mac_bpf_type,
61*10639SDarren.Reed@Sun.COM 	mac_bpf_sdu_get,
62*10639SDarren.Reed@Sun.COM 	mac_bpf_tx,
63*10639SDarren.Reed@Sun.COM 	mac_bpf_promisc_add,
64*10639SDarren.Reed@Sun.COM 	mac_bpf_promisc_remove,
65*10639SDarren.Reed@Sun.COM 	mac_bpf_getlinkid,
66*10639SDarren.Reed@Sun.COM 	mac_bpf_client_close,
67*10639SDarren.Reed@Sun.COM 	mac_bpf_client_name,
68*10639SDarren.Reed@Sun.COM 	mac_bpf_client_open
69*10639SDarren.Reed@Sun.COM };
70*10639SDarren.Reed@Sun.COM 
71*10639SDarren.Reed@Sun.COM /*ARGSUSED*/
72*10639SDarren.Reed@Sun.COM static int
73*10639SDarren.Reed@Sun.COM mac_bpf_open(const char *name, uintptr_t *mhandlep, zoneid_t zoneid)
74*10639SDarren.Reed@Sun.COM {
75*10639SDarren.Reed@Sun.COM 	return (mac_open(name, (mac_handle_t *)mhandlep));
76*10639SDarren.Reed@Sun.COM }
77*10639SDarren.Reed@Sun.COM 
78*10639SDarren.Reed@Sun.COM static void
79*10639SDarren.Reed@Sun.COM mac_bpf_close(uintptr_t mhandle)
80*10639SDarren.Reed@Sun.COM {
81*10639SDarren.Reed@Sun.COM 	mac_close((mac_handle_t)mhandle);
82*10639SDarren.Reed@Sun.COM }
83*10639SDarren.Reed@Sun.COM 
84*10639SDarren.Reed@Sun.COM static const char *
85*10639SDarren.Reed@Sun.COM mac_bpf_name(uintptr_t mhandle)
86*10639SDarren.Reed@Sun.COM {
87*10639SDarren.Reed@Sun.COM 	return (mac_name((mac_handle_t)mhandle));
88*10639SDarren.Reed@Sun.COM }
89*10639SDarren.Reed@Sun.COM 
90*10639SDarren.Reed@Sun.COM static int
91*10639SDarren.Reed@Sun.COM mac_bpf_type(uintptr_t mhandle)
92*10639SDarren.Reed@Sun.COM {
93*10639SDarren.Reed@Sun.COM 	return (mac_type((mac_handle_t)mhandle));
94*10639SDarren.Reed@Sun.COM }
95*10639SDarren.Reed@Sun.COM 
96*10639SDarren.Reed@Sun.COM static void
97*10639SDarren.Reed@Sun.COM mac_bpf_sdu_get(uintptr_t mhandle, uint_t *mtup)
98*10639SDarren.Reed@Sun.COM {
99*10639SDarren.Reed@Sun.COM 	mac_sdu_get((mac_handle_t)mhandle, NULL, mtup);
100*10639SDarren.Reed@Sun.COM }
101*10639SDarren.Reed@Sun.COM 
102*10639SDarren.Reed@Sun.COM static int
103*10639SDarren.Reed@Sun.COM mac_bpf_tx(uintptr_t chandle, mblk_t *pkt)
104*10639SDarren.Reed@Sun.COM {
105*10639SDarren.Reed@Sun.COM 	/*
106*10639SDarren.Reed@Sun.COM 	 * If the mac layer cannot deliver a packet as requested by BPF then
107*10639SDarren.Reed@Sun.COM 	 * simply have the mac layer drop it. BPF isn't interested in doing
108*10639SDarren.Reed@Sun.COM 	 * any amount of retry - that's left to the application.
109*10639SDarren.Reed@Sun.COM 	 */
110*10639SDarren.Reed@Sun.COM 	return (mac_tx((mac_client_handle_t)chandle, pkt, 0,
111*10639SDarren.Reed@Sun.COM 	    MAC_DROP_ON_NO_DESC, NULL));
112*10639SDarren.Reed@Sun.COM }
113*10639SDarren.Reed@Sun.COM 
114*10639SDarren.Reed@Sun.COM static uintptr_t
115*10639SDarren.Reed@Sun.COM mac_bpf_promisc_add(uintptr_t chandle, int how, void *arg, uintptr_t *promisc,
116*10639SDarren.Reed@Sun.COM     int flags)
117*10639SDarren.Reed@Sun.COM {
118*10639SDarren.Reed@Sun.COM 	return (mac_promisc_add((mac_client_handle_t)chandle, how, bpf_mtap,
119*10639SDarren.Reed@Sun.COM 	    arg, (mac_promisc_handle_t *)promisc, flags));
120*10639SDarren.Reed@Sun.COM }
121*10639SDarren.Reed@Sun.COM 
122*10639SDarren.Reed@Sun.COM static void
123*10639SDarren.Reed@Sun.COM mac_bpf_promisc_remove(uintptr_t phandle)
124*10639SDarren.Reed@Sun.COM {
125*10639SDarren.Reed@Sun.COM 	mac_promisc_remove((mac_promisc_handle_t)phandle);
126*10639SDarren.Reed@Sun.COM }
127*10639SDarren.Reed@Sun.COM 
128*10639SDarren.Reed@Sun.COM static int
129*10639SDarren.Reed@Sun.COM mac_bpf_client_open(uintptr_t mhandle, uintptr_t *chandlep)
130*10639SDarren.Reed@Sun.COM {
131*10639SDarren.Reed@Sun.COM 	return (mac_client_open((mac_handle_t)mhandle,
132*10639SDarren.Reed@Sun.COM 	    (mac_client_handle_t *)chandlep,  NULL,
133*10639SDarren.Reed@Sun.COM 	    MAC_OPEN_FLAGS_USE_DATALINK_NAME));
134*10639SDarren.Reed@Sun.COM }
135*10639SDarren.Reed@Sun.COM 
136*10639SDarren.Reed@Sun.COM static void
137*10639SDarren.Reed@Sun.COM mac_bpf_client_close(uintptr_t chandle)
138*10639SDarren.Reed@Sun.COM {
139*10639SDarren.Reed@Sun.COM 	mac_client_close((mac_client_handle_t)chandle, 0);
140*10639SDarren.Reed@Sun.COM }
141*10639SDarren.Reed@Sun.COM 
142*10639SDarren.Reed@Sun.COM static const char *
143*10639SDarren.Reed@Sun.COM mac_bpf_client_name(uintptr_t chandle)
144*10639SDarren.Reed@Sun.COM {
145*10639SDarren.Reed@Sun.COM 	return (mac_client_name((mac_client_handle_t)chandle));
146*10639SDarren.Reed@Sun.COM }
147*10639SDarren.Reed@Sun.COM 
148*10639SDarren.Reed@Sun.COM /*ARGSUSED*/
149*10639SDarren.Reed@Sun.COM static int
150*10639SDarren.Reed@Sun.COM mac_bpf_getlinkid(const char *name, datalink_id_t *idp, zoneid_t zoneid)
151*10639SDarren.Reed@Sun.COM {
152*10639SDarren.Reed@Sun.COM 	int error;
153*10639SDarren.Reed@Sun.COM 
154*10639SDarren.Reed@Sun.COM 	/*
155*10639SDarren.Reed@Sun.COM 	 * If at first we don't succeed, try again, just in case it is in
156*10639SDarren.Reed@Sun.COM 	 * hiding. The first call requires the datalink management daemon
157*10639SDarren.Reed@Sun.COM 	 * (the authorative source of information about name to id mapping)
158*10639SDarren.Reed@Sun.COM 	 * to be present and answering upcalls, the seond does not.
159*10639SDarren.Reed@Sun.COM 	 */
160*10639SDarren.Reed@Sun.COM 	error = dls_mgmt_get_linkid(name, idp);
161*10639SDarren.Reed@Sun.COM 	if (error != 0)
162*10639SDarren.Reed@Sun.COM 		error = dls_devnet_macname2linkid(name, idp);
163*10639SDarren.Reed@Sun.COM 
164*10639SDarren.Reed@Sun.COM 	return (error);
165*10639SDarren.Reed@Sun.COM }
166