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