dld.h revision 11042:2d6e217af1b4
1254721Semaste/*
2254721Semaste * CDDL HEADER START
3254721Semaste *
4254721Semaste * The contents of this file are subject to the terms of the
5254721Semaste * Common Development and Distribution License (the "License").
6254721Semaste * You may not use this file except in compliance with the License.
7254721Semaste *
8254721Semaste * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9254721Semaste * or http://www.opensolaris.org/os/licensing.
10254721Semaste * See the License for the specific language governing permissions
11254721Semaste * and limitations under the License.
12254721Semaste *
13254721Semaste * When distributing Covered Code, include this CDDL HEADER in each
14254721Semaste * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15254721Semaste * If applicable, add the following below this CDDL HEADER, with the
16254721Semaste * fields enclosed by brackets "[]" replaced with your own identifying
17254721Semaste * information: Portions Copyright [yyyy] [name of copyright owner]
18254721Semaste *
19254721Semaste * CDDL HEADER END
20254721Semaste */
21254721Semaste/*
22254721Semaste * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23254721Semaste * Use is subject to license terms.
24254721Semaste */
25254721Semaste
26254721Semaste#ifndef	_SYS_DLD_H
27254721Semaste#define	_SYS_DLD_H
28254721Semaste
29254721Semaste/*
30254721Semaste * Data-Link Driver (public header).
31254721Semaste *
32254721Semaste * Note that the datastructures defined here define an ioctl interface
33254721Semaste * that is shared betwen user and kernel space.  The dld driver thus
34254721Semaste * assumes that the structures have identical layout and size when
35254721Semaste * compiled in either IPL32 or LP64.
36254721Semaste */
37254721Semaste
38254721Semaste#include <sys/types.h>
39254721Semaste#include <sys/stream.h>
40254721Semaste#include <sys/mac_flow.h>
41254721Semaste#include <sys/conf.h>
42254721Semaste#include <sys/sad.h>
43254721Semaste#include <sys/mac.h>
44254721Semaste
45254721Semaste#ifdef	__cplusplus
46254721Semasteextern "C" {
47254721Semaste#endif
48254721Semaste
49254721Semaste/*
50254721Semaste * Data-Link Driver Information (text emitted by modinfo(1m))
51254721Semaste */
52254721Semaste#define	DLD_INFO	"Data-Link Driver"
53254721Semaste
54254721Semaste/*
55254721Semaste * Options: To enable an option set the property name to a non-zero value
56254721Semaste *	    in kernel/drv/dld.conf.
57254721Semaste */
58254721Semaste
59254721Semaste/*
60254721Semaste * Prevent use of the IP fast-path (direct M_DATA transmit).
61254721Semaste */
62254721Semaste#define	DLD_PROP_NO_FASTPATH	"no-fastpath"
63254721Semaste
64254721Semaste/*
65254721Semaste * Prevent advertising of the DL_CAPAB_POLL capability.
66254721Semaste */
67254721Semaste#define	DLD_PROP_NO_POLL	"no-poll"
68254721Semaste
69254721Semaste/*
70254721Semaste * Prevent advertising of the DL_CAPAB_ZEROCOPY capability.
71254721Semaste */
72254721Semaste#define	DLD_PROP_NO_ZEROCOPY	"no-zerocopy"
73254721Semaste
74254721Semaste/*
75254721Semaste * Prevent advertising of the DL_CAPAB_SOFTRING capability.
76254721Semaste */
77254721Semaste#define	DLD_PROP_NO_SOFTRING	"no-softring"
78254721Semaste
79254721Semaste/*
80254721Semaste * The name of the driver.
81254721Semaste */
82254721Semaste#define	DLD_DRIVER_NAME		"dld"
83254721Semaste
84254721Semaste#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
85254721Semaste#pragma pack(4)
86254721Semaste#endif
87254721Semaste
88254721Semaste/*
89254721Semaste * IOCTL codes and data structures.
90254721Semaste */
91254721Semaste#define	DLDIOC_ATTR	DLDIOC(0x03)
92254721Semaste
93254721Semastetypedef struct dld_ioc_attr {
94254721Semaste	datalink_id_t		dia_linkid;
95254721Semaste	uint_t			dia_max_sdu;
96254721Semaste} dld_ioc_attr_t;
97254721Semaste
98254721Semaste#define	DLDIOC_VLAN_ATTR	DLDIOC(0x04)
99254721Semastetypedef struct dld_ioc_vlan_attr {
100254721Semaste	datalink_id_t	div_vlanid;
101254721Semaste	uint16_t	div_vid;
102254721Semaste	datalink_id_t	div_linkid;
103254721Semaste	boolean_t	div_force;
104254721Semaste} dld_ioc_vlan_attr_t;
105254721Semaste
106254721Semaste#define	DLDIOC_PHYS_ATTR	DLDIOC(0x05)
107254721Semaste#define	DLPI_LINKNAME_MAX	32
108254721Semaste
109254721Semastetypedef struct dld_ioc_phys_attr {
110254721Semaste	datalink_id_t	dip_linkid;
111254721Semaste	/*
112254721Semaste	 * Whether this physical link supports vanity naming. Note that
113254721Semaste	 * physical links whose media type is not supported by GLDv3
114254721Semaste	 * can not support vanity naming.
115254721Semaste	 */
116254721Semaste	boolean_t	dip_novanity;
117254721Semaste	char		dip_dev[MAXLINKNAMELEN];
118254721Semaste} dld_ioc_phys_attr_t;
119254721Semaste
120254721Semaste/*
121254721Semaste * Secure objects ioctls
122254721Semaste */
123254721Semastetypedef enum {
124254721Semaste	DLD_SECOBJ_CLASS_WEP = 1,
125254721Semaste	DLD_SECOBJ_CLASS_WPA
126254721Semaste} dld_secobj_class_t;
127254721Semaste
128254721Semaste#define	DLD_SECOBJ_OPT_CREATE	0x00000001
129254721Semaste#define	DLD_SECOBJ_NAME_MAX	32
130254721Semaste#define	DLD_SECOBJ_VAL_MAX	256
131254721Semastetypedef struct dld_secobj {
132254721Semaste	char			so_name[DLD_SECOBJ_NAME_MAX];
133254721Semaste	dld_secobj_class_t	so_class;
134254721Semaste	uint8_t			so_val[DLD_SECOBJ_VAL_MAX];
135254721Semaste	uint_t			so_len;
136254721Semaste} dld_secobj_t;
137254721Semaste
138254721Semaste#define	DLDIOC_SECOBJ_SET	DLDIOC(0x06)
139254721Semastetypedef struct dld_ioc_secobj_set {
140254721Semaste	dld_secobj_t		ss_obj;
141254721Semaste	uint_t			ss_flags;
142254721Semaste} dld_ioc_secobj_set_t;
143254721Semaste
144254721Semaste#define	DLDIOC_SECOBJ_GET	DLDIOC(0x07)
145254721Semastetypedef struct dld_ioc_secobj_get {
146254721Semaste	dld_secobj_t		sg_obj;
147254721Semaste	uint_t			sg_count;
148254721Semaste	uint_t			sg_size;
149254721Semaste} dld_ioc_secobj_get_t;
150254721Semaste
151254721Semaste/*
152254721Semaste * The following two slots were used outside of ON, so don't reuse them.
153254721Semaste *
154254721Semaste * #define DLDIOCHOLDVLAN DLDIOC(0x08)
155254721Semaste * #define DLDIOCRELEVLAN DLDIOC(0x09)
156254721Semaste */
157254721Semaste
158254721Semaste#define	DLDIOC_SECOBJ_UNSET	DLDIOC(0x0a)
159254721Semastetypedef struct dld_ioc_secobj_unset {
160254721Semaste	char			su_name[DLD_SECOBJ_NAME_MAX];
161254721Semaste} dld_ioc_secobj_unset_t;
162254721Semaste
163254721Semaste#define	DLDIOC_CREATE_VLAN	DLDIOC(0x0b)
164254721Semastetypedef struct dld_ioc_create_vlan {
165254721Semaste	datalink_id_t	dic_vlanid;
166254721Semaste	datalink_id_t	dic_linkid;
167254721Semaste	uint16_t	dic_vid;
168254721Semaste	boolean_t	dic_force;
169254721Semaste} dld_ioc_create_vlan_t;
170254721Semaste
171254721Semaste#define	DLDIOC_DELETE_VLAN	DLDIOC(0x0c)
172254721Semastetypedef struct dld_ioc_delete_vlan {
173254721Semaste	datalink_id_t	did_linkid;
174254721Semaste} dld_ioc_delete_vlan_t;
175254721Semaste
176254721Semaste/*
177254721Semaste * The following constants have been removed, and the slots are open:
178254721Semaste *
179254721Semaste * #define DLDIOC_SETAUTOPUSH	DLDIOC(0x0d)
180254721Semaste * #define DLDIOC_GETAUTOPUSH	DLDIOC(0x0e)
181254721Semaste * #define DLDIOC_CLRAUTOPUSH	DLDIOC(0x0f)
182254721Semaste */
183254721Semaste
184254721Semaste#define	DLDIOC_DOORSERVER	DLDIOC(0x10)
185254721Semastetypedef struct dld_ioc_door {
186254721Semaste	boolean_t	did_start_door;
187254721Semaste} dld_ioc_door_t;
188254721Semaste
189254721Semaste#define	DLDIOC_RENAME		DLDIOC(0x11)
190254721Semastetypedef struct dld_ioc_rename {
191254721Semaste	datalink_id_t	dir_linkid1;
192254721Semaste	datalink_id_t	dir_linkid2;
193254721Semaste	char		dir_link[MAXLINKNAMELEN];
194254721Semaste} dld_ioc_rename_t;
195254721Semaste
196254721Semaste/*
197254721Semaste * The following constants have been removed, and the slots are open:
198254721Semaste *
199254721Semaste * #define DLDIOC_SETZID	DLDIOC(0x12)
200254721Semaste * #define DLDIOC_GETZID	DLDIOC(0x13)
201254721Semaste */
202254721Semaste
203254721Semastetypedef struct dld_ioc_zid {
204254721Semaste	zoneid_t	diz_zid;
205254721Semaste	datalink_id_t	diz_linkid;
206254721Semaste} dld_ioc_zid_t;
207254721Semaste
208254721Semaste/*
209254721Semaste * data-link autopush configuration.
210254721Semaste */
211254721Semastestruct dlautopush {
212254721Semaste	uint_t	dap_anchor;
213254721Semaste	uint_t	dap_npush;
214254721Semaste	char	dap_aplist[MAXAPUSH][FMNAMESZ+1];
215254721Semaste};
216254721Semaste
217254721Semaste#define	DLDIOC_MACADDRGET	DLDIOC(0x15)
218254721Semastetypedef struct dld_ioc_macaddrget {
219254721Semaste	datalink_id_t	dig_linkid;
220254721Semaste	uint_t		dig_count;
221254721Semaste	uint_t		dig_size;
222254721Semaste} dld_ioc_macaddrget_t;
223254721Semaste
224254721Semaste/* possible flags for dmi_flags below */
225254721Semaste#define	DLDIOCMACADDR_USED	0x1	/* address slot used */
226254721Semaste
227254721Semastetypedef struct dld_macaddrinfo {
228254721Semaste	uint_t		dmi_slot;
229254721Semaste	uint_t		dmi_flags;
230254721Semaste	uint_t		dmi_addrlen;
231254721Semaste	uchar_t		dmi_addr[MAXMACADDRLEN];
232254721Semaste	char		dmi_client_name[MAXNAMELEN];
233254721Semaste	datalink_id_t	dma_client_linkid;
234254721Semaste} dld_macaddrinfo_t;
235254721Semaste
236254721Semaste/*
237254721Semaste * IOCTL codes and data structures for flowadm.
238254721Semaste */
239254721Semaste#define	DLDIOC_ADDFLOW		DLDIOC(0x16)
240254721Semastetypedef struct dld_ioc_addflow {
241254721Semaste	datalink_id_t		af_linkid;
242254721Semaste	flow_desc_t		af_flow_desc;
243254721Semaste	mac_resource_props_t	af_resource_props;
244254721Semaste	char			af_name[MAXFLOWNAMELEN];
245254721Semaste} dld_ioc_addflow_t;
246254721Semaste
247254721Semaste#define	DLDIOC_REMOVEFLOW	DLDIOC(0x17)
248254721Semastetypedef struct dld_ioc_removeflow {
249254721Semaste	char			rf_name[MAXFLOWNAMELEN];
250254721Semaste} dld_ioc_removeflow_t;
251254721Semaste
252254721Semaste#define	DLDIOC_MODIFYFLOW	DLDIOC(0x18)
253254721Semastetypedef struct dld_ioc_modifyflow {
254254721Semaste	char			mf_name[MAXFLOWNAMELEN];
255254721Semaste	mac_resource_props_t	mf_resource_props;
256254721Semaste} dld_ioc_modifyflow_t;
257254721Semaste
258254721Semaste#define	DLDIOC_WALKFLOW		DLDIOC(0x19)
259254721Semastetypedef struct dld_ioc_walkflow {
260254721Semaste	datalink_id_t		wf_linkid;
261254721Semaste	char			wf_name[MAXFLOWNAMELEN];
262254721Semaste	uint32_t		wf_nflows;
263254721Semaste	uint_t			wf_len;
264254721Semaste} dld_ioc_walkflow_t;
265254721Semaste
266254721Semastetypedef struct dld_flowinfo {
267254721Semaste	datalink_id_t		fi_linkid;
268254721Semaste	flow_desc_t		fi_flow_desc;
269254721Semaste	mac_resource_props_t	fi_resource_props;
270254721Semaste	char			fi_flowname[MAXFLOWNAMELEN];
271254721Semaste	uint32_t		fi_pad;
272254721Semaste} dld_flowinfo_t;
273254721Semaste
274254721Semaste#define	DLDIOC_USAGELOG		DLDIOC(0x1a)
275254721Semastetypedef struct dld_ioc_usagelog {
276254721Semaste	mac_logtype_t	ul_type;
277254721Semaste	boolean_t	ul_onoff;
278254721Semaste	uint_t		ul_interval;
279254721Semaste} dld_ioc_usagelog_t;
280254721Semaste
281254721Semaste#define	DLDIOC_SETMACPROP	DLDIOC(0x1b)
282254721Semaste#define	DLDIOC_GETMACPROP	DLDIOC(0x1c)
283254721Semaste#define	MAC_PROP_VERSION	1
284254721Semaste
285254721Semastetypedef struct dld_ioc_macprop_s {
286254721Semaste	int		pr_version;
287254721Semaste	uint_t		pr_flags;
288254721Semaste	datalink_id_t	pr_linkid;
289254721Semaste	mac_prop_id_t	pr_num;
290254721Semaste	uint_t		pr_perm_flags;
291254721Semaste	char    	pr_name[MAXLINKPROPNAME];
292254721Semaste	uint_t		pr_valsize;		/* sizeof pr_val */
293254721Semaste	char		pr_val[1];
294254721Semaste} dld_ioc_macprop_t;
295254721Semaste
296254721Semaste#define	DLDIOC_GETHWGRP		DLDIOC(0x1d)
297254721Semaste
298254721Semastetypedef struct dld_ioc_hwgrpget {
299254721Semaste	datalink_id_t	dih_linkid;
300254721Semaste	uint_t		dih_n_groups;	/* number of groups included in ioc */
301254721Semaste	uint_t		dih_size;
302254721Semaste} dld_ioc_hwgrpget_t;
303254721Semaste
304254721Semaste#define	MAXCLIENTNAMELEN	1024
305254721Semastetypedef struct dld_hwgrpinfo {
306254721Semaste	char	dhi_link_name[MAXLINKNAMELEN];
307254721Semaste	uint_t	dhi_grp_num;
308254721Semaste	uint_t	dhi_grp_type;
309254721Semaste	uint_t	dhi_n_rings;
310254721Semaste	uint_t	dhi_n_clnts;
311254721Semaste	/* XXXX later we should use dhi_n_clnts * MAXNAMELEN for dhi_clnts */
312254721Semaste	char	dhi_clnts[MAXCLIENTNAMELEN];
313254721Semaste} dld_hwgrpinfo_t;
314254721Semaste
315254721Semaste#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
316254721Semaste#pragma pack()
317254721Semaste#endif
318254721Semaste
319254721Semaste#ifdef _KERNEL
320254721Semaste
321254721Semaste#define	DLD_CAPAB_DIRECT	0x00000001
322254721Semaste#define	DLD_CAPAB_POLL		0x00000002
323254721Semaste#define	DLD_CAPAB_PERIM		0x00000003
324254721Semaste#define	DLD_CAPAB_LSO		0x00000004
325254721Semaste
326254721Semaste#define	DLD_ENABLE		0x00000001
327254721Semaste#define	DLD_DISABLE		0x00000002
328254721Semaste#define	DLD_QUERY		0x00000003
329254721Semaste
330254721Semaste/*
331254721Semaste * GLDv3 entry point for negotiating capabilities.
332254721Semaste * This is exposed to IP after negotiation of DL_CAPAB_DLD.
333254721Semaste *
334254721Semaste * This function takes the following arguments:
335254721Semaste * handle: used for identifying the interface to operate on (provided by dld).
336254721Semaste * type: capability type.
337254721Semaste * arg: points to a capability-specific structure.
338254721Semaste * flags: used for indicating whether to enable or disable a capability.
339254721Semaste *
340254721Semaste * With this function, capability negotiation is reduced from a multi-step
341254721Semaste * process to just one single function call.
342254721Semaste * e.g. the following code would pass 'x' from IP to dld and obtain
343254721Semaste * arg.output_arg from dld:
344254721Semaste *
345254721Semaste * arg.input_arg = x;
346254721Semaste * rc = (*dld_capab)(handle, DLD_CAPAB_XXX, &arg, DLD_ENABLE);
347254721Semaste * ill->info1 = arg.output_arg;
348254721Semaste */
349254721Semastetypedef	int	(*dld_capab_func_t)(void *, uint_t, void *, uint_t);
350254721Semaste
351254721Semaste/*
352254721Semaste * Direct Tx/Rx capability.
353254721Semaste */
354254721Semastetypedef struct dld_capab_direct_s {
355254721Semaste	/*
356254721Semaste	 * Rx entry point and handle, owned by IP.
357254721Semaste	 */
358254721Semaste	uintptr_t	di_rx_cf;
359254721Semaste	void		*di_rx_ch;
360254721Semaste
361254721Semaste	/*
362254721Semaste	 * Tx entry points and handle, owned by DLD.
363254721Semaste	 */
364254721Semaste	/* Entry point for transmitting packets */
365254721Semaste	uintptr_t	di_tx_df;
366254721Semaste	void		*di_tx_dh;
367254721Semaste
368254721Semaste	/* flow control notification callback */
369254721Semaste	uintptr_t	di_tx_cb_df; /* callback registration/de-registration */
370254721Semaste	void		*di_tx_cb_dh;
371254721Semaste
372254721Semaste	/* flow control "can I put on a ring" callback */
373254721Semaste	uintptr_t	di_tx_fctl_df; /* canput-like callback */
374254721Semaste	void		*di_tx_fctl_dh;
375254721Semaste} dld_capab_direct_t;
376254721Semaste
377254721Semaste/*
378254721Semaste * Polling/softring capability.
379254721Semaste */
380254721Semaste#define	POLL_SOFTRING		0x00000001
381254721Semastetypedef struct dld_capab_poll_s {
382254721Semaste	uintptr_t	poll_ring_add_cf;
383254721Semaste	uintptr_t	poll_ring_remove_cf;
384254721Semaste	uintptr_t	poll_ring_quiesce_cf;
385254721Semaste	uintptr_t	poll_ring_restart_cf;
386254721Semaste	uintptr_t	poll_ring_bind_cf;
387254721Semaste	void		*poll_ring_ch;
388254721Semaste	uintptr_t	poll_mac_accept_df;
389254721Semaste	void		*poll_mac_dh;
390254721Semaste} dld_capab_poll_t;
391254721Semaste
392254721Semaste/*
393254721Semaste * LSO capability
394254721Semaste */
395254721Semaste/*
396254721Semaste * Currently supported flags for LSO.
397254721Semaste */
398254721Semaste#define	DLD_LSO_BASIC_TCP_IPV4	0x01	/* TCP LSO over IPv4 capability */
399254721Semaste#define	DLD_LSO_BASIC_TCP_IPV6	0x02	/* TCP LSO over IPv6 capability */
400254721Semaste
401254721Semastetypedef struct dld_capab_lso_s {
402254721Semaste	uint_t  lso_flags;	/* capability flags */
403254721Semaste	uint_t  lso_max;	/* maximum payload */
404254721Semaste} dld_capab_lso_t;
405254721Semaste
406254721Semasteint	dld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
407254721Semasteint	dld_devt_to_instance(dev_t);
408254721Semasteint	dld_open(queue_t *, dev_t *, int, int, cred_t *);
409254721Semasteint	dld_close(queue_t *);
410254721Semastevoid	dld_wput(queue_t *, mblk_t *);
411254721Semastevoid	dld_wsrv(queue_t *);
412254721Semasteint	dld_str_open(queue_t *, dev_t *, void *);
413254721Semasteint	dld_str_close(queue_t *);
414254721Semastevoid	*dld_str_private(queue_t *);
415254721Semastevoid	dld_init_ops(struct dev_ops *, const char *);
416254721Semastevoid	dld_fini_ops(struct dev_ops *);
417254721Semasteint	dld_autopush(dev_t *, struct dlautopush *);
418254721Semaste
419254721Semasteint	dld_add_flow(datalink_id_t, char *, flow_desc_t *,
420254721Semaste    mac_resource_props_t *);
421254721Semasteint	dld_remove_flow(char *);
422254721Semasteint	dld_modify_flow(char *, mac_resource_props_t *);
423254721Semasteint	dld_walk_flow(dld_ioc_walkflow_t *, intptr_t, cred_t *);
424254721Semaste
425254721Semaste#endif
426254721Semaste
427254721Semaste#ifdef	__cplusplus
428254721Semaste}
429254721Semaste#endif
430254721Semaste
431254721Semaste#endif	/* _SYS_DLD_H */
432254721Semaste